import { batch, createSignal, untrack } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
import {
|
closeSingleConnectionAPI,
|
fetchProxiesAPI,
|
fetchProxyProvidersAPI,
|
proxyGroupLatencyTestAPI,
|
proxyLatencyTestAPI,
|
proxyProviderHealthCheckAPI,
|
selectProxyInGroupAPI,
|
updateProxyProviderAPI
|
} from "/src/apis/index.ts";
|
import { useStringBooleanMap } from "/src/helpers/index.ts";
|
import {
|
autoCloseConns,
|
latencyQualityMap,
|
latencyTestTimeoutDuration,
|
latestConnectionMsg,
|
restructRawMsgToConnection,
|
urlForLatencyTest
|
} from "/src/signals/index.ts";
|
const { map: collapsedMap, set: setCollapsedMap } = useStringBooleanMap();
|
const {
|
map: proxyLatencyTestingMap,
|
setWithCallback: setProxyLatencyTestingMap
|
} = useStringBooleanMap();
|
const {
|
map: proxyGroupLatencyTestingMap,
|
setWithCallback: setProxyGroupLatencyTestingMap
|
} = useStringBooleanMap();
|
const {
|
map: proxyProviderLatencyTestingMap,
|
setWithCallback: setProxyProviderLatencyTestingMap
|
} = useStringBooleanMap();
|
const { map: updatingMap, setWithCallback: setUpdatingMap } = useStringBooleanMap();
|
const [isAllProviderUpdating, setIsAllProviderUpdating] = createSignal(false);
|
const [proxies, setProxies] = createSignal([]);
|
const [proxyProviders, setProxyProviders] = createSignal([]);
|
const [latencyMap, setLatencyMap] = createSignal({});
|
const [proxyNodeMap, setProxyNodeMap] = createSignal(
|
{}
|
);
|
const setProxiesInfo = (proxies2) => {
|
const newProxyNodeMap = { ...proxyNodeMap() };
|
const newLatencyMap = { ...latencyMap() };
|
proxies2.forEach((proxy) => {
|
const { udp, xudp, type, now, name, provider = "" } = proxy;
|
const latency = proxy.history.at(-1)?.delay || latencyQualityMap().NOT_CONNECTED;
|
newProxyNodeMap[proxy.name] = { udp, xudp, type, now, name, provider };
|
newLatencyMap[proxy.name] = latency;
|
});
|
batch(() => {
|
setProxyNodeMap(newProxyNodeMap);
|
setLatencyMap(newLatencyMap);
|
});
|
};
|
export const useProxies = () => {
|
const fetchProxies = async () => {
|
const [{ providers }, { proxies: proxies2 }] = await Promise.all([
|
fetchProxyProvidersAPI(),
|
fetchProxiesAPI()
|
]);
|
const sortIndex = [...proxies2["GLOBAL"].all ?? [], "GLOBAL"];
|
const sortedProxies = Object.values(proxies2).filter((proxy) => proxy.all?.length).sort(
|
(prev, next) => sortIndex.indexOf(prev.name) - sortIndex.indexOf(next.name)
|
);
|
const sortedProviders = Object.values(providers).filter(
|
(provider) => provider.name !== "default" && provider.vehicleType !== "Compatible"
|
);
|
const allProxies = [
|
...Object.values(proxies2),
|
...sortedProviders.flatMap(
|
(provider) => provider.proxies.filter((proxy) => !(proxy.name in proxies2)).map((proxy) => ({
|
...proxy,
|
provider: provider.name
|
}))
|
)
|
];
|
batch(() => {
|
setProxies(sortedProxies);
|
setProxyProviders(sortedProviders);
|
setProxiesInfo(allProxies);
|
});
|
};
|
const selectProxyInGroup = async (proxy, proxyName) => {
|
await selectProxyInGroupAPI(proxy.name, proxyName);
|
await fetchProxies();
|
if (autoCloseConns()) {
|
untrack(() => {
|
const activeConns = restructRawMsgToConnection(
|
latestConnectionMsg()?.connections ?? [],
|
[]
|
);
|
if (activeConns.length > 0) {
|
activeConns.forEach(({ id, chains }) => {
|
if (chains.includes(proxy.name)) {
|
closeSingleConnectionAPI(id);
|
}
|
});
|
}
|
});
|
}
|
};
|
const proxyLatencyTest = (proxyName, provider) => setProxyLatencyTestingMap(proxyName, async () => {
|
const { delay } = await proxyLatencyTestAPI(
|
proxyName,
|
provider,
|
urlForLatencyTest(),
|
latencyTestTimeoutDuration()
|
);
|
setLatencyMap((latencyMap2) => ({
|
...latencyMap2,
|
[proxyName]: delay
|
}));
|
});
|
const proxyGroupLatencyTest = (proxyGroupName) => setProxyGroupLatencyTestingMap(proxyGroupName, async () => {
|
const newLatencyMap = await proxyGroupLatencyTestAPI(
|
proxyGroupName,
|
urlForLatencyTest(),
|
latencyTestTimeoutDuration()
|
);
|
setLatencyMap((latencyMap2) => ({
|
...latencyMap2,
|
...newLatencyMap
|
}));
|
await fetchProxies();
|
});
|
const updateProviderByProviderName = (providerName) => setUpdatingMap(providerName, async () => {
|
try {
|
await updateProxyProviderAPI(providerName);
|
} catch {
|
}
|
await fetchProxies();
|
});
|
const updateAllProvider = async () => {
|
setIsAllProviderUpdating(true);
|
try {
|
await Promise.allSettled(
|
proxyProviders().map(
|
(provider) => updateProxyProviderAPI(provider.name)
|
)
|
);
|
await fetchProxies();
|
} finally {
|
setIsAllProviderUpdating(false);
|
}
|
};
|
const proxyProviderLatencyTest = (providerName) => setProxyProviderLatencyTestingMap(providerName, async () => {
|
await proxyProviderHealthCheckAPI(providerName);
|
await fetchProxies();
|
});
|
return {
|
collapsedMap,
|
setCollapsedMap,
|
proxyLatencyTestingMap,
|
proxyGroupLatencyTestingMap,
|
proxyProviderLatencyTestingMap,
|
updatingMap,
|
isAllProviderUpdating,
|
proxies,
|
proxyProviders,
|
proxyLatencyTest,
|
proxyGroupLatencyTest,
|
latencyMap,
|
proxyNodeMap,
|
fetchProxies,
|
selectProxyInGroup,
|
updateProviderByProviderName,
|
updateAllProvider,
|
proxyProviderLatencyTest
|
};
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb3hpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmF0Y2gsIGNyZWF0ZVNpZ25hbCwgdW50cmFjayB9IGZyb20gJ3NvbGlkLWpzJ1xyXG5pbXBvcnQge1xyXG4gIGNsb3NlU2luZ2xlQ29ubmVjdGlvbkFQSSxcclxuICBmZXRjaFByb3hpZXNBUEksXHJcbiAgZmV0Y2hQcm94eVByb3ZpZGVyc0FQSSxcclxuICBwcm94eUdyb3VwTGF0ZW5jeVRlc3RBUEksXHJcbiAgcHJveHlMYXRlbmN5VGVzdEFQSSxcclxuICBwcm94eVByb3ZpZGVySGVhbHRoQ2hlY2tBUEksXHJcbiAgc2VsZWN0UHJveHlJbkdyb3VwQVBJLFxyXG4gIHVwZGF0ZVByb3h5UHJvdmlkZXJBUEksXHJcbn0gZnJvbSAnfi9hcGlzJ1xyXG5pbXBvcnQgeyB1c2VTdHJpbmdCb29sZWFuTWFwIH0gZnJvbSAnfi9oZWxwZXJzJ1xyXG5pbXBvcnQge1xyXG4gIGF1dG9DbG9zZUNvbm5zLFxyXG4gIGxhdGVuY3lRdWFsaXR5TWFwLFxyXG4gIGxhdGVuY3lUZXN0VGltZW91dER1cmF0aW9uLFxyXG4gIGxhdGVzdENvbm5lY3Rpb25Nc2csXHJcbiAgcmVzdHJ1Y3RSYXdNc2dUb0Nvbm5lY3Rpb24sXHJcbiAgdXJsRm9yTGF0ZW5jeVRlc3QsXHJcbn0gZnJvbSAnfi9zaWduYWxzJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3h5LCBQcm94eU5vZGUsIFByb3h5UHJvdmlkZXIgfSBmcm9tICd+L3R5cGVzJ1xyXG5cclxudHlwZSBQcm94eUluZm8gPSB7XHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgdWRwOiBib29sZWFuXHJcbiAgbm93OiBzdHJpbmdcclxuICB4dWRwOiBib29sZWFuXHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgcHJvdmlkZXI6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQcm94eVdpdGhQcm92aWRlciA9IFByb3h5ICYgeyBwcm92aWRlcj86IHN0cmluZyB9XHJcbmV4cG9ydCB0eXBlIFByb3h5Tm9kZVdpdGhQcm92aWRlciA9IFByb3h5Tm9kZSAmIHsgcHJvdmlkZXI/OiBzdHJpbmcgfVxyXG5cclxuY29uc3QgeyBtYXA6IGNvbGxhcHNlZE1hcCwgc2V0OiBzZXRDb2xsYXBzZWRNYXAgfSA9IHVzZVN0cmluZ0Jvb2xlYW5NYXAoKVxyXG5jb25zdCB7XHJcbiAgbWFwOiBwcm94eUxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gIHNldFdpdGhDYWxsYmFjazogc2V0UHJveHlMYXRlbmN5VGVzdGluZ01hcCxcclxufSA9IHVzZVN0cmluZ0Jvb2xlYW5NYXAoKVxyXG5jb25zdCB7XHJcbiAgbWFwOiBwcm94eUdyb3VwTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbiAgc2V0V2l0aENhbGxiYWNrOiBzZXRQcm94eUdyb3VwTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbn0gPSB1c2VTdHJpbmdCb29sZWFuTWFwKClcclxuY29uc3Qge1xyXG4gIG1hcDogcHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gIHNldFdpdGhDYWxsYmFjazogc2V0UHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG59ID0gdXNlU3RyaW5nQm9vbGVhbk1hcCgpXHJcbmNvbnN0IHsgbWFwOiB1cGRhdGluZ01hcCwgc2V0V2l0aENhbGxiYWNrOiBzZXRVcGRhdGluZ01hcCB9ID1cclxuICB1c2VTdHJpbmdCb29sZWFuTWFwKClcclxuY29uc3QgW2lzQWxsUHJvdmlkZXJVcGRhdGluZywgc2V0SXNBbGxQcm92aWRlclVwZGF0aW5nXSA9IGNyZWF0ZVNpZ25hbChmYWxzZSlcclxuXHJcbi8vIHRoZXNlIHNpZ25hbHMgc2hvdWxkIGJlIGdsb2JhbCBzdGF0ZVxyXG5jb25zdCBbcHJveGllcywgc2V0UHJveGllc10gPSBjcmVhdGVTaWduYWw8UHJveHlXaXRoUHJvdmlkZXJbXT4oW10pXHJcbmNvbnN0IFtwcm94eVByb3ZpZGVycywgc2V0UHJveHlQcm92aWRlcnNdID0gY3JlYXRlU2lnbmFsPFxyXG4gIChQcm94eVByb3ZpZGVyICYgeyBwcm94aWVzOiBQcm94eU5vZGVXaXRoUHJvdmlkZXJbXSB9KVtdXHJcbj4oW10pXHJcblxyXG5jb25zdCBbbGF0ZW5jeU1hcCwgc2V0TGF0ZW5jeU1hcF0gPSBjcmVhdGVTaWduYWw8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oe30pXHJcbmNvbnN0IFtwcm94eU5vZGVNYXAsIHNldFByb3h5Tm9kZU1hcF0gPSBjcmVhdGVTaWduYWw8UmVjb3JkPHN0cmluZywgUHJveHlJbmZvPj4oXHJcbiAge30sXHJcbilcclxuXHJcbmNvbnN0IHNldFByb3hpZXNJbmZvID0gKFxyXG4gIHByb3hpZXM6IChQcm94eVdpdGhQcm92aWRlciB8IFByb3h5Tm9kZVdpdGhQcm92aWRlcilbXSxcclxuKSA9PiB7XHJcbiAgY29uc3QgbmV3UHJveHlOb2RlTWFwID0geyAuLi5wcm94eU5vZGVNYXAoKSB9XHJcbiAgY29uc3QgbmV3TGF0ZW5jeU1hcCA9IHsgLi4ubGF0ZW5jeU1hcCgpIH1cclxuXHJcbiAgcHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xyXG4gICAgY29uc3QgeyB1ZHAsIHh1ZHAsIHR5cGUsIG5vdywgbmFtZSwgcHJvdmlkZXIgPSAnJyB9ID0gcHJveHlcclxuXHJcbiAgICBjb25zdCBsYXRlbmN5ID1cclxuICAgICAgcHJveHkuaGlzdG9yeS5hdCgtMSk/LmRlbGF5IHx8IGxhdGVuY3lRdWFsaXR5TWFwKCkuTk9UX0NPTk5FQ1RFRFxyXG5cclxuICAgIG5ld1Byb3h5Tm9kZU1hcFtwcm94eS5uYW1lXSA9IHsgdWRwLCB4dWRwLCB0eXBlLCBub3csIG5hbWUsIHByb3ZpZGVyIH1cclxuICAgIG5ld0xhdGVuY3lNYXBbcHJveHkubmFtZV0gPSBsYXRlbmN5XHJcbiAgfSlcclxuXHJcbiAgYmF0Y2goKCkgPT4ge1xyXG4gICAgc2V0UHJveHlOb2RlTWFwKG5ld1Byb3h5Tm9kZU1hcClcclxuICAgIHNldExhdGVuY3lNYXAobmV3TGF0ZW5jeU1hcClcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgdXNlUHJveGllcyA9ICgpID0+IHtcclxuICBjb25zdCBmZXRjaFByb3hpZXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBbeyBwcm92aWRlcnMgfSwgeyBwcm94aWVzIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICBmZXRjaFByb3h5UHJvdmlkZXJzQVBJKCksXHJcbiAgICAgIGZldGNoUHJveGllc0FQSSgpLFxyXG4gICAgXSlcclxuXHJcbiAgICBjb25zdCBzb3J0SW5kZXggPSBbLi4uKHByb3hpZXNbJ0dMT0JBTCddLmFsbCA/PyBbXSksICdHTE9CQUwnXVxyXG4gICAgY29uc3Qgc29ydGVkUHJveGllcyA9IE9iamVjdC52YWx1ZXMocHJveGllcylcclxuICAgICAgLmZpbHRlcigocHJveHkpID0+IHByb3h5LmFsbD8ubGVuZ3RoKVxyXG4gICAgICAuc29ydChcclxuICAgICAgICAocHJldiwgbmV4dCkgPT5cclxuICAgICAgICAgIHNvcnRJbmRleC5pbmRleE9mKHByZXYubmFtZSkgLSBzb3J0SW5kZXguaW5kZXhPZihuZXh0Lm5hbWUpLFxyXG4gICAgICApXHJcbiAgICBjb25zdCBzb3J0ZWRQcm92aWRlcnMgPSBPYmplY3QudmFsdWVzKHByb3ZpZGVycykuZmlsdGVyKFxyXG4gICAgICAocHJvdmlkZXIpID0+XHJcbiAgICAgICAgcHJvdmlkZXIubmFtZSAhPT0gJ2RlZmF1bHQnICYmIHByb3ZpZGVyLnZlaGljbGVUeXBlICE9PSAnQ29tcGF0aWJsZScsXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgYWxsUHJveGllcyA9IFtcclxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm94aWVzKSxcclxuICAgICAgLi4uc29ydGVkUHJvdmlkZXJzLmZsYXRNYXAoKHByb3ZpZGVyKSA9PlxyXG4gICAgICAgIHByb3ZpZGVyLnByb3hpZXNcclxuICAgICAgICAgIC5maWx0ZXIoKHByb3h5KSA9PiAhKHByb3h5Lm5hbWUgaW4gcHJveGllcykpXHJcbiAgICAgICAgICAubWFwKChwcm94eSkgPT4gKHtcclxuICAgICAgICAgICAgLi4ucHJveHksXHJcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwcm92aWRlci5uYW1lLFxyXG4gICAgICAgICAgfSkpLFxyXG4gICAgICApLFxyXG4gICAgXVxyXG5cclxuICAgIGJhdGNoKCgpID0+IHtcclxuICAgICAgc2V0UHJveGllcyhzb3J0ZWRQcm94aWVzKVxyXG4gICAgICBzZXRQcm94eVByb3ZpZGVycyhzb3J0ZWRQcm92aWRlcnMpXHJcbiAgICAgIHNldFByb3hpZXNJbmZvKGFsbFByb3hpZXMpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2VsZWN0UHJveHlJbkdyb3VwID0gYXN5bmMgKHByb3h5OiBQcm94eSwgcHJveHlOYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIGF3YWl0IHNlbGVjdFByb3h5SW5Hcm91cEFQSShwcm94eS5uYW1lLCBwcm94eU5hbWUpXHJcbiAgICBhd2FpdCBmZXRjaFByb3hpZXMoKVxyXG5cclxuICAgIGlmIChhdXRvQ2xvc2VDb25ucygpKSB7XHJcbiAgICAgIC8vIHdlIGRvbid0IHVzZSBhY3RpdmVDb25ucyBmcm9tIHVzZUNvbm5lY3Rpb24gaGVyZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLFxyXG4gICAgICAvLyBhbmQgd2UgdXNlIGVtcHR5IGFycmF5IHRvIHJlc3RydWN0IG1zZyBiZWNhdXNlIHRoZXkgYXJlIGNsb3NlZCwgdGhleSB3b24ndCBoYXZlIHNwZWVkIGFueXdheVxyXG4gICAgICB1bnRyYWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhY3RpdmVDb25ucyA9IHJlc3RydWN0UmF3TXNnVG9Db25uZWN0aW9uKFxyXG4gICAgICAgICAgbGF0ZXN0Q29ubmVjdGlvbk1zZygpPy5jb25uZWN0aW9ucyA/PyBbXSxcclxuICAgICAgICAgIFtdLFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUNvbm5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGFjdGl2ZUNvbm5zLmZvckVhY2goKHsgaWQsIGNoYWlucyB9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFpbnMuaW5jbHVkZXMocHJveHkubmFtZSkpIHtcclxuICAgICAgICAgICAgICBjbG9zZVNpbmdsZUNvbm5lY3Rpb25BUEkoaWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcHJveHlMYXRlbmN5VGVzdCA9IChwcm94eU5hbWU6IHN0cmluZywgcHJvdmlkZXI6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5TGF0ZW5jeVRlc3RpbmdNYXAocHJveHlOYW1lLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGVsYXkgfSA9IGF3YWl0IHByb3h5TGF0ZW5jeVRlc3RBUEkoXHJcbiAgICAgICAgcHJveHlOYW1lLFxyXG4gICAgICAgIHByb3ZpZGVyLFxyXG4gICAgICAgIHVybEZvckxhdGVuY3lUZXN0KCksXHJcbiAgICAgICAgbGF0ZW5jeVRlc3RUaW1lb3V0RHVyYXRpb24oKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgc2V0TGF0ZW5jeU1hcCgobGF0ZW5jeU1hcCkgPT4gKHtcclxuICAgICAgICAuLi5sYXRlbmN5TWFwLFxyXG4gICAgICAgIFtwcm94eU5hbWVdOiBkZWxheSxcclxuICAgICAgfSkpXHJcbiAgICB9KVxyXG5cclxuICBjb25zdCBwcm94eUdyb3VwTGF0ZW5jeVRlc3QgPSAocHJveHlHcm91cE5hbWU6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5R3JvdXBMYXRlbmN5VGVzdGluZ01hcChwcm94eUdyb3VwTmFtZSwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdMYXRlbmN5TWFwID0gYXdhaXQgcHJveHlHcm91cExhdGVuY3lUZXN0QVBJKFxyXG4gICAgICAgIHByb3h5R3JvdXBOYW1lLFxyXG4gICAgICAgIHVybEZvckxhdGVuY3lUZXN0KCksXHJcbiAgICAgICAgbGF0ZW5jeVRlc3RUaW1lb3V0RHVyYXRpb24oKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgc2V0TGF0ZW5jeU1hcCgobGF0ZW5jeU1hcCkgPT4gKHtcclxuICAgICAgICAuLi5sYXRlbmN5TWFwLFxyXG4gICAgICAgIC4uLm5ld0xhdGVuY3lNYXAsXHJcbiAgICAgIH0pKVxyXG5cclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0pXHJcblxyXG4gIGNvbnN0IHVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUgPSAocHJvdmlkZXJOYW1lOiBzdHJpbmcpID0+XHJcbiAgICBzZXRVcGRhdGluZ01hcChwcm92aWRlck5hbWUsIGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB1cGRhdGVQcm94eVByb3ZpZGVyQVBJKHByb3ZpZGVyTmFtZSlcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBhd2FpdCBmZXRjaFByb3hpZXMoKVxyXG4gICAgfSlcclxuXHJcbiAgY29uc3QgdXBkYXRlQWxsUHJvdmlkZXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBzZXRJc0FsbFByb3ZpZGVyVXBkYXRpbmcodHJ1ZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcclxuICAgICAgICBwcm94eVByb3ZpZGVycygpLm1hcCgocHJvdmlkZXIpID0+XHJcbiAgICAgICAgICB1cGRhdGVQcm94eVByb3ZpZGVyQVBJKHByb3ZpZGVyLm5hbWUpLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldElzQWxsUHJvdmlkZXJVcGRhdGluZyhmYWxzZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdCA9IChwcm92aWRlck5hbWU6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdGluZ01hcChwcm92aWRlck5hbWUsIGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgcHJveHlQcm92aWRlckhlYWx0aENoZWNrQVBJKHByb3ZpZGVyTmFtZSlcclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb2xsYXBzZWRNYXAsXHJcbiAgICBzZXRDb2xsYXBzZWRNYXAsXHJcbiAgICBwcm94eUxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgcHJveHlHcm91cExhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgcHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgdXBkYXRpbmdNYXAsXHJcbiAgICBpc0FsbFByb3ZpZGVyVXBkYXRpbmcsXHJcbiAgICBwcm94aWVzLFxyXG4gICAgcHJveHlQcm92aWRlcnMsXHJcbiAgICBwcm94eUxhdGVuY3lUZXN0LFxyXG4gICAgcHJveHlHcm91cExhdGVuY3lUZXN0LFxyXG4gICAgbGF0ZW5jeU1hcCxcclxuICAgIHByb3h5Tm9kZU1hcCxcclxuICAgIGZldGNoUHJveGllcyxcclxuICAgIHNlbGVjdFByb3h5SW5Hcm91cCxcclxuICAgIHVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUsXHJcbiAgICB1cGRhdGVBbGxQcm92aWRlcixcclxuICAgIHByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdCxcclxuICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLE9BQU8sY0FBYyxlQUFlO0FBQzdDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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
|