wxt 0.2.0 → 0.2.1
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/cli.cjs +98 -78
- package/dist/client.d.ts +44 -3
- package/dist/index.cjs +95 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +43 -4
- package/dist/index.js +75 -55
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -27,7 +27,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
var import_cac = __toESM(require("cac"), 1);
|
|
28
28
|
|
|
29
29
|
// package.json
|
|
30
|
-
var version = "0.2.
|
|
30
|
+
var version = "0.2.1";
|
|
31
31
|
|
|
32
32
|
// src/core/utils/getInternalConfig.ts
|
|
33
33
|
var import_node_path3 = __toESM(require("path"), 1);
|
|
@@ -328,32 +328,15 @@ function tsconfigPaths(config) {
|
|
|
328
328
|
});
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
-
// src/core/vite-plugins/hmrLogger.ts
|
|
332
|
-
var import_path4 = require("path");
|
|
333
|
-
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
334
|
-
function hmrLogger(config) {
|
|
335
|
-
return {
|
|
336
|
-
name: "wxt:hmr-logger",
|
|
337
|
-
apply: "serve",
|
|
338
|
-
handleHotUpdate(ctx) {
|
|
339
|
-
if (ctx.file.startsWith(config.srcDir) && !ctx.file.startsWith(config.wxtDir) && !ctx.file.endsWith(".html")) {
|
|
340
|
-
config.logger.info(
|
|
341
|
-
"Hot reload: " + import_picocolors.default.dim((0, import_path4.relative)(process.cwd(), ctx.file))
|
|
342
|
-
);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
|
|
348
331
|
// src/core/utils/createFsCache.ts
|
|
349
332
|
var import_fs_extra3 = __toESM(require("fs-extra"), 1);
|
|
350
|
-
var
|
|
333
|
+
var import_path4 = require("path");
|
|
351
334
|
function createFsCache(wxtDir) {
|
|
352
|
-
const getPath = (key) => (0,
|
|
335
|
+
const getPath = (key) => (0, import_path4.resolve)(wxtDir, "cache", encodeURIComponent(key));
|
|
353
336
|
return {
|
|
354
337
|
async set(key, value) {
|
|
355
338
|
const path5 = getPath(key);
|
|
356
|
-
await (0, import_fs_extra3.ensureDir)((0,
|
|
339
|
+
await (0, import_fs_extra3.ensureDir)((0, import_path4.dirname)(path5));
|
|
357
340
|
await import_fs_extra3.default.writeFile(path5, value, "utf-8");
|
|
358
341
|
},
|
|
359
342
|
async get(key) {
|
|
@@ -498,7 +481,6 @@ async function getInternalConfig(config, command) {
|
|
|
498
481
|
);
|
|
499
482
|
finalConfig.vite.plugins.push(devServerGlobals(finalConfig));
|
|
500
483
|
finalConfig.vite.plugins.push(tsconfigPaths(finalConfig));
|
|
501
|
-
finalConfig.vite.plugins.push(hmrLogger(finalConfig));
|
|
502
484
|
finalConfig.vite.define ??= {};
|
|
503
485
|
getGlobals(finalConfig).forEach((global) => {
|
|
504
486
|
finalConfig.vite.define[global.name] = JSON.stringify(global.value);
|
|
@@ -510,7 +492,7 @@ async function resolveManifestConfig(env, manifest) {
|
|
|
510
492
|
}
|
|
511
493
|
|
|
512
494
|
// src/index.ts
|
|
513
|
-
var
|
|
495
|
+
var import_picocolors3 = __toESM(require("picocolors"), 1);
|
|
514
496
|
var vite5 = __toESM(require("vite"), 1);
|
|
515
497
|
|
|
516
498
|
// src/core/utils/arrays.ts
|
|
@@ -614,11 +596,11 @@ var vite2 = __toESM(require("vite"), 1);
|
|
|
614
596
|
|
|
615
597
|
// src/core/utils/removeEmptyDirs.ts
|
|
616
598
|
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
617
|
-
var
|
|
599
|
+
var import_path5 = __toESM(require("path"), 1);
|
|
618
600
|
async function removeEmptyDirs(dir) {
|
|
619
601
|
const files = await import_fs_extra4.default.readdir(dir);
|
|
620
602
|
for (const file of files) {
|
|
621
|
-
const filePath =
|
|
603
|
+
const filePath = import_path5.default.join(dir, file);
|
|
622
604
|
const stats = await import_fs_extra4.default.stat(filePath);
|
|
623
605
|
if (stats.isDirectory()) {
|
|
624
606
|
await removeEmptyDirs(filePath);
|
|
@@ -633,7 +615,7 @@ async function removeEmptyDirs(dir) {
|
|
|
633
615
|
// src/core/build/buildEntrypoints.ts
|
|
634
616
|
var import_fast_glob = __toESM(require("fast-glob"), 1);
|
|
635
617
|
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
636
|
-
var
|
|
618
|
+
var import_path6 = require("path");
|
|
637
619
|
async function buildEntrypoints(groups, config) {
|
|
638
620
|
const steps = [];
|
|
639
621
|
for (const group of groups) {
|
|
@@ -725,9 +707,9 @@ async function copyPublicDirectory(config) {
|
|
|
725
707
|
return publicAssets;
|
|
726
708
|
const files = await (0, import_fast_glob.default)("**/*", { cwd: config.publicDir });
|
|
727
709
|
for (const file of files) {
|
|
728
|
-
const srcPath = (0,
|
|
729
|
-
const outPath = (0,
|
|
730
|
-
await import_fs_extra5.default.ensureDir((0,
|
|
710
|
+
const srcPath = (0, import_path6.resolve)(config.publicDir, file);
|
|
711
|
+
const outPath = (0, import_path6.resolve)(config.outDir, file);
|
|
712
|
+
await import_fs_extra5.default.ensureDir((0, import_path6.dirname)(outPath));
|
|
731
713
|
await import_fs_extra5.default.copyFile(srcPath, outPath);
|
|
732
714
|
publicAssets.push({
|
|
733
715
|
type: "asset",
|
|
@@ -741,7 +723,7 @@ async function copyPublicDirectory(config) {
|
|
|
741
723
|
}
|
|
742
724
|
|
|
743
725
|
// src/core/build/findEntrypoints.ts
|
|
744
|
-
var
|
|
726
|
+
var import_path8 = require("path");
|
|
745
727
|
var import_fs_extra7 = __toESM(require("fs-extra"), 1);
|
|
746
728
|
var import_picomatch = __toESM(require("picomatch"), 1);
|
|
747
729
|
var import_linkedom2 = require("linkedom");
|
|
@@ -751,7 +733,7 @@ var import_json5 = __toESM(require("json5"), 1);
|
|
|
751
733
|
var import_jiti = __toESM(require("jiti"), 1);
|
|
752
734
|
var import_unimport2 = require("unimport");
|
|
753
735
|
var import_fs_extra6 = __toESM(require("fs-extra"), 1);
|
|
754
|
-
var
|
|
736
|
+
var import_path7 = require("path");
|
|
755
737
|
var import_babel = __toESM(require("jiti/dist/babel"), 1);
|
|
756
738
|
async function importTsFile(path5, config) {
|
|
757
739
|
config.logger.debug("Loading file metadata:", path5);
|
|
@@ -773,7 +755,7 @@ async function importTsFile(path5, config) {
|
|
|
773
755
|
esmResolve: true,
|
|
774
756
|
interopDefault: true,
|
|
775
757
|
alias: {
|
|
776
|
-
"webextension-polyfill": (0,
|
|
758
|
+
"webextension-polyfill": (0, import_path7.resolve)(
|
|
777
759
|
config.root,
|
|
778
760
|
"node_modules/wxt/dist/virtual-modules/fake-browser.js"
|
|
779
761
|
)
|
|
@@ -805,7 +787,7 @@ async function findEntrypoints(config) {
|
|
|
805
787
|
const entrypoints = [];
|
|
806
788
|
await Promise.all(
|
|
807
789
|
relativePaths.map(async (relativePath) => {
|
|
808
|
-
const path5 = (0,
|
|
790
|
+
const path5 = (0, import_path8.resolve)(config.entrypointsDir, relativePath);
|
|
809
791
|
const matchingGlob = pathGlobs.find(
|
|
810
792
|
(glob3) => import_picomatch.default.isMatch(relativePath, glob3)
|
|
811
793
|
);
|
|
@@ -852,8 +834,8 @@ ${JSON.stringify(
|
|
|
852
834
|
if (withSameName) {
|
|
853
835
|
throw Error(
|
|
854
836
|
`Multiple entrypoints with the name "${entrypoint.name}" detected, but only one is allowed: ${[
|
|
855
|
-
(0,
|
|
856
|
-
(0,
|
|
837
|
+
(0, import_path8.relative)(config.root, withSameName.inputPath),
|
|
838
|
+
(0, import_path8.relative)(config.root, entrypoint.inputPath)
|
|
857
839
|
].join(", ")}`
|
|
858
840
|
);
|
|
859
841
|
}
|
|
@@ -942,7 +924,7 @@ async function getContentScriptEntrypoint(config, name, path5) {
|
|
|
942
924
|
type: "content-script",
|
|
943
925
|
name: getEntrypointName(config.entrypointsDir, path5),
|
|
944
926
|
inputPath: path5,
|
|
945
|
-
outputDir: (0,
|
|
927
|
+
outputDir: (0, import_path8.resolve)(config.outDir, "content-scripts"),
|
|
946
928
|
options
|
|
947
929
|
};
|
|
948
930
|
}
|
|
@@ -982,7 +964,7 @@ var PATH_GLOB_TO_TYPE_MAP = {
|
|
|
982
964
|
// src/core/build/generateTypesDir.ts
|
|
983
965
|
var import_unimport3 = require("unimport");
|
|
984
966
|
var import_fs_extra8 = __toESM(require("fs-extra"), 1);
|
|
985
|
-
var
|
|
967
|
+
var import_path9 = require("path");
|
|
986
968
|
async function generateTypesDir(entrypoints, config) {
|
|
987
969
|
await import_fs_extra8.default.ensureDir(config.typesDir);
|
|
988
970
|
const references = [];
|
|
@@ -993,7 +975,7 @@ async function generateTypesDir(entrypoints, config) {
|
|
|
993
975
|
await writeTsConfigFile(mainReference, config);
|
|
994
976
|
}
|
|
995
977
|
async function writeImportsDeclarationFile(config) {
|
|
996
|
-
const filePath = (0,
|
|
978
|
+
const filePath = (0, import_path9.resolve)(config.typesDir, "imports.d.ts");
|
|
997
979
|
const unimport2 = (0, import_unimport3.createUnimport)(getUnimportOptions(config));
|
|
998
980
|
await unimport2.scanImportsFromDir(void 0, { cwd: config.srcDir });
|
|
999
981
|
await import_fs_extra8.default.writeFile(
|
|
@@ -1005,7 +987,7 @@ async function writeImportsDeclarationFile(config) {
|
|
|
1005
987
|
return filePath;
|
|
1006
988
|
}
|
|
1007
989
|
async function writePathsDeclarationFile(entrypoints, config) {
|
|
1008
|
-
const filePath = (0,
|
|
990
|
+
const filePath = (0, import_path9.resolve)(config.typesDir, "paths.d.ts");
|
|
1009
991
|
const unions = entrypoints.map((entry) => {
|
|
1010
992
|
const path5 = getEntrypointBundlePath(
|
|
1011
993
|
entry,
|
|
@@ -1025,7 +1007,7 @@ async function writePathsDeclarationFile(entrypoints, config) {
|
|
|
1025
1007
|
return filePath;
|
|
1026
1008
|
}
|
|
1027
1009
|
async function writeGlobalsDeclarationFile(config) {
|
|
1028
|
-
const filePath = (0,
|
|
1010
|
+
const filePath = (0, import_path9.resolve)(config.typesDir, "globals.d.ts");
|
|
1029
1011
|
const globals = getGlobals(config);
|
|
1030
1012
|
await import_fs_extra8.default.writeFile(
|
|
1031
1013
|
filePath,
|
|
@@ -1042,14 +1024,14 @@ async function writeGlobalsDeclarationFile(config) {
|
|
|
1042
1024
|
}
|
|
1043
1025
|
async function writeMainDeclarationFile(references, config) {
|
|
1044
1026
|
const dir = config.wxtDir;
|
|
1045
|
-
const filePath = (0,
|
|
1027
|
+
const filePath = (0, import_path9.resolve)(dir, "wxt.d.ts");
|
|
1046
1028
|
await import_fs_extra8.default.writeFile(
|
|
1047
1029
|
filePath,
|
|
1048
1030
|
[
|
|
1049
1031
|
"// Generated by wxt",
|
|
1050
1032
|
`/// <reference types="vite/client" />`,
|
|
1051
1033
|
...references.map(
|
|
1052
|
-
(ref) => `/// <reference types="./${(0,
|
|
1034
|
+
(ref) => `/// <reference types="./${(0, import_path9.relative)(dir, ref)}" />`
|
|
1053
1035
|
)
|
|
1054
1036
|
].join("\n") + "\n"
|
|
1055
1037
|
);
|
|
@@ -1058,7 +1040,7 @@ async function writeMainDeclarationFile(references, config) {
|
|
|
1058
1040
|
async function writeTsConfigFile(mainReference, config) {
|
|
1059
1041
|
const dir = config.wxtDir;
|
|
1060
1042
|
await import_fs_extra8.default.writeFile(
|
|
1061
|
-
(0,
|
|
1043
|
+
(0, import_path9.resolve)(dir, "tsconfig.json"),
|
|
1062
1044
|
`{
|
|
1063
1045
|
"compilerOptions": {
|
|
1064
1046
|
"target": "ESNext",
|
|
@@ -1076,30 +1058,30 @@ async function writeTsConfigFile(mainReference, config) {
|
|
|
1076
1058
|
"skipLibCheck": true,
|
|
1077
1059
|
|
|
1078
1060
|
/* Aliases */
|
|
1079
|
-
"baseUrl": "${(0,
|
|
1061
|
+
"baseUrl": "${(0, import_path9.relative)(dir, config.root)}",
|
|
1080
1062
|
"paths": {
|
|
1081
1063
|
"@@": ["."],
|
|
1082
1064
|
"@@/*": ["./*"],
|
|
1083
1065
|
"~~": ["."],
|
|
1084
1066
|
"~~/*": ["./*"],
|
|
1085
|
-
"@": ["${(0,
|
|
1086
|
-
"@/*": ["${(0,
|
|
1087
|
-
"~": ["${(0,
|
|
1088
|
-
"~/*": ["${(0,
|
|
1067
|
+
"@": ["${(0, import_path9.relative)(config.root, config.srcDir)}"],
|
|
1068
|
+
"@/*": ["${(0, import_path9.relative)(config.root, config.srcDir)}/*"],
|
|
1069
|
+
"~": ["${(0, import_path9.relative)(config.root, config.srcDir)}"],
|
|
1070
|
+
"~/*": ["${(0, import_path9.relative)(config.root, config.srcDir)}/*"]
|
|
1089
1071
|
}
|
|
1090
1072
|
},
|
|
1091
1073
|
"include": [
|
|
1092
|
-
"${(0,
|
|
1093
|
-
"./${(0,
|
|
1074
|
+
"${(0, import_path9.relative)(dir, config.root)}/**/*",
|
|
1075
|
+
"./${(0, import_path9.relative)(dir, mainReference)}"
|
|
1094
1076
|
],
|
|
1095
|
-
"exclude": ["${(0,
|
|
1077
|
+
"exclude": ["${(0, import_path9.relative)(dir, config.outBaseDir)}"]
|
|
1096
1078
|
}`
|
|
1097
1079
|
);
|
|
1098
1080
|
}
|
|
1099
1081
|
|
|
1100
1082
|
// src/core/utils/manifest.ts
|
|
1101
1083
|
var import_fs_extra9 = __toESM(require("fs-extra"), 1);
|
|
1102
|
-
var
|
|
1084
|
+
var import_path10 = require("path");
|
|
1103
1085
|
|
|
1104
1086
|
// src/core/utils/ContentSecurityPolicy.ts
|
|
1105
1087
|
var ContentSecurityPolicy = class _ContentSecurityPolicy {
|
|
@@ -1144,11 +1126,49 @@ var ContentSecurityPolicy = class _ContentSecurityPolicy {
|
|
|
1144
1126
|
}
|
|
1145
1127
|
};
|
|
1146
1128
|
|
|
1129
|
+
// src/core/utils/content-scripts.ts
|
|
1130
|
+
function hashContentScriptOptions(options) {
|
|
1131
|
+
const withDefaults = {
|
|
1132
|
+
excludeGlobs: [],
|
|
1133
|
+
excludeMatches: [],
|
|
1134
|
+
includeGlobs: [],
|
|
1135
|
+
matchAboutBlank: false,
|
|
1136
|
+
matchOriginAsFallback: false,
|
|
1137
|
+
runAt: "document_idle",
|
|
1138
|
+
allFrames: false,
|
|
1139
|
+
world: "ISOLATED",
|
|
1140
|
+
// TODO: strip undefined fields from options object to improve content script grouping.
|
|
1141
|
+
...options
|
|
1142
|
+
};
|
|
1143
|
+
return JSON.stringify(
|
|
1144
|
+
Object.entries(withDefaults).map(([key, value]) => {
|
|
1145
|
+
if (Array.isArray(value))
|
|
1146
|
+
return [key, value.sort()];
|
|
1147
|
+
else
|
|
1148
|
+
return [key, value];
|
|
1149
|
+
}).sort((l, r) => l[0].localeCompare(r[0]))
|
|
1150
|
+
);
|
|
1151
|
+
}
|
|
1152
|
+
function mapWxtOptionsToContentScript(options) {
|
|
1153
|
+
return {
|
|
1154
|
+
matches: options.matches,
|
|
1155
|
+
all_frames: options.allFrames,
|
|
1156
|
+
match_about_blank: options.matchAboutBlank,
|
|
1157
|
+
exclude_globs: options.excludeGlobs,
|
|
1158
|
+
exclude_matches: options.excludeMatches,
|
|
1159
|
+
include_globs: options.includeGlobs,
|
|
1160
|
+
run_at: options.runAt,
|
|
1161
|
+
// @ts-expect-error: untyped chrome options
|
|
1162
|
+
match_origin_as_fallback: options.matchOriginAsFallback,
|
|
1163
|
+
world: options.world
|
|
1164
|
+
};
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1147
1167
|
// src/core/utils/manifest.ts
|
|
1148
1168
|
async function writeManifest(manifest, output, config) {
|
|
1149
1169
|
const str = config.mode === "production" ? JSON.stringify(manifest) : JSON.stringify(manifest, null, 2);
|
|
1150
1170
|
await import_fs_extra9.default.ensureDir(config.outDir);
|
|
1151
|
-
await import_fs_extra9.default.writeFile((0,
|
|
1171
|
+
await import_fs_extra9.default.writeFile((0, import_path10.resolve)(config.outDir, "manifest.json"), str, "utf-8");
|
|
1152
1172
|
output.publicAssets.unshift({
|
|
1153
1173
|
type: "asset",
|
|
1154
1174
|
fileName: "manifest.json",
|
|
@@ -1181,7 +1201,7 @@ async function generateMainfest(entrypoints, buildOutput, config) {
|
|
|
1181
1201
|
return manifest;
|
|
1182
1202
|
}
|
|
1183
1203
|
async function getPackageJson(config) {
|
|
1184
|
-
return await import_fs_extra9.default.readJson((0,
|
|
1204
|
+
return await import_fs_extra9.default.readJson((0, import_path10.resolve)(config.root, "package.json"));
|
|
1185
1205
|
}
|
|
1186
1206
|
function simplifyVersion(versionName) {
|
|
1187
1207
|
const version3 = /^((0|[1-9][0-9]{0,8})([.](0|[1-9][0-9]{0,8})){0,3}).*$/.exec(
|
|
@@ -1346,7 +1366,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
|
|
|
1346
1366
|
);
|
|
1347
1367
|
} else {
|
|
1348
1368
|
const hashToEntrypointsMap = contentScripts.reduce((map, script) => {
|
|
1349
|
-
const hash =
|
|
1369
|
+
const hash = hashContentScriptOptions(script.options);
|
|
1350
1370
|
if (map.has(hash))
|
|
1351
1371
|
map.get(hash)?.push(script);
|
|
1352
1372
|
else
|
|
@@ -1355,7 +1375,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
|
|
|
1355
1375
|
}, /* @__PURE__ */ new Map());
|
|
1356
1376
|
manifest.content_scripts = Array.from(hashToEntrypointsMap.entries()).map(
|
|
1357
1377
|
([, scripts]) => ({
|
|
1358
|
-
...scripts[0].options,
|
|
1378
|
+
...mapWxtOptionsToContentScript(scripts[0].options),
|
|
1359
1379
|
// TOOD: Sorting css and js arrays here so we get consistent test results... but we
|
|
1360
1380
|
// shouldn't have to. Where is the inconsistency coming from?
|
|
1361
1381
|
css: getContentScriptCssFiles(scripts, buildOutput)?.sort(),
|
|
@@ -1424,7 +1444,7 @@ function addHostPermission(manifest, hostPermission) {
|
|
|
1424
1444
|
}
|
|
1425
1445
|
|
|
1426
1446
|
// src/core/build.ts
|
|
1427
|
-
var
|
|
1447
|
+
var import_picocolors2 = __toESM(require("picocolors"), 1);
|
|
1428
1448
|
var vite3 = __toESM(require("vite"), 1);
|
|
1429
1449
|
var import_fs_extra11 = __toESM(require("fs-extra"), 1);
|
|
1430
1450
|
|
|
@@ -1474,7 +1494,7 @@ function formatDuration(duration) {
|
|
|
1474
1494
|
}
|
|
1475
1495
|
|
|
1476
1496
|
// src/core/log/printBuildSummary.ts
|
|
1477
|
-
var
|
|
1497
|
+
var import_path11 = __toESM(require("path"), 1);
|
|
1478
1498
|
|
|
1479
1499
|
// src/core/log/printTable.ts
|
|
1480
1500
|
function printTable(log, rows, gap = 2) {
|
|
@@ -1503,7 +1523,7 @@ function printTable(log, rows, gap = 2) {
|
|
|
1503
1523
|
}
|
|
1504
1524
|
|
|
1505
1525
|
// src/core/log/printBuildSummary.ts
|
|
1506
|
-
var
|
|
1526
|
+
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
1507
1527
|
var import_fs_extra10 = __toESM(require("fs-extra"), 1);
|
|
1508
1528
|
var import_filesize = require("filesize");
|
|
1509
1529
|
async function printBuildSummary(output, config) {
|
|
@@ -1522,23 +1542,23 @@ async function printBuildSummary(output, config) {
|
|
|
1522
1542
|
const chunkRows = await Promise.all(
|
|
1523
1543
|
chunks.map(async (chunk, i) => {
|
|
1524
1544
|
const file = [
|
|
1525
|
-
(0,
|
|
1545
|
+
(0, import_path11.relative)(process.cwd(), config.outDir) + import_path11.default.sep,
|
|
1526
1546
|
chunk.fileName
|
|
1527
1547
|
];
|
|
1528
1548
|
const prefix = i === chunks.length - 1 ? " \u2514\u2500" : " \u251C\u2500";
|
|
1529
1549
|
const color = getChunkColor(chunk.fileName);
|
|
1530
|
-
const stats = await import_fs_extra10.default.lstat((0,
|
|
1550
|
+
const stats = await import_fs_extra10.default.lstat((0, import_path11.resolve)(config.outDir, chunk.fileName));
|
|
1531
1551
|
totalSize += stats.size;
|
|
1532
1552
|
const size = String((0, import_filesize.filesize)(stats.size));
|
|
1533
1553
|
return [
|
|
1534
|
-
`${
|
|
1535
|
-
|
|
1554
|
+
`${import_picocolors.default.gray(prefix)} ${import_picocolors.default.dim(file[0])}${color(file[1])}`,
|
|
1555
|
+
import_picocolors.default.dim(size)
|
|
1536
1556
|
];
|
|
1537
1557
|
})
|
|
1538
1558
|
);
|
|
1539
1559
|
printTable(config.logger.log, chunkRows);
|
|
1540
1560
|
config.logger.log(
|
|
1541
|
-
`${
|
|
1561
|
+
`${import_picocolors.default.cyan("\u03A3 Total size:")} ${String((0, import_filesize.filesize)(totalSize))}`
|
|
1542
1562
|
);
|
|
1543
1563
|
}
|
|
1544
1564
|
var DEFAULT_SORT_WEIGHT = 100;
|
|
@@ -1554,12 +1574,12 @@ function getChunkSortWeight(filename) {
|
|
|
1554
1574
|
([key]) => filename.endsWith(key)
|
|
1555
1575
|
)?.[1] ?? DEFAULT_SORT_WEIGHT;
|
|
1556
1576
|
}
|
|
1557
|
-
var DEFAULT_COLOR =
|
|
1577
|
+
var DEFAULT_COLOR = import_picocolors.default.blue;
|
|
1558
1578
|
var CHUNK_COLORS = {
|
|
1559
|
-
".js.map":
|
|
1560
|
-
".html":
|
|
1561
|
-
".css":
|
|
1562
|
-
".js":
|
|
1579
|
+
".js.map": import_picocolors.default.gray,
|
|
1580
|
+
".html": import_picocolors.default.green,
|
|
1581
|
+
".css": import_picocolors.default.magenta,
|
|
1582
|
+
".js": import_picocolors.default.cyan
|
|
1563
1583
|
};
|
|
1564
1584
|
function getChunkColor(filename) {
|
|
1565
1585
|
return Object.entries(CHUNK_COLORS).find(([key]) => filename.endsWith(key))?.[1] ?? DEFAULT_COLOR;
|
|
@@ -1570,7 +1590,7 @@ async function buildInternal(config) {
|
|
|
1570
1590
|
const verb = config.command === "serve" ? "Pre-rendering" : "Building";
|
|
1571
1591
|
const target = `${config.browser}-mv${config.manifestVersion}`;
|
|
1572
1592
|
config.logger.info(
|
|
1573
|
-
`${verb} ${
|
|
1593
|
+
`${verb} ${import_picocolors2.default.cyan(target)} for ${import_picocolors2.default.cyan(config.mode)} with ${import_picocolors2.default.green(
|
|
1574
1594
|
`Vite ${vite3.version}`
|
|
1575
1595
|
)}`
|
|
1576
1596
|
);
|
|
@@ -1772,9 +1792,9 @@ function reloadContentScripts(steps, config, server) {
|
|
|
1772
1792
|
const js = [getEntrypointBundlePath(entry, config.outDir, ".js")];
|
|
1773
1793
|
const css = getContentScriptCssFiles([entry], server.currentOutput);
|
|
1774
1794
|
server.reloadContentScript({
|
|
1795
|
+
...mapWxtOptionsToContentScript(entry.options),
|
|
1775
1796
|
js,
|
|
1776
|
-
css
|
|
1777
|
-
...entry.options
|
|
1797
|
+
css
|
|
1778
1798
|
});
|
|
1779
1799
|
});
|
|
1780
1800
|
} else {
|
|
@@ -1820,13 +1840,13 @@ async function createServer2(config) {
|
|
|
1820
1840
|
if (changes.type === "no-change")
|
|
1821
1841
|
return;
|
|
1822
1842
|
internalConfig.logger.info(
|
|
1823
|
-
`Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) =>
|
|
1843
|
+
`Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) => import_picocolors3.default.dim((0, import_node_path4.relative)(internalConfig.root, file))).join(", ")}`
|
|
1824
1844
|
);
|
|
1825
1845
|
const rebuiltNames = changes.rebuildGroups.flat().map((entry) => {
|
|
1826
|
-
return
|
|
1846
|
+
return import_picocolors3.default.cyan(
|
|
1827
1847
|
(0, import_node_path4.relative)(internalConfig.outDir, getEntrypointOutputFile(entry, ""))
|
|
1828
1848
|
);
|
|
1829
|
-
}).join(
|
|
1849
|
+
}).join(import_picocolors3.default.dim(", "));
|
|
1830
1850
|
internalConfig = await getLatestInternalConfig();
|
|
1831
1851
|
internalConfig.server = server;
|
|
1832
1852
|
const { output: newOutput } = await rebuild(
|
|
@@ -1857,11 +1877,11 @@ async function createServer2(config) {
|
|
|
1857
1877
|
var import_consola4 = require("consola");
|
|
1858
1878
|
|
|
1859
1879
|
// src/core/log/printHeader.ts
|
|
1860
|
-
var
|
|
1880
|
+
var import_picocolors4 = __toESM(require("picocolors"), 1);
|
|
1861
1881
|
var import_consola3 = require("consola");
|
|
1862
1882
|
function printHeader() {
|
|
1863
1883
|
console.log();
|
|
1864
|
-
import_consola3.consola.log(`${
|
|
1884
|
+
import_consola3.consola.log(`${import_picocolors4.default.gray("WXT")} ${import_picocolors4.default.gray(import_picocolors4.default.bold(version))}`);
|
|
1865
1885
|
}
|
|
1866
1886
|
|
|
1867
1887
|
// src/cli/utils/defineCommand.ts
|
|
@@ -1949,4 +1969,4 @@ cli.command("prepare [root]", "prepare").option("-c, --config <file>", "use spec
|
|
|
1949
1969
|
cli.command("publish [root]", "publish to stores").action(publish);
|
|
1950
1970
|
cli.command("init [directory]", "initialize a new project").action(init);
|
|
1951
1971
|
cli.parse();
|
|
1952
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2htckxvZ2dlci50cyIsICIuLi9zcmMvY29yZS91dGlscy9jcmVhdGVGc0NhY2hlLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2dsb2JhbHMudHMiLCAiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2FycmF5cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9kZXRlY3REZXZDaGFuZ2VzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2J1aWxkRW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcmVtb3ZlRW1wdHlEaXJzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9pbXBvcnRUc0ZpbGUudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpci50cyIsICIuLi9zcmMvY29yZS91dGlscy9tYW5pZmVzdC50cyIsICIuLi9zcmMvY29yZS91dGlscy9Db250ZW50U2VjdXJpdHlQb2xpY3kudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ3JvdXBFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9mb3JtYXREdXJhdGlvbi50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRCdWlsZFN1bW1hcnkudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50VGFibGUudHMiLCAiLi4vc3JjL2NvcmUvc2VydmVyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2ZpbmRPcGVuUG9ydC50cyIsICIuLi9zcmMvY29yZS9ydW5uZXJzL2NyZWF0ZVdlYkV4dFJ1bm5lci50cyIsICIuLi9zcmMvY2xpL3V0aWxzL2RlZmluZUNvbW1hbmQudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50SGVhZGVyLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvYnVpbGQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9kZXYudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9pbml0LnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHJlcGFyZS50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL3B1Ymxpc2gudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IGNhYyBmcm9tICdjYWMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgKiBhcyBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcblxuY29uc3QgY2xpID0gY2FjKCd3eHQnKTtcbmNsaS5oZWxwKCk7XG5jbGkudmVyc2lvbih2ZXJzaW9uKTtcblxuLy8gREVWXG5jbGlcbiAgLmNvbW1hbmQoJ1tyb290XScsICdzdGFydCBkZXYgc2VydmVyJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAuYWN0aW9uKGNvbW1hbmRzLmRldik7XG5cbi8vIEJVSUxEXG5jbGlcbiAgLmNvbW1hbmQoJ2J1aWxkIFtyb290XScsICdidWlsZCBmb3IgcHJvZHVjdGlvbicpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5vcHRpb24oJy1tLCAtLW1vZGUgPG1vZGU+JywgJ3NldCBlbnYgbW9kZScpXG4gIC5vcHRpb24oJy1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+JywgJ3NwZWNpZnkgYSBicm93c2VyJylcbiAgLm9wdGlvbignLS1tdjMnLCAndGFyZ2V0IG1hbmlmZXN0IHYzJylcbiAgLm9wdGlvbignLS1tdjInLCAndGFyZ2V0IG1hbmlmZXN0IHYyJylcbiAgLmFjdGlvbihjb21tYW5kcy5idWlsZCk7XG5cbi8vIFBSRVBBUkVcbmNsaVxuICAuY29tbWFuZCgncHJlcGFyZSBbcm9vdF0nLCAncHJlcGFyZScpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5hY3Rpb24oY29tbWFuZHMucHJlcGFyZSk7XG5cbi8vIFBVQkxJU0hcbmNsaS5jb21tYW5kKCdwdWJsaXNoIFtyb290XScsICdwdWJsaXNoIHRvIHN0b3JlcycpLmFjdGlvbihjb21tYW5kcy5wdWJsaXNoKTtcblxuLy8gSU5JVFxuY2xpXG4gIC5jb21tYW5kKCdpbml0IFtkaXJlY3RvcnldJywgJ2luaXRpYWxpemUgYSBuZXcgcHJvamVjdCcpXG4gIC5hY3Rpb24oY29tbWFuZHMuaW5pdCk7XG5cbmNsaS5wYXJzZSgpO1xuIiwgIntcbiAgXCJuYW1lXCI6IFwid3h0XCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjIuMFwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiTmV4dCBnZW4gZnJhbWV3b3JrIGZvciBkZXZlbG9waW5nIHdlYiBleHRlbnNpb25zXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4xNi4wXCIsXG4gICAgXCJwbnBtXCI6IFwiPj04XCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ha2xpbmtlcjEvd3h0XCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ2aXRlXCIsXG4gICAgXCJjaHJvbWVcIixcbiAgICBcIndlYlwiLFxuICAgIFwiZXh0ZW5zaW9uXCIsXG4gICAgXCJicm93c2VyXCIsXG4gICAgXCJidW5kbGVyXCIsXG4gICAgXCJmcmFtZXdvcmtcIlxuICBdLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiQWFyb24gS2xpbmtlclwiLFxuICAgIFwiZW1haWxcIjogXCJhYXJvbmtsaW5rZXIxK3d4dEBnbWFpbC5jb21cIlxuICB9LFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJkaXN0XCJcbiAgXSxcbiAgXCJiaW5cIjogXCJkaXN0L2NsaS5janNcIixcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiXG4gICAgfSxcbiAgICBcIi4vY2xpZW50XCI6IHtcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9jbGllbnQuY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQuanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvY2xpZW50LmQudHNcIlxuICAgIH1cbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInd4dFwiOiBcInRzeCBzcmMvY2xpL2luZGV4LnRzXCIsXG4gICAgXCJidWlsZFwiOiBcInRzeCBzY3JpcHRzL2J1aWxkLnRzXCIsXG4gICAgXCJmb3JtYXRcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcInByZXR0aWVyIC0td3JpdGUgLlwiLFxuICAgIFwiY29tcGlsZVwiOiBcInRzYyAtLW5vRW1pdFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdFwiLFxuICAgIFwidGVzdDpjb3ZlcmFnZVwiOiBcInZpdGVzdCBydW4gLS1jb3ZlcmFnZVwiLFxuICAgIFwicHJlcGFyZVwiOiBcInNpbXBsZS1naXQtaG9va3NcIixcbiAgICBcInByZXB1Ymxpc2hcIjogXCJwbnBtIC1zIGJ1aWxkXCIsXG4gICAgXCJkb2NzOmRldlwiOiBcInZpdGVwcmVzcyBkZXYgZG9jc1wiLFxuICAgIFwiZG9jczpidWlsZFwiOiBcInZpdGVwcmVzcyBidWlsZCBkb2NzXCIsXG4gICAgXCJkb2NzOnByZXZpZXdcIjogXCJ2aXRlcHJlc3MgcHJldmlldyBkb2NzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHR5cGVzL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIl4wLjEwLjBcIixcbiAgICBcIkB3ZWJleHQtY29yZS9mYWtlLWJyb3dzZXJcIjogXCJeMS4yLjJcIixcbiAgICBcIkB3ZWJleHQtY29yZS9tYXRjaC1wYXR0ZXJuc1wiOiBcIl4xLjAuMVwiLFxuICAgIFwiYXN5bmMtbXV0ZXhcIjogXCJeMC40LjBcIixcbiAgICBcImMxMlwiOiBcIl4xLjQuMlwiLFxuICAgIFwiY2FjXCI6IFwiXjYuNy4xNFwiLFxuICAgIFwiY29uc29sYVwiOiBcIl4zLjEuMFwiLFxuICAgIFwiZmFzdC1nbG9iXCI6IFwiXjMuMi4xMlwiLFxuICAgIFwiZmlsZXNpemVcIjogXCJeMTAuMC43XCIsXG4gICAgXCJmcy1leHRyYVwiOiBcIl4xMS4xLjFcIixcbiAgICBcImppdGlcIjogXCJeMS4xOC4yXCIsXG4gICAgXCJqc29uNVwiOiBcIl4yLjIuM1wiLFxuICAgIFwibGlua2Vkb21cIjogXCJeMC4xNC4yNlwiLFxuICAgIFwicGljb2NvbG9yc1wiOiBcIl4xLjAuMFwiLFxuICAgIFwicGljb21hdGNoXCI6IFwiXjIuMy4xXCIsXG4gICAgXCJ1bmltcG9ydFwiOiBcIl4zLjAuOFwiLFxuICAgIFwidml0ZVwiOiBcIl40LjMuOVwiLFxuICAgIFwidml0ZS10c2NvbmZpZy1wYXRoc1wiOiBcIl40LjIuMFwiLFxuICAgIFwid2ViLWV4dFwiOiBcIl43LjYuMlwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBmYWtlci1qcy9mYWtlclwiOiBcIl44LjAuMlwiLFxuICAgIFwiQHR5cGVzL2ZzLWV4dHJhXCI6IFwiXjExLjAuMVwiLFxuICAgIFwiQHR5cGVzL2xvZGFzaC5tZXJnZVwiOiBcIl40LjYuN1wiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMy4xXCIsXG4gICAgXCJAdHlwZXMvcGljb21hdGNoXCI6IFwiXjIuMy4wXCIsXG4gICAgXCJAdml0ZXN0L2NvdmVyYWdlLXY4XCI6IFwiXjAuMzIuMlwiLFxuICAgIFwibG9kYXNoLm1lcmdlXCI6IFwiXjQuNi4yXCIsXG4gICAgXCJucG0tcnVuLWFsbFwiOiBcIl40LjEuNVwiLFxuICAgIFwib3JhXCI6IFwiXjYuMy4xXCIsXG4gICAgXCJwcmV0dGllclwiOiBcIl4yLjguOFwiLFxuICAgIFwicHJldHR5LXF1aWNrXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IFwiXjIuOC4xXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJ0c3hcIjogXCJeMy4xMi43XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMS4zXCIsXG4gICAgXCJ2aXRlcHJlc3NcIjogXCIxLjAuMC1iZXRhLjVcIixcbiAgICBcInZpdGVzdFwiOiBcIl4wLjMyLjRcIixcbiAgICBcInZpdGVzdC1tb2NrLWV4dGVuZGVkXCI6IFwiXjEuMS40XCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIj49MC4xMC4wXCJcbiAgfSxcbiAgXCJwYWNrYWdlTWFuYWdlclwiOiBcInBucG1AOC42LjNcIixcbiAgXCJzaW1wbGUtZ2l0LWhvb2tzXCI6IHtcbiAgICBcInByZS1jb21taXRcIjogXCJwbnBtIHByZXR0eS1xdWljayAtLXN0YWdlZFwiXG4gIH0sXG4gIFwicG5wbVwiOiB7XG4gICAgXCJwZWVyRGVwZW5kZW5jeVJ1bGVzXCI6IHtcbiAgICAgIFwiaWdub3JlTWlzc2luZ1wiOiBbXG4gICAgICAgIFwiQGFsZ29saWEvY2xpZW50LXNlYXJjaFwiLFxuICAgICAgICBcInNlYXJjaC1pbnNpZ2h0c1wiXG4gICAgICBdLFxuICAgICAgXCJhbGxvd0FueVwiOiBbXG4gICAgICAgIFwibm9kZS1mZXRjaFwiXG4gICAgICBdXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ29uZmlnRW52LFxuICBFeHRlbnNpb25SdW5uZXJDb25maWcsXG4gIElubGluZUNvbmZpZyxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFVzZXJDb25maWcsXG4gIFVzZXJNYW5pZmVzdCxcbiAgVXNlck1hbmlmZXN0Rm4sXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwYXRoLCB7IHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IGNyZWF0ZUZzQ2FjaGUgfSBmcm9tICcuL2NyZWF0ZUZzQ2FjaGUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFscyB9IGZyb20gJy4vZ2xvYmFscyc7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSAnYzEyJztcblxuLyoqXG4gKiBHaXZlbiBhbiBpbmxpbmUgY29uZmlnLCBkaXNjb3ZlciB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LCBtZXJnZSB0aGUgcmVzdWx0cywgcmVzb2x2ZSBhbnlcbiAqIHJlbGF0aXZlIHBhdGhzLCBhbmQgYXBwbHkgYW55IGRlZmF1bHRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW50ZXJuYWxDb25maWcoXG4gIGNvbmZpZzogSW5saW5lQ29uZmlnLFxuICBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJyxcbik6IFByb21pc2U8SW50ZXJuYWxDb25maWc+IHtcbiAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gYSBiYXNlIGNvbmZpZ1xuICBjb25zdCByb290ID0gY29uZmlnLnJvb3QgPyBwYXRoLnJlc29sdmUoY29uZmlnLnJvb3QpIDogcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgbW9kZSA9XG4gICAgY29uZmlnLm1vZGUgPz8gKGNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKTtcbiAgY29uc3QgYnJvd3NlciA9IGNvbmZpZy5icm93c2VyID8/ICdjaHJvbWUnO1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPVxuICAgIGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPz8gKGJyb3dzZXIgPT0gJ2ZpcmVmb3gnID8gMiA6IDMpO1xuICBjb25zdCBvdXRCYXNlRGlyID0gcGF0aC5yZXNvbHZlKHJvb3QsICcub3V0cHV0Jyk7XG4gIGNvbnN0IG91dERpciA9IHBhdGgucmVzb2x2ZShvdXRCYXNlRGlyLCBgJHticm93c2VyfS1tdiR7bWFuaWZlc3RWZXJzaW9ufWApO1xuICBjb25zdCBsb2dnZXIgPSBjb25maWcubG9nZ2VyID8/IGNvbnNvbGE7XG5cbiAgY29uc3QgYmFzZUNvbmZpZzogSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzID0ge1xuICAgIHJvb3QsXG4gICAgb3V0RGlyLFxuICAgIG91dEJhc2VEaXIsXG4gICAgc3RvcmVJZHM6IGNvbmZpZy5zdG9yZUlkcyA/PyB7fSxcbiAgICBicm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbixcbiAgICBtb2RlLFxuICAgIGNvbW1hbmQsXG4gICAgbG9nZ2VyLFxuICAgIHZpdGU6IGNvbmZpZy52aXRlID8/IHt9LFxuICAgIGltcG9ydHM6IGNvbmZpZy5pbXBvcnRzID8/IHt9LFxuICAgIHJ1bm5lckNvbmZpZzogYXdhaXQgbG9hZENvbmZpZzxFeHRlbnNpb25SdW5uZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3ZWItZXh0JyxcbiAgICAgIGN3ZDogcm9vdCxcbiAgICAgIGdsb2JhbFJjOiB0cnVlLFxuICAgICAgcmNGaWxlOiAnLndlYmV4dHJjJyxcbiAgICAgIG92ZXJyaWRlczogY29uZmlnLnJ1bm5lcixcbiAgICB9KSxcbiAgfTtcblxuICAvLyBMb2FkIHVzZXIgY29uZmlnIGZyb20gZmlsZVxuICBsZXQgdXNlckNvbmZpZzogVXNlckNvbmZpZyA9IHtcbiAgICBtb2RlLFxuICB9O1xuICBpZiAoY29uZmlnLmNvbmZpZ0ZpbGUgIT09IGZhbHNlKSB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZENvbmZpZzxVc2VyQ29uZmlnPih7XG4gICAgICBuYW1lOiAnd3h0JyxcbiAgICAgIGN3ZDogcm9vdCxcbiAgICAgIHJjRmlsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgdXNlckNvbmZpZyA9IGxvYWRlZC5jb25maWcgPz8ge307XG4gIH1cblxuICAvLyBNZXJnZSBpbmxpbmUgYW5kIHVzZXIgY29uZmlnc1xuICBjb25zdCBtZXJnZWQgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIGJhc2VDb25maWcsXG4gICAgdXNlckNvbmZpZyxcbiAgKSBhcyBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnM7XG5cbiAgLy8gQXBwbHkgdXNlciBjb25maWcgYW5kIGNyZWF0ZSBmaW5hbCBjb25maWdcbiAgY29uc3Qgc3JjRGlyID0gdXNlckNvbmZpZy5zcmNEaXIgPyByZXNvbHZlKHJvb3QsIHVzZXJDb25maWcuc3JjRGlyKSA6IHJvb3Q7XG4gIGNvbnN0IGVudHJ5cG9pbnRzRGlyID0gcmVzb2x2ZShcbiAgICBzcmNEaXIsXG4gICAgdXNlckNvbmZpZy5lbnRyeXBvaW50c0RpciA/PyAnZW50cnlwb2ludHMnLFxuICApO1xuICBjb25zdCBwdWJsaWNEaXIgPSByZXNvbHZlKHNyY0RpciwgdXNlckNvbmZpZy5wdWJsaWNEaXIgPz8gJ3B1YmxpYycpO1xuICBjb25zdCB3eHREaXIgPSByZXNvbHZlKHNyY0RpciwgJy53eHQnKTtcbiAgY29uc3QgdHlwZXNEaXIgPSByZXNvbHZlKHd4dERpciwgJ3R5cGVzJyk7XG5cbiAgLy8gTWVyZ2UgbWFuaWZlc3Qgc291cmNlc1xuICBjb25zdCBlbnY6IENvbmZpZ0VudiA9IHsgbW9kZSwgYnJvd3NlciwgbWFuaWZlc3RWZXJzaW9uLCBjb21tYW5kIH07XG4gIGNvbnN0IHVzZXJNYW5pZmVzdCA9IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIHVzZXJDb25maWcubWFuaWZlc3QpO1xuICBjb25zdCBpbmxpbmVNYW5pZmVzdCA9IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIGNvbmZpZy5tYW5pZmVzdCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gdml0ZS5tZXJnZUNvbmZpZyh1c2VyTWFuaWZlc3QsIGlubGluZU1hbmlmZXN0KTtcblxuICBjb25zdCBmaW5hbENvbmZpZzogSW50ZXJuYWxDb25maWcgPSB7XG4gICAgLi4ubWVyZ2VkLFxuICAgIHNyY0RpcixcbiAgICBlbnRyeXBvaW50c0RpcixcbiAgICBwdWJsaWNEaXIsXG4gICAgd3h0RGlyOiB3eHREaXIsXG4gICAgdHlwZXNEaXIsXG4gICAgZnNDYWNoZTogY3JlYXRlRnNDYWNoZSh3eHREaXIpLFxuICAgIG1hbmlmZXN0LFxuICB9O1xuXG4gIC8vIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB2aXRlIGNvbmZpZ1xuICBmaW5hbENvbmZpZy52aXRlLnJvb3QgPSByb290O1xuICBmaW5hbENvbmZpZy52aXRlLmNvbmZpZ0ZpbGUgPSBmYWxzZTtcbiAgZmluYWxDb25maWcudml0ZS5sb2dMZXZlbCA9ICd3YXJuJztcblxuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkID8/PSB7fTtcbiAgZmluYWxDb25maWcudml0ZS5idWlsZC5vdXREaXIgPSBvdXREaXI7XG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQuZW1wdHlPdXREaXIgPSBmYWxzZTtcblxuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMgPz89IFtdO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRvd25sb2FkKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZGV2SHRtbFByZXJlbmRlcihmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLnVuaW1wb3J0KGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKFxuICAgIHBsdWdpbnMudmlydHVhbEVudHJ5cG9pbignYmFja2dyb3VuZCcsIGZpbmFsQ29uZmlnKSxcbiAgKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2goXG4gICAgcGx1Z2lucy52aXJ0dWFsRW50cnlwb2luKCdjb250ZW50LXNjcmlwdCcsIGZpbmFsQ29uZmlnKSxcbiAgKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZTZXJ2ZXJHbG9iYWxzKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudHNjb25maWdQYXRocyhmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmhtckxvZ2dlcihmaW5hbENvbmZpZykpO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUuZGVmaW5lID8/PSB7fTtcbiAgZ2V0R2xvYmFscyhmaW5hbENvbmZpZykuZm9yRWFjaCgoZ2xvYmFsKSA9PiB7XG4gICAgZmluYWxDb25maWcudml0ZS5kZWZpbmUhW2dsb2JhbC5uYW1lXSA9IEpTT04uc3RyaW5naWZ5KGdsb2JhbC52YWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBmaW5hbENvbmZpZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgZGVmaW5pbmcgYSBiYXNlIGNvbmZpZywgc2luY2UgdXNlci1jb25maWd1cmFibGUgZGlyZWN0b3JpZXMgbXVzdCBiZSBzZXQgYWZ0ZXJcbiAqIHJlYWRpbmcgaW4gdGhlIHVzZXIgY29uZmlnLlxuICovXG50eXBlIEludGVybmFsQ29uZmlnTm9Vc2VyRGlycyA9IE9taXQ8XG4gIEludGVybmFsQ29uZmlnLFxuICB8ICdzcmNEaXInXG4gIHwgJ3B1YmxpY0RpcidcbiAgfCAnZW50cnlwb2ludHNEaXInXG4gIHwgJ3d4dERpcidcbiAgfCAndHlwZXNEaXInXG4gIHwgJ2ZzQ2FjaGUnXG4gIHwgJ21hbmlmZXN0J1xuPjtcblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKFxuICBlbnY6IENvbmZpZ0VudixcbiAgbWFuaWZlc3Q6IFVzZXJNYW5pZmVzdCB8IFByb21pc2U8VXNlck1hbmlmZXN0PiB8IFVzZXJNYW5pZmVzdEZuIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxVc2VyTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGF3YWl0ICh0eXBlb2YgbWFuaWZlc3QgPT09ICdmdW5jdGlvbidcbiAgICA/IG1hbmlmZXN0KGVudilcbiAgICA6IG1hbmlmZXN0ID8/IHt9KTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE5hbWUoXG4gIGVudHJ5cG9pbnRzRGlyOiBzdHJpbmcsXG4gIGlucHV0UGF0aDogc3RyaW5nLFxuICAvLyB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGVudHJ5cG9pbnRzRGlyLCBpbnB1dFBhdGgpO1xuICAvLyBHcmFiIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IC4gb3IgL1xuICBjb25zdCBuYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KC9bXFwuXFwvXS8sIDIpWzBdO1xuXG4gIHJldHVybiBuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoZW50cnlwb2ludC5vdXRwdXREaXIsIGAke2VudHJ5cG9pbnQubmFtZX0ke2V4dH1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4ncyB0aGUgZW50cnlwb2ludCdzIG91dHB1dCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBVc2VkIGZvciBwYXRocyBpbiB0aGVcbiAqIG1hbmlmZXN0IGFuZCByb2xsdXAncyBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgZW50cnlwb2ludDogRW50cnlwb2ludCxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKG91dERpciwgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoZW50cnlwb2ludCwgZXh0KSk7XG59XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludE5hbWUgfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBwYXJzZUhUTUwgfSBmcm9tICdsaW5rZWRvbSc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFByZS1yZW5kZXJzIHRoZSBIVE1MIGVudHJ5cG9pbnRzIHdoZW4gYnVpbGRpbmcgdGhlIGV4dGVuc2lvbiB0byBjb25uZWN0IHRvIHRoZSBkZXYgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2SHRtbFByZXJlbmRlcihjb25maWc6IEludGVybmFsQ29uZmlnKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIGFwcGx5OiAnYnVpbGQnLFxuICAgIG5hbWU6ICd3eHQ6ZGV2LWh0bWwtcHJlcmVuZGVyJyxcbiAgICBjb25maWcoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICdAd3h0L3JlbG9hZC1odG1sJzogcmVzb2x2ZShcbiAgICAgICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgICAgICdub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzL3JlbG9hZC1odG1sLmpzJyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oaHRtbCwgaWQpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IGNvbmZpZy5zZXJ2ZXI7XG4gICAgICBpZiAoY29uZmlnLmNvbW1hbmQgIT09ICdzZXJ2ZScgfHwgc2VydmVyID09IG51bGwgfHwgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gYCR7c2VydmVyLm9yaWdpbn0ke2lkfWA7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBpZCk7XG4gICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXIub3JpZ2lufS8ke25hbWV9Lmh0bWxgO1xuICAgICAgY29uc3Qgc2VydmVySHRtbCA9IGF3YWl0IHNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwoXG4gICAgICAgIHVybCxcbiAgICAgICAgaHRtbCxcbiAgICAgICAgb3JpZ2luYWxVcmwsXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKHNlcnZlckh0bWwpO1xuXG4gICAgICBjb25zdCBwb2ludFRvRGV2U2VydmVyID0gKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzcmMpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBzZXJ2ZXIub3JpZ2luICsgc3JjKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNyYy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHJlc29sdmUoZGlybmFtZShpZCksIHNyYyk7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHJlbGF0aXZlKGNvbmZpZy5yb290LCBhYnMpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgYCR7c2VydmVyLm9yaWdpbn0vJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ3NjcmlwdFt0eXBlPW1vZHVsZV0nLCAnc3JjJyk7XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdsaW5rW3JlbD1zdHlsZXNoZWV0XScsICdocmVmJyk7XG5cbiAgICAgIC8vIEFkZCBhIHNjcmlwdCB0byBhZGQgcGFnZSByZWxvYWRpbmdcbiAgICAgIGNvbnN0IHJlbG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICByZWxvYWRlci5zcmMgPSAnQHd4dC9yZWxvYWQtaHRtbCc7XG4gICAgICByZWxvYWRlci50eXBlID0gJ21vZHVsZSc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlbG9hZGVyKTtcblxuICAgICAgY29uc3QgbmV3SHRtbCA9IGRvY3VtZW50LnRvU3RyaW5nKCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdUcmFuc2Zvcm1lZCAnICsgaWQpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnT2xkIEhUTUw6XFxuJyArIGh0bWwpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTmV3IEhUTUw6XFxuJyArIG5ld0h0bWwpO1xuICAgICAgcmV0dXJuIG5ld0h0bWw7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmluZXMgZ2xvYmFsIGNvbnN0YW50cyBhYm91dCB0aGUgZGV2IHNlcnZlci4gSGVscHMgc2NyaXB0cyBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIncyB3ZWIgc29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV2U2VydmVyR2xvYmFscyhpbnRlcm5hbENvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZGV2LXNlcnZlci1nbG9iYWxzJyxcbiAgICBjb25maWcoKSB7XG4gICAgICBpZiAoaW50ZXJuYWxDb25maWcuc2VydmVyID09IG51bGwgfHwgaW50ZXJuYWxDb25maWcuY29tbWFuZCA9PSAnYnVpbGQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgIF9fREVWX1NFUlZFUl9QUk9UT0NPTF9fOiBKU09OLnN0cmluZ2lmeSgnd3M6JyksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX0hPU1ROQU1FX186IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaW50ZXJuYWxDb25maWcuc2VydmVyLmhvc3RuYW1lLFxuICAgICAgICAgICksXG4gICAgICAgICAgX19ERVZfU0VSVkVSX1BPUlRfXzogSlNPTi5zdHJpbmdpZnkoaW50ZXJuYWxDb25maWcuc2VydmVyLnBvcnQpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCBkbnMgZnJvbSAnbm9kZTpkbnMnO1xuaW1wb3J0IHsgd2l0aFRpbWVvdXQgfSBmcm9tICcuL3Byb21pc2VzJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5mdW5jdGlvbiBpc09mZmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGlzT2ZmbGluZSA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXMpID0+IHtcbiAgICBkbnMucmVzb2x2ZSgnZ29vZ2xlLmNvbScsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIgPT0gbnVsbCkge1xuICAgICAgICByZXMoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHdpdGhUaW1lb3V0KGlzT2ZmbGluZSwgMWUzKS5jYXRjaCgoKSA9PiB0cnVlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzT25saW5lKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBvZmZsaW5lID0gYXdhaXQgaXNPZmZsaW5lKCk7XG4gIHJldHVybiAhb2ZmbGluZTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGEgVVJMIHdpdGggYSBzaW1wbGUgR0VUIHJlcXVlc3QuIEdyYWJzIGl0IGZyb20gY2FjaGUgaWYgaXQgZG9lc24ndCBleGlzdCwgb3IgdGhyb3dzIGFuXG4gKiBlcnJvciBpZiBpdCBjYW4ndCBiZSByZXNvbHZlZCB2aWEgdGhlIG5ldHdvcmsgb3IgY2FjaGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENhY2hlZChcbiAgdXJsOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG5cbiAgaWYgKGF3YWl0IGlzT25saW5lKCkpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmIChyZXMuc3RhdHVzIDwgMzAwKSB7XG4gICAgICBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIGF3YWl0IGNvbmZpZy5mc0NhY2hlLnNldCh1cmwsIGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIFwiJHt1cmx9XCIsIGZhbGxpbmcgYmFjayB0byBjYWNoZS4uLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGVudCkgY29udGVudCA9IChhd2FpdCBjb25maWcuZnNDYWNoZS5nZXQodXJsKSkgPz8gJyc7XG4gIGlmICghY29udGVudClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBPZmZsaW5lIGFuZCBcIiR7dXJsfVwiIGhhcyBub3QgYmVlbiBjYWNoZWQuIFRyeSBhZ2FpbiB3aGVuIG9ubGluZS5gLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4iLCAiLyoqXG4gKiBBZGQgYSB0aW1lb3V0IHRvIGEgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBkdXJhdGlvbjogbnVtYmVyLFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZWooYFByb21pc2UgdGltZWQgb3V0IGFmdGVyICR7ZHVyYXRpb259bXNgKTtcbiAgICB9LCBkdXJhdGlvbik7XG4gICAgcHJvbWlzZVxuICAgICAgLnRoZW4ocmVzKVxuICAgICAgLmNhdGNoKHJlailcbiAgICAgIC5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIERvbid0IHVzZSBpbiBwcm9kdWN0aW9uLCBqdXN0IGZvciB0ZXN0aW5nIGFuZCBzbG93aW5nIHRoaW5ncyBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGZldGNoQ2FjaGVkIH0gZnJvbSAnLi4vdXRpbHMvbmV0d29yayc7XG5cbi8qKlxuICogRG93bmxvYWRzIGFueSBVUkwgaW1wb3J0cywgbGlrZSBHb29nbGUgQW5hbHl0aWNzLCBpbnRvIHZpcnR1YWwgbW9kdWxlcyBzbyB0aGV5IGFyZSBidW5kbGVkIHdpdGhcbiAqIHRoZSBleHRlbnNpb24gaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gcmVtb3RlIGNvZGUgYXQgcnVudGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IFwidXJsOmh0dHBzOi8vZ29vZ2xlLXRhZ21hbmFnZXIuY29tL2d0YWc/aWQ9WFlaXCI7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZChjb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRvd25sb2FkJyxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZC5zdGFydHNXaXRoKCd1cmw6JykpIHJldHVybiAnXFwwJyArIGlkO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKCdcXDB1cmw6JykpIHJldHVybjtcblxuICAgICAgLy8gTG9hZCBmaWxlIGZyb20gbmV0d29yayBvciBjYWNoZVxuICAgICAgY29uc3QgdXJsID0gaWQucmVwbGFjZSgnXFwwdXJsOicsICcnKTtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaENhY2hlZCh1cmwsIGNvbmZpZyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBIVE1MIGZpbGVzIG91dHB1dCBieSBhIG11bHRpcGFnZSBidWlsZCBhcmUgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uIFRoaXMgZG9lcyB0d29cbiAqIHRoaW5nczpcbiAqXG4gKiAxLiBNb3ZlcyB0aGUgSE1UTCBmaWxlcyB0byB0aGVpciBmaW5hbCBsb2NhdGlvbiBhdCBgPG91dERpcj4vPGVudHJ5cG9pbnQubmFtZT4uaHRtbGAuXG4gKiAyLiBVcGRhdGVzIHRoZSBidW5kbGUgc28gaXQgc3VtbWFyaXplcyB0aGUgZmlsZXMgY29ycmVjdGx5IGluIHRoZSByZXR1cm5lZCBidWlsZCBvdXRwdXQuXG4gKlxuICogQXNzZXRzIChKUyBhbmQgQ1NTKSBhcmUgb3V0cHV0IHRvIHRoZSBgPG91dERpcj4vYXNzZXRzYCBkaXJlY3RvcnksIGFuZCBkb24ndCBuZWVkIHRvIGJlIG1vZGlmaWVkLlxuICogSFRNTCBmaWxlcyBhY2Nlc3MgdGhlbSB2aWEgYWJzb2x1dGUgVVJMcywgc28gd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgYW55IGltcG9ydCBwYXRocyBpbiB0aGUgSFRNTFxuICogZmlsZXMgZWl0aGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwYWdlTW92ZShcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0Om11bHRpcGFnZS1tb3ZlJyxcbiAgICBhc3luYyB3cml0ZUJ1bmRsZShfLCBidW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkQnVuZGxlUGF0aCBpbiBidW5kbGUpIHtcbiAgICAgICAgLy8gb2xkQnVuZGxlUGF0aCA9ICdlbnRyeXBvaW50cy9wb3B1cC5odG1sJyBvciAnZW50cnlwb2ludHMvbyBwdGlvbnMvaW5kZXguaHRtbCdcblxuICAgICAgICAvLyBGaW5kIGEgbWF0Y2hpbmcgZW50cnlwb2ludCAtIG9sZEJ1bmRsZVBhdGggaXMgdGhlIHNhbWUgYXMgZW5kIGVuZCBvZiB0aGUgaW5wdXQgcGF0aC5cbiAgICAgICAgY29uc3QgZW50cnlwb2ludCA9IGVudHJ5cG9pbnRzLmZpbmQoXG4gICAgICAgICAgKGVudHJ5KSA9PiAhIWVudHJ5LmlucHV0UGF0aC5lbmRzV2l0aChvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVudHJ5cG9pbnQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ05vIGVudHJ5cG9pbnQgZm91bmQgZm9yJywgb2xkQnVuZGxlUGF0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIG5ldyBidW5kbGUgcGF0aFxuICAgICAgICBjb25zdCBuZXdCdW5kbGVQYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgIGV4dG5hbWUob2xkQnVuZGxlUGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZXdCdW5kbGVQYXRoID09PSBvbGRCdW5kbGVQYXRoKSB7XG4gICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdIVE1MIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbicsXG4gICAgICAgICAgICBvbGRCdW5kbGVQYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIGZpbGUgYW5kIHVwZGF0ZSBidW5kbGVcbiAgICAgICAgLy8gRG8gdGhpcyBpbnNpZGUgYSBtdXRleCBsb2NrIHNvIGl0IG9ubHkgcnVucyBvbmUgYXQgYSB0aW1lIGZvciBjb25jdXJyZW50IG11bHRpcGFnZSBidWlsZHNcbiAgICAgICAgY29uc3Qgb2xkQWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgb2xkQnVuZGxlUGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld0Fic1BhdGggPSByZXNvbHZlKGNvbmZpZy5vdXREaXIsIG5ld0J1bmRsZVBhdGgpO1xuICAgICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShuZXdBYnNQYXRoKSk7XG4gICAgICAgIGF3YWl0IGZzLm1vdmUob2xkQWJzUGF0aCwgbmV3QWJzUGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG5cbiAgICAgICAgY29uc3QgcmVuYW1lZENodW5rID0ge1xuICAgICAgICAgIC4uLmJ1bmRsZVtvbGRCdW5kbGVQYXRoXSxcbiAgICAgICAgICBmaWxlTmFtZTogbmV3QnVuZGxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgZGVsZXRlIGJ1bmRsZVtvbGRCdW5kbGVQYXRoXTtcbiAgICAgICAgYnVuZGxlW25ld0J1bmRsZVBhdGhdID0gcmVuYW1lZENodW5rO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldFVuaW1wb3J0T3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2F1dG8taW1wb3J0cyc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGV4dG5hbWUgfSBmcm9tICdwYXRoJztcblxuY29uc3QgRU5BQkxFRF9FWFRFTlNJT05TOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHtcbiAgJy5qcyc6IHRydWUsXG4gICcuanN4JzogdHJ1ZSxcbiAgJy50cyc6IHRydWUsXG4gICcudHN4JzogdHJ1ZSxcbiAgJy52dWUnOiB0cnVlLFxuICAnLnN2ZWx0ZSc6IHRydWUsXG59O1xuXG4vKipcbiAqIEluamVjdCBhbnkgZ2xvYmFsIGltcG9ydHMgZGVmaW5lZCBieSB1bmltcG9ydFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pbXBvcnQoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChvcHRpb25zKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6dW5pbXBvcnQnLFxuICAgIGFzeW5jIGNvbmZpZygpIHtcbiAgICAgIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBjb25zdCBleHQgPSBleHRuYW1lKGlkKTtcbiAgICAgIGlmIChFTkFCTEVEX0VYVEVOU0lPTlNbZXh0XSkgcmV0dXJuIHVuaW1wb3J0LmluamVjdEltcG9ydHMoY29kZSwgaWQpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgVW5pbXBvcnRPcHRpb25zIH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBtZXJnZUNvbmZpZyB9IGZyb20gJ3ZpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pbXBvcnRPcHRpb25zKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+IHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPiA9IHtcbiAgICBkZWJ1Z0xvZzogY29uZmlnLmxvZ2dlci5kZWJ1ZyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICB7IG5hbWU6ICcqJywgYXM6ICdicm93c2VyJywgZnJvbTogJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCcgfSxcbiAgICAgIHsgbmFtZTogJ2RlZmluZUNvbmZpZycsIGZyb206ICd3eHQnIH0sXG4gICAgXSxcbiAgICBwcmVzZXRzOiBbeyBwYWNrYWdlOiAnd3h0L2NsaWVudCcgfV0sXG4gICAgd2FybjogY29uZmlnLmxvZ2dlci53YXJuLFxuICAgIGRpcnM6IFsnY29tcG9uZW50cycsICdjb21wb3NhYmxlcycsICdob29rcycsICd1dGlscyddLFxuICB9O1xuXG4gIHJldHVybiBtZXJnZUNvbmZpZyhcbiAgICBkZWZhdWx0T3B0aW9ucyxcbiAgICBjb25maWcuaW1wb3J0cyxcbiAgKSBhcyBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz47XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogV3JhcHMgYSB1c2VyJ3MgZW50cnlwb2ludCB3aXRoIGEgdml0dWFsIHZlcnNpb24gd2l0aCBhZGRpdGlvbmFsIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlydHVhbEVudHJ5cG9pbihcbiAgdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGx1Z2luIHtcbiAgY29uc3QgdmlydHVhbElkID0gYHZpcnR1YWw6d3h0LSR7dHlwZX0/YDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsSWQgPSBgXFwwJHt2aXJ0dWFsSWR9YDtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGB3eHQ6dmlydHVhbC1lbnRyeXBvaW50YCxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIC8vIElkIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXgsIGl0IGxvb2tzIGxpa2UgdGhpczpcbiAgICAgIC8vIC9wYXRoL3RvL3Byb2plY3QvdmlydHVhbDpiYWNrZ3JvdW5kPy9wYXRoL3RvL3Byb2plY3QvZW50cnlwb2ludHMvYmFja2dyb3VuZC50c1xuICAgICAgY29uc3QgaW5kZXggPSBpZC5pbmRleE9mKHZpcnR1YWxJZCk7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IGlkLnN1YnN0cmluZyhpbmRleCArIHZpcnR1YWxJZC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkVmlydHVhbElkICsgaW5wdXRQYXRoO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKHJlc29sdmVkVmlydHVhbElkKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSBpZC5yZXBsYWNlKHJlc29sdmVkVmlydHVhbElkLCAnJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgIGBub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzLyR7dHlwZX0tZW50cnlwb2ludC5qc2AsXG4gICAgICAgICksXG4gICAgICAgICd1dGYtOCcsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoYHZpcnR1YWw6dXNlci0ke3R5cGV9YCwgaW5wdXRQYXRoKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGhzIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHNjb25maWdQYXRocyhjb25maWc6IEludGVybmFsQ29uZmlnKSB7XG4gIGNvbnN0IGZuOiB0eXBlb2YgcGF0aHMgPVxuICAgIHR5cGVvZiBwYXRocyA9PT0gJ2Z1bmN0aW9uJyA/IHBhdGhzIDogKHBhdGhzIGFzIGFueSkuZGVmYXVsdDtcbiAgcmV0dXJuIGZuKHtcbiAgICByb290OiBjb25maWcucm9vdCxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5cbi8qKlxuICogTG9nIHdoZW4gSE1SIGNoYW5nZXMgYXJlIGZpcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBobXJMb2dnZXIoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDpobXItbG9nZ2VyJyxcbiAgICBhcHBseTogJ3NlcnZlJyxcbiAgICBoYW5kbGVIb3RVcGRhdGUoY3R4KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGN0eC5maWxlLnN0YXJ0c1dpdGgoY29uZmlnLnNyY0RpcikgJiZcbiAgICAgICAgIWN0eC5maWxlLnN0YXJ0c1dpdGgoY29uZmlnLnd4dERpcikgJiZcbiAgICAgICAgIWN0eC5maWxlLmVuZHNXaXRoKCcuaHRtbCcpXG4gICAgICApIHtcbiAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICdIb3QgcmVsb2FkOiAnICsgcGMuZGltKHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGN0eC5maWxlKSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgRnNDYWNoZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBBIGJhc2ljIGZpbGUgc3lzdGVtIGNhY2hlIHN0b3JlZCBhdCBgPHNyY0Rpcj4vLnd4dC9jYWNoZS88a2V5PmAuIEp1c3QgY2FjaGVzIGEgc3RyaW5nIGluIGFcbiAqIGZpbGUgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKlxuICogQHBhcmFtIHNyY0RpciBBYnNvbHV0ZSBwYXRoIHRvIHNvdXJjZSBkaXJlY3RvcnkuIFNlZSBgSW50ZXJuYWxDb25maWcuc3JjRGlyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDYWNoZSh3eHREaXI6IHN0cmluZyk6IEZzQ2FjaGUge1xuICBjb25zdCBnZXRQYXRoID0gKGtleTogc3RyaW5nKSA9PlxuICAgIHJlc29sdmUod3h0RGlyLCAnY2FjaGUnLCBlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShwYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aCwgdmFsdWUsICd1dGYtOCcpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFscyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55OyB0eXBlOiBzdHJpbmcgfT4ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdfX01BTklGRVNUX1ZFUlNJT05fXycsXG4gICAgICB2YWx1ZTogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgIHR5cGU6IGAyIHwgM2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19CUk9XU0VSX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyLFxuICAgICAgdHlwZTogYFwiY2hyb21pdW1cIiB8IFwiZmlyZWZveFwiYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0NIUk9NRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2Nocm9tZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19GSVJFRk9YX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19TQUZBUklfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRURHRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2VkZ2UnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfT1BFUkFfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdvcGVyYScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19DT01NQU5EX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5jb21tYW5kLFxuICAgICAgdHlwZTogYFwiYnVpbGRcIiB8IFwic2VydmVcImAsXG4gICAgfSxcbiAgXTtcbn1cbiIsICJpbXBvcnQgeyBCdWlsZE91dHB1dCwgV3h0RGV2U2VydmVyLCBJbmxpbmVDb25maWcgfSBmcm9tICcuL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGRldGVjdERldkNoYW5nZXMgfSBmcm9tICcuL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwsIHJlYnVpbGQgfSBmcm9tICcuL2NvcmUvYnVpbGQnO1xuaW1wb3J0IHtcbiAgZ2V0U2VydmVySW5mbyxcbiAgcmVsb2FkQ29udGVudFNjcmlwdHMsXG4gIHJlbG9hZEh0bWxQYWdlcyxcbiAgc2V0dXBTZXJ2ZXIsXG59IGZyb20gJy4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS90eXBlcy9leHRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lQ29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS91dGlscy9kZWZpbmVSdW5uZXJDb25maWcnO1xuXG4vKipcbiAqIEJ1bmRsZXMgdGhlIGV4dGVuc2lvbiBmb3IgcHJvZHVjdGlvbi4gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogSW5saW5lQ29uZmlnKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNvbmZpZywgJ2J1aWxkJyk7XG4gIHJldHVybiBhd2FpdCBidWlsZEludGVybmFsKGludGVybmFsQ29uZmlnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3Qgc2VydmVySW5mbyA9IGF3YWl0IGdldFNlcnZlckluZm8oKTtcblxuICBjb25zdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZyA9ICgpID0+IHtcbiAgICBjb25zdCB2aXRlQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgICBzZXJ2ZXJJbmZvLnZpdGVTZXJ2ZXJDb25maWcsXG4gICAgICBjb25maWc/LnZpdGUgPz8ge30sXG4gICAgKTtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb25maWcoeyAuLi5jb25maWcsIHZpdGU6IHZpdGVDb25maWcgfSwgJ3NlcnZlJyk7XG4gIH07XG5cbiAgbGV0IGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcoKTtcbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2V0dXBTZXJ2ZXIoc2VydmVySW5mbywgaW50ZXJuYWxDb25maWcpO1xuICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cbiAgY29uc3QgZmlsZUNoYW5nZWRNdXRleCA9IG5ldyBNdXRleCgpO1xuICBjb25zdCBjaGFuZ2VRdWV1ZTogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcblxuICBzZXJ2ZXIud3Mub24oJ3d4dDpiYWNrZ3JvdW5kLWluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGNvbnRlbnQgc2NyaXB0cyBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2UgdGhleSdyZSBub3QgbGlzdGVkIGluIHRoZSBtYW5pZmVzdFxuICAgIHJlbG9hZENvbnRlbnRTY3JpcHRzKHNlcnZlci5jdXJyZW50T3V0cHV0LnN0ZXBzLCBpbnRlcm5hbENvbmZpZywgc2VydmVyKTtcbiAgfSk7XG5cbiAgc2VydmVyLndhdGNoZXIub24oJ2FsbCcsIGFzeW5jIChldmVudCwgcGF0aCwgX3N0YXRzKSA9PiB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGRldGVjdERldkNoYW5nZXMoZmlsZUNoYW5nZXMsIHNlcnZlci5jdXJyZW50T3V0cHV0KTtcblxuICAgICAgaWYgKGNoYW5nZXMudHlwZSA9PT0gJ25vLWNoYW5nZScpIHJldHVybjtcblxuICAgICAgLy8gTG9nIHRoZSBlbnRyeXBvaW50cyB0aGF0IHdlcmUgZWZmZWN0ZWRcbiAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IG5ld091dHB1dDtcblxuICAgICAgLy8gUGVyZm9ybSByZWxvYWRzXG4gICAgICBzd2l0Y2ggKGNoYW5nZXMudHlwZSkge1xuICAgICAgICBjYXNlICdleHRlbnNpb24tcmVsb2FkJzpcbiAgICAgICAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRIdG1sUGFnZXMoY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLCBzZXJ2ZXIsIGludGVybmFsQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRDb250ZW50U2NyaXB0cyhjaGFuZ2VzLmNoYW5nZWRTdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkOiAke3JlYnVpbHROYW1lc31gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBhcnJheTogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBCdWlsZFN0ZXBPdXRwdXQsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBldmVyeSB9IGZyb20gJy4vYXJyYXlzJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9XG4gICAgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShjaGFuZ2VkRmlsZXMsIChbXywgZmlsZV0pID0+IGZpbGUuZW5kc1dpdGgoJy5odG1sJykpO1xuICBpZiAoaXNPbmx5SHRtbENoYW5nZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2h0bWwtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc09ubHlDb250ZW50U2NyaXB0cyA9XG4gICAgY2hhbmdlZE91dHB1dC5zdGVwcy5sZW5ndGggPiAwICYmXG4gICAgZXZlcnkoXG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgICAgKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSAnY29udGVudC1zY3JpcHQnLFxuICAgICk7XG4gIGlmIChpc09ubHlDb250ZW50U2NyaXB0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgY2hhbmdlZFN0ZXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJyxcbiAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gIH07XG59XG5cbi8qKlxuICogRm9yIGEgc2luZ2xlIGNoYW5nZSwgcmV0dXJuIGFsbCB0aGUgc3RlcCBvZiB0aGUgYnVpbGQgb3V0cHV0IHRoYXQgd2VyZSBlZmZlY3RlZCBieSBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZEVmZmVjdGVkU3RlcHMoXG4gIGNoYW5nZWRGaWxlOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXSxcbiAgY3VycmVudE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBEZXRlY3RlZENoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogRGV0ZWN0ZWRDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjaGFuZ2VkUGF0aCA9IGNoYW5nZWRGaWxlWzFdO1xuXG4gIGNvbnN0IGlzQ2h1bmtFZmZlY3RlZCA9IChcbiAgICBjaHVuazogdml0ZS5Sb2xsdXAuT3V0cHV0Q2h1bmsgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldCxcbiAgKTogYm9vbGVhbiA9PlxuICAgIC8vIElmIGl0J3MgYW4gSFRNTCBmaWxlIHdpdGggdGhlIHNhbWUgcGF0aCwgaXMgaXMgZWZmZWN0ZWQgYmVjYXVzZSBIVE1MIGZpbGVzIG5lZWQgdG8gYmUgcHJlLXJlbmRlcmVkXG4gICAgLy8gVE9ETzogdXNlIGJ1bmRsZSBwYXRoIHRvIHN1cHBvcnQgYDxuYW1lPi9pbmRleC5odG1sYD9cbiAgICAoY2h1bmsudHlwZSA9PT0gJ2Fzc2V0JyAmJiBjaGFuZ2VkUGF0aC5lbmRzV2l0aChjaHVuay5maWxlTmFtZSkpIHx8XG4gICAgLy8gSWYgaXQncyBhIGNodW5rIHRoYXQgZGVwZW5kcyBvbiB0aGUgY2hhbmdlZCBmaWxlLCBpdCBpcyBlZmZlY3RlZFxuICAgIChjaHVuay50eXBlID09PSAnY2h1bmsnICYmIGNodW5rLm1vZHVsZUlkcy5pbmNsdWRlcyhjaGFuZ2VkUGF0aCkpO1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgY29uc3QgZWZmZWN0ZWRDaHVuayA9IHN0ZXAuY2h1bmtzLmZpbmQoKGNodW5rKSA9PiBpc0NodW5rRWZmZWN0ZWQoY2h1bmspKTtcbiAgICBpZiAoZWZmZWN0ZWRDaHVuaykgY2hhbmdlcy5wdXNoKHN0ZXApO1xuICB9XG5cbiAgY29uc3QgZWZmZWN0ZWRBc3NldCA9IGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzLmZpbmQoKGNodW5rKSA9PlxuICAgIGlzQ2h1bmtFZmZlY3RlZChjaHVuayksXG4gICk7XG4gIGlmIChlZmZlY3RlZEFzc2V0KSBjaGFuZ2VzLnB1c2goZWZmZWN0ZWRBc3NldCk7XG5cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBmaWxlcyBjaGFuZ2VkLCB3aGF0IG5lZWRzIHJlYnVpbHQsIGFuZCB0aGUgdHlwZSBvZiByZWxvYWQgdGhhdCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERldk1vZGVDaGFuZ2UgPVxuICB8IE5vQ2hhbmdlXG4gIHwgSHRtbFJlbG9hZFxuICB8IEV4dGVuc2lvblJlbG9hZFxuICB8IENvbnRlbnRTY3JpcHRSZWxvYWQ7XG4vLyB8IEJyb3dzZXJSZXN0YXJ0XG5cbmludGVyZmFjZSBOb0NoYW5nZSB7XG4gIHR5cGU6ICduby1jaGFuZ2UnO1xufVxuXG5pbnRlcmZhY2UgUmVidWlsZENoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbnRyeXBvaW50cyB0aGF0IG5lZWQgcmVidWlsdC5cbiAgICovXG4gIHJlYnVpbGRHcm91cHM6IEVudHJ5cG9pbnRHcm91cFtdO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIG91dHB1dCBzdHJpcHBlZCBvZiBhbnkgZmlsZXMgYXJlIGdvaW5nIHRvIGNoYW5nZS5cbiAgICovXG4gIGNhY2hlZE91dHB1dDogQnVpbGRPdXRwdXQ7XG59XG5cbmludGVyZmFjZSBIdG1sUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdodG1sLXJlbG9hZCc7XG59XG5cbmludGVyZmFjZSBFeHRlbnNpb25SZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnO1xufVxuXG4vLyBpbnRlcmZhY2UgQnJvd3NlclJlc3RhcnQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbi8vICAgdHlwZTogJ2Jyb3dzZXItcmVzdGFydCc7XG4vLyB9XG5cbmludGVyZmFjZSBDb250ZW50U2NyaXB0UmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnO1xuICBjaGFuZ2VkU3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdO1xufVxuXG4vKipcbiAqIFdoZW4gZmlndXJpbmcgb3V0IHdoYXQgbmVlZHMgcmVsb2FkZWQsIHRoaXMgc3RvcmVzIHRoZSBzdGVwIHRoYXQgd2FzIGNoYW5nZWQsIG9yIHRoZSBwdWJsaWNcbiAqIGRpcmVjdG9yeSBhc3NldCB0aGF0IHdhcyBjaGFuZ2VkLiBJdCBkb2Vzbid0IGtub3cgd2hhdCB0eXBlIG9mIGNoYW5nZSBpcyByZXF1aXJlZCB5ZXQuIEp1c3QgYW5cbiAqIGludGVybWVkaWF0ZSB0eXBlLlxuICovXG50eXBlIERldGVjdGVkQ2hhbmdlID0gQnVpbGRTdGVwT3V0cHV0IHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQ7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0LFxuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IHJlbW92ZUVtcHR5RGlycyB9IGZyb20gJy4uL3V0aWxzL3JlbW92ZUVtcHR5RGlycyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFbnRyeXBvaW50cyhcbiAgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IGxpYk1vZGU6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBidWlsZDoge1xuICAgICAgbGliOiB7XG4gICAgICAgIGVudHJ5LFxuICAgICAgICBmb3JtYXRzOiBbJ2lpZmUnXSxcbiAgICAgICAgbmFtZTogJ18nLFxuICAgICAgICBmaWxlTmFtZTogZW50cnlwb2ludC5uYW1lLFxuICAgICAgfSxcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gVGhlcmUncyBvbmx5IGEgc2luZ2xlIG91dHB1dCBmb3IgdGhpcyBidWlsZCwgc28gd2UgdXNlIHRoZSBkZXNpcmVkIGJ1bmRsZSBwYXRoIGZvciB0aGVcbiAgICAgICAgICAvLyBlbnRyeSBvdXRwdXQgKGxpa2UgXCJjb250ZW50LXNjcmlwdHMvb3ZlcmxheS5qc1wiKVxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgJy5qcycsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBPdXRwdXQgY29udGVudCBzY3JpcHQgQ1NTIHRvIGFzc2V0cy8gd2l0aCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHMuIERlZmF1bHRzIHRvXG4gICAgICAgICAgLy8gXCJbbmFtZV0uW2V4dF1cIiBpbiBsaWIgbW9kZSwgd2hpY2ggdXN1YWxseSByZXN1bHRzIGluIFwic3R5bGUuY3NzXCIuIFRoYXQgbWVhbnMgbXVsdGlwbGVcbiAgICAgICAgICAvLyBjb250ZW50IHNjcmlwdHMgd2l0aCBzdHlsZXMgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIgaWYgaXQgd2VyZW4ndCBjaGFuZ2VkIGJlbG93LlxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBgYXNzZXRzLyR7ZW50cnlwb2ludC5uYW1lfS5bZXh0XWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBsaWJNb2RlLFxuICAgIGNvbmZpZy52aXRlLFxuICApIGFzIHZpdGUuSW5saW5lQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzOiBlbnRyeXBvaW50LFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBVc2UgVml0ZSdzIG11bHRpcGFnZSBidWlsZCB0byBidW5kbGUgYWxsIHRoZSBlbnRyeXBvaW50cyBpbiBhIHNpbmdsZSBzdGVwLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZE11bHRpcGxlRW50cnlwb2ludHMoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkU3RlcE91dHB1dD4ge1xuICBjb25zdCBtdWx0aVBhZ2U6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBwbHVnaW5zOiBbcGx1Z2lucy5tdWx0aXBhZ2VNb3ZlKGVudHJ5cG9pbnRzLCBjb25maWcpXSxcbiAgICBidWlsZDoge1xuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBpbnB1dDogZW50cnlwb2ludHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChpbnB1dCwgZW50cnkpID0+IHtcbiAgICAgICAgICBpbnB1dFtlbnRyeS5uYW1lXSA9IGVudHJ5LmlucHV0UGF0aDtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH0sIHt9KSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBjaHVua0ZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBJbmNsdWRlIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiAnY2h1bmtzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIC8vIFdlIGNhbid0IGNvbnRyb2wgdGhlIFwibmFtZVwiLCBzbyB3ZSBuZWVkIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAnYXNzZXRzL1tuYW1lXS1baGFzaF0uW2V4dF0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBtdWx0aVBhZ2UsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5Vc2VyQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzLFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbGRPdXRwdXRDaHVua3MoXG4gIHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB2aXRlLmJ1aWxkPj4sXG4pOiBCdWlsZFN0ZXBPdXRwdXRbJ2NodW5rcyddIHtcbiAgaWYgKCdvbicgaW4gcmVzdWx0KSB0aHJvdyBFcnJvcignd3h0IGRvZXMgbm90IHN1cHBvcnQgdml0ZSB3YXRjaCBtb2RlLicpO1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSByZXR1cm4gcmVzdWx0LmZsYXRNYXAoKHsgb3V0cHV0IH0pID0+IG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5UHVibGljRGlyZWN0b3J5KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10+IHtcbiAgY29uc3QgcHVibGljQXNzZXRzOiBCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10gPSBbXTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIHB1YmxpY0Fzc2V0cztcblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7IGN3ZDogY29uZmlnLnB1YmxpY0RpciB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbixcbiAgQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50LFxuICBJbnRlcm5hbENvbmZpZyxcbiAgT3B0aW9uc0VudHJ5cG9pbnQsXG4gIFBvcHVwRW50cnlwb2ludCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwaWNvbWF0Y2ggZnJvbSAncGljb21hdGNoJztcbmltcG9ydCB7IHBhcnNlSFRNTCB9IGZyb20gJ2xpbmtlZG9tJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBpbXBvcnRUc0ZpbGUgfSBmcm9tICcuLi91dGlscy9pbXBvcnRUc0ZpbGUnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuXG4vKipcbiAqIFJldHVybiBlbnRyeXBvaW50cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBieSBsb29raW5nIHRocm91Z2ggdGhlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRW50cnlwb2ludHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEVudHJ5cG9pbnRbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYignKiovKicsIHtcbiAgICBjd2Q6IGNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgfSk7XG4gIC8vIEVuc3VyZSBjb25zaXN0ZW50IG91dHB1dFxuICByZWxhdGl2ZVBhdGhzLnNvcnQoKTtcblxuICBjb25zdCBwYXRoR2xvYnMgPSBPYmplY3Qua2V5cyhQQVRIX0dMT0JfVE9fVFlQRV9NQVApO1xuICBjb25zdCBleGlzdGluZ05hbWVzOiBSZWNvcmQ8c3RyaW5nLCBFbnRyeXBvaW50IHwgdW5kZWZpbmVkPiA9IHt9O1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10gPSBbXTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgbWF0Y2hpbmdHbG9iID0gcGF0aEdsb2JzLmZpbmQoKGdsb2IpID0+XG4gICAgICAgIHBpY29tYXRjaC5pc01hdGNoKHJlbGF0aXZlUGF0aCwgZ2xvYiksXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdHbG9iID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgICBgJHtyZWxhdGl2ZVBhdGh9IGRvZXMgbm90IG1hdGNoIGFueSBrbm93biBlbnRyeXBvaW50LiBLbm93biBlbnRyeXBvaW50czpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgUEFUSF9HTE9CX1RPX1RZUEVfTUFQLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gUEFUSF9HTE9CX1RPX1RZUEVfTUFQW21hdGNoaW5nR2xvYl07XG4gICAgICBpZiAodHlwZSA9PT0gJ2lnbm9yZWQnKSByZXR1cm47XG5cbiAgICAgIGxldCBlbnRyeXBvaW50OiBFbnRyeXBvaW50O1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BvcHVwJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0UG9wdXBFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRPcHRpb25zRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdpdGhTYW1lTmFtZSA9IGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXTtcbiAgICAgIGlmICh3aXRoU2FtZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGggdGhlIG5hbWUgXCIke1xuICAgICAgICAgICAgZW50cnlwb2ludC5uYW1lXG4gICAgICAgICAgfVwiIGRldGVjdGVkLCBidXQgb25seSBvbmUgaXMgYWxsb3dlZDogJHtbXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgd2l0aFNhbWVOYW1lLmlucHV0UGF0aCksXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgZW50cnlwb2ludC5pbnB1dFBhdGgpLFxuICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZW50cnlwb2ludHMucHVzaChlbnRyeXBvaW50KTtcbiAgICAgIGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXSA9IGVudHJ5cG9pbnQ7XG4gICAgfSksXG4gICk7XG4gIHJldHVybiBlbnRyeXBvaW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwb3B1cCBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvcHVwRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxQb3B1cEVudHJ5cG9pbnQ+IHtcbiAgY29uc3Qgb3B0aW9uczogUG9wdXBFbnRyeXBvaW50WydvcHRpb25zJ10gPSB7fTtcblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHBhcnNlSFRNTChjb250ZW50KTtcblxuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG4gIGlmICh0aXRsZSAhPSBudWxsKSBvcHRpb25zLmRlZmF1bHRUaXRsZSA9IHRpdGxlLnRleHRDb250ZW50ID8/IHVuZGVmaW5lZDtcblxuICBjb25zdCBkZWZhdWx0SWNvbkNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5kZWZhdWx0X2ljb24nXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChkZWZhdWx0SWNvbkNvbnRlbnQpIHtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucy5kZWZhdWx0SWNvbiA9IEpTT041LnBhcnNlKGRlZmF1bHRJY29uQ29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25maWcubG9nZ2VyLmZhdGFsKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGRlZmF1bHRfaWNvbiBtZXRhIHRhZyBjb250ZW50IGFzIEpTT041LiBjb250ZW50PSR7ZGVmYXVsdEljb25Db250ZW50fWAsXG4gICAgICAgIGVycixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXYyS2V5Q29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LnR5cGUnXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChtdjJLZXlDb250ZW50KSB7XG4gICAgb3B0aW9ucy5tdjJLZXkgPVxuICAgICAgbXYyS2V5Q29udGVudCA9PT0gJ3BhZ2VfYWN0aW9uJyA/ICdwYWdlX2FjdGlvbicgOiAnYnJvd3Nlcl9hY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAncG9wdXAnLFxuICAgIG5hbWU6ICdwb3B1cCcsXG4gICAgb3B0aW9ucyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIG9wdGlvbnMgSFRNTCBmaWxlLlxuICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxPcHRpb25zRW50cnlwb2ludD4ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25zRW50cnlwb2ludFsnb3B0aW9ucyddID0ge307XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3Qgb3BlbkluVGFiQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0Lm9wZW5faW5fdGFiJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAob3BlbkluVGFiQ29udGVudCkge1xuICAgIG9wdGlvbnMub3BlbkluVGFiID0gQm9vbGVhbihvcGVuSW5UYWJDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBCb29sZWFuKGNocm9tZVN0eWxlQ29udGVudCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyU3R5bGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuYnJvd3Nlcl9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGJyb3dzZXJTdHlsZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmJyb3dzZXJTdHlsZSA9IEJvb2xlYW4oYnJvd3NlclN0eWxlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdvcHRpb25zJyxcbiAgICBuYW1lOiAnb3B0aW9ucycsXG4gICAgb3B0aW9ucyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGJhY2tncm91bmQncyBUUyBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxCYWNrZ3JvdW5kRW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9XG4gICAgYXdhaXQgaW1wb3J0VHNGaWxlPEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbj4ocGF0aCwgY29uZmlnKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdiYWNrZ3JvdW5kJyxcbiAgICBuYW1lOiAnYmFja2dyb3VuZCcsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGNvbnRlbnQgc2NyaXB0J3MgVFMgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxDb250ZW50U2NyaXB0RW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9IGF3YWl0IGltcG9ydFRzRmlsZTxDb250ZW50U2NyaXB0RGVmaW5pdGlvbj4oXG4gICAgcGF0aCxcbiAgICBjb25maWcsXG4gICk7XG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICB0aHJvdyBFcnJvcihgQ29udGVudCBzY3JpcHQgJHtuYW1lfSBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnRgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdjb250ZW50LXNjcmlwdCcsXG4gICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiByZXNvbHZlKGNvbmZpZy5vdXREaXIsICdjb250ZW50LXNjcmlwdHMnKSxcbiAgICBvcHRpb25zLFxuICB9O1xufVxuXG5jb25zdCBQQVRIX0dMT0JfVE9fVFlQRV9NQVA6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnRbJ3R5cGUnXSB8ICdpZ25vcmVkJz4gPSB7XG4gICdzYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICdzYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuXG4gICdib29rbWFya3MuaHRtbCc6ICdib29rbWFya3MnLFxuICAnYm9va21hcmtzL2luZGV4Lmh0bWwnOiAnYm9va21hcmtzJyxcblxuICAnaGlzdG9yeS5odG1sJzogJ2hpc3RvcnknLFxuICAnaGlzdG9yeS9pbmRleC5odG1sJzogJ2hpc3RvcnknLFxuXG4gICduZXd0YWIuaHRtbCc6ICduZXd0YWInLFxuICAnbmV3dGFiL2luZGV4Lmh0bWwnOiAnbmV3dGFiJyxcblxuICAnc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJ3NpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG5cbiAgJ2RldnRvb2xzLmh0bWwnOiAnZGV2dG9vbHMnLFxuICAnZGV2dG9vbHMvaW5kZXguaHRtbCc6ICdkZXZ0b29scycsXG5cbiAgJ2JhY2tncm91bmQudHMnOiAnYmFja2dyb3VuZCcsXG5cbiAgJ2NvbnRlbnQudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJ2NvbnRlbnQvaW5kZXgudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJyouY29udGVudC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICAnKi5jb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG5cbiAgJ3BvcHVwLmh0bWwnOiAncG9wdXAnLFxuICAncG9wdXAvaW5kZXguaHRtbCc6ICdwb3B1cCcsXG5cbiAgJ29wdGlvbnMuaHRtbCc6ICdvcHRpb25zJyxcbiAgJ29wdGlvbnMvaW5kZXguaHRtbCc6ICdvcHRpb25zJyxcblxuICAnKi5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi9pbmRleC5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi50cyc6ICd1bmxpc3RlZC1zY3JpcHQnLFxuXG4gIC8vIERvbid0IHdhcm4gYWJvdXQgYW55IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzLCBsaWtlIENTUyBvciBKUyBlbnRyeXBvaW50cyBmb3IgSFRNTCBmaWxlc1xuICAnKi8qJzogJ2lnbm9yZWQnLFxufTtcbiIsICJpbXBvcnQgY3JlYXRlSklUSSBmcm9tICdqaXRpJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHRyYW5zZm9ybSBmcm9tICdqaXRpL2Rpc3QvYmFiZWwnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi9hdXRvLWltcG9ydHMnO1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBgcGF0aGAuXG4gKlxuICogSXQgd29ya3MgYnk6XG4gKlxuICogMS4gUmVhZGluZyB0aGUgZmlsZSB0ZXh0XG4gKiAyLiBTdHJpcHBpbmcgYWxsIGltcG9ydHMgZnJvbSBpdCB2aWEgcmVnZXhcbiAqIDMuIEF1dG8taW1wb3J0IG9ubHkgdGhlIGNsaWVudCBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogVGhpcyBwcmV2ZW50cyByZXNvbHZpbmcgaW1wb3J0cyBvZiBpbXBvcnRzLCBzcGVlZGluZyB0aGluZ3MgdXAgYW5kIHByZXZlbnRpbmcgXCJ4eHggaXMgbm90XG4gKiBkZWZpbmVkXCIgZXJyb3JzLlxuICpcbiAqIERvd25zaWRlIGlzIHRoYXQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbWFpbiBmdWNudGlvbiBmb3IgdGhlIGVudHJ5cG9pbnQsXG4gKiBvdGhlcndpc2UgeW91IHdpbGwgc2VlIFwieHh4IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIGZvciBhbnkgaW1wb3J0cyB1c2VkIG91dHNpZGUgb2YgbWFpbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFRzRmlsZTxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZmlsZSBtZXRhZGF0YTonLCBwYXRoKTtcblxuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHtcbiAgICAuLi5nZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSxcbiAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmljIGltcG9ydHMsIG5vdCBhbGwgZnJvbSB0aGUgcHJvamVjdFxuICAgIGltcG9ydHM6IFt7IG5hbWU6ICcqJywgYXM6ICdicm93c2VyJywgZnJvbTogJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCcgfV0sXG4gICAgZGlyczogW10sXG4gIH0pO1xuICBhd2FpdCB1bmltcG9ydC5pbml0KCk7XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB0ZXh0Tm9JbXBvcnRzID0gdGV4dC5yZXBsYWNlKC9pbXBvcnQuKltcXG47XS9nbSwgJycpO1xuICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHVuaW1wb3J0LmluamVjdEltcG9ydHModGV4dE5vSW1wb3J0cyk7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgWydUZXh0OicsIHRleHQsICdObyBpbXBvcnRzOicsIHRleHROb0ltcG9ydHMsICdDb2RlOicsIGNvZGVdLmpvaW4oJ1xcbicpLFxuICApO1xuXG4gIGNvbnN0IGppdGkgPSBjcmVhdGVKSVRJKF9fZmlsZW5hbWUsIHtcbiAgICBjYWNoZTogZmFsc2UsXG4gICAgZXNtUmVzb2x2ZTogdHJ1ZSxcbiAgICBpbnRlcm9wRGVmYXVsdDogdHJ1ZSxcbiAgICBhbGlhczoge1xuICAgICAgJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc6IHJlc29sdmUoXG4gICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAnbm9kZV9tb2R1bGVzL3d4dC9kaXN0L3ZpcnR1YWwtbW9kdWxlcy9mYWtlLWJyb3dzZXIuanMnLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHRyYW5zZm9ybShvcHRzKSB7XG4gICAgICBpZiAob3B0cy5maWxlbmFtZSA9PT0gcGF0aCkgcmV0dXJuIHRyYW5zZm9ybSh7IC4uLm9wdHMsIHNvdXJjZTogY29kZSB9KTtcbiAgICAgIGVsc2UgcmV0dXJuIHRyYW5zZm9ybShvcHRzKTtcbiAgICB9LFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBqaXRpKHBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25maWcubG9nZ2VyLmVycm9yKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZXRVbmltcG9ydE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9hdXRvLWltcG9ydHMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFscyB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuXG4vKipcbiAqIEdlbmVyYXRlIGFuZCB3cml0ZSBhbGwgdGhlIGZpbGVzIGluc2lkZSB0aGUgYEludGVybmFsQ29uZmlnLnR5cGVzRGlyYCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVzRGlyKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcudHlwZXNEaXIpO1xuXG4gIGNvbnN0IHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZVBhdGhzRGVjbGFyYXRpb25GaWxlKGVudHJ5cG9pbnRzLCBjb25maWcpKTtcbiAgcmVmZXJlbmNlcy5wdXNoKGF3YWl0IHdyaXRlR2xvYmFsc0RlY2xhcmF0aW9uRmlsZShjb25maWcpKTtcblxuICBjb25zdCBtYWluUmVmZXJlbmNlID0gYXdhaXQgd3JpdGVNYWluRGVjbGFyYXRpb25GaWxlKHJlZmVyZW5jZXMsIGNvbmZpZyk7XG4gIGF3YWl0IHdyaXRlVHNDb25maWdGaWxlKG1haW5SZWZlcmVuY2UsIGNvbmZpZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0c0RlY2xhcmF0aW9uRmlsZShcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShjb25maWcudHlwZXNEaXIsICdpbXBvcnRzLmQudHMnKTtcbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSk7XG5cbiAgLy8gTG9hZCBwcm9qZWN0IGltcG9ydHMgaW50byB1bmltcG9ydCBtZW1vcnkgc28gdGhleSBhcmUgb3V0cHV0IHZpYSBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnNcbiAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIFsnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsIGF3YWl0IHVuaW1wb3J0LmdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucygpXS5qb2luKFxuICAgICAgJ1xcbicsXG4gICAgKSArICdcXG4nLFxuICApO1xuXG4gIHJldHVybiBmaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShjb25maWcudHlwZXNEaXIsICdwYXRocy5kLnRzJyk7XG4gIGNvbnN0IHVuaW9ucyA9IGVudHJ5cG9pbnRzXG4gICAgLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgZW50cnksXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgIGVudHJ5LmlucHV0UGF0aC5lbmRzV2l0aCgnLmh0bWwnKSA/ICcuaHRtbCcgOiAnLmpzJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYCAgfCBcIi8ke3BhdGh9XCJgO1xuICAgIH0pXG4gICAgLnNvcnQoKTtcblxuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgW1xuICAgICAgJy8vIEdlbmVyYXRlZCBieSB3eHQnLFxuICAgICAgJ3R5cGUgRW50cnlwb2ludFBhdGggPScsXG4gICAgICAuLi4odW5pb25zLmxlbmd0aCA9PT0gMCA/IFsnICBuZXZlciddIDogdW5pb25zKSxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBnZXRHbG9iYWxzKGNvbmZpZyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAnZXhwb3J0IHt9JyxcbiAgICAgICdkZWNsYXJlIGdsb2JhbCB7JyxcbiAgICAgIC4uLmdsb2JhbHMubWFwKChnbG9iYWwpID0+IGAgIGNvbnN0ICR7Z2xvYmFsLm5hbWV9OiAke2dsb2JhbC50eXBlfTtgKSxcbiAgICAgICd9JyxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICAgJ3V0Zi04JyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJ2aXRlL2NsaWVudFwiIC8+YCxcbiAgICAgIC4uLnJlZmVyZW5jZXMubWFwKFxuICAgICAgICAocmVmKSA9PiBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuLyR7cmVsYXRpdmUoZGlyLCByZWYpfVwiIC8+YCxcbiAgICAgICksXG4gICAgXS5qb2luKCdcXG4nKSArICdcXG4nLFxuICApO1xuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlVHNDb25maWdGaWxlKFxuICBtYWluUmVmZXJlbmNlOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIHJlc29sdmUoZGlyLCAndHNjb25maWcuanNvbicpLFxuICAgIGB7XG4gIFwiY29tcGlsZXJPcHRpb25zXCI6IHtcbiAgICBcInRhcmdldFwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlXCI6IFwiRVNOZXh0XCIsXG4gICAgXCJtb2R1bGVSZXNvbHV0aW9uXCI6IFwiQnVuZGxlclwiLFxuICAgIFwibm9FbWl0XCI6IHRydWUsXG4gICAgXCJlc01vZHVsZUludGVyb3BcIjogdHJ1ZSxcbiAgICBcImZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzXCI6IHRydWUsXG4gICAgXCJyZXNvbHZlSnNvbk1vZHVsZVwiOiB0cnVlLFxuXG4gICAgLyogVHlwZSBDaGVja2luZyAqL1xuICAgIFwic3RyaWN0XCI6IHRydWUsXG5cbiAgICAvKiBDb21wbGV0ZW5lc3MgKi9cbiAgICBcInNraXBMaWJDaGVja1wiOiB0cnVlLFxuXG4gICAgLyogQWxpYXNlcyAqL1xuICAgIFwiYmFzZVVybFwiOiBcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcucm9vdCl9XCIsXG4gICAgXCJwYXRoc1wiOiB7XG4gICAgICBcIkBAXCI6IFtcIi5cIl0sXG4gICAgICBcIkBALypcIjogW1wiLi8qXCJdLFxuICAgICAgXCJ+flwiOiBbXCIuXCJdLFxuICAgICAgXCJ+fi8qXCI6IFtcIi4vKlwiXSxcbiAgICAgIFwiQFwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX1cIl0sXG4gICAgICBcIkAvKlwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX0vKlwiXSxcbiAgICAgIFwiflwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX1cIl0sXG4gICAgICBcIn4vKlwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX0vKlwiXVxuICAgIH1cbiAgfSxcbiAgXCJpbmNsdWRlXCI6IFtcbiAgICBcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcucm9vdCl9LyoqLypcIixcbiAgICBcIi4vJHtyZWxhdGl2ZShkaXIsIG1haW5SZWZlcmVuY2UpfVwiXG4gIF0sXG4gIFwiZXhjbHVkZVwiOiBbXCIke3JlbGF0aXZlKGRpciwgY29uZmlnLm91dEJhc2VEaXIpfVwiXVxufWAsXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCdWlsZE91dHB1dCxcbiAgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQsXG4gIEludGVybmFsQ29uZmlnLFxuICBPcHRpb25zRW50cnlwb2ludCxcbiAgUG9wdXBFbnRyeXBvaW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IENvbnRlbnRTZWN1cml0eVBvbGljeSB9IGZyb20gJy4vQ29udGVudFNlY3VyaXR5UG9saWN5JztcblxuLyoqXG4gKiBXcml0ZXMgdGhlIG1hbmlmZXN0IHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBvdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0ciA9XG4gICAgY29uZmlnLm1vZGUgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgPyBKU09OLnN0cmluZ2lmeShtYW5pZmVzdClcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpO1xuXG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0RGlyKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlc29sdmUoY29uZmlnLm91dERpciwgJ21hbmlmZXN0Lmpzb24nKSwgc3RyLCAndXRmLTgnKTtcblxuICBvdXRwdXQucHVibGljQXNzZXRzLnVuc2hpZnQoe1xuICAgIHR5cGU6ICdhc3NldCcsXG4gICAgZmlsZU5hbWU6ICdtYW5pZmVzdC5qc29uJyxcbiAgICBuYW1lOiAnbWFuaWZlc3QnLFxuICAgIG5lZWRzQ29kZVJlZmVyZW5jZTogZmFsc2UsXG4gICAgc291cmNlOiBzdHIsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgbWFuaWZlc3QgYmFzZWQgb24gdGhlIGNvbmZpZyBhbmQgZW50cnlwb2ludHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1haW5mZXN0KFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0PiB7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGdldFBhY2thZ2VKc29uKGNvbmZpZyk7XG4gIGlmIChwa2cudmVyc2lvbiA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKCdwYWNrYWdlLmpzb24gZG9lcyBub3QgaW5jbHVkZSBhIHZlcnNpb24nKTtcbiAgaWYgKHBrZy5uYW1lID09IG51bGwpIHRocm93IEVycm9yKCdwYWNrYWdlLmpzb24gZG9lcyBub3QgaW5jbHVkZSBhIG5hbWUnKTtcbiAgaWYgKHBrZy5kZXNjcmlwdGlvbiA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKCdwYWNrYWdlLmpzb24gZG9lcyBub3QgaW5jbHVkZSBhIGRlc2NyaXB0aW9uJyk7XG5cbiAgY29uc3QgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0ID0ge1xuICAgIG1hbmlmZXN0X3ZlcnNpb246IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgbmFtZTogcGtnLm5hbWUsXG4gICAgc2hvcnRfbmFtZTogcGtnLnNob3J0TmFtZSxcbiAgICB2ZXJzaW9uOiBzaW1wbGlmeVZlcnNpb24ocGtnLnZlcnNpb24pLFxuICAgIHZlcnNpb25fbmFtZTogY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyA/IHVuZGVmaW5lZCA6IHBrZy52ZXJzaW9uLFxuICAgIC4uLmNvbmZpZy5tYW5pZmVzdCxcbiAgfTtcblxuICBhZGRFbnRyeXBvaW50cyhtYW5pZmVzdCwgZW50cnlwb2ludHMsIGJ1aWxkT3V0cHV0LCBjb25maWcpO1xuXG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykgYWRkRGV2TW9kZUNzcChtYW5pZmVzdCwgY29uZmlnKTtcbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlUGVybWlzc2lvbnMobWFuaWZlc3QsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cbiAqXG4gKiBUT0RPOiBsb29rIGluIHJvb3QgYW5kIHVwIGRpcmVjdG9yaWVzIHVudGlsIGl0J3MgZm91bmRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUpzb24oY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBhd2FpdCBmcy5yZWFkSnNvbihyZXNvbHZlKGNvbmZpZy5yb290LCAncGFja2FnZS5qc29uJykpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgc3VmZml4ZXMgZnJvbSB0aGUgdmVyc2lvbiwgbGlrZSBYLlkuWi1hbHBoYTEgKHdoaWNoIGJyb3NlcnMgZG9uJ3QgYWxsb3cpLCBzbyBpdCdzIGFcbiAqIHNpbXBsZSB2ZXJzaW9uIG51bWJlciwgbGlrZSBYIG9yIFguWSBvciBYLlkuWiwgd2hpY2ggYnJvd3NlcnMgYWxsb3cuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5VmVyc2lvbih2ZXJzaW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVnZXggYWRhcHRlZCBmcm9tIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9BZGQtb25zL1dlYkV4dGVuc2lvbnMvbWFuaWZlc3QuanNvbi92ZXJzaW9uI3ZlcnNpb25fZm9ybWF0XG5cbiAgY29uc3QgdmVyc2lvbiA9IC9eKCgwfFsxLTldWzAtOV17MCw4fSkoWy5dKDB8WzEtOV1bMC05XXswLDh9KSl7MCwzfSkuKiQvLmV4ZWMoXG4gICAgdmVyc2lvbk5hbWUsXG4gICk/LlsxXTtcblxuICBpZiAodmVyc2lvbiA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYENhbm5vdCBzaW1wbGlmeSBwYWNrYWdlLmpzb24gdmVyc2lvbiBcIiR7dmVyc2lvbk5hbWV9XCIgdG8gYSB2YWxpZCBleHRlbnNpb24gdmVyc2lvbiwgXCJYLlkuWlwiYCxcbiAgICApO1xuXG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50cyhcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZW50cmllc0J5VHlwZSA9IGVudHJ5cG9pbnRzLnJlZHVjZTxcbiAgICBQYXJ0aWFsPFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEVudHJ5cG9pbnRbXT4+XG4gID4oKG1hcCwgZW50cnlwb2ludCkgPT4ge1xuICAgIG1hcFtlbnRyeXBvaW50LnR5cGVdID8/PSBbXTtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXT8ucHVzaChlbnRyeXBvaW50KTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCB7fSk7XG5cbiAgY29uc3QgYmFja2dyb3VuZCA9IGVudHJpZXNCeVR5cGVbJ2JhY2tncm91bmQnXT8uWzBdIGFzXG4gICAgfCBCYWNrZ3JvdW5kRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBib29rbWFya3MgPSBlbnRyaWVzQnlUeXBlWydib29rbWFya3MnXT8uWzBdO1xuICBjb25zdCBjb250ZW50U2NyaXB0cyA9IGVudHJpZXNCeVR5cGVbJ2NvbnRlbnQtc2NyaXB0J10gYXNcbiAgICB8IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W11cbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZGV2dG9vbHMgPSBlbnRyaWVzQnlUeXBlWydkZXZ0b29scyddPy5bMF07XG4gIGNvbnN0IGhpc3RvcnkgPSBlbnRyaWVzQnlUeXBlWydoaXN0b3J5J10/LlswXTtcbiAgY29uc3QgbmV3dGFiID0gZW50cmllc0J5VHlwZVsnbmV3dGFiJ10/LlswXTtcbiAgY29uc3Qgb3B0aW9ucyA9IGVudHJpZXNCeVR5cGVbJ29wdGlvbnMnXT8uWzBdIGFzXG4gICAgfCBPcHRpb25zRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBwb3B1cCA9IGVudHJpZXNCeVR5cGVbJ3BvcHVwJ10/LlswXSBhcyBQb3B1cEVudHJ5cG9pbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNhbmRib3hlcyA9IGVudHJpZXNCeVR5cGVbJ3NhbmRib3gnXTtcbiAgY29uc3Qgc2lkZXBhbmVscyA9IGVudHJpZXNCeVR5cGVbJ3NpZGVwYW5lbCddO1xuXG4gIGlmIChiYWNrZ3JvdW5kKSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoYmFja2dyb3VuZCwgY29uZmlnLm91dERpciwgJy5qcycpO1xuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICB0eXBlOiBiYWNrZ3JvdW5kLm9wdGlvbnMudHlwZSxcbiAgICAgICAgc2VydmljZV93b3JrZXI6IHNjcmlwdCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmJhY2tncm91bmQgPSB7XG4gICAgICAgIHBlcnNpc3RlbnQ6IGJhY2tncm91bmQub3B0aW9ucy5wZXJzaXN0ZW50LFxuICAgICAgICBzY3JpcHRzOiBbc2NyaXB0XSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGJvb2ttYXJrcykge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuYm9va21hcmtzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGJvb2ttYXJrcyBpcyB1bnR5cGVkIGluIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCwgYnV0IHN1cHBvcnRlZCBieSBjaHJvbWVcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBib29rbWFya3MsXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoaXN0b3J5KSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ0Jvb2ttYXJrcyBhcmUgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBjaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5IHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhpc3RvcnkgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXd0YWIpIHtcbiAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMubmV3dGFiID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBuZXd0YWIsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKHBvcHVwKSB7XG4gICAgY29uc3QgZGVmYXVsdF9wb3B1cCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgcG9wdXAsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbnM6IE1hbmlmZXN0LkFjdGlvbk1hbmlmZXN0ID0ge1xuICAgICAgZGVmYXVsdF9pY29uOiBwb3B1cC5vcHRpb25zLmRlZmF1bHRJY29uLFxuICAgICAgZGVmYXVsdF90aXRsZTogcG9wdXAub3B0aW9ucy5kZWZhdWx0VGl0bGUsXG4gICAgfTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYWN0aW9uID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3RbcG9wdXAub3B0aW9ucy5tdjJLZXkgPz8gJ2Jyb3dzZXJfYWN0aW9uJ10gPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcG9wdXAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXZ0b29scykge1xuICAgIG1hbmlmZXN0LmRldnRvb2xzX3BhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRldnRvb2xzLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgY29uc3QgcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKG9wdGlvbnMsIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIG1hbmlmZXN0Lm9wdGlvbnNfdWkgPSB7XG4gICAgICBvcGVuX2luX3RhYjogb3B0aW9ucy5vcHRpb25zLm9wZW5JblRhYixcbiAgICAgIGJyb3dzZXJfc3R5bGU6XG4gICAgICAgIGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyBvcHRpb25zLm9wdGlvbnMuYnJvd3NlclN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgY2hyb21lX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciAhPT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmNocm9tZVN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgcGFnZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHNhbmRib3hlcz8ubGVuZ3RoKSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ1NhbmRib3hlZCBwYWdlcyBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIHNhbmRib3gucGFnZXMgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogc2FuZGJveCBub3QgdHlwZWRcbiAgICAgIG1hbmlmZXN0LnNhbmRib3ggPSB7XG4gICAgICAgIHBhZ2VzOiBzYW5kYm94ZXMubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5odG1sJyksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaWRlcGFuZWxzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZWZhdWx0U2lkZXBhbmVsID1cbiAgICAgIHNpZGVwYW5lbHMuZmluZCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09ICdzaWRlcGFuZWwnKSA/PyBzaWRlcGFuZWxzWzBdO1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRlZmF1bHRTaWRlcGFuZWwsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuXG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIG1hbmlmZXN0LnNpZGViYXJfYWN0aW9uID0ge1xuICAgICAgICAvLyBUT0RPOiBBZGQgb3B0aW9ucyB0byBzaWRlIHBhbmVsXG4gICAgICAgIC8vIC4uLmRlZmF1bHRTaWRlcGFuZWwub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wYW5lbDogcGFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBVbnR5cGVkXG4gICAgICBtYW5pZmVzdC5zaWRlX3BhbmVsID0ge1xuICAgICAgICBkZWZhdWx0X3BhdGg6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTaWRlIHBhbmVsIG5vdCBzdXBwb3J0ZWQgYnkgQ2hyb21pdW0gdXNpbmcgTVYyLiBzaWRlX3BhbmVsLmRlZmF1bHRfcGF0aCB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250ZW50U2NyaXB0cz8ubGVuZ3RoKSB7XG4gICAgLy8gRG9uJ3QgYWRkIGNvbnRlbnQgc2NyaXB0cyB0byB0aGUgbWFuaWZlc3QgaW4gZGV2IG1vZGUgZm9yIE1WMyAtIHRoZXkncmUgbWFuYWdlZCBhbmQgcmVsb2FkZWRcbiAgICAvLyBhdCBydW50aW1lXG4gICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnICYmIGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICAgIGNvbnN0IGhvc3RQZXJtaXNzaW9ucyA9IG5ldyBTZXQ8c3RyaW5nPihtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/IFtdKTtcbiAgICAgIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICBzY3JpcHQub3B0aW9ucy5tYXRjaGVzLmZvckVhY2goKG1hdGNoUGF0dGVybikgPT4ge1xuICAgICAgICAgIGhvc3RQZXJtaXNzaW9ucy5hZGQobWF0Y2hQYXR0ZXJuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGhvc3RQZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PlxuICAgICAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbiksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYXNoVG9FbnRyeXBvaW50c01hcCA9IGNvbnRlbnRTY3JpcHRzLnJlZHVjZSgobWFwLCBzY3JpcHQpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaCA9IEpTT04uc3RyaW5naWZ5KHNjcmlwdC5vcHRpb25zKTtcbiAgICAgICAgaWYgKG1hcC5oYXMoaGFzaCkpIG1hcC5nZXQoaGFzaCk/LnB1c2goc2NyaXB0KTtcbiAgICAgICAgZWxzZSBtYXAuc2V0KGhhc2gsIFtzY3JpcHRdKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdPigpKTtcblxuICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzID0gQXJyYXkuZnJvbShoYXNoVG9FbnRyeXBvaW50c01hcC5lbnRyaWVzKCkpLm1hcChcbiAgICAgICAgKFssIHNjcmlwdHNdKSA9PiAoe1xuICAgICAgICAgIC4uLnNjcmlwdHNbMF0ub3B0aW9ucyxcbiAgICAgICAgICAvLyBUT09EOiBTb3J0aW5nIGNzcyBhbmQganMgYXJyYXlzIGhlcmUgc28gd2UgZ2V0IGNvbnNpc3RlbnQgdGVzdCByZXN1bHRzLi4uIGJ1dCB3ZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXZlIHRvLiBXaGVyZSBpcyB0aGUgaW5jb25zaXN0ZW5jeSBjb21pbmcgZnJvbT9cbiAgICAgICAgICBjc3M6IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhzY3JpcHRzLCBidWlsZE91dHB1dCk/LnNvcnQoKSxcbiAgICAgICAgICBqczogc2NyaXB0c1xuICAgICAgICAgICAgLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERldk1vZGVDc3AoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZvaWQge1xuICBjb25zdCBwZXJtaXNzaW9uID0gYGh0dHA6Ly8ke2NvbmZpZy5zZXJ2ZXI/Lmhvc3RuYW1lID8/ICcnfS8qYDtcbiAgY29uc3QgYWxsb3dlZENzcCA9IGNvbmZpZy5zZXJ2ZXI/Lm9yaWdpbiA/PyAnaHR0cDovL2xvY2FsaG9zdDoqJztcblxuICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgIGFkZEhvc3RQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGNvbnN0IGNzcCA9IG5ldyBDb250ZW50U2VjdXJpdHlQb2xpY3koXG4gICAgbWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gM1xuICAgICAgPyAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5Py5leHRlbnNpb25fcGFnZXMgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyAnd2FzbS11bnNhZmUtZXZhbCc7IG9iamVjdC1zcmMgJ3NlbGYnO1wiIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjNcbiAgICAgIDogbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJzsgb2JqZWN0LXNyYyAnc2VsZic7XCIsIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjJcbiAgKTtcblxuICBpZiAoY29uZmlnLnNlcnZlcikgY3NwLmFkZCgnc2NyaXB0LXNyYycsIGFsbG93ZWRDc3ApO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz89IHt9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGV4dGVuc2lvbl9wYWdlcyBpcyBub3QgdHlwZWRcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeS5leHRlbnNpb25fcGFnZXMgPSBjc3AudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA9IGNzcC50b1N0cmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERldk1vZGVQZXJtaXNzaW9ucyhcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIC8vIEZvciByZWxvYWRpbmcgdGhlIHBhZ2VcbiAgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgJ3RhYnMnKTtcblxuICAvLyBGb3IgcmVnaXN0ZXJpbmcgY29udGVudCBzY3JpcHRzXG4gIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCAnc2NyaXB0aW5nJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYnVuZGxlIHBhdGhzIHRvIENTUyBmaWxlcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGNvbnRlbnQgc2NyaXB0cywgb3IgdW5kZWZpbmVkIGlmXG4gKiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIENTUy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhcbiAgY29udGVudFNjcmlwdHM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3NzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IGFsbENodW5rcyA9IGJ1aWxkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuY2h1bmtzKTtcblxuICBjb250ZW50U2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAvLyBUT0RPOiBvcHRpbWl6ZSBhbmQgcmVtb3ZlIGxvb3Agd2l0aCBhIG1hcFxuICAgIGNvbnN0IHJlbGF0ZWRDc3MgPSBhbGxDaHVua3MuZmluZChcbiAgICAgIChjaHVuaykgPT4gY2h1bmsuZmlsZU5hbWUgPT09IGBhc3NldHMvJHtzY3JpcHQubmFtZX0uY3NzYCxcbiAgICApO1xuICAgIGlmIChyZWxhdGVkQ3NzKSBjc3MucHVzaChyZWxhdGVkQ3NzLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgaWYgKGNzcy5sZW5ndGggPiAwKSByZXR1cm4gY3NzO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhZGRQZXJtaXNzaW9uKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIHBlcm1pc3Npb246IHN0cmluZyxcbik6IHZvaWQge1xuICBtYW5pZmVzdC5wZXJtaXNzaW9ucyA/Pz0gW107XG4gIGlmIChtYW5pZmVzdC5wZXJtaXNzaW9ucy5pbmNsdWRlcyhwZXJtaXNzaW9uKSkgcmV0dXJuO1xuICBtYW5pZmVzdC5wZXJtaXNzaW9ucy5wdXNoKHBlcm1pc3Npb24pO1xufVxuXG5mdW5jdGlvbiBhZGRIb3N0UGVybWlzc2lvbihcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBob3N0UGVybWlzc2lvbjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMgPz89IFtdO1xuICBpZiAobWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucy5pbmNsdWRlcyhob3N0UGVybWlzc2lvbikpIHJldHVybjtcbiAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucy5wdXNoKGhvc3RQZXJtaXNzaW9uKTtcbn1cbiIsICIvKipcbiAqIERpcmVjdGl2ZSBuYW1lcyB0aGF0IG1ha2UgdXAgQ1NQcy4gVGhlcmUgYXJlIG1vcmUsIHRoaXMgaXMgYWxsIEkgbmVlZCBmb3IgdGhlIHBsdWdpbi5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NwRGlyZWN0aXZlID0gJ2RlZmF1bHQtc3JjJyB8ICdzY3JpcHQtc3JjJyB8ICdvYmplY3Qtc3JjJztcblxuZXhwb3J0IGNsYXNzIENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gIHByaXZhdGUgc3RhdGljIERJUkVDVElWRV9PUkRFUjogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAnZGVmYXVsdC1zcmMnOiAwLFxuICAgICdzY3JpcHQtc3JjJzogMSxcbiAgICAnb2JqZWN0LXNyYyc6IDIsXG4gIH07XG5cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG4gIGNvbnN0cnVjdG9yKGNzcD86IHN0cmluZykge1xuICAgIGlmIChjc3ApIHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gY3NwLnNwbGl0KCc7JykubWFwKChzZWN0aW9uKSA9PiBzZWN0aW9uLnRyaW0oKSk7XG4gICAgICB0aGlzLmRhdGEgPSBzZWN0aW9ucy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nW10+PigoZGF0YSwgc2VjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCAuLi52YWx1ZXNdID0gc2VjdGlvbi5zcGxpdCgnICcpLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpO1xuICAgICAgICBpZiAoa2V5KSBkYXRhW2tleV0gPSB2YWx1ZXM7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgc2V0IG9mIHZhbHVlcyBhcmUgbGlzdGVkIHVuZGVyIGEgZGlyZWN0aXZlLlxuICAgKi9cbiAgYWRkKGRpcmVjdGl2ZTogQ3NwRGlyZWN0aXZlLCAuLi5uZXdWYWx1ZXM6IHN0cmluZ1tdKTogQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmRhdGFbZGlyZWN0aXZlXSA/PyBbXTtcbiAgICBuZXdWYWx1ZXMuZm9yRWFjaCgobmV3VmFsdWUpID0+IHtcbiAgICAgIGlmICghdmFsdWVzLmluY2x1ZGVzKG5ld1ZhbHVlKSkgdmFsdWVzLnB1c2gobmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVtkaXJlY3RpdmVdID0gdmFsdWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3RpdmVzID0gT2JqZWN0LmVudHJpZXModGhpcy5kYXRhKS5zb3J0KChbbF0sIFtyXSkgPT4ge1xuICAgICAgY29uc3QgbG8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW2xdID8/IDI7XG4gICAgICBjb25zdCBybyA9IENvbnRlbnRTZWN1cml0eVBvbGljeS5ESVJFQ1RJVkVfT1JERVJbcl0gPz8gMjtcbiAgICAgIHJldHVybiBsbyAtIHJvO1xuICAgIH0pO1xuICAgIHJldHVybiBkaXJlY3RpdmVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmZsYXQoKS5qb2luKCcgJykpLmpvaW4oJzsgJykgKyAnOyc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYnVpbGRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvYnVpbGRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnLCBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlTWFpbmZlc3QsIHdyaXRlTWFuaWZlc3QgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZ3JvdXBFbnRyeXBvaW50cyB9IGZyb20gJy4vdXRpbHMvZ3JvdXBFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRCdWlsZFN1bW1hcnkgfSBmcm9tICcuL2xvZy9wcmludEJ1aWxkU3VtbWFyeSc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHRlbnNpb24gYmFzZWQgb24gYW4gaW50ZXJuYWwgY29uZmlnLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBDbGVhbnMgdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAqIDIuIEV4ZWN1dGVzIHRoZSByZWJ1aWxkIGZ1bmN0aW9uIHdpdGggYSBibGFuayBwcmV2aW91cyBvdXRwdXQgc28gZXZlcnl0aGluZyBpcyBidWlsdCAoc2VlXG4gKiAgICBgcmVidWlsZGAgZm9yIG1vcmUgZGV0YWlscylcbiAqIDMuIFByaW50cyB0aGUgc3VtbWFyeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnRlcm5hbChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgdmVyYiA9IGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnID8gJ1ByZS1yZW5kZXJpbmcnIDogJ0J1aWxkaW5nJztcbiAgY29uc3QgdGFyZ2V0ID0gYCR7Y29uZmlnLmJyb3dzZXJ9LW12JHtjb25maWcubWFuaWZlc3RWZXJzaW9ufWA7XG4gIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICBgJHt2ZXJifSAke3BjLmN5YW4odGFyZ2V0KX0gZm9yICR7cGMuY3lhbihjb25maWcubW9kZSl9IHdpdGggJHtwYy5ncmVlbihcbiAgICAgIGBWaXRlICR7dml0ZS52ZXJzaW9ufWAsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIC8vIENsZWFudXBcbiAgYXdhaXQgZnMucm0oY29uZmlnLm91dERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dERpcik7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBFbnRyeXBvaW50cyhlbnRyeXBvaW50cyk7XG4gIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKGNvbmZpZywgZ3JvdXBzKTtcblxuICAvLyBQb3N0LWJ1aWxkXG4gIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhcbiAgICBgQnVpbHQgZXh0ZW5zaW9uIGluICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgKTtcbiAgYXdhaXQgcHJpbnRCdWlsZFN1bW1hcnkob3V0cHV0LCBjb25maWcpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBjb25maWd1cmF0aW9uLCBsaXN0IG9mIGVudHJ5cG9pbnRzLCBhbmQgYW4gZXhpc3RpbmcsIHBhcnRpYWwgb3V0cHV0LCBidWlsZCB0aGVcbiAqIGVudHJ5cG9pbnRzIGFuZCBtZXJnZSB0aGUgbmV3IG91dHB1dCB3aXRoIHRoZSBleGlzdGluZyBvdXRwdXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsOlxuICogMS4gR2VuZXJhdGUgdGhlIC53eHQgZGlyZWN0b3J5J3MgdHlwZXNcbiAqIDIuIEJ1aWxkIHRoZSBgZW50cnlwb2ludEdyb3Vwc2AgKGFuZCBjb3BpZXMgcHVibGljIGZpbGVzKVxuICogMy4gR2VuZXJhdGUgdGhlIGxhdGVzdCBtYW5pZmVzdCBmb3IgYWxsIGVudHJ5cG9pbnRzXG4gKiA0LiBXcml0ZSB0aGUgbmV3IG1hbmlmZXN0IHRvIHRoZSBmaWxlIHN5c3RlbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgZW50cnlwb2ludEdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIGV4aXN0aW5nT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfSxcbik6IFByb21pc2U8eyBvdXRwdXQ6IEJ1aWxkT3V0cHV0OyBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgfT4ge1xuICAvLyBVcGRhdGUgdHlwZXMgZGlyZWN0b3J5IHdpdGggbmV3IGZpbGVzIGFuZCB0eXBlc1xuICBjb25zdCBhbGxFbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGFsbEVudHJ5cG9pbnRzLCBjb25maWcpO1xuXG4gIC8vIEJ1aWxkIGFuZCBtZXJnZSB0aGUgb3V0cHV0c1xuICBjb25zdCBuZXdPdXRwdXQgPSBhd2FpdCBidWlsZEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRHcm91cHMsIGNvbmZpZyk7XG4gIGNvbnN0IG1lcmdlZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4gPSB7XG4gICAgc3RlcHM6IFsuLi5leGlzdGluZ091dHB1dC5zdGVwcywgLi4ubmV3T3V0cHV0LnN0ZXBzXSxcbiAgICBwdWJsaWNBc3NldHM6IFsuLi5leGlzdGluZ091dHB1dC5wdWJsaWNBc3NldHMsIC4uLm5ld091dHB1dC5wdWJsaWNBc3NldHNdLFxuICB9O1xuXG4gIGNvbnN0IG5ld01hbmlmZXN0ID0gYXdhaXQgZ2VuZXJhdGVNYWluZmVzdChcbiAgICBhbGxFbnRyeXBvaW50cyxcbiAgICBtZXJnZWRPdXRwdXQsXG4gICAgY29uZmlnLFxuICApO1xuICBjb25zdCBmaW5hbE91dHB1dDogQnVpbGRPdXRwdXQgPSB7XG4gICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICAgIC4uLm5ld091dHB1dCxcbiAgfTtcblxuICAvLyBXcml0ZSBtYW5pZmVzdFxuICBhd2FpdCB3cml0ZU1hbmlmZXN0KG5ld01hbmlmZXN0LCBmaW5hbE91dHB1dCwgY29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIG91dHB1dDoge1xuICAgICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICAgICAgc3RlcHM6IFsuLi5leGlzdGluZ091dHB1dC5zdGVwcywgLi4uZmluYWxPdXRwdXQuc3RlcHNdLFxuICAgICAgcHVibGljQXNzZXRzOiBbXG4gICAgICAgIC4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgICAgICAgLi4uZmluYWxPdXRwdXQucHVibGljQXNzZXRzLFxuICAgICAgXSxcbiAgICB9LFxuICAgIG1hbmlmZXN0OiBuZXdNYW5pZmVzdCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEVudHJ5cG9pbnRzIGNhbiBiZSBidWlsZCBpbiBncm91cHMuIEhUTUwgcGFnZXMgY2FuIGFsbCBiZSBidWlsdCB0b2dldGhlciBpbiBhIHNpbmdsZSBzdGVwLCB3aGlsZVxuICogY29udGVudCBzY3JpcHRzIG11c3QgYmUgYnVpbGQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZW50cnlwb2ludHMgcHV0IGludG8gdGhlc2UgdHlwZXMgb2YgZ3JvdXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBFbnRyeXBvaW50cyhlbnRyeXBvaW50czogRW50cnlwb2ludFtdKTogRW50cnlwb2ludEdyb3VwW10ge1xuICBjb25zdCBncm91cEluZGV4TWFwOiBQYXJ0aWFsPFJlY29yZDxHcm91cCwgbnVtYmVyPj4gPSB7fTtcbiAgY29uc3QgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cnlwb2ludHMpIHtcbiAgICBjb25zdCBncm91cCA9IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQW2VudHJ5LnR5cGVdO1xuICAgIGlmIChncm91cCA9PT0gJ25vLWdyb3VwJykge1xuICAgICAgZ3JvdXBzLnB1c2goZW50cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZ3JvdXBJbmRleCA9IGdyb3VwSW5kZXhNYXBbZ3JvdXBdO1xuICAgICAgaWYgKGdyb3VwSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBncm91cEluZGV4ID0gZ3JvdXBzLnB1c2goW10pIC0gMTtcbiAgICAgICAgZ3JvdXBJbmRleE1hcFtncm91cF0gPSBncm91cEluZGV4O1xuICAgICAgfVxuICAgICAgKGdyb3Vwc1tncm91cEluZGV4XSBhcyBFbnRyeXBvaW50W10pLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cHM7XG59XG5cbmNvbnN0IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQOiBSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBHcm91cD4gPSB7XG4gIHNhbmRib3g6ICdzYW5kYm94LXBhZ2UnLFxuXG4gIHBvcHVwOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBuZXd0YWI6ICdleHRlbnNpb24tcGFnZScsXG4gIGhpc3Rvcnk6ICdleHRlbnNpb24tcGFnZScsXG4gIG9wdGlvbnM6ICdleHRlbnNpb24tcGFnZScsXG4gIGRldnRvb2xzOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBib29rbWFya3M6ICdleHRlbnNpb24tcGFnZScsXG4gIHNpZGVwYW5lbDogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgJ3VubGlzdGVkLXBhZ2UnOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuXG4gIGJhY2tncm91bmQ6ICduby1ncm91cCcsXG4gICdjb250ZW50LXNjcmlwdCc6ICduby1ncm91cCcsXG4gICd1bmxpc3RlZC1zY3JpcHQnOiAnbm8tZ3JvdXAnLFxufTtcblxudHlwZSBHcm91cCA9ICdleHRlbnNpb24tcGFnZScgfCAnc2FuZGJveC1wYWdlJyB8ICduby1ncm91cCc7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZHVyYXRpb24gPCAxZTMpIHJldHVybiBgJHtkdXJhdGlvbn0gbXNgO1xuICBpZiAoZHVyYXRpb24gPCAxMGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDMpfSBzYDtcbiAgaWYgKGR1cmF0aW9uIDwgNjBlMykgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgxKX0gc2A7XG4gIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMCl9IHNgO1xufVxuIiwgImltcG9ydCBwYXRoLCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBwcmludFRhYmxlIH0gZnJvbSAnLi9wcmludFRhYmxlJztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBmaWxlc2l6ZSB9IGZyb20gJ2ZpbGVzaXplJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByaW50QnVpbGRTdW1tYXJ5KFxuICBvdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGNodW5rcyA9IFtcbiAgICAuLi5vdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5jaHVua3MpLFxuICAgIC4uLm91dHB1dC5wdWJsaWNBc3NldHMsXG4gIF0uc29ydCgobCwgcikgPT4ge1xuICAgIGNvbnN0IGxXZWlnaHQgPSBnZXRDaHVua1NvcnRXZWlnaHQobC5maWxlTmFtZSk7XG4gICAgY29uc3QgcldlaWdodCA9IGdldENodW5rU29ydFdlaWdodChyLmZpbGVOYW1lKTtcbiAgICBjb25zdCBkaWZmID0gbFdlaWdodCAtIHJXZWlnaHQ7XG4gICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICAgIHJldHVybiBsLmZpbGVOYW1lLmxvY2FsZUNvbXBhcmUoci5maWxlTmFtZSk7XG4gIH0pO1xuXG4gIGxldCB0b3RhbFNpemUgPSAwO1xuXG4gIGNvbnN0IGNodW5rUm93czogc3RyaW5nW11bXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGNodW5rcy5tYXAoYXN5bmMgKGNodW5rLCBpKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gW1xuICAgICAgICByZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0RGlyKSArIHBhdGguc2VwLFxuICAgICAgICBjaHVuay5maWxlTmFtZSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXggPSBpID09PSBjaHVua3MubGVuZ3RoIC0gMSA/ICcgIFx1MjUxNFx1MjUwMCcgOiAnICBcdTI1MUNcdTI1MDAnO1xuICAgICAgY29uc3QgY29sb3IgPSBnZXRDaHVua0NvbG9yKGNodW5rLmZpbGVOYW1lKTtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMubHN0YXQocmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICAgICAgdG90YWxTaXplICs9IHN0YXRzLnNpemU7XG4gICAgICBjb25zdCBzaXplID0gU3RyaW5nKGZpbGVzaXplKHN0YXRzLnNpemUpKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke3BjLmdyYXkocHJlZml4KX0gJHtwYy5kaW0oZmlsZVswXSl9JHtjb2xvcihmaWxlWzFdKX1gLFxuICAgICAgICBwYy5kaW0oc2l6ZSksXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xuXG4gIHByaW50VGFibGUoY29uZmlnLmxvZ2dlci5sb2csIGNodW5rUm93cyk7XG5cbiAgY29uZmlnLmxvZ2dlci5sb2coXG4gICAgYCR7cGMuY3lhbignXHUwM0EzIFRvdGFsIHNpemU6Jyl9ICR7U3RyaW5nKGZpbGVzaXplKHRvdGFsU2l6ZSkpfWAsXG4gICk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcy5tYXAnOiAyLFxuICAnLmpzJzogMixcbiAgJy5jc3MnOiAzLFxufTtcbmZ1bmN0aW9uIGdldENodW5rU29ydFdlaWdodChmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmVudHJpZXMoQ0hVTktfU09SVF9XRUlHSFRTKS5maW5kKChba2V5XSkgPT5cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKGtleSksXG4gICAgKT8uWzFdID8/IERFRkFVTFRfU09SVF9XRUlHSFRcbiAgKTtcbn1cblxuY29uc3QgREVGQVVMVF9DT0xPUiA9IHBjLmJsdWU7XG5jb25zdCBDSFVOS19DT0xPUlM6IFJlY29yZDxzdHJpbmcsICh0ZXh0OiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gICcuanMubWFwJzogcGMuZ3JheSxcbiAgJy5odG1sJzogcGMuZ3JlZW4sXG4gICcuY3NzJzogcGMubWFnZW50YSxcbiAgJy5qcyc6IHBjLmN5YW4sXG59O1xuZnVuY3Rpb24gZ2V0Q2h1bmtDb2xvcihmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmVudHJpZXMoQ0hVTktfQ09MT1JTKS5maW5kKChba2V5XSkgPT4gZmlsZW5hbWUuZW5kc1dpdGgoa2V5KSk/LlsxXSA/P1xuICAgIERFRkFVTFRfQ09MT1JcbiAgKTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gcHJpbnRUYWJsZShcbiAgbG9nOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkLFxuICByb3dzOiBzdHJpbmdbXVtdLFxuICBnYXAgPSAyLFxuKTogdm9pZCB7XG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbHVtbldpZHRocyA9IHJvd3MucmVkdWNlKFxuICAgICh3aWR0aHMsIHJvdykgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh3aWR0aHMubGVuZ3RoLCByb3cubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIHdpZHRoc1tpXSA9IE1hdGgubWF4KHJvd1tpXT8ubGVuZ3RoID8/IDAsIHdpZHRoc1tpXSA/PyAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aWR0aHM7XG4gICAgfSxcbiAgICByb3dzWzBdLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGVuZ3RoKSxcbiAgKTtcblxuICBsZXQgc3RyID0gJyc7XG4gIHJvd3MuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgcm93LmZvckVhY2goKGNvbCwgaikgPT4ge1xuICAgICAgc3RyICs9IGNvbC5wYWRFbmQoY29sdW1uV2lkdGhzW2pdLCAnICcpO1xuICAgICAgaWYgKGogIT09IHJvdy5sZW5ndGggLSAxKSBzdHIgKz0gJycucGFkRW5kKGdhcCwgJyAnKTtcbiAgICB9KTtcbiAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSBzdHIgKz0gJ1xcbic7XG4gIH0pO1xuXG4gIGxvZyhzdHIpO1xufVxuIiwgImltcG9ydCB7XG4gIEJ1aWxkU3RlcE91dHB1dCxcbiAgRW50cnlwb2ludEdyb3VwLFxuICBJbnRlcm5hbENvbmZpZyxcbiAgV3h0RGV2U2VydmVyLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBmaW5kT3BlblBvcnQgfSBmcm9tICcuL3V0aWxzL2ZpbmRPcGVuUG9ydCc7XG5pbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzIH0gZnJvbSAnLi91dGlscy9tYW5pZmVzdCc7XG5pbXBvcnQgeyBjcmVhdGVXZWJFeHRSdW5uZXIgfSBmcm9tICcuL3J1bm5lcnMvY3JlYXRlV2ViRXh0UnVubmVyJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwgfSBmcm9tICcuL2J1aWxkJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckluZm8oKTogUHJvbWlzZTxTZXJ2ZXJJbmZvPiB7XG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kT3BlblBvcnQoMzAwMCwgMzAxMCk7XG4gIGNvbnN0IGhvc3RuYW1lID0gJ2xvY2FsaG9zdCc7XG4gIGNvbnN0IG9yaWdpbiA9IGBodHRwOi8vJHtob3N0bmFtZX06JHtwb3J0fWA7XG4gIGNvbnN0IHNlcnZlckNvbmZpZzogdml0ZS5JbmxpbmVDb25maWcgPSB7XG4gICAgc2VydmVyOiB7XG4gICAgICBvcmlnaW4sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBvcnQsXG4gICAgaG9zdG5hbWUsXG4gICAgb3JpZ2luLFxuICAgIHZpdGVTZXJ2ZXJDb25maWc6IHNlcnZlckNvbmZpZyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VydmVyKFxuICBzZXJ2ZXJJbmZvOiBTZXJ2ZXJJbmZvLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3QgcnVubmVyID0gY3JlYXRlV2ViRXh0UnVubmVyKCk7XG5cbiAgY29uc3Qgdml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKFxuICAgIHZpdGUubWVyZ2VDb25maWcoc2VydmVySW5mbywgY29uZmlnLnZpdGUpLFxuICApO1xuXG4gIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHZpdGVTZXJ2ZXIubGlzdGVuKHNlcnZlci5wb3J0KTtcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoYFN0YXJ0ZWQgZGV2IHNlcnZlciBAICR7c2VydmVySW5mby5vcmlnaW59YCk7XG5cbiAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IGF3YWl0IGJ1aWxkSW50ZXJuYWwoY29uZmlnKTtcbiAgICBjb25maWcubG9nZ2VyLmluZm8oJ09wZW5pbmcgYnJvd3Nlci4uLicpO1xuICAgIGF3YWl0IHJ1bm5lci5vcGVuQnJvd3Nlcihjb25maWcpO1xuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcygnT3BlbmVkIScpO1xuICB9O1xuXG4gIGNvbnN0IHJlbG9hZEV4dGVuc2lvbiA9ICgpID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtZXh0ZW5zaW9uJyk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZFBhZ2UgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ2FuJ3QgdXNlIFZpdGUncyBidWlsdC1pbiBcImZ1bGwtcmVsb2FkXCIgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGxpa2Ugb3VyIHBhdGhzLCBpdCBleHBlY3RzXG4gICAgLy8gcGF0aHMgZW5kaW5nIGluIFwiL2luZGV4Lmh0bWxcIlxuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1wYWdlJywgcGF0aCk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZENvbnRlbnRTY3JpcHQgPSAoY29udGVudFNjcmlwdDogTWFuaWZlc3QuQ29udGVudFNjcmlwdCkgPT4ge1xuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1jb250ZW50LXNjcmlwdCcsIGNvbnRlbnRTY3JpcHQpO1xuICB9O1xuXG4gIGNvbnN0IHNlcnZlcjogV3h0RGV2U2VydmVyID0ge1xuICAgIC4uLnZpdGVTZXJ2ZXIsXG4gICAgc3RhcnQsXG4gICAgY3VycmVudE91dHB1dDoge1xuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgbWFuaWZlc3RfdmVyc2lvbjogMyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIHZlcnNpb246ICcnLFxuICAgICAgfSxcbiAgICAgIHB1YmxpY0Fzc2V0czogW10sXG4gICAgICBzdGVwczogW10sXG4gICAgfSxcbiAgICBwb3J0OiBzZXJ2ZXJJbmZvLnBvcnQsXG4gICAgaG9zdG5hbWU6IHNlcnZlckluZm8uaG9zdG5hbWUsXG4gICAgb3JpZ2luOiBzZXJ2ZXJJbmZvLm9yaWdpbixcbiAgICByZWxvYWRFeHRlbnNpb24sXG4gICAgcmVsb2FkUGFnZSxcbiAgICByZWxvYWRDb250ZW50U2NyaXB0LFxuICB9O1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8qKlxuICogRnJvbSB0aGUgc2VydmVyLCB0ZWxsIHRoZSBjbGllbnQgdG8gcmVsb2FkIGNvbnRlbnQgc2NyaXB0cyBmcm9tIHRoZSBwcm92aWRlZCBidWlsZCBzdGVwIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRDb250ZW50U2NyaXB0cyhcbiAgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBzZXJ2ZXI6IFd4dERldlNlcnZlcixcbikge1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgIHN0ZXBzLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc3RlcC5lbnRyeXBvaW50cztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSB8fCBlbnRyeS50eXBlICE9PSAnY29udGVudC1zY3JpcHQnKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGpzID0gW2dldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyldO1xuICAgICAgY29uc3QgY3NzID0gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFtlbnRyeV0sIHNlcnZlci5jdXJyZW50T3V0cHV0KTtcblxuICAgICAgc2VydmVyLnJlbG9hZENvbnRlbnRTY3JpcHQoe1xuICAgICAgICBqcyxcbiAgICAgICAgY3NzLFxuICAgICAgICAuLi5lbnRyeS5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VydmVyLnJlbG9hZEV4dGVuc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIdG1sUGFnZXMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIHNlcnZlcjogV3h0RGV2U2VydmVyLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGdyb3Vwcy5mbGF0KCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIHNlcnZlci5yZWxvYWRQYWdlKHBhdGgpO1xuICB9KTtcbn1cblxuaW50ZXJmYWNlIFNlcnZlckluZm8ge1xuICBwb3J0OiBudW1iZXI7XG4gIGhvc3RuYW1lOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICB2aXRlU2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZztcbn1cbiIsICJpbXBvcnQgbmV0IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3Qgb3BlbiBwb3J0IGluIGEgcmFuZ2Ugb2YgcG9ydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3BlblBvcnQoXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKHN0YXJ0UG9ydCwgc3RhcnRQb3J0LCBlbmRQb3J0KTtcbn1cblxuZnVuY3Rpb24gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKFxuICBwb3J0OiBudW1iZXIsXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChwb3J0ID4gZW5kUG9ydClcbiAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgIEVycm9yKGBDb3VsZCBub3QgZmluZCBvcGVuIHBvcnQgYmV0d2VlbiAke3N0YXJ0UG9ydH0tJHtlbmRQb3J0fWApLFxuICAgICAgKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIHNlcnZlci5vbmNlKCdjbG9zZScsICgpID0+IHJlc29sdmUocG9ydCkpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLm9uKCdlcnJvcicsICgpID0+XG4gICAgICByZXNvbHZlKGZpbmRPcGVuUG9ydFJlY3Vyc2l2ZShwb3J0ICsgMSwgc3RhcnRQb3J0LCBlbmRQb3J0KSksXG4gICAgKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBXZWJFeHRSdW5JbnN0YW5jZSB9IGZyb20gJ3dlYi1leHQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9FeHRlbnNpb25SdW5uZXInO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBgRXh0ZW5zaW9uUnVubmVyYCBiYWNrZWQgYnkgYHdlYi1leHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViRXh0UnVubmVyKCk6IEV4dGVuc2lvblJ1bm5lciB7XG4gIGxldCBydW5uZXI6IFdlYkV4dFJ1bkluc3RhbmNlIHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgb3BlbkJyb3dzZXIoY29uZmlnKSB7XG4gICAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7XG4gICAgICAgIGNvbmZpZy5sb2dnZXIud2FybignQ2Fubm90IG9wZW4gc2FmYXJpIGF1dG9tYXRpY2FsbHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHRoZSBwbHVnaW4ncyBsb2dnZXIgaW5zdGVhZCBvZiB3ZWItZXh0J3MgYnVpbHQtaW4gb25lLlxuICAgICAgY29uc3Qgd2ViRXh0TG9nZ2VyID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0L3V0aWwvbG9nZ2VyJyk7XG4gICAgICB3ZWJFeHRMb2dnZXIuY29uc29sZVN0cmVhbS53cml0ZSA9ICh7IGxldmVsLCBtc2csIG5hbWUgfSkgPT4ge1xuICAgICAgICBpZiAobGV2ZWwgPj0gRVJST1JfTE9HX0xFVkVMKSBjb25maWcubG9nZ2VyLmVycm9yKG5hbWUsIG1zZyk7XG4gICAgICAgIGlmIChsZXZlbCA+PSBXQVJOX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci53YXJuKG1zZyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3eHRVc2VyQ29uZmlnID0gY29uZmlnLnJ1bm5lckNvbmZpZy5jb25maWc7XG4gICAgICBjb25zdCB1c2VyQ29uZmlnID0ge1xuICAgICAgICBjb25zb2xlOiB3eHRVc2VyQ29uZmlnPy5vcGVuQ29uc29sZSxcbiAgICAgICAgZGV2dG9vbHM6IHd4dFVzZXJDb25maWc/Lm9wZW5EZXZ0b29scyxcbiAgICAgICAgc3RhcnRVcmw6IHd4dFVzZXJDb25maWc/LnN0YXJ0VXJscyxcbiAgICAgICAgLi4uKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZmlyZWZveDogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/LmZpcmVmb3gsXG4gICAgICAgICAgICAgIGZpcmVmb3hQcm9maWxlOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJvZmlsZSxcbiAgICAgICAgICAgICAgcHJlZnM6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hQcmVmcyxcbiAgICAgICAgICAgICAgYXJnczogd3h0VXNlckNvbmZpZz8uZmlyZWZveEFyZ3MsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGNocm9taXVtQmluYXJ5OiB3eHRVc2VyQ29uZmlnPy5iaW5hcmllcz8uW2NvbmZpZy5icm93c2VyXSxcbiAgICAgICAgICAgICAgY2hyb21pdW1Qcm9maWxlOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bVByb2ZpbGUsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmNocm9taXVtQXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluYWxDb25maWcgPSB7XG4gICAgICAgIC4uLnVzZXJDb25maWcsXG4gICAgICAgIHRhcmdldDogY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyA/ICdmaXJlZm94LWRlc2t0b3AnIDogJ2Nocm9taXVtJyxcbiAgICAgICAgc291cmNlRGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAvLyBXWFQgaGFuZGxlcyByZWxvYWRzLCBzbyBkaXNhYmxlIGF1dG8tcmVsb2FkIGJlaGF2aW9ycyBpbiB3ZWItZXh0XG4gICAgICAgIG5vUmVsb2FkOiB0cnVlLFxuICAgICAgICBub0lucHV0OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIC8vIERvbid0IGNhbGwgYHByb2Nlc3MuZXhpdCgwKWAgYWZ0ZXIgc3RhcnRpbmcgd2ViLWV4dFxuICAgICAgICBzaG91bGRFeGl0UHJvZ3JhbTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1Zygnd2ViLWV4dCBjb25maWc6JywgZmluYWxDb25maWcpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1Zygnd2ViLWV4dCBvcHRpb25zOicsIG9wdGlvbnMpO1xuXG4gICAgICBjb25zdCB3ZWJFeHQgPSBhd2FpdCBpbXBvcnQoJ3dlYi1leHQnKTtcbiAgICAgIHJ1bm5lciA9IGF3YWl0IHdlYkV4dC5kZWZhdWx0LmNtZC5ydW4oZmluYWxDb25maWcsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXIoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcnVubmVyPy5leGl0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvd2ViLWV4dC9ibG9iL2UzN2U2MGEyNzM4NDc4ZjUxMmYxMjU1YzUzNzEzMzMyMWYzMDE3NzEvc3JjL3V0aWwvbG9nZ2VyLmpzI0wxMlxuY29uc3QgV0FSTl9MT0dfTEVWRUwgPSA0MDtcbmNvbnN0IEVSUk9SX0xPR19MRVZFTCA9IDUwO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHByaW50SGVhZGVyIH0gZnJvbSAnLi4vLi4vY29yZS9sb2cvcHJpbnRIZWFkZXInO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2Zvcm1hdER1cmF0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbW1hbmQ8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4oXG4gIGNiOiAoLi4uYXJnczogVEFyZ3MpID0+IHZvaWQgfCBib29sZWFuIHwgUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4sXG4pIHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBUQXJncykgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIHByaW50SGVhZGVyKCk7XG5cbiAgICAgIGNvbnN0IG9uZ29pbmcgPSBhd2FpdCBjYiguLi5hcmdzKTtcblxuICAgICAgaWYgKCFvbmdvaW5nKVxuICAgICAgICBjb25zb2xhLnN1Y2Nlc3MoXG4gICAgICAgICAgYEZpbmlzaGVkIGluICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGEuZmFpbChcbiAgICAgICAgYENvbW1hbmQgZmFpbGVkIGFmdGVyICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICk7XG4gICAgICBjb25zb2xhLmVycm9yKGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEhlYWRlcigpIHtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sYS5sb2coYCR7cGMuZ3JheSgnV1hUJyl9ICR7cGMuZ3JheShwYy5ib2xkKHZlcnNpb24pKX1gKTtcbn1cbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgYnVpbGQgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgbW9kZSA9IGZsYWdzLm1vZGUgPz8gJ3Byb2R1Y3Rpb24nO1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG5cbiAgYXdhaXQgd3h0LmJ1aWxkKGNsaUNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgZGV2ID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IG1vZGUgPSBmbGFncy5tb2RlID8/ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB3eHQuY3JlYXRlU2VydmVyKGNsaUNvbmZpZyk7XG4gIGF3YWl0IHNlcnZlci5zdGFydCgpO1xuXG4gIHJldHVybiB0cnVlO1xufSk7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgaW5pdCA9IGRlZmluZUNvbW1hbmQ8W2RpcmVjdG9yeT86IHN0cmluZ10+KGFzeW5jIChkaXJlY3RvcnkpID0+IHtcbiAgY29uc29sYS53YXJuKCd3eHQgaW5pdDogTm90IGltcGxlbWVudGVkJyk7XG59KTtcbiIsICJpbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHsgZmluZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZC9maW5kRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUeXBlc0RpciB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpcic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5pbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY29uc3QgcHJlcGFyZSA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNsaUNvbmZpZywgJ2J1aWxkJyk7XG5cbiAgY29uZmlnLmxvZ2dlci5pbmZvKCdHZW5lcmF0aW5nIHR5cGVzLi4uJyk7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgYXdhaXQgZ2VuZXJhdGVUeXBlc0RpcihlbnRyeXBvaW50cywgY29uZmlnKTtcbn0pO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IHB1Ymxpc2ggPSBkZWZpbmVDb21tYW5kKFxuICBhc3luYyAocm9vdDogYW55LCB7IGNvbmZpZzogY29uZmlnRmlsZSB9OiBhbnkpID0+IHtcbiAgICBjb25zb2xhLndhcm4oJ3d4dCBwdWJsaXNoOiBOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcbik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLGlCQUFnQjs7O0FDQ2QsY0FBVzs7O0FDTWIsSUFBQUEsb0JBQThCO0FBQzlCLFdBQXNCO0FBQ3RCLHFCQUF3Qjs7O0FDVnhCLHVCQUF3QztBQUVqQyxTQUFTLGtCQUNkLGdCQUNBLFdBRVE7QUFDUixRQUFNLGVBQWUsaUJBQUFDLFFBQUssU0FBUyxnQkFBZ0IsU0FBUztBQUU1RCxRQUFNLE9BQU8sYUFBYSxNQUFNLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFFOUMsU0FBTztBQUNUO0FBRU8sU0FBUyx3QkFDZCxZQUNBLEtBQ1E7QUFDUixhQUFPLDBCQUFRLFdBQVcsV0FBVyxHQUFHLFdBQVcsSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNqRTtBQU1PLFNBQVMsd0JBQ2QsWUFDQSxRQUNBLEtBQ1E7QUFDUixhQUFPLDJCQUFTLFFBQVEsd0JBQXdCLFlBQVksR0FBRyxDQUFDO0FBQ2xFOzs7QUM3QkEsc0JBQTBCO0FBQzFCLGtCQUF1RDtBQUtoRCxTQUFTLGlCQUFpQixRQUFxQztBQUNwRSxTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixTQUFTO0FBQ1AsYUFBTztBQUFBLFFBQ0wsU0FBUztBQUFBLFVBQ1AsT0FBTztBQUFBLFlBQ0wsd0JBQW9CO0FBQUEsY0FDbEIsT0FBTztBQUFBLGNBQ1A7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTSxVQUFVLE1BQU0s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QUFXLE9BQU87QUFFekQsU0FBTyxPQUFPLEtBQUsscUJBQXFCO0FBRXhDLFFBQU0sY0FBYyxNQUFNLGdCQUFnQixNQUFNO0FBQ2hELFFBQU0saUJBQWlCLGFBQWEsTUFBTTtBQUM1QyxDQUFDOzs7QUN4QkQsSUFBQUMsa0JBQXdCO0FBR2pCLElBQU0sVUFBVTtBQUFBLEVBQ3JCLE9BQU8sTUFBVyxFQUFFLFFBQVEsV0FBVyxNQUFXO0FBQ2hELDRCQUFRLEtBQUssOEJBQThCO0FBQUEsRUFDN0M7QUFDRjs7O0F6Q0RBLElBQU0sVUFBTSxXQUFBQyxTQUFJLEtBQUs7QUFDckIsSUFBSSxLQUFLO0FBQ1QsSUFBSSxRQUFRLE9BQU87QUFHbkIsSUFDRyxRQUFRLFVBQVUsa0JBQWtCLEVBQ3BDLE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFPLHFCQUFxQixjQUFjLEVBQzFDLE9BQU8sMkJBQTJCLG1CQUFtQixFQUNyRCxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0IsR0FBRztBQUd0QixJQUNHLFFBQVEsZ0JBQWdCLHNCQUFzQixFQUM5QyxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBTyxxQkFBcUIsY0FBYyxFQUMxQyxPQUFPLDJCQUEyQixtQkFBbUIsRUFDckQsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQWdCQyxNQUFLO0FBR3hCLElBQ0csUUFBUSxrQkFBa0IsU0FBUyxFQUNuQyxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBZ0IsT0FBTztBQUcxQixJQUFJLFFBQVEsa0JBQWtCLG1CQUFtQixFQUFFLE9BQWdCLE9BQU87QUFHMUUsSUFDRyxRQUFRLG9CQUFvQiwwQkFBMEIsRUFDdEQsT0FBZ0IsSUFBSTtBQUV2QixJQUFJLE1BQU07IiwKICAibmFtZXMiOiBbImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJpc09mZmxpbmUiLCAiZG5zIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiZnMiLCAiaW1wb3J0X3BhdGgiLCAidW5pbXBvcnQiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInBhdGhzIiwgImltcG9ydF9wYXRoIiwgInBjIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAidml0ZSIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgImdsb2IiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9saW5rZWRvbSIsICJpbXBvcnRfdW5pbXBvcnQiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgInBhdGgiLCAidW5pbXBvcnQiLCAiZnMiLCAiY3JlYXRlSklUSSIsICJ0cmFuc2Zvcm0iLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJnbG9iIiwgInBhdGgiLCAicGljb21hdGNoIiwgImZzIiwgIkpTT041IiwgImltcG9ydF91bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAidW5pbXBvcnQiLCAicGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAidmVyc2lvbiIsICJvcHRpb25zIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgImltcG9ydF9mc19leHRyYSIsICJwYXRoIiwgImZzIiwgInBjIiwgInBjIiwgImZzIiwgInZpdGUiLCAicmVzb2x2ZSIsICJuZXQiLCAicGF0aCIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAicGF0aCIsICJwYyIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJpbXBvcnRfY29uc29sYSIsICJwYyIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X2NvbnNvbGEiLCAiY2FjIiwgImJ1aWxkIl0KfQo=
|
|
1972
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvY3JlYXRlRnNDYWNoZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9nbG9iYWxzLnRzIiwgIi4uL3NyYy9pbmRleC50cyIsICIuLi9zcmMvY29yZS91dGlscy9hcnJheXMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcy50cyIsICIuLi9zcmMvY29yZS9idWlsZC9idWlsZEVudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL3JlbW92ZUVtcHR5RGlycy50cyIsICIuLi9zcmMvY29yZS9idWlsZC9maW5kRW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvaW1wb3J0VHNGaWxlLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbWFuaWZlc3QudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvQ29udGVudFNlY3VyaXR5UG9saWN5LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NvbnRlbnQtc2NyaXB0cy50cyIsICIuLi9zcmMvY29yZS9idWlsZC50cyIsICIuLi9zcmMvY29yZS91dGlscy9ncm91cEVudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2Zvcm1hdER1cmF0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEJ1aWxkU3VtbWFyeS50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRUYWJsZS50cyIsICIuLi9zcmMvY29yZS9zZXJ2ZXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZmluZE9wZW5Qb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3J1bm5lcnMvY3JlYXRlV2ViRXh0UnVubmVyLnRzIiwgIi4uL3NyYy9jbGkvdXRpbHMvZGVmaW5lQ29tbWFuZC50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRIZWFkZXIudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2Rldi50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2luaXQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wcmVwYXJlLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHVibGlzaC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgY2FjIGZyb20gJ2NhYyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCAqIGFzIGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuXG5jb25zdCBjbGkgPSBjYWMoJ3d4dCcpO1xuY2xpLmhlbHAoKTtcbmNsaS52ZXJzaW9uKHZlcnNpb24pO1xuXG4vLyBERVZcbmNsaVxuICAuY29tbWFuZCgnW3Jvb3RdJywgJ3N0YXJ0IGRldiBzZXJ2ZXInKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuZGV2KTtcblxuLy8gQlVJTERcbmNsaVxuICAuY29tbWFuZCgnYnVpbGQgW3Jvb3RdJywgJ2J1aWxkIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAuYWN0aW9uKGNvbW1hbmRzLmJ1aWxkKTtcblxuLy8gUFJFUEFSRVxuY2xpXG4gIC5jb21tYW5kKCdwcmVwYXJlIFtyb290XScsICdwcmVwYXJlJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLmFjdGlvbihjb21tYW5kcy5wcmVwYXJlKTtcblxuLy8gUFVCTElTSFxuY2xpLmNvbW1hbmQoJ3B1Ymxpc2ggW3Jvb3RdJywgJ3B1Ymxpc2ggdG8gc3RvcmVzJykuYWN0aW9uKGNvbW1hbmRzLnB1Ymxpc2gpO1xuXG4vLyBJTklUXG5jbGlcbiAgLmNvbW1hbmQoJ2luaXQgW2RpcmVjdG9yeV0nLCAnaW5pdGlhbGl6ZSBhIG5ldyBwcm9qZWN0JylcbiAgLmFjdGlvbihjb21tYW5kcy5pbml0KTtcblxuY2xpLnBhcnNlKCk7XG4iLCAie1xuICBcIm5hbWVcIjogXCJ3eHRcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMi4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJOZXh0IGdlbiBmcmFtZXdvcmsgZm9yIGRldmVsb3Bpbmcgd2ViIGV4dGVuc2lvbnNcIixcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE4LjE2LjBcIixcbiAgICBcInBucG1cIjogXCI+PThcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FrbGlua2VyMS93eHRcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcInZpdGVcIixcbiAgICBcImNocm9tZVwiLFxuICAgIFwid2ViXCIsXG4gICAgXCJleHRlbnNpb25cIixcbiAgICBcImJyb3dzZXJcIixcbiAgICBcImJ1bmRsZXJcIixcbiAgICBcImZyYW1ld29ya1wiXG4gIF0sXG4gIFwiYXV0aG9yXCI6IHtcbiAgICBcIm5hbWVcIjogXCJBYXJvbiBLbGlua2VyXCIsXG4gICAgXCJlbWFpbFwiOiBcImFhcm9ua2xpbmtlcjErd3h0QGdtYWlsLmNvbVwiXG4gIH0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIlxuICBdLFxuICBcImJpblwiOiBcImRpc3QvY2xpLmNqc1wiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gIFwibW9kdWxlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2NsaWVudC5janNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2NsaWVudC5qc1wiLFxuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9jbGllbnQuZC50c1wiXG4gICAgfVxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwid3h0XCI6IFwidHN4IHNyYy9jbGkvaW5kZXgudHNcIixcbiAgICBcImJ1aWxkXCI6IFwidHN4IHNjcmlwdHMvYnVpbGQudHNcIixcbiAgICBcImZvcm1hdFwiOiBcInByZXR0aWVyIC0td3JpdGUgLlwiLFxuICAgIFwiZm9ybWF0OmNoZWNrXCI6IFwicHJldHRpZXIgLS13cml0ZSAuXCIsXG4gICAgXCJjb21waWxlXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0XCIsXG4gICAgXCJ0ZXN0OmNvdmVyYWdlXCI6IFwidml0ZXN0IHJ1biAtLWNvdmVyYWdlXCIsXG4gICAgXCJwcmVwYXJlXCI6IFwic2ltcGxlLWdpdC1ob29rc1wiLFxuICAgIFwicHJlcHVibGlzaFwiOiBcInBucG0gLXMgYnVpbGRcIixcbiAgICBcImRvY3M6ZGV2XCI6IFwidml0ZXByZXNzIGRldiBkb2NzXCIsXG4gICAgXCJkb2NzOmJ1aWxkXCI6IFwidml0ZXByZXNzIGJ1aWxkIGRvY3NcIixcbiAgICBcImRvY3M6cHJldmlld1wiOiBcInZpdGVwcmVzcyBwcmV2aWV3IGRvY3NcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvd2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL2Zha2UtYnJvd3NlclwiOiBcIl4xLjIuMlwiLFxuICAgIFwiQHdlYmV4dC1jb3JlL21hdGNoLXBhdHRlcm5zXCI6IFwiXjEuMC4xXCIsXG4gICAgXCJhc3luYy1tdXRleFwiOiBcIl4wLjQuMFwiLFxuICAgIFwiYzEyXCI6IFwiXjEuNC4yXCIsXG4gICAgXCJjYWNcIjogXCJeNi43LjE0XCIsXG4gICAgXCJjb25zb2xhXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJmYXN0LWdsb2JcIjogXCJeMy4yLjEyXCIsXG4gICAgXCJmaWxlc2l6ZVwiOiBcIl4xMC4wLjdcIixcbiAgICBcImZzLWV4dHJhXCI6IFwiXjExLjEuMVwiLFxuICAgIFwiaml0aVwiOiBcIl4xLjE4LjJcIixcbiAgICBcImpzb241XCI6IFwiXjIuMi4zXCIsXG4gICAgXCJsaW5rZWRvbVwiOiBcIl4wLjE0LjI2XCIsXG4gICAgXCJwaWNvY29sb3JzXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJwaWNvbWF0Y2hcIjogXCJeMi4zLjFcIixcbiAgICBcInVuaW1wb3J0XCI6IFwiXjMuMC44XCIsXG4gICAgXCJ2aXRlXCI6IFwiXjQuMy45XCIsXG4gICAgXCJ2aXRlLXRzY29uZmlnLXBhdGhzXCI6IFwiXjQuMi4wXCIsXG4gICAgXCJ3ZWItZXh0XCI6IFwiXjcuNi4yXCIsXG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGZha2VyLWpzL2Zha2VyXCI6IFwiXjguMC4yXCIsXG4gICAgXCJAdHlwZXMvZnMtZXh0cmFcIjogXCJeMTEuMC4xXCIsXG4gICAgXCJAdHlwZXMvbG9kYXNoLm1lcmdlXCI6IFwiXjQuNi43XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4zLjFcIixcbiAgICBcIkB0eXBlcy9waWNvbWF0Y2hcIjogXCJeMi4zLjBcIixcbiAgICBcIkB2aXRlc3QvY292ZXJhZ2UtdjhcIjogXCJeMC4zMi4yXCIsXG4gICAgXCJsb2Rhc2gubWVyZ2VcIjogXCJeNC42LjJcIixcbiAgICBcIm5wbS1ydW4tYWxsXCI6IFwiXjQuMS41XCIsXG4gICAgXCJvcmFcIjogXCJeNi4zLjFcIixcbiAgICBcInByZXR0aWVyXCI6IFwiXjIuOC44XCIsXG4gICAgXCJwcmV0dHktcXVpY2tcIjogXCJeMy4xLjNcIixcbiAgICBcInNpbXBsZS1naXQtaG9va3NcIjogXCJeMi44LjFcIixcbiAgICBcInRzdXBcIjogXCJeNy4wLjBcIixcbiAgICBcInRzeFwiOiBcIl4zLjEyLjdcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4xLjNcIixcbiAgICBcInZpdGVwcmVzc1wiOiBcIjEuMC4wLWJldGEuNVwiLFxuICAgIFwidml0ZXN0XCI6IFwiXjAuMzIuNFwiLFxuICAgIFwidml0ZXN0LW1vY2stZXh0ZW5kZWRcIjogXCJeMS4xLjRcIixcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIl4wLjEwLjBcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiPj0wLjEwLjBcIlxuICB9LFxuICBcInBhY2thZ2VNYW5hZ2VyXCI6IFwicG5wbUA4LjYuM1wiLFxuICBcInNpbXBsZS1naXQtaG9va3NcIjoge1xuICAgIFwicHJlLWNvbW1pdFwiOiBcInBucG0gcHJldHR5LXF1aWNrIC0tc3RhZ2VkXCJcbiAgfSxcbiAgXCJwbnBtXCI6IHtcbiAgICBcInBlZXJEZXBlbmRlbmN5UnVsZXNcIjoge1xuICAgICAgXCJpZ25vcmVNaXNzaW5nXCI6IFtcbiAgICAgICAgXCJAYWxnb2xpYS9jbGllbnQtc2VhcmNoXCIsXG4gICAgICAgIFwic2VhcmNoLWluc2lnaHRzXCJcbiAgICAgIF0sXG4gICAgICBcImFsbG93QW55XCI6IFtcbiAgICAgICAgXCJub2RlLWZldGNoXCJcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDb25maWdFbnYsXG4gIEV4dGVuc2lvblJ1bm5lckNvbmZpZyxcbiAgSW5saW5lQ29uZmlnLFxuICBJbnRlcm5hbENvbmZpZyxcbiAgVXNlckNvbmZpZyxcbiAgVXNlck1hbmlmZXN0LFxuICBVc2VyTWFuaWZlc3RGbixcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tICcuLi92aXRlLXBsdWdpbnMnO1xuaW1wb3J0IHsgY3JlYXRlRnNDYWNoZSB9IGZyb20gJy4vY3JlYXRlRnNDYWNoZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxzIH0gZnJvbSAnLi9nbG9iYWxzJztcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tICdjMTInO1xuXG4vKipcbiAqIEdpdmVuIGFuIGlubGluZSBjb25maWcsIGRpc2NvdmVyIHRoZSBjb25maWcgZmlsZSBpZiBuZWNlc3NhcnksIG1lcmdlIHRoZSByZXN1bHRzLCByZXNvbHZlIGFueVxuICogcmVsYXRpdmUgcGF0aHMsIGFuZCBhcHBseSBhbnkgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJbnRlcm5hbENvbmZpZyhcbiAgY29uZmlnOiBJbmxpbmVDb25maWcsXG4gIGNvbW1hbmQ6ICdidWlsZCcgfCAnc2VydmUnLFxuKTogUHJvbWlzZTxJbnRlcm5hbENvbmZpZz4ge1xuICAvLyBBcHBseSBkZWZhdWx0cyB0byBhIGJhc2UgY29uZmlnXG4gIGNvbnN0IHJvb3QgPSBjb25maWcucm9vdCA/IHBhdGgucmVzb2x2ZShjb25maWcucm9vdCkgOiBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBtb2RlID1cbiAgICBjb25maWcubW9kZSA/PyAoY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpO1xuICBjb25zdCBicm93c2VyID0gY29uZmlnLmJyb3dzZXIgPz8gJ2Nocm9tZSc7XG4gIGNvbnN0IG1hbmlmZXN0VmVyc2lvbiA9XG4gICAgY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA/PyAoYnJvd3NlciA9PSAnZmlyZWZveCcgPyAyIDogMyk7XG4gIGNvbnN0IG91dEJhc2VEaXIgPSBwYXRoLnJlc29sdmUocm9vdCwgJy5vdXRwdXQnKTtcbiAgY29uc3Qgb3V0RGlyID0gcGF0aC5yZXNvbHZlKG91dEJhc2VEaXIsIGAke2Jyb3dzZXJ9LW12JHttYW5pZmVzdFZlcnNpb259YCk7XG4gIGNvbnN0IGxvZ2dlciA9IGNvbmZpZy5sb2dnZXIgPz8gY29uc29sYTtcblxuICBjb25zdCBiYXNlQ29uZmlnOiBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnMgPSB7XG4gICAgcm9vdCxcbiAgICBvdXREaXIsXG4gICAgb3V0QmFzZURpcixcbiAgICBzdG9yZUlkczogY29uZmlnLnN0b3JlSWRzID8/IHt9LFxuICAgIGJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZGUsXG4gICAgY29tbWFuZCxcbiAgICBsb2dnZXIsXG4gICAgdml0ZTogY29uZmlnLnZpdGUgPz8ge30sXG4gICAgaW1wb3J0czogY29uZmlnLmltcG9ydHMgPz8ge30sXG4gICAgcnVubmVyQ29uZmlnOiBhd2FpdCBsb2FkQ29uZmlnPEV4dGVuc2lvblJ1bm5lckNvbmZpZz4oe1xuICAgICAgbmFtZTogJ3dlYi1leHQnLFxuICAgICAgY3dkOiByb290LFxuICAgICAgZ2xvYmFsUmM6IHRydWUsXG4gICAgICByY0ZpbGU6ICcud2ViZXh0cmMnLFxuICAgICAgb3ZlcnJpZGVzOiBjb25maWcucnVubmVyLFxuICAgIH0pLFxuICB9O1xuXG4gIC8vIExvYWQgdXNlciBjb25maWcgZnJvbSBmaWxlXG4gIGxldCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0ge1xuICAgIG1vZGUsXG4gIH07XG4gIGlmIChjb25maWcuY29uZmlnRmlsZSAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkQ29uZmlnPFVzZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3eHQnLFxuICAgICAgY3dkOiByb290LFxuICAgICAgcmNGaWxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB1c2VyQ29uZmlnID0gbG9hZGVkLmNvbmZpZyA/PyB7fTtcbiAgfVxuXG4gIC8vIE1lcmdlIGlubGluZSBhbmQgdXNlciBjb25maWdzXG4gIGNvbnN0IG1lcmdlZCA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgYmFzZUNvbmZpZyxcbiAgICB1c2VyQ29uZmlnLFxuICApIGFzIEludGVybmFsQ29uZmlnTm9Vc2VyRGlycztcblxuICAvLyBBcHBseSB1c2VyIGNvbmZpZyBhbmQgY3JlYXRlIGZpbmFsIGNvbmZpZ1xuICBjb25zdCBzcmNEaXIgPSB1c2VyQ29uZmlnLnNyY0RpciA/IHJlc29sdmUocm9vdCwgdXNlckNvbmZpZy5zcmNEaXIpIDogcm9vdDtcbiAgY29uc3QgZW50cnlwb2ludHNEaXIgPSByZXNvbHZlKFxuICAgIHNyY0RpcixcbiAgICB1c2VyQ29uZmlnLmVudHJ5cG9pbnRzRGlyID8/ICdlbnRyeXBvaW50cycsXG4gICk7XG4gIGNvbnN0IHB1YmxpY0RpciA9IHJlc29sdmUoc3JjRGlyLCB1c2VyQ29uZmlnLnB1YmxpY0RpciA/PyAncHVibGljJyk7XG4gIGNvbnN0IHd4dERpciA9IHJlc29sdmUoc3JjRGlyLCAnLnd4dCcpO1xuICBjb25zdCB0eXBlc0RpciA9IHJlc29sdmUod3h0RGlyLCAndHlwZXMnKTtcblxuICAvLyBNZXJnZSBtYW5pZmVzdCBzb3VyY2VzXG4gIGNvbnN0IGVudjogQ29uZmlnRW52ID0geyBtb2RlLCBicm93c2VyLCBtYW5pZmVzdFZlcnNpb24sIGNvbW1hbmQgfTtcbiAgY29uc3QgdXNlck1hbmlmZXN0ID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgdXNlckNvbmZpZy5tYW5pZmVzdCk7XG4gIGNvbnN0IGlubGluZU1hbmlmZXN0ID0gYXdhaXQgcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKGVudiwgY29uZmlnLm1hbmlmZXN0KTtcbiAgY29uc3QgbWFuaWZlc3QgPSB2aXRlLm1lcmdlQ29uZmlnKHVzZXJNYW5pZmVzdCwgaW5saW5lTWFuaWZlc3QpO1xuXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyA9IHtcbiAgICAuLi5tZXJnZWQsXG4gICAgc3JjRGlyLFxuICAgIGVudHJ5cG9pbnRzRGlyLFxuICAgIHB1YmxpY0RpcixcbiAgICB3eHREaXI6IHd4dERpcixcbiAgICB0eXBlc0RpcixcbiAgICBmc0NhY2hlOiBjcmVhdGVGc0NhY2hlKHd4dERpciksXG4gICAgbWFuaWZlc3QsXG4gIH07XG5cbiAgLy8gQ3VzdG9taXplIHRoZSBkZWZhdWx0IHZpdGUgY29uZmlnXG4gIGZpbmFsQ29uZmlnLnZpdGUucm9vdCA9IHJvb3Q7XG4gIGZpbmFsQ29uZmlnLnZpdGUuY29uZmlnRmlsZSA9IGZhbHNlO1xuICBmaW5hbENvbmZpZy52aXRlLmxvZ0xldmVsID0gJ3dhcm4nO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQgPz89IHt9O1xuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkLm91dERpciA9IG91dERpcjtcbiAgZmluYWxDb25maWcudml0ZS5idWlsZC5lbXB0eU91dERpciA9IGZhbHNlO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucyA/Pz0gW107XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZG93bmxvYWQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZIdG1sUHJlcmVuZGVyKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudW5pbXBvcnQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2goXG4gICAgcGx1Z2lucy52aXJ0dWFsRW50cnlwb2luKCdiYWNrZ3JvdW5kJywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2NvbnRlbnQtc2NyaXB0JywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRldlNlcnZlckdsb2JhbHMoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy50c2NvbmZpZ1BhdGhzKGZpbmFsQ29uZmlnKSk7XG5cbiAgZmluYWxDb25maWcudml0ZS5kZWZpbmUgPz89IHt9O1xuICBnZXRHbG9iYWxzKGZpbmFsQ29uZmlnKS5mb3JFYWNoKChnbG9iYWwpID0+IHtcbiAgICBmaW5hbENvbmZpZy52aXRlLmRlZmluZSFbZ2xvYmFsLm5hbWVdID0gSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLnZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZpbmFsQ29uZmlnO1xufVxuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciBkZWZpbmluZyBhIGJhc2UgY29uZmlnLCBzaW5jZSB1c2VyLWNvbmZpZ3VyYWJsZSBkaXJlY3RvcmllcyBtdXN0IGJlIHNldCBhZnRlclxuICogcmVhZGluZyBpbiB0aGUgdXNlciBjb25maWcuXG4gKi9cbnR5cGUgSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzID0gT21pdDxcbiAgSW50ZXJuYWxDb25maWcsXG4gIHwgJ3NyY0RpcidcbiAgfCAncHVibGljRGlyJ1xuICB8ICdlbnRyeXBvaW50c0RpcidcbiAgfCAnd3h0RGlyJ1xuICB8ICd0eXBlc0RpcidcbiAgfCAnZnNDYWNoZSdcbiAgfCAnbWFuaWZlc3QnXG4+O1xuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTWFuaWZlc3RDb25maWcoXG4gIGVudjogQ29uZmlnRW52LFxuICBtYW5pZmVzdDogVXNlck1hbmlmZXN0IHwgUHJvbWlzZTxVc2VyTWFuaWZlc3Q+IHwgVXNlck1hbmlmZXN0Rm4gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFVzZXJNYW5pZmVzdD4ge1xuICByZXR1cm4gYXdhaXQgKHR5cGVvZiBtYW5pZmVzdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gbWFuaWZlc3QoZW52KVxuICAgIDogbWFuaWZlc3QgPz8ge30pO1xufVxuIiwgImltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aCwgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50TmFtZShcbiAgZW50cnlwb2ludHNEaXI6IHN0cmluZyxcbiAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gIC8vIHR5cGU6IEVudHJ5cG9pbnRbJ3R5cGUnXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZW50cnlwb2ludHNEaXIsIGlucHV0UGF0aCk7XG4gIC8vIEdyYWIgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgLiBvciAvXG4gIGNvbnN0IG5hbWUgPSByZWxhdGl2ZVBhdGguc3BsaXQoL1tcXC5cXC9dLywgMilbMF07XG5cbiAgcmV0dXJuIG5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShcbiAgZW50cnlwb2ludDogRW50cnlwb2ludCxcbiAgZXh0OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZShlbnRyeXBvaW50Lm91dHB1dERpciwgYCR7ZW50cnlwb2ludC5uYW1lfSR7ZXh0fWApO1xufVxuXG4vKipcbiAqIFJldHVybidzIHRoZSBlbnRyeXBvaW50J3Mgb3V0cHV0IHBhdGggcmVsYXRpdmUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIFVzZWQgZm9yIHBhdGhzIGluIHRoZVxuICogbWFuaWZlc3QgYW5kIHJvbGx1cCdzIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBvdXREaXI6IHN0cmluZyxcbiAgZXh0OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gcmVsYXRpdmUob3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeXBvaW50LCBleHQpKTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50TmFtZSB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IHBhcnNlSFRNTCB9IGZyb20gJ2xpbmtlZG9tJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogUHJlLXJlbmRlcnMgdGhlIEhUTUwgZW50cnlwb2ludHMgd2hlbiBidWlsZGluZyB0aGUgZXh0ZW5zaW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRldiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXZIdG1sUHJlcmVuZGVyKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiB2aXRlLlBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgYXBwbHk6ICdidWlsZCcsXG4gICAgbmFtZTogJ3d4dDpkZXYtaHRtbC1wcmVyZW5kZXInLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJ0B3eHQvcmVsb2FkLWh0bWwnOiByZXNvbHZlKFxuICAgICAgICAgICAgICBjb25maWcucm9vdCxcbiAgICAgICAgICAgICAgJ25vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvcmVsb2FkLWh0bWwuanMnLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jIHRyYW5zZm9ybShodG1sLCBpZCkge1xuICAgICAgY29uc3Qgc2VydmVyID0gY29uZmlnLnNlcnZlcjtcbiAgICAgIGlmIChjb25maWcuY29tbWFuZCAhPT0gJ3NlcnZlJyB8fCBzZXJ2ZXIgPT0gbnVsbCB8fCAhaWQuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxVcmwgPSBgJHtzZXJ2ZXIub3JpZ2lufSR7aWR9YDtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIGlkKTtcbiAgICAgIGNvbnN0IHVybCA9IGAke3NlcnZlci5vcmlnaW59LyR7bmFtZX0uaHRtbGA7XG4gICAgICBjb25zdCBzZXJ2ZXJIdG1sID0gYXdhaXQgc2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbChcbiAgICAgICAgdXJsLFxuICAgICAgICBodG1sLFxuICAgICAgICBvcmlnaW5hbFVybCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoc2VydmVySHRtbCk7XG5cbiAgICAgIGNvbnN0IHBvaW50VG9EZXZTZXJ2ZXIgPSAocXVlcnlTZWxlY3Rvcjogc3RyaW5nLCBhdHRyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgICAgaWYgKCFzcmMpIHJldHVybjtcblxuICAgICAgICAgIGlmIChpc0Fic29sdXRlKHNyYykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHNlcnZlci5vcmlnaW4gKyBzcmMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3JjLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgYWJzID0gcmVzb2x2ZShkaXJuYW1lKGlkKSwgc3JjKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhuYW1lID0gcmVsYXRpdmUoY29uZmlnLnJvb3QsIGFicyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBgJHtzZXJ2ZXIub3JpZ2lufS8ke3BhdGhuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcG9pbnRUb0RldlNlcnZlcignc2NyaXB0W3R5cGU9bW9kdWxlXScsICdzcmMnKTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ2xpbmtbcmVsPXN0eWxlc2hlZXRdJywgJ2hyZWYnKTtcblxuICAgICAgLy8gQWRkIGEgc2NyaXB0IHRvIGFkZCBwYWdlIHJlbG9hZGluZ1xuICAgICAgY29uc3QgcmVsb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHJlbG9hZGVyLnNyYyA9ICdAd3h0L3JlbG9hZC1odG1sJztcbiAgICAgIHJlbG9hZGVyLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocmVsb2FkZXIpO1xuXG4gICAgICBjb25zdCBuZXdIdG1sID0gZG9jdW1lbnQudG9TdHJpbmcoKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ1RyYW5zZm9ybWVkICcgKyBpZCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdPbGQgSFRNTDpcXG4nICsgaHRtbCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdOZXcgSFRNTDpcXG4nICsgbmV3SHRtbCk7XG4gICAgICByZXR1cm4gbmV3SHRtbDtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRGVmaW5lcyBnbG9iYWwgY29uc3RhbnRzIGFib3V0IHRoZSBkZXYgc2VydmVyLiBIZWxwcyBzY3JpcHRzIGNvbm5lY3QgdG8gdGhlIHNlcnZlcidzIHdlYiBzb2NrZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXZTZXJ2ZXJHbG9iYWxzKGludGVybmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDpkZXYtc2VydmVyLWdsb2JhbHMnLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGlmIChpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPT0gbnVsbCB8fCBpbnRlcm5hbENvbmZpZy5jb21tYW5kID09ICdidWlsZCcpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVmaW5lOiB7XG4gICAgICAgICAgX19ERVZfU0VSVkVSX1BST1RPQ09MX186IEpTT04uc3RyaW5naWZ5KCd3czonKSxcbiAgICAgICAgICBfX0RFVl9TRVJWRVJfSE9TVE5BTUVfXzogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIuaG9zdG5hbWUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfX0RFVl9TRVJWRVJfUE9SVF9fOiBKU09OLnN0cmluZ2lmeShpbnRlcm5hbENvbmZpZy5zZXJ2ZXIucG9ydCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGRucyBmcm9tICdub2RlOmRucyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vcHJvbWlzZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGlzT2ZmbGluZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaXNPZmZsaW5lID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlcykgPT4ge1xuICAgIGRucy5yZXNvbHZlKCdnb29nbGUuY29tJywgKGVycikgPT4ge1xuICAgICAgaWYgKGVyciA9PSBudWxsKSB7XG4gICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXModHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gd2l0aFRpbWVvdXQoaXNPZmZsaW5lLCAxZTMpLmNhdGNoKCgpID0+IHRydWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNPbmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG9mZmxpbmUgPSBhd2FpdCBpc09mZmxpbmUoKTtcbiAgcmV0dXJuICFvZmZsaW5lO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSBVUkwgd2l0aCBhIHNpbXBsZSBHRVQgcmVxdWVzdC4gR3JhYnMgaXQgZnJvbSBjYWNoZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBvciB0aHJvd3MgYW5cbiAqIGVycm9yIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkIHZpYSB0aGUgbmV0d29yayBvciBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FjaGVkKFxuICB1cmw6IHN0cmluZyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmcgPSAnJztcblxuICBpZiAoYXdhaXQgaXNPbmxpbmUoKSkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgYXdhaXQgY29uZmlnLmZzQ2FjaGUuc2V0KHVybCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgXCIke3VybH1cIiwgZmFsbGluZyBiYWNrIHRvIGNhY2hlLi4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250ZW50KSBjb250ZW50ID0gKGF3YWl0IGNvbmZpZy5mc0NhY2hlLmdldCh1cmwpKSA/PyAnJztcbiAgaWYgKCFjb250ZW50KVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYE9mZmxpbmUgYW5kIFwiJHt1cmx9XCIgaGFzIG5vdCBiZWVuIGNhY2hlZC4gVHJ5IGFnYWluIHdoZW4gb25saW5lLmAsXG4gICAgKTtcblxuICByZXR1cm4gY29udGVudDtcbn1cbiIsICIvKipcbiAqIEFkZCBhIHRpbWVvdXQgdG8gYSBwcm9taXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlaihgUHJvbWlzZSB0aW1lZCBvdXQgYWZ0ZXIgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICBwcm9taXNlXG4gICAgICAudGhlbihyZXMpXG4gICAgICAuY2F0Y2gocmVqKVxuICAgICAgLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIGluIHByb2R1Y3Rpb24sIGp1c3QgZm9yIHRlc3RpbmcgYW5kIHNsb3dpbmcgdGhpbmdzIGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzKSA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hDYWNoZWQgfSBmcm9tICcuLi91dGlscy9uZXR3b3JrJztcblxuLyoqXG4gKiBEb3dubG9hZHMgYW55IFVSTCBpbXBvcnRzLCBsaWtlIEdvb2dsZSBBbmFseXRpY3MsIGludG8gdmlydHVhbCBtb2R1bGVzIHNvIHRoZXkgYXJlIGJ1bmRsZWQgd2l0aFxuICogdGhlIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiByZW1vdGUgY29kZSBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgXCJ1cmw6aHR0cHM6Ly9nb29nbGUtdGFnbWFuYWdlci5jb20vZ3RhZz9pZD1YWVpcIjtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZG93bmxvYWQnLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ3VybDonKSkgcmV0dXJuICdcXDAnICsgaWQ7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoJ1xcMHVybDonKSkgcmV0dXJuO1xuXG4gICAgICAvLyBMb2FkIGZpbGUgZnJvbSBuZXR3b3JrIG9yIGNhY2hlXG4gICAgICBjb25zdCB1cmwgPSBpZC5yZXBsYWNlKCdcXDB1cmw6JywgJycpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZldGNoQ2FjaGVkKHVybCwgY29uZmlnKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhlIEhUTUwgZmlsZXMgb3V0cHV0IGJ5IGEgbXVsdGlwYWdlIGJ1aWxkIGFyZSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gVGhpcyBkb2VzIHR3b1xuICogdGhpbmdzOlxuICpcbiAqIDEuIE1vdmVzIHRoZSBITVRMIGZpbGVzIHRvIHRoZWlyIGZpbmFsIGxvY2F0aW9uIGF0IGA8b3V0RGlyPi88ZW50cnlwb2ludC5uYW1lPi5odG1sYC5cbiAqIDIuIFVwZGF0ZXMgdGhlIGJ1bmRsZSBzbyBpdCBzdW1tYXJpemVzIHRoZSBmaWxlcyBjb3JyZWN0bHkgaW4gdGhlIHJldHVybmVkIGJ1aWxkIG91dHB1dC5cbiAqXG4gKiBBc3NldHMgKEpTIGFuZCBDU1MpIGFyZSBvdXRwdXQgdG8gdGhlIGA8b3V0RGlyPi9hc3NldHNgIGRpcmVjdG9yeSwgYW5kIGRvbid0IG5lZWQgdG8gYmUgbW9kaWZpZWQuXG4gKiBIVE1MIGZpbGVzIGFjY2VzcyB0aGVtIHZpYSBhYnNvbHV0ZSBVUkxzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSBhbnkgaW1wb3J0IHBhdGhzIGluIHRoZSBIVE1MXG4gKiBmaWxlcyBlaXRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBhZ2VNb3ZlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdml0ZS5QbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bXVsdGlwYWdlLW1vdmUnLFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgZm9yIChjb25zdCBvbGRCdW5kbGVQYXRoIGluIGJ1bmRsZSkge1xuICAgICAgICAvLyBvbGRCdW5kbGVQYXRoID0gJ2VudHJ5cG9pbnRzL3BvcHVwLmh0bWwnIG9yICdlbnRyeXBvaW50cy9vIHB0aW9ucy9pbmRleC5odG1sJ1xuXG4gICAgICAgIC8vIEZpbmQgYSBtYXRjaGluZyBlbnRyeXBvaW50IC0gb2xkQnVuZGxlUGF0aCBpcyB0aGUgc2FtZSBhcyBlbmQgZW5kIG9mIHRoZSBpbnB1dCBwYXRoLlxuICAgICAgICBjb25zdCBlbnRyeXBvaW50ID0gZW50cnlwb2ludHMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+ICEhZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKG9sZEJ1bmRsZVBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTm8gZW50cnlwb2ludCBmb3VuZCBmb3InLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ3BhdGgnO1xuXG5jb25zdCBFTkFCTEVEX0VYVEVOU0lPTlM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0ge1xuICAnLmpzJzogdHJ1ZSxcbiAgJy5qc3gnOiB0cnVlLFxuICAnLnRzJzogdHJ1ZSxcbiAgJy50c3gnOiB0cnVlLFxuICAnLnZ1ZSc6IHRydWUsXG4gICcuc3ZlbHRlJzogdHJ1ZSxcbn07XG5cbi8qKlxuICogSW5qZWN0IGFueSBnbG9iYWwgaW1wb3J0cyBkZWZpbmVkIGJ5IHVuaW1wb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmltcG9ydChjb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGdldFVuaW1wb3J0T3B0aW9ucyhjb25maWcpO1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDp1bmltcG9ydCcsXG4gICAgYXN5bmMgY29uZmlnKCkge1xuICAgICAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoaWQpO1xuICAgICAgaWYgKEVOQUJMRURfRVhURU5TSU9OU1tleHRdKSByZXR1cm4gdW5pbXBvcnQuaW5qZWN0SW1wb3J0cyhjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBVbmltcG9ydE9wdGlvbnMgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmltcG9ydE9wdGlvbnMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz4ge1xuICBjb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+ID0ge1xuICAgIGRlYnVnTG9nOiBjb25maWcubG9nZ2VyLmRlYnVnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgIHsgbmFtZTogJyonLCBhczogJ2Jyb3dzZXInLCBmcm9tOiAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJyB9LFxuICAgICAgeyBuYW1lOiAnZGVmaW5lQ29uZmlnJywgZnJvbTogJ3d4dCcgfSxcbiAgICBdLFxuICAgIHByZXNldHM6IFt7IHBhY2thZ2U6ICd3eHQvY2xpZW50JyB9XSxcbiAgICB3YXJuOiBjb25maWcubG9nZ2VyLndhcm4sXG4gICAgZGlyczogWydjb21wb25lbnRzJywgJ2NvbXBvc2FibGVzJywgJ2hvb2tzJywgJ3V0aWxzJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBXcmFwcyBhIHVzZXIncyBlbnRyeXBvaW50IHdpdGggYSB2aXR1YWwgdmVyc2lvbiB3aXRoIGFkZGl0aW9uYWwgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRW50cnlwb2luKFxuICB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQbHVnaW4ge1xuICBjb25zdCB2aXJ0dWFsSWQgPSBgdmlydHVhbDp3eHQtJHt0eXBlfT9gO1xuICBjb25zdCByZXNvbHZlZFZpcnR1YWxJZCA9IGBcXDAke3ZpcnR1YWxJZH1gO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYHd4dDp2aXJ0dWFsLWVudHJ5cG9pbnRgLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgLy8gSWQgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCwgaXQgbG9va3MgbGlrZSB0aGlzOlxuICAgICAgLy8gL3BhdGgvdG8vcHJvamVjdC92aXJ0dWFsOmJhY2tncm91bmQ/L3BhdGgvdG8vcHJvamVjdC9lbnRyeXBvaW50cy9iYWNrZ3JvdW5kLnRzXG4gICAgICBjb25zdCBpbmRleCA9IGlkLmluZGV4T2YodmlydHVhbElkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRWaXJ0dWFsSWQgKyBpbnB1dFBhdGg7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgocmVzb2x2ZWRWaXJ0dWFsSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IGlkLnJlcGxhY2UocmVzb2x2ZWRWaXJ0dWFsSWQsICcnKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgYG5vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvJHt0eXBlfS1lbnRyeXBvaW50LmpzYCxcbiAgICAgICAgKSxcbiAgICAgICAgJ3V0Zi04JyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShgdmlydHVhbDp1c2VyLSR7dHlwZX1gLCBpbnB1dFBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0c2NvbmZpZ1BhdGhzKGNvbmZpZzogSW50ZXJuYWxDb25maWcpIHtcbiAgY29uc3QgZm46IHR5cGVvZiBwYXRocyA9XG4gICAgdHlwZW9mIHBhdGhzID09PSAnZnVuY3Rpb24nID8gcGF0aHMgOiAocGF0aHMgYXMgYW55KS5kZWZhdWx0O1xuICByZXR1cm4gZm4oe1xuICAgIHJvb3Q6IGNvbmZpZy5yb290LFxuICB9KTtcbn1cbiIsICJpbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgRnNDYWNoZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBBIGJhc2ljIGZpbGUgc3lzdGVtIGNhY2hlIHN0b3JlZCBhdCBgPHNyY0Rpcj4vLnd4dC9jYWNoZS88a2V5PmAuIEp1c3QgY2FjaGVzIGEgc3RyaW5nIGluIGFcbiAqIGZpbGUgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKlxuICogQHBhcmFtIHNyY0RpciBBYnNvbHV0ZSBwYXRoIHRvIHNvdXJjZSBkaXJlY3RvcnkuIFNlZSBgSW50ZXJuYWxDb25maWcuc3JjRGlyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDYWNoZSh3eHREaXI6IHN0cmluZyk6IEZzQ2FjaGUge1xuICBjb25zdCBnZXRQYXRoID0gKGtleTogc3RyaW5nKSA9PlxuICAgIHJlc29sdmUod3h0RGlyLCAnY2FjaGUnLCBlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShwYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aCwgdmFsdWUsICd1dGYtOCcpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFscyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55OyB0eXBlOiBzdHJpbmcgfT4ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdfX01BTklGRVNUX1ZFUlNJT05fXycsXG4gICAgICB2YWx1ZTogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgIHR5cGU6IGAyIHwgM2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19CUk9XU0VSX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyLFxuICAgICAgdHlwZTogYFwiY2hyb21pdW1cIiB8IFwiZmlyZWZveFwiYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0NIUk9NRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2Nocm9tZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19GSVJFRk9YX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19TQUZBUklfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRURHRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2VkZ2UnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfT1BFUkFfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdvcGVyYScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19DT01NQU5EX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5jb21tYW5kLFxuICAgICAgdHlwZTogYFwiYnVpbGRcIiB8IFwic2VydmVcImAsXG4gICAgfSxcbiAgXTtcbn1cbiIsICJpbXBvcnQgeyBCdWlsZE91dHB1dCwgV3h0RGV2U2VydmVyLCBJbmxpbmVDb25maWcgfSBmcm9tICcuL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGRldGVjdERldkNoYW5nZXMgfSBmcm9tICcuL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwsIHJlYnVpbGQgfSBmcm9tICcuL2NvcmUvYnVpbGQnO1xuaW1wb3J0IHtcbiAgZ2V0U2VydmVySW5mbyxcbiAgcmVsb2FkQ29udGVudFNjcmlwdHMsXG4gIHJlbG9hZEh0bWxQYWdlcyxcbiAgc2V0dXBTZXJ2ZXIsXG59IGZyb20gJy4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS90eXBlcy9leHRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lQ29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS91dGlscy9kZWZpbmVSdW5uZXJDb25maWcnO1xuXG4vKipcbiAqIEJ1bmRsZXMgdGhlIGV4dGVuc2lvbiBmb3IgcHJvZHVjdGlvbi4gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogSW5saW5lQ29uZmlnKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNvbmZpZywgJ2J1aWxkJyk7XG4gIHJldHVybiBhd2FpdCBidWlsZEludGVybmFsKGludGVybmFsQ29uZmlnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3Qgc2VydmVySW5mbyA9IGF3YWl0IGdldFNlcnZlckluZm8oKTtcblxuICBjb25zdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZyA9ICgpID0+IHtcbiAgICBjb25zdCB2aXRlQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgICBzZXJ2ZXJJbmZvLnZpdGVTZXJ2ZXJDb25maWcsXG4gICAgICBjb25maWc/LnZpdGUgPz8ge30sXG4gICAgKTtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb25maWcoeyAuLi5jb25maWcsIHZpdGU6IHZpdGVDb25maWcgfSwgJ3NlcnZlJyk7XG4gIH07XG5cbiAgbGV0IGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcoKTtcbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2V0dXBTZXJ2ZXIoc2VydmVySW5mbywgaW50ZXJuYWxDb25maWcpO1xuICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cbiAgY29uc3QgZmlsZUNoYW5nZWRNdXRleCA9IG5ldyBNdXRleCgpO1xuICBjb25zdCBjaGFuZ2VRdWV1ZTogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcblxuICBzZXJ2ZXIud3Mub24oJ3d4dDpiYWNrZ3JvdW5kLWluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGNvbnRlbnQgc2NyaXB0cyBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2UgdGhleSdyZSBub3QgbGlzdGVkIGluIHRoZSBtYW5pZmVzdFxuICAgIHJlbG9hZENvbnRlbnRTY3JpcHRzKHNlcnZlci5jdXJyZW50T3V0cHV0LnN0ZXBzLCBpbnRlcm5hbENvbmZpZywgc2VydmVyKTtcbiAgfSk7XG5cbiAgc2VydmVyLndhdGNoZXIub24oJ2FsbCcsIGFzeW5jIChldmVudCwgcGF0aCwgX3N0YXRzKSA9PiB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGRldGVjdERldkNoYW5nZXMoZmlsZUNoYW5nZXMsIHNlcnZlci5jdXJyZW50T3V0cHV0KTtcblxuICAgICAgaWYgKGNoYW5nZXMudHlwZSA9PT0gJ25vLWNoYW5nZScpIHJldHVybjtcblxuICAgICAgLy8gTG9nIHRoZSBlbnRyeXBvaW50cyB0aGF0IHdlcmUgZWZmZWN0ZWRcbiAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IG5ld091dHB1dDtcblxuICAgICAgLy8gUGVyZm9ybSByZWxvYWRzXG4gICAgICBzd2l0Y2ggKGNoYW5nZXMudHlwZSkge1xuICAgICAgICBjYXNlICdleHRlbnNpb24tcmVsb2FkJzpcbiAgICAgICAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRIdG1sUGFnZXMoY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLCBzZXJ2ZXIsIGludGVybmFsQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRDb250ZW50U2NyaXB0cyhjaGFuZ2VzLmNoYW5nZWRTdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkOiAke3JlYnVpbHROYW1lc31gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBhcnJheTogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBCdWlsZFN0ZXBPdXRwdXQsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBldmVyeSB9IGZyb20gJy4vYXJyYXlzJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9XG4gICAgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShjaGFuZ2VkRmlsZXMsIChbXywgZmlsZV0pID0+IGZpbGUuZW5kc1dpdGgoJy5odG1sJykpO1xuICBpZiAoaXNPbmx5SHRtbENoYW5nZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2h0bWwtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc09ubHlDb250ZW50U2NyaXB0cyA9XG4gICAgY2hhbmdlZE91dHB1dC5zdGVwcy5sZW5ndGggPiAwICYmXG4gICAgZXZlcnkoXG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgICAgKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSAnY29udGVudC1zY3JpcHQnLFxuICAgICk7XG4gIGlmIChpc09ubHlDb250ZW50U2NyaXB0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgY2hhbmdlZFN0ZXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJyxcbiAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gIH07XG59XG5cbi8qKlxuICogRm9yIGEgc2luZ2xlIGNoYW5nZSwgcmV0dXJuIGFsbCB0aGUgc3RlcCBvZiB0aGUgYnVpbGQgb3V0cHV0IHRoYXQgd2VyZSBlZmZlY3RlZCBieSBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZEVmZmVjdGVkU3RlcHMoXG4gIGNoYW5nZWRGaWxlOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXSxcbiAgY3VycmVudE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBEZXRlY3RlZENoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogRGV0ZWN0ZWRDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjaGFuZ2VkUGF0aCA9IGNoYW5nZWRGaWxlWzFdO1xuXG4gIGNvbnN0IGlzQ2h1bmtFZmZlY3RlZCA9IChcbiAgICBjaHVuazogdml0ZS5Sb2xsdXAuT3V0cHV0Q2h1bmsgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldCxcbiAgKTogYm9vbGVhbiA9PlxuICAgIC8vIElmIGl0J3MgYW4gSFRNTCBmaWxlIHdpdGggdGhlIHNhbWUgcGF0aCwgaXMgaXMgZWZmZWN0ZWQgYmVjYXVzZSBIVE1MIGZpbGVzIG5lZWQgdG8gYmUgcHJlLXJlbmRlcmVkXG4gICAgLy8gVE9ETzogdXNlIGJ1bmRsZSBwYXRoIHRvIHN1cHBvcnQgYDxuYW1lPi9pbmRleC5odG1sYD9cbiAgICAoY2h1bmsudHlwZSA9PT0gJ2Fzc2V0JyAmJiBjaGFuZ2VkUGF0aC5lbmRzV2l0aChjaHVuay5maWxlTmFtZSkpIHx8XG4gICAgLy8gSWYgaXQncyBhIGNodW5rIHRoYXQgZGVwZW5kcyBvbiB0aGUgY2hhbmdlZCBmaWxlLCBpdCBpcyBlZmZlY3RlZFxuICAgIChjaHVuay50eXBlID09PSAnY2h1bmsnICYmIGNodW5rLm1vZHVsZUlkcy5pbmNsdWRlcyhjaGFuZ2VkUGF0aCkpO1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgY29uc3QgZWZmZWN0ZWRDaHVuayA9IHN0ZXAuY2h1bmtzLmZpbmQoKGNodW5rKSA9PiBpc0NodW5rRWZmZWN0ZWQoY2h1bmspKTtcbiAgICBpZiAoZWZmZWN0ZWRDaHVuaykgY2hhbmdlcy5wdXNoKHN0ZXApO1xuICB9XG5cbiAgY29uc3QgZWZmZWN0ZWRBc3NldCA9IGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzLmZpbmQoKGNodW5rKSA9PlxuICAgIGlzQ2h1bmtFZmZlY3RlZChjaHVuayksXG4gICk7XG4gIGlmIChlZmZlY3RlZEFzc2V0KSBjaGFuZ2VzLnB1c2goZWZmZWN0ZWRBc3NldCk7XG5cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBmaWxlcyBjaGFuZ2VkLCB3aGF0IG5lZWRzIHJlYnVpbHQsIGFuZCB0aGUgdHlwZSBvZiByZWxvYWQgdGhhdCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERldk1vZGVDaGFuZ2UgPVxuICB8IE5vQ2hhbmdlXG4gIHwgSHRtbFJlbG9hZFxuICB8IEV4dGVuc2lvblJlbG9hZFxuICB8IENvbnRlbnRTY3JpcHRSZWxvYWQ7XG4vLyB8IEJyb3dzZXJSZXN0YXJ0XG5cbmludGVyZmFjZSBOb0NoYW5nZSB7XG4gIHR5cGU6ICduby1jaGFuZ2UnO1xufVxuXG5pbnRlcmZhY2UgUmVidWlsZENoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbnRyeXBvaW50cyB0aGF0IG5lZWQgcmVidWlsdC5cbiAgICovXG4gIHJlYnVpbGRHcm91cHM6IEVudHJ5cG9pbnRHcm91cFtdO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIG91dHB1dCBzdHJpcHBlZCBvZiBhbnkgZmlsZXMgYXJlIGdvaW5nIHRvIGNoYW5nZS5cbiAgICovXG4gIGNhY2hlZE91dHB1dDogQnVpbGRPdXRwdXQ7XG59XG5cbmludGVyZmFjZSBIdG1sUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdodG1sLXJlbG9hZCc7XG59XG5cbmludGVyZmFjZSBFeHRlbnNpb25SZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnO1xufVxuXG4vLyBpbnRlcmZhY2UgQnJvd3NlclJlc3RhcnQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbi8vICAgdHlwZTogJ2Jyb3dzZXItcmVzdGFydCc7XG4vLyB9XG5cbmludGVyZmFjZSBDb250ZW50U2NyaXB0UmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnO1xuICBjaGFuZ2VkU3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdO1xufVxuXG4vKipcbiAqIFdoZW4gZmlndXJpbmcgb3V0IHdoYXQgbmVlZHMgcmVsb2FkZWQsIHRoaXMgc3RvcmVzIHRoZSBzdGVwIHRoYXQgd2FzIGNoYW5nZWQsIG9yIHRoZSBwdWJsaWNcbiAqIGRpcmVjdG9yeSBhc3NldCB0aGF0IHdhcyBjaGFuZ2VkLiBJdCBkb2Vzbid0IGtub3cgd2hhdCB0eXBlIG9mIGNoYW5nZSBpcyByZXF1aXJlZCB5ZXQuIEp1c3QgYW5cbiAqIGludGVybWVkaWF0ZSB0eXBlLlxuICovXG50eXBlIERldGVjdGVkQ2hhbmdlID0gQnVpbGRTdGVwT3V0cHV0IHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQ7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0LFxuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IHJlbW92ZUVtcHR5RGlycyB9IGZyb20gJy4uL3V0aWxzL3JlbW92ZUVtcHR5RGlycyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFbnRyeXBvaW50cyhcbiAgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IGxpYk1vZGU6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBidWlsZDoge1xuICAgICAgbGliOiB7XG4gICAgICAgIGVudHJ5LFxuICAgICAgICBmb3JtYXRzOiBbJ2lpZmUnXSxcbiAgICAgICAgbmFtZTogJ18nLFxuICAgICAgICBmaWxlTmFtZTogZW50cnlwb2ludC5uYW1lLFxuICAgICAgfSxcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gVGhlcmUncyBvbmx5IGEgc2luZ2xlIG91dHB1dCBmb3IgdGhpcyBidWlsZCwgc28gd2UgdXNlIHRoZSBkZXNpcmVkIGJ1bmRsZSBwYXRoIGZvciB0aGVcbiAgICAgICAgICAvLyBlbnRyeSBvdXRwdXQgKGxpa2UgXCJjb250ZW50LXNjcmlwdHMvb3ZlcmxheS5qc1wiKVxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgJy5qcycsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBPdXRwdXQgY29udGVudCBzY3JpcHQgQ1NTIHRvIGFzc2V0cy8gd2l0aCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHMuIERlZmF1bHRzIHRvXG4gICAgICAgICAgLy8gXCJbbmFtZV0uW2V4dF1cIiBpbiBsaWIgbW9kZSwgd2hpY2ggdXN1YWxseSByZXN1bHRzIGluIFwic3R5bGUuY3NzXCIuIFRoYXQgbWVhbnMgbXVsdGlwbGVcbiAgICAgICAgICAvLyBjb250ZW50IHNjcmlwdHMgd2l0aCBzdHlsZXMgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIgaWYgaXQgd2VyZW4ndCBjaGFuZ2VkIGJlbG93LlxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBgYXNzZXRzLyR7ZW50cnlwb2ludC5uYW1lfS5bZXh0XWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBsaWJNb2RlLFxuICAgIGNvbmZpZy52aXRlLFxuICApIGFzIHZpdGUuSW5saW5lQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzOiBlbnRyeXBvaW50LFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBVc2UgVml0ZSdzIG11bHRpcGFnZSBidWlsZCB0byBidW5kbGUgYWxsIHRoZSBlbnRyeXBvaW50cyBpbiBhIHNpbmdsZSBzdGVwLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZE11bHRpcGxlRW50cnlwb2ludHMoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkU3RlcE91dHB1dD4ge1xuICBjb25zdCBtdWx0aVBhZ2U6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBwbHVnaW5zOiBbcGx1Z2lucy5tdWx0aXBhZ2VNb3ZlKGVudHJ5cG9pbnRzLCBjb25maWcpXSxcbiAgICBidWlsZDoge1xuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBpbnB1dDogZW50cnlwb2ludHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChpbnB1dCwgZW50cnkpID0+IHtcbiAgICAgICAgICBpbnB1dFtlbnRyeS5uYW1lXSA9IGVudHJ5LmlucHV0UGF0aDtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH0sIHt9KSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBjaHVua0ZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBJbmNsdWRlIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiAnY2h1bmtzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIC8vIFdlIGNhbid0IGNvbnRyb2wgdGhlIFwibmFtZVwiLCBzbyB3ZSBuZWVkIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAnYXNzZXRzL1tuYW1lXS1baGFzaF0uW2V4dF0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBtdWx0aVBhZ2UsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5Vc2VyQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzLFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbGRPdXRwdXRDaHVua3MoXG4gIHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB2aXRlLmJ1aWxkPj4sXG4pOiBCdWlsZFN0ZXBPdXRwdXRbJ2NodW5rcyddIHtcbiAgaWYgKCdvbicgaW4gcmVzdWx0KSB0aHJvdyBFcnJvcignd3h0IGRvZXMgbm90IHN1cHBvcnQgdml0ZSB3YXRjaCBtb2RlLicpO1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSByZXR1cm4gcmVzdWx0LmZsYXRNYXAoKHsgb3V0cHV0IH0pID0+IG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5UHVibGljRGlyZWN0b3J5KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10+IHtcbiAgY29uc3QgcHVibGljQXNzZXRzOiBCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10gPSBbXTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIHB1YmxpY0Fzc2V0cztcblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7IGN3ZDogY29uZmlnLnB1YmxpY0RpciB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbixcbiAgQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50LFxuICBJbnRlcm5hbENvbmZpZyxcbiAgT3B0aW9uc0VudHJ5cG9pbnQsXG4gIFBvcHVwRW50cnlwb2ludCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwaWNvbWF0Y2ggZnJvbSAncGljb21hdGNoJztcbmltcG9ydCB7IHBhcnNlSFRNTCB9IGZyb20gJ2xpbmtlZG9tJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBpbXBvcnRUc0ZpbGUgfSBmcm9tICcuLi91dGlscy9pbXBvcnRUc0ZpbGUnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuXG4vKipcbiAqIFJldHVybiBlbnRyeXBvaW50cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBieSBsb29raW5nIHRocm91Z2ggdGhlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRW50cnlwb2ludHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEVudHJ5cG9pbnRbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYignKiovKicsIHtcbiAgICBjd2Q6IGNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgfSk7XG4gIC8vIEVuc3VyZSBjb25zaXN0ZW50IG91dHB1dFxuICByZWxhdGl2ZVBhdGhzLnNvcnQoKTtcblxuICBjb25zdCBwYXRoR2xvYnMgPSBPYmplY3Qua2V5cyhQQVRIX0dMT0JfVE9fVFlQRV9NQVApO1xuICBjb25zdCBleGlzdGluZ05hbWVzOiBSZWNvcmQ8c3RyaW5nLCBFbnRyeXBvaW50IHwgdW5kZWZpbmVkPiA9IHt9O1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10gPSBbXTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgbWF0Y2hpbmdHbG9iID0gcGF0aEdsb2JzLmZpbmQoKGdsb2IpID0+XG4gICAgICAgIHBpY29tYXRjaC5pc01hdGNoKHJlbGF0aXZlUGF0aCwgZ2xvYiksXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdHbG9iID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgICBgJHtyZWxhdGl2ZVBhdGh9IGRvZXMgbm90IG1hdGNoIGFueSBrbm93biBlbnRyeXBvaW50LiBLbm93biBlbnRyeXBvaW50czpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgUEFUSF9HTE9CX1RPX1RZUEVfTUFQLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gUEFUSF9HTE9CX1RPX1RZUEVfTUFQW21hdGNoaW5nR2xvYl07XG4gICAgICBpZiAodHlwZSA9PT0gJ2lnbm9yZWQnKSByZXR1cm47XG5cbiAgICAgIGxldCBlbnRyeXBvaW50OiBFbnRyeXBvaW50O1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BvcHVwJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0UG9wdXBFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRPcHRpb25zRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdpdGhTYW1lTmFtZSA9IGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXTtcbiAgICAgIGlmICh3aXRoU2FtZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGggdGhlIG5hbWUgXCIke1xuICAgICAgICAgICAgZW50cnlwb2ludC5uYW1lXG4gICAgICAgICAgfVwiIGRldGVjdGVkLCBidXQgb25seSBvbmUgaXMgYWxsb3dlZDogJHtbXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgd2l0aFNhbWVOYW1lLmlucHV0UGF0aCksXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgZW50cnlwb2ludC5pbnB1dFBhdGgpLFxuICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZW50cnlwb2ludHMucHVzaChlbnRyeXBvaW50KTtcbiAgICAgIGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXSA9IGVudHJ5cG9pbnQ7XG4gICAgfSksXG4gICk7XG4gIHJldHVybiBlbnRyeXBvaW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwb3B1cCBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvcHVwRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxQb3B1cEVudHJ5cG9pbnQ+IHtcbiAgY29uc3Qgb3B0aW9uczogUG9wdXBFbnRyeXBvaW50WydvcHRpb25zJ10gPSB7fTtcblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHBhcnNlSFRNTChjb250ZW50KTtcblxuICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG4gIGlmICh0aXRsZSAhPSBudWxsKSBvcHRpb25zLmRlZmF1bHRUaXRsZSA9IHRpdGxlLnRleHRDb250ZW50ID8/IHVuZGVmaW5lZDtcblxuICBjb25zdCBkZWZhdWx0SWNvbkNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5kZWZhdWx0X2ljb24nXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChkZWZhdWx0SWNvbkNvbnRlbnQpIHtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucy5kZWZhdWx0SWNvbiA9IEpTT041LnBhcnNlKGRlZmF1bHRJY29uQ29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25maWcubG9nZ2VyLmZhdGFsKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGRlZmF1bHRfaWNvbiBtZXRhIHRhZyBjb250ZW50IGFzIEpTT041LiBjb250ZW50PSR7ZGVmYXVsdEljb25Db250ZW50fWAsXG4gICAgICAgIGVycixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbXYyS2V5Q29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LnR5cGUnXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChtdjJLZXlDb250ZW50KSB7XG4gICAgb3B0aW9ucy5tdjJLZXkgPVxuICAgICAgbXYyS2V5Q29udGVudCA9PT0gJ3BhZ2VfYWN0aW9uJyA/ICdwYWdlX2FjdGlvbicgOiAnYnJvd3Nlcl9hY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAncG9wdXAnLFxuICAgIG5hbWU6ICdwb3B1cCcsXG4gICAgb3B0aW9ucyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIG9wdGlvbnMgSFRNTCBmaWxlLlxuICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxPcHRpb25zRW50cnlwb2ludD4ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25zRW50cnlwb2ludFsnb3B0aW9ucyddID0ge307XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3Qgb3BlbkluVGFiQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0Lm9wZW5faW5fdGFiJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAob3BlbkluVGFiQ29udGVudCkge1xuICAgIG9wdGlvbnMub3BlbkluVGFiID0gQm9vbGVhbihvcGVuSW5UYWJDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBCb29sZWFuKGNocm9tZVN0eWxlQ29udGVudCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyU3R5bGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuYnJvd3Nlcl9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGJyb3dzZXJTdHlsZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmJyb3dzZXJTdHlsZSA9IEJvb2xlYW4oYnJvd3NlclN0eWxlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdvcHRpb25zJyxcbiAgICBuYW1lOiAnb3B0aW9ucycsXG4gICAgb3B0aW9ucyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGJhY2tncm91bmQncyBUUyBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxCYWNrZ3JvdW5kRW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9XG4gICAgYXdhaXQgaW1wb3J0VHNGaWxlPEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbj4ocGF0aCwgY29uZmlnKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdiYWNrZ3JvdW5kJyxcbiAgICBuYW1lOiAnYmFja2dyb3VuZCcsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgICBvcHRpb25zOiBvcHRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIGNvbnRlbnQgc2NyaXB0J3MgVFMgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxDb250ZW50U2NyaXB0RW50cnlwb2ludD4ge1xuICBjb25zdCB7IG1haW46IF8sIC4uLm9wdGlvbnMgfSA9IGF3YWl0IGltcG9ydFRzRmlsZTxDb250ZW50U2NyaXB0RGVmaW5pdGlvbj4oXG4gICAgcGF0aCxcbiAgICBjb25maWcsXG4gICk7XG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICB0aHJvdyBFcnJvcihgQ29udGVudCBzY3JpcHQgJHtuYW1lfSBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnRgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdjb250ZW50LXNjcmlwdCcsXG4gICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiByZXNvbHZlKGNvbmZpZy5vdXREaXIsICdjb250ZW50LXNjcmlwdHMnKSxcbiAgICBvcHRpb25zLFxuICB9O1xufVxuXG5jb25zdCBQQVRIX0dMT0JfVE9fVFlQRV9NQVA6IFJlY29yZDxzdHJpbmcsIEVudHJ5cG9pbnRbJ3R5cGUnXSB8ICdpZ25vcmVkJz4gPSB7XG4gICdzYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICdzYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuXG4gICdib29rbWFya3MuaHRtbCc6ICdib29rbWFya3MnLFxuICAnYm9va21hcmtzL2luZGV4Lmh0bWwnOiAnYm9va21hcmtzJyxcblxuICAnaGlzdG9yeS5odG1sJzogJ2hpc3RvcnknLFxuICAnaGlzdG9yeS9pbmRleC5odG1sJzogJ2hpc3RvcnknLFxuXG4gICduZXd0YWIuaHRtbCc6ICduZXd0YWInLFxuICAnbmV3dGFiL2luZGV4Lmh0bWwnOiAnbmV3dGFiJyxcblxuICAnc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJ3NpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICcqLnNpZGVwYW5lbC9pbmRleC5odG1sJzogJ3NpZGVwYW5lbCcsXG5cbiAgJ2RldnRvb2xzLmh0bWwnOiAnZGV2dG9vbHMnLFxuICAnZGV2dG9vbHMvaW5kZXguaHRtbCc6ICdkZXZ0b29scycsXG5cbiAgJ2JhY2tncm91bmQudHMnOiAnYmFja2dyb3VuZCcsXG5cbiAgJ2NvbnRlbnQudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJ2NvbnRlbnQvaW5kZXgudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJyouY29udGVudC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICAnKi5jb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG5cbiAgJ3BvcHVwLmh0bWwnOiAncG9wdXAnLFxuICAncG9wdXAvaW5kZXguaHRtbCc6ICdwb3B1cCcsXG5cbiAgJ29wdGlvbnMuaHRtbCc6ICdvcHRpb25zJyxcbiAgJ29wdGlvbnMvaW5kZXguaHRtbCc6ICdvcHRpb25zJyxcblxuICAnKi5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi9pbmRleC5odG1sJzogJ3VubGlzdGVkLXBhZ2UnLFxuICAnKi50cyc6ICd1bmxpc3RlZC1zY3JpcHQnLFxuXG4gIC8vIERvbid0IHdhcm4gYWJvdXQgYW55IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzLCBsaWtlIENTUyBvciBKUyBlbnRyeXBvaW50cyBmb3IgSFRNTCBmaWxlc1xuICAnKi8qJzogJ2lnbm9yZWQnLFxufTtcbiIsICJpbXBvcnQgY3JlYXRlSklUSSBmcm9tICdqaXRpJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHRyYW5zZm9ybSBmcm9tICdqaXRpL2Rpc3QvYmFiZWwnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi9hdXRvLWltcG9ydHMnO1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBgcGF0aGAuXG4gKlxuICogSXQgd29ya3MgYnk6XG4gKlxuICogMS4gUmVhZGluZyB0aGUgZmlsZSB0ZXh0XG4gKiAyLiBTdHJpcHBpbmcgYWxsIGltcG9ydHMgZnJvbSBpdCB2aWEgcmVnZXhcbiAqIDMuIEF1dG8taW1wb3J0IG9ubHkgdGhlIGNsaWVudCBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogVGhpcyBwcmV2ZW50cyByZXNvbHZpbmcgaW1wb3J0cyBvZiBpbXBvcnRzLCBzcGVlZGluZyB0aGluZ3MgdXAgYW5kIHByZXZlbnRpbmcgXCJ4eHggaXMgbm90XG4gKiBkZWZpbmVkXCIgZXJyb3JzLlxuICpcbiAqIERvd25zaWRlIGlzIHRoYXQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbWFpbiBmdWNudGlvbiBmb3IgdGhlIGVudHJ5cG9pbnQsXG4gKiBvdGhlcndpc2UgeW91IHdpbGwgc2VlIFwieHh4IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIGZvciBhbnkgaW1wb3J0cyB1c2VkIG91dHNpZGUgb2YgbWFpbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFRzRmlsZTxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZmlsZSBtZXRhZGF0YTonLCBwYXRoKTtcblxuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHtcbiAgICAuLi5nZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSxcbiAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmljIGltcG9ydHMsIG5vdCBhbGwgZnJvbSB0aGUgcHJvamVjdFxuICAgIGltcG9ydHM6IFt7IG5hbWU6ICcqJywgYXM6ICdicm93c2VyJywgZnJvbTogJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCcgfV0sXG4gICAgZGlyczogW10sXG4gIH0pO1xuICBhd2FpdCB1bmltcG9ydC5pbml0KCk7XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB0ZXh0Tm9JbXBvcnRzID0gdGV4dC5yZXBsYWNlKC9pbXBvcnQuKltcXG47XS9nbSwgJycpO1xuICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHVuaW1wb3J0LmluamVjdEltcG9ydHModGV4dE5vSW1wb3J0cyk7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgWydUZXh0OicsIHRleHQsICdObyBpbXBvcnRzOicsIHRleHROb0ltcG9ydHMsICdDb2RlOicsIGNvZGVdLmpvaW4oJ1xcbicpLFxuICApO1xuXG4gIGNvbnN0IGppdGkgPSBjcmVhdGVKSVRJKF9fZmlsZW5hbWUsIHtcbiAgICBjYWNoZTogZmFsc2UsXG4gICAgZXNtUmVzb2x2ZTogdHJ1ZSxcbiAgICBpbnRlcm9wRGVmYXVsdDogdHJ1ZSxcbiAgICBhbGlhczoge1xuICAgICAgJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc6IHJlc29sdmUoXG4gICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAnbm9kZV9tb2R1bGVzL3d4dC9kaXN0L3ZpcnR1YWwtbW9kdWxlcy9mYWtlLWJyb3dzZXIuanMnLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHRyYW5zZm9ybShvcHRzKSB7XG4gICAgICBpZiAob3B0cy5maWxlbmFtZSA9PT0gcGF0aCkgcmV0dXJuIHRyYW5zZm9ybSh7IC4uLm9wdHMsIHNvdXJjZTogY29kZSB9KTtcbiAgICAgIGVsc2UgcmV0dXJuIHRyYW5zZm9ybShvcHRzKTtcbiAgICB9LFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBqaXRpKHBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25maWcubG9nZ2VyLmVycm9yKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlVW5pbXBvcnQgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZXRVbmltcG9ydE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9hdXRvLWltcG9ydHMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFscyB9IGZyb20gJy4uL3V0aWxzL2dsb2JhbHMnO1xuXG4vKipcbiAqIEdlbmVyYXRlIGFuZCB3cml0ZSBhbGwgdGhlIGZpbGVzIGluc2lkZSB0aGUgYEludGVybmFsQ29uZmlnLnR5cGVzRGlyYCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVzRGlyKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcudHlwZXNEaXIpO1xuXG4gIGNvbnN0IHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZVBhdGhzRGVjbGFyYXRpb25GaWxlKGVudHJ5cG9pbnRzLCBjb25maWcpKTtcbiAgcmVmZXJlbmNlcy5wdXNoKGF3YWl0IHdyaXRlR2xvYmFsc0RlY2xhcmF0aW9uRmlsZShjb25maWcpKTtcblxuICBjb25zdCBtYWluUmVmZXJlbmNlID0gYXdhaXQgd3JpdGVNYWluRGVjbGFyYXRpb25GaWxlKHJlZmVyZW5jZXMsIGNvbmZpZyk7XG4gIGF3YWl0IHdyaXRlVHNDb25maWdGaWxlKG1haW5SZWZlcmVuY2UsIGNvbmZpZyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1wb3J0c0RlY2xhcmF0aW9uRmlsZShcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShjb25maWcudHlwZXNEaXIsICdpbXBvcnRzLmQudHMnKTtcbiAgY29uc3QgdW5pbXBvcnQgPSBjcmVhdGVVbmltcG9ydChnZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSk7XG5cbiAgLy8gTG9hZCBwcm9qZWN0IGltcG9ydHMgaW50byB1bmltcG9ydCBtZW1vcnkgc28gdGhleSBhcmUgb3V0cHV0IHZpYSBnZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnNcbiAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIFsnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsIGF3YWl0IHVuaW1wb3J0LmdlbmVyYXRlVHlwZURlY2xhcmF0aW9ucygpXS5qb2luKFxuICAgICAgJ1xcbicsXG4gICAgKSArICdcXG4nLFxuICApO1xuXG4gIHJldHVybiBmaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShjb25maWcudHlwZXNEaXIsICdwYXRocy5kLnRzJyk7XG4gIGNvbnN0IHVuaW9ucyA9IGVudHJ5cG9pbnRzXG4gICAgLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgZW50cnksXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgIGVudHJ5LmlucHV0UGF0aC5lbmRzV2l0aCgnLmh0bWwnKSA/ICcuaHRtbCcgOiAnLmpzJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYCAgfCBcIi8ke3BhdGh9XCJgO1xuICAgIH0pXG4gICAgLnNvcnQoKTtcblxuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgW1xuICAgICAgJy8vIEdlbmVyYXRlZCBieSB3eHQnLFxuICAgICAgJ3R5cGUgRW50cnlwb2ludFBhdGggPScsXG4gICAgICAuLi4odW5pb25zLmxlbmd0aCA9PT0gMCA/IFsnICBuZXZlciddIDogdW5pb25zKSxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnZ2xvYmFscy5kLnRzJyk7XG4gIGNvbnN0IGdsb2JhbHMgPSBnZXRHbG9iYWxzKGNvbmZpZyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICAnZXhwb3J0IHt9JyxcbiAgICAgICdkZWNsYXJlIGdsb2JhbCB7JyxcbiAgICAgIC4uLmdsb2JhbHMubWFwKChnbG9iYWwpID0+IGAgIGNvbnN0ICR7Z2xvYmFsLm5hbWV9OiAke2dsb2JhbC50eXBlfTtgKSxcbiAgICAgICd9JyxcbiAgICBdLmpvaW4oJ1xcbicpICsgJ1xcbicsXG4gICAgJ3V0Zi04JyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUoXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGRpciwgJ3d4dC5kLnRzJyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbXG4gICAgICAnLy8gR2VuZXJhdGVkIGJ5IHd4dCcsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJ2aXRlL2NsaWVudFwiIC8+YCxcbiAgICAgIC4uLnJlZmVyZW5jZXMubWFwKFxuICAgICAgICAocmVmKSA9PiBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuLyR7cmVsYXRpdmUoZGlyLCByZWYpfVwiIC8+YCxcbiAgICAgICksXG4gICAgXS5qb2luKCdcXG4nKSArICdcXG4nLFxuICApO1xuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlVHNDb25maWdGaWxlKFxuICBtYWluUmVmZXJlbmNlOiBzdHJpbmcsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgZGlyID0gY29uZmlnLnd4dERpcjtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIHJlc29sdmUoZGlyLCAndHNjb25maWcuanNvbicpLFxuICAgIGB7XG4gIFwiY29tcGlsZXJPcHRpb25zXCI6IHtcbiAgICBcInRhcmdldFwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlXCI6IFwiRVNOZXh0XCIsXG4gICAgXCJtb2R1bGVSZXNvbHV0aW9uXCI6IFwiQnVuZGxlclwiLFxuICAgIFwibm9FbWl0XCI6IHRydWUsXG4gICAgXCJlc01vZHVsZUludGVyb3BcIjogdHJ1ZSxcbiAgICBcImZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzXCI6IHRydWUsXG4gICAgXCJyZXNvbHZlSnNvbk1vZHVsZVwiOiB0cnVlLFxuXG4gICAgLyogVHlwZSBDaGVja2luZyAqL1xuICAgIFwic3RyaWN0XCI6IHRydWUsXG5cbiAgICAvKiBDb21wbGV0ZW5lc3MgKi9cbiAgICBcInNraXBMaWJDaGVja1wiOiB0cnVlLFxuXG4gICAgLyogQWxpYXNlcyAqL1xuICAgIFwiYmFzZVVybFwiOiBcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcucm9vdCl9XCIsXG4gICAgXCJwYXRoc1wiOiB7XG4gICAgICBcIkBAXCI6IFtcIi5cIl0sXG4gICAgICBcIkBALypcIjogW1wiLi8qXCJdLFxuICAgICAgXCJ+flwiOiBbXCIuXCJdLFxuICAgICAgXCJ+fi8qXCI6IFtcIi4vKlwiXSxcbiAgICAgIFwiQFwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX1cIl0sXG4gICAgICBcIkAvKlwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX0vKlwiXSxcbiAgICAgIFwiflwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX1cIl0sXG4gICAgICBcIn4vKlwiOiBbXCIke3JlbGF0aXZlKGNvbmZpZy5yb290LCBjb25maWcuc3JjRGlyKX0vKlwiXVxuICAgIH1cbiAgfSxcbiAgXCJpbmNsdWRlXCI6IFtcbiAgICBcIiR7cmVsYXRpdmUoZGlyLCBjb25maWcucm9vdCl9LyoqLypcIixcbiAgICBcIi4vJHtyZWxhdGl2ZShkaXIsIG1haW5SZWZlcmVuY2UpfVwiXG4gIF0sXG4gIFwiZXhjbHVkZVwiOiBbXCIke3JlbGF0aXZlKGRpciwgY29uZmlnLm91dEJhc2VEaXIpfVwiXVxufWAsXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCdWlsZE91dHB1dCxcbiAgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQsXG4gIEludGVybmFsQ29uZmlnLFxuICBPcHRpb25zRW50cnlwb2ludCxcbiAgUG9wdXBFbnRyeXBvaW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IENvbnRlbnRTZWN1cml0eVBvbGljeSB9IGZyb20gJy4vQ29udGVudFNlY3VyaXR5UG9saWN5JztcbmltcG9ydCB7XG4gIGhhc2hDb250ZW50U2NyaXB0T3B0aW9ucyxcbiAgbWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdCxcbn0gZnJvbSAnLi9jb250ZW50LXNjcmlwdHMnO1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgbWFuaWZlc3QgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgYW5kIHRoZSBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZU1hbmlmZXN0KFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RyID1cbiAgICBjb25maWcubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KVxuICAgICAgOiBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMik7XG5cbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocmVzb2x2ZShjb25maWcub3V0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBzdHIsICd1dGYtOCcpO1xuXG4gIG91dHB1dC5wdWJsaWNBc3NldHMudW5zaGlmdCh7XG4gICAgdHlwZTogJ2Fzc2V0JyxcbiAgICBmaWxlTmFtZTogJ21hbmlmZXN0Lmpzb24nLFxuICAgIG5hbWU6ICdtYW5pZmVzdCcsXG4gICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICBzb3VyY2U6IHN0cixcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYW5pZmVzdCBiYXNlZCBvbiB0aGUgY29uZmlnIGFuZCBlbnRyeXBvaW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWFpbmZlc3QoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8TWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q+IHtcbiAgY29uc3QgcGtnID0gYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKTtcbiAgaWYgKHBrZy52ZXJzaW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgdmVyc2lvbicpO1xuICBpZiAocGtnLm5hbWUgPT0gbnVsbCkgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgbmFtZScpO1xuICBpZiAocGtnLmRlc2NyaXB0aW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoJ3BhY2thZ2UuanNvbiBkb2VzIG5vdCBpbmNsdWRlIGEgZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RfdmVyc2lvbjogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBzaG9ydF9uYW1lOiBwa2cuc2hvcnROYW1lLFxuICAgIHZlcnNpb246IHNpbXBsaWZ5VmVyc2lvbihwa2cudmVyc2lvbiksXG4gICAgdmVyc2lvbl9uYW1lOiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gdW5kZWZpbmVkIDogcGtnLnZlcnNpb24sXG4gICAgLi4uY29uZmlnLm1hbmlmZXN0LFxuICB9O1xuXG4gIGFkZEVudHJ5cG9pbnRzKG1hbmlmZXN0LCBlbnRyeXBvaW50cywgYnVpbGRPdXRwdXQsIGNvbmZpZyk7XG5cbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlQ3NwKG1hbmlmZXN0LCBjb25maWcpO1xuICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScpIGFkZERldk1vZGVQZXJtaXNzaW9ucyhtYW5pZmVzdCwgY29uZmlnKTtcblxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgcGFja2FnZS5qc29uIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIFRPRE86IGxvb2sgaW4gcm9vdCBhbmQgdXAgZGlyZWN0b3JpZXMgdW50aWwgaXQncyBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbihjb25maWc6IEludGVybmFsQ29uZmlnKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGF3YWl0IGZzLnJlYWRKc29uKHJlc29sdmUoY29uZmlnLnJvb3QsICdwYWNrYWdlLmpzb24nKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdWZmaXhlcyBmcm9tIHRoZSB2ZXJzaW9uLCBsaWtlIFguWS5aLWFscGhhMSAod2hpY2ggYnJvc2VycyBkb24ndCBhbGxvdyksIHNvIGl0J3MgYVxuICogc2ltcGxlIHZlcnNpb24gbnVtYmVyLCBsaWtlIFggb3IgWC5ZIG9yIFguWS5aLCB3aGljaCBicm93c2VycyBhbGxvdy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnlWZXJzaW9uKHZlcnNpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZWdleCBhZGFwdGVkIGZyb20gaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9tYW5pZmVzdC5qc29uL3ZlcnNpb24jdmVyc2lvbl9mb3JtYXRcblxuICBjb25zdCB2ZXJzaW9uID0gL14oKDB8WzEtOV1bMC05XXswLDh9KShbLl0oMHxbMS05XVswLTldezAsOH0pKXswLDN9KS4qJC8uZXhlYyhcbiAgICB2ZXJzaW9uTmFtZSxcbiAgKT8uWzFdO1xuXG4gIGlmICh2ZXJzaW9uID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNpbXBsaWZ5IHBhY2thZ2UuanNvbiB2ZXJzaW9uIFwiJHt2ZXJzaW9uTmFtZX1cIiB0byBhIHZhbGlkIGV4dGVuc2lvbiB2ZXJzaW9uLCBcIlguWS5aXCJgLFxuICAgICk7XG5cbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGFkZEVudHJ5cG9pbnRzKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZvaWQge1xuICBjb25zdCBlbnRyaWVzQnlUeXBlID0gZW50cnlwb2ludHMucmVkdWNlPFxuICAgIFBhcnRpYWw8UmVjb3JkPEVudHJ5cG9pbnRbJ3R5cGUnXSwgRW50cnlwb2ludFtdPj5cbiAgPigobWFwLCBlbnRyeXBvaW50KSA9PiB7XG4gICAgbWFwW2VudHJ5cG9pbnQudHlwZV0gPz89IFtdO1xuICAgIG1hcFtlbnRyeXBvaW50LnR5cGVdPy5wdXNoKGVudHJ5cG9pbnQpO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIHt9KTtcblxuICBjb25zdCBiYWNrZ3JvdW5kID0gZW50cmllc0J5VHlwZVsnYmFja2dyb3VuZCddPy5bMF0gYXNcbiAgICB8IEJhY2tncm91bmRFbnRyeXBvaW50XG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvb2ttYXJrcyA9IGVudHJpZXNCeVR5cGVbJ2Jvb2ttYXJrcyddPy5bMF07XG4gIGNvbnN0IGNvbnRlbnRTY3JpcHRzID0gZW50cmllc0J5VHlwZVsnY29udGVudC1zY3JpcHQnXSBhc1xuICAgIHwgQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXVxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZXZ0b29scyA9IGVudHJpZXNCeVR5cGVbJ2RldnRvb2xzJ10/LlswXTtcbiAgY29uc3QgaGlzdG9yeSA9IGVudHJpZXNCeVR5cGVbJ2hpc3RvcnknXT8uWzBdO1xuICBjb25zdCBuZXd0YWIgPSBlbnRyaWVzQnlUeXBlWyduZXd0YWInXT8uWzBdO1xuICBjb25zdCBvcHRpb25zID0gZW50cmllc0J5VHlwZVsnb3B0aW9ucyddPy5bMF0gYXNcbiAgICB8IE9wdGlvbnNFbnRyeXBvaW50XG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcHVwID0gZW50cmllc0J5VHlwZVsncG9wdXAnXT8uWzBdIGFzIFBvcHVwRW50cnlwb2ludCB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2FuZGJveGVzID0gZW50cmllc0J5VHlwZVsnc2FuZGJveCddO1xuICBjb25zdCBzaWRlcGFuZWxzID0gZW50cmllc0J5VHlwZVsnc2lkZXBhbmVsJ107XG5cbiAgaWYgKGJhY2tncm91bmQpIHtcbiAgICBjb25zdCBzY3JpcHQgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChiYWNrZ3JvdW5kLCBjb25maWcub3V0RGlyLCAnLmpzJyk7XG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICAgIG1hbmlmZXN0LmJhY2tncm91bmQgPSB7XG4gICAgICAgIHR5cGU6IGJhY2tncm91bmQub3B0aW9ucy50eXBlLFxuICAgICAgICBzZXJ2aWNlX3dvcmtlcjogc2NyaXB0LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuYmFja2dyb3VuZCA9IHtcbiAgICAgICAgcGVyc2lzdGVudDogYmFja2dyb3VuZC5vcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgICAgIHNjcmlwdHM6IFtzY3JpcHRdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoYm9va21hcmtzKSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ0Jvb2ttYXJrcyBhcmUgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBjaHJvbWVfdXJsX292ZXJyaWRlcy5ib29rbWFya3Mgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYm9va21hcmtzIGlzIHVudHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsLCBidXQgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMuYm9va21hcmtzID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGJvb2ttYXJrcyxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgJy5odG1sJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhpc3RvcnkpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnQm9va21hcmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIGNocm9tZV91cmxfb3ZlcnJpZGVzLmhpc3Rvcnkgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGlzdG9yeSBpcyB1bnR5cGVkIGluIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCwgYnV0IHN1cHBvcnRlZCBieSBjaHJvbWVcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLmhpc3RvcnkgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgJy5odG1sJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld3RhYikge1xuICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5uZXd0YWIgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIG5ld3RhYixcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gIH1cblxuICBpZiAocG9wdXApIHtcbiAgICBjb25zdCBkZWZhdWx0X3BvcHVwID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBwb3B1cCxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uczogTWFuaWZlc3QuQWN0aW9uTWFuaWZlc3QgPSB7XG4gICAgICBkZWZhdWx0X2ljb246IHBvcHVwLm9wdGlvbnMuZGVmYXVsdEljb24sXG4gICAgICBkZWZhdWx0X3RpdGxlOiBwb3B1cC5vcHRpb25zLmRlZmF1bHRUaXRsZSxcbiAgICB9O1xuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgICBtYW5pZmVzdC5hY3Rpb24gPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcG9wdXAsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdFtwb3B1cC5vcHRpb25zLm12MktleSA/PyAnYnJvd3Nlcl9hY3Rpb24nXSA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wb3B1cCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldnRvb2xzKSB7XG4gICAgbWFuaWZlc3QuZGV2dG9vbHNfcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgZGV2dG9vbHMsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgob3B0aW9ucywgY29uZmlnLm91dERpciwgJy5odG1sJyk7XG4gICAgbWFuaWZlc3Qub3B0aW9uc191aSA9IHtcbiAgICAgIG9wZW5faW5fdGFiOiBvcHRpb25zLm9wdGlvbnMub3BlbkluVGFiLFxuICAgICAgYnJvd3Nlcl9zdHlsZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyA/IG9wdGlvbnMub3B0aW9ucy5icm93c2VyU3R5bGUgOiB1bmRlZmluZWQsXG4gICAgICBjaHJvbWVfc3R5bGU6XG4gICAgICAgIGNvbmZpZy5icm93c2VyICE9PSAnZmlyZWZveCcgPyBvcHRpb25zLm9wdGlvbnMuY2hyb21lU3R5bGUgOiB1bmRlZmluZWQsXG4gICAgICBwYWdlLFxuICAgIH07XG4gIH1cblxuICBpZiAoc2FuZGJveGVzPy5sZW5ndGgpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnU2FuZGJveGVkIHBhZ2VzIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gc2FuZGJveC5wYWdlcyB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzYW5kYm94IG5vdCB0eXBlZFxuICAgICAgbWFuaWZlc3Quc2FuZGJveCA9IHtcbiAgICAgICAgcGFnZXM6IHNhbmRib3hlcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmh0bWwnKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHNpZGVwYW5lbHM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGRlZmF1bHRTaWRlcGFuZWwgPVxuICAgICAgc2lkZXBhbmVscy5maW5kKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gJ3NpZGVwYW5lbCcpID8/IHNpZGVwYW5lbHNbMF07XG4gICAgY29uc3QgcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgZGVmYXVsdFNpZGVwYW5lbCxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG5cbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgbWFuaWZlc3Quc2lkZWJhcl9hY3Rpb24gPSB7XG4gICAgICAgIC8vIFRPRE86IEFkZCBvcHRpb25zIHRvIHNpZGUgcGFuZWxcbiAgICAgICAgLy8gLi4uZGVmYXVsdFNpZGVwYW5lbC5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BhbmVsOiBwYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IFVudHlwZWRcbiAgICAgIG1hbmlmZXN0LnNpZGVfcGFuZWwgPSB7XG4gICAgICAgIGRlZmF1bHRfcGF0aDogcGFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ1NpZGUgcGFuZWwgbm90IHN1cHBvcnRlZCBieSBDaHJvbWl1bSB1c2luZyBNVjIuIHNpZGVfcGFuZWwuZGVmYXVsdF9wYXRoIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRlbnRTY3JpcHRzPy5sZW5ndGgpIHtcbiAgICAvLyBEb24ndCBhZGQgY29udGVudCBzY3JpcHRzIHRvIHRoZSBtYW5pZmVzdCBpbiBkZXYgbW9kZSBmb3IgTVYzIC0gdGhleSdyZSBtYW5hZ2VkIGFuZCByZWxvYWRlZFxuICAgIC8vIGF0IHJ1bnRpbWVcbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgJiYgY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgY29uc3QgaG9zdFBlcm1pc3Npb25zID0gbmV3IFNldDxzdHJpbmc+KG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMgPz8gW10pO1xuICAgICAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgICAgIHNjcmlwdC5vcHRpb25zLm1hdGNoZXMuZm9yRWFjaCgobWF0Y2hQYXR0ZXJuKSA9PiB7XG4gICAgICAgICAgaG9zdFBlcm1pc3Npb25zLmFkZChtYXRjaFBhdHRlcm4pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaG9zdFBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+XG4gICAgICAgIGFkZEhvc3RQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhc2hUb0VudHJ5cG9pbnRzTWFwID0gY29udGVudFNjcmlwdHMucmVkdWNlKChtYXAsIHNjcmlwdCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoID0gaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zKHNjcmlwdC5vcHRpb25zKTtcbiAgICAgICAgaWYgKG1hcC5oYXMoaGFzaCkpIG1hcC5nZXQoaGFzaCk/LnB1c2goc2NyaXB0KTtcbiAgICAgICAgZWxzZSBtYXAuc2V0KGhhc2gsIFtzY3JpcHRdKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdPigpKTtcblxuICAgICAgbWFuaWZlc3QuY29udGVudF9zY3JpcHRzID0gQXJyYXkuZnJvbShoYXNoVG9FbnRyeXBvaW50c01hcC5lbnRyaWVzKCkpLm1hcChcbiAgICAgICAgKFssIHNjcmlwdHNdKSA9PiAoe1xuICAgICAgICAgIC4uLm1hcFd4dE9wdGlvbnNUb0NvbnRlbnRTY3JpcHQoc2NyaXB0c1swXS5vcHRpb25zKSxcbiAgICAgICAgICAvLyBUT09EOiBTb3J0aW5nIGNzcyBhbmQganMgYXJyYXlzIGhlcmUgc28gd2UgZ2V0IGNvbnNpc3RlbnQgdGVzdCByZXN1bHRzLi4uIGJ1dCB3ZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXZlIHRvLiBXaGVyZSBpcyB0aGUgaW5jb25zaXN0ZW5jeSBjb21pbmcgZnJvbT9cbiAgICAgICAgICBjc3M6IGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhzY3JpcHRzLCBidWlsZE91dHB1dCk/LnNvcnQoKSxcbiAgICAgICAgICBqczogc2NyaXB0c1xuICAgICAgICAgICAgLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERldk1vZGVDc3AoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZvaWQge1xuICBjb25zdCBwZXJtaXNzaW9uID0gYGh0dHA6Ly8ke2NvbmZpZy5zZXJ2ZXI/Lmhvc3RuYW1lID8/ICcnfS8qYDtcbiAgY29uc3QgYWxsb3dlZENzcCA9IGNvbmZpZy5zZXJ2ZXI/Lm9yaWdpbiA/PyAnaHR0cDovL2xvY2FsaG9zdDoqJztcblxuICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgIGFkZEhvc3RQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCBwZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGNvbnN0IGNzcCA9IG5ldyBDb250ZW50U2VjdXJpdHlQb2xpY3koXG4gICAgbWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gM1xuICAgICAgPyAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5Py5leHRlbnNpb25fcGFnZXMgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyAnd2FzbS11bnNhZmUtZXZhbCc7IG9iamVjdC1zcmMgJ3NlbGYnO1wiIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjNcbiAgICAgIDogbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz9cbiAgICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJzsgb2JqZWN0LXNyYyAnc2VsZic7XCIsIC8vIGRlZmF1bHQgQ1NQIGZvciBNVjJcbiAgKTtcblxuICBpZiAoY29uZmlnLnNlcnZlcikgY3NwLmFkZCgnc2NyaXB0LXNyYycsIGFsbG93ZWRDc3ApO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPz89IHt9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGV4dGVuc2lvbl9wYWdlcyBpcyBub3QgdHlwZWRcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeS5leHRlbnNpb25fcGFnZXMgPSBjc3AudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA9IGNzcC50b1N0cmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZERldk1vZGVQZXJtaXNzaW9ucyhcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIC8vIEZvciByZWxvYWRpbmcgdGhlIHBhZ2VcbiAgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgJ3RhYnMnKTtcblxuICAvLyBGb3IgcmVnaXN0ZXJpbmcgY29udGVudCBzY3JpcHRzXG4gIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCAnc2NyaXB0aW5nJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYnVuZGxlIHBhdGhzIHRvIENTUyBmaWxlcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGNvbnRlbnQgc2NyaXB0cywgb3IgdW5kZWZpbmVkIGlmXG4gKiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIENTUy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRTY3JpcHRDc3NGaWxlcyhcbiAgY29udGVudFNjcmlwdHM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3NzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IGFsbENodW5rcyA9IGJ1aWxkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuY2h1bmtzKTtcblxuICBjb250ZW50U2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAvLyBUT0RPOiBvcHRpbWl6ZSBhbmQgcmVtb3ZlIGxvb3Agd2l0aCBhIG1hcFxuICAgIGNvbnN0IHJlbGF0ZWRDc3MgPSBhbGxDaHVua3MuZmluZChcbiAgICAgIChjaHVuaykgPT4gY2h1bmsuZmlsZU5hbWUgPT09IGBhc3NldHMvJHtzY3JpcHQubmFtZX0uY3NzYCxcbiAgICApO1xuICAgIGlmIChyZWxhdGVkQ3NzKSBjc3MucHVzaChyZWxhdGVkQ3NzLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgaWYgKGNzcy5sZW5ndGggPiAwKSByZXR1cm4gY3NzO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhZGRQZXJtaXNzaW9uKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIHBlcm1pc3Npb246IHN0cmluZyxcbik6IHZvaWQge1xuICBtYW5pZmVzdC5wZXJtaXNzaW9ucyA/Pz0gW107XG4gIGlmIChtYW5pZmVzdC5wZXJtaXNzaW9ucy5pbmNsdWRlcyhwZXJtaXNzaW9uKSkgcmV0dXJuO1xuICBtYW5pZmVzdC5wZXJtaXNzaW9ucy5wdXNoKHBlcm1pc3Npb24pO1xufVxuXG5mdW5jdGlvbiBhZGRIb3N0UGVybWlzc2lvbihcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBob3N0UGVybWlzc2lvbjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMgPz89IFtdO1xuICBpZiAobWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucy5pbmNsdWRlcyhob3N0UGVybWlzc2lvbikpIHJldHVybjtcbiAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucy5wdXNoKGhvc3RQZXJtaXNzaW9uKTtcbn1cbiIsICIvKipcbiAqIERpcmVjdGl2ZSBuYW1lcyB0aGF0IG1ha2UgdXAgQ1NQcy4gVGhlcmUgYXJlIG1vcmUsIHRoaXMgaXMgYWxsIEkgbmVlZCBmb3IgdGhlIHBsdWdpbi5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NwRGlyZWN0aXZlID0gJ2RlZmF1bHQtc3JjJyB8ICdzY3JpcHQtc3JjJyB8ICdvYmplY3Qtc3JjJztcblxuZXhwb3J0IGNsYXNzIENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gIHByaXZhdGUgc3RhdGljIERJUkVDVElWRV9PUkRFUjogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAnZGVmYXVsdC1zcmMnOiAwLFxuICAgICdzY3JpcHQtc3JjJzogMSxcbiAgICAnb2JqZWN0LXNyYyc6IDIsXG4gIH07XG5cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG4gIGNvbnN0cnVjdG9yKGNzcD86IHN0cmluZykge1xuICAgIGlmIChjc3ApIHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gY3NwLnNwbGl0KCc7JykubWFwKChzZWN0aW9uKSA9PiBzZWN0aW9uLnRyaW0oKSk7XG4gICAgICB0aGlzLmRhdGEgPSBzZWN0aW9ucy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nW10+PigoZGF0YSwgc2VjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCAuLi52YWx1ZXNdID0gc2VjdGlvbi5zcGxpdCgnICcpLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpO1xuICAgICAgICBpZiAoa2V5KSBkYXRhW2tleV0gPSB2YWx1ZXM7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgc2V0IG9mIHZhbHVlcyBhcmUgbGlzdGVkIHVuZGVyIGEgZGlyZWN0aXZlLlxuICAgKi9cbiAgYWRkKGRpcmVjdGl2ZTogQ3NwRGlyZWN0aXZlLCAuLi5uZXdWYWx1ZXM6IHN0cmluZ1tdKTogQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmRhdGFbZGlyZWN0aXZlXSA/PyBbXTtcbiAgICBuZXdWYWx1ZXMuZm9yRWFjaCgobmV3VmFsdWUpID0+IHtcbiAgICAgIGlmICghdmFsdWVzLmluY2x1ZGVzKG5ld1ZhbHVlKSkgdmFsdWVzLnB1c2gobmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVtkaXJlY3RpdmVdID0gdmFsdWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3RpdmVzID0gT2JqZWN0LmVudHJpZXModGhpcy5kYXRhKS5zb3J0KChbbF0sIFtyXSkgPT4ge1xuICAgICAgY29uc3QgbG8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW2xdID8/IDI7XG4gICAgICBjb25zdCBybyA9IENvbnRlbnRTZWN1cml0eVBvbGljeS5ESVJFQ1RJVkVfT1JERVJbcl0gPz8gMjtcbiAgICAgIHJldHVybiBsbyAtIHJvO1xuICAgIH0pO1xuICAgIHJldHVybiBkaXJlY3RpdmVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmZsYXQoKS5qb2luKCcgJykpLmpvaW4oJzsgJykgKyAnOyc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBDb250ZW50U2NyaXB0RW50cnlwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBSZXR1cm5zIGEgdW5pcXVlIGFuZCBjb25zaXN0ZW50IHN0cmluZyBoYXNoIGJhc2VkIG9uIGEgY29udGVudCBzY3JpcHRzIG9wdGlvbnMuXG4gKlxuICogSXQgaXMgYWJsZSB0byByZWNvZ25pemUgZGVmYXVsdCB2YWx1ZXMsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoQ29udGVudFNjcmlwdE9wdGlvbnMoXG4gIG9wdGlvbnM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50WydvcHRpb25zJ10sXG4pOiBzdHJpbmcge1xuICBjb25zdCB3aXRoRGVmYXVsdHM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50WydvcHRpb25zJ10gPSB7XG4gICAgZXhjbHVkZUdsb2JzOiBbXSxcbiAgICBleGNsdWRlTWF0Y2hlczogW10sXG4gICAgaW5jbHVkZUdsb2JzOiBbXSxcbiAgICBtYXRjaEFib3V0Qmxhbms6IGZhbHNlLFxuICAgIG1hdGNoT3JpZ2luQXNGYWxsYmFjazogZmFsc2UsXG4gICAgcnVuQXQ6ICdkb2N1bWVudF9pZGxlJyxcbiAgICBhbGxGcmFtZXM6IGZhbHNlLFxuICAgIHdvcmxkOiAnSVNPTEFURUQnLFxuICAgIC8vIFRPRE86IHN0cmlwIHVuZGVmaW5lZCBmaWVsZHMgZnJvbSBvcHRpb25zIG9iamVjdCB0byBpbXByb3ZlIGNvbnRlbnQgc2NyaXB0IGdyb3VwaW5nLlxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyh3aXRoRGVmYXVsdHMpXG4gICAgICAvLyBTb3J0IGFueSBhcnJheXMgc28gdGhlaXIgdmFsdWVzIGFyZSBjb25zaXN0ZW50XG4gICAgICAubWFwPFtzdHJpbmcsIHVua25vd25dPigoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtrZXksIHZhbHVlLnNvcnQoKV07XG4gICAgICAgIGVsc2UgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICAgIH0pXG4gICAgICAvLyBTb3J0IGFsbCB0aGUgZmllbGRzIGFscGhhYmV0aWNhbGx5XG4gICAgICAuc29ydCgobCwgcikgPT4gbFswXS5sb2NhbGVDb21wYXJlKHJbMF0pKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFd4dE9wdGlvbnNUb0NvbnRlbnRTY3JpcHQoXG4gIG9wdGlvbnM6IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50WydvcHRpb25zJ10sXG4pOiBPbWl0PE1hbmlmZXN0LkNvbnRlbnRTY3JpcHQsICdqcycgfCAnY3NzJz4ge1xuICByZXR1cm4ge1xuICAgIG1hdGNoZXM6IG9wdGlvbnMubWF0Y2hlcyxcbiAgICBhbGxfZnJhbWVzOiBvcHRpb25zLmFsbEZyYW1lcyxcbiAgICBtYXRjaF9hYm91dF9ibGFuazogb3B0aW9ucy5tYXRjaEFib3V0QmxhbmssXG4gICAgZXhjbHVkZV9nbG9iczogb3B0aW9ucy5leGNsdWRlR2xvYnMsXG4gICAgZXhjbHVkZV9tYXRjaGVzOiBvcHRpb25zLmV4Y2x1ZGVNYXRjaGVzLFxuICAgIGluY2x1ZGVfZ2xvYnM6IG9wdGlvbnMuaW5jbHVkZUdsb2JzLFxuICAgIHJ1bl9hdDogb3B0aW9ucy5ydW5BdCxcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHVudHlwZWQgY2hyb21lIG9wdGlvbnNcbiAgICBtYXRjaF9vcmlnaW5fYXNfZmFsbGJhY2s6IG9wdGlvbnMubWF0Y2hPcmlnaW5Bc0ZhbGxiYWNrLFxuICAgIHdvcmxkOiBvcHRpb25zLndvcmxkLFxuICB9O1xufVxuIiwgImltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi9idWlsZC9idWlsZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGZpbmRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdlbmVyYXRlVHlwZXNEaXIgfSBmcm9tICcuL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNYWluZmVzdCwgd3JpdGVNYW5pZmVzdCB9IGZyb20gJy4vdXRpbHMvbWFuaWZlc3QnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBncm91cEVudHJ5cG9pbnRzIH0gZnJvbSAnLi91dGlscy9ncm91cEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi91dGlscy9mb3JtYXREdXJhdGlvbic7XG5pbXBvcnQgeyBwcmludEJ1aWxkU3VtbWFyeSB9IGZyb20gJy4vbG9nL3ByaW50QnVpbGRTdW1tYXJ5JztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4dGVuc2lvbiBiYXNlZCBvbiBhbiBpbnRlcm5hbCBjb25maWcuXG4gKlxuICogVGhpcyBmdW5jdGlvbjpcbiAqIDEuIENsZWFucyB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuICogMi4gRXhlY3V0ZXMgdGhlIHJlYnVpbGQgZnVuY3Rpb24gd2l0aCBhIGJsYW5rIHByZXZpb3VzIG91dHB1dCBzbyBldmVyeXRoaW5nIGlzIGJ1aWx0IChzZWVcbiAqICAgIGByZWJ1aWxkYCBmb3IgbW9yZSBkZXRhaWxzKVxuICogMy4gUHJpbnRzIHRoZSBzdW1tYXJ5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEludGVybmFsKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCB2ZXJiID0gY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgPyAnUHJlLXJlbmRlcmluZycgOiAnQnVpbGRpbmcnO1xuICBjb25zdCB0YXJnZXQgPSBgJHtjb25maWcuYnJvd3Nlcn0tbXYke2NvbmZpZy5tYW5pZmVzdFZlcnNpb259YDtcbiAgY29uZmlnLmxvZ2dlci5pbmZvKFxuICAgIGAke3ZlcmJ9ICR7cGMuY3lhbih0YXJnZXQpfSBmb3IgJHtwYy5jeWFuKGNvbmZpZy5tb2RlKX0gd2l0aCAke3BjLmdyZWVuKFxuICAgICAgYFZpdGUgJHt2aXRlLnZlcnNpb259YCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgLy8gQ2xlYW51cFxuICBhd2FpdCBmcy5ybShjb25maWcub3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0RGlyKTtcblxuICBjb25zdCBlbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBjb25zdCBncm91cHMgPSBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzKTtcbiAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoY29uZmlnLCBncm91cHMpO1xuXG4gIC8vIFBvc3QtYnVpbGRcbiAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKFxuICAgIGBCdWlsdCBleHRlbnNpb24gaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICApO1xuICBhd2FpdCBwcmludEJ1aWxkU3VtbWFyeShvdXRwdXQsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGxpc3Qgb2YgZW50cnlwb2ludHMsIGFuZCBhbiBleGlzdGluZywgcGFydGlhbCBvdXRwdXQsIGJ1aWxkIHRoZVxuICogZW50cnlwb2ludHMgYW5kIG1lcmdlIHRoZSBuZXcgb3V0cHV0IHdpdGggdGhlIGV4aXN0aW5nIG91dHB1dC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGw6XG4gKiAxLiBHZW5lcmF0ZSB0aGUgLnd4dCBkaXJlY3RvcnkncyB0eXBlc1xuICogMi4gQnVpbGQgdGhlIGBlbnRyeXBvaW50R3JvdXBzYCAoYW5kIGNvcGllcyBwdWJsaWMgZmlsZXMpXG4gKiAzLiBHZW5lcmF0ZSB0aGUgbGF0ZXN0IG1hbmlmZXN0IGZvciBhbGwgZW50cnlwb2ludHNcbiAqIDQuIFdyaXRlIHRoZSBuZXcgbWFuaWZlc3QgdG8gdGhlIGZpbGUgc3lzdGVtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50R3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgZXhpc3RpbmdPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+ID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9LFxuKTogUHJvbWlzZTx7IG91dHB1dDogQnVpbGRPdXRwdXQ7IG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCB9PiB7XG4gIC8vIFVwZGF0ZSB0eXBlcyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgYW5kIHR5cGVzXG4gIGNvbnN0IGFsbEVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoYWxsRW50cnlwb2ludHMsIGNvbmZpZyk7XG5cbiAgLy8gQnVpbGQgYW5kIG1lcmdlIHRoZSBvdXRwdXRzXG4gIGNvbnN0IG5ld091dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnKTtcbiAgY29uc3QgbWVyZ2VkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5uZXdPdXRwdXQuc3RlcHNdLFxuICAgIHB1YmxpY0Fzc2V0czogWy4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cywgLi4ubmV3T3V0cHV0LnB1YmxpY0Fzc2V0c10sXG4gIH07XG5cbiAgY29uc3QgbmV3TWFuaWZlc3QgPSBhd2FpdCBnZW5lcmF0ZU1haW5mZXN0KFxuICAgIGFsbEVudHJ5cG9pbnRzLFxuICAgIG1lcmdlZE91dHB1dCxcbiAgICBjb25maWcsXG4gICk7XG4gIGNvbnN0IGZpbmFsT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgLi4ubmV3T3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3TWFuaWZlc3QsIGZpbmFsT3V0cHV0LCBjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0cHV0OiB7XG4gICAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5maW5hbE91dHB1dC5zdGVwc10sXG4gICAgICBwdWJsaWNBc3NldHM6IFtcbiAgICAgICAgLi4uZXhpc3RpbmdPdXRwdXQucHVibGljQXNzZXRzLFxuICAgICAgICAuLi5maW5hbE91dHB1dC5wdWJsaWNBc3NldHMsXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRW50cnlwb2ludHMgY2FuIGJlIGJ1aWxkIGluIGdyb3Vwcy4gSFRNTCBwYWdlcyBjYW4gYWxsIGJlIGJ1aWx0IHRvZ2V0aGVyIGluIGEgc2luZ2xlIHN0ZXAsIHdoaWxlXG4gKiBjb250ZW50IHNjcmlwdHMgbXVzdCBiZSBidWlsZCBpbmRpdmlkdWFsbHkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbnRyeXBvaW50cyBwdXQgaW50byB0aGVzZSB0eXBlcyBvZiBncm91cHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10pOiBFbnRyeXBvaW50R3JvdXBbXSB7XG4gIGNvbnN0IGdyb3VwSW5kZXhNYXA6IFBhcnRpYWw8UmVjb3JkPEdyb3VwLCBudW1iZXI+PiA9IHt9O1xuICBjb25zdCBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyeXBvaW50cykge1xuICAgIGNvbnN0IGdyb3VwID0gRU5UUllfVFlQRV9UT19HUk9VUF9NQVBbZW50cnkudHlwZV07XG4gICAgaWYgKGdyb3VwID09PSAnbm8tZ3JvdXAnKSB7XG4gICAgICBncm91cHMucHVzaChlbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBncm91cEluZGV4ID0gZ3JvdXBJbmRleE1hcFtncm91cF07XG4gICAgICBpZiAoZ3JvdXBJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGdyb3VwSW5kZXggPSBncm91cHMucHVzaChbXSkgLSAxO1xuICAgICAgICBncm91cEluZGV4TWFwW2dyb3VwXSA9IGdyb3VwSW5kZXg7XG4gICAgICB9XG4gICAgICAoZ3JvdXBzW2dyb3VwSW5kZXhdIGFzIEVudHJ5cG9pbnRbXSkucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuY29uc3QgRU5UUllfVFlQRV9UT19HUk9VUF9NQVA6IFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEdyb3VwPiA9IHtcbiAgc2FuZGJveDogJ3NhbmRib3gtcGFnZScsXG5cbiAgcG9wdXA6ICdleHRlbnNpb24tcGFnZScsXG4gIG5ld3RhYjogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgaGlzdG9yeTogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgb3B0aW9uczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgZGV2dG9vbHM6ICdleHRlbnNpb24tcGFnZScsXG4gIGJvb2ttYXJrczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgc2lkZXBhbmVsOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICAndW5saXN0ZWQtcGFnZSc6ICdleHRlbnNpb24tcGFnZScsXG5cbiAgYmFja2dyb3VuZDogJ25vLWdyb3VwJyxcbiAgJ2NvbnRlbnQtc2NyaXB0JzogJ25vLWdyb3VwJyxcbiAgJ3VubGlzdGVkLXNjcmlwdCc6ICduby1ncm91cCcsXG59O1xuXG50eXBlIEdyb3VwID0gJ2V4dGVuc2lvbi1wYWdlJyB8ICdzYW5kYm94LXBhZ2UnIHwgJ25vLWdyb3VwJztcbiIsICJleHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbiA8IDFlMykgcmV0dXJuIGAke2R1cmF0aW9ufSBtc2A7XG4gIGlmIChkdXJhdGlvbiA8IDEwZTMpIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMyl9IHNgO1xuICBpZiAoZHVyYXRpb24gPCA2MGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDEpfSBzYDtcbiAgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgwKX0gc2A7XG59XG4iLCAiaW1wb3J0IHBhdGgsIHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByaW50VGFibGUgfSBmcm9tICcuL3ByaW50VGFibGUnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJpbnRCdWlsZFN1bW1hcnkoXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9IGdldENodW5rU29ydFdlaWdodChsLmZpbGVOYW1lKTtcbiAgICBjb25zdCByV2VpZ2h0ID0gZ2V0Q2h1bmtTb3J0V2VpZ2h0KHIuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgY29uc3QgY2h1bmtSb3dzOiBzdHJpbmdbXVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBbXG4gICAgICAgIHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXREaXIpICsgcGF0aC5zZXAsXG4gICAgICAgIGNodW5rLmZpbGVOYW1lLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByZWZpeCA9IGkgPT09IGNodW5rcy5sZW5ndGggLSAxID8gJyAgXHUyNTE0XHUyNTAwJyA6ICcgIFx1MjUxQ1x1MjUwMCc7XG4gICAgICBjb25zdCBjb2xvciA9IGdldENodW5rQ29sb3IoY2h1bmsuZmlsZU5hbWUpO1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChyZXNvbHZlKGNvbmZpZy5vdXREaXIsIGNodW5rLmZpbGVOYW1lKSk7XG4gICAgICB0b3RhbFNpemUgKz0gc3RhdHMuc2l6ZTtcbiAgICAgIGNvbnN0IHNpemUgPSBTdHJpbmcoZmlsZXNpemUoc3RhdHMuc2l6ZSkpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYCR7cGMuZ3JheShwcmVmaXgpfSAke3BjLmRpbShmaWxlWzBdKX0ke2NvbG9yKGZpbGVbMV0pfWAsXG4gICAgICAgIHBjLmRpbShzaXplKSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG5cbiAgcHJpbnRUYWJsZShjb25maWcubG9nZ2VyLmxvZywgY2h1bmtSb3dzKTtcblxuICBjb25maWcubG9nZ2VyLmxvZyhcbiAgICBgJHtwYy5jeWFuKCdcdTAzQTMgVG90YWwgc2l6ZTonKX0gJHtTdHJpbmcoZmlsZXNpemUodG90YWxTaXplKSl9YCxcbiAgKTtcbn1cblxuY29uc3QgREVGQVVMVF9TT1JUX1dFSUdIVCA9IDEwMDtcbmNvbnN0IENIVU5LX1NPUlRfV0VJR0hUUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgJ21hbmlmZXN0Lmpzb24nOiAwLFxuICAnLmh0bWwnOiAxLFxuICAnLmpzLm1hcCc6IDIsXG4gICcuanMnOiAyLFxuICAnLmNzcyc6IDMsXG59O1xuZnVuY3Rpb24gZ2V0Q2h1bmtTb3J0V2VpZ2h0KGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19TT1JUX1dFSUdIVFMpLmZpbmQoKFtrZXldKSA9PlxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoa2V5KSxcbiAgICApPy5bMV0gPz8gREVGQVVMVF9TT1JUX1dFSUdIVFxuICApO1xufVxuXG5jb25zdCBERUZBVUxUX0NPTE9SID0gcGMuYmx1ZTtcbmNvbnN0IENIVU5LX0NPTE9SUzogUmVjb3JkPHN0cmluZywgKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgJy5qcy5tYXAnOiBwYy5ncmF5LFxuICAnLmh0bWwnOiBwYy5ncmVlbixcbiAgJy5jc3MnOiBwYy5tYWdlbnRhLFxuICAnLmpzJzogcGMuY3lhbixcbn07XG5mdW5jdGlvbiBnZXRDaHVua0NvbG9yKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19DT0xPUlMpLmZpbmQoKFtrZXldKSA9PiBmaWxlbmFtZS5lbmRzV2l0aChrZXkpKT8uWzFdID8/XG4gICAgREVGQVVMVF9DT0xPUlxuICApO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIHJvd3M6IHN0cmluZ1tdW10sXG4gIGdhcCA9IDIsXG4pOiB2b2lkIHtcbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY29sdW1uV2lkdGhzID0gcm93cy5yZWR1Y2UoXG4gICAgKHdpZHRocywgcm93KSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KHdpZHRocy5sZW5ndGgsIHJvdy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgd2lkdGhzW2ldID0gTWF0aC5tYXgocm93W2ldPy5sZW5ndGggPz8gMCwgd2lkdGhzW2ldID8/IDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdpZHRocztcbiAgICB9LFxuICAgIHJvd3NbMF0ubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sZW5ndGgpLFxuICApO1xuXG4gIGxldCBzdHIgPSAnJztcbiAgcm93cy5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICByb3cuZm9yRWFjaCgoY29sLCBqKSA9PiB7XG4gICAgICBzdHIgKz0gY29sLnBhZEVuZChjb2x1bW5XaWR0aHNbal0sICcgJyk7XG4gICAgICBpZiAoaiAhPT0gcm93Lmxlbmd0aCAtIDEpIHN0ciArPSAnJy5wYWRFbmQoZ2FwLCAnICcpO1xuICAgIH0pO1xuICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEpIHN0ciArPSAnXFxuJztcbiAgfSk7XG5cbiAgbG9nKHN0cik7XG59XG4iLCAiaW1wb3J0IHtcbiAgQnVpbGRTdGVwT3V0cHV0LFxuICBFbnRyeXBvaW50R3JvdXAsXG4gIEludGVybmFsQ29uZmlnLFxuICBXeHREZXZTZXJ2ZXIsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGZpbmRPcGVuUG9ydCB9IGZyb20gJy4vdXRpbHMvZmluZE9wZW5Qb3J0JztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCB7IGNyZWF0ZVdlYkV4dFJ1bm5lciB9IGZyb20gJy4vcnVubmVycy9jcmVhdGVXZWJFeHRSdW5uZXInO1xuaW1wb3J0IHsgYnVpbGRJbnRlcm5hbCB9IGZyb20gJy4vYnVpbGQnO1xuaW1wb3J0IHsgbWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdCB9IGZyb20gJy4vdXRpbHMvY29udGVudC1zY3JpcHRzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckluZm8oKTogUHJvbWlzZTxTZXJ2ZXJJbmZvPiB7XG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kT3BlblBvcnQoMzAwMCwgMzAxMCk7XG4gIGNvbnN0IGhvc3RuYW1lID0gJ2xvY2FsaG9zdCc7XG4gIGNvbnN0IG9yaWdpbiA9IGBodHRwOi8vJHtob3N0bmFtZX06JHtwb3J0fWA7XG4gIGNvbnN0IHNlcnZlckNvbmZpZzogdml0ZS5JbmxpbmVDb25maWcgPSB7XG4gICAgc2VydmVyOiB7XG4gICAgICBvcmlnaW4sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBvcnQsXG4gICAgaG9zdG5hbWUsXG4gICAgb3JpZ2luLFxuICAgIHZpdGVTZXJ2ZXJDb25maWc6IHNlcnZlckNvbmZpZyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VydmVyKFxuICBzZXJ2ZXJJbmZvOiBTZXJ2ZXJJbmZvLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3QgcnVubmVyID0gY3JlYXRlV2ViRXh0UnVubmVyKCk7XG5cbiAgY29uc3Qgdml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKFxuICAgIHZpdGUubWVyZ2VDb25maWcoc2VydmVySW5mbywgY29uZmlnLnZpdGUpLFxuICApO1xuXG4gIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHZpdGVTZXJ2ZXIubGlzdGVuKHNlcnZlci5wb3J0KTtcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoYFN0YXJ0ZWQgZGV2IHNlcnZlciBAICR7c2VydmVySW5mby5vcmlnaW59YCk7XG5cbiAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IGF3YWl0IGJ1aWxkSW50ZXJuYWwoY29uZmlnKTtcbiAgICBjb25maWcubG9nZ2VyLmluZm8oJ09wZW5pbmcgYnJvd3Nlci4uLicpO1xuICAgIGF3YWl0IHJ1bm5lci5vcGVuQnJvd3Nlcihjb25maWcpO1xuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcygnT3BlbmVkIScpO1xuICB9O1xuXG4gIGNvbnN0IHJlbG9hZEV4dGVuc2lvbiA9ICgpID0+IHtcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtZXh0ZW5zaW9uJyk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZFBhZ2UgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ2FuJ3QgdXNlIFZpdGUncyBidWlsdC1pbiBcImZ1bGwtcmVsb2FkXCIgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0IGxpa2Ugb3VyIHBhdGhzLCBpdCBleHBlY3RzXG4gICAgLy8gcGF0aHMgZW5kaW5nIGluIFwiL2luZGV4Lmh0bWxcIlxuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1wYWdlJywgcGF0aCk7XG4gIH07XG4gIGNvbnN0IHJlbG9hZENvbnRlbnRTY3JpcHQgPSAoY29udGVudFNjcmlwdDogTWFuaWZlc3QuQ29udGVudFNjcmlwdCkgPT4ge1xuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1jb250ZW50LXNjcmlwdCcsIGNvbnRlbnRTY3JpcHQpO1xuICB9O1xuXG4gIGNvbnN0IHNlcnZlcjogV3h0RGV2U2VydmVyID0ge1xuICAgIC4uLnZpdGVTZXJ2ZXIsXG4gICAgc3RhcnQsXG4gICAgY3VycmVudE91dHB1dDoge1xuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgbWFuaWZlc3RfdmVyc2lvbjogMyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIHZlcnNpb246ICcnLFxuICAgICAgfSxcbiAgICAgIHB1YmxpY0Fzc2V0czogW10sXG4gICAgICBzdGVwczogW10sXG4gICAgfSxcbiAgICBwb3J0OiBzZXJ2ZXJJbmZvLnBvcnQsXG4gICAgaG9zdG5hbWU6IHNlcnZlckluZm8uaG9zdG5hbWUsXG4gICAgb3JpZ2luOiBzZXJ2ZXJJbmZvLm9yaWdpbixcbiAgICByZWxvYWRFeHRlbnNpb24sXG4gICAgcmVsb2FkUGFnZSxcbiAgICByZWxvYWRDb250ZW50U2NyaXB0LFxuICB9O1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8qKlxuICogRnJvbSB0aGUgc2VydmVyLCB0ZWxsIHRoZSBjbGllbnQgdG8gcmVsb2FkIGNvbnRlbnQgc2NyaXB0cyBmcm9tIHRoZSBwcm92aWRlZCBidWlsZCBzdGVwIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRDb250ZW50U2NyaXB0cyhcbiAgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBzZXJ2ZXI6IFd4dERldlNlcnZlcixcbikge1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgIHN0ZXBzLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc3RlcC5lbnRyeXBvaW50cztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSB8fCBlbnRyeS50eXBlICE9PSAnY29udGVudC1zY3JpcHQnKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGpzID0gW2dldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyldO1xuICAgICAgY29uc3QgY3NzID0gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFtlbnRyeV0sIHNlcnZlci5jdXJyZW50T3V0cHV0KTtcblxuICAgICAgc2VydmVyLnJlbG9hZENvbnRlbnRTY3JpcHQoe1xuICAgICAgICAuLi5tYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0KGVudHJ5Lm9wdGlvbnMpLFxuICAgICAgICBqcyxcbiAgICAgICAgY3NzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VydmVyLnJlbG9hZEV4dGVuc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIdG1sUGFnZXMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIHNlcnZlcjogV3h0RGV2U2VydmVyLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGdyb3Vwcy5mbGF0KCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIHNlcnZlci5yZWxvYWRQYWdlKHBhdGgpO1xuICB9KTtcbn1cblxuaW50ZXJmYWNlIFNlcnZlckluZm8ge1xuICBwb3J0OiBudW1iZXI7XG4gIGhvc3RuYW1lOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICB2aXRlU2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZztcbn1cbiIsICJpbXBvcnQgbmV0IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3Qgb3BlbiBwb3J0IGluIGEgcmFuZ2Ugb2YgcG9ydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3BlblBvcnQoXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKHN0YXJ0UG9ydCwgc3RhcnRQb3J0LCBlbmRQb3J0KTtcbn1cblxuZnVuY3Rpb24gZmluZE9wZW5Qb3J0UmVjdXJzaXZlKFxuICBwb3J0OiBudW1iZXIsXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBlbmRQb3J0OiBudW1iZXIsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChwb3J0ID4gZW5kUG9ydClcbiAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgIEVycm9yKGBDb3VsZCBub3QgZmluZCBvcGVuIHBvcnQgYmV0d2VlbiAke3N0YXJ0UG9ydH0tJHtlbmRQb3J0fWApLFxuICAgICAgKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIHNlcnZlci5vbmNlKCdjbG9zZScsICgpID0+IHJlc29sdmUocG9ydCkpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLm9uKCdlcnJvcicsICgpID0+XG4gICAgICByZXNvbHZlKGZpbmRPcGVuUG9ydFJlY3Vyc2l2ZShwb3J0ICsgMSwgc3RhcnRQb3J0LCBlbmRQb3J0KSksXG4gICAgKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBXZWJFeHRSdW5JbnN0YW5jZSB9IGZyb20gJ3dlYi1leHQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uUnVubmVyIH0gZnJvbSAnLi9FeHRlbnNpb25SdW5uZXInO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBgRXh0ZW5zaW9uUnVubmVyYCBiYWNrZWQgYnkgYHdlYi1leHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViRXh0UnVubmVyKCk6IEV4dGVuc2lvblJ1bm5lciB7XG4gIGxldCBydW5uZXI6IFdlYkV4dFJ1bkluc3RhbmNlIHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgb3BlbkJyb3dzZXIoY29uZmlnKSB7XG4gICAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknKSB7XG4gICAgICAgIGNvbmZpZy5sb2dnZXIud2FybignQ2Fubm90IG9wZW4gc2FmYXJpIGF1dG9tYXRpY2FsbHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHRoZSBwbHVnaW4ncyBsb2dnZXIgaW5zdGVhZCBvZiB3ZWItZXh0J3MgYnVpbHQtaW4gb25lLlxuICAgICAgY29uc3Qgd2ViRXh0TG9nZ2VyID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0L3V0aWwvbG9nZ2VyJyk7XG4gICAgICB3ZWJFeHRMb2dnZXIuY29uc29sZVN0cmVhbS53cml0ZSA9ICh7IGxldmVsLCBtc2csIG5hbWUgfSkgPT4ge1xuICAgICAgICBpZiAobGV2ZWwgPj0gRVJST1JfTE9HX0xFVkVMKSBjb25maWcubG9nZ2VyLmVycm9yKG5hbWUsIG1zZyk7XG4gICAgICAgIGlmIChsZXZlbCA+PSBXQVJOX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci53YXJuKG1zZyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3eHRVc2VyQ29uZmlnID0gY29uZmlnLnJ1bm5lckNvbmZpZy5jb25maWc7XG4gICAgICBjb25zdCB1c2VyQ29uZmlnID0ge1xuICAgICAgICBjb25zb2xlOiB3eHRVc2VyQ29uZmlnPy5vcGVuQ29uc29sZSxcbiAgICAgICAgZGV2dG9vbHM6IHd4dFVzZXJDb25maWc/Lm9wZW5EZXZ0b29scyxcbiAgICAgICAgc3RhcnRVcmw6IHd4dFVzZXJDb25maWc/LnN0YXJ0VXJscyxcbiAgICAgICAgLi4uKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZmlyZWZveDogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/LmZpcmVmb3gsXG4gICAgICAgICAgICAgIGZpcmVmb3hQcm9maWxlOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJvZmlsZSxcbiAgICAgICAgICAgICAgcHJlZnM6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hQcmVmcyxcbiAgICAgICAgICAgICAgYXJnczogd3h0VXNlckNvbmZpZz8uZmlyZWZveEFyZ3MsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGNocm9taXVtQmluYXJ5OiB3eHRVc2VyQ29uZmlnPy5iaW5hcmllcz8uW2NvbmZpZy5icm93c2VyXSxcbiAgICAgICAgICAgICAgY2hyb21pdW1Qcm9maWxlOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bVByb2ZpbGUsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmNocm9taXVtQXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluYWxDb25maWcgPSB7XG4gICAgICAgIC4uLnVzZXJDb25maWcsXG4gICAgICAgIHRhcmdldDogY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyA/ICdmaXJlZm94LWRlc2t0b3AnIDogJ2Nocm9taXVtJyxcbiAgICAgICAgc291cmNlRGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAvLyBXWFQgaGFuZGxlcyByZWxvYWRzLCBzbyBkaXNhYmxlIGF1dG8tcmVsb2FkIGJlaGF2aW9ycyBpbiB3ZWItZXh0XG4gICAgICAgIG5vUmVsb2FkOiB0cnVlLFxuICAgICAgICBub0lucHV0OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIC8vIERvbid0IGNhbGwgYHByb2Nlc3MuZXhpdCgwKWAgYWZ0ZXIgc3RhcnRpbmcgd2ViLWV4dFxuICAgICAgICBzaG91bGRFeGl0UHJvZ3JhbTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1Zygnd2ViLWV4dCBjb25maWc6JywgZmluYWxDb25maWcpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1Zygnd2ViLWV4dCBvcHRpb25zOicsIG9wdGlvbnMpO1xuXG4gICAgICBjb25zdCB3ZWJFeHQgPSBhd2FpdCBpbXBvcnQoJ3dlYi1leHQnKTtcbiAgICAgIHJ1bm5lciA9IGF3YWl0IHdlYkV4dC5kZWZhdWx0LmNtZC5ydW4oZmluYWxDb25maWcsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXIoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcnVubmVyPy5leGl0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvd2ViLWV4dC9ibG9iL2UzN2U2MGEyNzM4NDc4ZjUxMmYxMjU1YzUzNzEzMzMyMWYzMDE3NzEvc3JjL3V0aWwvbG9nZ2VyLmpzI0wxMlxuY29uc3QgV0FSTl9MT0dfTEVWRUwgPSA0MDtcbmNvbnN0IEVSUk9SX0xPR19MRVZFTCA9IDUwO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHByaW50SGVhZGVyIH0gZnJvbSAnLi4vLi4vY29yZS9sb2cvcHJpbnRIZWFkZXInO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2Zvcm1hdER1cmF0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbW1hbmQ8VEFyZ3MgZXh0ZW5kcyBhbnlbXT4oXG4gIGNiOiAoLi4uYXJnczogVEFyZ3MpID0+IHZvaWQgfCBib29sZWFuIHwgUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4sXG4pIHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBUQXJncykgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIHByaW50SGVhZGVyKCk7XG5cbiAgICAgIGNvbnN0IG9uZ29pbmcgPSBhd2FpdCBjYiguLi5hcmdzKTtcblxuICAgICAgaWYgKCFvbmdvaW5nKVxuICAgICAgICBjb25zb2xhLnN1Y2Nlc3MoXG4gICAgICAgICAgYEZpbmlzaGVkIGluICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGEuZmFpbChcbiAgICAgICAgYENvbW1hbmQgZmFpbGVkIGFmdGVyICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgICAgICk7XG4gICAgICBjb25zb2xhLmVycm9yKGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEhlYWRlcigpIHtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sYS5sb2coYCR7cGMuZ3JheSgnV1hUJyl9ICR7cGMuZ3JheShwYy5ib2xkKHZlcnNpb24pKX1gKTtcbn1cbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgYnVpbGQgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgbW9kZSA9IGZsYWdzLm1vZGUgPz8gJ3Byb2R1Y3Rpb24nO1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG5cbiAgYXdhaXQgd3h0LmJ1aWxkKGNsaUNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgZGV2ID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IG1vZGUgPSBmbGFncy5tb2RlID8/ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB3eHQuY3JlYXRlU2VydmVyKGNsaUNvbmZpZyk7XG4gIGF3YWl0IHNlcnZlci5zdGFydCgpO1xuXG4gIHJldHVybiB0cnVlO1xufSk7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgaW5pdCA9IGRlZmluZUNvbW1hbmQ8W2RpcmVjdG9yeT86IHN0cmluZ10+KGFzeW5jIChkaXJlY3RvcnkpID0+IHtcbiAgY29uc29sYS53YXJuKCd3eHQgaW5pdDogTm90IGltcGxlbWVudGVkJyk7XG59KTtcbiIsICJpbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHsgZmluZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZC9maW5kRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUeXBlc0RpciB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpcic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5pbXBvcnQgKiBhcyB3eHQgZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY29uc3QgcHJlcGFyZSA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNsaUNvbmZpZywgJ2J1aWxkJyk7XG5cbiAgY29uZmlnLmxvZ2dlci5pbmZvKCdHZW5lcmF0aW5nIHR5cGVzLi4uJyk7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgYXdhaXQgZ2VuZXJhdGVUeXBlc0RpcihlbnRyeXBvaW50cywgY29uZmlnKTtcbn0pO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IHB1Ymxpc2ggPSBkZWZpbmVDb21tYW5kKFxuICBhc3luYyAocm9vdDogYW55LCB7IGNvbmZpZzogY29uZmlnRmlsZSB9OiBhbnkpID0+IHtcbiAgICBjb25zb2xhLndhcm4oJ3d4dCBwdWJsaXNoOiBOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcbik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLGlCQUFnQjs7O0FDQ2QsY0FBVzs7O0FDTWIsSUFBQUEsb0JBQThCO0FBQzlCLFdBQXNCO0FBQ3RCLHFCQUF3Qjs7O0FDVnhCLHVCQUF3QztBQUVqQyxTQUFTLGtCQUNkLGdCQUNBLFdBRVE7QUFDUixRQUFNLGVBQWUsaUJBQUFDLFFBQUssU0FBUyxnQkFBZ0IsU0FBUztBQUU1RCxRQUFNLE9BQU8sYUFBYSxNQUFNLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFFOUMsU0FBTztBQUNUO0FBRU8sU0FBUyx3QkFDZCxZQUNBLEtBQ1E7QUFDUixhQUFPLDBCQUFRLFdBQVcsV0FBVyxHQUFHLFdBQVcsSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNqRTtBQU1PLFNBQVMsd0JBQ2QsWUFDQSxRQUNBLEtBQ1E7QUFDUixhQUFPLDJCQUFTLFFBQVEsd0JBQXdCLFlBQVksR0FBRyxDQUFDO0FBQ2xFOzs7QUM3QkEsc0JBQTBCO0FBQzFCLGtCQUF1RDtBQUtoRCxTQUFTLGlCQUFpQixRQUFxQztBQUNwRSxTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixTQUFTO0FBQ1AsYUFBTztBQUFBLFFBQ0wsU0FBUztBQUFBLFVBQ1AsT0FBTztBQUFBLFlBQ0wsd0JBQW9CO0FBQUEsY0FDbEIsT0FBTztBQUFBLGNBQ1A7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTSxVQUFVLE1BQU0sSUFBSTtBQUN4QixZQUFNLFNBQVMsT0FBTztBQUN0QixVQUFJLE9BQU8sWUFBWSxXQUFXLFVBQVUsUUFBUSxDQUFDLEdBQUcsU0FBUyxPQUFPO0FBQ3RFO0FBRUYsWUFBTSxjQUFjLEdBQUcsT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUN6QyxZQUFNLE9BQU8sa0JBQWtCLE9BQU8sZ0JBQWdCLEVBQUU7QUFDeEQsWUFBTSxNQUFNLEdBQUcsT0FBTyxNQUFNLElBQUksSUFBSTtBQUNwQyxZQUFNLGFBQWEsTUFBTSxPQUFPO0FBQUEsUUFDOUI7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFDQSxZQUFNLEVBQUUsU0FBUyxRQUFJLDJCQUFVLFVBQVU7QUFFekMsWUFBTSxtQkFBbUIsQ0FBQyxlQUF1QixTQUF1QjtBQUN0RSxpQkFBUyxpQkFBaUIsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZO0FBQzVELGdCQUFNLE1BQU0sUUFBUSxhQUFhLElBQUk7QUFDckMsY0FBSSxDQUFDO0FBQUs7QUFFVixrQkFBSSx3QkFBVyxHQUFHLEdBQUc7QUFDbkIsb0JBQVEsYUFBYSxNQUFNLE9BQU8sU0FBUyxHQUFHO0FBQUEsVUFDaEQsV0FBVyxJQUFJLFdBQVcsR0FBRyxHQUFHO0FBQzlCLGtCQUFNLFVBQU0seUJBQVEscUJBQVEsRUFBRSxHQUFHLEdBQUc7QUFDcEMsa0JBQU0sZUFBVyxzQkFBUyxPQUFPLE1BQU0sR0FBRztBQUMxQyxvQkFBUSxhQUFhLE1BQU0sR0FBRyxPQUFPLE1BQU0sSUFBSSxRQUFRLEVBQUU7QUFBQSxVQUMzRDtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFDQSx1QkFBaUIsdUJBQXVCLEtBQUs7QUFDN0MsdUJBQWlCLHdCQUF3QixNQUFNO0FBRy9DLFlBQU0sV0FBVyxTQUFTLGNBQWMsUUFBUTtBQUNoRCxlQUFTLE1BQU07QUFDZixlQUFTLE9BQU87QUFDaEIsZUFBUyxLQUFLLFlBQVksUUFBUTtBQUVsQyxZQUFNLFVBQVUsU0FBUyxTQUFTO0FBQ2xDLGFBQU8sT0FBTyxNQUFNLGlCQUFpQixFQUFFO0FBQ3ZDLGFBQU8sT0FBTyxNQUFNLGdCQUFnQixJQUFJO0FBQ3hDLGFBQU8sT0FBTyxNQUFNLGdCQUFnQixPQUFPO0FBQzNDLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUNGOzs7QUNoRU8sU0FBUyxpQkFBaUIsZ0JBQXdDO0FBQ3ZFLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFDUCxVQUFJLGVBQWUsVUFBVSxRQUFRLGVBQWUsV0FBVztBQUM3RDtBQUVGLGFBQU87QUFBQSxRQUNMLFFBQVE7QUFBQSxVQUNOLHlCQUF5QixLQUFLLFVBQVUsS0FBSztBQUFBLFVBQzdDLHlCQUF5QixLQUFLO0FBQUEsWUFDNUIsZUFBZSxPQUFPO0FBQUEsVUFDeEI7QUFBQSxVQUNBLHFCQUFxQixLQUFLLFVBQVUsZUFBZSxPQUFPLElBQUk7QUFBQSxRQUNoRTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUN4QkEsc0JBQWdCOzs7QUNHVCxTQUFTLFlBQ2QsU0FDQSxVQUNZO0FBQ1osU0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLFFBQVE7QUFDL0IsVUFBTSxVQUFVLFdBQVcsTUFBTTtBQUMvQixVQUFJLDJCQUEyQixRQUFRLElBQUk7QUFBQSxJQUM3QyxHQUFHLFFBQVE7QUFDWCxZQUNHLEtBQUssR0FBRyxFQUNSLE1BQU0sR0FBRyxFQUNULFFBQVEsTUFBTSxhQUFhLE9BQU8sQ0FBQztBQUFBLEVBQ3hDLENBQUM7QUFDSDs7O0FEWkEsU0FBUyxZQUE4QjtBQUNyQyxRQUFNQyxhQUFZLElBQUksUUFBaUIsQ0FBQyxRQUFRO0FBQzlDLG9CQUFBQyxRQUFJLFFBQVEsY0FBYyxDQUFDLFFBQVE7QUFDakMsVUFBSSxPQUFPLE1BQU07QUFDZixZQUFJLEtBQUs7QUFBQSxNQUNYLE9BQU87QUFDTCxZQUFJLElBQUk7QUFBQSxNQUNWO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0QsU0FBTyxZQUFZRCxZQUFXLEdBQUcsRUFBRSxNQUFNLE1BQU0sSUFBSTtBQUNyRDtBQUVBLGVBQXNCLFdBQTZCO0FBQ2pELFFBQU0sVUFBVSxNQUFNLFVBQVU7QUFDaEMsU0FBTyxDQUFDO0FBQ1Y7QUFNQSxlQUFzQixZQUNwQixLQUNBLFFBQ2lCO0FBQ2pCLE1BQUksVUFBa0I7QUFFdEIsTUFBSSxNQUFNLFNBQVMsR0FBRztBQUNwQixVQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUc7QUFDM0IsUUFBSSxJQUFJLFNBQVMsS0FBSztBQUNwQixnQkFBVSxNQUFNLElBQUksS0FBSztBQUN6QixZQUFNLE9BQU8sUUFBUSxJQUFJLEtBQUssT0FBTztBQUFBLElBQ3ZDLE9BQU87QUFDTCxhQUFPLE9BQU87QUFBQSxRQUNaLHVCQUF1QixHQUFHO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQztBQUFTLGNBQVcsTUFBTSxPQUFPLFFBQVEsSUFBSSxHQUFHLEtBQU07QUFDM0QsTUFBSSxDQUFDO0FBQ0gsVUFBTTtBQUFBLE1BQ0osZ0JBQWdCLEdBQUc7QUFBQSxJQUNyQjtBQUVGLFNBQU87QUFDVDs7O0FFeENPLFNBQVMsU0FBUyxRQUFnQztBQUN2RCxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixVQUFVLElBQUk7QUFDWixVQUFJLEdBQUcsV0FBVyxNQUFNO0FBQUcsZUFBTyxPQUFPO0FBQUEsSUFDM0M7QUFBQSxJQUNBLE1BQU0sS0FBSyxJQUFJO0FBQ2IsVUFBSSxDQUFDLEdBQUcsV0FBVyxRQUFRO0FBQUc7QUFHOUIsWUFBTSxNQUFNLEdBQUcsUUFBUSxVQUFVLEVBQUU7QUFDbkMsYUFBTyxNQUFNLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7OztBQ3ZCQSxJQUFBRSxvQkFBMEM7QUFFMUMsc0JBQThCO0FBYXZCLFNBQVMsY0FDZCxhQUNBLFFBQ2E7QUFDYixTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixNQUFNLFlBQVksR0FBRyxRQUFRO0FBQzNCLGlCQUFXLGlCQUFpQixRQUFRO0FBSWxDLGNBQU0sYUFBYSxZQUFZO0FBQUEsVUFDN0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLFVBQVUsU0FBUyxhQUFhO0FBQUEsUUFDckQ7QUFDQSxZQUFJLGNBQWMsTUFBTTtBQUN0QixpQkFBTyxPQUFPLE1BQU0sMkJBQTJCLGFBQWE7QUFDNUQ7QUFBQSxRQUNGO0FBR0EsY0FBTSxnQkFBZ0I7QUFBQSxVQUNwQjtBQUFBLFVBQ0EsT0FBTztBQUFBLGNBQ1AsMkJBQVEsYUFBYTtBQUFBLFFBQ3ZCO0FBQ0EsWUFBSSxrQkFBa0IsZUFBZTtBQUNuQyxpQkFBTyxPQUFPO0FBQUEsWUFDWjtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQ0E7QUFBQSxRQUNGO0FBSUEsY0FBTSxpQkFBYSwyQkFBUSxPQUFPLFFBQVEsYUFBYTtBQUN2RCxjQUFNLGlCQUFhLDJCQUFRLE9BQU8sUUFBUSxhQUFhO0FBQ3ZELGtCQUFNLCtCQUFVLDJCQUFRLFVBQVUsQ0FBQztBQUNuQyxjQUFNLGdCQUFBQyxRQUFHLEtBQUssWUFBWSxZQUFZLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFFekQsY0FBTSxlQUFlO0FBQUEsVUFDbkIsR0FBRyxPQUFPLGFBQWE7QUFBQSxVQUN2QixVQUFVO0FBQUEsUUFDWjtBQUNBLGVBQU8sT0FBTyxhQUFhO0FBQzNCLGVBQU8sYUFBYSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUNsRUEsc0JBQStCOzs7QUNFL0Isa0JBQTRCO0FBRXJCLFNBQVMsbUJBQ2QsUUFDMEI7QUFDMUIsUUFBTSxpQkFBMkM7QUFBQSxJQUMvQyxVQUFVLE9BQU8sT0FBTztBQUFBLElBQ3hCLFNBQVM7QUFBQSxNQUNQLEVBQUUsTUFBTSxLQUFLLElBQUksV0FBVyxNQUFNLHdCQUF3QjtBQUFBLE1BQzFELEVBQUUsTUFBTSxnQkFBZ0IsTUFBTSxNQUFNO0FBQUEsSUFDdEM7QUFBQSxJQUNBLFNBQVMsQ0FBQyxFQUFFLFNBQVMsYUFBYSxDQUFDO0FBQUEsSUFDbkMsTUFBTSxPQUFPLE9BQU87QUFBQSxJQUNwQixNQUFNLENBQUMsY0FBYyxlQUFlLFNBQVMsT0FBTztBQUFBLEVBQ3REO0FBRUEsYUFBTztBQUFBLElBQ0w7QUFBQSxJQUNBLE9BQU87QUFBQSxFQUNUO0FBQ0Y7OztBRGxCQSxJQUFBQyxlQUF3QjtBQUV4QixJQUFNLHFCQUEwRDtBQUFBLEVBQzlELE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFBQSxFQUNSLFdBQVc7QUFDYjtBQUtPLFNBQVMsU0FBUyxRQUFnQztBQUN2RCxRQUFNLFVBQVUsbUJBQW1CLE1BQU07QUFDekMsUUFBTUMsZ0JBQVcsZ0NBQWUsT0FBTztBQUV2QyxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixNQUFNLFNBQVM7QUFDYixZQUFNQSxVQUFTLG1CQUFtQixRQUFXLEVBQUUsS0FBSyxPQUFPLE9BQU8sQ0FBQztBQUFBLElBQ3JFO0FBQUEsSUFDQSxNQUFNLFVBQVUsTUFBTSxJQUFJO0FBQ3hCLFlBQU0sVUFBTSxzQkFBUSxFQUFFO0FBQ3RCLFVBQUksbUJBQW1CLEdBQUc7QUFBRyxlQUFPQSxVQUFTLGNBQWMsTUFBTSxFQUFFO0FBQUEsSUFDckU7QUFBQSxFQUNGO0FBQ0Y7OztBRTlCQSxJQUFBQyxtQkFBZTtBQUNmLElBQUFDLGVBQXdCO0FBS2pCLFNBQVMsaUJBQ2QsTUFDQSxRQUNRO0FBQ1IsUUFBTSxZQUFZLGVBQWUsSUFBSTtBQUNyQyxRQUFNLG9CQUFvQixLQUFLLFNBQVM7QUFFeEMsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sVUFBVSxJQUFJO0FBR1osWUFBTSxRQUFRLEdBQUcsUUFBUSxTQUFTO0FBQ2xDLFVBQUksVUFBVTtBQUFJO0FBRWxCLFlBQU0sWUFBWSxHQUFHLFVBQVUsUUFBUSxVQUFVLE1BQU07QUFDdkQsYUFBTyxvQkFBb0I7QUFBQSxJQUM3QjtBQUFBLElBQ0EsTUFBTSxLQUFLLElBQUk7QUFDYixVQUFJLENBQUMsR0FBRyxXQUFXLGlCQUFpQjtBQUFHO0FBRXZDLFlBQU0sWUFBWSxHQUFHLFFBQVEsbUJBQW1CLEVBQUU7QUFDbEQsWUFBTSxXQUFXLE1BQU0saUJBQUFDLFFBQUc7QUFBQSxZQUN4QjtBQUFBLFVBQ0UsT0FBTztBQUFBLFVBQ1AseUNBQXlDLElBQUk7QUFBQSxRQUMvQztBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQ0EsYUFBTyxTQUFTLFFBQVEsZ0JBQWdCLElBQUksSUFBSSxTQUFTO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQ0Y7OztBQ3ZDQSxpQ0FBa0I7QUFFWCxTQUFTLGNBQWMsUUFBd0I7QUFDcEQsUUFBTSxLQUNKLE9BQU8sMkJBQUFDLFlBQVUsYUFBYSwyQkFBQUEsVUFBUywyQkFBQUEsUUFBYztBQUN2RCxTQUFPLEdBQUc7QUFBQSxJQUNSLE1BQU0sT0FBTztBQUFBLEVBQ2YsQ0FBQztBQUNIOzs7QUNUQSxJQUFBQyxtQkFBOEI7QUFFOUIsSUFBQUMsZUFBaUM7QUFRMUIsU0FBUyxjQUFjLFFBQXlCO0FBQ3JELFFBQU0sVUFBVSxDQUFDLFlBQ2Ysc0JBQVEsUUFBUSxTQUFTLG1CQUFtQixHQUFHLENBQUM7QUFFbEQsU0FBTztBQUFBLElBQ0wsTUFBTSxJQUFJLEtBQWEsT0FBOEI7QUFDbkQsWUFBTUMsUUFBTyxRQUFRLEdBQUc7QUFDeEIsZ0JBQU0sZ0NBQVUsc0JBQVFBLEtBQUksQ0FBQztBQUM3QixZQUFNLGlCQUFBQyxRQUFHLFVBQVVELE9BQU0sT0FBTyxPQUFPO0FBQUEsSUFDekM7QUFBQSxJQUNBLE1BQU0sSUFBSSxLQUEwQztBQUNsRCxZQUFNQSxRQUFPLFFBQVEsR0FBRztBQUN4QixVQUFJO0FBQ0YsZUFBTyxNQUFNLGlCQUFBQyxRQUFHLFNBQVNELE9BQU0sT0FBTztBQUFBLE1BQ3hDLFFBQVE7QUFDTixlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQzNCTyxTQUFTLFdBQ2QsUUFDbUQ7QUFDbkQsU0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU8sT0FBTztBQUFBLE1BQ2QsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPLE9BQU87QUFBQSxNQUNkLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTyxPQUFPLFlBQVk7QUFBQSxNQUMxQixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDMUIsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPLE9BQU8sWUFBWTtBQUFBLE1BQzFCLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTyxPQUFPLFlBQVk7QUFBQSxNQUMxQixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDMUIsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPLE9BQU87QUFBQSxNQUNkLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUNGOzs7QWJoQ0EsaUJBQTJCO0FBTTNCLGVBQXNCLGtCQUNwQixRQUNBLFNBQ3lCO0FBRXpCLFFBQU0sT0FBTyxPQUFPLE9BQU8sa0JBQUFFLFFBQUssUUFBUSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUk7QUFDbkUsUUFBTSxPQUNKLE9BQU8sU0FBUyxZQUFZLFVBQVUsZUFBZTtBQUN2RCxRQUFNLFVBQVUsT0FBTyxXQUFXO0FBQ2xDLFFBQU0sa0JBQ0osT0FBTyxvQkFBb0IsV0FBVyxZQUFZLElBQUk7QUFDeEQsUUFBTSxhQUFhLGtCQUFBQSxRQUFLLFFBQVEsTUFBTSxTQUFTO0FBQy9DLFFBQU0sU0FBUyxrQkFBQUEsUUFBSyxRQUFRLFlBQVksR0FBRyxPQUFPLE1BQU0sZUFBZSxFQUFFO0FBQ3pFLFFBQU0sU0FBUyxPQUFPLFVBQVU7QUFFaEMsUUFBTSxhQUF1QztBQUFBLElBQzNDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFVBQVUsT0FBTyxZQUFZLENBQUM7QUFBQSxJQUM5QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLE1BQU0sT0FBTyxRQUFRLENBQUM7QUFBQSxJQUN0QixTQUFTLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDNUIsY0FBYyxVQUFNLHVCQUFrQztBQUFBLE1BQ3BELE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLFdBQVcsT0FBTztBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNIO0FBR0EsTUFBSSxhQUF5QjtBQUFBLElBQzNCO0FBQUEsRUFDRjtBQUNBLE1BQUksT0FBTyxlQUFlLE9BQU87QUFDL0IsVUFBTSxTQUFTLFVBQU0sdUJBQXVCO0FBQUEsTUFDMUMsTUFBTTtBQUFBLE1BQ04sS0FBSztBQUFBLE1BQ0wsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUNELGlCQUFhLE9BQU8sVUFBVSxDQUFDO0FBQUEsRUFDakM7QUFHQSxRQUFNLFNBQWM7QUFBQSxJQUNsQjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSxTQUFTLFdBQVcsYUFBUywyQkFBUSxNQUFNLFdBQVcsTUFBTSxJQUFJO0FBQ3RFLFFBQU0scUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBLFdBQVcsa0JBQWtCO0FBQUEsRUFDL0I7QUFDQSxRQUFNLGdCQUFZLDJCQUFRLFFBQVEsV0FBVyxhQUFhLFFBQVE7QUFDbEUsUUFBTSxhQUFTLDJCQUFRLFFBQVEsTUFBTTtBQUNyQyxRQUFNLGVBQVcsMkJBQVEsUUFBUSxPQUFPO0FBR3hDLFFBQU0sTUFBaUIsRUFBRSxNQUFNLFNBQVMsaUJBQWlCLFFBQVE7QUFDakUsUUFBTSxlQUFlLE1BQU0sc0JBQXNCLEtBQUssV0FBVyxRQUFRO0FBQ3pFLFFBQU0saUJBQWlCLE1BQU0sc0JBQXNCLEtBQUssT0FBTyxRQUFRO0FBQ3ZFLFFBQU0sV0FBZ0IsaUJBQVksY0FBYyxjQUFjO0FBRTlELFFBQU0sY0FBOEI7QUFBQSxJQUNsQyxHQUFHO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFNBQVMsY0FBYyxNQUFNO0FBQUEsSUFDN0I7QUFBQSxFQUNGO0FBR0EsY0FBWSxLQUFLLE9BQU87QUFDeEIsY0FBWSxLQUFLLGFBQWE7QUFDOUIsY0FBWSxLQUFLLFdBQVc7QUFFNUIsY0FBWSxLQUFLLFVBQVUsQ0FBQztBQUM1QixjQUFZLEtBQUssTUFBTSxTQUFTO0FBQ2hDLGNBQVksS0FBSyxNQUFNLGNBQWM7QUFFckMsY0FBWSxLQUFLLFlBQVksQ0FBQztBQUM5QixjQUFZLEtBQUssUUFBUSxLQUFhLFNBQVMsV0FBVyxDQUFDO0FBQzNELGNBQVksS0FBSyxRQUFRLEtBQWEsaUJBQWlCLFdBQVcsQ0FBQztBQUNuRSxjQUFZLEtBQUssUUFBUSxLQUFhLFNBQVMsV0FBVyxDQUFDO0FBQzNELGNBQVksS0FBSyxRQUFRO0FBQUEsSUFDZixpQkFBaUIsY0FBYyxXQUFXO0FBQUEsRUFDcEQ7QUFDQSxjQUFZLEtBQUssUUFBUTtBQUFBLElBQ2YsaUJBQWlCLGtCQUFrQixXQUFXO0FBQUEsRUFDeEQ7QUFDQSxjQUFZLEtBQUssUUFBUSxLQUFhLGlCQUFpQixXQUFXLENBQUM7QUFDbkUsY0FBWSxLQUFLLFFBQVEsS0FBYSxjQUFjLFdBQVcsQ0FBQztBQUVoRSxjQUFZLEtBQUssV0FBVyxDQUFDO0FBQzdCLGFBQVcsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0FBQzFDLGdCQUFZLEtBQUssT0FBUSxPQUFPLElBQUksSUFBSSxLQUFLLFVBQVUsT0FBTyxLQUFLO0FBQUEsRUFDckUsQ0FBQztBQUVELFNBQU87QUFDVDtBQWlCQSxlQUFlLHNCQUNiLEtBQ0EsVUFDdUI7QUFDdkIsU0FBTyxPQUFPLE9BQU8sYUFBYSxhQUM5QixTQUFTLEdBQUcsSUFDWixZQUFZLENBQUM7QUFDbkI7OztBY3pKQSxJQUFBQyxxQkFBZTtBQUNmLElBQUFDLFFBQXNCOzs7QUNBZixTQUFTLE1BQ2QsT0FDQSxXQUNTO0FBQ1QsV0FBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVE7QUFDaEMsUUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUFHLGFBQU87QUFDdEMsU0FBTztBQUNUOzs7QUNjTyxTQUFTLGlCQUNkLGNBQ0EsZUFDZTtBQUNmLE1BQUksaUJBQWlCO0FBQU0sV0FBTyxFQUFFLE1BQU0sWUFBWTtBQUV0RCxRQUFNLGVBQWUsSUFBSTtBQUFBLElBQ3ZCLGFBQWE7QUFBQSxNQUFRLENBQUMsZ0JBQ3BCLGtCQUFrQixhQUFhLGFBQWE7QUFBQSxJQUM5QztBQUFBLEVBQ0Y7QUFDQSxNQUFJLGFBQWEsU0FBUztBQUFHLFdBQU8sRUFBRSxNQUFNLFlBQVk7QUFFeEQsUUFBTSxrQkFBK0I7QUFBQSxJQUNuQyxVQUFVLGNBQWM7QUFBQSxJQUN4QixPQUFPLENBQUM7QUFBQSxJQUNSLGNBQWMsQ0FBQztBQUFBLEVBQ2pCO0FBQ0EsUUFBTSxnQkFBNkI7QUFBQSxJQUNqQyxVQUFVLGNBQWM7QUFBQSxJQUN4QixPQUFPLENBQUM7QUFBQSxJQUNSLGNBQWMsQ0FBQztBQUFBLEVBQ2pCO0FBRUEsYUFBVyxRQUFRLGNBQWMsT0FBTztBQUN0QyxRQUFJLGFBQWEsSUFBSSxJQUFJLEdBQUc7QUFDMUIsb0JBQWMsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUMvQixPQUFPO0FBQ0wsc0JBQWdCLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQ0EsYUFBVyxTQUFTLGNBQWMsY0FBYztBQUM5QyxRQUFJLGFBQWEsSUFBSSxLQUFLLEdBQUc7QUFDM0Isb0JBQWMsYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUN2QyxPQUFPO0FBQ0wsc0JBQWdCLGFBQWEsS0FBSyxLQUFLO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBRUEsUUFBTSxvQkFDSixhQUFhLFNBQVMsS0FDdEIsTUFBTSxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxLQUFLLFNBQVMsT0FBTyxDQUFDO0FBQzNELE1BQUksbUJBQW1CO0FBQ3JCLFdBQU87QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLGNBQWM7QUFBQSxNQUNkLGVBQWUsY0FBYyxNQUFNLElBQUksQ0FBQyxTQUFTLEtBQUssV0FBVztBQUFBLElBQ25FO0FBQUEsRUFDRjtBQUVBLFFBQU0sdUJBQ0osY0FBYyxNQUFNLFNBQVMsS0FDN0I7QUFBQSxJQUNFLGNBQWMsTUFBTSxRQUFRLENBQUMsU0FBUyxLQUFLLFdBQVc7QUFBQSxJQUN0RCxDQUFDLFVBQVUsTUFBTSxTQUFTO0FBQUEsRUFDNUI7QUFDRixNQUFJLHNCQUFzQjtBQUN4QixXQUFPO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTixjQUFjO0FBQUEsTUFDZCxjQUFjLGNBQWM7QUFBQSxNQUM1QixlQUFlLGNBQWMsTUFBTSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVc7QUFBQSxJQUNuRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixjQUFjO0FBQUEsSUFDZCxlQUFlLGNBQWMsTUFBTSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVc7QUFBQSxFQUNuRTtBQUNGO0FBS0EsU0FBUyxrQkFDUCxhQUNBLGVBQ2tCO0FBQ2xCLFFBQU0sVUFBNEIsQ0FBQztBQUNuQyxRQUFNLGNBQWMsWUFBWSxDQUFDO0FBRWpDLFFBQU0sa0JBQWtCLENBQ3RCO0FBQUE7QUFBQTtBQUFBLElBSUMsTUFBTSxTQUFTLFdBQVcsWUFBWSxTQUFTLE1BQU0sUUFBUTtBQUFBLElBRTdELE1BQU0sU0FBUyxXQUFXLE1BQU0sVUFBVSxTQUFTLFdBQVc7QUFBQTtBQUVqRSxhQUFXLFFBQVEsY0FBYyxPQUFPO0FBQ3RDLFVBQU0sZ0JBQWdCLEtBQUssT0FBTyxLQUFLLENBQUMsVUFBVSxnQkFBZ0IsS0FBSyxDQUFDO0FBQ3hFLFFBQUk7QUFBZSxjQUFRLEtBQUssSUFBSTtBQUFBLEVBQ3RDO0FBRUEsUUFBTSxnQkFBZ0IsY0FBYyxhQUFhO0FBQUEsSUFBSyxDQUFDLFVBQ3JELGdCQUFnQixLQUFLO0FBQUEsRUFDdkI7QUFDQSxNQUFJO0FBQWUsWUFBUSxLQUFLLGFBQWE7QUFFN0MsU0FBTztBQUNUOzs7QUZ6SEEseUJBQXNCO0FBQ3RCLElBQUFDLGtCQUF3QjtBQUN4QixJQUFBQyxvQkFBeUI7OztBR1B6QixJQUFBQyxRQUFzQjs7O0FDQXRCLElBQUFDLG1CQUFlO0FBQ2YsSUFBQUMsZUFBaUI7QUFFakIsZUFBc0IsZ0JBQWdCLEtBQTRCO0FBQ2hFLFFBQU0sUUFBUSxNQUFNLGlCQUFBQyxRQUFHLFFBQVEsR0FBRztBQUNsQyxhQUFXLFFBQVEsT0FBTztBQUN4QixVQUFNLFdBQVcsYUFBQUMsUUFBSyxLQUFLLEtBQUssSUFBSTtBQUNwQyxVQUFNLFFBQVEsTUFBTSxpQkFBQUQsUUFBRyxLQUFLLFFBQVE7QUFDcEMsUUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixZQUFNLGdCQUFnQixRQUFRO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLFVBQU0saUJBQUFBLFFBQUcsTUFBTSxHQUFHO0FBQUEsRUFDcEIsUUFBUTtBQUFBLEVBRVI7QUFDRjs7O0FEUEEsdUJBQWlCO0FBQ2pCLElBQUFFLG1CQUFlO0FBQ2YsSUFBQUMsZUFBaUM7QUFFakMsZUFBc0IsaUJBQ3BCLFFBQ0EsUUFDd0M7QUFDeEMsUUFBTSxRQUEyQixDQUFDO0FBQ2xDLGFBQVcsU0FBUyxRQUFRO0FBQzFCLFVBQU0sT0FBTyxNQUFNLFFBQVEsS0FBSyxJQUM1QixNQUFNLHlCQUF5QixPQUFPLE1BQU0sSUFDNUMsTUFBTSxzQkFBc0IsT0FBTyxNQUFNO0FBQzdDLFVBQU0sS0FBSyxJQUFJO0FBQUEsRUFDakI7QUFDQSxRQUFNLGVBQWUsTUFBTSxvQkFBb0IsTUFBTTtBQUdyRCxRQUFNLGdCQUFnQixPQUFPLE1BQU07QUFFbkMsU0FBTyxFQUFFLGNBQWMsTUFBTTtBQUMvQjtBQUtBLGVBQWUsc0JBQ2IsWUFDQSxRQUMwQjtBQUUxQixRQUFNLFlBQVksQ0FBQyxjQUFjLGdCQUFnQixFQUFFLFNBQVMsV0FBVyxJQUFJO0FBQzNFLFFBQU0sUUFBUSxZQUNWLGVBQWUsV0FBVyxJQUFJLElBQUksV0FBVyxTQUFTLEtBQ3RELFdBQVc7QUFFZixRQUFNLFVBQTJCO0FBQUEsSUFDL0IsT0FBTztBQUFBLE1BQ0wsS0FBSztBQUFBLFFBQ0g7QUFBQSxRQUNBLFNBQVMsQ0FBQyxNQUFNO0FBQUEsUUFDaEIsTUFBTTtBQUFBLFFBQ04sVUFBVSxXQUFXO0FBQUEsTUFDdkI7QUFBQSxNQUNBLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQTtBQUFBO0FBQUEsVUFHTixnQkFBZ0I7QUFBQSxZQUNkO0FBQUEsWUFDQSxPQUFPO0FBQUEsWUFDUDtBQUFBLFVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUlBLGdCQUFnQixVQUFVLFdBQVcsSUFBSTtBQUFBLFFBQzNDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsUUFBTSxjQUFtQjtBQUFBLElBQ3ZCO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxNQUFXLFlBQU0sV0FBVztBQUMzQyxTQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsSUFDYixRQUFRLHFCQUFxQixNQUFNO0FBQUEsRUFDckM7QUFDRjtBQUtBLGVBQWUseUJBQ2IsYUFDQSxRQUMwQjtBQUMxQixRQUFNLFlBQTZCO0FBQUEsSUFDakMsU0FBUyxDQUFTLGNBQWMsYUFBYSxNQUFNLENBQUM7QUFBQSxJQUNwRCxPQUFPO0FBQUEsTUFDTCxlQUFlO0FBQUEsUUFDYixPQUFPLFlBQVksT0FBK0IsQ0FBQyxPQUFPLFVBQVU7QUFDbEUsZ0JBQU0sTUFBTSxJQUFJLElBQUksTUFBTTtBQUMxQixpQkFBTztBQUFBLFFBQ1QsR0FBRyxDQUFDLENBQUM7QUFBQSxRQUNMLFFBQVE7QUFBQTtBQUFBLFVBRU4sZ0JBQWdCO0FBQUE7QUFBQSxVQUVoQixnQkFBZ0I7QUFBQTtBQUFBLFVBRWhCLGdCQUFnQjtBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxjQUFtQjtBQUFBLElBQ3ZCO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxNQUFXLFlBQU0sV0FBVztBQUMzQyxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsUUFBUSxxQkFBcUIsTUFBTTtBQUFBLEVBQ3JDO0FBQ0Y7QUFFQSxTQUFTLHFCQUNQLFFBQzJCO0FBQzNCLE1BQUksUUFBUTtBQUFRLFVBQU0sTUFBTSx1Q0FBdUM7QUFDdkUsTUFBSSxNQUFNLFFBQVEsTUFBTTtBQUFHLFdBQU8sT0FBTyxRQUFRLENBQUMsRUFBRSxPQUFPLE1BQU0sTUFBTTtBQUN2RSxTQUFPLE9BQU87QUFDaEI7QUFFQSxlQUFlLG9CQUNiLFFBQ3NDO0FBQ3RDLFFBQU0sZUFBNEMsQ0FBQztBQUNuRCxNQUFJLENBQUUsTUFBTSxpQkFBQUMsUUFBRyxPQUFPLE9BQU8sU0FBUztBQUFJLFdBQU87QUFFakQsUUFBTSxRQUFRLFVBQU0saUJBQUFDLFNBQUssUUFBUSxFQUFFLEtBQUssT0FBTyxVQUFVLENBQUM7QUFFMUQsYUFBVyxRQUFRLE9BQU87QUFDeEIsVUFBTSxjQUFVLHNCQUFRLE9BQU8sV0FBVyxJQUFJO0FBQzlDLFVBQU0sY0FBVSxzQkFBUSxPQUFPLFFBQVEsSUFBSTtBQUUzQyxVQUFNLGlCQUFBRCxRQUFHLGNBQVUsc0JBQVEsT0FBTyxDQUFDO0FBQ25DLFVBQU0saUJBQUFBLFFBQUcsU0FBUyxTQUFTLE9BQU87QUFDbEMsaUJBQWEsS0FBSztBQUFBLE1BQ2hCLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLE1BQU07QUFBQSxNQUNOLG9CQUFvQjtBQUFBLE1BQ3BCLFFBQVEsTUFBTSxpQkFBQUEsUUFBRyxTQUFTLE9BQU87QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDs7O0FFM0pBLElBQUFFLGVBQWtDO0FBV2xDLElBQUFDLG1CQUFlO0FBQ2YsdUJBQXNCO0FBQ3RCLElBQUFDLG1CQUEwQjtBQUMxQixtQkFBa0I7OztBQ2RsQixrQkFBdUI7QUFFdkIsSUFBQUMsbUJBQStCO0FBQy9CLElBQUFDLG1CQUFlO0FBQ2YsSUFBQUMsZUFBd0I7QUFDeEIsbUJBQXNCO0FBa0J0QixlQUFzQixhQUNwQkMsT0FDQSxRQUNZO0FBQ1osU0FBTyxPQUFPLE1BQU0sMEJBQTBCQSxLQUFJO0FBRWxELFFBQU1DLGdCQUFXLGlDQUFlO0FBQUEsSUFDOUIsR0FBRyxtQkFBbUIsTUFBTTtBQUFBO0FBQUEsSUFFNUIsU0FBUyxDQUFDLEVBQUUsTUFBTSxLQUFLLElBQUksV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBQUEsSUFDckUsTUFBTSxDQUFDO0FBQUEsRUFDVCxDQUFDO0FBQ0QsUUFBTUEsVUFBUyxLQUFLO0FBRXBCLFFBQU0sT0FBTyxNQUFNLGlCQUFBQyxRQUFHLFNBQVNGLE9BQU0sT0FBTztBQUM1QyxRQUFNLGdCQUFnQixLQUFLLFFBQVEsbUJBQW1CLEVBQUU7QUFDeEQsUUFBTSxFQUFFLEtBQUssSUFBSSxNQUFNQyxVQUFTLGNBQWMsYUFBYTtBQUMzRCxTQUFPLE9BQU87QUFBQSxJQUNaLENBQUMsU0FBUyxNQUFNLGVBQWUsZUFBZSxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7QUFBQSxFQUN4RTtBQUVBLFFBQU0sV0FBTyxZQUFBRSxTQUFXLFlBQVk7QUFBQSxJQUNsQyxPQUFPO0FBQUEsSUFDUCxZQUFZO0FBQUEsSUFDWixnQkFBZ0I7QUFBQSxJQUNoQixPQUFPO0FBQUEsTUFDTCw2QkFBeUI7QUFBQSxRQUN2QixPQUFPO0FBQUEsUUFDUDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFVLE1BQU07QUFDZCxVQUFJLEtBQUssYUFBYUg7QUFBTSxtQkFBTyxhQUFBSSxTQUFVLEVBQUUsR0FBRyxNQUFNLFFBQVEsS0FBSyxDQUFDO0FBQUE7QUFDakUsbUJBQU8sYUFBQUEsU0FBVSxJQUFJO0FBQUEsSUFDNUI7QUFBQSxFQUNGLENBQUM7QUFFRCxNQUFJO0FBQ0YsV0FBTyxNQUFNLEtBQUtKLEtBQUk7QUFBQSxFQUN4QixTQUFTLEtBQUs7QUFDWixXQUFPLE9BQU8sTUFBTSxHQUFHO0FBQ3ZCLFVBQU07QUFBQSxFQUNSO0FBQ0Y7OztBRGxEQSxJQUFBSyxvQkFBaUI7QUFNakIsZUFBc0IsZ0JBQ3BCLFFBQ3VCO0FBQ3ZCLFFBQU0sZ0JBQWdCLFVBQU0sa0JBQUFDLFNBQUssUUFBUTtBQUFBLElBQ3ZDLEtBQUssT0FBTztBQUFBLEVBQ2QsQ0FBQztBQUVELGdCQUFjLEtBQUs7QUFFbkIsUUFBTSxZQUFZLE9BQU8sS0FBSyxxQkFBcUI7QUFDbkQsUUFBTSxnQkFBd0QsQ0FBQztBQUUvRCxRQUFNLGNBQTRCLENBQUM7QUFDbkMsUUFBTSxRQUFRO0FBQUEsSUFDWixjQUFjLElBQUksT0FBTyxpQkFBaUI7QUFDeEMsWUFBTUMsWUFBTyxzQkFBUSxPQUFPLGdCQUFnQixZQUFZO0FBQ3hELFlBQU0sZUFBZSxVQUFVO0FBQUEsUUFBSyxDQUFDRCxVQUNuQyxpQkFBQUUsUUFBVSxRQUFRLGNBQWNGLEtBQUk7QUFBQSxNQUN0QztBQUVBLFVBQUksZ0JBQWdCLE1BQU07QUFDeEIsZUFBTyxPQUFPLE9BQU87QUFBQSxVQUNuQixHQUFHLFlBQVk7QUFBQSxFQUE2RCxLQUFLO0FBQUEsWUFDL0U7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBRUEsWUFBTSxPQUFPLHNCQUFzQixZQUFZO0FBQy9DLFVBQUksU0FBUztBQUFXO0FBRXhCLFVBQUk7QUFDSixjQUFRLE1BQU07QUFBQSxRQUNaLEtBQUs7QUFDSCx1QkFBYSxNQUFNLG1CQUFtQixRQUFRQyxLQUFJO0FBQ2xEO0FBQUEsUUFDRixLQUFLO0FBQ0gsdUJBQWEsTUFBTSxxQkFBcUIsUUFBUUEsS0FBSTtBQUNwRDtBQUFBLFFBQ0YsS0FBSztBQUNILHVCQUFhLE1BQU0sd0JBQXdCLFFBQVFBLEtBQUk7QUFDdkQ7QUFBQSxRQUNGLEtBQUs7QUFDSCx1QkFBYSxNQUFNO0FBQUEsWUFDakI7QUFBQSxZQUNBLGtCQUFrQixPQUFPLGdCQUFnQkEsS0FBSTtBQUFBLFlBQzdDQTtBQUFBLFVBQ0Y7QUFDQTtBQUFBLFFBQ0Y7QUFDRSx1QkFBYTtBQUFBLFlBQ1g7QUFBQSxZQUNBLE1BQU0sa0JBQWtCLE9BQU8sZ0JBQWdCQSxLQUFJO0FBQUEsWUFDbkQsV0FBV0E7QUFBQSxZQUNYLFdBQVcsT0FBTztBQUFBLFVBQ3BCO0FBQUEsTUFDSjtBQUVBLFlBQU0sZUFBZSxjQUFjLFdBQVcsSUFBSTtBQUNsRCxVQUFJLGNBQWM7QUFDaEIsY0FBTTtBQUFBLFVBQ0osdUNBQ0UsV0FBVyxJQUNiLHdDQUF3QztBQUFBLGdCQUN0Qyx1QkFBUyxPQUFPLE1BQU0sYUFBYSxTQUFTO0FBQUEsZ0JBQzVDLHVCQUFTLE9BQU8sTUFBTSxXQUFXLFNBQVM7QUFBQSxVQUM1QyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDZDtBQUFBLE1BQ0Y7QUFDQSxrQkFBWSxLQUFLLFVBQVU7QUFDM0Isb0JBQWMsV0FBVyxJQUFJLElBQUk7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU87QUFDVDtBQU1BLGVBQWUsbUJBQ2IsUUFDQUEsT0FDMEI7QUFDMUIsUUFBTSxVQUFzQyxDQUFDO0FBRTdDLFFBQU0sVUFBVSxNQUFNLGlCQUFBRSxRQUFHLFNBQVNGLE9BQU0sT0FBTztBQUMvQyxRQUFNLEVBQUUsU0FBUyxRQUFJLDRCQUFVLE9BQU87QUFFdEMsUUFBTSxRQUFRLFNBQVMsY0FBYyxPQUFPO0FBQzVDLE1BQUksU0FBUztBQUFNLFlBQVEsZUFBZSxNQUFNLGVBQWU7QUFFL0QsUUFBTSxxQkFBcUIsU0FDeEIsY0FBYyxvQ0FBb0MsR0FDakQsYUFBYSxTQUFTO0FBQzFCLE1BQUksb0JBQW9CO0FBQ3RCLFFBQUk7QUFDRixjQUFRLGNBQWMsYUFBQUcsUUFBTSxNQUFNLGtCQUFrQjtBQUFBLElBQ3RELFNBQVMsS0FBSztBQUNaLGFBQU8sT0FBTztBQUFBLFFBQ1osbUVBQW1FLGtCQUFrQjtBQUFBLFFBQ3JGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxnQkFBZ0IsU0FDbkIsY0FBYyw0QkFBNEIsR0FDekMsYUFBYSxTQUFTO0FBQzFCLE1BQUksZUFBZTtBQUNqQixZQUFRLFNBQ04sa0JBQWtCLGdCQUFnQixnQkFBZ0I7QUFBQSxFQUN0RDtBQUVBLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOO0FBQUEsSUFDQSxXQUFXSDtBQUFBLElBQ1gsV0FBVyxPQUFPO0FBQUEsRUFDcEI7QUFDRjtBQU1BLGVBQWUscUJBQ2IsUUFDQUEsT0FDNEI7QUFDNUIsUUFBTSxVQUF3QyxDQUFDO0FBRS9DLFFBQU0sVUFBVSxNQUFNLGlCQUFBRSxRQUFHLFNBQVNGLE9BQU0sT0FBTztBQUMvQyxRQUFNLEVBQUUsU0FBUyxRQUFJLDRCQUFVLE9BQU87QUFFdEMsUUFBTSxtQkFBbUIsU0FDdEIsY0FBYyxtQ0FBbUMsR0FDaEQsYUFBYSxTQUFTO0FBQzFCLE1BQUksa0JBQWtCO0FBQ3BCLFlBQVEsWUFBWSxRQUFRLGdCQUFnQjtBQUFBLEVBQzlDO0FBRUEsUUFBTSxxQkFBcUIsU0FDeEIsY0FBYyxvQ0FBb0MsR0FDakQsYUFBYSxTQUFTO0FBQzFCLE1BQUksb0JBQW9CO0FBQ3RCLFlBQVEsY0FBYyxRQUFRLGtCQUFrQjtBQUFBLEVBQ2xEO0FBRUEsUUFBTSxzQkFBc0IsU0FDekIsY0FBYyxxQ0FBcUMsR0FDbEQsYUFBYSxTQUFTO0FBQzFCLE1BQUkscUJBQXFCO0FBQ3ZCLFlBQVEsZUFBZSxRQUFRLG1CQUFtQjtBQUFBLEVBQ3BEO0FBRUEsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ047QUFBQSxJQUNBLFdBQVdBO0FBQUEsSUFDWCxXQUFXLE9BQU87QUFBQSxFQUNwQjtBQUNGO0FBS0EsZUFBZSx3QkFDYixRQUNBQSxPQUMrQjtBQUMvQixRQUFNLEVBQUUsTUFBTSxHQUFHLEdBQUcsUUFBUSxJQUMxQixNQUFNLGFBQTBDQSxPQUFNLE1BQU07QUFDOUQsTUFBSSxXQUFXLE1BQU07QUFDbkIsVUFBTSxNQUFNLGtEQUFrRDtBQUFBLEVBQ2hFO0FBQ0EsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sV0FBV0E7QUFBQSxJQUNYLFdBQVcsT0FBTztBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUNGO0FBS0EsZUFBZSwyQkFDYixRQUNBLE1BQ0FBLE9BQ2tDO0FBQ2xDLFFBQU0sRUFBRSxNQUFNLEdBQUcsR0FBRyxRQUFRLElBQUksTUFBTTtBQUFBLElBQ3BDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsTUFBSSxXQUFXLE1BQU07QUFDbkIsVUFBTSxNQUFNLGtCQUFrQixJQUFJLGlDQUFpQztBQUFBLEVBQ3JFO0FBQ0EsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTSxrQkFBa0IsT0FBTyxnQkFBZ0JBLEtBQUk7QUFBQSxJQUNuRCxXQUFXQTtBQUFBLElBQ1gsZUFBVyxzQkFBUSxPQUFPLFFBQVEsaUJBQWlCO0FBQUEsSUFDbkQ7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNLHdCQUF3RTtBQUFBLEVBQzVFLGdCQUFnQjtBQUFBLEVBQ2hCLHNCQUFzQjtBQUFBLEVBQ3RCLGtCQUFrQjtBQUFBLEVBQ2xCLHdCQUF3QjtBQUFBLEVBRXhCLGtCQUFrQjtBQUFBLEVBQ2xCLHdCQUF3QjtBQUFBLEVBRXhCLGdCQUFnQjtBQUFBLEVBQ2hCLHNCQUFzQjtBQUFBLEVBRXRCLGVBQWU7QUFBQSxFQUNmLHFCQUFxQjtBQUFBLEVBRXJCLGtCQUFrQjtBQUFBLEVBQ2xCLHdCQUF3QjtBQUFBLEVBQ3hCLG9CQUFvQjtBQUFBLEVBQ3BCLDBCQUEwQjtBQUFBLEVBRTFCLGlCQUFpQjtBQUFBLEVBQ2pCLHVCQUF1QjtBQUFBLEVBRXZCLGlCQUFpQjtBQUFBLEVBRWpCLGtCQUFrQjtBQUFBLEVBQ2xCLHdCQUF3QjtBQUFBLEVBQ3hCLG9CQUFvQjtBQUFBLEVBQ3BCLDBCQUEwQjtBQUFBLEVBRTFCLGNBQWM7QUFBQSxFQUNkLG9CQUFvQjtBQUFBLEVBRXBCLGdCQUFnQjtBQUFBLEVBQ2hCLHNCQUFzQjtBQUFBLEVBRXRCLFVBQVU7QUFBQSxFQUNWLGdCQUFnQjtBQUFBLEVBQ2hCLFFBQVE7QUFBQTtBQUFBLEVBR1IsT0FBTztBQUNUOzs7QUVyUkEsSUFBQUksbUJBQStCO0FBRS9CLElBQUFDLG1CQUFlO0FBQ2YsSUFBQUMsZUFBa0M7QUFRbEMsZUFBc0IsaUJBQ3BCLGFBQ0EsUUFDZTtBQUNmLFFBQU0saUJBQUFDLFFBQUcsVUFBVSxPQUFPLFFBQVE7QUFFbEMsUUFBTSxhQUF1QixDQUFDO0FBQzlCLGFBQVcsS0FBSyxNQUFNLDRCQUE0QixNQUFNLENBQUM7QUFDekQsYUFBVyxLQUFLLE1BQU0sMEJBQTBCLGFBQWEsTUFBTSxDQUFDO0FBQ3BFLGFBQVcsS0FBSyxNQUFNLDRCQUE0QixNQUFNLENBQUM7QUFFekQsUUFBTSxnQkFBZ0IsTUFBTSx5QkFBeUIsWUFBWSxNQUFNO0FBQ3ZFLFFBQU0sa0JBQWtCLGVBQWUsTUFBTTtBQUMvQztBQUVBLGVBQWUsNEJBQ2IsUUFDaUI7QUFDakIsUUFBTSxlQUFXLHNCQUFRLE9BQU8sVUFBVSxjQUFjO0FBQ3hELFFBQU1DLGdCQUFXLGlDQUFlLG1CQUFtQixNQUFNLENBQUM7QUFHMUQsUUFBTUEsVUFBUyxtQkFBbUIsUUFBVyxFQUFFLEtBQUssT0FBTyxPQUFPLENBQUM7QUFFbkUsUUFBTSxpQkFBQUQsUUFBRztBQUFBLElBQ1A7QUFBQSxJQUNBLENBQUMsdUJBQXVCLE1BQU1DLFVBQVMseUJBQXlCLENBQUMsRUFBRTtBQUFBLE1BQ2pFO0FBQUEsSUFDRixJQUFJO0FBQUEsRUFDTjtBQUVBLFNBQU87QUFDVDtBQUVBLGVBQWUsMEJBQ2IsYUFDQSxRQUNpQjtBQUNqQixRQUFNLGVBQVcsc0JBQVEsT0FBTyxVQUFVLFlBQVk7QUFDdEQsUUFBTSxTQUFTLFlBQ1osSUFBSSxDQUFDLFVBQVU7QUFDZCxVQUFNQyxRQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsT0FBTztBQUFBLE1BQ1AsTUFBTSxVQUFVLFNBQVMsT0FBTyxJQUFJLFVBQVU7QUFBQSxJQUNoRDtBQUNBLFdBQU8sU0FBU0EsS0FBSTtBQUFBLEVBQ3RCLENBQUMsRUFDQSxLQUFLO0FBRVIsUUFBTSxpQkFBQUYsUUFBRztBQUFBLElBQ1A7QUFBQSxJQUNBO0FBQUEsTUFDRTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEdBQUksT0FBTyxXQUFXLElBQUksQ0FBQyxTQUFTLElBQUk7QUFBQSxJQUMxQyxFQUFFLEtBQUssSUFBSSxJQUFJO0FBQUEsRUFDakI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxlQUFlLDRCQUNiLFFBQ2lCO0FBQ2pCLFFBQU0sZUFBVyxzQkFBUSxPQUFPLFVBQVUsY0FBYztBQUN4RCxRQUFNLFVBQVUsV0FBVyxNQUFNO0FBQ2pDLFFBQU0saUJBQUFBLFFBQUc7QUFBQSxJQUNQO0FBQUEsSUFDQTtBQUFBLE1BQ0U7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsR0FBRyxRQUFRLElBQUksQ0FBQyxXQUFXLFdBQVcsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUc7QUFBQSxNQUNwRTtBQUFBLElBQ0YsRUFBRSxLQUFLLElBQUksSUFBSTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsZUFBZSx5QkFDYixZQUNBLFFBQ2lCO0FBQ2pCLFFBQU0sTUFBTSxPQUFPO0FBQ25CLFFBQU0sZUFBVyxzQkFBUSxLQUFLLFVBQVU7QUFDeEMsUUFBTSxpQkFBQUEsUUFBRztBQUFBLElBQ1A7QUFBQSxJQUNBO0FBQUEsTUFDRTtBQUFBLE1BQ0E7QUFBQSxNQUNBLEdBQUcsV0FBVztBQUFBLFFBQ1osQ0FBQyxRQUFRLCtCQUEyQix1QkFBUyxLQUFLLEdBQUcsQ0FBQztBQUFBLE1BQ3hEO0FBQUEsSUFDRixFQUFFLEtBQUssSUFBSSxJQUFJO0FBQUEsRUFDakI7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxlQUFlLGtCQUNiLGVBQ0EsUUFDQTtBQUNBLFFBQU0sTUFBTSxPQUFPO0FBQ25CLFFBQU0saUJBQUFBLFFBQUc7QUFBQSxRQUNQLHNCQUFRLEtBQUssZUFBZTtBQUFBLElBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFpQmMsdUJBQVMsS0FBSyxPQUFPLElBQUksQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFNN0IsdUJBQVMsT0FBTyxNQUFNLE9BQU8sTUFBTSxDQUFDO0FBQUEscUJBQ2xDLHVCQUFTLE9BQU8sTUFBTSxPQUFPLE1BQU0sQ0FBQztBQUFBLG1CQUN0Qyx1QkFBUyxPQUFPLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFBQSxxQkFDbEMsdUJBQVMsT0FBTyxNQUFNLE9BQU8sTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FJOUMsdUJBQVMsS0FBSyxPQUFPLElBQUksQ0FBQztBQUFBLGFBQ3hCLHVCQUFTLEtBQUssYUFBYSxDQUFDO0FBQUE7QUFBQSxxQkFFcEIsdUJBQVMsS0FBSyxPQUFPLFVBQVUsQ0FBQztBQUFBO0FBQUEsRUFFL0M7QUFDRjs7O0FDaEpBLElBQUFHLG1CQUFlO0FBQ2YsSUFBQUMsZ0JBQXdCOzs7QUNOakIsSUFBTSx3QkFBTixNQUFNLHVCQUFzQjtBQUFBLEVBQ2pDLE9BQWUsa0JBQXNEO0FBQUEsSUFDbkUsZUFBZTtBQUFBLElBQ2YsY0FBYztBQUFBLElBQ2QsY0FBYztBQUFBLEVBQ2hCO0FBQUEsRUFFQTtBQUFBLEVBRUEsWUFBWSxLQUFjO0FBQ3hCLFFBQUksS0FBSztBQUNQLFlBQU0sV0FBVyxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLFFBQVEsS0FBSyxDQUFDO0FBQy9ELFdBQUssT0FBTyxTQUFTLE9BQWlDLENBQUMsTUFBTSxZQUFZO0FBQ3ZFLGNBQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLFFBQVEsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7QUFDckUsWUFBSTtBQUFLLGVBQUssR0FBRyxJQUFJO0FBQ3JCLGVBQU87QUFBQSxNQUNULEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDUCxPQUFPO0FBQ0wsV0FBSyxPQUFPLENBQUM7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxjQUE0QixXQUE0QztBQUMxRSxVQUFNLFNBQVMsS0FBSyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQ3hDLGNBQVUsUUFBUSxDQUFDLGFBQWE7QUFDOUIsVUFBSSxDQUFDLE9BQU8sU0FBUyxRQUFRO0FBQUcsZUFBTyxLQUFLLFFBQVE7QUFBQSxJQUN0RCxDQUFDO0FBQ0QsU0FBSyxLQUFLLFNBQVMsSUFBSTtBQUN2QixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsV0FBbUI7QUFDakIsVUFBTSxhQUFhLE9BQU8sUUFBUSxLQUFLLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU07QUFDOUQsWUFBTSxLQUFLLHVCQUFzQixnQkFBZ0IsQ0FBQyxLQUFLO0FBQ3ZELFlBQU0sS0FBSyx1QkFBc0IsZ0JBQWdCLENBQUMsS0FBSztBQUN2RCxhQUFPLEtBQUs7QUFBQSxJQUNkLENBQUM7QUFDRCxXQUFPLFdBQVcsSUFBSSxDQUFDLFVBQVUsTUFBTSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSTtBQUFBLEVBQ3hFO0FBQ0Y7OztBQ3ZDTyxTQUFTLHlCQUNkLFNBQ1E7QUFDUixRQUFNLGVBQW1EO0FBQUEsSUFDdkQsY0FBYyxDQUFDO0FBQUEsSUFDZixnQkFBZ0IsQ0FBQztBQUFBLElBQ2pCLGNBQWMsQ0FBQztBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIsT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLElBQ1gsT0FBTztBQUFBO0FBQUEsSUFFUCxHQUFHO0FBQUEsRUFDTDtBQUNBLFNBQU8sS0FBSztBQUFBLElBQ1YsT0FBTyxRQUFRLFlBQVksRUFFeEIsSUFBdUIsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQ3hDLFVBQUksTUFBTSxRQUFRLEtBQUs7QUFBRyxlQUFPLENBQUMsS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBO0FBQzlDLGVBQU8sQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUN6QixDQUFDLEVBRUEsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUM1QztBQUNGO0FBRU8sU0FBUyw2QkFDZCxTQUM0QztBQUM1QyxTQUFPO0FBQUEsSUFDTCxTQUFTLFFBQVE7QUFBQSxJQUNqQixZQUFZLFFBQVE7QUFBQSxJQUNwQixtQkFBbUIsUUFBUTtBQUFBLElBQzNCLGVBQWUsUUFBUTtBQUFBLElBQ3ZCLGlCQUFpQixRQUFRO0FBQUEsSUFDekIsZUFBZSxRQUFRO0FBQUEsSUFDdkIsUUFBUSxRQUFRO0FBQUE7QUFBQSxJQUdoQiwwQkFBMEIsUUFBUTtBQUFBLElBQ2xDLE9BQU8sUUFBUTtBQUFBLEVBQ2pCO0FBQ0Y7OztBRjdCQSxlQUFzQixjQUNwQixVQUNBLFFBQ0EsUUFDZTtBQUNmLFFBQU0sTUFDSixPQUFPLFNBQVMsZUFDWixLQUFLLFVBQVUsUUFBUSxJQUN2QixLQUFLLFVBQVUsVUFBVSxNQUFNLENBQUM7QUFFdEMsUUFBTSxpQkFBQUMsUUFBRyxVQUFVLE9BQU8sTUFBTTtBQUNoQyxRQUFNLGlCQUFBQSxRQUFHLGNBQVUsdUJBQVEsT0FBTyxRQUFRLGVBQWUsR0FBRyxLQUFLLE9BQU87QUFFeEUsU0FBTyxhQUFhLFFBQVE7QUFBQSxJQUMxQixNQUFNO0FBQUEsSUFDTixVQUFVO0FBQUEsSUFDVixNQUFNO0FBQUEsSUFDTixvQkFBb0I7QUFBQSxJQUNwQixRQUFRO0FBQUEsRUFDVixDQUFDO0FBQ0g7QUFLQSxlQUFzQixpQkFDcEIsYUFDQSxhQUNBLFFBQ3dDO0FBQ3hDLFFBQU0sTUFBTSxNQUFNLGVBQWUsTUFBTTtBQUN2QyxNQUFJLElBQUksV0FBVztBQUNqQixVQUFNLE1BQU0seUNBQXlDO0FBQ3ZELE1BQUksSUFBSSxRQUFRO0FBQU0sVUFBTSxNQUFNLHNDQUFzQztBQUN4RSxNQUFJLElBQUksZUFBZTtBQUNyQixVQUFNLE1BQU0sNkNBQTZDO0FBRTNELFFBQU0sV0FBMEM7QUFBQSxJQUM5QyxrQkFBa0IsT0FBTztBQUFBLElBQ3pCLE1BQU0sSUFBSTtBQUFBLElBQ1YsWUFBWSxJQUFJO0FBQUEsSUFDaEIsU0FBUyxnQkFBZ0IsSUFBSSxPQUFPO0FBQUEsSUFDcEMsY0FBYyxPQUFPLFlBQVksWUFBWSxTQUFZLElBQUk7QUFBQSxJQUM3RCxHQUFHLE9BQU87QUFBQSxFQUNaO0FBRUEsaUJBQWUsVUFBVSxhQUFhLGFBQWEsTUFBTTtBQUV6RCxNQUFJLE9BQU8sWUFBWTtBQUFTLGtCQUFjLFVBQVUsTUFBTTtBQUM5RCxNQUFJLE9BQU8sWUFBWTtBQUFTLDBCQUFzQixVQUFVLE1BQU07QUFFdEUsU0FBTztBQUNUO0FBT0EsZUFBZSxlQUFlLFFBQXNDO0FBQ2xFLFNBQU8sTUFBTSxpQkFBQUEsUUFBRyxhQUFTLHVCQUFRLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDL0Q7QUFNQSxTQUFTLGdCQUFnQixhQUE2QjtBQUdwRCxRQUFNQyxXQUFVLHlEQUF5RDtBQUFBLElBQ3ZFO0FBQUEsRUFDRixJQUFJLENBQUM7QUFFTCxNQUFJQSxZQUFXO0FBQ2IsVUFBTTtBQUFBLE1BQ0oseUNBQXlDLFdBQVc7QUFBQSxJQUN0RDtBQUVGLFNBQU9BO0FBQ1Q7QUFFQSxTQUFTLGVBQ1AsVUFDQSxhQUNBLGFBQ0EsUUFDTTtBQUNOLFFBQU0sZ0JBQWdCLFlBQVksT0FFaEMsQ0FBQyxLQUFLLGVBQWU7QUFDckIsUUFBSSxXQUFXLElBQUksTUFBTSxDQUFDO0FBQzFCLFFBQUksV0FBVyxJQUFJLEdBQUcsS0FBSyxVQUFVO0FBQ3JDLFdBQU87QUFBQSxFQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsUUFBTSxhQUFhLGNBQWMsWUFBWSxJQUFJLENBQUM7QUFHbEQsUUFBTSxZQUFZLGNBQWMsV0FBVyxJQUFJLENBQUM7QUFDaEQsUUFBTSxpQkFBaUIsY0FBYyxnQkFBZ0I7QUFHckQsUUFBTSxXQUFXLGNBQWMsVUFBVSxJQUFJLENBQUM7QUFDOUMsUUFBTSxVQUFVLGNBQWMsU0FBUyxJQUFJLENBQUM7QUFDNUMsUUFBTSxTQUFTLGNBQWMsUUFBUSxJQUFJLENBQUM7QUFDMUMsUUFBTSxVQUFVLGNBQWMsU0FBUyxJQUFJLENBQUM7QUFHNUMsUUFBTSxRQUFRLGNBQWMsT0FBTyxJQUFJLENBQUM7QUFDeEMsUUFBTSxZQUFZLGNBQWMsU0FBUztBQUN6QyxRQUFNLGFBQWEsY0FBYyxXQUFXO0FBRTVDLE1BQUksWUFBWTtBQUNkLFVBQU0sU0FBUyx3QkFBd0IsWUFBWSxPQUFPLFFBQVEsS0FBSztBQUN2RSxRQUFJLFNBQVMscUJBQXFCLEdBQUc7QUFDbkMsZUFBUyxhQUFhO0FBQUEsUUFDcEIsTUFBTSxXQUFXLFFBQVE7QUFBQSxRQUN6QixnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0YsT0FBTztBQUNMLGVBQVMsYUFBYTtBQUFBLFFBQ3BCLFlBQVksV0FBVyxRQUFRO0FBQUEsUUFDL0IsU0FBUyxDQUFDLE1BQU07QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXO0FBQ2IsUUFBSSxPQUFPLFlBQVksV0FBVztBQUNoQyxhQUFPLE9BQU87QUFBQSxRQUNaO0FBQUEsTUFDRjtBQUFBLElBQ0YsT0FBTztBQUNMLGVBQVMseUJBQXlCLENBQUM7QUFFbkMsZUFBUyxxQkFBcUIsWUFBWTtBQUFBLFFBQ3hDO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUztBQUNYLFFBQUksT0FBTyxZQUFZLFdBQVc7QUFDaEMsYUFBTyxPQUFPO0FBQUEsUUFDWjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLE9BQU87QUFDTCxlQUFTLHlCQUF5QixDQUFDO0FBRW5DLGVBQVMscUJBQXFCLFVBQVU7QUFBQSxRQUN0QztBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1A7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFFBQVE7QUFDVixhQUFTLHlCQUF5QixDQUFDO0FBQ25DLGFBQVMscUJBQXFCLFNBQVM7QUFBQSxNQUNyQztBQUFBLE1BQ0EsT0FBTztBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksT0FBTztBQUNULFVBQU0sZ0JBQWdCO0FBQUEsTUFDcEI7QUFBQSxNQUNBLE9BQU87QUFBQSxNQUNQO0FBQUEsSUFDRjtBQUNBLFVBQU1DLFdBQW1DO0FBQUEsTUFDdkMsY0FBYyxNQUFNLFFBQVE7QUFBQSxNQUM1QixlQUFlLE1BQU0sUUFBUTtBQUFBLElBQy9CO0FBQ0EsUUFBSSxTQUFTLHFCQUFxQixHQUFHO0FBQ25DLGVBQVMsU0FBUztBQUFBLFFBQ2hCLEdBQUdBO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLE9BQU87QUFDTCxlQUFTLE1BQU0sUUFBUSxVQUFVLGdCQUFnQixJQUFJO0FBQUEsUUFDbkQsR0FBR0E7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxVQUFVO0FBQ1osYUFBUyxnQkFBZ0I7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsT0FBTztBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUztBQUNYLFVBQU0sT0FBTyx3QkFBd0IsU0FBUyxPQUFPLFFBQVEsT0FBTztBQUNwRSxhQUFTLGFBQWE7QUFBQSxNQUNwQixhQUFhLFFBQVEsUUFBUTtBQUFBLE1BQzdCLGVBQ0UsT0FBTyxZQUFZLFlBQVksUUFBUSxRQUFRLGVBQWU7QUFBQSxNQUNoRSxjQUNFLE9BQU8sWUFBWSxZQUFZLFFBQVEsUUFBUSxjQUFjO0FBQUEsTUFDL0Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksV0FBVyxRQUFRO0FBQ3JCLFFBQUksT0FBTyxZQUFZLFdBQVc7QUFDaEMsYUFBTyxPQUFPO0FBQUEsUUFDWjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLE9BQU87QUFFTCxlQUFTLFVBQVU7QUFBQSxRQUNqQixPQUFPLFVBQVU7QUFBQSxVQUFJLENBQUMsVUFDcEIsd0JBQXdCLE9BQU8sT0FBTyxRQUFRLE9BQU87QUFBQSxRQUN2RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksWUFBWSxRQUFRO0FBQ3RCLFVBQU0sbUJBQ0osV0FBVyxLQUFLLENBQUMsVUFBVSxNQUFNLFNBQVMsV0FBVyxLQUFLLFdBQVcsQ0FBQztBQUN4RSxVQUFNLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sWUFBWSxXQUFXO0FBQ2hDLGVBQVMsaUJBQWlCO0FBQUE7QUFBQTtBQUFBLFFBR3hCLGVBQWU7QUFBQSxNQUNqQjtBQUFBLElBQ0YsV0FBVyxPQUFPLG9CQUFvQixHQUFHO0FBRXZDLGVBQVMsYUFBYTtBQUFBLFFBQ3BCLGNBQWM7QUFBQSxNQUNoQjtBQUFBLElBQ0YsT0FBTztBQUNMLGFBQU8sT0FBTztBQUFBLFFBQ1o7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGdCQUFnQixRQUFRO0FBRzFCLFFBQUksT0FBTyxZQUFZLFdBQVcsT0FBTyxvQkFBb0IsR0FBRztBQUM5RCxZQUFNLGtCQUFrQixJQUFJLElBQVksU0FBUyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3ZFLHFCQUFlLFFBQVEsQ0FBQyxXQUFXO0FBQ2pDLGVBQU8sUUFBUSxRQUFRLFFBQVEsQ0FBQyxpQkFBaUI7QUFDL0MsMEJBQWdCLElBQUksWUFBWTtBQUFBLFFBQ2xDLENBQUM7QUFBQSxNQUNILENBQUM7QUFDRCxzQkFBZ0I7QUFBQSxRQUFRLENBQUMsZUFDdkIsa0JBQWtCLFVBQVUsVUFBVTtBQUFBLE1BQ3hDO0FBQUEsSUFDRixPQUFPO0FBQ0wsWUFBTSx1QkFBdUIsZUFBZSxPQUFPLENBQUMsS0FBSyxXQUFXO0FBQ2xFLGNBQU0sT0FBTyx5QkFBeUIsT0FBTyxPQUFPO0FBQ3BELFlBQUksSUFBSSxJQUFJLElBQUk7QUFBRyxjQUFJLElBQUksSUFBSSxHQUFHLEtBQUssTUFBTTtBQUFBO0FBQ3hDLGNBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzNCLGVBQU87QUFBQSxNQUNULEdBQUcsb0JBQUksSUFBdUMsQ0FBQztBQUUvQyxlQUFTLGtCQUFrQixNQUFNLEtBQUsscUJBQXFCLFFBQVEsQ0FBQyxFQUFFO0FBQUEsUUFDcEUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQUEsVUFDaEIsR0FBRyw2QkFBNkIsUUFBUSxDQUFDLEVBQUUsT0FBTztBQUFBO0FBQUE7QUFBQSxVQUdsRCxLQUFLLHlCQUF5QixTQUFTLFdBQVcsR0FBRyxLQUFLO0FBQUEsVUFDMUQsSUFBSSxRQUNEO0FBQUEsWUFBSSxDQUFDLFVBQ0osd0JBQXdCLE9BQU8sT0FBTyxRQUFRLEtBQUs7QUFBQSxVQUNyRCxFQUNDLEtBQUs7QUFBQSxRQUNWO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGNBQ1AsVUFDQSxRQUNNO0FBQ04sUUFBTSxhQUFhLFVBQVUsT0FBTyxRQUFRLFlBQVksRUFBRTtBQUMxRCxRQUFNLGFBQWEsT0FBTyxRQUFRLFVBQVU7QUFFNUMsTUFBSSxTQUFTLHFCQUFxQixHQUFHO0FBQ25DLHNCQUFrQixVQUFVLFVBQVU7QUFBQSxFQUN4QyxPQUFPO0FBQ0wsa0JBQWMsVUFBVSxVQUFVO0FBQUEsRUFDcEM7QUFFQSxRQUFNLE1BQU0sSUFBSTtBQUFBLElBQ2QsU0FBUyxxQkFBcUI7QUFBQTtBQUFBLE1BRTFCLFNBQVMseUJBQXlCLG1CQUNsQztBQUFBLFFBQ0EsU0FBUywyQkFDVDtBQUFBO0FBQUEsRUFDTjtBQUVBLE1BQUksT0FBTztBQUFRLFFBQUksSUFBSSxjQUFjLFVBQVU7QUFFbkQsTUFBSSxTQUFTLHFCQUFxQixHQUFHO0FBQ25DLGFBQVMsNEJBQTRCLENBQUM7QUFFdEMsYUFBUyx3QkFBd0Isa0JBQWtCLElBQUksU0FBUztBQUFBLEVBQ2xFLE9BQU87QUFDTCxhQUFTLDBCQUEwQixJQUFJLFNBQVM7QUFBQSxFQUNsRDtBQUNGO0FBRUEsU0FBUyxzQkFDUCxVQUNBLFFBQ0E7QUFFQSxnQkFBYyxVQUFVLE1BQU07QUFHOUIsTUFBSSxPQUFPLG9CQUFvQjtBQUFHLGtCQUFjLFVBQVUsV0FBVztBQUN2RTtBQU1PLFNBQVMseUJBQ2QsZ0JBQ0EsYUFDc0I7QUFDdEIsUUFBTSxNQUFnQixDQUFDO0FBRXZCLFFBQU0sWUFBWSxZQUFZLE1BQU0sUUFBUSxDQUFDLFNBQVMsS0FBSyxNQUFNO0FBRWpFLGlCQUFlLFFBQVEsQ0FBQyxXQUFXO0FBRWpDLFVBQU0sYUFBYSxVQUFVO0FBQUEsTUFDM0IsQ0FBQyxVQUFVLE1BQU0sYUFBYSxVQUFVLE9BQU8sSUFBSTtBQUFBLElBQ3JEO0FBQ0EsUUFBSTtBQUFZLFVBQUksS0FBSyxXQUFXLFFBQVE7QUFBQSxFQUM5QyxDQUFDO0FBRUQsTUFBSSxJQUFJLFNBQVM7QUFBRyxXQUFPO0FBQzNCLFNBQU87QUFDVDtBQUVBLFNBQVMsY0FDUCxVQUNBLFlBQ007QUFDTixXQUFTLGdCQUFnQixDQUFDO0FBQzFCLE1BQUksU0FBUyxZQUFZLFNBQVMsVUFBVTtBQUFHO0FBQy9DLFdBQVMsWUFBWSxLQUFLLFVBQVU7QUFDdEM7QUFFQSxTQUFTLGtCQUNQLFVBQ0EsZ0JBQ007QUFDTixXQUFTLHFCQUFxQixDQUFDO0FBQy9CLE1BQUksU0FBUyxpQkFBaUIsU0FBUyxjQUFjO0FBQUc7QUFDeEQsV0FBUyxpQkFBaUIsS0FBSyxjQUFjO0FBQy9DOzs7QUd2WUEsSUFBQUMscUJBQWU7QUFDZixJQUFBQyxRQUFzQjtBQUN0QixJQUFBQyxvQkFBZTs7O0FDQVIsU0FBUyxpQkFBaUIsYUFBOEM7QUFDN0UsUUFBTSxnQkFBZ0QsQ0FBQztBQUN2RCxRQUFNLFNBQTRCLENBQUM7QUFFbkMsYUFBVyxTQUFTLGFBQWE7QUFDL0IsVUFBTSxRQUFRLHdCQUF3QixNQUFNLElBQUk7QUFDaEQsUUFBSSxVQUFVLFlBQVk7QUFDeEIsYUFBTyxLQUFLLEtBQUs7QUFBQSxJQUNuQixPQUFPO0FBQ0wsVUFBSSxhQUFhLGNBQWMsS0FBSztBQUNwQyxVQUFJLGNBQWMsTUFBTTtBQUN0QixxQkFBYSxPQUFPLEtBQUssQ0FBQyxDQUFDLElBQUk7QUFDL0Isc0JBQWMsS0FBSyxJQUFJO0FBQUEsTUFDekI7QUFDQSxNQUFDLE9BQU8sVUFBVSxFQUFtQixLQUFLLEtBQUs7QUFBQSxJQUNqRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxJQUFNLDBCQUE2RDtBQUFBLEVBQ2pFLFNBQVM7QUFBQSxFQUVULE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGlCQUFpQjtBQUFBLEVBRWpCLFlBQVk7QUFBQSxFQUNaLGtCQUFrQjtBQUFBLEVBQ2xCLG1CQUFtQjtBQUNyQjs7O0FDN0NPLFNBQVMsZUFBZSxVQUEwQjtBQUN2RCxNQUFJLFdBQVc7QUFBSyxXQUFPLEdBQUcsUUFBUTtBQUN0QyxNQUFJLFdBQVc7QUFBTSxXQUFPLElBQUksV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQzFELE1BQUksV0FBVztBQUFNLFdBQU8sSUFBSSxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUM7QUFDMUQsU0FBTyxJQUFJLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQztBQUN2Qzs7O0FDTEEsSUFBQUMsZ0JBQXdDOzs7QUNBakMsU0FBUyxXQUNkLEtBQ0EsTUFDQSxNQUFNLEdBQ0E7QUFDTixNQUFJLEtBQUssV0FBVztBQUFHO0FBRXZCLFFBQU0sZUFBZSxLQUFLO0FBQUEsSUFDeEIsQ0FBQyxRQUFRLFFBQVE7QUFDZixlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxPQUFPLFFBQVEsSUFBSSxNQUFNLEdBQUcsS0FBSztBQUM1RCxlQUFPLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFBQSxNQUMxRDtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxPQUFPLE1BQU07QUFBQSxFQUN2QztBQUVBLE1BQUksTUFBTTtBQUNWLE9BQUssUUFBUSxDQUFDLEtBQUssTUFBTTtBQUN2QixRQUFJLFFBQVEsQ0FBQyxLQUFLLE1BQU07QUFDdEIsYUFBTyxJQUFJLE9BQU8sYUFBYSxDQUFDLEdBQUcsR0FBRztBQUN0QyxVQUFJLE1BQU0sSUFBSSxTQUFTO0FBQUcsZUFBTyxHQUFHLE9BQU8sS0FBSyxHQUFHO0FBQUEsSUFDckQsQ0FBQztBQUNELFFBQUksTUFBTSxLQUFLLFNBQVM7QUFBRyxhQUFPO0FBQUEsRUFDcEMsQ0FBQztBQUVELE1BQUksR0FBRztBQUNUOzs7QUR4QkEsd0JBQWU7QUFDZixJQUFBQyxvQkFBZTtBQUNmLHNCQUF5QjtBQUV6QixlQUFzQixrQkFDcEIsUUFDQSxRQUNBO0FBQ0EsUUFBTSxTQUFTO0FBQUEsSUFDYixHQUFHLE9BQU8sTUFBTSxRQUFRLENBQUMsU0FBUyxLQUFLLE1BQU07QUFBQSxJQUM3QyxHQUFHLE9BQU87QUFBQSxFQUNaLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUNmLFVBQU0sVUFBVSxtQkFBbUIsRUFBRSxRQUFRO0FBQzdDLFVBQU0sVUFBVSxtQkFBbUIsRUFBRSxRQUFRO0FBQzdDLFVBQU0sT0FBTyxVQUFVO0FBQ3ZCLFFBQUksU0FBUztBQUFHLGFBQU87QUFDdkIsV0FBTyxFQUFFLFNBQVMsY0FBYyxFQUFFLFFBQVE7QUFBQSxFQUM1QyxDQUFDO0FBRUQsTUFBSSxZQUFZO0FBRWhCLFFBQU0sWUFBd0IsTUFBTSxRQUFRO0FBQUEsSUFDMUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxNQUFNO0FBQzdCLFlBQU0sT0FBTztBQUFBLFlBQ1gsd0JBQVMsUUFBUSxJQUFJLEdBQUcsT0FBTyxNQUFNLElBQUksY0FBQUMsUUFBSztBQUFBLFFBQzlDLE1BQU07QUFBQSxNQUNSO0FBQ0EsWUFBTSxTQUFTLE1BQU0sT0FBTyxTQUFTLElBQUksbUJBQVM7QUFDbEQsWUFBTSxRQUFRLGNBQWMsTUFBTSxRQUFRO0FBQzFDLFlBQU0sUUFBUSxNQUFNLGtCQUFBQyxRQUFHLFVBQU0sdUJBQVEsT0FBTyxRQUFRLE1BQU0sUUFBUSxDQUFDO0FBQ25FLG1CQUFhLE1BQU07QUFDbkIsWUFBTSxPQUFPLFdBQU8sMEJBQVMsTUFBTSxJQUFJLENBQUM7QUFDeEMsYUFBTztBQUFBLFFBQ0wsR0FBRyxrQkFBQUMsUUFBRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLGtCQUFBQSxRQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUFBLFFBQ3RELGtCQUFBQSxRQUFHLElBQUksSUFBSTtBQUFBLE1BQ2I7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsYUFBVyxPQUFPLE9BQU8sS0FBSyxTQUFTO0FBRXZDLFNBQU8sT0FBTztBQUFBLElBQ1osR0FBRyxrQkFBQUEsUUFBRyxLQUFLLG9CQUFlLENBQUMsSUFBSSxXQUFPLDBCQUFTLFNBQVMsQ0FBQyxDQUFDO0FBQUEsRUFDNUQ7QUFDRjtBQUVBLElBQU0sc0JBQXNCO0FBQzVCLElBQU0scUJBQTZDO0FBQUEsRUFDakQsaUJBQWlCO0FBQUEsRUFDakIsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUNWO0FBQ0EsU0FBUyxtQkFBbUIsVUFBa0I7QUFDNUMsU0FDRSxPQUFPLFFBQVEsa0JBQWtCLEVBQUU7QUFBQSxJQUFLLENBQUMsQ0FBQyxHQUFHLE1BQzNDLFNBQVMsU0FBUyxHQUFHO0FBQUEsRUFDdkIsSUFBSSxDQUFDLEtBQUs7QUFFZDtBQUVBLElBQU0sZ0JBQWdCLGtCQUFBQSxRQUFHO0FBQ3pCLElBQU0sZUFBeUQ7QUFBQSxFQUM3RCxXQUFXLGtCQUFBQSxRQUFHO0FBQUEsRUFDZCxTQUFTLGtCQUFBQSxRQUFHO0FBQUEsRUFDWixRQUFRLGtCQUFBQSxRQUFHO0FBQUEsRUFDWCxPQUFPLGtCQUFBQSxRQUFHO0FBQ1o7QUFDQSxTQUFTLGNBQWMsVUFBa0I7QUFDdkMsU0FDRSxPQUFPLFFBQVEsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxTQUFTLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUN4RTtBQUVKOzs7QUh0REEsZUFBc0IsY0FDcEIsUUFDc0I7QUFDdEIsUUFBTSxPQUFPLE9BQU8sWUFBWSxVQUFVLGtCQUFrQjtBQUM1RCxRQUFNLFNBQVMsR0FBRyxPQUFPLE9BQU8sTUFBTSxPQUFPLGVBQWU7QUFDNUQsU0FBTyxPQUFPO0FBQUEsSUFDWixHQUFHLElBQUksSUFBSSxtQkFBQUMsUUFBRyxLQUFLLE1BQU0sQ0FBQyxRQUFRLG1CQUFBQSxRQUFHLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxtQkFBQUEsUUFBRztBQUFBLE1BQ2hFLFFBQWEsYUFBTztBQUFBLElBQ3RCLENBQUM7QUFBQSxFQUNIO0FBQ0EsUUFBTSxZQUFZLEtBQUssSUFBSTtBQUczQixRQUFNLGtCQUFBQyxRQUFHLEdBQUcsT0FBTyxRQUFRLEVBQUUsV0FBVyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQzNELFFBQU0sa0JBQUFBLFFBQUcsVUFBVSxPQUFPLE1BQU07QUFFaEMsUUFBTSxjQUFjLE1BQU0sZ0JBQWdCLE1BQU07QUFDaEQsUUFBTSxTQUFTLGlCQUFpQixXQUFXO0FBQzNDLFFBQU0sRUFBRSxPQUFPLElBQUksTUFBTSxRQUFRLFFBQVEsTUFBTTtBQUcvQyxTQUFPLE9BQU87QUFBQSxJQUNaLHNCQUFzQixlQUFlLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUFBLEVBQzlEO0FBQ0EsUUFBTSxrQkFBa0IsUUFBUSxNQUFNO0FBRXRDLFNBQU87QUFDVDtBQVlBLGVBQXNCLFFBQ3BCLFFBQ0Esa0JBQ0EsaUJBQWdEO0FBQUEsRUFDOUMsT0FBTyxDQUFDO0FBQUEsRUFDUixjQUFjLENBQUM7QUFDakIsR0FDMkU7QUFFM0UsUUFBTSxpQkFBaUIsTUFBTSxnQkFBZ0IsTUFBTTtBQUNuRCxRQUFNLGlCQUFpQixnQkFBZ0IsTUFBTTtBQUc3QyxRQUFNLFlBQVksTUFBTSxpQkFBaUIsa0JBQWtCLE1BQU07QUFDakUsUUFBTSxlQUE4QztBQUFBLElBQ2xELE9BQU8sQ0FBQyxHQUFHLGVBQWUsT0FBTyxHQUFHLFVBQVUsS0FBSztBQUFBLElBQ25ELGNBQWMsQ0FBQyxHQUFHLGVBQWUsY0FBYyxHQUFHLFVBQVUsWUFBWTtBQUFBLEVBQzFFO0FBRUEsUUFBTSxjQUFjLE1BQU07QUFBQSxJQUN4QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sY0FBMkI7QUFBQSxJQUMvQixVQUFVO0FBQUEsSUFDVixHQUFHO0FBQUEsRUFDTDtBQUdBLFFBQU0sY0FBYyxhQUFhLGFBQWEsTUFBTTtBQUVwRCxTQUFPO0FBQUEsSUFDTCxRQUFRO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixPQUFPLENBQUMsR0FBRyxlQUFlLE9BQU8sR0FBRyxZQUFZLEtBQUs7QUFBQSxNQUNyRCxjQUFjO0FBQUEsUUFDWixHQUFHLGVBQWU7QUFBQSxRQUNsQixHQUFHLFlBQVk7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxFQUNaO0FBQ0Y7OztBS25HQSxJQUFBQyxRQUFzQjs7O0FDTnRCLHNCQUFnQjtBQUtULFNBQVMsYUFDZCxXQUNBLFNBQ2lCO0FBQ2pCLFNBQU8sc0JBQXNCLFdBQVcsV0FBVyxPQUFPO0FBQzVEO0FBRUEsU0FBUyxzQkFDUCxNQUNBLFdBQ0EsU0FDaUI7QUFDakIsU0FBTyxJQUFJLFFBQVEsQ0FBQ0MsV0FBUyxXQUFXO0FBQ3RDLFFBQUksT0FBTztBQUNULGFBQU87QUFBQSxRQUNMLE1BQU0sb0NBQW9DLFNBQVMsSUFBSSxPQUFPLEVBQUU7QUFBQSxNQUNsRTtBQUNGLFVBQU0sU0FBUyxnQkFBQUMsUUFBSSxhQUFhO0FBRWhDLFdBQU8sT0FBTyxNQUFNLE1BQU07QUFDeEIsYUFBTyxLQUFLLFNBQVMsTUFBTUQsVUFBUSxJQUFJLENBQUM7QUFDeEMsYUFBTyxNQUFNO0FBQUEsSUFDZixDQUFDO0FBQ0QsV0FBTztBQUFBLE1BQUc7QUFBQSxNQUFTLE1BQ2pCQSxVQUFRLHNCQUFzQixPQUFPLEdBQUcsV0FBVyxPQUFPLENBQUM7QUFBQSxJQUM3RDtBQUFBLEVBQ0YsQ0FBQztBQUNIOzs7QUMxQk8sU0FBUyxxQkFBc0M7QUFDcEQsTUFBSTtBQUVKLFNBQU87QUFBQSxJQUNMLE1BQU0sWUFBWSxRQUFRO0FBQ3hCLFVBQUksT0FBTyxZQUFZLFVBQVU7QUFDL0IsZUFBTyxPQUFPLEtBQUssbUNBQW1DO0FBQ3REO0FBQUEsTUFDRjtBQUdBLFlBQU0sZUFBZSxNQUFNLE9BQU8scUJBQXFCO0FBQ3ZELG1CQUFhLGNBQWMsUUFBUSxDQUFDLEVBQUUsT0FBTyxLQUFLLEtBQUssTUFBTTtBQUMzRCxZQUFJLFNBQVM7QUFBaUIsaUJBQU8sT0FBTyxNQUFNLE1BQU0sR0FBRztBQUMzRCxZQUFJLFNBQVM7QUFBZ0IsaUJBQU8sT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNyRDtBQUVBLFlBQU0sZ0JBQWdCLE9BQU8sYUFBYTtBQUMxQyxZQUFNLGFBQWE7QUFBQSxRQUNqQixTQUFTLGVBQWU7QUFBQSxRQUN4QixVQUFVLGVBQWU7QUFBQSxRQUN6QixVQUFVLGVBQWU7QUFBQSxRQUN6QixHQUFJLE9BQU8sWUFBWSxZQUNuQjtBQUFBLFVBQ0UsU0FBUyxlQUFlLFVBQVU7QUFBQSxVQUNsQyxnQkFBZ0IsZUFBZTtBQUFBLFVBQy9CLE9BQU8sZUFBZTtBQUFBLFVBQ3RCLE1BQU0sZUFBZTtBQUFBLFFBQ3ZCLElBQ0E7QUFBQSxVQUNFLGdCQUFnQixlQUFlLFdBQVcsT0FBTyxPQUFPO0FBQUEsVUFDeEQsaUJBQWlCLGVBQWU7QUFBQSxVQUNoQyxNQUFNLGVBQWU7QUFBQSxRQUN2QjtBQUFBLE1BQ047QUFFQSxZQUFNLGNBQWM7QUFBQSxRQUNsQixHQUFHO0FBQUEsUUFDSCxRQUFRLE9BQU8sWUFBWSxZQUFZLG9CQUFvQjtBQUFBLFFBQzNELFdBQVcsT0FBTztBQUFBO0FBQUEsUUFFbEIsVUFBVTtBQUFBLFFBQ1YsU0FBUztBQUFBLE1BQ1g7QUFDQSxZQUFNLFVBQVU7QUFBQTtBQUFBLFFBRWQsbUJBQW1CO0FBQUEsTUFDckI7QUFDQSxhQUFPLE9BQU8sTUFBTSxtQkFBbUIsV0FBVztBQUNsRCxhQUFPLE9BQU8sTUFBTSxvQkFBb0IsT0FBTztBQUUvQyxZQUFNLFNBQVMsTUFBTSxPQUFPLFNBQVM7QUFDckMsZUFBUyxNQUFNLE9BQU8sUUFBUSxJQUFJLElBQUksYUFBYSxPQUFPO0FBQUEsSUFDNUQ7QUFBQSxJQUVBLE1BQU0sZUFBZTtBQUNuQixhQUFPLE1BQU0sUUFBUSxLQUFLO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQ0Y7QUFHQSxJQUFNLGlCQUFpQjtBQUN2QixJQUFNLGtCQUFrQjs7O0FGdER4QixlQUFzQixnQkFBcUM7QUFDekQsUUFBTSxPQUFPLE1BQU0sYUFBYSxLQUFNLElBQUk7QUFDMUMsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sU0FBUyxVQUFVLFFBQVEsSUFBSSxJQUFJO0FBQ3pDLFFBQU0sZUFBa0M7QUFBQSxJQUN0QyxRQUFRO0FBQUEsTUFDTjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEI7QUFDRjtBQUVBLGVBQXNCLFlBQ3BCLFlBQ0EsUUFDdUI7QUFDdkIsUUFBTSxTQUFTLG1CQUFtQjtBQUVsQyxRQUFNLGFBQWEsTUFBVztBQUFBLElBQ3ZCLGtCQUFZLFlBQVksT0FBTyxJQUFJO0FBQUEsRUFDMUM7QUFFQSxRQUFNLFFBQVEsWUFBWTtBQUN4QixVQUFNLFdBQVcsT0FBTyxPQUFPLElBQUk7QUFDbkMsV0FBTyxPQUFPLFFBQVEsd0JBQXdCLFdBQVcsTUFBTSxFQUFFO0FBRWpFLFdBQU8sZ0JBQWdCLE1BQU0sY0FBYyxNQUFNO0FBQ2pELFdBQU8sT0FBTyxLQUFLLG9CQUFvQjtBQUN2QyxVQUFNLE9BQU8sWUFBWSxNQUFNO0FBQy9CLFdBQU8sT0FBTyxRQUFRLFNBQVM7QUFBQSxFQUNqQztBQUVBLFFBQU0sa0JBQWtCLE1BQU07QUFDNUIsZUFBVyxHQUFHLEtBQUssc0JBQXNCO0FBQUEsRUFDM0M7QUFDQSxRQUFNLGFBQWEsQ0FBQ0UsVUFBaUI7QUFHbkMsZUFBVyxHQUFHLEtBQUssbUJBQW1CQSxLQUFJO0FBQUEsRUFDNUM7QUFDQSxRQUFNLHNCQUFzQixDQUFDLGtCQUEwQztBQUNyRSxlQUFXLEdBQUcsS0FBSyw2QkFBNkIsYUFBYTtBQUFBLEVBQy9EO0FBRUEsUUFBTSxTQUF1QjtBQUFBLElBQzNCLEdBQUc7QUFBQSxJQUNIO0FBQUEsSUFDQSxlQUFlO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixrQkFBa0I7QUFBQSxRQUNsQixNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsTUFDWDtBQUFBLE1BQ0EsY0FBYyxDQUFDO0FBQUEsTUFDZixPQUFPLENBQUM7QUFBQSxJQUNWO0FBQUEsSUFDQSxNQUFNLFdBQVc7QUFBQSxJQUNqQixVQUFVLFdBQVc7QUFBQSxJQUNyQixRQUFRLFdBQVc7QUFBQSxJQUNuQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUtPLFNBQVMscUJBQ2QsT0FDQSxRQUNBLFFBQ0E7QUFDQSxNQUFJLE9BQU8sb0JBQW9CLEdBQUc7QUFDaEMsVUFBTSxRQUFRLENBQUMsU0FBUztBQUN0QixZQUFNLFFBQVEsS0FBSztBQUNuQixVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxTQUFTO0FBQWtCO0FBRTdELFlBQU0sS0FBSyxDQUFDLHdCQUF3QixPQUFPLE9BQU8sUUFBUSxLQUFLLENBQUM7QUFDaEUsWUFBTSxNQUFNLHlCQUF5QixDQUFDLEtBQUssR0FBRyxPQUFPLGFBQWE7QUFFbEUsYUFBTyxvQkFBb0I7QUFBQSxRQUN6QixHQUFHLDZCQUE2QixNQUFNLE9BQU87QUFBQSxRQUM3QztBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNILE9BQU87QUFDTCxXQUFPLGdCQUFnQjtBQUFBLEVBQ3pCO0FBQ0Y7QUFFTyxTQUFTLGdCQUNkLFFBQ0EsUUFDQSxRQUNBO0FBQ0EsU0FBTyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVU7QUFDL0IsVUFBTUEsUUFBTyx3QkFBd0IsT0FBTyxPQUFPLFFBQVEsT0FBTztBQUNsRSxXQUFPLFdBQVdBLEtBQUk7QUFBQSxFQUN4QixDQUFDO0FBQ0g7OztBaEJuR0EsZUFBc0JDLE9BQU0sUUFBNEM7QUFDdEUsUUFBTSxpQkFBaUIsTUFBTSxrQkFBa0IsUUFBUSxPQUFPO0FBQzlELFNBQU8sTUFBTSxjQUFjLGNBQWM7QUFDM0M7QUFFQSxlQUFzQkMsY0FDcEIsUUFDdUI7QUFDdkIsUUFBTSxhQUFhLE1BQU0sY0FBYztBQUV2QyxRQUFNLDBCQUEwQixNQUFNO0FBQ3BDLFVBQU0sYUFBcUM7QUFBQSxNQUN6QyxXQUFXO0FBQUEsTUFDWCxRQUFRLFFBQVEsQ0FBQztBQUFBLElBQ25CO0FBQ0EsV0FBTyxrQkFBa0IsRUFBRSxHQUFHLFFBQVEsTUFBTSxXQUFXLEdBQUcsT0FBTztBQUFBLEVBQ25FO0FBRUEsTUFBSSxpQkFBaUIsTUFBTSx3QkFBd0I7QUFDbkQsUUFBTSxTQUFTLE1BQU0sWUFBWSxZQUFZLGNBQWM7QUFDM0QsaUJBQWUsU0FBUztBQUV4QixRQUFNLG1CQUFtQixJQUFJLHlCQUFNO0FBQ25DLFFBQU0sY0FBdUMsQ0FBQztBQUU5QyxTQUFPLEdBQUcsR0FBRyw4QkFBOEIsTUFBTTtBQUUvQyx5QkFBcUIsT0FBTyxjQUFjLE9BQU8sZ0JBQWdCLE1BQU07QUFBQSxFQUN6RSxDQUFDO0FBRUQsU0FBTyxRQUFRLEdBQUcsT0FBTyxPQUFPLE9BQU9DLE9BQU0sV0FBVztBQUN0RCxRQUFJQSxNQUFLLFdBQVcsZUFBZSxVQUFVO0FBQUc7QUFDaEQsZ0JBQVksS0FBSyxDQUFDLE9BQU9BLEtBQUksQ0FBQztBQUU5QixVQUFNLGlCQUFpQixhQUFhLFlBQVk7QUFDOUMsWUFBTSxjQUFjLFlBQVksT0FBTyxHQUFHLFlBQVksTUFBTTtBQUM1RCxZQUFNLFVBQVUsaUJBQWlCLGFBQWEsT0FBTyxhQUFhO0FBRWxFLFVBQUksUUFBUSxTQUFTO0FBQWE7QUFHbEMscUJBQWUsT0FBTztBQUFBLFFBQ3BCLFlBQVksTUFBTSxLQUFLLElBQUksSUFBSSxZQUFZLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNuRSxJQUFJLENBQUMsU0FBUyxtQkFBQUMsUUFBRyxRQUFJLDRCQUFTLGVBQWUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUN6RCxLQUFLLElBQUksQ0FBQztBQUFBLE1BQ2Y7QUFDQSxZQUFNLGVBQWUsUUFBUSxjQUMxQixLQUFLLEVBQ0wsSUFBSSxDQUFDLFVBQVU7QUFDZCxlQUFPLG1CQUFBQSxRQUFHO0FBQUEsY0FDUiw0QkFBUyxlQUFlLFFBQVEsd0JBQXdCLE9BQU8sRUFBRSxDQUFDO0FBQUEsUUFDcEU7QUFBQSxNQUNGLENBQUMsRUFDQSxLQUFLLG1CQUFBQSxRQUFHLElBQUksSUFBSSxDQUFDO0FBR3BCLHVCQUFpQixNQUFNLHdCQUF3QjtBQUMvQyxxQkFBZSxTQUFTO0FBQ3hCLFlBQU0sRUFBRSxRQUFRLFVBQVUsSUFBSSxNQUFNO0FBQUEsUUFDbEM7QUFBQTtBQUFBLFFBRUEsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLE1BQ1Y7QUFDQSxhQUFPLGdCQUFnQjtBQUd2QixjQUFRLFFBQVEsTUFBTTtBQUFBLFFBQ3BCLEtBQUs7QUFDSCxpQkFBTyxnQkFBZ0I7QUFDdkI7QUFBQSxRQUNGLEtBQUs7QUFDSCwwQkFBZ0IsUUFBUSxlQUFlLFFBQVEsY0FBYztBQUM3RDtBQUFBLFFBQ0YsS0FBSztBQUNILCtCQUFxQixRQUFRLGNBQWMsZ0JBQWdCLE1BQU07QUFDakU7QUFBQSxNQUNKO0FBQ0EsOEJBQVEsUUFBUSxhQUFhLFlBQVksRUFBRTtBQUFBLElBQzdDLENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxTQUFPO0FBQ1Q7OztBbUI1R0EsSUFBQUMsa0JBQXdCOzs7QUNBeEIsSUFBQUMscUJBQWU7QUFFZixJQUFBQyxrQkFBd0I7QUFFakIsU0FBUyxjQUFjO0FBQzVCLFVBQVEsSUFBSTtBQUNaLDBCQUFRLElBQUksR0FBRyxtQkFBQUMsUUFBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLG1CQUFBQSxRQUFHLEtBQUssbUJBQUFBLFFBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzlEOzs7QURITyxTQUFTLGNBQ2QsSUFDQTtBQUNBLFNBQU8sVUFBVSxTQUFnQjtBQUMvQixVQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLFFBQUk7QUFDRixrQkFBWTtBQUVaLFlBQU0sVUFBVSxNQUFNLEdBQUcsR0FBRyxJQUFJO0FBRWhDLFVBQUksQ0FBQztBQUNILGdDQUFRO0FBQUEsVUFDTixlQUFlLGVBQWUsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDO0FBQUEsUUFDdkQ7QUFBQSxJQUNKLFNBQVMsS0FBSztBQUNaLDhCQUFRO0FBQUEsUUFDTix3QkFBd0IsZUFBZSxLQUFLLElBQUksSUFBSSxTQUFTLENBQUM7QUFBQSxNQUNoRTtBQUNBLDhCQUFRLE1BQU0sR0FBRztBQUNqQixjQUFRLEtBQUssQ0FBQztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUNGOzs7QUV2Qk8sSUFBTUMsU0FBUSxjQVduQixPQUFPLE1BQU0sVUFBVTtBQUN2QixRQUFNLE9BQU8sTUFBTSxRQUFRO0FBQzNCLFFBQU0sWUFBOEI7QUFBQSxJQUNsQztBQUFBLElBQ0E7QUFBQSxJQUNBLFNBQVMsTUFBTTtBQUFBLElBQ2YsaUJBQWlCLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQUEsSUFDakQsWUFBWSxNQUFNO0FBQUEsRUFDcEI7QUFFQSxRQUFVQSxPQUFNLFNBQVM7QUFDM0IsQ0FBQzs7O0FDdEJNLElBQU0sTUFBTSxjQVdqQixPQUFPLE1BQU0sVUFBVTtBQUN2QixRQUFNLE9BQU8sTUFBTSxRQUFRO0FBQzNCLFFBQU0sWUFBOEI7QUFBQSxJQUNsQztBQUFBLElBQ0E7QUFBQSxJQUNBLFNBQVMsTUFBTTtBQUFBLElBQ2YsaUJBQWlCLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQUEsSUFDakQsWUFBWSxNQUFNO0FBQUEsRUFDcEI7QUFFQSxRQUFNLFNBQVMsTUFBVUMsY0FBYSxTQUFTO0FBQy9DLFFBQU0sT0FBTyxNQUFNO0FBRW5CLFNBQU87QUFDVCxDQUFDOzs7QUM1QkQsSUFBQUMsa0JBQXdCO0FBR2pCLElBQU0sT0FBTyxjQUFvQyxPQUFPLGNBQWM7QUFDM0UsMEJBQVEsS0FBSywyQkFBMkI7QUFDMUMsQ0FBQzs7O0FDQ00sSUFBTSxVQUFVLGNBT3JCLE9BQU8sTUFBTSxVQUFVO0FBQ3ZCLFFBQU0sWUFBOEI7QUFBQSxJQUNsQztBQUFBLElBQ0EsWUFBWSxNQUFNO0FBQUEsRUFDcEI7QUFDQSxRQUFNLFNBQVMsTUFBTSxrQkFBa0IsV0FBVyxPQUFPO0FBRXpELFNBQU8sT0FBTyxLQUFLLHFCQUFxQjtBQUV4QyxRQUFNLGNBQWMsTUFBTSxnQkFBZ0IsTUFBTTtBQUNoRCxRQUFNLGlCQUFpQixhQUFhLE1BQU07QUFDNUMsQ0FBQzs7O0FDeEJELElBQUFDLGtCQUF3QjtBQUdqQixJQUFNLFVBQVU7QUFBQSxFQUNyQixPQUFPLE1BQVcsRUFBRSxRQUFRLFdBQVcsTUFBVztBQUNoRCw0QkFBUSxLQUFLLDhCQUE4QjtBQUFBLEVBQzdDO0FBQ0Y7OztBekNEQSxJQUFNLFVBQU0sV0FBQUMsU0FBSSxLQUFLO0FBQ3JCLElBQUksS0FBSztBQUNULElBQUksUUFBUSxPQUFPO0FBR25CLElBQ0csUUFBUSxVQUFVLGtCQUFrQixFQUNwQyxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBTyxxQkFBcUIsY0FBYyxFQUMxQyxPQUFPLDJCQUEyQixtQkFBbUIsRUFDckQsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQWdCLEdBQUc7QUFHdEIsSUFDRyxRQUFRLGdCQUFnQixzQkFBc0IsRUFDOUMsT0FBTyx1QkFBdUIsMkJBQTJCLEVBQ3pELE9BQU8scUJBQXFCLGNBQWMsRUFDMUMsT0FBTywyQkFBMkIsbUJBQW1CLEVBQ3JELE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFnQkMsTUFBSztBQUd4QixJQUNHLFFBQVEsa0JBQWtCLFNBQVMsRUFDbkMsT0FBTyx1QkFBdUIsMkJBQTJCLEVBQ3pELE9BQWdCLE9BQU87QUFHMUIsSUFBSSxRQUFRLGtCQUFrQixtQkFBbUIsRUFBRSxPQUFnQixPQUFPO0FBRzFFLElBQ0csUUFBUSxvQkFBb0IsMEJBQTBCLEVBQ3RELE9BQWdCLElBQUk7QUFFdkIsSUFBSSxNQUFNOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfbm9kZV9wYXRoIiwgInBhdGgiLCAiaXNPZmZsaW5lIiwgImRucyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImZzIiwgImltcG9ydF9wYXRoIiwgInVuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRocyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJnbG9iIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJwYXRoIiwgInVuaW1wb3J0IiwgImZzIiwgImNyZWF0ZUpJVEkiLCAidHJhbnNmb3JtIiwgImltcG9ydF9mYXN0X2dsb2IiLCAiZ2xvYiIsICJwYXRoIiwgInBpY29tYXRjaCIsICJmcyIsICJKU09ONSIsICJpbXBvcnRfdW5pbXBvcnQiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInVuaW1wb3J0IiwgInBhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInZlcnNpb24iLCAib3B0aW9ucyIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAicGF0aCIsICJmcyIsICJwYyIsICJwYyIsICJmcyIsICJ2aXRlIiwgInJlc29sdmUiLCAibmV0IiwgInBhdGgiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgInBhdGgiLCAicGMiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAiaW1wb3J0X2NvbnNvbGEiLCAicGMiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9jb25zb2xhIiwgImNhYyIsICJidWlsZCJdCn0K
|