sonamu 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +13 -22
- package/dist/api/websocket-helpers.js +1 -1
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +3 -1
- package/dist/auth/audit-log/client-ip.d.ts +3 -0
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -0
- package/dist/auth/audit-log/client-ip.js +27 -0
- package/dist/auth/audit-log/events.d.ts +1 -0
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +8 -3
- package/dist/auth/better-auth-request.d.ts +3 -0
- package/dist/auth/better-auth-request.d.ts.map +1 -0
- package/dist/auth/better-auth-request.js +23 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +3 -3
- package/dist/bin/cli.js +1 -1
- package/dist/entity/entity.js +1 -1
- package/dist/index.js +1 -1
- package/dist/migration/code-generation.js +1 -1
- package/dist/syncer/checksum.js +6 -13
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4 -2
- package/dist/ui/api.js +1 -1
- package/package.json +3 -3
- package/src/api/sonamu.ts +14 -29
- package/src/auth/audit-log/builders.ts +3 -0
- package/src/auth/audit-log/client-ip.ts +38 -0
- package/src/auth/audit-log/events.ts +1 -0
- package/src/auth/audit-log-ingestor.ts +22 -15
- package/src/auth/better-auth-request.ts +20 -0
- package/src/bin/build-config.ts +3 -2
- package/src/skills/sonamu/puri.md +33 -0
- package/src/syncer/checksum.ts +7 -12
- package/src/testing/index.ts +1 -0
package/dist/api/sonamu.js
CHANGED
|
@@ -2,6 +2,8 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
|
2
2
|
import { getSonamuEnvironment, init_env, readAllEnvironmentSnapshots } from "../env.js";
|
|
3
3
|
import { DB, init_db } from "../database/db.js";
|
|
4
4
|
import { BASE_FIELD_MAPPINGS, init_better_auth_entities } from "../auth/better-auth-entities.js";
|
|
5
|
+
import { convertFastifyHeadersToStandard, init_utils, merge } from "../utils/utils.js";
|
|
6
|
+
import { createBetterAuthRequest, init_better_auth_request } from "../auth/better-auth-request.js";
|
|
5
7
|
import { CachePresets, applyCacheHeaders, init_cache_control } from "../cache-control/cache-control.js";
|
|
6
8
|
import { init_compress, toFastifyCompressOption } from "../compress/compress.js";
|
|
7
9
|
import { SD, init_sd, setSDConfig } from "../dict/sd.js";
|
|
@@ -13,7 +15,6 @@ import { WebSocketRuntime, init_ws } from "../stream/ws.js";
|
|
|
13
15
|
import { centerText, init_console_util } from "../utils/console-util.js";
|
|
14
16
|
import { init_controller, isDaemonServer } from "../utils/controller.js";
|
|
15
17
|
import { exists, fileExists, init_fs_utils } from "../utils/fs-utils.js";
|
|
16
|
-
import { convertFastifyHeadersToStandard, init_utils, merge } from "../utils/utils.js";
|
|
17
18
|
import { getSecrets, init_secret } from "./secret.js";
|
|
18
19
|
import { createWebSocketReplyStub, init_websocket_helpers, resolveIntegratedViteHmrOptions, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions } from "./websocket-helpers.js";
|
|
19
20
|
import { AsyncLocalStorage } from "async_hooks";
|
|
@@ -50,6 +51,7 @@ function runGuards({ guards, config, request, api }) {
|
|
|
50
51
|
var SonamuClass, Sonamu, LOCAL_HOSTS;
|
|
51
52
|
var init_sonamu = __esmMin((() => {
|
|
52
53
|
init_better_auth_entities();
|
|
54
|
+
init_better_auth_request();
|
|
53
55
|
init_cache_control();
|
|
54
56
|
init_compress();
|
|
55
57
|
init_db();
|
|
@@ -699,12 +701,6 @@ var init_sonamu = __esmMin((() => {
|
|
|
699
701
|
let traceContext = {};
|
|
700
702
|
try {
|
|
701
703
|
traceContext = this.websocketRuntime.telemetryController.createConnectionContext({ headers: request.headers });
|
|
702
|
-
runGuards({
|
|
703
|
-
guards: api.options.guards,
|
|
704
|
-
config,
|
|
705
|
-
request,
|
|
706
|
-
api
|
|
707
|
-
});
|
|
708
704
|
preRegisterPhase = "query";
|
|
709
705
|
const reqBody = await this.parseWebSocketRequestParams(api, request);
|
|
710
706
|
preRegisterPhase = "register";
|
|
@@ -721,6 +717,14 @@ var init_sonamu = __esmMin((() => {
|
|
|
721
717
|
});
|
|
722
718
|
const scopedWs = this.createScopedWebSocketConnection(rawWs, () => wsContext);
|
|
723
719
|
wsContext = await this.createWebSocketContext(config, request, scopedWs);
|
|
720
|
+
await this.asyncLocalStorage.run({ context: wsContext }, async () => {
|
|
721
|
+
runGuards({
|
|
722
|
+
guards: api.options.guards,
|
|
723
|
+
config,
|
|
724
|
+
request,
|
|
725
|
+
api
|
|
726
|
+
});
|
|
727
|
+
});
|
|
724
728
|
this.websocketRuntime.activateConnection(rawWs.id);
|
|
725
729
|
preRegisterPhase = "handler";
|
|
726
730
|
const { ApiParamType } = await import("../types/types.js");
|
|
@@ -1138,20 +1142,7 @@ var init_sonamu = __esmMin((() => {
|
|
|
1138
1142
|
method: ["GET", "POST"],
|
|
1139
1143
|
url: `${basePath}/*`,
|
|
1140
1144
|
handler: async (request, reply) => {
|
|
1141
|
-
const
|
|
1142
|
-
const headers = convertFastifyHeadersToStandard(request.headers);
|
|
1143
|
-
if (request.ip && ![
|
|
1144
|
-
"cf-connecting-ip",
|
|
1145
|
-
"x-forwarded-for",
|
|
1146
|
-
"x-real-ip",
|
|
1147
|
-
"x-vercel-forwarded-for"
|
|
1148
|
-
].some((h) => headers.has(h))) headers.set("x-real-ip", request.ip);
|
|
1149
|
-
const req = new Request(url.toString(), {
|
|
1150
|
-
method: request.method,
|
|
1151
|
-
headers,
|
|
1152
|
-
...request.body ? { body: JSON.stringify(request.body) } : {}
|
|
1153
|
-
});
|
|
1154
|
-
const response = await this.auth.handler(req);
|
|
1145
|
+
const response = await this.auth.handler(createBetterAuthRequest(request, options.advanced?.ipAddress?.ipAddressHeaders));
|
|
1155
1146
|
reply.status(response.status);
|
|
1156
1147
|
response.headers.forEach((value, key) => {
|
|
1157
1148
|
reply.header(key, value);
|
|
@@ -1272,4 +1263,4 @@ var init_sonamu = __esmMin((() => {
|
|
|
1272
1263
|
init_sonamu();
|
|
1273
1264
|
export { Sonamu, createWebSocketReplyStub, init_sonamu, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
|
|
1274
1265
|
|
|
1275
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgdHlwZSB7fSBmcm9tIFwiQGZhc3RpZnkvd2Vic29ja2V0XCI7XG5pbXBvcnQgeyBkaXNwb3NlIGFzIGxvZ3RhcGVEaXNwb3NlIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aCwgdHlwZSBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeUluc3RhbmNlLCB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgbWltZSwgeyBsb29rdXAgYXMgbWltZUxvb2t1cCB9IGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldCB9IGZyb20gXCJ3c1wiO1xuaW1wb3J0IHsgdHlwZSBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEJBU0VfRklFTERfTUFQUElOR1MgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1lbnRpdGllc1wiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb250cm9sQ29uZmlnLCB0eXBlIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbmZpZywgdHlwZSBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNELCBzZXRTRENvbmZpZyB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCwgcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzIH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBCdWZmZXJlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS9idWZmZXJlZC1maWxlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEtleUdlbmVyYXRvciB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBVcGxvYWRlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS91cGxvYWRlZC1maWxlXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrU1NFRmFjdG9yeSB9IGZyb20gXCIuLi9zdHJlYW0vc3NlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRSdW50aW1lLCB0eXBlIFdlYlNvY2tldENvbm5lY3Rpb24sIHR5cGUgV2ViU29ja2V0RXZlbnRNYXAgfSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgU3luY2VyIH0gZnJvbSBcIi4uL3N5bmNlci9zeW5jZXJcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRGV2Vml0ZXN0TWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBjZW50ZXJUZXh0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiO1xuaW1wb3J0IHsgaXNEYWVtb25TZXJ2ZXIgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzLCBmaWxlRXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLCBtZXJnZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVDb25maWcsIHR5cGUgU29uYW11U2VydmVyT3B0aW9ucywgdHlwZSBTb25hbXVUYXNrT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBDb250ZXh0LCB0eXBlIFJ1bnRpbWVDb250ZXh0LCB0eXBlIFdlYlNvY2tldENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IFJ1bnRpbWVDb250ZXh0O1xuICB9PiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuXG4gIHB1YmxpYyBnZXRDb250ZXh0PFQgZXh0ZW5kcyBSdW50aW1lQ29udGV4dCA9IENvbnRleHQ+KCk6IFQge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgIGlmIChzdG9yZT8uY29udGV4dCkge1xuICAgICAgcmV0dXJuIHN0b3JlLmNvbnRleHQgYXMgVDtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCBjb250ZXh0XCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsID0gbnVsbDtcbiAgc2V0IGFwaVJvb3RQYXRoKGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGgpIHtcbiAgICB0aGlzLl9hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLl9hcGlSb290UGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcHBSb290UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gIH1cblxuICBwcml2YXRlIF9kYkNvbmZpZzogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuX2RiQ29uZmlnID0gZGJDb25maWc7XG4gIH1cbiAgZ2V0IGRiQ29uZmlnKCk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBpZiAodGhpcy5fZGJDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYkNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNlcjogU3luY2VyIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzeW5jZXIoc3luY2VyOiBTeW5jZXIpIHtcbiAgICB0aGlzLl9zeW5jZXIgPSBzeW5jZXI7XG4gIH1cbiAgZ2V0IHN5bmNlcigpOiBTeW5jZXIge1xuICAgIGlmICh0aGlzLl9zeW5jZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zeW5jZXI7XG4gIH1cblxuICBwcml2YXRlIF9jb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgY29uZmlnKGNvbmZpZzogU29uYW11Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlY3JldHM6IFNvbmFtdVNlY3JldHMgPSBnZXRTZWNyZXRzKCk7XG5cbiAgcHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fc3RvcmFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RvcmFnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIHN0b3JhZ2UgY29uZmlnLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9jYWNoZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBjYWNoZSBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgX3dvcmtmbG93czogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy5fd29ya2Zsb3dzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd3M7XG4gIH1cblxuICBwcml2YXRlIF9hdXRoOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLl9hdXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGV2Vml0ZXN0TWFuYWdlcjogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI7XG4gIH1cbiAgc2V0IGRldlZpdGVzdE1hbmFnZXIobWFuYWdlcjogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwpIHtcbiAgICB0aGlzLl9kZXZWaXRlc3RNYW5hZ2VyID0gbWFuYWdlcjtcbiAgfVxuXG4gIC8vIFNvbmFtdeqwgCBydW50aW1l7J2EIOyngeygkSDshozsnKDtlbQgcmVnaXN0cnkvY29ubmVjdGlvbiBsaWZlY3ljbGXsnYQg7JWg7ZSM66as7LyA7J207IWYIOyImOuqheyjvOq4sOyZgCDrj5nquLDtmZTtlahcbiAgcHJpdmF0ZSBfd2Vic29ja2V0UnVudGltZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLl93ZWJzb2NrZXRSdW50aW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgcnVudGltZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0UnVudGltZTtcbiAgfVxuICBzZXQgd2Vic29ja2V0UnVudGltZShydW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbCkge1xuICAgIHRoaXMuX3dlYnNvY2tldFJ1bnRpbWUgPSBydW50aW1lO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrDog7YyM7J28IOyLnOyKpO2FnCDqsJDsi5wgKyBITVIvc3luYyDsgqzsnbTtgbQg7Iuk7ZaJ7J2AIHdhdGNoZXIg66qo65OI66GcIOychOyehO2VqeuLiOuLpC5cbiAgcHVibGljIHdhdGNoZXI6IEZTV2F0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIHRoaXMuZm9yVGVzdGluZyA9IGZvclRlc3Rpbmc7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAvLyBBUEkg66Oo7Yq4IO2MqOyKpFxuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICB0aGlzLmFwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGggPz8gZmluZEFwaVJvb3RQYXRoKCk7XG4gICAgY29uc3QgYmFzZUVudkJlZm9yZUNvbmZpZ0xvYWQgPSB7IC4uLnByb2Nlc3MuZW52IH07XG5cbiAgICAvLyDshKTsoJXsnYQg66Gc65Sp7ZWY64qUIOqyg+u2gO2EsCDsi5zsnpFcbiAgICBjb25zdCBjb25maWdTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIGNvbnN0IGNvbmZpZ1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGNvbmZpZ1N0YXJ0O1xuICAgIHNldFNEQ29uZmlnKHRoaXMuY29uZmlnLmkxOG4pO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgY29uc3QgeyBpc0xvY2FsOiBpc0xvY2FsRW52aXJvbm1lbnQgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgZW52aXJvbm1lbnRTbmFwc2hvdHMgPSBpc0xvY2FsRW52aXJvbm1lbnQoKVxuICAgICAgPyByZWFkQWxsRW52aXJvbm1lbnRTbmFwc2hvdHModGhpcy5hcGlSb290UGF0aCwgYmFzZUVudkJlZm9yZUNvbmZpZ0xvYWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRiQ29uZmlnID0gREIuZ2VuZXJhdGVEQkNvbmZpZyhcbiAgICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLFxuICAgICAgdGhpcy5jb25maWcucHJvamVjdE5hbWUsXG4gICAgICBlbnZpcm9ubWVudFNuYXBzaG90cyxcbiAgICApO1xuICAgIERCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2F1dGggPSBiZXR0ZXJBdXRoKGF1dGhPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU3NyUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCwgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5faW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLl9jb25maWdFbGFwc2VkID0gY29uZmlnVGltZTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRFbGFwc2VkID0gMDtcbiAgcHJpdmF0ZSBfY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWluaXRPcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgdGhpcy5wcmludFN0YXJ0dXBTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUgPz89IG5ldyBXZWJTb2NrZXRSdW50aW1lKHRoaXMuY29uZmlnLnNlcnZlci53ZWJzb2NrZXQpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIHN5bmNlci5hcGlz66W8IOuPmeyggeycvOuhnCDtg5Dsg4ntlZjsl6wgQVBJIOyalOyyreydhCDsspjrpqztlanri4jri6QuXG4gICAqIHNlcnZlci5yb3V0ZSgp66GcIOqwnOuzhCDrk7HroZ3tlZjrqbQgaGFuZGxlcuqwgCDqs6DsoJXrkJjslrQgSE1S7J20IOuPmeyeke2VmOyngCDslYrsnLzrr4DroZwsXG4gICAqIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWY64qUIOydtCDrsKnsi53snYQg7IKs7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmpTssq3snbQgL2FwaSjsoJXtmZXtnojripQgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDqsr3smrDrnbzrqbQgbnVsbOydhCDrsJjtmZjtlZjrqbAg64Gd64OF64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZXZBcGlSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPikgfCBudWxsIHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0KTtcblxuICAgIGlmICghbWF0Y2hlZEFwaSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICB9XG5cbiAgICAvLyB3ZWJzb2NrZXQgcm91dGXrpbwg7J2867CYIEhUVFDroZwg7KeB7KCRIO2YuOy2nO2VnCDqsr3smrAgNDI27J2EIOuPjOugpOykmCB1cGdyYWRlIOyXhuydtCDsoJHqt7ztlZjripQg6rKD7J2EIOywqOuLqO2VqFxuICAgIGlmIChtYXRjaGVkQXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVBcGlIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNYXRjaGVkQXBpKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0KTogRXh0ZW5kZWRBcGkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcblxuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXMuZmluZCgoYXBpKSA9PiB7XG4gICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpTWV0aG9kID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiO1xuICAgICAgaWYgKGFwaU1ldGhvZCAhPT0gbWV0aG9kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoO1xuICAgICAgcmV0dXJuIHRoaXMuaXNQYXRoUGF0dGVybk1hdGNoKGZ1bGxQYXRoLCB1cmwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGRldiBhcGkg66qo65OcOiBWaXRlIOyXhuydtCBBUEkg64+Z7KCBIOudvOyasO2MheunjCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEhNUuydhCDsnITtlbQgY2F0Y2gtYWxs7JeQ7IScIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdXBncmFkZeuKlCDsi6Tsp4jsoIHsnLzroZwgR0VU7JeQ7ISc66eMIOyEseumve2VmOuvgOuhnCBHRVQgKyB3c0hhbmRsZXIg7JmAIOq3uCDsmbggbWV0aG9k66W8IOuzhOuPhCByb3V0ZeuhnCDrtoTrpqztlahcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOuTseuhneuQnCBBUEnsmYAg7J287LmY7ZWY7KeAIOyViuuKlCDsmpTssq3sl5Ag64yA7ZWcIGZhbGxiYWNr7J6F64uI64ukLlxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIGRldiBhbGwg66qo65OcOiBWaXRlIERldiBTZXJ2ZXLrpbwg7Ya17ZWp7ZWY7JesIEFQSSArIFNTUiArIENTUuydhCDrqqjrkZAg7KCc6rO17ZWp64uI64ukLlxuICAgKiBBUEkg64+Z7KCBIOunpOy5reydgCBoYW5kbGVEZXZBcGlSZXF1ZXN066W8IOqzteycoO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEBmYXN0aWZ5L21pZGRpZSDrk7HroZ0gKENvbm5lY3Qtc3R5bGUgbWlkZGxld2FyZSDsp4Dsm5ApXG4gICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9taWRkaWVcIikpLmRlZmF1bHQpO1xuXG4gICAgY29uc3Qgdml0ZSA9IGF3YWl0IGltcG9ydChcInZpdGVcIik7XG4gICAgLy8gQGZhc3RpZnkvd2Vic29ja2V0IO2UjOufrOq3uOyduOydtCDtmZzshLHtmZTrkJjrqbQgSE1SIHdlYnNvY2tldOqzvCBzZXJ2ZXIgc29ja2V07J20IOy2qeuPjO2VmOuvgOuhnCBkZWRpY2F0ZWQg7Y+s7Yq466GcIOu2hOumrO2VqFxuICAgIGNvbnN0IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyID0gQm9vbGVhbih0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3MpO1xuICAgIGNvbnN0IGhtciA9IHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMoe1xuICAgICAgaHR0cFNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgIHJlcXVpcmVzRGVkaWNhdGVkV2ViU29ja2V0U2VydmVyOiByZXF1aXJlc0RlZGljYXRlZEhtclNlcnZlcixcbiAgICB9KTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcixcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gV1MgdXBncmFkZSDqsr3roZwoR0VUKeyZgCDsnbzrsJggSFRUUCDrqZTshJzrk5zrpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VtCB3ZWJzb2NrZXQgcm91dGXqsIAgSFRNTCBmYWxsYmFja+yXkCDrqLntnojsp4Ag7JWK64+E66GdIO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgICB3c0hhbmRsZXI6IGFzeW5jIChjb25uZWN0aW9uLCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRGV2V2ViU29ja2V0UmVxdWVzdChjb25uZWN0aW9uLnNvY2tldCwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJIRUFEXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gY2F0Y2gtYWxsIOudvOyasO2KuOyXkOyEnCBTU1IvQ1NSIOyymOumrFxuICAgIC8vIOqwnOuwnCDtmZjqsr3sl5DshJzripQg65287Jqw7Yq467OEIGNvbXByZXNzIOyYteyFmOydhCDtj6zquLDtlZjqs6AgSE1SIOydtOygkOydhCDst6jtlanri4jri6QuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIC8vIDEuIFNTUiDrnbzsmrDtirgg7LKY66asXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hTU1JSb3V0ZSwgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICAgIGNvbnN0IHNzck1hdGNoID0gbWF0Y2hTU1JSb3V0ZSh1cmwpO1xuICAgICAgICBpZiAoc3NyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtzc3JNYXRjaC5yb3V0ZS5wYXRofWApO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IoXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBzc3JNYXRjaC5yb3V0ZSxcbiAgICAgICAgICAgIHNzck1hdGNoLnBhcmFtcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRoaXMudml0ZVNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBDU1IgZmFsbGJhY2tcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUgPSBwYXRoLnJlbGF0aXZlKGFzc2V0c0Rpciwgc2FmZUZpbGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgY29uc3QgYXNzZXRQYXRoID0gYC9hc3NldHMvJHtub3JtYWxpemVkUmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChub3JtYWxpemVkUmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoYXNzZXRzRGlyKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoXCJpbmRleC1cIikgJiYgZi5lbmRzV2l0aChgLiR7ZXh0fWApKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihhc3NldHNEaXIsIGN1cnJlbnRGaWxlKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IFwidGV4dC9jc3NcIik7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCDtjIzsnbwg7ISc67mZXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHNhZmVGaWxlUGF0aDtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NS7JqpIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3NyXCIsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlQ29uZmlnID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY3NyQ2FjaGVSZXEpO1xuXG4gICAgICAgICAgaWYgKGNzckNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgY3NyQ2FjaGVDb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOygleyggSDtjIzsnbzsnbQg7KG07J6s7ZWgIOqyveyasCwg7KCV7KCBIO2MjOydvOydhCDrqLzsoIAg7ISc67mZ7ZW07JW87ZWoXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcih3ZWJEaXN0UGF0aCwgcmVxdWVzdFBhdGgpO1xuICAgICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzYWZlRmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNhZmVGaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUobWltZUxvb2t1cChzYWZlRmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleuztOuhnCB6b2Qg7Iqk7YKk66eIIOu5jOuTnFxuICAgICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgICAgICAvLyByZXF1ZXN0IO2MjOyLsVxuICAgICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgICAgbGV0IHJlcUJvZHk6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczoge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IEJ1ZmZlcmVkRmlsZVtdO1xuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFVwbG9hZGVkRmlsZVtdO1xuICAgICAgICB9ID0ge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IFtdLFxuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChyZXF1ZXN0W3doaWNoXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgICByZXFCb2R5ID0gZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgcmVwbHkpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFdTIHBhdGjrpbwg7J2867CYIEhUVFAgR0VU7Jy866GcIO2YuOy2nO2VnCDqsr3smrAgNDI2ICsgVXBncmFkZSDtl6TrjZTroZwg66qF7Iuc7KCB7Jy866GcIHdlYnNvY2tldCDsoJHsho3snYQg7Jyg64+E7ZWoXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpIHtcbiAgICByZXR1cm4gYXN5bmMgKF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmVwbHkuaGVhZGVyKFwiY29ubmVjdGlvblwiLCBcIlVwZ3JhZGVcIikuaGVhZGVyKFwidXBncmFkZVwiLCBcIndlYnNvY2tldFwiKS5zdGF0dXMoNDI2KS5zZW5kKHtcbiAgICAgICAgbWVzc2FnZTogXCJXZWJTb2NrZXQgdXBncmFkZSByZXF1aXJlZFwiLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGRldiDrqqjrk5zsnZggY2F0Y2gtYWxsIHdzSGFuZGxlcuyXkOyEnCDsi6TsoJwgV1MgQVBJ66GcIOuUlOyKpO2MqOy5mO2VqC4g66ek7Lmt65CY64qUIHJvdXRl6rCAIOyXhuycvOuptCAxMDA466GcIOuLq+ydjFxuICBwcml2YXRlIGFzeW5jIGhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoXG4gICAgc29ja2V0OiBXZWJTb2NrZXQsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0KTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgZ3VhcmTrpbwgY29ubmVjdGlvbiDrk7HroZ0g7J207KCE7JeQIOuPjOugpCDsnbjspp0g7Iuk7YyoIOyLnCDrtoDrtoQg65Ox66GdIOyDge2DnOulvCDrgqjquLDsp4Ag7JWK7J2MXG4gIC8vIDIpIHF1ZXJ5IHBhcmFtIO2MjOyLseuPhCBhY3RpdmF0aW9uIOyghOyXkCDrgZ3rgrQgaGFuZHNoYWtlIOyLpO2MqOqwgCByZWdpc3RyeeyXkCDrhbjstpzrkJjsp4Ag7JWK6rKMIO2VqFxuICAvLyAzKSBgYWN0aXZlOiBmYWxzZWDroZwg66i87KCAIOuTseuhne2VmOqzoCwgY29udGV4dCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldEhhbmRsZXIoYXBpOiBFeHRlbmRlZEFwaSwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGFzeW5jIChcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgc29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgICB9LFxuICAgICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0aW9uLnNvY2tldDtcbiAgICAgIGxldCB3c0NvbnRleHQ6IFdlYlNvY2tldENvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bkd1YXJkcyh7XG4gICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYXBpLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmVSZWdpc3RlclBoYXNlID0gXCJxdWVyeVwiO1xuICAgICAgICBjb25zdCByZXFCb2R5ID0gYXdhaXQgdGhpcy5wYXJzZVdlYlNvY2tldFJlcXVlc3RQYXJhbXMoYXBpLCByZXF1ZXN0KTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicmVnaXN0ZXJcIjtcbiAgICAgICAgcmF3V3MgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIG91dEV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLm91dEV2ZW50cyxcbiAgICAgICAgICBpbkV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLmluRXZlbnRzLFxuICAgICAgICAgIG5hbWVzcGFjZTogYXBpLndlYnNvY2tldE9wdGlvbnMhLm5hbWVzcGFjZSxcbiAgICAgICAgICBoZWFydGJlYXQ6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5oZWFydGJlYXQsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICB0cmFjZUlkOiB0cmFjZUNvbnRleHQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgIHNhbXBsZWQ6IHRyYWNlQ29udGV4dC5zYW1wbGVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY29wZWRXcyA9IHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbihyYXdXcywgKCkgPT4gd3NDb250ZXh0KTtcbiAgICAgICAgd3NDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXZWJTb2NrZXRDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgc2NvcGVkV3MpO1xuICAgICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUuYWN0aXZhdGVDb25uZWN0aW9uKHJhd1dzLmlkKTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwiaGFuZGxlclwiO1xuXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdzQ29udGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiB3c0NvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjbG9zZURlc2NyaXB0b3IgPSByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFyYXdXcykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgICAgICBsZXZlbDogY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIiA/IFwid2FyblwiIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlYXNvbjogcHJlUmVnaXN0ZXJQaGFzZSxcbiAgICAgICAgICAgICAgY29kZTogY2xvc2VEZXNjcmlwdG9yLmNvZGUsXG4gICAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHRyYWNlQ29udGV4dC50cmFjZUlkLFxuICAgICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgICAgc2FtcGxlZDogdHJhY2VDb250ZXh0LnNhbXBsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFxuICAgIFRPdXQgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgPihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLl93ZWJzb2NrZXRSdW50aW1lPy50ZWxlbWV0cnlDb250cm9sbGVyO1xuICAgIGNvbnN0IHJ1bkluQ29udGV4dCA9IDxUPihjYWxsYmFjazogKCkgPT4gVCk6IFQgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoKTtcbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5pZDtcbiAgICAgIH0sXG4gICAgICBnZXQgbmFtZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gd3MubmFtZXNwYWNlO1xuICAgICAgfSxcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5jbG9zZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IHVzZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLnVzZXJJZDtcbiAgICAgIH0sXG4gICAgICB0cmFuc3BvcnQ6IFwid3NcIixcbiAgICAgIHB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHdzLnB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZShjb2RlLCByZWFzb24pIHtcbiAgICAgICAgd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgIH0sXG4gICAgICBvbkNsb3NlKGNhbGxiYWNrKSB7XG4gICAgICAgIHdzLm9uQ2xvc2UoKCkgPT4gcnVuSW5Db250ZXh0KGNhbGxiYWNrKSk7XG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIHdzLm9uTWVzc2FnZShldmVudCwgKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpID0+XG4gICAgICAgICAgcnVuSW5Db250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IFN0cmluZyhldmVudCk7XG4gICAgICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBtZXNzYWdlVHJhY2VDb250ZXh0ID8/IGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQod3MpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuc3RhcnRlZFwiLFxuICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpO1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5jb21wbGV0ZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ1bnNldFwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLmZhaWxlZFwiLFxuICAgICAgICAgICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LnJlY29yZFNwYW4oe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MubWVzc2FnZS5wcm9jZXNzXCIsXG4gICAgICAgICAgICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoKHJlcXVlc3QucXVlcnkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdTIOqyveuhnOyXkOyEnOuKlCBIVFRQIHJlcGx56rCAIOyXhuycvOuvgOuhnCByZXBseeulvCBvcHRpb25hbOuhnCDrsJvslYQg6rO17Ya1IO2YuOy2nCDqsr3roZzrpbwg7Jyg7KeA7ZWoXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5PzogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5fYXV0aD8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBXZWJTb2NrZXRDb250ZXh0W1wid3NcIl0sXG4gICk6IFByb21pc2U8V2ViU29ja2V0Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gPFQgZXh0ZW5kcyBab2RPYmplY3Q+KF9ldmVudHM6IFQpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgICAgICk7XG4gICAgfTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBkZWZhdWx0Q29udGV4dC5uYWl0ZVN0b3JlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB1c2VyOiBkZWZhdWx0Q29udGV4dC51c2VyLFxuICAgICAgICAgIHNlc3Npb246IGRlZmF1bHRDb250ZXh0LnNlc3Npb24sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcGx5U3R1YixcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zcG9ydDogX3RyYW5zcG9ydCxcbiAgICAgIHJlcGx5OiBfcmVwbHksXG4gICAgICBjcmVhdGVTU0U6IF9jcmVhdGVTU0UsXG4gICAgICBidWZmZXJlZEZpbGVzOiBfYnVmZmVyZWRGaWxlcyxcbiAgICAgIHVwbG9hZGVkRmlsZXM6IF91cGxvYWRlZEZpbGVzLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBodHRwTGlrZUNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoZXIg66qo65OI7J2AIGZpbGUtcGF0dGVybnMg4oaSIFNvbmFtdSDsiJztmZjsnYQg7ZS87ZWY6riwIOychO2VtCBkeW5hbWljIGltcG9ydCDtlanri4jri6QuXG4gICAgY29uc3QgeyBzZXR1cFdhdGNoZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci93YXRjaGVyXCIpO1xuICAgIHRoaXMud2F0Y2hlciA9IGF3YWl0IHNldHVwV2F0Y2hlcigoZmlsZUV2ZW50cykgPT4gdGhpcy5ydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgMTAwbXMgYmF0Y2jroZwg66qo7J2AIGZpbGVFdmVudHMg7ZWY64KY7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqIGJhdGNoIO2BkOyeiSDrjZXsl5Ag7ZWcIOyLnOygkOyXkCDtlZjrgpjrp4wg7Iuk7ZaJ65Co7J20IOuztOyepeuQqeuLiOuLpCAoZXZlbnQtYmF0Y2hlcuqwgCDsp4HroKztmZQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcbiAgICB9XG5cbiAgICAvLyDrs7jssrQ6IOuzgOqyvSDtnaHsiJggKyDssrTtgazshKwg6rCx7IugLlxuICAgIGF3YWl0IHRoaXMuc3luY2VyLmhtckFuZFN5bmMoZmlsZUV2ZW50cyk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLlxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMud3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViU29ja2V0UGx1Z2luKHNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEBmYXN0aWZ5L3dlYnNvY2tldOydgCBwbHVnaW5zLndz6rCAIOyEpOygleuQnCDqsr3smrDsl5Drp4wg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgc2VydmVy7JeQIOykkeuztSDrk7HroZ3rkJjsp4Ag7JWK64+E66GdIFdlYWtTZXTsnLzroZwg6riw66Gd7ZWoXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViU29ja2V0UGx1Z2luKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuaGFzKHNlcnZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5PcHRpb24gPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3M7XG4gICAgaWYgKCFwbHVnaW5PcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJzb2NrZXRQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvd2Vic29ja2V0XCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IHJlc29sdmVkUGx1Z2luT3B0aW9ucyA9IHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgICAgIHJhd1BsdWdpbk9wdGlvbjogcGx1Z2luT3B0aW9uLFxuICAgIH0pO1xuICAgIGlmIChyZXNvbHZlZFBsdWdpbk9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4sIHJlc29sdmVkUGx1Z2luT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4pO1xuICAgIH1cblxuICAgIHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5hZGQoc2VydmVyKTtcbiAgICB0aGlzLndhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoc2VydmVyKTtcbiAgfVxuXG4gIC8vIGhlYXJ0YmVhdCBpbnRlcnZhbOydtCBGYXN0aWZ5IGtlZXBBbGl2ZVRpbWVvdXQg7J207IOB7J2066m0IOyduO2UhOudvOqwgCDrqLzsoIAgaWRsZSDsl7DqsrDsnYQg64GK7J2EIOyImCDsnojslrQg6rK96rOg66eMIOuCqOq4sOqzoCDrhJjslrTqsJBcbiAgcHJpdmF0ZSB3YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhlYXJ0YmVhdHMgPSB0aGlzLnN5bmNlci5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zPy5oZWFydGJlYXQgPz8gMzAwMDApXG4gICAgICAuZmlsdGVyKChoZWFydGJlYXQpID0+IGhlYXJ0YmVhdCA+IDApO1xuXG4gICAgaWYgKGhlYXJ0YmVhdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMuY29uZmlnLnNlcnZlci5mYXN0aWZ5Py5rZWVwQWxpdmVUaW1lb3V0O1xuICAgIGlmICgha2VlcEFsaXZlVGltZW91dCB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYXJnZXN0SGVhcnRiZWF0ID0gTWF0aC5tYXgoLi4uaGVhcnRiZWF0cyk7XG4gICAgaWYgKGxhcmdlc3RIZWFydGJlYXQgPj0ga2VlcEFsaXZlVGltZW91dCkge1xuICAgICAgc2VydmVyLmxvZy53YXJuKFxuICAgICAgICB7XG4gICAgICAgICAga2VlcEFsaXZlVGltZW91dCxcbiAgICAgICAgICBsYXJnZXN0SGVhcnRiZWF0LFxuICAgICAgICB9LFxuICAgICAgICBcIldlYlNvY2tldCBoZWFydGJlYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGtlZXBBbGl2ZVRpbWVvdXQ7IGFsaWduIGluZnJhc3RydWN0dXJlIGlkbGUgdGltZW91dHMgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXNjb25uZWN0cy5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDrnbzsmrDtirgg65Ox66GdXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiUE9TVFwiXSxcbiAgICAgIHVybDogYCR7YmFzZVBhdGh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcblxuICAgICAgICAvLyBJUCDtl6TrjZQgZmFsbGJhY2s6IO2UhOuhneyLnOqwgCDtkZzspIAgSVAg7Zek642U66W8IOyjvOyehe2VmOyngCDslYrripQg7ZmY6rK97JeQ7ISc64+EXG4gICAgICAgIC8vIGJldHRlci1hdXRoL2luZnJh7J2YIGdldENsaWVudElwRnJvbVJlcXVlc3QoKeqwgCBJUOulvCDsnbjsi53tlaAg7IiYIOyeiOuPhOuhnVxuICAgICAgICAvLyBGYXN0aWZ56rCAIHJlc29sdmXtlZwgcmVxdWVzdC5pcOulvCB4LXJlYWwtaXDroZwg7KO87J6F7ZWc64ukLlxuICAgICAgICBjb25zdCBJUF9IRUFERVJTID0gW1xuICAgICAgICAgIFwiY2YtY29ubmVjdGluZy1pcFwiLFxuICAgICAgICAgIFwieC1mb3J3YXJkZWQtZm9yXCIsXG4gICAgICAgICAgXCJ4LXJlYWwtaXBcIixcbiAgICAgICAgICBcIngtdmVyY2VsLWZvcndhcmRlZC1mb3JcIixcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlcXVlc3QuaXAgJiYgIUlQX0hFQURFUlMuc29tZSgoaCkgPT4gaGVhZGVycy5oYXMoaCkpKSB7XG4gICAgICAgICAgaGVhZGVycy5zZXQoXCJ4LXJlYWwtaXBcIiwgcmVxdWVzdC5pcCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXEgPSBuZXcgUmVxdWVzdCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAuLi4ocmVxdWVzdC5ib2R5ID8geyBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpIH0gOiB7fSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmhhbmRsZXIocmVxKTtcblxuICAgICAgICByZXBseS5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcGx5LmhlYWRlcihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKHJlc3BvbnNlLmJvZHkgPyBhd2FpdCByZXNwb25zZS50ZXh0KCkgOiBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByaW50U3RhcnR1cFN1bW1hcnkoKSB7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgYWN0aXZlUHJlc2V0ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcblxuICAgIGNvbnN0IGRpbSA9IChtc2c6IHN0cmluZykgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGDinJMgJHttc2d9YCkpO1xuICAgIGNvbnN0IGdyZWVuID0gKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTICR7bXNnfWApKTtcblxuICAgIGRpbShgQ29uZmlnIGxvYWRlZCR7Zm9ybWF0VGltZSh0aGlzLl9jb25maWdFbGFwc2VkKX1gKTtcblxuICAgIC8vIERCIHByZXNldCDrqqnroZ1cbiAgICBncmVlbihcIkRCXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBwcmVzZXROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuZGJDb25maWcpIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCguLi5wcmVzZXROYW1lcy5tYXAoKG4pID0+IG4ubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHByZXNldE5hbWVzKSB7XG4gICAgICBjb25zdCBjb25uID0gdGhpcy5kYkNvbmZpZ1tuYW1lXS5jb25uZWN0aW9uIGFzXG4gICAgICAgIHwgeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBkYXRhYmFzZT86IHN0cmluZyB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgZGltKGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIGRpbShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBncmVlbihgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuX2luaXRFbGFwc2VkKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNhY2hlKGNvbmZpZzogQ2FjaGVDb25maWcgfCB1bmRlZmluZWQsIGZvclRlc3Rpbmc6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHNldENhY2hlTWFuYWdlclJlZiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvZGVjb3JhdG9yXCIpO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnCDrqZTrqqjrpqwg65Oc65287J2067KEIOyekOuPmSDsgqzsmqlcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgY29uc3QgeyBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnKTtcbiAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIFdlYlNvY2tldCBzaHV0ZG93biBmaXJzdCB0byBmbHVzaCB0ZWxlbWV0cnlcbiAgICBpZiAodGhpcy5fd2Vic29ja2V0UnVudGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5fd2Vic29ja2V0UnVudGltZS5zaHV0ZG93bigpO1xuICAgIH1cbiAgICB0aGlzLl93ZWJzb2NrZXRSdW50aW1lID0gbnVsbDtcbiAgICAvLyBUaGVuIHNodXQgZG93biByZW1haW5pbmcgcmVzb3VyY2VzIGluIHBhcmFsbGVsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMuX3dvcmtmbG93cz8uZGVzdHJveSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fY2FjaGU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgXSk7XG4gICAgLy8gTG9nVGFwZSBkaXNwb3NlIGFmdGVyIFdTIHNodXRkb3duIHNvIHRlbGVtZXRyeSByZWNvcmRzIGFyZSBmbHVzaGVkIGZpcnN0XG4gICAgYXdhaXQgbG9ndGFwZURpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KFxuICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+LFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKHdzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+LFxuKTogd3MgaXMgV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+ICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIFwiZ2V0VGVsZW1ldHJ5Q29udGV4dFwiIGluIHdzICYmIHR5cGVvZiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0ID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUobXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1zID49IDEwMDAgPyBgJHsobXMgLyAxMDAwKS50b0ZpeGVkKDIpfXNgIDogYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICByZXR1cm4gYCAoJHtmb3JtYXR0ZWR9KWA7XG59XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcbmZ1bmN0aW9uIGlzTG9jYWxIb3N0KGhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9DQUxfSE9TVFMuaGFzKGhvc3QpIHx8IGhvc3QuZW5kc1dpdGgoXCIubG9jYWxcIik7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3Vh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
|
|
1266
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgdHlwZSB7fSBmcm9tIFwiQGZhc3RpZnkvd2Vic29ja2V0XCI7XG5pbXBvcnQgeyBkaXNwb3NlIGFzIGxvZ3RhcGVEaXNwb3NlIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aCwgdHlwZSBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeUluc3RhbmNlLCB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgbWltZSwgeyBsb29rdXAgYXMgbWltZUxvb2t1cCB9IGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldCB9IGZyb20gXCJ3c1wiO1xuaW1wb3J0IHsgdHlwZSBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEJBU0VfRklFTERfTUFQUElOR1MgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1lbnRpdGllc1wiO1xuaW1wb3J0IHsgY3JlYXRlQmV0dGVyQXV0aFJlcXVlc3QgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xDb25maWcsIHR5cGUgQ2FjaGVDb250cm9sUmVxdWVzdCB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29uZmlnLCB0eXBlIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB7IHR5cGUgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgU0QsIHNldFNEQ29uZmlnIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IHR5cGUgTG9jYWxpemVkU3RyaW5nIH0gZnJvbSBcIi4uL2RpY3QvdHlwZXNcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50LCByZWFkQWxsRW52aXJvbm1lbnRTbmFwc2hvdHMgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldFJ1bnRpbWUsIHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiwgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgdHlwZSBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc0RhZW1vblNlcnZlciB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMsIGZpbGVFeGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQsIG1lcmdlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdUNvbmZpZywgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLCB0eXBlIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRleHQsIHR5cGUgUnVudGltZUNvbnRleHQsIHR5cGUgV2ViU29ja2V0Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdVNlY3JldHMgfSBmcm9tIFwiLi9zZWNyZXRcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG4gIHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogUnVudGltZUNvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQ8VCBleHRlbmRzIFJ1bnRpbWVDb250ZXh0ID0gQ29udGV4dD4oKTogVCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBsb2NhbGU6IFwiXCIsXG4gICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgIHNlc3Npb246IG51bGwsXG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9zdG9yYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgc3RvcmFnZSBjb25maWcuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGNhY2hlIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfd29ya2Zsb3dzOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLl93b3JrZmxvd3MgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93cztcbiAgfVxuXG4gIHByaXZhdGUgX2F1dGg6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHwgbnVsbCA9IG51bGw7XG4gIGdldCBhdXRoKCk6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICBwcml2YXRlIF9kZXZWaXRlc3RNYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcjtcbiAgfVxuICBzZXQgZGV2Vml0ZXN0TWFuYWdlcihtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCkge1xuICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIF93ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbCA9IG51bGw7XG4gIC8vIOqwmeydgCBGYXN0aWZ5IOyduOyKpO2EtOyKpOyXkCBAZmFzdGlmeS93ZWJzb2NrZXTsnYQg7KSR67O1IOuTseuhne2VmOuKlCDqsoPsnYQgV2Vha1NldOycvOuhnCDssKjri6jtlahcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzID0gbmV3IFdlYWtTZXQ8XG4gICAgRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT5cbiAgPigpO1xuICBnZXQgd2Vic29ja2V0UnVudGltZSgpOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgICBpZiAoIXRoaXMuX3dlYnNvY2tldFJ1bnRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBydW50aW1lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93ZWJzb2NrZXRSdW50aW1lO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy5fd2Vic29ja2V0UnVudGltZSA9IHJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kYlwiKTtcbiAgICBjb25zdCB7IGlzTG9jYWw6IGlzTG9jYWxFbnZpcm9ubWVudCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBlbnZpcm9ubWVudFNuYXBzaG90cyA9IGlzTG9jYWxFbnZpcm9ubWVudCgpXG4gICAgICA/IHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyh0aGlzLmFwaVJvb3RQYXRoLCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgREIuc2V0Q29uZmlnKHRoaXMuZGJDb25maWcpO1xuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIEJldHRlckF1dGgg7LSI6riw7ZmUXG4gICAgY29uc3QgYXV0aENvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZlci5hdXRoO1xuICAgIGlmIChhdXRoQ29uZmlnKSB7XG4gICAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgICAgY29uc3QgbWVyZ2VkRmllbGRNYXBwaW5ncyA9IG1lcmdlKEJBU0VfRklFTERfTUFQUElOR1MsIGF1dGhDb25maWcpO1xuXG4gICAgICAvLyBiZXR0ZXItYXV0aCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgICAgY29uc3QgeyBzb25hbXVLbmV4QWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXV0aC9rbmV4LWFkYXB0ZXJcIik7XG5cbiAgICAgIGNvbnN0IGF1dGhPcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyA9IHtcbiAgICAgICAgZGF0YWJhc2U6IHNvbmFtdUtuZXhBZGFwdGVyKCksXG4gICAgICAgIC4uLm1lcmdlZEZpZWxkTWFwcGluZ3MsXG4gICAgICB9O1xuICAgICAgdGhpcy5fYXV0aCA9IGJldHRlckF1dGgoYXV0aE9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTc3JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0LCBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLl9pbml0RWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gaW5pdFN0YXJ0O1xuICAgIHRoaXMuX2NvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEVsYXBzZWQgPSAwO1xuICBwcml2YXRlIF9jb25maWdFbGFwc2VkID0gMDtcblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUgPSBuZXcgV2ViU29ja2V0UnVudGltZShvcHRpb25zLndlYnNvY2tldCk7XG5cbiAgICAvLyBTdG9yYWdlIOyEpOyglSDihpIgU3RvcmFnZU1hbmFnZXIg7IOd7ISxXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgY29uc3QgeyBTdG9yYWdlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9zdG9yYWdlID0gbmV3IFN0b3JhZ2VNYW5hZ2VyKG9wdGlvbnMuc3RvcmFnZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSM65+s6re47J24IOuTseuhnVxuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJQbHVnaW5zKHNlcnZlciwgb3B0aW9ucy5wbHVnaW5zKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hdXRoKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyQmV0dGVyQXV0aChzZXJ2ZXIsIG9wdGlvbnMuYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOudvOyasO2MhSDshKTsoJVcbiAgICBhd2FpdCB0aGlzLndpdGhGYXN0aWZ5KHNlcnZlciwgb3B0aW9ucy5hcGlDb25maWcsIHtcbiAgICAgIGVuYWJsZVN5bmM6IGluaXRPcHRpb25zPy5lbmFibGVTeW5jLFxuICAgICAgZG9TaWxlbnQ6IGluaXRPcHRpb25zPy5kb1NpbGVudCxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsi5zsnpFcbiAgICBhd2FpdCB0aGlzLmJvb3Qoc2VydmVyLCBvcHRpb25zKTtcblxuICAgIGlmICghaW5pdE9wdGlvbnM/LmRvU2lsZW50KSB7XG4gICAgICB0aGlzLnByaW50U3RhcnR1cFN1bW1hcnkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgYXN5bmMgd2l0aEZhc3RpZnkoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGVuYWJsZVN5bmM/OiBib29sZWFuO1xuICAgICAgZG9TaWxlbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQob3B0aW9ucz8uZG9TaWxlbnQsIG9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIHRoaXMud2Vic29ja2V0UnVudGltZSA/Pz0gbmV3IFdlYlNvY2tldFJ1bnRpbWUodGhpcy5jb25maWcuc2VydmVyLndlYnNvY2tldCk7XG5cbiAgICAvLyB0aW1lem9uZSDshKTsoJVcbiAgICBjb25zdCB0aW1lem9uZSA9IHRoaXMuY29uZmlnLmFwaS50aW1lem9uZTtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIC8vIO2DgOyehOyhtOyXkCDrp57qsowg7J2R64u1IOuCoOynnCDsiqTtirjrp4HsnYQg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOqwgOuguSB0aW1lem9uZeydtCBcIkFzaWEvU2VvdWxcIiDsnbTrqbRcbiAgICAgIC8vIFwiMjAyNS0xMS0yMVQwMDowMDowMC4wMDBaXCIg66W8IFwiMjAyNS0xMS0yMVQwOTowMDowMCswOTowMFwiIOycvOuhnCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgY29uc3QgeyBmb3JtYXRJblRpbWVab25lIH0gPSBhd2FpdCBpbXBvcnQoXCJkYXRlLWZucy10elwiKTtcblxuICAgICAgLy8gSVNPIDg2MDEg64Kg7KecIO2YleyLnSDsoJXqt5zsi50gKOyYiDogMjAyNC0wMS0xNVQwOTozMDowMC4wMDBaKVxuICAgICAgY29uc3QgSVNPX0RBVEVfUkVHRVggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KFxcLlxcZHszfSk/WiQvO1xuXG4gICAgICAvLyBU66W8IOuRmOufrOyLvCDsnpHsnYDrlLDsmLTtkZzqsIAg7JeG64uk66m0IFwiMjAyNS0xMS0xOTE3NjM1NDYxODkwMDAxODo1NjoyOSswOTowMFwi7JmAIOqwmeydgCDqsrDqs7zqsIAg64KY7Ji164uI64ukLlxuICAgICAgLy8g7J2064qUIGRhdGUtZm5zIO2KueyeheuLiOuLpC5cbiAgICAgIC8vIOydtOugh+qyjCDtlbTrj4Qg6rSc7LCu7Iq164uI64ukLiBcIjIwMjUtMTEtMTlUMTg6NTY6MjkrMDk6MDBcIiDrqqjslpHsnLzroZwg7J6YIOuCmOyYteuLiOuLpC5cbiAgICAgIGNvbnN0IERBVEVfRk9STUFUID0gXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NYWFhcIjtcblxuICAgICAgc2VydmVyLnNldFJlcGx5U2VyaWFsaXplcigocGF5bG9hZCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgdGltZXpvbmUgYXMgYCR7c3RyaW5nfS8ke3N0cmluZ31gLFxuICAgICAgICAgICAgICBEQVRFX0ZPUk1BVCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC8vIFRpbWV6b25lIOuhnOq3uOuKlCBwcmludFN0YXJ0dXBTdW1tYXJ57JeQ7IScIO2Gte2VqSDstpzroKVcbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8gRGV2UnVubmVyIO2FjOyKpO2KuCDsl5Trk5ztj6zsnbjtirggKOuhnOy7rCDtmZjqsr0gKyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnClcbiAgICBpZiAoaXNMb2NhbCgpICYmIHRoaXMuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgICAgY29uc3QgeyByZWdpc3RlckRldlRlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rlc3RpbmcvZGV2LXRlc3Qtcm91dGVzXCIpO1xuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKHNlcnZlciwgdGhpcy5jb25maWcudGVzdC5kZXZSdW5uZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4odGhpcy5hcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gICAgY29uc3QgaGFzV2ViID0gYXdhaXQgZXhpc3RzKHdlYlBhdGgpO1xuXG4gICAgLy8g7KCE7JetIGNvbXByZXNzIOyYteyFmCDqs4TsgrAgKHJvdXRlLmNvbXByZXNzOiB0cnVl7J28IOuVjCDsgqzsmqkpXG4gICAgY29uc3QgcGx1Z2luQ29tcHJlc3MgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uY29tcHJlc3M7XG4gICAgY29uc3QgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQgPSBwbHVnaW5Db21wcmVzc1xuICAgICAgPyBwbHVnaW5Db21wcmVzcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdGhyZXNob2xkOiAxMDI0LCBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRocmVzaG9sZDogcGx1Z2luQ29tcHJlc3MudGhyZXNob2xkLFxuICAgICAgICAgICAgZW5jb2RpbmdzOiBwbHVnaW5Db21wcmVzcy5lbmNvZGluZ3MsXG4gICAgICAgICAgICBjdXN0b21UeXBlczogcGx1Z2luQ29tcHJlc3MuY3VzdG9tVHlwZXMsXG4gICAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6wg6rCc67CcIO2ZmOqyvTogY2F0Y2gtYWxs66GcIEFQSeulvCDrj5nsoIEg66ek7Lmt7ZWY7JesIEhNUuydhCDsp4Dsm5Dtlanri4jri6QuXG4gICAgICAvLyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQj15ZXProZwg7ISk7KCV7ZWY66m0IGRldl9hcGkg66qo65Oc7JeQ7IScIFZpdGUg7Ya17ZWp7J2EIOu5hO2ZnOyEse2ZlO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgY29uc3QgZGlzYWJsZUludGVncmF0ZWRXZWIgPSBwcm9jZXNzLmVudi5TT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiA9PT0gXCJ5ZXNcIjtcbiAgICAgIGlmIChoYXNXZWIgJiYgIWRpc2FibGVJbnRlZ3JhdGVkV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldHVwRGV2U2VydmVyKHNlcnZlciwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvTog6rCc67OEIEFQSSDrnbzsmrDtirggKyDsoJXsoIEg7YyM7J28IOyEnOu5mVxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAd2Vic29ja2V0IHJvdXRl64qUIHdzSGFuZGxlcuuhnCDrk7HroZ3tlZjqs6AsIOqwmeydgCBwYXRo7J2YIOydvOuwmCBIVFRQIEdFVOydgCA0MjYg7J2R64u17Jy866GcIHVwZ3JhZGXrpbwg6rCV7KCc7ZWoXG4gICAgICAgIGlmIChhcGkud2Vic29ja2V0T3B0aW9ucykge1xuICAgICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpLFxuICAgICAgICAgICAgd3NIYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldEhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIixcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihhcGkub3B0aW9ucy5jb21wcmVzcywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2UhOuhnOuNleyFmOyXkOyEnOuKlCB3ZWIg7IaM7IqkKGFwcFJvb3Qvd2ViKSDsnKDrrLTsmYAg66y06rSA7ZWY6rKMLFxuICAgICAgLy8gYXBpL3dlYi1kaXN0IOyhtOyerCDsl6zrtoDrpbwgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIg64K067aA7JeQ7IScIO2MkOuLqO2VqeuLiOuLpC5cbiAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoc2VydmVyLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRldiDrqqjrk5wg6rO17Ya1OiBjYXRjaC1hbGzsl5DshJwgc3luY2VyLmFwaXPrpbwg64+Z7KCB7Jy866GcIO2DkOyDie2VmOyXrCBBUEkg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICog66ekIOyalOyyreuniOuLpCBzeW5jZXIuYXBpc+ulvCDsobDtmoztlZjripQg7J20IOuwqeyLneydhCDsgqzsmqntlanri4jri6QuXG4gICAqXG4gICAqIOyalOyyreydtCAvYXBpKOygle2Zle2eiOuKlCB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KeuhnCDsi5zsnpHtlZjsp4Ag7JWK64qUIOqyveyasOudvOuptCBudWxs7J2EIOuwmO2ZmO2VmOupsCDrgZ3rg4Xri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURldkFwaVJlcXVlc3QoXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAoKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+KSB8IG51bGwge1xuICAgIGNvbnN0IG1hdGNoZWRBcGkgPSB0aGlzLmZpbmRNYXRjaGVkQXBpKHJlcXVlc3QpO1xuXG4gICAgaWYgKCFtYXRjaGVkQXBpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIC8vIHdlYnNvY2tldCByb3V0ZeulvCDsnbzrsJggSFRUUOuhnCDsp4HsoJEg7Zi47Lac7ZWcIOqyveyasCA0MjbsnYQg64+M66Ck7KSYIHVwZ3JhZGUg7JeG7J20IOygkeq3vO2VmOuKlCDqsoPsnYQg7LCo64uo7ZWoXG4gICAgaWYgKG1hdGNoZWRBcGkud2Vic29ja2V0T3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1hdGNoZWRBcGkocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QpOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCBzeW5jZXIuYXBpc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSBhd2FpdCBmcy5yZWFkRmlsZShcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnZpdGVTZXJ2ZXIuY29uZmlnLnJvb3QsIFwiaW5kZXguaHRtbFwiKSxcbiAgICAgICAgICAgIFwidXRmLThcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy52aXRlU2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbCh1cmwsIHRlbXBsYXRlKTtcblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZSBhcyBFcnJvcik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICByZXR1cm4gKGUgYXMgRXJyb3IpLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7KKF66OMIOyLnCBWaXRl64+EIOyiheujjFxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGlmIChcInBvcnRcIiBpbiBobXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oXG4gICAgICAgICAgYOKckyBWaXRlIEhNUiB1c2luZyBkZWRpY2F0ZWQgd2Vic29ja2V0IHBvcnQgJHtobXIucG9ydH0gdG8gYXZvaWQgRmFzdGlmeSB3ZWJzb2NrZXQgY29uZmxpY3RzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDqsr3roZwg66qF7ZmV7ZmUOiBhcGkvd2ViLWRpc3QvY2xpZW50ICjsoJXsoIEg7YyM7J28KSwgYXBpL3dlYi1kaXN0L3NlcnZlciAoU1NSIGVudHJ5KSwgYXBpL2Rpc3Qvc3NyIChTU1Igcm91dGVzIC0gQVBJIOyGjOycoClcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcInNlcnZlclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJkaXN0XCIsIFwic3NyXCIsIFwicm91dGVzLmpzXCIpO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYkRpc3RQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFdlYiBkaXN0IG5vdCBmb3VuZDogJHt3ZWJEaXN0UGF0aH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTU1IgZW50cnkg7KG07J6sIOyXrOu2gCDtmZXsnbhcbiAgICBjb25zdCBzc3JBdmFpbGFibGUgPSBhd2FpdCBleGlzdHMoc3NyRW50cnlQYXRoKTtcblxuICAgIGlmICghc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1IgZW50cnkgbm90IGZvdW5kOiAke3NzckVudHJ5UGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybihcIiAgU1NSIHdpbGwgYmUgZGlzYWJsZWQuIE9ubHkgQ1NSIHdpbGwgd29yay5cIik7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDroZzrk5wgKHByb2R1Y3Rpb27sl5DshJzrp4wsIOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggc3NyL3JvdXRlcy50cylcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKHNzclJvdXRlc1BhdGgpKSB7XG4gICAgICAgIC8vIHRzLWxvYWRlcuudvOuptCBcImZpbGU6Ly9cIuuhnCDsi5zsnpHtlZjripQgZnVsbHktcmVzb2x2ZWQgcGF0aOunjCDrsJvquLDsl5Ag7J2066W8IOyymOumrO2VtOyjvOuKlCBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VtOyVvCDtlojqsqDsp4Drp4wsXG4gICAgICAgIC8vIOyXrOq4sOuKlCDtlITroZzrjZXshZgg7ZmY6rK97JeQ7IScIGxvYWRlciDsl4bsnbQg64+M7JWE6rCA6riwIOuVjOusuOyXkCBcIuynhOynnCBqcyDtjIzsnbxcIuydmCBcIuq3uOuDpVwiIOygiOuMgOqyveuhnOulvCDrsJTroZwgaW1wb3J07ZW064+EIOuQqeuLiOuLpC5cbiAgICAgICAgLy8g7J20IOuCtOyaqeydgCDsnbQg7ZWo7IiYIOuCtOyXkOyEnCDslYTrnpjsl5Ag64KY7JisIOuLpOuluCBpbXBvcnQg7Zi47Lac7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgICAgIGF3YWl0IGltcG9ydChzc3JSb3V0ZXNQYXRoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLinJMgU1NSIHJvdXRlcyBsb2FkZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1Igcm91dGVzIG5vdCBmb3VuZDogJHtzc3JSb3V0ZXNQYXRofWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOuhpOungSDsl4XrjbDsnbTtirgg64yA7J2ROiBhc3NldCBoYXNoIOu2iOydvOy5mCDsi5wg7ZiE7J6sIOuyhOyghCDsp4HsoJEg7ISc67mZXG4gICAgc2VydmVyLmdldChcIi9hc3NldHMvOmZpbGVuYW1lXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkRmlsZSA9IChyZXF1ZXN0LnBhcmFtcyBhcyB7IGZpbGVuYW1lOiBzdHJpbmcgfSkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgICAgLy8gQ29udGV4dCDsg53shLFcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBndWFyZHMg7LKY66asXG4gICAgICAgIHJ1bkd1YXJkcyh7XG4gICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYXBpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgICAgIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpKGFwaSwgdGhpcy5zeW5jZXIudHlwZXMpO1xuXG4gICAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICAgIGNvbnN0IHdoaWNoID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIiA/IFwicXVlcnlcIiA6IFwiYm9keVwiO1xuICAgICAgICBsZXQgcmVxQm9keToge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIC8vIO2MjOydvCDsl4XroZzrk5wg7J6I64qUIOqyveyasCDsnoTsi5wg642w7J207YSwXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogQnVmZmVyZWRGaWxlW107XG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKHJlcXVlc3Rbd2hpY2hdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJidWZmZXJcIiB8fCAhYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSkge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIg66qo65OcOiDrqZTrqqjrpqzsl5Ag66Gc65OcXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFydC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgZmlsZXMuYnVmZmVyZWRGaWxlcy5wdXNoKG5ldyBCdWZmZXJlZEZpbGUocGFydCwgYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0g66qo65OcOiDsponsi5wg7KCA7J6l7IaM66GcIOyKpO2KuOumrOuwjVxuICAgICAgICAgICAgICBjb25zdCBkaXNrTmFtZSA9IGFwaS51cGxvYWRPcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBkaXNrID0gdGhpcy5zdG9yYWdlLnVzZShkaXNrTmFtZSk7XG5cbiAgICAgICAgICAgICAgLy8g7Jqw7ISg7Iic7JyEOiDrjbDsvZTroIjsnbTthLAgPiDsoITsl60g7ISk7KCVID4g6riw67O46rCSXG4gICAgICAgICAgICAgIGNvbnN0IGtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yID1cbiAgICAgICAgICAgICAgICBhcGkudXBsb2FkT3B0aW9ucy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXIuc3RvcmFnZT8ua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgZGVmYXVsdEtleUdlbmVyYXRvcjtcblxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQga2V5R2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2sucHV0U3RyZWFtKGtleSwgcGFydC5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGRpc2suZ2V0VXJsKGtleSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICBmaWxlcy51cGxvYWRlZEZpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVcGxvYWRlZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHBhcnQuZmlsZS5ieXRlc1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgZGlza05hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBxc+uhnCDspJHssqkg6rWs7KGwIO2MjOyLsTogcGFyYW1zW2NhdGVnb3J5XSDihpIgeyBwYXJhbXM6IHsgY2F0ZWdvcnk6IFwidGVzdFwiIH0gfVxuICAgICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgcGFyc2VkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgICAgIHJlcUJvZHkgPSBmYXN0aWZ5Q2FzdGVyKFJlcVR5cGUpLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZywge1xuICAgICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBhcGlDYWNoZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7J28IOuNsOydtO2EsOulvCBDb250ZXh07JeQIOy2lOqwgFxuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25zdW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA/PyBcImJ1ZmZlclwiO1xuICAgICAgICAgIGlmIChjb25zdW1lID09PSBcImJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlcmVkRmlsZXMgPSBmaWxlcy5idWZmZXJlZEZpbGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgY29udGV4dC51cGxvYWRlZEZpbGVzID0gZmlsZXMudXBsb2FkZWRGaWxlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gV1MgcGF0aOulvCDsnbzrsJggSFRUUCBHRVTsnLzroZwg7Zi47Lac7ZWcIOqyveyasCA0MjYgKyBVcGdyYWRlIO2XpOuNlOuhnCDrqoXsi5zsoIHsnLzroZwgd2Vic29ja2V0IOygkeyGjeydhCDsnKDrj4TtlahcbiAgcHJpdmF0ZSBjcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCkge1xuICAgIHJldHVybiBhc3luYyAoX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICByZXBseS5oZWFkZXIoXCJjb25uZWN0aW9uXCIsIFwiVXBncmFkZVwiKS5oZWFkZXIoXCJ1cGdyYWRlXCIsIFwid2Vic29ja2V0XCIpLnN0YXR1cyg0MjYpLnNlbmQoe1xuICAgICAgICBtZXNzYWdlOiBcIldlYlNvY2tldCB1cGdyYWRlIHJlcXVpcmVkXCIsXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gZGV2IOuqqOuTnOydmCBjYXRjaC1hbGwgd3NIYW5kbGVy7JeQ7IScIOyLpOygnCBXUyBBUEnroZwg65SU7Iqk7Yyo7LmY7ZWoLiDrp6Tsua3rkJjripQgcm91dGXqsIAg7JeG7Jy866m0IDEwMDjroZwg64ur7J2MXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2V2ViU29ja2V0UmVxdWVzdChcbiAgICBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hdGNoZWRBcGkgPSB0aGlzLmZpbmRNYXRjaGVkQXBpKHJlcXVlc3QpO1xuICAgIGlmICghbWF0Y2hlZEFwaT8ud2Vic29ja2V0T3B0aW9ucykge1xuICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZWFzb246IFwicm91dGVOb3RGb3VuZFwiLFxuICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgICB9LFxuICAgICAgICB0cmFjZUlkOiB0cmFjZUNvbnRleHQudHJhY2VJZCxcbiAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgIHNhbXBsZWQ6IHRyYWNlQ29udGV4dC5zYW1wbGVkLFxuICAgICAgfSk7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwOCwgXCJXZWJTb2NrZXQgcm91dGUgbm90IGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmNyZWF0ZVdlYlNvY2tldEhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgICBhd2FpdCBoYW5kbGVyKHsgc29ja2V0IH0sIHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gV1Mgcm91dGUg7ZW465Ok65+s7J2YIOyLpO2WiSDsiJzshJzrpbwg6rOg7KCV7ZWoOlxuICAvLyAxKSBndWFyZOulvCBjb25uZWN0aW9uIOuTseuhnSDsnbTsoITsl5Ag64+M66CkIOyduOymnSDsi6TtjKgg7IucIOu2gOu2hCDrk7HroZ0g7IOB7YOc66W8IOuCqOq4sOyngCDslYrsnYxcbiAgLy8gMikgcXVlcnkgcGFyYW0g7YyM7Iux64+EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDMpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWY6rOgLCBjb250ZXh0IOykgOu5hOqwgCDrgZ3rgpwg65KkIGBhY3RpdmF0ZSgpYO2VtCDruIzroZzrk5zsupDsiqTtirjqsIAg7LSI6riw7ZmUIOykkeqwhCDsg4Htg5zrpbwg67O07KeAIOuqu+2VmOqyjCDtlahcbiAgLy8g7JeQ65+sIOuwnOyDnSDsi5zsl5DripQgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvciDsoJXssYXsl5Ag65Sw6528IGNsb3NlIGNvZGXrpbwg66ek7ZWR7ZWoXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dCB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHJhd1dzOiBSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+IHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgcHJlUmVnaXN0ZXJQaGFzZTogXCJndWFyZFwiIHwgXCJxdWVyeVwiIHwgXCJyZWdpc3RlclwiIHwgXCJoYW5kbGVyXCIgPSBcImd1YXJkXCI7XG4gICAgICBsZXQgdHJhY2VDb250ZXh0OiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHt9O1xuXG4gICAgICB0cnkge1xuICAgICAgICB0cmFjZUNvbnRleHQgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5jcmVhdGVDb25uZWN0aW9uQ29udGV4dCh7XG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmVSZWdpc3RlclBoYXNlID0gXCJxdWVyeVwiO1xuICAgICAgICBjb25zdCByZXFCb2R5ID0gYXdhaXQgdGhpcy5wYXJzZVdlYlNvY2tldFJlcXVlc3RQYXJhbXMoYXBpLCByZXF1ZXN0KTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicmVnaXN0ZXJcIjtcbiAgICAgICAgcmF3V3MgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIG91dEV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLm91dEV2ZW50cyxcbiAgICAgICAgICBpbkV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLmluRXZlbnRzLFxuICAgICAgICAgIG5hbWVzcGFjZTogYXBpLndlYnNvY2tldE9wdGlvbnMhLm5hbWVzcGFjZSxcbiAgICAgICAgICBoZWFydGJlYXQ6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5oZWFydGJlYXQsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICB0cmFjZUlkOiB0cmFjZUNvbnRleHQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgIHNhbXBsZWQ6IHRyYWNlQ29udGV4dC5zYW1wbGVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY29wZWRXcyA9IHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbihyYXdXcywgKCkgPT4gd3NDb250ZXh0KTtcbiAgICAgICAgd3NDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXZWJTb2NrZXRDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgc2NvcGVkV3MpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dDogd3NDb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgYXBpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUuYWN0aXZhdGVDb25uZWN0aW9uKHJhd1dzLmlkKTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwiaGFuZGxlclwiO1xuXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdzQ29udGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiB3c0NvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjbG9zZURlc2NyaXB0b3IgPSByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFyYXdXcykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgICAgICBsZXZlbDogY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIiA/IFwid2FyblwiIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlYXNvbjogcHJlUmVnaXN0ZXJQaGFzZSxcbiAgICAgICAgICAgICAgY29kZTogY2xvc2VEZXNjcmlwdG9yLmNvZGUsXG4gICAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHRyYWNlQ29udGV4dC50cmFjZUlkLFxuICAgICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgICAgc2FtcGxlZDogdHJhY2VDb250ZXh0LnNhbXBsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFxuICAgIFRPdXQgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgPihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLl93ZWJzb2NrZXRSdW50aW1lPy50ZWxlbWV0cnlDb250cm9sbGVyO1xuICAgIGNvbnN0IHJ1bkluQ29udGV4dCA9IDxUPihjYWxsYmFjazogKCkgPT4gVCk6IFQgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoKTtcbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5pZDtcbiAgICAgIH0sXG4gICAgICBnZXQgbmFtZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gd3MubmFtZXNwYWNlO1xuICAgICAgfSxcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5jbG9zZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IHVzZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLnVzZXJJZDtcbiAgICAgIH0sXG4gICAgICB0cmFuc3BvcnQ6IFwid3NcIixcbiAgICAgIHB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHdzLnB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZShjb2RlLCByZWFzb24pIHtcbiAgICAgICAgd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgIH0sXG4gICAgICBvbkNsb3NlKGNhbGxiYWNrKSB7XG4gICAgICAgIHdzLm9uQ2xvc2UoKCkgPT4gcnVuSW5Db250ZXh0KGNhbGxiYWNrKSk7XG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIHdzLm9uTWVzc2FnZShldmVudCwgKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpID0+XG4gICAgICAgICAgcnVuSW5Db250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IFN0cmluZyhldmVudCk7XG4gICAgICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBtZXNzYWdlVHJhY2VDb250ZXh0ID8/IGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQod3MpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuc3RhcnRlZFwiLFxuICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpO1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5jb21wbGV0ZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ1bnNldFwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLmZhaWxlZFwiLFxuICAgICAgICAgICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LnJlY29yZFNwYW4oe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MubWVzc2FnZS5wcm9jZXNzXCIsXG4gICAgICAgICAgICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoKHJlcXVlc3QucXVlcnkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdTIOqyveuhnOyXkOyEnOuKlCBIVFRQIHJlcGx56rCAIOyXhuycvOuvgOuhnCByZXBseeulvCBvcHRpb25hbOuhnCDrsJvslYQg6rO17Ya1IO2YuOy2nCDqsr3roZzrpbwg7Jyg7KeA7ZWoXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5PzogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5fYXV0aD8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBXZWJTb2NrZXRDb250ZXh0W1wid3NcIl0sXG4gICk6IFByb21pc2U8V2ViU29ja2V0Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gPFQgZXh0ZW5kcyBab2RPYmplY3Q+KF9ldmVudHM6IFQpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgICAgICk7XG4gICAgfTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBkZWZhdWx0Q29udGV4dC5uYWl0ZVN0b3JlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB1c2VyOiBkZWZhdWx0Q29udGV4dC51c2VyLFxuICAgICAgICAgIHNlc3Npb246IGRlZmF1bHRDb250ZXh0LnNlc3Npb24sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcGx5U3R1YixcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zcG9ydDogX3RyYW5zcG9ydCxcbiAgICAgIHJlcGx5OiBfcmVwbHksXG4gICAgICBjcmVhdGVTU0U6IF9jcmVhdGVTU0UsXG4gICAgICBidWZmZXJlZEZpbGVzOiBfYnVmZmVyZWRGaWxlcyxcbiAgICAgIHVwbG9hZGVkRmlsZXM6IF91cGxvYWRlZEZpbGVzLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBodHRwTGlrZUNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoZXIg66qo65OI7J2AIGZpbGUtcGF0dGVybnMg4oaSIFNvbmFtdSDsiJztmZjsnYQg7ZS87ZWY6riwIOychO2VtCBkeW5hbWljIGltcG9ydCDtlanri4jri6QuXG4gICAgY29uc3QgeyBzZXR1cFdhdGNoZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci93YXRjaGVyXCIpO1xuICAgIHRoaXMud2F0Y2hlciA9IGF3YWl0IHNldHVwV2F0Y2hlcigoZmlsZUV2ZW50cykgPT4gdGhpcy5ydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgMTAwbXMgYmF0Y2jroZwg66qo7J2AIGZpbGVFdmVudHMg7ZWY64KY7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqIGJhdGNoIO2BkOyeiSDrjZXsl5Ag7ZWcIOyLnOygkOyXkCDtlZjrgpjrp4wg7Iuk7ZaJ65Co7J20IOuztOyepeuQqeuLiOuLpCAoZXZlbnQtYmF0Y2hlcuqwgCDsp4HroKztmZQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcbiAgICB9XG5cbiAgICAvLyDrs7jssrQ6IOuzgOqyvSDtnaHsiJggKyDssrTtgazshKwg6rCx7IugLlxuICAgIGF3YWl0IHRoaXMuc3luY2VyLmhtckFuZFN5bmMoZmlsZUV2ZW50cyk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLlxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMud3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViU29ja2V0UGx1Z2luKHNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEBmYXN0aWZ5L3dlYnNvY2tldOydgCBwbHVnaW5zLndz6rCAIOyEpOygleuQnCDqsr3smrDsl5Drp4wg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgc2VydmVy7JeQIOykkeuztSDrk7HroZ3rkJjsp4Ag7JWK64+E66GdIFdlYWtTZXTsnLzroZwg6riw66Gd7ZWoXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViU29ja2V0UGx1Z2luKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuaGFzKHNlcnZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5PcHRpb24gPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3M7XG4gICAgaWYgKCFwbHVnaW5PcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJzb2NrZXRQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvd2Vic29ja2V0XCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IHJlc29sdmVkUGx1Z2luT3B0aW9ucyA9IHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgICAgIHJhd1BsdWdpbk9wdGlvbjogcGx1Z2luT3B0aW9uLFxuICAgIH0pO1xuICAgIGlmIChyZXNvbHZlZFBsdWdpbk9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4sIHJlc29sdmVkUGx1Z2luT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4pO1xuICAgIH1cblxuICAgIHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5hZGQoc2VydmVyKTtcbiAgICB0aGlzLndhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoc2VydmVyKTtcbiAgfVxuXG4gIC8vIGhlYXJ0YmVhdCBpbnRlcnZhbOydtCBGYXN0aWZ5IGtlZXBBbGl2ZVRpbWVvdXQg7J207IOB7J2066m0IOyduO2UhOudvOqwgCDrqLzsoIAgaWRsZSDsl7DqsrDsnYQg64GK7J2EIOyImCDsnojslrQg6rK96rOg66eMIOuCqOq4sOqzoCDrhJjslrTqsJBcbiAgcHJpdmF0ZSB3YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhlYXJ0YmVhdHMgPSB0aGlzLnN5bmNlci5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zPy5oZWFydGJlYXQgPz8gMzAwMDApXG4gICAgICAuZmlsdGVyKChoZWFydGJlYXQpID0+IGhlYXJ0YmVhdCA+IDApO1xuXG4gICAgaWYgKGhlYXJ0YmVhdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMuY29uZmlnLnNlcnZlci5mYXN0aWZ5Py5rZWVwQWxpdmVUaW1lb3V0O1xuICAgIGlmICgha2VlcEFsaXZlVGltZW91dCB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYXJnZXN0SGVhcnRiZWF0ID0gTWF0aC5tYXgoLi4uaGVhcnRiZWF0cyk7XG4gICAgaWYgKGxhcmdlc3RIZWFydGJlYXQgPj0ga2VlcEFsaXZlVGltZW91dCkge1xuICAgICAgc2VydmVyLmxvZy53YXJuKFxuICAgICAgICB7XG4gICAgICAgICAga2VlcEFsaXZlVGltZW91dCxcbiAgICAgICAgICBsYXJnZXN0SGVhcnRiZWF0LFxuICAgICAgICB9LFxuICAgICAgICBcIldlYlNvY2tldCBoZWFydGJlYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGtlZXBBbGl2ZVRpbWVvdXQ7IGFsaWduIGluZnJhc3RydWN0dXJlIGlkbGUgdGltZW91dHMgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXNjb25uZWN0cy5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDrnbzsmrDtirgg65Ox66GdXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiUE9TVFwiXSxcbiAgICAgIHVybDogYCR7YmFzZVBhdGh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmhhbmRsZXIoXG4gICAgICAgICAgY3JlYXRlQmV0dGVyQXV0aFJlcXVlc3QocmVxdWVzdCwgb3B0aW9ucy5hZHZhbmNlZD8uaXBBZGRyZXNzPy5pcEFkZHJlc3NIZWFkZXJzKSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXBseS5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcGx5LmhlYWRlcihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKHJlc3BvbnNlLmJvZHkgPyBhd2FpdCByZXNwb25zZS50ZXh0KCkgOiBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByaW50U3RhcnR1cFN1bW1hcnkoKSB7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgYWN0aXZlUHJlc2V0ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcblxuICAgIGNvbnN0IGRpbSA9IChtc2c6IHN0cmluZykgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGDinJMgJHttc2d9YCkpO1xuICAgIGNvbnN0IGdyZWVuID0gKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTICR7bXNnfWApKTtcblxuICAgIGRpbShgQ29uZmlnIGxvYWRlZCR7Zm9ybWF0VGltZSh0aGlzLl9jb25maWdFbGFwc2VkKX1gKTtcblxuICAgIC8vIERCIHByZXNldCDrqqnroZ1cbiAgICBncmVlbihcIkRCXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBwcmVzZXROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuZGJDb25maWcpIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCguLi5wcmVzZXROYW1lcy5tYXAoKG4pID0+IG4ubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHByZXNldE5hbWVzKSB7XG4gICAgICBjb25zdCBjb25uID0gdGhpcy5kYkNvbmZpZ1tuYW1lXS5jb25uZWN0aW9uIGFzXG4gICAgICAgIHwgeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBkYXRhYmFzZT86IHN0cmluZyB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgZGltKGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIGRpbShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBncmVlbihgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuX2luaXRFbGFwc2VkKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNhY2hlKGNvbmZpZzogQ2FjaGVDb25maWcgfCB1bmRlZmluZWQsIGZvclRlc3Rpbmc6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHNldENhY2hlTWFuYWdlclJlZiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvZGVjb3JhdG9yXCIpO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnCDrqZTrqqjrpqwg65Oc65287J2067KEIOyekOuPmSDsgqzsmqlcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgY29uc3QgeyBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnKTtcbiAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIFdlYlNvY2tldCBzaHV0ZG93biBmaXJzdCB0byBmbHVzaCB0ZWxlbWV0cnlcbiAgICBpZiAodGhpcy5fd2Vic29ja2V0UnVudGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5fd2Vic29ja2V0UnVudGltZS5zaHV0ZG93bigpO1xuICAgIH1cbiAgICB0aGlzLl93ZWJzb2NrZXRSdW50aW1lID0gbnVsbDtcbiAgICAvLyBUaGVuIHNodXQgZG93biByZW1haW5pbmcgcmVzb3VyY2VzIGluIHBhcmFsbGVsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMuX3dvcmtmbG93cz8uZGVzdHJveSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fY2FjaGU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgXSk7XG4gICAgLy8gTG9nVGFwZSBkaXNwb3NlIGFmdGVyIFdTIHNodXRkb3duIHNvIHRlbGVtZXRyeSByZWNvcmRzIGFyZSBmbHVzaGVkIGZpcnN0XG4gICAgYXdhaXQgbG9ndGFwZURpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KFxuICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+LFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKHdzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+LFxuKTogd3MgaXMgV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+ICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIFwiZ2V0VGVsZW1ldHJ5Q29udGV4dFwiIGluIHdzICYmIHR5cGVvZiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0ID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUobXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1zID49IDEwMDAgPyBgJHsobXMgLyAxMDAwKS50b0ZpeGVkKDIpfXNgIDogYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICByZXR1cm4gYCAoJHtmb3JtYXR0ZWR9KWA7XG59XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcbmZ1bmN0aW9uIGlzTG9jYWxIb3N0KGhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9DQUxfSE9TVFMuaGFzKGhvc3QpIHx8IGhvc3QuZW5kc1dpdGgoXCIubG9jYWxcIik7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZzdEQSxTQUFTLDZCQUNQLElBQ3FDO0NBQ3JDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxHQUNoQyxPQUFPLENBQUM7Q0FHVixPQUFPLEdBQUcsb0JBQW9CO0FBQ2hDO0FBRUEsU0FBUywyQkFDUCxJQUM0RjtDQUM1RixPQUFPLHlCQUF5QixNQUFNLE9BQU8sR0FBRyx3QkFBd0I7QUFDMUU7Ozs7QUFPQSxTQUFTLG9CQUFvQixNQUFzRDtDQUNqRixNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssUUFBUSxLQUFLO0NBRzdDLE9BQU8sV0FGVyxLQUFLLElBRUwsRUFBVSxHQURiLEtBQUssT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FDcEIsRUFBTyxHQUFHO0FBQzNDO0FBRUEsU0FBUyxXQUFXLElBQW9CO0NBRXRDLE9BQU8sS0FEVyxNQUFNLE1BQU8sSUFBSSxLQUFLLElBQUEsQ0FBTSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxNQUFNLEVBQUUsRUFBRSxJQUMxRDtBQUN4QjtBQUdBLFNBQVMsWUFBWSxNQUF1QjtDQUMxQyxPQUFPLFlBQVksSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLFFBQVE7QUFDeEQ7QUFHQSxTQUFTLFVBQVUsRUFDakIsUUFDQSxRQUNBLFNBQ0Es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
|