@tscircuit/eval 0.0.507 → 0.0.508

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/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // webworker/execution-context.ts
1
+ // lib/eval/execution-context.ts
2
2
  import { RootCircuit } from "@tscircuit/core";
3
3
  import * as tscircuitCore from "@tscircuit/core";
4
4
  import * as React from "react";
@@ -294,7 +294,7 @@ var getPlatformConfig = () => ({
294
294
  }
295
295
  });
296
296
 
297
- // webworker/execution-context.ts
297
+ // lib/eval/execution-context.ts
298
298
  import Debug from "debug";
299
299
  var debug = Debug("tsci:eval:execution-context");
300
300
  function createExecutionContext(webWorkerConfiguration, opts = {}) {
@@ -364,6 +364,30 @@ function normalizeFsMap(fsMap) {
364
364
  return normalizedFsMap;
365
365
  }
366
366
 
367
+ // lib/utils/dirname.ts
368
+ function dirname(path) {
369
+ if (!path) return ".";
370
+ const normalizedPath = path.replace(/\\/g, "/");
371
+ const cleanPath = normalizedPath.replace(/\/+$/, "");
372
+ if (cleanPath.indexOf("/") === -1) return ".";
373
+ return cleanPath.substring(0, cleanPath.lastIndexOf("/")) || "/";
374
+ }
375
+
376
+ // lib/utils/resolveRelativePath.ts
377
+ function resolveRelativePath(importPath, cwd) {
378
+ if (importPath.startsWith("../")) {
379
+ const parentDir = dirname(cwd);
380
+ return resolveRelativePath(importPath.slice(3), parentDir);
381
+ }
382
+ if (importPath.startsWith("./")) {
383
+ return resolveRelativePath(importPath.slice(2), cwd);
384
+ }
385
+ if (importPath.startsWith("/")) {
386
+ return importPath.slice(1);
387
+ }
388
+ return `${cwd}/${importPath}`;
389
+ }
390
+
367
391
  // lib/runner/tsconfigPaths.ts
368
392
  function getTsConfig(fsMapOrAllFilePaths) {
369
393
  if (Array.isArray(fsMapOrAllFilePaths)) return null;
@@ -483,33 +507,6 @@ function matchesTsconfigPathPattern(importPath, tsConfig) {
483
507
  return false;
484
508
  }
485
509
 
486
- // lib/runner/CircuitRunner.ts
487
- import "react";
488
-
489
- // lib/utils/dirname.ts
490
- function dirname(path) {
491
- if (!path) return ".";
492
- const normalizedPath = path.replace(/\\/g, "/");
493
- const cleanPath = normalizedPath.replace(/\/+$/, "");
494
- if (cleanPath.indexOf("/") === -1) return ".";
495
- return cleanPath.substring(0, cleanPath.lastIndexOf("/")) || "/";
496
- }
497
-
498
- // lib/utils/resolveRelativePath.ts
499
- function resolveRelativePath(importPath, cwd) {
500
- if (importPath.startsWith("../")) {
501
- const parentDir = dirname(cwd);
502
- return resolveRelativePath(importPath.slice(3), parentDir);
503
- }
504
- if (importPath.startsWith("./")) {
505
- return resolveRelativePath(importPath.slice(2), cwd);
506
- }
507
- if (importPath.startsWith("/")) {
508
- return importPath.slice(1);
509
- }
510
- return `${cwd}/${importPath}`;
511
- }
512
-
513
510
  // lib/runner/resolveFilePath.ts
514
511
  var FILE_EXTENSIONS = ["tsx", "ts", "json", "js", "jsx", "obj", "gltf", "glb"];
515
512
  var resolveFilePath = (unknownFilePath, fsMapOrAllFilePaths, cwd, opts = {}) => {
@@ -747,7 +744,7 @@ function resolveNodeModule(modulePath, fsMap, basePath) {
747
744
  return resolveNodeModuleInPath(ctx.basePath, ctx);
748
745
  }
749
746
 
750
- // webworker/eval-compiled-js.ts
747
+ // lib/eval/eval-compiled-js.ts
751
748
  function evalCompiledJs(compiledCode, preSuppliedImports, cwd) {
752
749
  ;
753
750
  globalThis.__tscircuit_require = (name) => {
@@ -796,7 +793,7 @@ function evalCompiledJs(compiledCode, preSuppliedImports, cwd) {
796
793
  return Function(functionBody).call(globalThis);
797
794
  }
798
795
 
799
- // webworker/import-local-file.ts
796
+ // lib/eval/import-local-file.ts
800
797
  import Debug2 from "debug";
801
798
 
802
799
  // lib/shared/static-asset-extensions.ts
@@ -809,7 +806,7 @@ var STATIC_ASSET_EXTENSIONS = [
809
806
  ];
810
807
  var isStaticAssetPath = (path) => STATIC_ASSET_EXTENSIONS.some((ext) => path.endsWith(ext));
811
808
 
812
- // webworker/transform-with-sucrase.ts
809
+ // lib/transpile/transform-with-sucrase.ts
813
810
  import { transform } from "sucrase";
814
811
  var TS_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".mts", ".cts"]);
815
812
  var JSX_EXTENSIONS = /* @__PURE__ */ new Set([".tsx", ".jsx", ".ts"]);
@@ -865,7 +862,7 @@ var transformWithSucrase = (code, filePath) => {
865
862
  return transformedCode;
866
863
  };
867
864
 
868
- // webworker/import-local-file.ts
865
+ // lib/eval/import-local-file.ts
869
866
  import { KicadToCircuitJsonConverter } from "kicad-to-circuit-json";
870
867
  var debug2 = Debug2("tsci:eval:import-local-file");
871
868
  var importLocalFile = async (importName, ctx, depth = 0) => {
@@ -982,7 +979,7 @@ ${cyclePath.join(
982
979
  }
983
980
  };
984
981
 
985
- // webworker/import-snippet.ts
982
+ // lib/eval/import-snippet.ts
986
983
  async function importSnippet(importName, ctx, depth = 0) {
987
984
  const { preSuppliedImports } = ctx;
988
985
  const fullSnippetName = importName.replace("@tsci/", "").replace(".", "/");
@@ -1001,413 +998,10 @@ async function importSnippet(importName, ctx, depth = 0) {
1001
998
  }
1002
999
  }
1003
1000
 
1004
- // webworker/import-node-module.ts
1005
- import Debug4 from "debug";
1006
-
1007
- // webworker/entrypoint.ts
1008
- import * as Comlink from "comlink";
1009
- import * as React2 from "react";
1010
-
1011
- // lib/runner/setupDefaultEntrypointIfNeeded.ts
1001
+ // lib/eval/import-node-module.ts
1012
1002
  import Debug3 from "debug";
1013
- var debug3 = Debug3("tsci:eval:setupDefaultEntrypointIfNeeded");
1014
- var setupDefaultEntrypointIfNeeded = (opts) => {
1015
- if (!opts.entrypoint && !opts.mainComponentPath) {
1016
- if ("index.tsx" in opts.fsMap) {
1017
- opts.mainComponentPath = "index.tsx";
1018
- } else if ("index.ts" in opts.fsMap) {
1019
- opts.mainComponentPath = "index.ts";
1020
- } else if (Object.keys(opts.fsMap).filter((k) => k.endsWith(".tsx")).length === 1) {
1021
- opts.mainComponentPath = Object.keys(opts.fsMap)[0];
1022
- } else if ("tscircuit.config.json" in opts.fsMap) {
1023
- const configContent = opts.fsMap["tscircuit.config.json"];
1024
- try {
1025
- const config = JSON.parse(configContent);
1026
- if (config.mainEntrypoint) {
1027
- opts.entrypoint = config.mainEntrypoint;
1028
- }
1029
- } catch (e) {
1030
- console.warn("Failed to parse tscircuit.config.json:", e);
1031
- }
1032
- } else {
1033
- throw new Error(
1034
- "Either entrypoint or mainComponentPath must be provided (no index file, could not infer entrypoint)"
1035
- );
1036
- }
1037
- }
1038
- if (!opts.entrypoint && opts.mainComponentPath) {
1039
- opts.entrypoint = "entrypoint.tsx";
1040
- const mainComponentCode = opts.fsMap[resolveFilePathOrThrow(opts.mainComponentPath, opts.fsMap)];
1041
- if (!mainComponentCode) {
1042
- throw new Error(
1043
- `Main component path "${opts.mainComponentPath}" not found in fsMap. Available paths: ${Object.keys(opts.fsMap).join(", ")}`
1044
- );
1045
- }
1046
- opts.fsMap[opts.entrypoint] = `
1047
- import * as UserComponents from "./${opts.mainComponentPath}";
1048
-
1049
- ${opts.mainComponentName ? `
1050
- const ComponentToRender = UserComponents["${opts.mainComponentName}"]
1051
- ` : `const ComponentToRender = UserComponents.default ||
1052
- Object.entries(UserComponents)
1053
- .filter(([name]) => !name.startsWith("use"))
1054
- .map(([_, component]) => component)[0] || (() => null);`}
1055
-
1056
- ${debug3.enabled ? `
1057
- console.log({ UserComponents })
1058
- console.log("ComponentToRender " + ComponentToRender.toString(), { ComponentToRender })
1059
- ` : ""}
1060
-
1061
- circuit.add(
1062
- <ComponentToRender ${opts.mainComponentProps ? `{...${JSON.stringify(opts.mainComponentProps, null, 2)}}` : ""} />
1063
- );
1064
- `;
1065
- }
1066
- if (!opts.name && opts.mainComponentName) {
1067
- opts.name = opts.mainComponentName;
1068
- }
1069
- };
1070
-
1071
- // lib/utils/enhance-root-circuit-error.ts
1072
- var enhanceRootCircuitHasNoChildrenError = (error, entrypoint) => {
1073
- if (error instanceof Error && entrypoint && error.message.includes("RootCircuit has no children") && !error.message.includes('"entrypoint":')) {
1074
- const entrypointMessage = entrypoint.startsWith("./") ? entrypoint.slice(2) : entrypoint;
1075
- error.message = `${error.message}. "entrypoint": "${entrypointMessage}" is set in the runner configuration, entrypoints must contain "circuit.add(...)", you might be looking to use mainComponentPath instead if your file exports a component.`;
1076
- }
1077
- return error;
1078
- };
1079
-
1080
- // webworker/fetchProxy.ts
1081
- var setupFetchProxy = () => {
1082
- const pendingRequests = /* @__PURE__ */ new Map();
1083
- let requestCounter = 0;
1084
- function fetchProxy(input, init) {
1085
- const requestId = ++requestCounter;
1086
- return new Promise((resolve, reject) => {
1087
- pendingRequests.set(requestId, { resolve, reject });
1088
- let url;
1089
- let requestInit = init ? { ...init } : {};
1090
- if (typeof input === "string" || input instanceof URL) {
1091
- url = input.toString();
1092
- } else {
1093
- url = input.url;
1094
- requestInit = {
1095
- ...requestInit,
1096
- method: input.method,
1097
- headers: (() => {
1098
- const obj = {};
1099
- input.headers.forEach((value, key) => {
1100
- obj[key] = value;
1101
- });
1102
- return obj;
1103
- })(),
1104
- body: input.bodyUsed ? void 0 : input.body
1105
- };
1106
- }
1107
- if (requestInit.headers instanceof Headers) {
1108
- const obj = {};
1109
- requestInit.headers.forEach((value, key) => {
1110
- obj[key] = value;
1111
- });
1112
- requestInit.headers = obj;
1113
- }
1114
- ;
1115
- globalThis.postMessage({
1116
- type: "worker_fetch",
1117
- requestId,
1118
- input: url,
1119
- init: requestInit
1120
- });
1121
- });
1122
- }
1123
- function handleMessage(event) {
1124
- const data = event.data;
1125
- if (!data) return;
1126
- if (data.type === "override_global_fetch") {
1127
- ;
1128
- globalThis.fetch = fetchProxy;
1129
- return;
1130
- }
1131
- if (data.type === "disable_cdn_loading") {
1132
- ;
1133
- globalThis.__DISABLE_CDN_LOADING__ = data.value;
1134
- return;
1135
- }
1136
- if (data.type === "worker_fetch_result") {
1137
- const handlers = pendingRequests.get(data.requestId);
1138
- if (!handlers) return;
1139
- pendingRequests.delete(data.requestId);
1140
- if (data.success) {
1141
- const resp = new Response(data.response.body, {
1142
- status: data.response.status,
1143
- statusText: data.response.statusText,
1144
- headers: data.response.headers
1145
- });
1146
- handlers.resolve(resp);
1147
- } else {
1148
- const err = new Error(data.error.message);
1149
- if (data.error.name) err.name = data.error.name;
1150
- if (data.error.stack) err.stack = data.error.stack;
1151
- handlers.reject(err);
1152
- }
1153
- }
1154
- }
1155
- globalThis.addEventListener("message", handleMessage);
1156
- };
1157
-
1158
- // lib/shared/obj-path.ts
1159
- function getObjectPaths(obj, prefix = "") {
1160
- const paths = [];
1161
- for (const key in obj) {
1162
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
1163
- continue;
1164
- }
1165
- const value = obj[key];
1166
- const path = prefix ? `${prefix}.${key}` : key;
1167
- if (value !== null && typeof value === "object" && !Array.isArray(value)) {
1168
- const subPaths = getObjectPaths(value, path);
1169
- paths.push(...subPaths);
1170
- } else {
1171
- paths.push(path);
1172
- }
1173
- }
1174
- return paths;
1175
- }
1176
- function getValueAtPath(obj, path) {
1177
- const keys = path.split(".");
1178
- let current = obj;
1179
- for (const key of keys) {
1180
- current = current[key];
1181
- }
1182
- return current;
1183
- }
1184
- function setValueAtPath(obj, path, value) {
1185
- const keys = path.split(".");
1186
- let current = obj;
1187
- for (let i = 0; i < keys.length; i++) {
1188
- const key = keys[i];
1189
- if (i === keys.length - 1) {
1190
- current[key] = value;
1191
- } else {
1192
- if (!Object.prototype.hasOwnProperty.call(current, key) || typeof current[key] !== "object" || current[key] === null || Array.isArray(current[key])) {
1193
- current[key] = {};
1194
- }
1195
- current = current[key];
1196
- }
1197
- }
1198
- }
1199
-
1200
- // webworker/entrypoint.ts
1201
- globalThis.React = React2;
1202
- setupFetchProxy();
1203
- globalThis.global = globalThis.global || globalThis;
1204
- var executionContext = null;
1205
- var debugNamespace;
1206
- var circuitRunnerConfiguration = {
1207
- snippetsApiBaseUrl: "https://registry-api.tscircuit.com",
1208
- cjsRegistryUrl: "https://cjs.tscircuit.com",
1209
- verbose: false,
1210
- platform: void 0,
1211
- projectConfig: void 0
1212
- };
1213
- var eventListeners = {};
1214
- function deserializeReactElement(serialized) {
1215
- if (!serialized || typeof serialized !== "object") {
1216
- return serialized;
1217
- }
1218
- if (serialized.__isSerializedReactElement) {
1219
- const props = deserializeProps(serialized.props);
1220
- return React2.createElement(serialized.type, props);
1221
- }
1222
- return serialized;
1223
- }
1224
- function deserializeProps(props) {
1225
- if (!props || typeof props !== "object") {
1226
- return props;
1227
- }
1228
- const deserialized = {};
1229
- for (const [key, value] of Object.entries(props)) {
1230
- if (key === "children") {
1231
- if (Array.isArray(value)) {
1232
- deserialized.children = value.map(deserializeReactElement);
1233
- } else {
1234
- deserialized.children = deserializeReactElement(value);
1235
- }
1236
- } else {
1237
- deserialized[key] = value;
1238
- }
1239
- }
1240
- return deserialized;
1241
- }
1242
- function bindEventListeners(circuit) {
1243
- for (const event in eventListeners) {
1244
- for (const listener of eventListeners[event]) {
1245
- circuit.on(event, listener);
1246
- }
1247
- }
1248
- }
1249
- var webWorkerApi = {
1250
- setSnippetsApiBaseUrl: async (baseUrl) => {
1251
- circuitRunnerConfiguration.snippetsApiBaseUrl = baseUrl;
1252
- },
1253
- setDisableCdnLoading: async (disable) => {
1254
- circuitRunnerConfiguration.disableCdnLoading = disable;
1255
- },
1256
- setPlatformConfig: async ($platform) => {
1257
- throw new Error(
1258
- "setPlatformConfig can't be used against the webworker directly due to comlink limitations, use setPlatformConfigProperty instead (or a wrapper)"
1259
- );
1260
- },
1261
- setPlatformConfigProperty: async (property, value) => {
1262
- if (!circuitRunnerConfiguration.platform) {
1263
- circuitRunnerConfiguration.platform = {};
1264
- }
1265
- setValueAtPath(circuitRunnerConfiguration.platform, property, value);
1266
- },
1267
- setProjectConfig: async (project) => {
1268
- throw new Error(
1269
- "setProjectConfig can't be used against the webworker directly due to comlink limitations, use setProjectConfigProperty instead (or a wrapper)"
1270
- );
1271
- },
1272
- setProjectConfigProperty: async (property, value) => {
1273
- if (!circuitRunnerConfiguration.projectConfig) {
1274
- circuitRunnerConfiguration.projectConfig = {};
1275
- }
1276
- setValueAtPath(circuitRunnerConfiguration.projectConfig, property, value);
1277
- },
1278
- enableDebug: async (namespace) => {
1279
- debugNamespace = namespace;
1280
- if (executionContext) {
1281
- const circuit = executionContext.circuit;
1282
- circuit.enableDebug?.(namespace);
1283
- }
1284
- },
1285
- version: async () => {
1286
- return "0.0.0";
1287
- },
1288
- async executeWithFsMap(opts) {
1289
- if (circuitRunnerConfiguration.verbose) {
1290
- console.log("[Worker] executeWithFsMap called with:", {
1291
- entrypoint: opts.entrypoint,
1292
- fsMapKeys: Object.keys(opts.fsMap),
1293
- name: opts.name
1294
- });
1295
- }
1296
- setupDefaultEntrypointIfNeeded(opts);
1297
- let entrypoint = opts.entrypoint;
1298
- executionContext = createExecutionContext(circuitRunnerConfiguration, {
1299
- name: opts.name,
1300
- platform: circuitRunnerConfiguration.platform,
1301
- projectConfig: circuitRunnerConfiguration.projectConfig,
1302
- debugNamespace
1303
- });
1304
- bindEventListeners(executionContext.circuit);
1305
- executionContext.entrypoint = entrypoint;
1306
- executionContext.fsMap = normalizeFsMap(opts.fsMap);
1307
- executionContext.tsConfig = getTsConfig(executionContext.fsMap);
1308
- if (!executionContext.fsMap[entrypoint]) {
1309
- throw new Error(`Entrypoint "${opts.entrypoint}" not found`);
1310
- }
1311
- ;
1312
- globalThis.__tscircuit_circuit = executionContext.circuit;
1313
- if (!entrypoint.startsWith("./")) {
1314
- entrypoint = `./${entrypoint}`;
1315
- }
1316
- await importEvalPath(entrypoint, executionContext);
1317
- },
1318
- async execute(code, opts = {}) {
1319
- if (circuitRunnerConfiguration.verbose) {
1320
- console.log("[Worker] execute called with code length:", code.length);
1321
- }
1322
- executionContext = createExecutionContext(circuitRunnerConfiguration, {
1323
- ...opts,
1324
- platform: circuitRunnerConfiguration.platform,
1325
- projectConfig: circuitRunnerConfiguration.projectConfig,
1326
- debugNamespace
1327
- });
1328
- bindEventListeners(executionContext.circuit);
1329
- executionContext.fsMap["entrypoint.tsx"] = code;
1330
- executionContext.tsConfig = getTsConfig(executionContext.fsMap);
1331
- globalThis.__tscircuit_circuit = executionContext.circuit;
1332
- await importEvalPath("./entrypoint.tsx", executionContext);
1333
- },
1334
- async executeComponent(component, opts = {}) {
1335
- if (circuitRunnerConfiguration.verbose) {
1336
- console.log("[Worker] executeComponent called");
1337
- }
1338
- executionContext = createExecutionContext(circuitRunnerConfiguration, {
1339
- ...opts,
1340
- platform: circuitRunnerConfiguration.platform,
1341
- projectConfig: circuitRunnerConfiguration.projectConfig,
1342
- debugNamespace
1343
- });
1344
- bindEventListeners(executionContext.circuit);
1345
- globalThis.__tscircuit_circuit = executionContext.circuit;
1346
- executionContext.tsConfig = null;
1347
- let element;
1348
- if (typeof component === "function") {
1349
- element = component();
1350
- } else if (component?.__isSerializedReactElement) {
1351
- element = deserializeReactElement(component);
1352
- } else {
1353
- element = component;
1354
- }
1355
- executionContext.circuit.add(element);
1356
- },
1357
- on: (event, callback) => {
1358
- eventListeners[event] ?? (eventListeners[event] = []);
1359
- eventListeners[event].push(callback);
1360
- executionContext?.circuit.on(event, callback);
1361
- },
1362
- renderUntilSettled: async () => {
1363
- if (!executionContext) {
1364
- throw new Error("No circuit has been created");
1365
- }
1366
- try {
1367
- await executionContext.circuit.renderUntilSettled();
1368
- } catch (error) {
1369
- throw enhanceRootCircuitHasNoChildrenError(
1370
- error,
1371
- executionContext.entrypoint
1372
- );
1373
- }
1374
- },
1375
- getCircuitJson: async () => {
1376
- if (!executionContext) {
1377
- throw new Error("No circuit has been created");
1378
- }
1379
- try {
1380
- return executionContext.circuit.getCircuitJson();
1381
- } catch (error) {
1382
- throw enhanceRootCircuitHasNoChildrenError(
1383
- error,
1384
- executionContext.entrypoint
1385
- );
1386
- }
1387
- },
1388
- clearEventListeners: () => {
1389
- if (executionContext?.circuit) {
1390
- for (const event in eventListeners) {
1391
- for (const listener of eventListeners[event]) {
1392
- const circuit = executionContext.circuit;
1393
- if (circuit.removeListener) {
1394
- circuit.removeListener(event, listener);
1395
- }
1396
- }
1397
- }
1398
- }
1399
- for (const event in eventListeners) {
1400
- delete eventListeners[event];
1401
- }
1402
- },
1403
- // Required by InternalWebWorkerApi interface but never called
1404
- // Worker termination is handled by the main thread
1405
- kill: async () => {
1406
- }
1407
- };
1408
- Comlink.expose(webWorkerApi);
1409
1003
 
1410
- // webworker/extractBasePackageName.ts
1004
+ // lib/eval/extractBasePackageName.ts
1411
1005
  function extractBasePackageName(importName) {
1412
1006
  let basePackageName = importName;
1413
1007
  if (importName.startsWith("@")) {
@@ -1419,7 +1013,7 @@ function extractBasePackageName(importName) {
1419
1013
  return basePackageName;
1420
1014
  }
1421
1015
 
1422
- // webworker/isPackageDeclaredInPackageJson.ts
1016
+ // lib/eval/isPackageDeclaredInPackageJson.ts
1423
1017
  function isPackageDeclaredInPackageJson(packageName, fsMap) {
1424
1018
  const packageJsonContent = fsMap["package.json"];
1425
1019
  if (!packageJsonContent) {
@@ -1437,7 +1031,7 @@ function isPackageDeclaredInPackageJson(packageName, fsMap) {
1437
1031
  }
1438
1032
  }
1439
1033
 
1440
- // webworker/getNodeModuleDirectory.ts
1034
+ // lib/eval/getNodeModuleDirectory.ts
1441
1035
  function getNodeModuleDirectory(packageName, fsMap) {
1442
1036
  const basePackageName = extractBasePackageName(packageName);
1443
1037
  const nodeModulePath = `node_modules/${basePackageName}`;
@@ -1447,7 +1041,7 @@ function getNodeModuleDirectory(packageName, fsMap) {
1447
1041
  return hasFiles ? nodeModulePath : null;
1448
1042
  }
1449
1043
 
1450
- // webworker/getPackageJsonEntrypoint.ts
1044
+ // lib/eval/getPackageJsonEntrypoint.ts
1451
1045
  function getPackageJsonEntrypoint(packageName, fsMap) {
1452
1046
  const basePackageName = extractBasePackageName(packageName);
1453
1047
  const packageJsonPath = `node_modules/${basePackageName}/package.json`;
@@ -1461,13 +1055,13 @@ function getPackageJsonEntrypoint(packageName, fsMap) {
1461
1055
  }
1462
1056
  }
1463
1057
 
1464
- // webworker/isTypeScriptEntrypoint.ts
1058
+ // lib/eval/isTypeScriptEntrypoint.ts
1465
1059
  function isTypeScriptEntrypoint(entrypoint) {
1466
1060
  if (!entrypoint) return false;
1467
1061
  return entrypoint.endsWith(".ts") || entrypoint.endsWith(".tsx");
1468
1062
  }
1469
1063
 
1470
- // webworker/isDistDirEmpty.ts
1064
+ // lib/eval/isDistDirEmpty.ts
1471
1065
  function isDistDirEmpty(packageName, fsMap) {
1472
1066
  const basePackageName = extractBasePackageName(packageName);
1473
1067
  const distPath = `node_modules/${basePackageName}/dist`;
@@ -1477,8 +1071,8 @@ function isDistDirEmpty(packageName, fsMap) {
1477
1071
  return !hasFiles;
1478
1072
  }
1479
1073
 
1480
- // webworker/import-node-module.ts
1481
- var debug4 = Debug4("tsci:eval:import-node-module");
1074
+ // lib/eval/import-node-module.ts
1075
+ var debug3 = Debug3("tsci:eval:import-node-module");
1482
1076
  var importNodeModule = async (importName, ctx, depth = 0) => {
1483
1077
  const { preSuppliedImports, fsMap } = ctx;
1484
1078
  if (preSuppliedImports[importName]) {
@@ -1525,11 +1119,11 @@ ${ctx.logger.stringifyLogs()}`
1525
1119
  if (!resolvedNodeModulePath) {
1526
1120
  const platform = ctx.circuit?.platform;
1527
1121
  if (platform?.nodeModulesResolver) {
1528
- debug4(`Attempting to resolve "${importName}" using nodeModulesResolver`);
1122
+ debug3(`Attempting to resolve "${importName}" using nodeModulesResolver`);
1529
1123
  try {
1530
1124
  const fileContent = await platform.nodeModulesResolver(importName);
1531
1125
  if (fileContent) {
1532
- debug4(`Successfully resolved "${importName}" via nodeModulesResolver`);
1126
+ debug3(`Successfully resolved "${importName}" via nodeModulesResolver`);
1533
1127
  const syntheticPath = `node_modules/${importName}.ts`;
1534
1128
  ctx.fsMap[syntheticPath] = fileContent;
1535
1129
  await importLocalFile(syntheticPath, ctx, depth);
@@ -1538,9 +1132,9 @@ ${ctx.logger.stringifyLogs()}`
1538
1132
  preSuppliedImports[unprefixedPath2] = preSuppliedImports[syntheticPath];
1539
1133
  return;
1540
1134
  }
1541
- debug4(`nodeModulesResolver returned null for "${importName}"`);
1135
+ debug3(`nodeModulesResolver returned null for "${importName}"`);
1542
1136
  } catch (error) {
1543
- debug4(`nodeModulesResolver failed for "${importName}":`, error);
1137
+ debug3(`nodeModulesResolver failed for "${importName}":`, error);
1544
1138
  }
1545
1139
  }
1546
1140
  throw new Error(`Node module "${importName}" not found`);
@@ -1563,9 +1157,9 @@ ${ctx.logger.stringifyLogs()}`
1563
1157
  }
1564
1158
  };
1565
1159
 
1566
- // webworker/import-npm-package.ts
1567
- import Debug5 from "debug";
1568
- var debug5 = Debug5("tsci:eval:import-npm-package");
1160
+ // lib/eval/import-npm-package.ts
1161
+ import Debug4 from "debug";
1162
+ var debug4 = Debug4("tsci:eval:import-npm-package");
1569
1163
  function extractPackagePathFromJSDelivr(url) {
1570
1164
  const prefix = "https://cdn.jsdelivr.net/npm/";
1571
1165
  if (url.startsWith(prefix)) {
@@ -1578,7 +1172,7 @@ async function importNpmPackage({
1578
1172
  depth = 0,
1579
1173
  fromJsDelivr = false
1580
1174
  }, ctx) {
1581
- debug5(`importing npm package: ${importName}`);
1175
+ debug4(`importing npm package: ${importName}`);
1582
1176
  const { preSuppliedImports, fsMap } = ctx;
1583
1177
  if (preSuppliedImports[importName]) return;
1584
1178
  if (!fromJsDelivr && !isPackageDeclaredInPackageJson(importName, fsMap)) {
@@ -1637,11 +1231,11 @@ ${ctx.logger.stringifyLogs()}`
1637
1231
  }
1638
1232
  }
1639
1233
 
1640
- // webworker/import-eval-path.ts
1641
- import Debug6 from "debug";
1642
- var debug6 = Debug6("tsci:eval:import-eval-path");
1234
+ // lib/eval/import-eval-path.ts
1235
+ import Debug5 from "debug";
1236
+ var debug5 = Debug5("tsci:eval:import-eval-path");
1643
1237
  async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
1644
- debug6("importEvalPath called with:", {
1238
+ debug5("importEvalPath called with:", {
1645
1239
  importName,
1646
1240
  depth,
1647
1241
  opts
@@ -1649,7 +1243,7 @@ async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
1649
1243
  ctx.logger.info(
1650
1244
  `importEvalPath("${importName}", {cwd: "${opts.cwd}", depth: ${depth}})`
1651
1245
  );
1652
- debug6(`${" ".repeat(depth)}\u27A1\uFE0F`, importName);
1246
+ debug5(`${" ".repeat(depth)}\u27A1\uFE0F`, importName);
1653
1247
  const { preSuppliedImports } = ctx;
1654
1248
  const disableCdnLoading = ctx.disableCdnLoading || globalThis.__DISABLE_CDN_LOADING__;
1655
1249
  if (preSuppliedImports[importName]) {
@@ -1833,8 +1427,124 @@ ${ctx.logger.stringifyLogs()}`
1833
1427
  );
1834
1428
  }
1835
1429
 
1430
+ // lib/runner/CircuitRunner.ts
1431
+ import "react";
1432
+
1433
+ // lib/runner/setupDefaultEntrypointIfNeeded.ts
1434
+ import Debug6 from "debug";
1435
+ var debug6 = Debug6("tsci:eval:setupDefaultEntrypointIfNeeded");
1436
+ var setupDefaultEntrypointIfNeeded = (opts) => {
1437
+ if (!opts.entrypoint && !opts.mainComponentPath) {
1438
+ if ("index.tsx" in opts.fsMap) {
1439
+ opts.mainComponentPath = "index.tsx";
1440
+ } else if ("index.ts" in opts.fsMap) {
1441
+ opts.mainComponentPath = "index.ts";
1442
+ } else if (Object.keys(opts.fsMap).filter((k) => k.endsWith(".tsx")).length === 1) {
1443
+ opts.mainComponentPath = Object.keys(opts.fsMap)[0];
1444
+ } else if ("tscircuit.config.json" in opts.fsMap) {
1445
+ const configContent = opts.fsMap["tscircuit.config.json"];
1446
+ try {
1447
+ const config = JSON.parse(configContent);
1448
+ if (config.mainEntrypoint) {
1449
+ opts.entrypoint = config.mainEntrypoint;
1450
+ }
1451
+ } catch (e) {
1452
+ console.warn("Failed to parse tscircuit.config.json:", e);
1453
+ }
1454
+ } else {
1455
+ throw new Error(
1456
+ "Either entrypoint or mainComponentPath must be provided (no index file, could not infer entrypoint)"
1457
+ );
1458
+ }
1459
+ }
1460
+ if (!opts.entrypoint && opts.mainComponentPath) {
1461
+ opts.entrypoint = "entrypoint.tsx";
1462
+ const mainComponentCode = opts.fsMap[resolveFilePathOrThrow(opts.mainComponentPath, opts.fsMap)];
1463
+ if (!mainComponentCode) {
1464
+ throw new Error(
1465
+ `Main component path "${opts.mainComponentPath}" not found in fsMap. Available paths: ${Object.keys(opts.fsMap).join(", ")}`
1466
+ );
1467
+ }
1468
+ opts.fsMap[opts.entrypoint] = `
1469
+ import * as UserComponents from "./${opts.mainComponentPath}";
1470
+
1471
+ ${opts.mainComponentName ? `
1472
+ const ComponentToRender = UserComponents["${opts.mainComponentName}"]
1473
+ ` : `const ComponentToRender = UserComponents.default ||
1474
+ Object.entries(UserComponents)
1475
+ .filter(([name]) => !name.startsWith("use"))
1476
+ .map(([_, component]) => component)[0] || (() => null);`}
1477
+
1478
+ ${debug6.enabled ? `
1479
+ console.log({ UserComponents })
1480
+ console.log("ComponentToRender " + ComponentToRender.toString(), { ComponentToRender })
1481
+ ` : ""}
1482
+
1483
+ circuit.add(
1484
+ <ComponentToRender ${opts.mainComponentProps ? `{...${JSON.stringify(opts.mainComponentProps, null, 2)}}` : ""} />
1485
+ );
1486
+ `;
1487
+ }
1488
+ if (!opts.name && opts.mainComponentName) {
1489
+ opts.name = opts.mainComponentName;
1490
+ }
1491
+ };
1492
+
1493
+ // lib/utils/enhance-root-circuit-error.ts
1494
+ var enhanceRootCircuitHasNoChildrenError = (error, entrypoint) => {
1495
+ if (error instanceof Error && entrypoint && error.message.includes("RootCircuit has no children") && !error.message.includes('"entrypoint":')) {
1496
+ const entrypointMessage = entrypoint.startsWith("./") ? entrypoint.slice(2) : entrypoint;
1497
+ error.message = `${error.message}. "entrypoint": "${entrypointMessage}" is set in the runner configuration, entrypoints must contain "circuit.add(...)", you might be looking to use mainComponentPath instead if your file exports a component.`;
1498
+ }
1499
+ return error;
1500
+ };
1501
+
1836
1502
  // lib/runner/CircuitRunner.ts
1837
1503
  import Debug7 from "debug";
1504
+
1505
+ // lib/shared/obj-path.ts
1506
+ function getObjectPaths(obj, prefix = "") {
1507
+ const paths = [];
1508
+ for (const key in obj) {
1509
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
1510
+ continue;
1511
+ }
1512
+ const value = obj[key];
1513
+ const path = prefix ? `${prefix}.${key}` : key;
1514
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
1515
+ const subPaths = getObjectPaths(value, path);
1516
+ paths.push(...subPaths);
1517
+ } else {
1518
+ paths.push(path);
1519
+ }
1520
+ }
1521
+ return paths;
1522
+ }
1523
+ function getValueAtPath(obj, path) {
1524
+ const keys = path.split(".");
1525
+ let current = obj;
1526
+ for (const key of keys) {
1527
+ current = current[key];
1528
+ }
1529
+ return current;
1530
+ }
1531
+ function setValueAtPath(obj, path, value) {
1532
+ const keys = path.split(".");
1533
+ let current = obj;
1534
+ for (let i = 0; i < keys.length; i++) {
1535
+ const key = keys[i];
1536
+ if (i === keys.length - 1) {
1537
+ current[key] = value;
1538
+ } else {
1539
+ if (!Object.prototype.hasOwnProperty.call(current, key) || typeof current[key] !== "object" || current[key] === null || Array.isArray(current[key])) {
1540
+ current[key] = {};
1541
+ }
1542
+ current = current[key];
1543
+ }
1544
+ }
1545
+ }
1546
+
1547
+ // lib/runner/CircuitRunner.ts
1838
1548
  var debug7 = Debug7("tsci:eval:CircuitRunner");
1839
1549
  var CircuitRunner = class {
1840
1550
  constructor(configuration = {}) {
@@ -2076,7 +1786,7 @@ var runTscircuitModule = async (module, opts = {}) => {
2076
1786
  };
2077
1787
 
2078
1788
  // lib/worker.ts
2079
- import * as Comlink2 from "comlink";
1789
+ import * as Comlink from "comlink";
2080
1790
  var createCircuitWebWorker = async (configuration) => {
2081
1791
  const existingWorker = globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER;
2082
1792
  if (existingWorker && typeof existingWorker.kill === "function") {
@@ -2164,7 +1874,7 @@ var createCircuitWebWorker = async (configuration) => {
2164
1874
  if (workerInitError) {
2165
1875
  throw workerInitError;
2166
1876
  }
2167
- const comlinkWorker = Comlink2.wrap(rawWorker);
1877
+ const comlinkWorker = Comlink.wrap(rawWorker);
2168
1878
  rawWorker.removeEventListener("message", earlyMessageHandler);
2169
1879
  function serializeReactElement(element) {
2170
1880
  if (!element || typeof element !== "object") {
@@ -2209,7 +1919,7 @@ var createCircuitWebWorker = async (configuration) => {
2209
1919
  }
2210
1920
  const maybeProxy = (value) => {
2211
1921
  if (typeof value === "function") {
2212
- return Comlink2.proxy(value);
1922
+ return Comlink.proxy(value);
2213
1923
  }
2214
1924
  return value;
2215
1925
  };
@@ -2281,11 +1991,11 @@ var createCircuitWebWorker = async (configuration) => {
2281
1991
  renderUntilSettled: comlinkWorker.renderUntilSettled.bind(comlinkWorker),
2282
1992
  getCircuitJson: comlinkWorker.getCircuitJson.bind(comlinkWorker),
2283
1993
  on: (event, callback) => {
2284
- const proxiedCallback = Comlink2.proxy(callback);
1994
+ const proxiedCallback = Comlink.proxy(callback);
2285
1995
  comlinkWorker.on(event, proxiedCallback);
2286
1996
  },
2287
1997
  kill: async () => {
2288
- comlinkWorker[Comlink2.releaseProxy]();
1998
+ comlinkWorker[Comlink.releaseProxy]();
2289
1999
  rawWorker.terminate();
2290
2000
  isTerminated = true;
2291
2001
  if (globalThis.TSCIRCUIT_GLOBAL_CIRCUIT_WORKER === wrapper) {
@@ -2341,4 +2051,4 @@ export {
2341
2051
  runTscircuitCode,
2342
2052
  runTscircuitModule
2343
2053
  };
2344
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cC50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi9saWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvcnVubmVyL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZC50cyIsICIuLi8uLi9saWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3IudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ZldGNoUHJveHkudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9vYmotcGF0aC50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uLnRzIiwgIi4uLy4uL3dlYndvcmtlci9nZXROb2RlTW9kdWxlRGlyZWN0b3J5LnRzIiwgIi4uLy4uL3dlYndvcmtlci9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vd2Vid29ya2VyL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnQudHMiLCAiLi4vLi4vd2Vid29ya2VyL2lzRGlzdERpckVtcHR5LnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtbnBtLXBhY2thZ2UudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuaW50ZXJmYWNlIFN0b3JlZExvZ2dlciB7XG4gIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgZ2V0TG9nczogKCkgPT4gQXJyYXk8eyBtc2c6IHN0cmluZyB9PlxuICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbiAgbG9nZ2VyOiBTdG9yZWRMb2dnZXJcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICBpbXBvcnRTdGFjazogc3RyaW5nW11cbiAgY3VycmVudGx5SW1wb3J0aW5nOiBTZXQ8c3RyaW5nPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gICAgcHJvamVjdENvbmZpZz86IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+XG4gICAgZGVidWdOYW1lc3BhY2U/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKTogRXhlY3V0aW9uQ29udGV4dCB7XG4gIGdsb2JhbFRoaXMuUmVhY3QgPSBSZWFjdFxuXG4gIGNvbnN0IGJhc2VQbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZ2V0UGxhdGZvcm1Db25maWcoKVxuICBjb25zdCBwbGF0Zm9ybSA9IG9wdHMucHJvamVjdENvbmZpZ1xuICAgID8geyAuLi5iYXNlUGxhdGZvcm0sIC4uLm9wdHMucHJvamVjdENvbmZpZyB9XG4gICAgOiBiYXNlUGxhdGZvcm1cblxuICBpZiAocGxhdGZvcm0ucGFydHNFbmdpbmVEaXNhYmxlZCkge1xuICAgIHBsYXRmb3JtLnBhcnRzRW5naW5lID0gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybSxcbiAgfSlcblxuICBpZiAob3B0cy5uYW1lKSB7XG4gICAgY2lyY3VpdC5uYW1lID0gb3B0cy5uYW1lXG4gIH1cblxuICBpZiAob3B0cy5kZWJ1Z05hbWVzcGFjZSkge1xuICAgIGNpcmN1aXQuZW5hYmxlRGVidWcob3B0cy5kZWJ1Z05hbWVzcGFjZSlcbiAgfVxuXG4gIGNvbnN0IGxvZ3M6IEFycmF5PHsgbXNnOiBzdHJpbmcgfT4gPSBbXVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgbG9nZ2VyOiB7XG4gICAgICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvZ3MucHVzaCh7IG1zZzogbWVzc2FnZSB9KVxuICAgICAgfSxcbiAgICAgIGdldExvZ3M6ICgpID0+IGxvZ3MsXG4gICAgICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBsb2dzLm1hcCgobG9nKSA9PiBsb2cubXNnKS5qb2luKFwiXFxuXCIpLFxuICAgIH0sXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgXCJyZWFjdC9qc3gtcnVudGltZVwiOiBSZWFjdEpzeFJ1bnRpbWUsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICAvLyBSZXNvbHZlIGJhc2VVcmwgcmVsYXRpdmUgdG8gdHNjb25maWcgbG9jYXRpb25cbiAgY29uc3QgYmFzZURpciA9IHRzY29uZmlnRGlyIHx8IFwiLlwiXG4gIGxldCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VEaXJ9LyR7YmFzZVVybH0vJHtpbXBvcnRQYXRofWBcbiAgLy8gQ2xlYW4gdXAgbXVsdGlwbGUgc2xhc2hlcyBhbmQgbGVhZGluZyBkb3RzXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikgLy8gUmVwbGFjZSBtdWx0aXBsZSBzbGFzaGVzIHdpdGggc2luZ2xlIHNsYXNoXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvXFwuXFwvL2csIFwiL1wiKSAvLyBSZXBsYWNlIC8uLyB3aXRoIC9cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGhUb1Jlc29sdmUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRGaWxlUGF0aCkhXG4gIH1cblxuICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRGaWxlUGF0aH0uJHtleHR9YFxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oXG4gIGltcG9ydFBhdGg6IHN0cmluZyxcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gIGlmICghcGF0aHMpIHJldHVybiBmYWxzZVxuXG4gIGZvciAoY29uc3QgW2FsaWFzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpICYmIGltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoID09PSBhbGlhcykgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuLi8uLi93ZWJ3b3JrZXIvZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBnZXRUc0NvbmZpZyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIndlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCB9IGZyb20gXCIuL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiXG5pbXBvcnQgeyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgfSBmcm9tIFwibGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgc2V0VmFsdWVBdFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9vYmotcGF0aFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0RGlzYWJsZUNkbkxvYWRpbmcoZGlzYWJsZTogYm9vbGVhbikge1xuICAgIDsodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gYXMgYW55KS5kaXNhYmxlQ2RuTG9hZGluZyA9IGRpc2FibGVcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIGEgcGF0aCwgc2ltaWxhciB0byBOb2RlLmpzIHBhdGguZGlybmFtZVxuICogV29ya3Mgb24gYm90aCBVbml4IGFuZCBXaW5kb3dzIHBhdGhzXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBleHRyYWN0IHRoZSBkaXJlY3RvcnkgZnJvbVxuICogQHJldHVybnMgVGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyB0byBmb3J3YXJkIHNsYXNoZXNcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXNcbiAgY29uc3QgY2xlYW5QYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuXG4gIC8vIElmIHRoZXJlIGFyZSBubyBzbGFzaGVzLCByZXR1cm4gXCIuXCJcbiAgaWYgKGNsZWFuUGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEpIHJldHVybiBcIi5cIlxuXG4gIC8vIFJldHVybiBldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IHNsYXNoXG4gIHJldHVybiBjbGVhblBhdGguc3Vic3RyaW5nKDAsIGNsZWFuUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpIHx8IFwiL1wiXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG4vKipcbiAqIFJlc29sdmUgYW4gaW1wb3J0UGF0aCByZWxhdGl2ZSB0byBhIGN3ZCwgc3VwcG9ydGluZyAuLi8sIC4vIGFuZCBhYnNvbHV0ZSBwYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb25cbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHBhcmVudERpciA9IGRpcm5hbWUoY3dkKVxuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMyksIHBhcmVudERpcilcbiAgfVxuICAvLyBIYW5kbGUgY3VycmVudCBkaXJlY3RvcnlcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgyKSwgY3dkKVxuICB9XG4gIC8vIEhhbmRsZSBhYnNvbHV0ZSBwYXRoXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFBhdGguc2xpY2UoMSlcbiAgfVxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aFxuICByZXR1cm4gYCR7Y3dkfS8ke2ltcG9ydFBhdGh9YFxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCIsIFwib2JqXCIsIFwiZ2x0ZlwiLCBcImdsYlwiXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIE1hdGNoIGJhc2ljIGltcG9ydCBwYXR0ZXJucyBpbmNsdWRpbmcgY29tYmluZWQgZGVmYXVsdCBhbmQgbmFtZXNwYWNlIGltcG9ydHNcbiAgY29uc3QgaW1wb3J0UmVnZXggPVxuICAgIC9eXFxzKmltcG9ydFxccysoPzooPzpbXFx3XFxzXSssXFxzKik/KD86XFwqXFxzK2FzXFxzK1tcXHdcXHNdK3xcXHtbXFxzXFx3LF0rXFx9fFxcdyspXFxzK2Zyb21cXHMqKT9bJ1wiXSguKz8pWydcIl0vZ21cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuICAgIGlmICgvXlxccyppbXBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pXG4gIH1cblxuICAvLyBNYXRjaCByZS1leHBvcnRzXG4gIGNvbnN0IHJlRXhwb3J0UmVnZXggPVxuICAgIC9eXFxzKmV4cG9ydFxccysoPzp0eXBlXFxzKyk/KD86XFwqXFxzK2FzXFxzK1tcXHckXSt8XFwqfFxce1tefV0rXFx9KVxccytmcm9tXFxzKlsnXCJdKC4rPylbJ1wiXS9nbVxuICBsZXQgcmVFeHBvcnRNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKHJlRXhwb3J0TWF0Y2ggPSByZUV4cG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gZXh0cmFjdCBhbmQgcmVzb2x2ZSBpbXBvcnRzIGZpcnN0XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiB0cmFuc2Zvcm0gYW5kIGV2YWx1YXRlXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICApLmV4cG9ydHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpbXBvcnRTdGFjay5wb3AoKVxuICAgIGN1cnJlbnRseUltcG9ydGluZy5kZWxldGUoZnNQYXRoKVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TID0gW1xuICBcIi5nbGJcIixcbiAgXCIua2ljYWRfbW9kXCIsXG4gIFwiLmdsdGZcIixcbiAgXCIub2JqXCIsXG4gIFwiLnN0bFwiLFxuXVxuXG5leHBvcnQgY29uc3QgaXNTdGF0aWNBc3NldFBhdGggPSAocGF0aDogc3RyaW5nKSA9PlxuICBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUy5zb21lKChleHQpID0+IHBhdGguZW5kc1dpdGgoZXh0KSlcbiIsICJpbXBvcnQgeyB0cmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtIGFzIFN1Y3Jhc2VUcmFuc2Zvcm0gfSBmcm9tIFwic3VjcmFzZVwiXG5cbmNvbnN0IFRTX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c1wiLCBcIi50c3hcIiwgXCIubXRzXCIsIFwiLmN0c1wiXSlcbmNvbnN0IEpTWF9FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHN4XCIsIFwiLmpzeFwiLCBcIi50c1wiXSlcbmNvbnN0IFRZUEVfU1RBUl9FWFBPUlRfUkVHRVggPVxuICAvXlxccypleHBvcnRcXHMrdHlwZVxccytcXCpcXHMrKD86YXNcXHMrW1xcdyRdK1xccyspP2Zyb21cXHMrWydcIl1bXidcIl0rWydcIl1cXHMqOz9cXHMqJC9naW1cblxuY29uc3Qgc3RyaXBUeXBlU3RhckV4cG9ydHMgPSAoY29kZTogc3RyaW5nKSA9PlxuICBjb2RlLnJlcGxhY2UoVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCwgXCJcIilcblxuY29uc3Qgc3RyaXBRdWVyeUFuZEhhc2ggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIj9cIilcbiAgY29uc3QgaGFzaEluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIiNcIilcblxuICBsZXQgZW5kSW5kZXggPSBmaWxlUGF0aC5sZW5ndGhcblxuICBpZiAocXVlcnlJbmRleCAhPT0gLTEgJiYgaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KVxuICB9IGVsc2UgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBxdWVyeUluZGV4XG4gIH0gZWxzZSBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gaGFzaEluZGV4XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguc2xpY2UoMCwgZW5kSW5kZXgpXG59XG5cbmNvbnN0IGdldEV4dGVuc2lvbiA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gc3RyaXBRdWVyeUFuZEhhc2goZmlsZVBhdGgpXG4gIGNvbnN0IGxhc3REb3RJbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiLlwiKVxuXG4gIGlmIChsYXN0RG90SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIvXCIpLFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxcbiAgKVxuXG4gIGlmIChsYXN0U2xhc2hJbmRleCA+IGxhc3REb3RJbmRleCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc2xpY2UobGFzdERvdEluZGV4KS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlUGF0aClcblxuICBjb25zdCB0cmFuc2Zvcm1zOiBTdWNyYXNlVHJhbnNmb3JtW10gPSBbXCJpbXBvcnRzXCJdXG5cbiAgaWYgKFRTX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnVuc2hpZnQoXCJ0eXBlc2NyaXB0XCIpXG4gIH1cblxuICBpZiAoSlNYX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJqc3hcIilcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1XaXRoU3VjcmFzZSA9IChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtcyA9IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aChmaWxlUGF0aClcbiAgY29uc3Qgc2FuaXRpemVkQ29kZSA9IHN0cmlwVHlwZVN0YXJFeHBvcnRzKGNvZGUpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oc2FuaXRpemVkQ29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHtcbiAgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uLFxuICBnZXROb2RlTW9kdWxlRGlyZWN0b3J5LFxuICBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQsXG4gIGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQsXG4gIGlzRGlzdERpckVtcHR5LFxufSBmcm9tIFwiLi9pbmRleFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gT25seSBydW4gdmFsaWRhdGlvbiBpZiBwYWNrYWdlLmpzb24gZXhpc3RzIChjYW4ndCB2YWxpZGF0ZSB3aXRob3V0IGl0KVxuICBjb25zdCBoYXNQYWNrYWdlSnNvbiA9ICEhZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cblxuICBpZiAoaGFzUGFja2FnZUpzb24pIHtcbiAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvblxuICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICAvLyBPbmx5IHJ1biBTdGVwcyAyLTQgaWYgcGFja2FnZSBleGlzdHMgaW4gbm9kZV9tb2R1bGVzIChhZnRlciByZXNvbHZlciBhdHRlbXB0cylcbiAgaWYgKGhhc1BhY2thZ2VKc29uICYmIHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIGZvciB0aGUgcGFja2FnZVxuICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmICghbm9kZU1vZHVsZURpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIHRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogQ2hlY2sgaWYgbWFpbiBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBmc01hcClcbiAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIGEgdHlwZXNjcmlwdCBlbnRyeXBvaW50IHRoYXQgaXMgdW5zdXBwb3J0ZWRcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBpcyBlbXB0eSB3aGVuIG1haW4gcG9pbnRzIHRvIGRpc3RcbiAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGRlYnVnKGBBdHRlbXB0aW5nIHRvIHJlc29sdmUgXCIke2ltcG9ydE5hbWV9XCIgdXNpbmcgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgcGxhdGZvcm0ubm9kZU1vZHVsZXNSZXNvbHZlcihpbXBvcnROYW1lKVxuXG4gICAgICAgIGlmIChmaWxlQ29udGVudCkge1xuICAgICAgICAgIGRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzb2x2ZWQgXCIke2ltcG9ydE5hbWV9XCIgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSByZXNvbHZlZCBjb250ZW50IHRvIGZzTWFwIHdpdGggYSBzeW50aGV0aWMgcGF0aFxuICAgICAgICAgIC8vIEFkZCAudHMgZXh0ZW5zaW9uIHRvIGVuc3VyZSBpdCdzIHRyZWF0ZWQgYXMgYSBtb2R1bGUgZmlsZVxuICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1BhdGggPSBgbm9kZV9tb2R1bGVzLyR7aW1wb3J0TmFtZX0udHNgXG4gICAgICAgICAgY3R4LmZzTWFwW3N5bnRoZXRpY1BhdGhdID0gZmlsZUNvbnRlbnRcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgZmlsZSB1c2luZyB0aGUgbm9ybWFsIGZsb3dcbiAgICAgICAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUoc3ludGhldGljUGF0aCwgY3R4LCBkZXB0aClcblxuICAgICAgICAgIC8vIE1hcCB0aGUgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgLy8gQWxzbyBtYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4XG4gICAgICAgICAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSBzeW50aGV0aWNQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCBmb3IgXCIke2ltcG9ydE5hbWV9XCJgKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIjpgLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCAqIGFzIENvbWxpbmsgZnJvbSBcImNvbWxpbmtcIlxuaW1wb3J0IHR5cGUge1xuICBJbnRlcm5hbFdlYldvcmtlckFwaSxcbiAgV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQge1xuICBjcmVhdGVFeGVjdXRpb25Db250ZXh0LFxuICB0eXBlIEV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCJsaWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGdldFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwibGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgeyBzZXR1cEZldGNoUHJveHkgfSBmcm9tIFwiLi9mZXRjaFByb3h5XCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5nbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcbnNldHVwRmV0Y2hQcm94eSgpXG5cbi8vIFBvbHlmaWxsIGZvciBOb2RlLmpzIGdsb2JhbCBvYmplY3QgaW4gYnJvd3NlciB3b3JrZXJzXG4vLyBOZWVkZWQgYmVjYXVzZSBAdHNjaXJjdWl0L2NvcmUgYW5kIGRlcGVuZGVuY2llcyByZWZlcmVuY2UgZ2xvYmFsLmRlYnVnR3JhcGhpY3MvZGVidWdPdXRwdXRBcnJheVxuZ2xvYmFsVGhpcy5nbG9iYWwgPSBnbG9iYWxUaGlzLmdsb2JhbCB8fCBnbG9iYWxUaGlzXG5cbmxldCBleGVjdXRpb25Db250ZXh0OiBFeGVjdXRpb25Db250ZXh0IHwgbnVsbCA9IG51bGxcbmxldCBkZWJ1Z05hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbmNvbnN0IGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uID0ge1xuICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICBjanNSZWdpc3RyeVVybDogXCJodHRwczovL2Nqcy50c2NpcmN1aXQuY29tXCIsXG4gIHZlcmJvc2U6IGZhbHNlLFxuICBwbGF0Zm9ybTogdW5kZWZpbmVkLFxuICBwcm9qZWN0Q29uZmlnOiB1bmRlZmluZWQsXG59XG5cbmNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCAoKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKVtdPiA9IHt9XG5cbi8vIEhlbHBlciB0byBkZXNlcmlhbGl6ZSBSZWFjdCBlbGVtZW50cyBmcm9tIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVJlYWN0RWxlbWVudChzZXJpYWxpemVkOiBhbnkpOiBhbnkge1xuICBpZiAoIXNlcmlhbGl6ZWQgfHwgdHlwZW9mIHNlcmlhbGl6ZWQgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplZFxuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWQuX19pc1NlcmlhbGl6ZWRSZWFjdEVsZW1lbnQpIHtcbiAgICBjb25zdCBwcm9wcyA9IGRlc2VyaWFsaXplUHJvcHMoc2VyaWFsaXplZC5wcm9wcylcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChzZXJpYWxpemVkLnR5cGUsIHByb3BzKVxuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVQcm9wcyhwcm9wczogYW55KTogYW55IHtcbiAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gcHJvcHNcbiAgfVxuXG4gIGNvbnN0IGRlc2VyaWFsaXplZDogYW55ID0ge31cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjaGlsZHJlblwiKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZGVzZXJpYWxpemVkLmNoaWxkcmVuID0gdmFsdWUubWFwKGRlc2VyaWFsaXplUmVhY3RFbGVtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzZXJpYWxpemVkLmNoaWxkcmVuID0gZGVzZXJpYWxpemVSZWFjdEVsZW1lbnQodmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc2VyaWFsaXplZFxufVxuXG5mdW5jdGlvbiBiaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgZm9yIChjb25zdCBldmVudCBpbiBldmVudExpc3RlbmVycykge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgIH1cbiAgfVxufVxuXG50eXBlIFByb21pc2lmaWVkPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICAgPyAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8UmV0dXJuVHlwZTxUW0tdPj5cbiAgICA6IFRbS11cbn1cblxuY29uc3Qgd2ViV29ya2VyQXBpID0ge1xuICBzZXRTbmlwcGV0c0FwaUJhc2VVcmw6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwgPSBiYXNlVXJsXG4gIH0sXG4gIHNldERpc2FibGVDZG5Mb2FkaW5nOiBhc3luYyAoZGlzYWJsZTogYm9vbGVhbikgPT4ge1xuICAgIGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLmRpc2FibGVDZG5Mb2FkaW5nID0gZGlzYWJsZVxuICB9LFxuICBzZXRQbGF0Zm9ybUNvbmZpZzogYXN5bmMgKCRwbGF0Zm9ybTogUHJvbWlzaWZpZWQ8UGxhdGZvcm1Db25maWc+KSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJzZXRQbGF0Zm9ybUNvbmZpZyBjYW4ndCBiZSB1c2VkIGFnYWluc3QgdGhlIHdlYndvcmtlciBkaXJlY3RseSBkdWUgdG8gY29tbGluayBsaW1pdGF0aW9ucywgdXNlIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkgaW5zdGVhZCAob3IgYSB3cmFwcGVyKVwiLFxuICAgIClcbiAgfSxcbiAgc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eTogYXN5bmMgKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICBpZiAoIWNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgICBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwcm9wZXJ0eSwgdmFsdWUpXG4gIH0sXG4gIHNldFByb2plY3RDb25maWc6IGFzeW5jIChwcm9qZWN0OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPikgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwic2V0UHJvamVjdENvbmZpZyBjYW4ndCBiZSB1c2VkIGFnYWluc3QgdGhlIHdlYndvcmtlciBkaXJlY3RseSBkdWUgdG8gY29tbGluayBsaW1pdGF0aW9ucywgdXNlIHNldFByb2plY3RDb25maWdQcm9wZXJ0eSBpbnN0ZWFkIChvciBhIHdyYXBwZXIpXCIsXG4gICAgKVxuICB9LFxuICBzZXRQcm9qZWN0Q29uZmlnUHJvcGVydHk6IGFzeW5jIChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKCFjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgICBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgoY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZywgcHJvcGVydHksIHZhbHVlKVxuICB9LFxuXG4gIGVuYWJsZURlYnVnOiBhc3luYyAobmFtZXNwYWNlOiBzdHJpbmcpID0+IHtcbiAgICBkZWJ1Z05hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICAgIGlmIChleGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBjb25zdCBjaXJjdWl0ID0gZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIGFueVxuICAgICAgY2lyY3VpdC5lbmFibGVEZWJ1Zz8uKG5hbWVzcGFjZSlcbiAgICB9XG4gIH0sXG5cbiAgdmVyc2lvbjogYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfSxcblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9wdHM6IHtcbiAgICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGxldCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuXG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sIHtcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgIHBsYXRmb3JtOiBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgIHByb2plY3RDb25maWc6IGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBkZWJ1Z05hbWVzcGFjZSxcbiAgICB9KVxuICAgIGJpbmRFdmVudExpc3RlbmVycyhleGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gZW50cnlwb2ludFxuICAgIGV4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIGV4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyhleGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghZXhlY3V0aW9uQ29udGV4dC5mc01hcFtlbnRyeXBvaW50XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IGV4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgaWYgKCFlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgICAgZW50cnlwb2ludCA9IGAuLyR7ZW50cnlwb2ludH1gXG4gICAgfVxuXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCwgZXhlY3V0aW9uQ29udGV4dClcbiAgfSxcblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmIChjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltXb3JrZXJdIGV4ZWN1dGUgY2FsbGVkIHdpdGggY29kZSBsZW5ndGg6XCIsIGNvZGUubGVuZ3RoKVxuICAgIH1cbiAgICBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHBsYXRmb3JtOiBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgIHByb2plY3RDb25maWc6IGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBkZWJ1Z05hbWVzcGFjZSxcbiAgICB9KVxuICAgIGJpbmRFdmVudExpc3RlbmVycyhleGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIGV4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyhleGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSBleGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCBleGVjdXRpb25Db250ZXh0KVxuICB9LFxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAoY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cbiAgICBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHBsYXRmb3JtOiBjaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgIHByb2plY3RDb25maWc6IGNpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBkZWJ1Z05hbWVzcGFjZSxcbiAgICB9KVxuICAgIGJpbmRFdmVudExpc3RlbmVycyhleGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IGV4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIGV4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBsZXQgZWxlbWVudDogYW55XG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZWxlbWVudCA9IGNvbXBvbmVudCgpXG4gICAgfSBlbHNlIGlmIChjb21wb25lbnQ/Ll9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50KSB7XG4gICAgICBlbGVtZW50ID0gZGVzZXJpYWxpemVSZWFjdEVsZW1lbnQoY29tcG9uZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gY29tcG9uZW50XG4gICAgfVxuICAgIGV4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH0sXG5cbiAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIGV2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIGV4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfSxcblxuICByZW5kZXJVbnRpbFNldHRsZWQ6IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIWV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgZ2V0Q2lyY3VpdEpzb246IGFzeW5jICgpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+ID0+IHtcbiAgICBpZiAoIWV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgY2xlYXJFdmVudExpc3RlbmVyczogKCkgPT4ge1xuICAgIC8vIElmIHRoZXJlJ3MgYW4gYWN0aXZlIGNpcmN1aXQsIHRyeSB0byB1bmJpbmQgYWxsIGxpc3RlbmVyc1xuICAgIGlmIChleGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IGV4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKFxuICAgICAgICAgICAgICBldmVudDogc3RyaW5nLFxuICAgICAgICAgICAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLFxuICAgICAgICAgICAgKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaXJjdWl0LnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgc3RvcmVkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGRlbGV0ZSBldmVudExpc3RlbmVyc1tldmVudF1cbiAgICB9XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgSW50ZXJuYWxXZWJXb3JrZXJBcGkgaW50ZXJmYWNlIGJ1dCBuZXZlciBjYWxsZWRcbiAgLy8gV29ya2VyIHRlcm1pbmF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1haW4gdGhyZWFkXG4gIGtpbGw6IGFzeW5jICgpID0+IHt9LFxufSBzYXRpc2ZpZXMgSW50ZXJuYWxXZWJXb3JrZXJBcGlcblxuQ29tbGluay5leHBvc2Uod2ViV29ya2VyQXBpKVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiZXhwb3J0IGNvbnN0IHNldHVwRmV0Y2hQcm94eSA9ICgpID0+IHtcbiAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgeyByZXNvbHZlOiAodmFsdWU6IFJlc3BvbnNlKSA9PiB2b2lkOyByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZCB9XG4gID4oKVxuICBsZXQgcmVxdWVzdENvdW50ZXIgPSAwXG5cbiAgZnVuY3Rpb24gZmV0Y2hQcm94eShcbiAgICBpbnB1dDogUmVxdWVzdEluZm8gfCBVUkwsXG4gICAgaW5pdD86IFJlcXVlc3RJbml0LFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gKytyZXF1ZXN0Q291bnRlclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgeyByZXNvbHZlLCByZWplY3QgfSlcbiAgICAgIGxldCB1cmw6IHN0cmluZ1xuICAgICAgbGV0IHJlcXVlc3RJbml0OiBhbnkgPSBpbml0ID8geyAuLi5pbml0IH0gOiB7fVxuXG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiIHx8IGlucHV0IGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgIHVybCA9IGlucHV0LnRvU3RyaW5nKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybCA9IGlucHV0LnVybFxuICAgICAgICByZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAuLi5yZXF1ZXN0SW5pdCxcbiAgICAgICAgICBtZXRob2Q6IGlucHV0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzOiAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICAgICAgICAgIGlucHV0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgYm9keTogaW5wdXQuYm9keVVzZWQgPyB1bmRlZmluZWQgOiAoaW5wdXQgYXMgYW55KS5ib2R5LFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0SW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICByZXF1ZXN0SW5pdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICB9KVxuICAgICAgICByZXF1ZXN0SW5pdC5oZWFkZXJzID0gb2JqXG4gICAgICB9XG4gICAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoXCIsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgaW5wdXQ6IHVybCxcbiAgICAgICAgaW5pdDogcmVxdWVzdEluaXQsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmICghZGF0YSkgcmV0dXJuXG5cbiAgICBpZiAoZGF0YS50eXBlID09PSBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiKSB7XG4gICAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5mZXRjaCA9IGZldGNoUHJveHlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT09IFwiZGlzYWJsZV9jZG5fbG9hZGluZ1wiKSB7XG4gICAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX0RJU0FCTEVfQ0ROX0xPQURJTkdfXyA9IGRhdGEudmFsdWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT09IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiKSB7XG4gICAgICBjb25zdCBoYW5kbGVycyA9IHBlbmRpbmdSZXF1ZXN0cy5nZXQoZGF0YS5yZXF1ZXN0SWQpXG4gICAgICBpZiAoIWhhbmRsZXJzKSByZXR1cm5cbiAgICAgIHBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoZGF0YS5yZXF1ZXN0SWQpXG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgcmVzcCA9IG5ldyBSZXNwb25zZShkYXRhLnJlc3BvbnNlLmJvZHksIHtcbiAgICAgICAgICBzdGF0dXM6IGRhdGEucmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IGRhdGEucmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBkYXRhLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgIH0pXG4gICAgICAgIGhhbmRsZXJzLnJlc29sdmUocmVzcClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihkYXRhLmVycm9yLm1lc3NhZ2UpXG4gICAgICAgIGlmIChkYXRhLmVycm9yLm5hbWUpIGVyci5uYW1lID0gZGF0YS5lcnJvci5uYW1lXG4gICAgICAgIGlmIChkYXRhLmVycm9yLnN0YWNrKSBlcnIuc3RhY2sgPSBkYXRhLmVycm9yLnN0YWNrXG4gICAgICAgIGhhbmRsZXJzLnJlamVjdChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBoYW5kbGVNZXNzYWdlKVxufVxuIiwgIi8qKlxuICogR2V0IGFsbCBwYXRocyBvZiBhbiBvYmplY3RcbiAqXG4gKiBnZXRPYmplY3RQYXRocyh7IGE6IHsgYjogMiwgYzogeyBkOiAzIH0gfSwgZTogNSB9KVxuICpcbiAqIC8vIE91dHB1dDogWydhLmInLCAnYS5jLmQnLCAnZSddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RQYXRocyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcmVmaXggPSBcIlwiLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG4gICAgY29uc3QgcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGhzID0gZ2V0T2JqZWN0UGF0aHModmFsdWUsIHBhdGgpXG4gICAgICBwYXRocy5wdXNoKC4uLnN1YlBhdGhzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUF0UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIGF0IGEgcGF0aCBpbiBhbiBvYmplY3RcbiAqXG4gKiBzZXRWYWx1ZUF0UGF0aCh7IGE6IHsgYjogMiB9IH0sIFwiYS5jLmRcIiwgNSlcbiAqXG4gKiAvLyBPdXRwdXQ6IHsgYTogeyBiOiAyLCBjOiB7IGQ6IDUgfSB9IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQXRQYXRoKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbikge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuXG4gICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3Qga2V5LCBzZXQgdGhlIHZhbHVlLlxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgYW4gb2JqZWN0IChhdm9pZCBvdmVyd3JpdGluZyBhcnJheXMpLCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSB8fFxuICAgICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGN1cnJlbnRba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fVxuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBpbXBvcnQgbmFtZVxuICogSGFuZGxlcyBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIFwiQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFwiIC0+IFwiQHNjb3BlL3BhY2thZ2VcIlxuICogLSBcImxvZGFzaC9nZXRcIiAtPiBcImxvZGFzaFwiXG4gKiAtIFwicmVhY3RcIiAtPiBcInJlYWN0XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RCYXNlUGFja2FnZU5hbWUoaW1wb3J0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWVcbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAvLyBTY29wZWQgcGFja2FnZTogQHNjb3BlL3BhY2thZ2Ugb3IgQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFxuICAgIGNvbnN0IHBhcnRzID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilcbiAgICBiYXNlUGFja2FnZU5hbWUgPSBwYXJ0cy5sZW5ndGggPj0gMiA/IGAke3BhcnRzWzBdfS8ke3BhcnRzWzFdfWAgOiBpbXBvcnROYW1lXG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBwYWNrYWdlOiBwYWNrYWdlIG9yIHBhY2thZ2Uvc3VicGF0aFxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gIH1cbiAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIChkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgb3IgcGVlckRlcGVuZGVuY2llcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHtcbiAgICAvLyBObyBwYWNrYWdlLmpzb24gbWVhbnMgd2UgY2FuJ3QgdmFsaWRhdGUgLSBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyB8fCB7fVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgKGhhbmRsZSBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzKVxuICAgIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG5cbiAgICByZXR1cm4gKFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRldkRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIHBlZXJEZXBlbmRlbmNpZXNcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IHBhcnNlIHBhY2thZ2UuanNvbiwgYWxsb3cgdGhlIGltcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBub2RlTW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9YFxuXG4gIC8vIENoZWNrIGlmIGFueSBmaWxlcyBleGlzdCB1bmRlciB0aGlzIHBhdGggaW4gZnNNYXBcbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZShcbiAgICAocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKG5vZGVNb2R1bGVQYXRoICsgXCIvXCIpIHx8IHBhdGggPT09IG5vZGVNb2R1bGVQYXRoLFxuICApXG5cbiAgcmV0dXJuIGhhc0ZpbGVzID8gbm9kZU1vZHVsZVBhdGggOiBudWxsXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIEdldCB0aGUgZW50cnlwb2ludCBmcm9tIHBhY2thZ2UuanNvbiAodGhlIFwibWFpblwiIG9yIFwibW9kdWxlXCIgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmBcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtwYWNrYWdlSnNvblBhdGhdXG4gIGlmICghcGFja2FnZUpzb25Db250ZW50KSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICAvLyBUcnkgbWFpbiwgbW9kdWxlLCBvciBleHBvcnRzIGZpZWxkIChpbiBvcmRlciBvZiBwcmVmZXJlbmNlKVxuICAgIHJldHVybiBwYWNrYWdlSnNvbi5tYWluIHx8IHBhY2thZ2VKc29uLm1vZHVsZSB8fCBudWxsXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKipcbiAqIENoZWNrIGlmIHRoZSBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeXBvaW50KSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGVudHJ5cG9pbnQuZW5kc1dpdGgoXCIudHNcIikgfHwgZW50cnlwb2ludC5lbmRzV2l0aChcIi50c3hcIilcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBoYXMgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzdERpckVtcHR5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBkaXN0UGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L2Rpc3RgXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIGRpc3QvXG4gIGNvbnN0IGhhc0ZpbGVzID0gT2JqZWN0LmtleXMoZnNNYXApLnNvbWUoKHBhdGgpID0+XG4gICAgcGF0aC5zdGFydHNXaXRoKGRpc3RQYXRoICsgXCIvXCIpLFxuICApXG5cbiAgcmV0dXJuICFoYXNGaWxlc1xufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcIi4vdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24gfSBmcm9tIFwiLi9pbmRleFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5wbS1wYWNrYWdlXCIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cih1cmw6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vXCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgfVxuICByZXR1cm4gdXJsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROcG1QYWNrYWdlKFxuICB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCA9IDAsXG4gICAgZnJvbUpzRGVsaXZyID0gZmFsc2UsXG4gIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nOyBkZXB0aD86IG51bWJlcjsgZnJvbUpzRGVsaXZyPzogYm9vbGVhbiB9LFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZTogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkgcmV0dXJuXG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIGJlZm9yZSBmZXRjaGluZyBmcm9tIGpzRGVsaXZyXG4gIC8vIFNraXAgdGhpcyBjaGVjayBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKHN1Yi1pbXBvcnRzIGZyb20ganNEZWxpdnIgcGFja2FnZXMpXG4gIGlmICghZnJvbUpzRGVsaXZyICYmICFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBhY2thZ2UgXCIke2ltcG9ydE5hbWV9XCIgaXMgbm90IGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbi4gYCArXG4gICAgICAgIGBBZGQgaXQgdG8gZGVwZW5kZW5jaWVzIG9yIGRldkRlcGVuZGVuY2llcyBiZWZvcmUgaW1wb3J0aW5nLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgICBmcm9tSnNEZWxpdnI6IHRydWUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHtcbiAgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uLFxuICBnZXROb2RlTW9kdWxlRGlyZWN0b3J5LFxuICBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQsXG4gIGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQsXG4gIGlzRGlzdERpckVtcHR5LFxufSBmcm9tIFwiLi9pbmRleFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgICBmcm9tSnNEZWxpdnI/OiBib29sZWFuXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZGlzYWJsZUNkbkxvYWRpbmcgPVxuICAgIGN0eC5kaXNhYmxlQ2RuTG9hZGluZyB8fCAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fRElTQUJMRV9DRE5fTE9BRElOR19fXG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1sxXWApXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1syXWApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBpbXBvcnRzIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIChlLmcuLCBcInJlYWN0L2pzeC1ydW50aW1lXCIpXG4gIC8vIElmIHRoZSBiYXNlIHBhY2thZ2UgaXMgaW4gcHJlU3VwcGxpZWRJbXBvcnRzLCB0cnkgdG8gaW1wb3J0IGZyb20gdGhlIGFjdHVhbCBwYWNrYWdlXG4gIGlmIChcbiAgICBpbXBvcnROYW1lLmluY2x1ZGVzKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIilcbiAgKSB7XG4gICAgY29uc3QgYmFzZVBrZyA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gICAgY29uc3QgaXNTY29wZWQgPSBiYXNlUGtnLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgY29uc3QgcGtnTmFtZSA9IGlzU2NvcGVkXG4gICAgICA/IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgICA6IGJhc2VQa2dcbiAgICBjb25zdCBzdWJwYXRoID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMikuam9pbihcIi9cIilcbiAgICAgIDogaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSkuam9pbihcIi9cIilcblxuICAgIGlmIChwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBpbXBvcnQgdGhlIHN1YnBhdGggZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBpbXBvcnQoYCR7cGtnTmFtZX0vJHtzdWJwYXRofWApXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHJlc29sdmVkXG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIHJlc29sdmVkIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIGJhc2UgcGFja2FnZSBcIiR7cGtnTmFtZX1cImAsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB0aGUgZHluYW1pYyBpbXBvcnQgZmFpbHMsIGNvbnRpbnVlIHdpdGggbm9ybWFsIHJlc29sdXRpb25cbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc29sdXRpb25gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlcHRoID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWF4IGRlcHRoIGZvciBpbXBvcnRzIHJlYWNoZWQgKDMwKSBJbXBvcnQgUGF0aDogJHtjdHguaW1wb3J0U3RhY2suam9pbihcIiAtPiBcIil9YCxcbiAgICApXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke3BrZ05hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50LlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlKFwiJHtwa2dOYW1lfVwiKWApXG4gICAgLy8gL25wbS8gcGF0aHMgYXJlIGFsd2F5cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBmcm9tIGpzRGVsaXZyXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZTogcGtnTmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogdHJ1ZSB9LFxuICAgICAgY3R4LFxuICAgIClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGxldCB0c0NvbmZpZ1RvVXNlID0gY3R4LnRzQ29uZmlnXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgICB0c0NvbmZpZ1RvVXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICAgIHsgdHNDb25maWc6IHRzQ29uZmlnVG9Vc2UsIHRzY29uZmlnRGlyIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICAvLyBJZiBub3QgZm91bmQgaW4gZnNNYXAgYnV0IG1pZ2h0IGJlIGEgbm9kZSBtb2R1bGUsIHRyeSBpbXBvcnROb2RlTW9kdWxlXG4gIC8vIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byB1c2Ugbm9kZU1vZHVsZXNSZXNvbHZlciBpZiBjb25maWd1cmVkXG4gIGlmIChcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKVxuICApIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICBgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIikgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgLFxuICAgICAgKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbnBtIENETmAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQgYW5kIGF1dG9tYXRpYyBucG0gcmVzb2x1dGlvbiBpcyBkaXNhYmxlZC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAvLyBWYWxpZGF0aW9uIHN0ZXBzIGZvciBub2RlIG1vZHVsZXMgKGJlZm9yZSBqc0RlbGl2ciBmYWxsYmFjaylcbiAgICBpZiAoIW9wdHMuZnJvbUpzRGVsaXZyKSB7XG4gICAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgICBpZiAoIWlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAyOiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyAob25seSBpZiBub3QgZm91bmQgbG9jYWxseSB5ZXQpXG4gICAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIENETiBsb2FkaW5nIGlzIGRpc2FibGVkIChpLmUuLCBubyBmYWxsYmFjayB0byBqc0RlbGl2ciBhdmFpbGFibGUpXG4gICAgICBjb25zdCBub2RlTW9kdWxlRGlyID0gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICBpZiAoIW5vZGVNb2R1bGVEaXIgJiYgZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGUgKG9ubHkgaWYgZGlyIGV4aXN0cylcbiAgICAgIGlmIChub2RlTW9kdWxlRGlyKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKVxuICAgICAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgICAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgICAgIGlmIChpc0Rpc3REaXJFbXB0eShpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gZGlzdCwgZGlkIHlvdSBmb3JnZXQgdG8gdHJhbnNwaWxlP1xcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogb3B0cy5mcm9tSnNEZWxpdnIgfSxcbiAgICAgIGN0eCxcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIiwgImltcG9ydCAqIGFzIENvbWxpbmsgZnJvbSBcImNvbWxpbmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvaW5kZXhcIlxuaW1wb3J0IHR5cGUge1xuICBJbnRlcm5hbFdlYldvcmtlckFwaSxcbiAgV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgQ2lyY3VpdFdlYldvcmtlcixcbn0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXRFdmVudE5hbWUgfSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHsgZ2V0T2JqZWN0UGF0aHMsIGdldFZhbHVlQXRQYXRoIH0gZnJvbSBcIi4vc2hhcmVkL29iai1wYXRoXCJcblxuZXhwb3J0IHR5cGUgeyBDaXJjdWl0V2ViV29ya2VyLCBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG4gIH1cbiAgdmFyIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgPSBhc3luYyAoXG4gIGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8V2ViV29ya2VyQ29uZmlndXJhdGlvbj4sXG4pOiBQcm9taXNlPENpcmN1aXRXZWJXb3JrZXI+ID0+IHtcbiAgLy8gS2lsbCBleGlzdGluZyBnbG9iYWwgd29ya2VyIGluc3RhbmNlIGlmIHByZXNlbnRcbiAgY29uc3QgZXhpc3RpbmdXb3JrZXIgPSBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVJcbiAgaWYgKGV4aXN0aW5nV29ya2VyICYmIHR5cGVvZiBleGlzdGluZ1dvcmtlci5raWxsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltXb3JrZXJdIEtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZS4uLlwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhpc3RpbmdXb3JrZXIua2lsbCgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJbV29ya2VyXSBFcnJvciBraWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2U6XCIsXG4gICAgICAgICAgZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoZSBrZXkgaXMgY2xlYXJlZCBldmVuIGlmIGtpbGwgdGhyb3dzIGFuIGVycm9yXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSBleGlzdGluZ1dvcmtlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcIltXb3JrZXJdIENyZWF0aW5nIGNpcmN1aXQgd2ViIHdvcmtlciB3aXRoIGNvbmZpZzpcIixcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgKVxuICB9XG5cbiAgbGV0IHdvcmtlckJsb2JVcmwgPVxuICAgIGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyQmxvYlVybCA/PyBjb25maWd1cmF0aW9uLndlYldvcmtlclVybFxuXG4gIGlmICghd29ya2VyQmxvYlVybCkge1xuICAgIGNvbnN0IGNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvZXZhbEAke2NvbmZpZ3VyYXRpb24uZXZhbFZlcnNpb24gPz8gXCJsYXRlc3RcIn0vZGlzdC93ZWJ3b3JrZXIvZW50cnlwb2ludC5qc2BcblxuICAgIGNvbnN0IHdvcmtlckJsb2IgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGNkblVybCkudGhlbigocmVzKSA9PiByZXMuYmxvYigpKVxuICAgIHdvcmtlckJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHdvcmtlckJsb2IpXG4gIH1cblxuICBjb25zdCByYXdXb3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlckJsb2JVcmwsIHsgdHlwZTogXCJtb2R1bGVcIiB9KVxuICBsZXQgd29ya2VySW5pdEVycm9yOiBhbnlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gRXJyb3IgaW4gd29ya2VyXCIsIGV2ZW50KVxuICAgIHdvcmtlckluaXRFcnJvciA9IGV2ZW50XG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIE1lc3NhZ2UgZXJyb3IgaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICBjb25zdCBlYXJseU1lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmxvZyhcIltXb3JrZXJdIE1lc3NhZ2UgaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhhbmRsZSBmZXRjaCByZXF1ZXN0cyBmcm9tIHRoZSB3b3JrZXJcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGFcbiAgICBpZiAoZGF0YT8udHlwZSAhPT0gXCJ3b3JrZXJfZmV0Y2hcIikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGRhdGEuaW5wdXQsIGRhdGEuaW5pdClcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICAgIH0pKCksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgbmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2s6IGVyci5zdGFjayxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9KVxuXG4gIGlmICh3b3JrZXJJbml0RXJyb3IpIHtcbiAgICB0aHJvdyB3b3JrZXJJbml0RXJyb3JcbiAgfVxuXG4gIGNvbnN0IGNvbWxpbmtXb3JrZXIgPSBDb21saW5rLndyYXA8SW50ZXJuYWxXZWJXb3JrZXJBcGk+KHJhd1dvcmtlcilcblxuICByYXdXb3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIZWxwZXIgdG8gc2VyaWFsaXplIFJlYWN0IGVsZW1lbnRzIGZvciBjcm9zcy13b3JrZXIgY29tbXVuaWNhdGlvblxuICBmdW5jdGlvbiBzZXJpYWxpemVSZWFjdEVsZW1lbnQoZWxlbWVudDogYW55KTogYW55IHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgdHlwZW9mIGVsZW1lbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBlbGVtZW50XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBSZWFjdCBlbGVtZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX2lzU2VyaWFsaXplZFJlYWN0RWxlbWVudDogdHJ1ZSxcbiAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICBwcm9wczogc2VyaWFsaXplUHJvcHMoZWxlbWVudC5wcm9wcyksXG4gICAgICAgIGtleTogZWxlbWVudC5rZXksXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVByb3BzKHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGlmICghcHJvcHMgfHwgdHlwZW9mIHByb3BzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gcHJvcHNcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkOiBhbnkgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjaGlsZHJlblwiKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZWQuY2hpbGRyZW4gPSB2YWx1ZS5tYXAoc2VyaWFsaXplUmVhY3RFbGVtZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcmlhbGl6ZWQuY2hpbGRyZW4gPSBzZXJpYWxpemVSZWFjdEVsZW1lbnQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkXG4gIH1cblxuICAvLyBDb25kaXRpb25hbGx5IG92ZXJyaWRlIGdsb2JhbCBmZXRjaCBpbnNpZGUgdGhlIHdvcmtlciB0byByb3V0ZSB0aHJvdWdoIHRoZSBwYXJlbnRcbiAgLy8gT25seSBlbmFibGUgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCB2aWEgY29uZmlndXJhdGlvblxuICBpZiAoY29uZmlndXJhdGlvbi5lbmFibGVGZXRjaFByb3h5KSB7XG4gICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJvdmVycmlkZV9nbG9iYWxfZmV0Y2hcIiB9KVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldERpc2FibGVDZG5Mb2FkaW5nKHRydWUpXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuXG4gIGNvbnN0IG1heWJlUHJveHkgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIENvbWxpbmsucHJveHkodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcGxhdGZvcm0gY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFByb2plY3RDb25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcHJvamVjdCBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGlzVGVybWluYXRlZCA9IGZhbHNlXG5cbiAgLy8gQ3JlYXRlIGEgd3JhcHBlciB0aGF0IGhhbmRsZXMgZXZlbnRzIGRpcmVjdGx5IHRocm91Z2ggY2lyY3VpdCBpbnN0YW5jZVxuICBjb25zdCB3cmFwcGVyOiBDaXJjdWl0V2ViV29ya2VyID0ge1xuICAgIGNsZWFyRXZlbnRMaXN0ZW5lcnM6IGNvbWxpbmtXb3JrZXIuY2xlYXJFdmVudExpc3RlbmVycy5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGVuYWJsZURlYnVnOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBlbmFibGVEZWJ1Z1wiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZW5hYmxlRGVidWcuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgdmVyc2lvbjogY29tbGlua1dvcmtlci52ZXJzaW9uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZXhlY3V0ZTogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVwiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZS5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICBleGVjdXRlQ29tcG9uZW50OiBhc3luYyAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZUNvbXBvbmVudFwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgcGFzcyBpdCBhcy1pcyAod2lsbCBiZSBwcm94aWVkIGJ5IENvbWxpbmspXG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBSZWFjdCBlbGVtZW50LCBzZXJpYWxpemUgaXQgdG8gYSByZWNvbnN0cnVjdGFibGUgZm9ybWF0XG4gICAgICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09IFwib2JqZWN0XCIgJiYgY29tcG9uZW50LnR5cGUpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZEVsZW1lbnQgPSBzZXJpYWxpemVSZWFjdEVsZW1lbnQoY29tcG9uZW50KVxuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoXG4gICAgICAgICAgc2VyaWFsaXplZEVsZW1lbnQsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICB9LFxuICAgIGV4ZWN1dGVXaXRoRnNNYXA6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVXaXRoRnNNYXBcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZVdpdGhGc01hcC5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZW5kZXJVbnRpbFNldHRsZWQ6IGNvbWxpbmtXb3JrZXIucmVuZGVyVW50aWxTZXR0bGVkLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZ2V0Q2lyY3VpdEpzb246IGNvbWxpbmtXb3JrZXIuZ2V0Q2lyY3VpdEpzb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHByb3hpZWRDYWxsYmFjayA9IENvbWxpbmsucHJveHkoY2FsbGJhY2spXG4gICAgICBjb21saW5rV29ya2VyLm9uKGV2ZW50IGFzIFJvb3RDaXJjdWl0RXZlbnROYW1lLCBwcm94aWVkQ2FsbGJhY2spXG4gICAgfSxcbiAgICBraWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb21saW5rV29ya2VyW0NvbWxpbmsucmVsZWFzZVByb3h5XSgpXG4gICAgICByYXdXb3JrZXIudGVybWluYXRlKClcbiAgICAgIGlzVGVybWluYXRlZCA9IHRydWVcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IHdyYXBwZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgfVxuICA7KHdyYXBwZXIgYXMgYW55KS5fX3Jhd1dvcmtlciA9IHJhd1dvcmtlclxuICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB3cmFwcGVyXG4gIHJldHVybiB3cmFwcGVyXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ydW5uZXIvbm9ybWFsaXplRnNNYXBcIlxuXG5leHBvcnQgY29uc3QgZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMgPSAoXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtwYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgocGF0aCldID0gY29udGVudFxuICB9XG5cbiAgY29uc3QgcG9zc2libGUgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG5vcm1hbGl6ZWRGc01hcCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKG5vcm1hbGl6ZWRGc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXSlcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLm1haW5FbnRyeXBvaW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBvc3NpYmxlLmFkZChub3JtYWxpemVGaWxlUGF0aChjb25maWcubWFpbkVudHJ5cG9pbnQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzeFwiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHN4XCIpXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c1wiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHNcIilcblxuICBjb25zdCBjaXJjdWl0RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLmNpcmN1aXQudHN4XCIpLFxuICApXG4gIGZvciAoY29uc3QgZmlsZSBvZiBjaXJjdWl0RmlsZXMpIHtcbiAgICBwb3NzaWJsZS5hZGQoZmlsZSlcbiAgfVxuXG4gIGNvbnN0IHRzeEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi50c3hcIiksXG4gIClcbiAgaWYgKHRzeEZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHBvc3NpYmxlLmFkZCh0c3hGaWxlc1swXSlcbiAgfVxuXG4gIHJldHVybiBBcnJh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QUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiUmVhY3QiLCAiRGVidWciLCAiZGVidWciLCAiUmVhY3QiLCAiZGVidWciLCAiRGVidWciLCAidW5wcmVmaXhlZFBhdGgiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiQ29tbGluayJdCn0K
2054
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbG9jYWwtZmlsZS50cyIsICIuLi8uLi9saWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zLnRzIiwgIi4uLy4uL2xpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtc25pcHBldC50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi9saWIvZXZhbC9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24udHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeS50cyIsICIuLi8uLi9saWIvZXZhbC9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNUeXBlU2NyaXB0RW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvZXZhbC9pc0Rpc3REaXJFbXB0eS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbnBtLXBhY2thZ2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWV2YWwtcGF0aC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yLnRzIiwgIi4uLy4uL2xpYi9zaGFyZWQvb2JqLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuaW50ZXJmYWNlIFN0b3JlZExvZ2dlciB7XG4gIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgZ2V0TG9nczogKCkgPT4gQXJyYXk8eyBtc2c6IHN0cmluZyB9PlxuICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbiAgbG9nZ2VyOiBTdG9yZWRMb2dnZXJcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICBpbXBvcnRTdGFjazogc3RyaW5nW11cbiAgY3VycmVudGx5SW1wb3J0aW5nOiBTZXQ8c3RyaW5nPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gICAgcHJvamVjdENvbmZpZz86IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+XG4gICAgZGVidWdOYW1lc3BhY2U/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKTogRXhlY3V0aW9uQ29udGV4dCB7XG4gIGdsb2JhbFRoaXMuUmVhY3QgPSBSZWFjdFxuXG4gIGNvbnN0IGJhc2VQbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZ2V0UGxhdGZvcm1Db25maWcoKVxuICBjb25zdCBwbGF0Zm9ybSA9IG9wdHMucHJvamVjdENvbmZpZ1xuICAgID8geyAuLi5iYXNlUGxhdGZvcm0sIC4uLm9wdHMucHJvamVjdENvbmZpZyB9XG4gICAgOiBiYXNlUGxhdGZvcm1cblxuICBpZiAocGxhdGZvcm0ucGFydHNFbmdpbmVEaXNhYmxlZCkge1xuICAgIHBsYXRmb3JtLnBhcnRzRW5naW5lID0gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybSxcbiAgfSlcblxuICBpZiAob3B0cy5uYW1lKSB7XG4gICAgY2lyY3VpdC5uYW1lID0gb3B0cy5uYW1lXG4gIH1cblxuICBpZiAob3B0cy5kZWJ1Z05hbWVzcGFjZSkge1xuICAgIGNpcmN1aXQuZW5hYmxlRGVidWcob3B0cy5kZWJ1Z05hbWVzcGFjZSlcbiAgfVxuXG4gIGNvbnN0IGxvZ3M6IEFycmF5PHsgbXNnOiBzdHJpbmcgfT4gPSBbXVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgbG9nZ2VyOiB7XG4gICAgICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvZ3MucHVzaCh7IG1zZzogbWVzc2FnZSB9KVxuICAgICAgfSxcbiAgICAgIGdldExvZ3M6ICgpID0+IGxvZ3MsXG4gICAgICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBsb2dzLm1hcCgobG9nKSA9PiBsb2cubXNnKS5qb2luKFwiXFxuXCIpLFxuICAgIH0sXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgXCJyZWFjdC9qc3gtcnVudGltZVwiOiBSZWFjdEpzeFJ1bnRpbWUsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IHR5cGUgVHNDb25maWcgPSB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICBiYXNlVXJsPzogc3RyaW5nXG4gICAgcGF0aHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gIH1cbiAgZXh0ZW5kcz86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVmZXJlbmNlcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBpbmNsdWRlPzogc3RyaW5nW11cbiAgZXhjbHVkZT86IHN0cmluZ1tdXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzQ29uZmlnKFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pOiBUc0NvbmZpZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gZnNNYXBPckFsbEZpbGVQYXRoc1tcInRzY29uZmlnLmpzb25cIl1cbiAgaWYgKCF0c2NvbmZpZ0NvbnRlbnQpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRzY29uZmlnQ29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovZyxcbiAgICAgIFwiXCIsXG4gICAgKSAvLyByZW1vdmUgY29tbWVudHNcblxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2FuaXRpemVkQ29udGVudCkgYXMgVHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRzY29uZmlnLmpzb246ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyhvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gbnVsbFxuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCB8fCBcIi5cIlxuXG4gIGNvbnN0IHRyeVJlc29sdmVDYW5kaWRhdGUgPSAoY2FuZGlkYXRlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FuZGlkYXRlID0gbm9ybWFsaXplRmlsZVBhdGgoY2FuZGlkYXRlKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRDYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkQ2FuZGlkYXRlKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRDYW5kaWRhdGV9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIC8vIFN1cHBvcnQgcGF0dGVybnMgbGlrZSBcIkBzcmMvKlwiIG9yIFwidXRpbHMvKlwiIGFuZCBhbHNvIGV4YWN0IG1hdGNoZXMgd2l0aG91dCBcIipcIlxuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoXG4gICAgICAgICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fFxuICAgICAgICAhaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIilcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3Qgc3Rhck1hdGNoID0gaW1wb3J0UGF0aC5zbGljZShcbiAgICAgICAgcHJlZml4Lmxlbmd0aCxcbiAgICAgICAgaW1wb3J0UGF0aC5sZW5ndGggLSAoc3VmZml4ID8gc3VmZml4Lmxlbmd0aCA6IDApLFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRhcmdldC5yZXBsYWNlKFwiKlwiLCBzdGFyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3JlcGxhY2VkfWBcbiAgICAgICAgICAgIDogcmVwbGFjZWRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggIT09IGFsaWFzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3RhcmdldH1gXG4gICAgICAgICAgICA6IHRhcmdldFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICBpbXBvcnRQYXRoLFxuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICBleHRlbnNpb25zLFxuICAgIHRzQ29uZmlnLFxuICAgIHRzY29uZmlnRGlyLFxuICB9KVxuXG4gIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoQmFzZVVybChvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcbiAgaWYgKCFiYXNlVXJsKSByZXR1cm4gbnVsbFxuXG4gIC8vIFJlc29sdmUgYmFzZVVybCByZWxhdGl2ZSB0byB0c2NvbmZpZyBsb2NhdGlvblxuICBjb25zdCBiYXNlRGlyID0gdHNjb25maWdEaXIgfHwgXCIuXCJcbiAgbGV0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICAvLyBDbGVhbiB1cCBtdWx0aXBsZSBzbGFzaGVzIGFuZCBsZWFkaW5nIGRvdHNcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSAvLyBSZXBsYWNlIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBzaW5nbGUgc2xhc2hcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC9cXC5cXC8vZywgXCIvXCIpIC8vIFJlcGxhY2UgLy4vIHdpdGggL1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCIsIFwib2JqXCIsIFwiZ2x0ZlwiLCBcImdsYlwiXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIE1hdGNoIGJhc2ljIGltcG9ydCBwYXR0ZXJucyBpbmNsdWRpbmcgY29tYmluZWQgZGVmYXVsdCBhbmQgbmFtZXNwYWNlIGltcG9ydHNcbiAgY29uc3QgaW1wb3J0UmVnZXggPVxuICAgIC9eXFxzKmltcG9ydFxccysoPzooPzpbXFx3XFxzXSssXFxzKik/KD86XFwqXFxzK2FzXFxzK1tcXHdcXHNdK3xcXHtbXFxzXFx3LF0rXFx9fFxcdyspXFxzK2Zyb21cXHMqKT9bJ1wiXSguKz8pWydcIl0vZ21cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuICAgIGlmICgvXlxccyppbXBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pXG4gIH1cblxuICAvLyBNYXRjaCByZS1leHBvcnRzXG4gIGNvbnN0IHJlRXhwb3J0UmVnZXggPVxuICAgIC9eXFxzKmV4cG9ydFxccysoPzp0eXBlXFxzKyk/KD86XFwqXFxzK2FzXFxzK1tcXHckXSt8XFwqfFxce1tefV0rXFx9KVxccytmcm9tXFxzKlsnXCJdKC4rPylbJ1wiXS9nbVxuICBsZXQgcmVFeHBvcnRNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKHJlRXhwb3J0TWF0Y2ggPSByZUV4cG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gZXh0cmFjdCBhbmQgcmVzb2x2ZSBpbXBvcnRzIGZpcnN0XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiB0cmFuc2Zvcm0gYW5kIGV2YWx1YXRlXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICApLmV4cG9ydHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpbXBvcnRTdGFjay5wb3AoKVxuICAgIGN1cnJlbnRseUltcG9ydGluZy5kZWxldGUoZnNQYXRoKVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TID0gW1xuICBcIi5nbGJcIixcbiAgXCIua2ljYWRfbW9kXCIsXG4gIFwiLmdsdGZcIixcbiAgXCIub2JqXCIsXG4gIFwiLnN0bFwiLFxuXVxuXG5leHBvcnQgY29uc3QgaXNTdGF0aWNBc3NldFBhdGggPSAocGF0aDogc3RyaW5nKSA9PlxuICBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUy5zb21lKChleHQpID0+IHBhdGguZW5kc1dpdGgoZXh0KSlcbiIsICJpbXBvcnQgeyB0cmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtIGFzIFN1Y3Jhc2VUcmFuc2Zvcm0gfSBmcm9tIFwic3VjcmFzZVwiXG5cbmNvbnN0IFRTX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c1wiLCBcIi50c3hcIiwgXCIubXRzXCIsIFwiLmN0c1wiXSlcbmNvbnN0IEpTWF9FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHN4XCIsIFwiLmpzeFwiLCBcIi50c1wiXSlcbmNvbnN0IFRZUEVfU1RBUl9FWFBPUlRfUkVHRVggPVxuICAvXlxccypleHBvcnRcXHMrdHlwZVxccytcXCpcXHMrKD86YXNcXHMrW1xcdyRdK1xccyspP2Zyb21cXHMrWydcIl1bXidcIl0rWydcIl1cXHMqOz9cXHMqJC9naW1cblxuY29uc3Qgc3RyaXBUeXBlU3RhckV4cG9ydHMgPSAoY29kZTogc3RyaW5nKSA9PlxuICBjb2RlLnJlcGxhY2UoVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCwgXCJcIilcblxuY29uc3Qgc3RyaXBRdWVyeUFuZEhhc2ggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIj9cIilcbiAgY29uc3QgaGFzaEluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIiNcIilcblxuICBsZXQgZW5kSW5kZXggPSBmaWxlUGF0aC5sZW5ndGhcblxuICBpZiAocXVlcnlJbmRleCAhPT0gLTEgJiYgaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KVxuICB9IGVsc2UgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBxdWVyeUluZGV4XG4gIH0gZWxzZSBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gaGFzaEluZGV4XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguc2xpY2UoMCwgZW5kSW5kZXgpXG59XG5cbmNvbnN0IGdldEV4dGVuc2lvbiA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gc3RyaXBRdWVyeUFuZEhhc2goZmlsZVBhdGgpXG4gIGNvbnN0IGxhc3REb3RJbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiLlwiKVxuXG4gIGlmIChsYXN0RG90SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIvXCIpLFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxcbiAgKVxuXG4gIGlmIChsYXN0U2xhc2hJbmRleCA+IGxhc3REb3RJbmRleCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc2xpY2UobGFzdERvdEluZGV4KS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlUGF0aClcblxuICBjb25zdCB0cmFuc2Zvcm1zOiBTdWNyYXNlVHJhbnNmb3JtW10gPSBbXCJpbXBvcnRzXCJdXG5cbiAgaWYgKFRTX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnVuc2hpZnQoXCJ0eXBlc2NyaXB0XCIpXG4gIH1cblxuICBpZiAoSlNYX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJqc3hcIilcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1XaXRoU3VjcmFzZSA9IChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtcyA9IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aChmaWxlUGF0aClcbiAgY29uc3Qgc2FuaXRpemVkQ29kZSA9IHN0cmlwVHlwZVN0YXJFeHBvcnRzKGNvZGUpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oc2FuaXRpemVkQ29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbm9kZS1tb2R1bGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMsIGZzTWFwIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBPbmx5IHJ1biB2YWxpZGF0aW9uIGlmIHBhY2thZ2UuanNvbiBleGlzdHMgKGNhbid0IHZhbGlkYXRlIHdpdGhvdXQgaXQpXG4gIGNvbnN0IGhhc1BhY2thZ2VKc29uID0gISFmc01hcFtcInBhY2thZ2UuanNvblwiXVxuXG4gIGlmIChoYXNQYWNrYWdlSnNvbikge1xuICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgaWYgKCFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIC8vIE9ubHkgcnVuIFN0ZXBzIDItNCBpZiBwYWNrYWdlIGV4aXN0cyBpbiBub2RlX21vZHVsZXMgKGFmdGVyIHJlc29sdmVyIGF0dGVtcHRzKVxuICBpZiAoaGFzUGFja2FnZUpzb24gJiYgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIC8vIFN0ZXAgMjogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gICAgY29uc3Qgbm9kZU1vZHVsZURpciA9IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoaW1wb3J0TmFtZSwgZnNNYXApXG4gICAgaWYgKCFub2RlTW9kdWxlRGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAgICBjb25zdCBlbnRyeXBvaW50ID0gZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgIGlmIChlbnRyeXBvaW50ICYmIGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICBpZiAoaXNEaXN0RGlyRW1wdHkoaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIGRpc3QsIGRpZCB5b3UgZm9yZ2V0IHRvIHRyYW5zcGlsZT9cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgZGVidWcoYEF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiB1c2luZyBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBwbGF0Zm9ybS5ub2RlTW9kdWxlc1Jlc29sdmVyKGltcG9ydE5hbWUpXG5cbiAgICAgICAgaWYgKGZpbGVDb250ZW50KSB7XG4gICAgICAgICAgZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNvbHZlZCBcIiR7aW1wb3J0TmFtZX1cIiB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHJlc29sdmVkIGNvbnRlbnQgdG8gZnNNYXAgd2l0aCBhIHN5bnRoZXRpYyBwYXRoXG4gICAgICAgICAgLy8gQWRkIC50cyBleHRlbnNpb24gdG8gZW5zdXJlIGl0J3MgdHJlYXRlZCBhcyBhIG1vZHVsZSBmaWxlXG4gICAgICAgICAgY29uc3Qgc3ludGhldGljUGF0aCA9IGBub2RlX21vZHVsZXMvJHtpbXBvcnROYW1lfS50c2BcbiAgICAgICAgICBjdHguZnNNYXBbc3ludGhldGljUGF0aF0gPSBmaWxlQ29udGVudFxuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBmaWxlIHVzaW5nIHRoZSBub3JtYWwgZmxvd1xuICAgICAgICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShzeW50aGV0aWNQYXRoLCBjdHgsIGRlcHRoKVxuXG4gICAgICAgICAgLy8gTWFwIHRoZSBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICAvLyBBbHNvIG1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXhcbiAgICAgICAgICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHN5bnRoZXRpY1BhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciByZXR1cm5lZCBudWxsIGZvciBcIiR7aW1wb3J0TmFtZX1cImApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiOmAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgbm90IGZvdW5kYClcbiAgfVxuXG4gIC8vIFVzZSBpbXBvcnRMb2NhbEZpbGUgdG8gaGFuZGxlIHRoZSBub2RlIG1vZHVsZVxuICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCwgY3R4LCBkZXB0aClcblxuICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGUncyBleHBvcnRzXG4gIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIE1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXggZm9yIGRpcmVjdCBpbXBvcnRzXG4gIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gSGFuZGxlIGluZGV4IGZpbGVzIHNwZWNpYWxseVxuICBpZiAoXG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c3hcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzXCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC5qc1wiKVxuICApIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9cXC9pbmRleFxcLih0c3g/fGpzKSQvLCBcIlwiKVxuICAgIGNvbnN0IHVucHJlZml4ZWREaXJQYXRoID0gZGlyUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZERpclBhdGhdID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gICAgLy8gSGFuZGxlIHNjb3BlZCBwYWNrYWdlc1xuICAgIGlmICh1bnByZWZpeGVkRGlyUGF0aC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHVucHJlZml4ZWREaXJQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgaWYgKHNjb3BlUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVkTmFtZSA9IGAke3Njb3BlUGFydHNbMF19LyR7c2NvcGVQYXJ0c1sxXX1gXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tzY29wZWROYW1lXSA9XG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSBmcm9tIGFuIGltcG9ydCBuYW1lXG4gKiBIYW5kbGVzIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHNcbiAqXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJAc2NvcGUvcGFja2FnZS9zdWJwYXRoXCIgLT4gXCJAc2NvcGUvcGFja2FnZVwiXG4gKiAtIFwibG9kYXNoL2dldFwiIC0+IFwibG9kYXNoXCJcbiAqIC0gXCJyZWFjdFwiIC0+IFwicmVhY3RcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShpbXBvcnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIC8vIFNjb3BlZCBwYWNrYWdlOiBAc2NvcGUvcGFja2FnZSBvciBAc2NvcGUvcGFja2FnZS9zdWJwYXRoXG4gICAgY29uc3QgcGFydHMgPSBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKVxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IHBhcnRzLmxlbmd0aCA+PSAyID8gYCR7cGFydHNbMF19LyR7cGFydHNbMV19YCA6IGltcG9ydE5hbWVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZWd1bGFyIHBhY2thZ2U6IHBhY2thZ2Ugb3IgcGFja2FnZS9zdWJwYXRoXG4gICAgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgfVxuICByZXR1cm4gYmFzZVBhY2thZ2VOYW1lXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24gKGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBvciBwZWVyRGVwZW5kZW5jaWVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtcInBhY2thZ2UuanNvblwiXVxuICBpZiAoIXBhY2thZ2VKc29uQ29udGVudCkge1xuICAgIC8vIE5vIHBhY2thZ2UuanNvbiBtZWFucyB3ZSBjYW4ndCB2YWxpZGF0ZSAtIGFsbG93IHRoZSBpbXBvcnRcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSAoaGFuZGxlIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHMpXG4gICAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcblxuICAgIHJldHVybiAoXG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gcGVlckRlcGVuZGVuY2llc1xuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgcGFja2FnZS5qc29uLCBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyBmb3IgdGhlIHBhY2thZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IG5vZGVNb2R1bGVQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX1gXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIHRoaXMgcGF0aCBpbiBmc01hcFxuICBjb25zdCBoYXNGaWxlcyA9IE9iamVjdC5rZXlzKGZzTWFwKS5zb21lKFxuICAgIChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgobm9kZU1vZHVsZVBhdGggKyBcIi9cIikgfHwgcGF0aCA9PT0gbm9kZU1vZHVsZVBhdGgsXG4gIClcblxuICByZXR1cm4gaGFzRmlsZXMgPyBub2RlTW9kdWxlUGF0aCA6IG51bGxcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogR2V0IHRoZSBlbnRyeXBvaW50IGZyb20gcGFja2FnZS5qc29uICh0aGUgXCJtYWluXCIgb3IgXCJtb2R1bGVcIiBmaWVsZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VKc29uRW50cnlwb2ludChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYFxuXG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IGZzTWFwW3BhY2thZ2VKc29uUGF0aF1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIC8vIFRyeSBtYWluLCBtb2R1bGUsIG9yIGV4cG9ydHMgZmllbGQgKGluIG9yZGVyIG9mIHByZWZlcmVuY2UpXG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gfHwgcGFja2FnZUpzb24ubW9kdWxlIHx8IG51bGxcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hlY2sgaWYgdGhlIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQoZW50cnlwb2ludDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5cG9pbnQpIHJldHVybiBmYWxzZVxuICByZXR1cm4gZW50cnlwb2ludC5lbmRzV2l0aChcIi50c1wiKSB8fCBlbnRyeXBvaW50LmVuZHNXaXRoKFwiLnRzeFwiKVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBleGlzdHMgYW5kIGhhcyBmaWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXN0RGlyRW1wdHkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IGRpc3RQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vZGlzdGBcblxuICAvLyBDaGVjayBpZiBhbnkgZmlsZXMgZXhpc3QgdW5kZXIgZGlzdC9cbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZSgocGF0aCkgPT5cbiAgICBwYXRoLnN0YXJ0c1dpdGgoZGlzdFBhdGggKyBcIi9cIiksXG4gIClcblxuICByZXR1cm4gIWhhc0ZpbGVzXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwibGliL3RyYW5zcGlsZS90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5wbS1wYWNrYWdlXCIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cih1cmw6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vXCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgfVxuICByZXR1cm4gdXJsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROcG1QYWNrYWdlKFxuICB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCA9IDAsXG4gICAgZnJvbUpzRGVsaXZyID0gZmFsc2UsXG4gIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nOyBkZXB0aD86IG51bWJlcjsgZnJvbUpzRGVsaXZyPzogYm9vbGVhbiB9LFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZTogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkgcmV0dXJuXG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIGJlZm9yZSBmZXRjaGluZyBmcm9tIGpzRGVsaXZyXG4gIC8vIFNraXAgdGhpcyBjaGVjayBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKHN1Yi1pbXBvcnRzIGZyb20ganNEZWxpdnIgcGFja2FnZXMpXG4gIGlmICghZnJvbUpzRGVsaXZyICYmICFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBhY2thZ2UgXCIke2ltcG9ydE5hbWV9XCIgaXMgbm90IGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbi4gYCArXG4gICAgICAgIGBBZGQgaXQgdG8gZGVwZW5kZW5jaWVzIG9yIGRldkRlcGVuZGVuY2llcyBiZWZvcmUgaW1wb3J0aW5nLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgICBmcm9tSnNEZWxpdnI6IHRydWUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtZXZhbC1wYXRoXCIpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRFdmFsUGF0aChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbiAgb3B0czoge1xuICAgIGN3ZD86IHN0cmluZ1xuICAgIGZyb21Kc0RlbGl2cj86IGJvb2xlYW5cbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG4gIGN0eC5sb2dnZXIuaW5mbyhcbiAgICBgaW1wb3J0RXZhbFBhdGgoXCIke2ltcG9ydE5hbWV9XCIsIHtjd2Q6IFwiJHtvcHRzLmN3ZH1cIiwgZGVwdGg6ICR7ZGVwdGh9fSlgLFxuICApXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBkaXNhYmxlQ2RuTG9hZGluZyA9XG4gICAgY3R4LmRpc2FibGVDZG5Mb2FkaW5nIHx8IChnbG9iYWxUaGlzIGFzIGFueSkuX19ESVNBQkxFX0NETl9MT0FESU5HX19cblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGltcG9ydHMgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgKGUuZy4sIFwicmVhY3QvanN4LXJ1bnRpbWVcIilcbiAgLy8gSWYgdGhlIGJhc2UgcGFja2FnZSBpcyBpbiBwcmVTdXBwbGllZEltcG9ydHMsIHRyeSB0byBpbXBvcnQgZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgaWYgKFxuICAgIGltcG9ydE5hbWUuaW5jbHVkZXMoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICApIHtcbiAgICBjb25zdCBiYXNlUGtnID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgICBjb25zdCBpc1Njb3BlZCA9IGJhc2VQa2cuc3RhcnRzV2l0aChcIkBcIilcbiAgICBjb25zdCBwa2dOYW1lID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgMikuam9pbihcIi9cIilcbiAgICAgIDogYmFzZVBrZ1xuICAgIGNvbnN0IHN1YnBhdGggPSBpc1Njb3BlZFxuICAgICAgPyBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgyKS5qb2luKFwiL1wiKVxuICAgICAgOiBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgxKS5qb2luKFwiL1wiKVxuXG4gICAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGltcG9ydCB0aGUgc3VicGF0aCBmcm9tIHRoZSBhY3R1YWwgcGFja2FnZVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGltcG9ydChgJHtwa2dOYW1lfS8ke3N1YnBhdGh9YClcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcmVzb2x2ZWRcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgcmVzb2x2ZWQgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgYmFzZSBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiYCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHRoZSBkeW5hbWljIGltcG9ydCBmYWlscywgY29udGludWUgd2l0aCBub3JtYWwgcmVzb2x1dGlvblxuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIHBhY2thZ2UgXCIke3BrZ05hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBub3JtYWwgcmVzb2x1dGlvbmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZGVwdGggPiAzMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZCAoMzApIEltcG9ydCBQYXRoOiAke2N0eC5pbXBvcnRTdGFjay5qb2luKFwiIC0+IFwiKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvbnBtL1wiKSkge1xuICAgIGNvbnN0IHBrZ05hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoL15cXC9ucG1cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7cGtnTmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke3BrZ05hbWV9XCIpYClcbiAgICAvLyAvbnBtLyBwYXRocyBhcmUgYWx3YXlzIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGZyb20ganNEZWxpdnJcbiAgICBhd2FpdCBpbXBvcnROcG1QYWNrYWdlKFxuICAgICAgeyBpbXBvcnROYW1lOiBwa2dOYW1lLCBkZXB0aCwgZnJvbUpzRGVsaXZyOiB0cnVlIH0sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGVyZSB0c2NvbmZpZy5qc29uIGlzIGxvY2F0ZWRcbiAgbGV0IHRzY29uZmlnRGlyID0gXCIuXCJcbiAgbGV0IHRzQ29uZmlnVG9Vc2UgPSBjdHgudHNDb25maWdcbiAgaWYgKGN0eC50c0NvbmZpZyAmJiBvcHRzLmN3ZCkge1xuICAgIC8vIElmIGN3ZCBpcyBpbiBub2RlX21vZHVsZXMsIGZpbmQgdGhlIHBhY2thZ2Ugcm9vdFxuICAgIC8vIGUuZy4sIFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeS9saWIvZ2VuZXJhdGVkXCIgLT4gXCJub2RlX21vZHVsZXMvYWRvbS1saWJyYXJ5XCJcbiAgICBjb25zdCBub2RlTW9kdWxlc01hdGNoID0gb3B0cy5jd2QubWF0Y2goL14obm9kZV9tb2R1bGVzXFwvW15cXC9dKykvKVxuICAgIGlmIChub2RlTW9kdWxlc01hdGNoKSB7XG4gICAgICB0c2NvbmZpZ0RpciA9IG5vZGVNb2R1bGVzTWF0Y2hbMV1cbiAgICAgIHRzQ29uZmlnVG9Vc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogdHNDb25maWdUb1VzZSwgdHNjb25maWdEaXIgfSxcbiAgKVxuICBpZiAocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydExvY2FsRmlsZShcIiR7cmVzb2x2ZWRMb2NhbEltcG9ydFBhdGh9XCIpYClcbiAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgsIGN0eCwgZGVwdGgpXG4gICAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSAod2hpY2ggbWlnaHQgYmUgYSB0c2NvbmZpZyBwYXRoIGFsaWFzKSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgaWYgKGltcG9ydE5hbWUgIT09IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGhdXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBwYXR0ZXJuIGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZVxuICAvLyBJZiBzbywgdGhyb3cgYW4gZXJyb3IgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gbnBtXG4gIGNvbnN0IHRzQ29uZmlnID0gY3R4LnRzQ29uZmlnID8/IGdldFRzQ29uZmlnKGN0eC5mc01hcClcbiAgaWYgKCFjdHgudHNDb25maWcgJiYgdHNDb25maWcpIHtcbiAgICBjdHgudHNDb25maWcgPSB0c0NvbmZpZ1xuICB9XG4gIGlmIChtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihpbXBvcnROYW1lLCB0c0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIGFsaWFzIGJ1dCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSR7b3B0cy5jd2QgPyBgIGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aD1cIiR7cmVzb2x2ZWROb2RlTW9kdWxlUGF0aH1cImApXG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIElmIG5vdCBmb3VuZCBpbiBmc01hcCBidXQgbWlnaHQgYmUgYSBub2RlIG1vZHVsZSwgdHJ5IGltcG9ydE5vZGVNb2R1bGVcbiAgLy8gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIHVzZSBub2RlTW9kdWxlc1Jlc29sdmVyIGlmIGNvbmZpZ3VyZWRcbiAgaWYgKFxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpXG4gICkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgIGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKSB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBucG0gQ0ROYCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudCBhbmQgYXV0b21hdGljIG5wbSByZXNvbHV0aW9uIGlzIGRpc2FibGVkLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRTbmlwcGV0KFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIC8vIFZhbGlkYXRpb24gc3RlcHMgZm9yIG5vZGUgbW9kdWxlcyAoYmVmb3JlIGpzRGVsaXZyIGZhbGxiYWNrKVxuICAgIGlmICghb3B0cy5mcm9tSnNEZWxpdnIpIHtcbiAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb25cbiAgICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIChvbmx5IGlmIG5vdCBmb3VuZCBsb2NhbGx5IHlldClcbiAgICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgQ0ROIGxvYWRpbmcgaXMgZGlzYWJsZWQgKGkuZS4sIG5vIGZhbGxiYWNrIHRvIGpzRGVsaXZyIGF2YWlsYWJsZSlcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGN0eC5mc01hcClcbiAgICAgIGlmICghbm9kZU1vZHVsZURpciAmJiBkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiB0aGUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDM6IENoZWNrIGlmIG1haW4gZW50cnlwb2ludCBpcyBhIFR5cGVTY3JpcHQgZmlsZSAob25seSBpZiBkaXIgZXhpc3RzKVxuICAgICAgaWYgKG5vZGVNb2R1bGVEaXIpIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBhIHR5cGVzY3JpcHQgZW50cnlwb2ludCB0aGF0IGlzIHVuc3VwcG9ydGVkXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgaXMgZW1wdHkgd2hlbiBtYWluIHBvaW50cyB0byBkaXN0XG4gICAgICAgIGlmIChlbnRyeXBvaW50ICYmIGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlKFxuICAgICAgeyBpbXBvcnROYW1lLCBkZXB0aCwgZnJvbUpzRGVsaXZyOiBvcHRzLmZyb21Kc0RlbGl2ciB9LFxuICAgICAgY3R4LFxuICAgIClcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5yZXNvbHZlZCBpbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgJHtvcHRzLmN3ZCA/IGBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCwgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwibGliL2V2YWxcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBnZXRUc0NvbmZpZyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCB9IGZyb20gXCIuL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiXG5pbXBvcnQgeyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgfSBmcm9tIFwibGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgc2V0VmFsdWVBdFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9vYmotcGF0aFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0RGlzYWJsZUNkbkxvYWRpbmcoZGlzYWJsZTogYm9vbGVhbikge1xuICAgIDsodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gYXMgYW55KS5kaXNhYmxlQ2RuTG9hZGluZyA9IGRpc2FibGVcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGhPclRocm93IH0gZnJvbSBcIi4vcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOnNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiKVxuXG5leHBvcnQgY29uc3Qgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkID0gKG9wdHM6IHtcbiAgZW50cnlwb2ludD86IHN0cmluZ1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn0pID0+IHtcbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgIW9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBpZiAoXCJpbmRleC50c3hcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c3hcIlxuICAgIH0gZWxzZSBpZiAoXCJpbmRleC50c1wiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzXCJcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LmtleXMob3B0cy5mc01hcCkuZmlsdGVyKChrKSA9PiBrLmVuZHNXaXRoKFwiLnRzeFwiKSkubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gT2JqZWN0LmtleXMob3B0cy5mc01hcClbMF1cbiAgICB9IGVsc2UgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IG9wdHMuZnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICAgICAgaWYgKGNvbmZpZy5tYWluRW50cnlwb2ludCkge1xuICAgICAgICAgIG9wdHMuZW50cnlwb2ludCA9IGNvbmZpZy5tYWluRW50cnlwb2ludFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0c2NpcmN1aXQuY29uZmlnLmpzb246XCIsIGUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZW50cnlwb2ludCBvciBtYWluQ29tcG9uZW50UGF0aCBtdXN0IGJlIHByb3ZpZGVkIChubyBpbmRleCBmaWxlLCBjb3VsZCBub3QgaW5mZXIgZW50cnlwb2ludClcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiBvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgb3B0cy5lbnRyeXBvaW50ID0gXCJlbnRyeXBvaW50LnRzeFwiXG4gICAgY29uc3QgbWFpbkNvbXBvbmVudENvZGUgPVxuICAgICAgb3B0cy5mc01hcFtyZXNvbHZlRmlsZVBhdGhPclRocm93KG9wdHMubWFpbkNvbXBvbmVudFBhdGgsIG9wdHMuZnNNYXApXVxuICAgIGlmICghbWFpbkNvbXBvbmVudENvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1haW4gY29tcG9uZW50IHBhdGggXCIke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCIgbm90IGZvdW5kIGluIGZzTWFwLiBBdmFpbGFibGUgcGF0aHM6ICR7T2JqZWN0LmtleXMob3B0cy5mc01hcCkuam9pbihcIiwgXCIpfWAsXG4gICAgICApXG4gICAgfVxuICAgIG9wdHMuZnNNYXBbb3B0cy5lbnRyeXBvaW50XSA9IGBcbiAgICAgaW1wb3J0ICogYXMgVXNlckNvbXBvbmVudHMgZnJvbSBcIi4vJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiO1xuICAgICAgICAgIFxuICAgICAgJHtcbiAgICAgICAgb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICAgICAgICAgID8gYFxuICAgICAgICBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzW1wiJHtvcHRzLm1haW5Db21wb25lbnROYW1lfVwiXVxuICAgICAgICBgXG4gICAgICAgICAgOiBgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50cy5kZWZhdWx0IHx8IFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKFVzZXJDb21wb25lbnRzKVxuICAgICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgICAubWFwKChbXywgY29tcG9uZW50XSkgPT4gY29tcG9uZW50KVswXSB8fCAoKCkgPT4gbnVsbCk7YFxuICAgICAgfVxuXG4gICAgICAgICAgICR7XG4gICAgICAgICAgICAgZGVidWcuZW5hYmxlZFxuICAgICAgICAgICAgICAgPyBgXG4gICAgIGNvbnNvbGUubG9nKHsgVXNlckNvbXBvbmVudHMgfSlcbiAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnRUb1JlbmRlciBcIiArIENvbXBvbmVudFRvUmVuZGVyLnRvU3RyaW5nKCksICB7IENvbXBvbmVudFRvUmVuZGVyIH0pXG4gICAgIGBcbiAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICB9XG5cbiAgICAgIGNpcmN1aXQuYWRkKCAgICAgICBcbiAgICAgICAgICA8Q29tcG9uZW50VG9SZW5kZXIgJHtvcHRzLm1haW5Db21wb25lbnRQcm9wcyA/IGB7Li4uJHtKU09OLnN0cmluZ2lmeShvcHRzLm1haW5Db21wb25lbnRQcm9wcywgbnVsbCwgMil9fWAgOiBcIlwifSAvPiBcbiAgICAgICk7XG5gXG4gIH1cblxuICBpZiAoIW9wdHMubmFtZSAmJiBvcHRzLm1haW5Db21wb25lbnROYW1lKSB7XG4gICAgb3B0cy5uYW1lID0gb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmcsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICBlbnRyeXBvaW50ICYmXG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJvb3RDaXJjdWl0IGhhcyBubyBjaGlsZHJlblwiKSAmJlxuICAgICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdcImVudHJ5cG9pbnRcIjonKVxuICApIHtcbiAgICBjb25zdCBlbnRyeXBvaW50TWVzc2FnZSA9IGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IGVudHJ5cG9pbnQuc2xpY2UoMilcbiAgICAgIDogZW50cnlwb2ludFxuICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfS4gXCJlbnRyeXBvaW50XCI6IFwiJHtlbnRyeXBvaW50TWVzc2FnZX1cIiBpcyBzZXQgaW4gdGhlIHJ1bm5lciBjb25maWd1cmF0aW9uLCBlbnRyeXBvaW50cyBtdXN0IGNvbnRhaW4gXCJjaXJjdWl0LmFkZCguLi4pXCIsIHlvdSBtaWdodCBiZSBsb29raW5nIHRvIHVzZSBtYWluQ29tcG9uZW50UGF0aCBpbnN0ZWFkIGlmIHlvdXIgZmlsZSBleHBvcnRzIGEgY29tcG9uZW50LmBcbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuIiwgIi8qKlxuICogR2V0IGFsbCBwYXRocyBvZiBhbiBvYmplY3RcbiAqXG4gKiBnZXRPYmplY3RQYXRocyh7IGE6IHsgYjogMiwgYzogeyBkOiAzIH0gfSwgZTogNSB9KVxuICpcbiAqIC8vIE91dHB1dDogWydhLmInLCAnYS5jLmQnLCAnZSddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RQYXRocyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcmVmaXggPSBcIlwiLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG4gICAgY29uc3QgcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGhzID0gZ2V0T2JqZWN0UGF0aHModmFsdWUsIHBhdGgpXG4gICAgICBwYXRocy5wdXNoKC4uLnN1YlBhdGhzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUF0UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIGF0IGEgcGF0aCBpbiBhbiBvYmplY3RcbiAqXG4gKiBzZXRWYWx1ZUF0UGF0aCh7IGE6IHsgYjogMiB9IH0sIFwiYS5jLmRcIiwgNSlcbiAqXG4gKiAvLyBPdXRwdXQ6IHsgYTogeyBiOiAyLCBjOiB7IGQ6IDUgfSB9IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQXRQYXRoKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbikge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuXG4gICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3Qga2V5LCBzZXQgdGhlIHZhbHVlLlxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgYW4gb2JqZWN0IChhdm9pZCBvdmVyd3JpdGluZyBhcnJheXMpLCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSB8fFxuICAgICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGN1cnJlbnRba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fVxuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB7IGdldE9iamVjdFBhdGhzLCBnZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCIuL3NoYXJlZC9vYmotcGF0aFwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChjZG5VcmwpLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSlcbiAgICB3b3JrZXJCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh3b3JrZXJCbG9iKVxuICB9XG5cbiAgY29uc3QgcmF3V29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJCbG9iVXJsLCB7IHR5cGU6IFwibW9kdWxlXCIgfSlcbiAgbGV0IHdvcmtlckluaXRFcnJvcjogYW55XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIEVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgICB3b3JrZXJJbml0RXJyb3IgPSBldmVudFxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gVW5oYW5kbGVkIHJlamVjdGlvbiBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZWVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBNZXNzYWdlIGVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgY29uc3QgZWFybHlNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBNZXNzYWdlIGluIHdvcmtlclwiLCBldmVudClcbiAgfVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIYW5kbGUgZmV0Y2ggcmVxdWVzdHMgZnJvbSB0aGUgd29ya2VyXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhXG4gICAgaWYgKGRhdGE/LnR5cGUgIT09IFwid29ya2VyX2ZldGNoXCIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChkYXRhLmlucHV0LCBkYXRhLmluaXQpXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBpZiAod29ya2VySW5pdEVycm9yKSB7XG4gICAgdGhyb3cgd29ya2VySW5pdEVycm9yXG4gIH1cblxuICBjb25zdCBjb21saW5rV29ya2VyID0gQ29tbGluay53cmFwPEludGVybmFsV2ViV29ya2VyQXBpPihyYXdXb3JrZXIpXG5cbiAgcmF3V29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGVscGVyIHRvIHNlcmlhbGl6ZSBSZWFjdCBlbGVtZW50cyBmb3IgY3Jvc3Mtd29ya2VyIGNvbW11bmljYXRpb25cbiAgZnVuY3Rpb24gc2VyaWFsaXplUmVhY3RFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgUmVhY3QgZWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19pc1NlcmlhbGl6ZWRSZWFjdEVsZW1lbnQ6IHRydWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgcHJvcHM6IHNlcmlhbGl6ZVByb3BzKGVsZW1lbnQucHJvcHMpLFxuICAgICAgICBrZXk6IGVsZW1lbnQua2V5LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICBmdW5jdGlvbiBzZXJpYWxpemVQcm9wcyhwcm9wczogYW55KTogYW55IHtcbiAgICBpZiAoIXByb3BzIHx8IHR5cGVvZiBwcm9wcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHByb3BzXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZDogYW55ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2hpbGRyZW5cIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gdmFsdWUubWFwKHNlcmlhbGl6ZVJlYWN0RWxlbWVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJpYWxpemVkW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZFxuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWxseSBvdmVycmlkZSBnbG9iYWwgZmV0Y2ggaW5zaWRlIHRoZSB3b3JrZXIgdG8gcm91dGUgdGhyb3VnaCB0aGUgcGFyZW50XG4gIC8vIE9ubHkgZW5hYmxlIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgdmlhIGNvbmZpZ3VyYXRpb25cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZW5hYmxlRmV0Y2hQcm94eSkge1xuICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6IFwib3ZlcnJpZGVfZ2xvYmFsX2ZldGNoXCIgfSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLmRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXREaXNhYmxlQ2RuTG9hZGluZyh0cnVlKVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRTbmlwcGV0c0FwaUJhc2VVcmwoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpXG4gIH1cblxuICBjb25zdCBtYXliZVByb3h5ID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBDb21saW5rLnByb3h5KHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnBsYXRmb3JtKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSwgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHBsYXRmb3JtIGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQcm9qZWN0Q29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZywgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHByb2plY3QgY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBlbmFibGVEZWJ1ZzogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZW5hYmxlRGVidWdcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmVuYWJsZURlYnVnLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHZlcnNpb246IGNvbWxpbmtXb3JrZXIudmVyc2lvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGV4ZWN1dGU6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGUuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgZXhlY3V0ZUNvbXBvbmVudDogYXN5bmMgKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVDb21wb25lbnRcIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHBhc3MgaXQgYXMtaXMgKHdpbGwgYmUgcHJveGllZCBieSBDb21saW5rKVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgUmVhY3QgZWxlbWVudCwgc2VyaWFsaXplIGl0IHRvIGEgcmVjb25zdHJ1Y3RhYmxlIGZvcm1hdFxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIGNvbXBvbmVudC50eXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRFbGVtZW50ID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KGNvbXBvbmVudClcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKFxuICAgICAgICAgIHNlcmlhbGl6ZWRFbGVtZW50LFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSB3cmFwcGVyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgOyh3cmFwcGVyIGFzIGFueSkuX19yYXdXb3JrZXIgPSByYXdXb3JrZXJcbiAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gd3JhcHBlclxuICByZXR1cm4gd3JhcHBlclxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IGNvbnN0IGdldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzID0gKFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbcGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKHBhdGgpXSA9IGNvbnRlbnRcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBub3JtYWxpemVkRnNNYXApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShub3JtYWxpemVkRnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl0pXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5tYWluRW50cnlwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwb3NzaWJsZS5hZGQobm9ybWFsaXplRmlsZVBhdGgoY29uZmlnLm1haW5FbnRyeXBvaW50KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c3hcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzeFwiKVxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHNcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzXCIpXG5cbiAgY29uc3QgY2lyY3VpdEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi5jaXJjdWl0LnRzeFwiKSxcbiAgKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY2lyY3VpdEZpbGVzKSB7XG4gICAgcG9zc2libGUuYWRkKGZpbGUpXG4gIH1cblxuICBjb25zdCB0c3hGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIudHN4XCIpLFxuICApXG4gIGlmICh0c3hGaWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBwb3NzaWJsZS5hZGQodHN4RmlsZXNbMF0pXG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShwb3NzaWJsZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLG1CQUFtQjtBQUU1QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFdBQVc7QUFDdkIsWUFBWSxxQkFBcUI7QUFDakMsWUFBWSx3QkFBd0I7OztBQ0E3QixJQUFNLGdDQUFnQyxDQUMzQyxtQkFDdUI7QUFFdkIsTUFBSSxRQUFRLGVBQWUsTUFBTSxnQkFBZ0I7QUFDakQsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBSXpCLFVBQVEsZUFBZTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUV6QixTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLHFDQUFxQyxDQUNoRCxzQkFDVztBQUNYLE1BQUksa0JBQWtCLFNBQVMsS0FBSyxHQUFHO0FBQ3JDLFdBQU8sa0JBQWtCLFFBQVEsUUFBUSxFQUFFO0FBQUEsRUFDN0M7QUFDQSxTQUFPO0FBQ1Q7OztBQ0pPLElBQU0sdUJBQXVCLENBQ2xDLGNBQ3VCO0FBQ3ZCLE1BQUksQ0FBQyxVQUFXLFFBQU87QUFFdkIsTUFBSSxVQUFVLFdBQVcsUUFBUSxHQUFHO0FBQ2xDLFVBQU0sb0JBQW9CLDhCQUE4QixTQUFTO0FBQ2pFLFFBQUksbUJBQW1CO0FBQ3JCLGFBQU8sbUNBQW1DLGlCQUFpQjtBQUFBLElBQzdEO0FBR0EsV0FBTztBQUFBLEVBQ1Q7QUFHQSxTQUFPLG1DQUFtQyxTQUFTO0FBQ3JEOzs7QUNyQk8sSUFBTSxRQUFRLG9CQUFJLElBQWlCO0FBRTFDLElBQU0sb0JBQW9CLE9BQU8sTUFBVyxXQUFnQjtBQUMxRCxRQUFNLGNBQWMsSUFBSSxnQkFBZ0I7QUFBQSxJQUN0QyxHQUFHO0FBQUEsSUFDSCxNQUFNO0FBQUEsRUFDUixDQUFDLEVBQUUsU0FBUztBQUNaLE1BQUksTUFBTSxJQUFJLFdBQVcsR0FBRztBQUMxQixXQUFPLE1BQU0sSUFB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QixvQkFBWSxFQUFFO0FBQ3BDLGdCQUFVLFVBQVU7QUFDcEIscUJBQWU7QUFDZixVQUFJLFdBQVcsb0NBQW9DLFNBQVM7QUFDMUQsbUJBQVcsa0NBQWtDO0FBQUEsTUFDL0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNDLEVBQUMsUUFBZ0IsY0FBYztBQUNoQyxhQUFXLGtDQUFrQztBQUM3QyxTQUFPO0FBQ1Q7OztBQ3JSTyxJQUFNLHNDQUFzQyxDQUNqRCxVQUNhO0FBQ2IsUUFBTSxrQkFBMEMsQ0FBQztBQUNqRCxhQUFXLENBQUMsTUFBTSxPQUFPLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUNuRCxvQkFBZ0Isa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQUEsRUFDN0M7QUFFQSxRQUFNLFdBQVcsb0JBQUksSUFBWTtBQUVqQyxNQUFJLDJCQUEyQixpQkFBaUI7QUFDOUMsUUFBSTtBQUNGLFlBQU0sU0FBUyxLQUFLLE1BQU0sZ0JBQWdCLHVCQUF1QixDQUFDO0FBQ2xFLFVBQUksT0FBTyxPQUFPLG1CQUFtQixVQUFVO0FBQzdDLGlCQUFTLElBQUksa0JBQWtCLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFdBQVcsRUFBRyxVQUFTLElBQUksV0FBVztBQUMxRCxNQUFJLGdCQUFnQixVQUFVLEVBQUcsVUFBUyxJQUFJLFVBQVU7QUFFeEQsUUFBTSxlQUFlLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAidW5wcmVmaXhlZFBhdGgiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciXQp9Cg==