@aws-cdk/toolkit-lib 1.26.1 → 1.27.0
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/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/validate/index.d.ts +29 -0
- package/lib/actions/validate/index.js +3 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +7 -0
- package/lib/api/bootstrap/bootstrap-props.js +1 -1
- package/lib/api/bootstrap/deploy-bootstrap.js +6 -2
- package/lib/api/deployments/cfn-api.js +21 -11
- package/lib/api/io/private/messages.d.ts +4 -0
- package/lib/api/io/private/messages.js +16 -1
- package/lib/api/io/toolkit-action.d.ts +1 -1
- package/lib/api/io/toolkit-action.js +1 -1
- package/lib/toolkit/toolkit.d.ts +8 -0
- package/lib/toolkit/toolkit.js +102 -55
- package/package.json +10 -10
package/lib/toolkit/toolkit.js
CHANGED
|
@@ -116,6 +116,7 @@ const util_1 = require("../util");
|
|
|
116
116
|
const concurrency_1 = require("../util/concurrency");
|
|
117
117
|
const glob_matcher_1 = require("../util/glob-matcher");
|
|
118
118
|
const promises_1 = require("../util/promises");
|
|
119
|
+
const POLICY_VALIDATION_REPORT_FILE = 'validation-report.json';
|
|
119
120
|
/**
|
|
120
121
|
* The AWS CDK Programmatic Toolkit
|
|
121
122
|
*/
|
|
@@ -581,16 +582,40 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
581
582
|
}
|
|
582
583
|
}
|
|
583
584
|
/**
|
|
584
|
-
*
|
|
585
|
+
* Validate Action
|
|
585
586
|
*
|
|
586
|
-
*
|
|
587
|
+
* Synthesizes the CDK app and reads the policy validation report
|
|
588
|
+
* from the cloud assembly output directory.
|
|
587
589
|
*/
|
|
588
|
-
async
|
|
590
|
+
async validate(cx, options = {}) {
|
|
589
591
|
const env_7 = { stack: [], error: void 0, hasError: false };
|
|
590
592
|
try {
|
|
591
|
-
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, '
|
|
592
|
-
const
|
|
593
|
-
|
|
593
|
+
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'validate');
|
|
594
|
+
const selectStacks = stacksOpt(options);
|
|
595
|
+
const assembly = __addDisposableResource(env_7, await synthAndMeasure(ioHelper, cx, selectStacks), true);
|
|
596
|
+
const reportPath = path.join(assembly.directory, POLICY_VALIDATION_REPORT_FILE);
|
|
597
|
+
if (!await fs.pathExists(reportPath)) {
|
|
598
|
+
const result = {
|
|
599
|
+
conclusion: 'success',
|
|
600
|
+
pluginReports: [],
|
|
601
|
+
};
|
|
602
|
+
await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9601.msg('No validation plugins configured. Add a plugin to your CDK app to enable validation.'));
|
|
603
|
+
return result;
|
|
604
|
+
}
|
|
605
|
+
const report = cloud_assembly_schema_1.Manifest.loadValidationReport(reportPath);
|
|
606
|
+
const conclusion = report.pluginReports.some((pr) => pr.conclusion === 'failure') ? 'failure' : 'success';
|
|
607
|
+
const result = {
|
|
608
|
+
conclusion,
|
|
609
|
+
title: report.title,
|
|
610
|
+
pluginReports: report.pluginReports,
|
|
611
|
+
};
|
|
612
|
+
if (conclusion === 'failure') {
|
|
613
|
+
await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E9600.msg('❌ cdk validate found problems', result));
|
|
614
|
+
}
|
|
615
|
+
else {
|
|
616
|
+
await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9600.msg('✅ No problems found', result));
|
|
617
|
+
}
|
|
618
|
+
return result;
|
|
594
619
|
}
|
|
595
620
|
catch (e_7) {
|
|
596
621
|
env_7.error = e_7;
|
|
@@ -602,6 +627,28 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
602
627
|
await result_7;
|
|
603
628
|
}
|
|
604
629
|
}
|
|
630
|
+
/**
|
|
631
|
+
* Deploy Action
|
|
632
|
+
*
|
|
633
|
+
* Deploys the selected stacks into an AWS account
|
|
634
|
+
*/
|
|
635
|
+
async deploy(cx, options = {}) {
|
|
636
|
+
const env_8 = { stack: [], error: void 0, hasError: false };
|
|
637
|
+
try {
|
|
638
|
+
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'deploy');
|
|
639
|
+
const assembly = __addDisposableResource(env_8, await synthAndMeasure(ioHelper, cx, stacksOpt(options)), true);
|
|
640
|
+
return await this._deploy(assembly, 'deploy', assembly.synthDuration, options);
|
|
641
|
+
}
|
|
642
|
+
catch (e_8) {
|
|
643
|
+
env_8.error = e_8;
|
|
644
|
+
env_8.hasError = true;
|
|
645
|
+
}
|
|
646
|
+
finally {
|
|
647
|
+
const result_8 = __disposeResources(env_8);
|
|
648
|
+
if (result_8)
|
|
649
|
+
await result_8;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
605
652
|
/**
|
|
606
653
|
* Helper to allow deploy being called as part of the watch action.
|
|
607
654
|
*/
|
|
@@ -909,10 +956,10 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
909
956
|
* This function returns immediately, starting a watcher in the background.
|
|
910
957
|
*/
|
|
911
958
|
async watch(cx, options = {}) {
|
|
912
|
-
const
|
|
959
|
+
const env_9 = { stack: [], error: void 0, hasError: false };
|
|
913
960
|
try {
|
|
914
961
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'watch');
|
|
915
|
-
const assembly = __addDisposableResource(
|
|
962
|
+
const assembly = __addDisposableResource(env_9, await (0, private_1.assemblyFromSource)(ioHelper, cx, false), true);
|
|
916
963
|
const rootDir = options.watchDir ?? process.cwd();
|
|
917
964
|
// For the "include" setting, the behavior is:
|
|
918
965
|
// 1. "watch" setting without an "include" key? We default to observing "**".
|
|
@@ -1024,14 +1071,14 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1024
1071
|
},
|
|
1025
1072
|
};
|
|
1026
1073
|
}
|
|
1027
|
-
catch (
|
|
1028
|
-
|
|
1029
|
-
|
|
1074
|
+
catch (e_9) {
|
|
1075
|
+
env_9.error = e_9;
|
|
1076
|
+
env_9.hasError = true;
|
|
1030
1077
|
}
|
|
1031
1078
|
finally {
|
|
1032
|
-
const
|
|
1033
|
-
if (
|
|
1034
|
-
await
|
|
1079
|
+
const result_9 = __disposeResources(env_9);
|
|
1080
|
+
if (result_9)
|
|
1081
|
+
await result_9;
|
|
1035
1082
|
}
|
|
1036
1083
|
}
|
|
1037
1084
|
/**
|
|
@@ -1040,20 +1087,20 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1040
1087
|
* Rolls back the selected stacks.
|
|
1041
1088
|
*/
|
|
1042
1089
|
async rollback(cx, options = {}) {
|
|
1043
|
-
const
|
|
1090
|
+
const env_10 = { stack: [], error: void 0, hasError: false };
|
|
1044
1091
|
try {
|
|
1045
1092
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'rollback');
|
|
1046
|
-
const assembly = __addDisposableResource(
|
|
1093
|
+
const assembly = __addDisposableResource(env_10, await synthAndMeasure(ioHelper, cx, stacksOpt(options)), true);
|
|
1047
1094
|
return await this._rollback(assembly, 'rollback', options);
|
|
1048
1095
|
}
|
|
1049
|
-
catch (
|
|
1050
|
-
|
|
1051
|
-
|
|
1096
|
+
catch (e_10) {
|
|
1097
|
+
env_10.error = e_10;
|
|
1098
|
+
env_10.hasError = true;
|
|
1052
1099
|
}
|
|
1053
1100
|
finally {
|
|
1054
|
-
const
|
|
1055
|
-
if (
|
|
1056
|
-
await
|
|
1101
|
+
const result_10 = __disposeResources(env_10);
|
|
1102
|
+
if (result_10)
|
|
1103
|
+
await result_10;
|
|
1057
1104
|
}
|
|
1058
1105
|
}
|
|
1059
1106
|
/**
|
|
@@ -1116,14 +1163,14 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1116
1163
|
* Orphan Action. Detaches resources from a CloudFormation stack without deleting them.
|
|
1117
1164
|
*/
|
|
1118
1165
|
async orphan(cx, options) {
|
|
1119
|
-
const
|
|
1166
|
+
const env_11 = { stack: [], error: void 0, hasError: false };
|
|
1120
1167
|
try {
|
|
1121
1168
|
this.requireUnstableFeature('orphan');
|
|
1122
1169
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'orphan');
|
|
1123
1170
|
// Parse construct paths into stack construct ID + construct-level paths.
|
|
1124
1171
|
const parsed = (0, helpers_1.parseAndValidateConstructPaths)(options.constructPaths);
|
|
1125
1172
|
// Synth all stacks, then find the one whose hierarchicalId matches the stack construct ID.
|
|
1126
|
-
const assembly = __addDisposableResource(
|
|
1173
|
+
const assembly = __addDisposableResource(env_11, await synthAndMeasure(ioHelper, cx, private_6.ALL_STACKS), true);
|
|
1127
1174
|
const allStacks = await assembly.selectStacksV2(private_6.ALL_STACKS);
|
|
1128
1175
|
const stack = allStacks.stackArtifacts.find(s => s.hierarchicalId === parsed.stackId);
|
|
1129
1176
|
if (!stack) {
|
|
@@ -1161,35 +1208,35 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1161
1208
|
' 1. Update your CDK code to use the new resource type\n' +
|
|
1162
1209
|
` 2. cdk import${mappingJson}`);
|
|
1163
1210
|
}
|
|
1164
|
-
catch (
|
|
1165
|
-
|
|
1166
|
-
|
|
1211
|
+
catch (e_11) {
|
|
1212
|
+
env_11.error = e_11;
|
|
1213
|
+
env_11.hasError = true;
|
|
1167
1214
|
}
|
|
1168
1215
|
finally {
|
|
1169
|
-
const
|
|
1170
|
-
if (
|
|
1171
|
-
await
|
|
1216
|
+
const result_11 = __disposeResources(env_11);
|
|
1217
|
+
if (result_11)
|
|
1218
|
+
await result_11;
|
|
1172
1219
|
}
|
|
1173
1220
|
}
|
|
1174
1221
|
/**
|
|
1175
1222
|
* Refactor Action. Moves resources from one location (stack + logical ID) to another.
|
|
1176
1223
|
*/
|
|
1177
1224
|
async refactor(cx, options = {}) {
|
|
1178
|
-
const
|
|
1225
|
+
const env_12 = { stack: [], error: void 0, hasError: false };
|
|
1179
1226
|
try {
|
|
1180
1227
|
this.requireUnstableFeature('refactor');
|
|
1181
1228
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'refactor');
|
|
1182
|
-
const assembly = __addDisposableResource(
|
|
1229
|
+
const assembly = __addDisposableResource(env_12, await synthAndMeasure(ioHelper, cx, stacksOpt(options)), true);
|
|
1183
1230
|
return await this._refactor(assembly, ioHelper, cx, options);
|
|
1184
1231
|
}
|
|
1185
|
-
catch (
|
|
1186
|
-
|
|
1187
|
-
|
|
1232
|
+
catch (e_12) {
|
|
1233
|
+
env_12.error = e_12;
|
|
1234
|
+
env_12.hasError = true;
|
|
1188
1235
|
}
|
|
1189
1236
|
finally {
|
|
1190
|
-
const
|
|
1191
|
-
if (
|
|
1192
|
-
await
|
|
1237
|
+
const result_12 = __disposeResources(env_12);
|
|
1238
|
+
if (result_12)
|
|
1239
|
+
await result_12;
|
|
1193
1240
|
}
|
|
1194
1241
|
}
|
|
1195
1242
|
async _refactor(assembly, ioHelper, cx, options = {}) {
|
|
@@ -1328,20 +1375,20 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1328
1375
|
* Destroys the selected Stacks.
|
|
1329
1376
|
*/
|
|
1330
1377
|
async destroy(cx, options = {}) {
|
|
1331
|
-
const
|
|
1378
|
+
const env_13 = { stack: [], error: void 0, hasError: false };
|
|
1332
1379
|
try {
|
|
1333
1380
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'destroy');
|
|
1334
|
-
const assembly = __addDisposableResource(
|
|
1381
|
+
const assembly = __addDisposableResource(env_13, await synthAndMeasure(ioHelper, cx, stacksOpt(options)), true);
|
|
1335
1382
|
return await this._destroy(assembly, 'destroy', options);
|
|
1336
1383
|
}
|
|
1337
|
-
catch (
|
|
1338
|
-
|
|
1339
|
-
|
|
1384
|
+
catch (e_13) {
|
|
1385
|
+
env_13.error = e_13;
|
|
1386
|
+
env_13.hasError = true;
|
|
1340
1387
|
}
|
|
1341
1388
|
finally {
|
|
1342
|
-
const
|
|
1343
|
-
if (
|
|
1344
|
-
await
|
|
1389
|
+
const result_13 = __disposeResources(env_13);
|
|
1390
|
+
if (result_13)
|
|
1391
|
+
await result_13;
|
|
1345
1392
|
}
|
|
1346
1393
|
}
|
|
1347
1394
|
/**
|
|
@@ -1454,11 +1501,11 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1454
1501
|
* Retrieve feature flag information from the cloud assembly
|
|
1455
1502
|
*/
|
|
1456
1503
|
async flags(cx) {
|
|
1457
|
-
const
|
|
1504
|
+
const env_14 = { stack: [], error: void 0, hasError: false };
|
|
1458
1505
|
try {
|
|
1459
1506
|
this.requireUnstableFeature('flags');
|
|
1460
1507
|
const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'flags');
|
|
1461
|
-
const assembly = __addDisposableResource(
|
|
1508
|
+
const assembly = __addDisposableResource(env_14, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
1462
1509
|
const artifacts = Object.values(assembly.cloudAssembly.manifest.artifacts ?? {});
|
|
1463
1510
|
const featureFlagReports = artifacts.filter(a => a.type === cloud_assembly_schema_1.ArtifactType.FEATURE_FLAG_REPORT);
|
|
1464
1511
|
const flags = featureFlagReports.flatMap(report => {
|
|
@@ -1488,14 +1535,14 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
|
|
|
1488
1535
|
});
|
|
1489
1536
|
return flags;
|
|
1490
1537
|
}
|
|
1491
|
-
catch (
|
|
1492
|
-
|
|
1493
|
-
|
|
1538
|
+
catch (e_14) {
|
|
1539
|
+
env_14.error = e_14;
|
|
1540
|
+
env_14.hasError = true;
|
|
1494
1541
|
}
|
|
1495
1542
|
finally {
|
|
1496
|
-
const
|
|
1497
|
-
if (
|
|
1498
|
-
await
|
|
1543
|
+
const result_14 = __disposeResources(env_14);
|
|
1544
|
+
if (result_14)
|
|
1545
|
+
await result_14;
|
|
1499
1546
|
}
|
|
1500
1547
|
}
|
|
1501
1548
|
requireUnstableFeature(requestedFeature) {
|
|
@@ -1564,4 +1611,4 @@ async function synthAndMeasure(ioHelper, cx, selectStacks) {
|
|
|
1564
1611
|
function zeroTime() {
|
|
1565
1612
|
return { asMs: 0, asSec: 0 };
|
|
1566
1613
|
}
|
|
1567
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMscURBQXFEO0FBRXJELDBFQUE4RDtBQUU5RCwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLG9EQUE2RDtBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxtQkFBTSxDQUFDLEdBQUcsRUFBRSxtQkFBTSxDQUFDLE9BQU8sRUFBRSxtQkFBTSxDQUFDLE1BQU0sRUFBRSxtQkFBTSxDQUFDLE1BQU0sRUFBRSxtQkFBTSxDQUFDLFVBQVUsQ0FBVSxDQUFDO0FBRzNHOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBZ0I7SUFDbkMsT0FBUSxXQUFpQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBQ0QsK0JBQStCO0FBQy9CLHVFQUFpRTtBQUVqRSx1Q0FBK0M7QUFDL0MsbURBQStDO0FBUS9DLG9EQUF1RDtBQUN2RCw4Q0FBdUU7QUFDdkUsdURBU21DO0FBSW5DLHFEQUFvRTtBQVNwRSw2RUFBd0U7QUFDeEUsc0RBQWtFO0FBQ2xFLGdDQUEyQztBQUMzQyw4Q0FLeUI7QUFDekIseUVBQXNFO0FBQ3RFLHFEQUF1RTtBQUN2RSxnREFBZ0Q7QUFFaEQsMERBQW9GO0FBRXBGLDJEQUEyRDtBQUMzRCxpRkFBa0Y7QUFDbEYseUVBQWtGO0FBRWxGLG9EQUFpRDtBQUNqRCxpRkFBa0Y7QUFDbEYsdUVBQWlGO0FBQ2pGLHNDQUE0QztBQUM1Qyx3Q0FBZ0Q7QUFDaEQsa0VBQThEO0FBRzlELCtDQUE2RztBQUM3RyxzREFBeUY7QUFDekYscURBQTBEO0FBQzFELDJEQUErRTtBQUMvRSwwQ0FBaUQ7QUFDakQsb0RBSzRCO0FBRTVCLHNFQUFz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Li9wcml2YXRlL2Rpc3Bvc2UtcG9seWZpbGwnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdSZXBvcnRQcm9wZXJ0aWVzIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IEFydGlmYWN0VHlwZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlRGlmZiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IHsgdHlwZSBFdmVudE5hbWUsIEVWRU5UUyB9IGZyb20gJ2Nob2tpZGFyL2hhbmRsZXIuanMnO1xuXG4vKipcbiAqIEZpbGUgZXZlbnRzIHRoYXQgd2UgY2FyZSBhYm91dCBmcm9tIGNob2tpZGFyLlxuICogSW4gY2hva2lkYXIgdjQsIEV2ZW50TmFtZSBpbmNsdWRlcyBhZGRpdGlvbmFsIGV2ZW50cyBsaWtlICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJ1xuICogdGhhdCB3ZSBuZWVkIHRvIGZpbHRlciBvdXQgaW4gdGhlICdhbGwnIGhhbmRsZXIuXG4gKi9cbmNvbnN0IEZJTEVfRVZFTlRTID0gW0VWRU5UUy5BREQsIEVWRU5UUy5BRERfRElSLCBFVkVOVFMuQ0hBTkdFLCBFVkVOVFMuVU5MSU5LLCBFVkVOVFMuVU5MSU5LX0RJUl0gYXMgY29uc3Q7XG50eXBlIEZpbGVFdmVudCA9IHR5cGVvZiBGSUxFX0VWRU5UU1tudW1iZXJdO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gZXZlbnQgaXMgYSBmaWxlIGV2ZW50IHdlIHNob3VsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBpc0ZpbGVFdmVudChldmVudDogRXZlbnROYW1lKTogZXZlbnQgaXMgRmlsZUV2ZW50IHtcbiAgcmV0dXJuIChGSUxFX0VWRU5UUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoZXZlbnQpO1xufVxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgTm9uSW50ZXJhY3RpdmVJb0hvc3QgfSBmcm9tICcuL25vbi1pbnRlcmFjdGl2ZS1pby1ob3N0JztcbmltcG9ydCB0eXBlIHsgVG9vbGtpdFNlcnZpY2VzIH0gZnJvbSAnLi9wcml2YXRlJztcbmltcG9ydCB7IGFzc2VtYmx5RnJvbVNvdXJjZSB9IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuL3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3lSZXN1bHQsIERlc3Ryb3lSZXN1bHQsIEZlYXR1cmVGbGFnLCBSb2xsYmFja1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICBCb290c3RyYXBFbnZpcm9ubWVudHMsXG4gIEJvb3RzdHJhcE9wdGlvbnMsXG4gIEJvb3RzdHJhcFJlc3VsdCxcbiAgRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQsXG59IGZyb20gJy4uL2FjdGlvbnMvYm9vdHN0cmFwJztcbmltcG9ydCB7IEJvb3RzdHJhcFNvdXJjZSB9IGZyb20gJy4uL2FjdGlvbnMvYm9vdHN0cmFwJztcbmltcG9ydCB7IEFzc2V0QnVpbGRUaW1lLCB0eXBlIERlcGxveU9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveSc7XG5pbXBvcnQge1xuICBidWlsZFBhcmFtZXRlck1hcCxcbiAgaXNDaGFuZ2VTZXREZXBsb3ltZW50LFxuICBpc0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50LFxuICBpc0V4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzTm9uRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudCxcbiAgdHlwZSBQcml2YXRlRGVwbG95T3B0aW9ucyxcbiAgcmVtb3ZlUHVibGlzaGVkQXNzZXRzRnJvbVdvcmtHcmFwaCxcbiAgdG9FeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudCxcbn0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3kvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIERlc3Ryb3lPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXN0cm95JztcbmltcG9ydCB0eXBlIHsgRGlhZ25vc2VkU3RhY2ssIERpYWdub3NlT3B0aW9ucywgRGlhZ25vc2VSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL2RpYWdub3NlJztcbmltcG9ydCB0eXBlIHsgRGlmZk9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RpZmYnO1xuaW1wb3J0IHsgYXBwZW5kT2JqZWN0LCBwcmVwYXJlRGlmZiB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRHJpZnRPcHRpb25zLCBEcmlmdFJlc3VsdCB9IGZyb20gJy4uL2FjdGlvbnMvZHJpZnQnO1xuaW1wb3J0IHsgdHlwZSBMaXN0T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvbGlzdCc7XG5pbXBvcnQgdHlwZSB7IE9ycGhhbk9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL29ycGhhbic7XG5pbXBvcnQgdHlwZSB7IFB1Ymxpc2hBc3NldHNPcHRpb25zLCBQdWJsaXNoQXNzZXRzUmVzdWx0IH0gZnJvbSAnLi4vYWN0aW9ucy9wdWJsaXNoLWFzc2V0cyc7XG5pbXBvcnQgdHlwZSB7IFJlZmFjdG9yT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvcmVmYWN0b3InO1xuaW1wb3J0IHsgdHlwZSBSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JvbGxiYWNrJztcbmltcG9ydCB7IHR5cGUgU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9zeW50aCc7XG5pbXBvcnQgdHlwZSB7IElXYXRjaGVyLCBXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3dhdGNoJztcbmltcG9ydCB7IGNvdW50QXNzZW1ibHlSZXN1bHRzIH0gZnJvbSAnLi9wcml2YXRlL2NvdW50LWFzc2VtYmx5LXJlc3VsdHMnO1xuaW1wb3J0IHsgV0FUQ0hfRVhDTFVERV9ERUZBVUxUUyB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gvcHJpdmF0ZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudEFjY2VzcyB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQge1xuICBCYXNlQ3JlZGVudGlhbHMsXG4gIHR5cGUgSUJhc2VDcmVkZW50aWFsc1Byb3ZpZGVyLFxuICB0eXBlIFNka0Jhc2VDbGllbnRDb25maWcsXG4gIHR5cGUgU2RrQ29uZmlnLFxufSBmcm9tICcuLi9hcGkvYXdzLWF1dGgnO1xuaW1wb3J0IHsgc2RrUmVxdWVzdEhhbmRsZXIgfSBmcm9tICcuLi9hcGkvYXdzLWF1dGgvYXdzY2xpLWNvbXBhdGlibGUnO1xuaW1wb3J0IHsgSW9Ib3N0U2RrTG9nZ2VyLCBTZGtQcm92aWRlciB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB7IEJvb3RzdHJhcHBlciB9IGZyb20gJy4uL2FwaS9ib290c3RyYXAnO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgU3RhY2tTZWxlY3RvciB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBDYWNoZWRDbG91ZEFzc2VtYmx5LCBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB0eXBlIHsgU3RhY2tBc3NlbWJseSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IEFMTF9TVEFDS1MgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgeyBBc3luY0Rpc3Bvc2FibGVCb3ggfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZS9kaXNwb3NhYmxlLWJveCc7XG5pbXBvcnQgeyBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9zb3VyY2UtYnVpbGRlcic7XG5pbXBvcnQgdHlwZSB7IFN0YWNrQ29sbGVjdGlvbiB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9zdGFjay1jb2xsZWN0aW9uJztcbmltcG9ydCB7IERlcGxveW1lbnRzIH0gZnJvbSAnLi4vYXBpL2RlcGxveW1lbnRzJztcbmltcG9ydCB7IGhvc3RNZXNzYWdlRnJvbURpYWdub3NpcyB9IGZyb20gJy4uL2FwaS9kaWFnbm9zaW5nL2RpYWdub3Npcy1mb3JtYXR0aW5nJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIgfSBmcm9tICcuLi9hcGkvZGlhZ25vc2luZy9zdGFjay1kaWFnbm9zZXInO1xuaW1wb3J0IHsgRGlmZkZvcm1hdHRlciB9IGZyb20gJy4uL2FwaS9kaWZmJztcbmltcG9ydCB7IGRldGVjdFN0YWNrRHJpZnQgfSBmcm9tICcuLi9hcGkvZHJpZnQnO1xuaW1wb3J0IHsgRHJpZnRGb3JtYXR0ZXIgfSBmcm9tICcuLi9hcGkvZHJpZnQvZHJpZnQtZm9ybWF0dGVyJztcbmltcG9ydCB0eXBlIHsgSUlvSG9zdCwgSW9NZXNzYWdlTGV2ZWwsIFRvb2xraXRBY3Rpb24gfSBmcm9tICcuLi9hcGkvaW8nO1xuaW1wb3J0IHR5cGUgeyBFbGFwc2VkVGltZSwgSW9IZWxwZXIgfSBmcm9tICcuLi9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc0lvSGVscGVyLCBJTywgU1BBTiwgd2l0aG91dENvbG9yLCB3aXRob3V0RW1vamlzLCB3aXRoVHJpbW1lZFdoaXRlc3BhY2UgfSBmcm9tICcuLi9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yLCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcyB9IGZyb20gJy4uL2FwaS9sb2dzLW1vbml0b3InO1xuaW1wb3J0IHsgUmVzb3VyY2VPcnBoYW5lciB9IGZyb20gJy4uL2FwaS9vcnBoYW4vb3JwaGFuZXInO1xuaW1wb3J0IHsgcGFyc2VBbmRWYWxpZGF0ZUNvbnN0cnVjdFBhdGhzIH0gZnJvbSAnLi4vYXBpL29ycGhhbi9wcml2YXRlL2hlbHBlcnMnO1xuaW1wb3J0IHsgTW9kZSwgUGx1Z2luSG9zdCB9IGZyb20gJy4uL2FwaS9wbHVnaW4nO1xuaW1wb3J0IHtcbiAgZm9ybWF0QW1iaWd1b3VzTWFwcGluZ3MsXG4gIGZvcm1hdEVudmlyb25tZW50U2VjdGlvbkhlYWRlcixcbiAgZm9ybWF0VHlwZWRNYXBwaW5ncyxcbiAgZ3JvdXBTdGFja3MsXG59IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZyc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuLi9hcGkvcmVmYWN0b3JpbmcvY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVzb3VyY2VNYXBwaW5nLCBSZXNvdXJjZUxvY2F0aW9uIH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFJlZmFjdG9yaW5nQ29udGV4dCB9IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZy9jb250ZXh0JztcbmltcG9ydCB7IGdlbmVyYXRlU3RhY2tEZWZpbml0aW9ucyB9IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZy9zdGFjay1kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBSZXNvdXJjZU1pZ3JhdG9yIH0gZnJvbSAnLi4vYXBpL3Jlc291cmNlLWltcG9ydCc7XG5pbXBvcnQgeyBTdGFja0FydGlmYWN0U291cmNlVHJhY2VyIH0gZnJvbSAnLi4vYXBpL3NvdXJjZS10cmFjaW5nL3ByaXZhdGUvc3RhY2stc291cmNlLXRyYWNpbmcnO1xuaW1wb3J0IHsgdGFnc0ZvclN0YWNrIH0gZnJvbSAnLi4vYXBpL3RhZ3MvcHJpdmF0ZSc7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSB9IGZyb20gJy4uL2FwaS90b29sa2l0LWluZm8nO1xuaW1wb3J0IHR5cGUgeyBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSwgQ29uY3VycmVuY3ksIFN0YWNrTm9kZSB9IGZyb20gJy4uL2FwaS93b3JrLWdyYXBoJztcbmltcG9ydCB7IFdvcmtHcmFwaCwgV29ya0dyYXBoQnVpbGRlciwgYnVpbGREZXN0cm95V29ya0dyYXBoIH0gZnJvbSAnLi4vYXBpL3dvcmstZ3JhcGgnO1xuaW1wb3J0IHR5cGUgeyBBc3NlbWJseURhdGEsIFJlZmFjdG9yUmVzdWx0LCBTdGFja0RldGFpbHMsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB9IGZyb20gJy4uL3BheWxvYWRzJztcbmltcG9ydCB7IFBlcm1pc3Npb25DaGFuZ2VUeXBlIH0gZnJvbSAnLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlLCBmb3JtYXRUaW1lLCBvYnNjdXJlVGVtcGxhdGUsIHNlcmlhbGl6ZVN0cnVjdHVyZSwgdmFsaWRhdGVTbnNUb3BpY0FybiB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcExpbWl0IH0gZnJvbSAnLi4vdXRpbC9jb25jdXJyZW5jeSc7XG5pbXBvcnQgeyBjcmVhdGVJZ25vcmVNYXRjaGVyIH0gZnJvbSAnLi4vdXRpbC9nbG9iLW1hdGNoZXInO1xuaW1wb3J0IHsgcHJvbWlzZVdpdGhSZXNvbHZlcnMgfSBmcm9tICcuLi91dGlsL3Byb21pc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IGltcGxlbWVudGF0aW9uLCBoYW5kbGluZyB0aGUgaW5saW5lIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBUb29sa2l0IGFuZCBhbiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIEFsbG93IGVtb2ppcyBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVtb2ppcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgQU5TSSBjb2xvcnMgYW5kIGZvcm1hdHRpbmcgaW4gSW9Ib3N0IG1lc3NhZ2VzLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBlbmZvcmNlcyB0aGF0IG5vIGNvbG9yIG9yIHN0eWxlIHNob3dzIHVwXG4gICAqIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgaXMgYSBuby1vcDsgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZXRlY3RzIGNvbG9yIGZyb20gdGhlIFRUWSBzdGF0dXMgb2YgdGhlIElvSG9zdFxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBTREsuXG4gICAqL1xuICByZWFkb25seSBzZGtDb25maWc/OiBTZGtDb25maWc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2sgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDREtUb29sa2l0XCJcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWwgQ2xvdWQgQXNzZW1ibGllc1xuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIHJlYWRvbmx5IGFzc2VtYmx5RmFpbHVyZUF0PzogJ2Vycm9yJyB8ICd3YXJuJyB8ICdub25lJztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBob3N0IHRvIHVzZSBmb3IgbG9hZGluZyBhbmQgcXVlcnlpbmcgcGx1Z2luc1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIHVuaXF1ZSBpbnN0YW5jZSBvZiBhIHBsdWdpbiBtYW5hZ2luZyBjbGFzcyB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFVzZSBgdG9vbGtpdC5wbHVnaW5Ib3N0LmxvYWQoKWAgdG8gbG9hZCBwbHVnaW5zIGludG8gdGhlIHBsdWdpbiBob3N0IGZyb20gZGlzay5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIGZyZXNoIHBsdWdpbiBob3N0XG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ib3N0PzogUGx1Z2luSG9zdDtcblxuICAvKipcbiAgICogU2V0IG9mIHVuc3RhYmxlIGZlYXR1cmVzIHRvIG9wdCBpbnRvLiBJZiB5b3UgYXJlIHVzaW5nIGFuIHVuc3RhYmxlIGZlYXR1cmUsXG4gICAqIHlvdSBtdXN0IGV4cGxpY2l0bHkgYWNrbm93bGVkZ2UgdGhhdCB5b3UgYXJlIGF3YXJlIG9mIHRoZSByaXNrcyBvZiB1c2luZyBpdCxcbiAgICogYnkgcGFzc2luZyBpdCBpbiB0aGlzIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHVuc3RhYmxlRmVhdHVyZXM/OiBBcnJheTxVbnN0YWJsZUZlYXR1cmU+O1xufVxuXG4vKipcbiAqIE5hbWVzIG9mIHRvb2xraXQgZmVhdHVyZXMgdGhhdCBhcmUgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQsIGFuZCBtYXkgY2hhbmdlIGluXG4gKiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgdHlwZSBVbnN0YWJsZUZlYXR1cmUgPSAncmVmYWN0b3InIHwgJ29ycGhhbicgfCAnZmxhZ3MnIHwgJ3B1Ymxpc2gtYXNzZXRzJyB8ICdkaWFnbm9zZSc7XG5cbi8qKlxuICogVGhlIEFXUyBDREsgUHJvZ3JhbW1hdGljIFRvb2xraXRcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2xraXQgZXh0ZW5kcyBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB7XG4gIC8qKlxuICAgKiBUaGUgdG9vbGtpdCBzdGFjayBuYW1lIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElvSG9zdCBvZiB0aGlzIFRvb2xraXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpb0hvc3Q6IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaG9zdCBmb3IgbG9hZGluZyBhbmQgbWFuYWdpbmcgcGx1Z2luc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbkhvc3Q6IFBsdWdpbkhvc3Q7XG5cbiAgLyoqXG4gICAqIENhY2hlIG9mIHRoZSBpbnRlcm5hbCBTREsgUHJvdmlkZXIgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgc2RrUHJvdmlkZXJDYWNoZT86IFNka1Byb3ZpZGVyO1xuXG4gIHByaXZhdGUgYmFzZUNyZWRlbnRpYWxzOiBJQmFzZUNyZWRlbnRpYWxzUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB1bnN0YWJsZUZlYXR1cmVzOiBBcnJheTxVbnN0YWJsZUZlYXR1cmU+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBUb29sa2l0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRvb2xraXRTdGFja05hbWUgPSBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuXG4gICAgdGhpcy5wbHVnaW5Ib3N0ID0gcHJvcHMucGx1Z2luSG9zdCA/PyBuZXcgUGx1Z2luSG9zdCgpO1xuXG4gICAgbGV0IGlvSG9zdCA9IHByb3BzLmlvSG9zdCA/PyBuZXcgTm9uSW50ZXJhY3RpdmVJb0hvc3QoKTtcbiAgICBpZiAocHJvcHMuZW1vamlzID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dEVtb2ppcyhpb0hvc3QpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuY29sb3IgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0Q29sb3IoaW9Ib3N0KTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgZW1vamlzIGFuZCBjb2xvciwgd2UgbWlnaHQgZW5kIHVwIHdpdGggZmxvYXRpbmcgd2hpdGVzcGFjZSBhdCBlaXRoZXIgZW5kIG9mIHRoZSBtZXNzYWdlXG4gICAgLy8gVGhpcyBhbHNvIHJlbW92ZXMgbmV3bGluZXMgdGhhdCB3ZSBjdXJyZW50bHkgZW1pdCBmb3IgQ0xJIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHRoaXMuaW9Ib3N0ID0gd2l0aFRyaW1tZWRXaGl0ZXNwYWNlKGlvSG9zdCk7XG5cbiAgICB0aGlzLmJhc2VDcmVkZW50aWFscyA9IHByb3BzLnNka0NvbmZpZz8uYmFzZUNyZWRlbnRpYWxzID8/IEJhc2VDcmVkZW50aWFscy5hd3NDbGlDb21wYXRpYmxlKCk7XG4gICAgdGhpcy51bnN0YWJsZUZlYXR1cmVzID0gcHJvcHMudW5zdGFibGVGZWF0dXJlcyA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gdGhlIEFXUyBTREtcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2RrUHJvdmlkZXIoYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxTZGtQcm92aWRlcj4ge1xuICAgIC8vIEB0b2RvIHRoaXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50IGluc3RhbmNlIHBlciBhY3Rpb25cbiAgICBpZiAoIXRoaXMuc2RrUHJvdmlkZXJDYWNoZSkge1xuICAgICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgICAgY29uc3QgY2xpZW50Q29uZmlnOiBTZGtCYXNlQ2xpZW50Q29uZmlnID0ge1xuICAgICAgICByZXF1ZXN0SGFuZGxlcjogc2RrUmVxdWVzdEhhbmRsZXIodGhpcy5wcm9wcy5zZGtDb25maWc/Lmh0dHBPcHRpb25zPy5hZ2VudCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmJhc2VDcmVkZW50aWFscy5zZGtCYXNlQ29uZmlnKGlvSGVscGVyLCBjbGllbnRDb25maWcpO1xuICAgICAgdGhpcy5zZGtQcm92aWRlckNhY2hlID0gbmV3IFNka1Byb3ZpZGVyKGNvbmZpZy5jcmVkZW50aWFsUHJvdmlkZXIsIGNvbmZpZy5kZWZhdWx0UmVnaW9uLCB7XG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICBsb2dnZXI6IG5ldyBJb0hvc3RTZGtMb2dnZXIoaW9IZWxwZXIpLFxuICAgICAgICBwbHVnaW5Ib3N0OiB0aGlzLnBsdWdpbkhvc3QsXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiBjbGllbnRDb25maWcucmVxdWVzdEhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZGtQcm92aWRlckNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBwcm92aWRlIHRoZSBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB3aXRoIHJlcXVpcmVkIHRvb2xraXQgc2VydmljZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc291cmNlQnVpbGRlclNlcnZpY2VzKCk6IFByb21pc2U8VG9vbGtpdFNlcnZpY2VzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnYXNzZW1ibHknKSxcbiAgICAgIHNka1Byb3ZpZGVyOiBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdhc3NlbWJseScpLFxuICAgICAgcGx1Z2luSG9zdDogdGhpcy5wbHVnaW5Ib3N0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJvb3RzdHJhcChlbnZpcm9ubWVudHM6IEJvb3RzdHJhcEVudmlyb25tZW50cywgb3B0aW9uczogQm9vdHN0cmFwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxCb290c3RyYXBSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEVudmlyb25tZW50Qm9vdHN0cmFwUmVzdWx0W10gPSBbXTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHModGhpcy5pb0hvc3QpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IEJvb3RzdHJhcFNvdXJjZS5kZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBib290c3RyYXBwZXIgPSBuZXcgQm9vdHN0cmFwcGVyKHNvdXJjZSwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG5cbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdCgyMCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICBhd2FpdCBQcm9taXNlLmFsbChib290c3RyYXBFbnZpcm9ubWVudHMubWFwKChlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsIGN1cnJlbnRJZHgpID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uQk9PVFNUUkFQX1NJTkdMRSlcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9OiBib290c3RyYXBwaW5nLi4uYCwge1xuICAgICAgICAgIHRvdGFsOiBib290c3RyYXBFbnZpcm9ubWVudHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnRJZHggKyAxLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwUmVzdWx0ID0gYXdhaXQgYm9vdHN0cmFwcGVyLmJvb3RzdHJhcEVudmlyb25tZW50KFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIHNka1Byb3ZpZGVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGJvb3RzdHJhcFJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5OTAwLm1zZyhjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCB7IGVudmlyb25tZW50IH0pKTtcbiAgICAgICAgY29uc3QgZW52VGltZSA9IGF3YWl0IGJvb3RzdHJhcFNwYW4uZW5kKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQgPSB7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc3RhdHVzOiBib290c3RyYXBSZXN1bHQubm9PcCA/ICduby1vcCcgOiAnc3VjY2VzcycsXG4gICAgICAgICAgZHVyYXRpb246IGVudlRpbWUuYXNNcyxcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U5OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ib2xkKGVudmlyb25tZW50Lm5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnRzOiByZXN1bHRzLFxuICAgICAgZHVyYXRpb246IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCBBY3Rpb25cbiAgICpcbiAgICogVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgYENhY2hlZENsb3VkQXNzZW1ibHlgIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgZGlzcG9zZSgpYCBvblxuICAgKiBpdCBhZnRlciB1c2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3ludGgoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBTeW50aE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkQ2xvdWRBc3NlbWJseT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IG5ldyBBc3luY0Rpc3Bvc2FibGVCb3goYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKSk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkudmFsdWUuc2VsZWN0U3RhY2tzVjIoc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICBjb25zdCBhdXRvVmFsaWRhdGVTdGFja3MgPSBvcHRpb25zLnZhbGlkYXRlU3RhY2tzID8gW2Fzc2VtYmx5LnZhbHVlLnNlbGVjdFN0YWNrc0ZvclZhbGlkYXRpb24oKV0gOiBbXTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzLmNvbmNhdCguLi5hdXRvVmFsaWRhdGVTdGFja3MpLCBpb0hlbHBlcik7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgc2luZ2xlIHN0YWNrLCBwcmludCBpdCB0byBTVERPVVRcbiAgICBjb25zdCBtZXNzYWdlID0gYFN1Y2Nlc3NmdWxseSBzeW50aGVzaXplZCB0byAke2NoYWxrLmJsdWUocGF0aC5yZXNvbHZlKHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnkpKX1gO1xuICAgIGNvbnN0IGFzc2VtYmx5RGF0YTogQXNzZW1ibHlEYXRhID0ge1xuICAgICAgYXNzZW1ibHlEaXJlY3Rvcnk6IHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnksXG4gICAgICBzdGFja3NDb3VudDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICBzdGFja0lkczogc3RhY2tzLmhpZXJhcmNoaWNhbElkcyxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdFN0YWNrID0gc3RhY2tzLmZpcnN0U3RhY2shO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmaXJzdFN0YWNrLnRlbXBsYXRlO1xuICAgICAgY29uc3Qgb2JzY3VyZWRUZW1wbGF0ZSA9IG9ic2N1cmVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTE5MDEubXNnKG1lc3NhZ2UsIHtcbiAgICAgICAgLi4uYXNzZW1ibHlEYXRhLFxuICAgICAgICBzdGFjazoge1xuICAgICAgICAgIHN0YWNrTmFtZTogZmlyc3RTdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgaGllcmFyY2hpY2FsSWQ6IGZpcnN0U3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgc3RyaW5naWZpZWRKc29uOiBzZXJpYWxpemVTdHJ1Y3R1cmUob2JzY3VyZWRUZW1wbGF0ZSwgdHJ1ZSksXG4gICAgICAgICAgc3RyaW5naWZpZWRZYW1sOiBzZXJpYWxpemVTdHJ1Y3R1cmUob2JzY3VyZWRUZW1wbGF0ZSwgZmFsc2UpLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3Qgb3V0cHV0dGluZyB0ZW1wbGF0ZSB0byBzdGRvdXQsIGxldCdzIGV4cGxhaW4gdGhpbmdzIHRvIHRoZSB1c2VyIGEgbGl0dGxlIGJpdC4uLlxuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0kxOTAyLm1zZyhjaGFsay5ncmVlbihtZXNzYWdlKSwgYXNzZW1ibHlEYXRhKSk7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBTdXBwbHkgYSBzdGFjayBpZCAoJHtzdGFja3Muc3RhY2tBcnRpZmFjdHMubWFwKChzKSA9PiBjaGFsay5ncmVlbihzLmhpZXJhcmNoaWNhbElkKSkuam9pbignLCAnKX0pIHRvIGRpc3BsYXkgaXRzIHRlbXBsYXRlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ2FjaGVkQ2xvdWRBc3NlbWJseShhc3NlbWJseS50YWtlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZmYgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlmZihjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERpZmZPcHRpb25zID0ge30pOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IFRlbXBsYXRlRGlmZiB9PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGlmZicpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IGRpZmZTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRJRkZfU1RBQ0spLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdkaWZmJyk7XG5cbiAgICBjb25zdCBzdHJpY3QgPSAhIW9wdGlvbnMuc3RyaWN0O1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IG9wdGlvbnMuY29udGV4dExpbmVzIHx8IDM7XG5cbiAgICBsZXQgZGlmZnMgPSAwO1xuICAgIGxldCBzZWN1cml0eURpZmZzID0gMDtcblxuICAgIGNvbnN0IHRlbXBsYXRlSW5mb3MgPSBhd2FpdCBwcmVwYXJlRGlmZihkaWZmU3Bhbi5hc0hlbHBlciwgc3RhY2tzLCBkZXBsb3ltZW50cywgYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGlmZicpLCBvcHRpb25zKTtcbiAgICBjb25zdCB0ZW1wbGF0ZURpZmZzOiB7IFtuYW1lOiBzdHJpbmddOiBUZW1wbGF0ZURpZmYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGVJbmZvIG9mIHRlbXBsYXRlSW5mb3MpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEaWZmRm9ybWF0dGVyKHsgdGVtcGxhdGVJbmZvIH0pO1xuICAgICAgY29uc3Qgc3RhY2tEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFN0YWNrRGlmZih7IHN0cmljdCwgY29udGV4dExpbmVzIH0pO1xuXG4gICAgICAvLyBTZWN1cml0eSBEaWZmXG4gICAgICBjb25zdCBzZWN1cml0eURpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U2VjdXJpdHlEaWZmKCk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRTZWN1cml0eURpZmYgPSBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUgIT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUgPyBzdGFja0RpZmYuZm9ybWF0dGVkRGlmZiA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFdlIG9ubHkgd2FybiBhYm91dCBCUk9BREVOSU5HIGNoYW5nZXNcbiAgICAgIGlmIChzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUgPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORykge1xuICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9ICdUaGlzIGRlcGxveW1lbnQgd2lsbCBtYWtlIHBvdGVudGlhbGx5IHNlbnNpdGl2ZSBjaGFuZ2VzIGFjY29yZGluZyB0byB5b3VyIGN1cnJlbnQgc2VjdXJpdHkgYXBwcm92YWwgbGV2ZWwuXFxuUGxlYXNlIGNvbmZpcm0geW91IGludGVuZCB0byBtYWtlIHRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9uczpcXG4nO1xuICAgICAgICBhd2FpdCBkaWZmU3Bhbi5kZWZhdWx0cy53YXJuKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgICAgYXdhaXQgZGlmZlNwYW4uZGVmYXVsdHMuaW5mbyhzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZik7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YWNrIERpZmZcbiAgICAgIGRpZmZzICs9IHN0YWNrRGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIHNlY3VyaXR5RGlmZnMgKz0gc2VjdXJpdHlEaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgYXBwZW5kT2JqZWN0KHRlbXBsYXRlRGlmZnMsIGZvcm1hdHRlci5kaWZmcyk7XG4gICAgICBhd2FpdCBkaWZmU3Bhbi5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTQwMDIubXNnKHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmLCB7XG4gICAgICAgIHN0YWNrOiB0ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUsXG4gICAgICAgIGRpZmZzOiBmb3JtYXR0ZXIuZGlmZnMsXG4gICAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBzdGFja0RpZmYubnVtU3RhY2tzV2l0aENoYW5nZXMsXG4gICAgICAgIG51bVN0YWNrc1dpdGhTZWN1cml0eUNoYW5nZXM6IHNlY3VyaXR5RGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcyxcbiAgICAgICAgcGVybWlzc2lvbkNoYW5nZXM6IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSxcbiAgICAgICAgZm9ybWF0dGVkRGlmZjoge1xuICAgICAgICAgIGRpZmY6IHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmLFxuICAgICAgICAgIHNlY3VyaXR5OiBmb3JtYXR0ZWRTZWN1cml0eURpZmYsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGlmZlNwYW4uZW5kKGDinKggTnVtYmVyIG9mIHN0YWNrcyB3aXRoIGRpZmZlcmVuY2VzOiAke2RpZmZzfWAsIHtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBkaWZmcyxcbiAgICAgIG51bVN0YWNrc1dpdGhTZWN1cml0eUNoYW5nZXM6IHNlY3VyaXR5RGlmZnMsXG4gICAgICBkaWZmczogdGVtcGxhdGVEaWZmcyxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZW1wbGF0ZURpZmZzO1xuICB9XG5cbiAgLyoqXG4gICAqIERyaWZ0IEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRyaWZ0KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRHJpZnRPcHRpb25zID0ge30pOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IERyaWZ0UmVzdWx0IH0+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkcmlmdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgZHJpZnRTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRSSUZUX0FQUCkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBhbGxEcmlmdFJlc3VsdHM6IHsgW25hbWU6IHN0cmluZ106IERyaWZ0UmVzdWx0IH0gPSB7fTtcbiAgICBjb25zdCB1bmF2YWlsYWJsZURyaWZ0cyA9IFtdO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZHJpZnQnKTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzKSB7XG4gICAgICBjb25zdCBjZm4gPSAoYXdhaXQgc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQoc3RhY2suZW52aXJvbm1lbnQsIE1vZGUuRm9yUmVhZGluZykpLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgICAgY29uc3QgZHJpZnRSZXN1bHRzID0gYXdhaXQgZGV0ZWN0U3RhY2tEcmlmdChjZm4sIGRyaWZ0U3Bhbi5hc0hlbHBlciwgc3RhY2suc3RhY2tOYW1lKTtcblxuICAgICAgaWYgKCFkcmlmdFJlc3VsdHMuU3RhY2tSZXNvdXJjZURyaWZ0cykge1xuICAgICAgICBjb25zdCBzdGFja05hbWUgPSBzdGFjay5kaXNwbGF5TmFtZSA/PyBzdGFjay5zdGFja05hbWU7XG4gICAgICAgIHVuYXZhaWxhYmxlRHJpZnRzLnB1c2goc3RhY2tOYW1lKTtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNDU5MS5tc2coYCR7c3RhY2tOYW1lfTogTm8gZHJpZnQgcmVzdWx0cyBhdmFpbGFibGVgLCB7IHN0YWNrIH0pKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEcmlmdEZvcm1hdHRlcih7IHN0YWNrLCByZXNvdXJjZURyaWZ0czogZHJpZnRSZXN1bHRzLlN0YWNrUmVzb3VyY2VEcmlmdHMgfSk7XG4gICAgICBjb25zdCBkcmlmdE91dHB1dCA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RyaWZ0KCk7XG4gICAgICBjb25zdCBzdGFja0RyaWZ0ID0ge1xuICAgICAgICBudW1SZXNvdXJjZXNXaXRoRHJpZnQ6IGRyaWZ0T3V0cHV0Lm51bVJlc291cmNlc1dpdGhEcmlmdCxcbiAgICAgICAgbnVtUmVzb3VyY2VzVW5jaGVja2VkOiBkcmlmdE91dHB1dC5udW1SZXNvdXJjZXNVbmNoZWNrZWQsXG4gICAgICAgIGZvcm1hdHRlZERyaWZ0OiB7XG4gICAgICAgICAgdW5jaGFuZ2VkOiBkcmlmdE91dHB1dC51bmNoYW5nZWQsXG4gICAgICAgICAgdW5jaGVja2VkOiBkcmlmdE91dHB1dC51bmNoZWNrZWQsXG4gICAgICAgICAgbW9kaWZpZWQ6IGRyaWZ0T3V0cHV0Lm1vZGlmaWVkLFxuICAgICAgICAgIGRlbGV0ZWQ6IGRyaWZ0T3V0cHV0LmRlbGV0ZWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYWxsRHJpZnRSZXN1bHRzW2Zvcm1hdHRlci5zdGFja05hbWVdID0gc3RhY2tEcmlmdDtcblxuICAgICAgLy8gaGVhZGVyXG4gICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuaW5mbyhkcmlmdE91dHB1dC5zdGFja0hlYWRlcik7XG5cbiAgICAgIC8vIHByaW50IHRoZSBkaWZmZXJlbnQgc2VjdGlvbnMgYXQgZGlmZmVyZW50IGxldmVsc1xuICAgICAgaWYgKGRyaWZ0T3V0cHV0LnVuY2hhbmdlZCkge1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuZGVidWcoZHJpZnRPdXRwdXQudW5jaGFuZ2VkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmlmdE91dHB1dC51bmNoZWNrZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmRlYnVnKGRyaWZ0T3V0cHV0LnVuY2hlY2tlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZHJpZnRPdXRwdXQubW9kaWZpZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmluZm8oZHJpZnRPdXRwdXQubW9kaWZpZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWZ0T3V0cHV0LmRlbGV0ZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmluZm8oZHJpZnRPdXRwdXQuZGVsZXRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIG1haW4gc3RhY2sgcmVzdWx0XG4gICAgICBhd2FpdCBkcmlmdFNwYW4ubm90aWZ5KElPLkNES19UT09MS0lUX0k0NTkwLm1zZyhkcmlmdE91dHB1dC5zdW1tYXJ5LCB7XG4gICAgICAgIHN0YWNrLFxuICAgICAgICBkcmlmdDogc3RhY2tEcmlmdCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBwcmludCBzdW1tYXJ5XG4gICAgY29uc3QgdG90YWxEcmlmdHMgPSBPYmplY3QudmFsdWVzKGFsbERyaWZ0UmVzdWx0cykucmVkdWNlKCh0b3RhbCwgY3VycmVudCkgPT4gdG90YWwgKyAoY3VycmVudC5udW1SZXNvdXJjZXNXaXRoRHJpZnQgPz8gMCksIDApO1xuICAgIGNvbnN0IHRvdGFsVW5jaGVja2VkID0gT2JqZWN0LnZhbHVlcyhhbGxEcmlmdFJlc3VsdHMpLnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQubnVtUmVzb3VyY2VzVW5jaGVja2VkID8/IDApLCAwKTtcbiAgICBhd2FpdCBkcmlmdFNwYW4uZW5kKGBcXG7inKggIE51bWJlciBvZiByZXNvdXJjZXMgd2l0aCBkcmlmdDogJHt0b3RhbERyaWZ0c30ke3RvdGFsVW5jaGVja2VkID8gYCAoJHt0b3RhbFVuY2hlY2tlZH0gdW5jaGVja2VkKWAgOiAnJ31gKTtcbiAgICBpZiAodW5hdmFpbGFibGVEcmlmdHMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMud2FybihgXFxu4pqg77iPICBGYWlsZWQgdG8gY2hlY2sgZHJpZnQgZm9yICR7dW5hdmFpbGFibGVEcmlmdHMubGVuZ3RofSBzdGFjayhzKS4gQ2hlY2sgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbERyaWZ0UmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIEFzc2V0cyBBY3Rpb25cbiAgICpcbiAgICogUHVibGlzaGVzIGFzc2V0cyBmb3IgdGhlIHNlbGVjdGVkIHN0YWNrcyB3aXRob3V0IGRlcGxveWluZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2hBc3NldHMoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBQdWJsaXNoQXNzZXRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQdWJsaXNoQXNzZXRzUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdwdWJsaXNoLWFzc2V0cycpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAncHVibGlzaC1hc3NldHMnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tDb2xsZWN0aW9uLCBpb0hlbHBlcik7XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAwMS5tc2coJ05vIHN0YWNrcyBzZWxlY3RlZCcpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncHVibGlzaC1hc3NldHMnKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzID0gc3RhY2tzLmZsYXRNYXAoKHN0YWNrKSA9PiBbXG4gICAgICBzdGFjayxcbiAgICAgIC4uLnN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoeCA9PiBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3QuaXNBc3NldE1hbmlmZXN0QXJ0aWZhY3QoeCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoXG4gICAgICBpb0hlbHBlcixcbiAgICAgIHRydWUsIC8vIHByZWJ1aWxkIGFsbCBhc3NldHNcbiAgICApLmJ1aWxkKHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMpO1xuXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhd2FpdCByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoKHdvcmtHcmFwaCwgZGVwbG95bWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0Tm9kZXMgPSBPYmplY3QudmFsdWVzKHdvcmtHcmFwaC5ub2RlcylcbiAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIEFzc2V0UHVibGlzaE5vZGUgPT4gbi50eXBlID09PSAnYXNzZXQtcHVibGlzaCcpO1xuXG4gICAgaWYgKGFzc2V0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk0MDAubXNnKGNoYWxrLmdyZWVuKCdcXG7inKggIEFsbCBhc3NldHMgYXJlIGFscmVhZHkgcHVibGlzaGVkXFxuJykpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0cyA9IGFzc2V0Tm9kZXMubWFwKG4gPT4gbi5hc3NldCk7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAxLm1zZygnUHVibGlzaGluZyBhc3NldHMnLCB7IGFzc2V0cyB9KSk7XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgPz8gNDtcbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IDEsXG4gICAgICAnYXNzZXQtYnVpbGQnOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1wdWJsaXNoJzogY29uY3VycmVuY3ksXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIC8vIE5vLW9wOiB3ZSdyZSBvbmx5IHB1Ymxpc2hpbmcgYXNzZXRzLCBub3QgZGVwbG95aW5nXG4gICAgICBkZXBsb3lTdGFjazogV29ya0dyYXBoLk5PT1AsXG4gICAgICBidWlsZEFzc2V0OiB0aGlzLmNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIHVuZGVmaW5lZCksXG4gICAgICBwdWJsaXNoQXNzZXQ6IHRoaXMuY3JlYXRlUHVibGlzaEFzc2V0RnVuY3Rpb24oaW9IZWxwZXIsIGRlcGxveW1lbnRzLCB1bmRlZmluZWQsIG9wdGlvbnMuZm9yY2UpLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAyLm1zZyhjaGFsay5ncmVlbignXFxu4pyoICBBc3NldHMgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseVxcbicpLCB7IGFzc2V0cyB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGlzaGVkQXNzZXRzOiBhc3NldHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IEFjdGlvblxuICAgKlxuICAgKiBMaXN0IHNlbGVjdGVkIHN0YWNrcyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IExpc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFN0YWNrRGV0YWlsc1tdPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnbGlzdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMjkwMS5tc2cobWVzc2FnZSwgeyBzdGFja3MgfSkpO1xuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGZpbmQgdGhlIHJvb3QgY2F1c2VzIGZvciBkZXBsb3ltZW50IGZhaWx1cmVzIG9mIHRoZSBnaXZlbiBzdGFja3MuXG4gICAqXG4gICAqIEJvdGggZW1pdHMgdGhlIGRpYWdub3NpcyByZXN1bHRzIG92ZXIgdGhlIElPIGhvc3QgYXMgdGhleSBhcmUgY29taW5nIGluLCBhcyB3ZWxsXG4gICAqIGFzIHJldHVybnMgYWxsIG9mIHRoZW0gYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIE5PVEU6IFRoZSBDbG91ZCBBc3NlbWJseSBTb3VyY2UgKipzaG91bGQqKiBiZSBjb25maWd1cmVkIHdpdGggYGRlYnVnOiB0cnVlYCB0byBhZGRcbiAgICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpYWdub3NlKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGlhZ25vc2VPcHRpb25zID0ge30pOiBQcm9taXNlPERpYWdub3NlUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdkaWFnbm9zZScpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGlhZ25vc2UnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2Vzcyhhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkaWFnbm9zZScpLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsIGlvSGVscGVyKTtcblxuICAgIC8vIERvIHN0YWNrcyBpbiBwYXJhbGxlbCwgZm9yIHNwZWVkLlxuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KG9wdGlvbnMuY29uY3VycmVuY3kgPz8gMTApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzLm1hcCgoc3RhY2spID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2spO1xuXG4gICAgICBjb25zdCBkaWFnbm9zZXIgPSBuZXcgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3Nlcih7XG4gICAgICAgIHNkazogc3RhY2tFbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IHN0YWNrRW52LnJlc291cmNlcyxcbiAgICAgICAgc291cmNlVHJhY2VyOiBuZXcgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlcihzdGFjayksXG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCBkaWFnbm9zZXIuZGlhZ25vc2VGcm9tRnJlc2goc3RhY2suc3RhY2tOYW1lKTtcblxuICAgICAgY29uc3QgcmV0OiBEaWFnbm9zZWRTdGFjayA9IHtcbiAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIGhpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgcmVzdWx0OiBkaWFnbm9zaXMsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoe1xuICAgICAgICBhY3Rpb246ICdkaWFnbm9zZScsXG4gICAgICAgIC4uLmhvc3RNZXNzYWdlRnJvbURpYWdub3NpcyhyZXQpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7IHN0YWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBY3Rpb25cbiAgICpcbiAgICogRGVwbG95cyB0aGUgc2VsZWN0ZWQgc3RhY2tzIGludG8gYW4gQVdTIGFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPERlcGxveVJlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RlcGxveScpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kZXBsb3koYXNzZW1ibHksICdkZXBsb3knLCBhc3NlbWJseS5zeW50aER1cmF0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgZGVwbG95IGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSB3YXRjaCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kZXBsb3koYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ2RlcGxveScgfCAnd2F0Y2gnLCBzeW50aER1cmF0aW9uOiBFbGFwc2VkVGltZSwgb3B0aW9uczogUHJpdmF0ZURlcGxveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RGVwbG95UmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja0NvbGxlY3Rpb24sIGlvSGVscGVyKTtcblxuICAgIGNvbnN0IHJldDogRGVwbG95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTUwMDEubXNnKCdUaGlzIGFwcCBjb250YWlucyBubyBzdGFja3MnKSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGVwbG95Jyk7XG5cbiAgICBpZiAoIWlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSkge1xuICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hlbHBlciB9KTtcbiAgICAgIGF3YWl0IG1pZ3JhdG9yLnRyeU1pZ3JhdGVSZXNvdXJjZXMoc3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJNYXAgPSBidWlsZFBhcmFtZXRlck1hcChvcHRpb25zLnBhcmFtZXRlcnM/LnBhcmFtZXRlcnMpO1xuXG4gICAgaWYgKG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZD8ubWV0aG9kID09PSAnaG90c3dhcCcpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTQwMC5tc2coW1xuICAgICAgICAn4pqg77iPIEhvdHN3YXAgZGVwbG95bWVudHMgZGVsaWJlcmF0ZWx5IGludHJvZHVjZSBDbG91ZEZvcm1hdGlvbiBkcmlmdCB0byBzcGVlZCB1cCBkZXBsb3ltZW50cycsXG4gICAgICAgICfimqDvuI8gVGhleSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAtIG5ldmVyIHVzZSB0aGVtIGZvciB5b3VyIHByb2R1Y3Rpb24gU3RhY2tzIScsXG4gICAgICBdLmpvaW4oJ1xcbicpKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tzID0gc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzO1xuICAgIGNvbnN0IHN0YWNrT3V0cHV0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IG91dHB1dHNGaWxlID0gb3B0aW9ucy5vdXRwdXRzRmlsZTtcblxuICAgIGNvbnN0IHsgYnVpbGRBc3NldCwgcHVibGlzaEFzc2V0IH0gPSAoKCkgPT4ge1xuICAgICAgaWYgKGlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSkge1xuICAgICAgICAvLyBOby1vcDogYXNzZXRzIGFyZSBhbHJlYWR5IHB1Ymxpc2hlZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJ1aWxkQXNzZXQ6IFdvcmtHcmFwaC5OT09QLFxuICAgICAgICAgIHB1Ymxpc2hBc3NldDogV29ya0dyYXBoLk5PT1AsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1aWxkQXNzZXQ6IHRoaXMuY3JlYXRlQnVpbGRBc3NldEZ1bmN0aW9uKGlvSGVscGVyLCBkZXBsb3ltZW50cywgb3B0aW9ucy5yb2xlQXJuKSxcbiAgICAgICAgcHVibGlzaEFzc2V0OiB0aGlzLmNyZWF0ZVB1Ymxpc2hBc3NldEZ1bmN0aW9uKGlvSGVscGVyLCBkZXBsb3ltZW50cywgb3B0aW9ucy5yb2xlQXJuLCBvcHRpb25zLmZvcmNlQXNzZXRQdWJsaXNoaW5nKSxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGRlcGxveVN0YWNrID0gYXN5bmMgKHN0YWNrTm9kZTogU3RhY2tOb2RlKSA9PiB7XG4gICAgICBjb25zdCBzdGFjayA9IHN0YWNrTm9kZS5zdGFjaztcbiAgICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCAhPT0gMSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGNoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGFjay5lbnZpcm9ubWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgICdTdGFja0Vudmlyb25tZW50TWlzc2luZycsXG4gICAgICAgICAgYFN0YWNrICR7c3RhY2suZGlzcGxheU5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiBlbnZpcm9ubWVudCwgYW5kIEFXUyBjcmVkZW50aWFscyBjb3VsZCBub3QgYmUgb2J0YWluZWQgZnJvbSBzdGFuZGFyZCBsb2NhdGlvbnMgb3Igbm8gcmVnaW9uIHdhcyBjb25maWd1cmVkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBnZW5lcmF0ZWQgc3RhY2sgaGFzIG5vIHJlc291cmNlc1xuICAgICAgY29uc3QgcmVzb3VyY2VDb3VudCA9IE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcyB8fCB7fSkubGVuZ3RoO1xuICAgICAgaWYgKHJlc291cmNlQ291bnQgPT09IDApIHtcbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHkgYW5kIGRvZXNuJ3QgZXhpc3QgPT4gZG8gbm90aGluZ1xuICAgICAgICBjb25zdCBzdGFja0V4aXN0cyA9IGF3YWl0IGRlcGxveW1lbnRzLnN0YWNrRXhpc3RzKHsgc3RhY2sgfSk7XG4gICAgICAgIGlmICghc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1MDIxLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIHNraXBwaW5nIGRlcGxveW1lbnQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHksIGJ1dCBleGlzdHMgPT4gZGVsZXRlXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTAyMi5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBzdGFjayBoYXMgbm8gcmVzb3VyY2VzLCBkZWxldGluZyBleGlzdGluZyBzdGFjay5gKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXBsb3knLCB7XG4gICAgICAgICAgc3RhY2tzOiB7IHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLCBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFIH0sXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRUZW1wbGF0ZSA9IGF3YWl0IGRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2spO1xuXG4gICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzYW1lIHNlbWFudGljcyB3ZSBhcHBseSB3aXRoIHJlc3BlY3QgdG8gTm90aWZpY2F0aW9uIEFSTnMgKGRpY3RhdGVkIGJ5IHRoZSBTREspXG4gICAgICAvL1xuICAgICAgLy8gIC0gdW5kZWZpbmVkICA9PiAgY2RrIGlnbm9yZXMgaXQsIGFzIGlmIGl0IHdhc24ndCBzdXBwb3J0ZWQgKGFsbG93cyBleHRlcm5hbCBtYW5hZ2VtZW50KS5cbiAgICAgIC8vICAtIFtdOiAgICAgICAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gd2lwZSBpdCBvdXQuXG4gICAgICAvLyAgLSBbJ2Fybi0xJ10gID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNldCBpdCB0byBbJ2Fybi0xJ10uXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Bcm5zID0gKCEhb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zIHx8ICEhc3RhY2subm90aWZpY2F0aW9uQXJucylcbiAgICAgICAgPyAob3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zID8/IFtdKS5jb25jYXQoc3RhY2subm90aWZpY2F0aW9uQXJucyA/PyBbXSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uQXJuIG9mIG5vdGlmaWNhdGlvbkFybnMgPz8gW10pIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVNuc1RvcGljQXJuKG5vdGlmaWNhdGlvbkFybikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdJbnZhbGlkU25zVG9waWNBcm4nLCBgTm90aWZpY2F0aW9uIGFybiAke25vdGlmaWNhdGlvbkFybn0gaXMgbm90IGEgdmFsaWQgYXJuIGZvciBhbiBTTlMgdG9waWNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZXBsb3kgb3B0aW9ucyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBjaGFuZ2Ugc2V0IGNyZWF0aW9uIGFuZCBleGVjdXRpb25cbiAgICAgIGNvbnN0IHNoYXJlZERlcGxveU9wdGlvbnMgPSB7XG4gICAgICAgIHN0YWNrLFxuICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgICAgdGFnczogb3B0aW9ucy50YWdzPy5sZW5ndGggPyBvcHRpb25zLnRhZ3MgOiB0YWdzRm9yU3RhY2soc3RhY2spLFxuICAgICAgICBmb3JjZURlcGxveW1lbnQ6IG9wdGlvbnMuZm9yY2VEZXBsb3ltZW50LFxuICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbWV0ZXJNYXBbJyonXSwgcGFyYW1ldGVyTWFwW3N0YWNrLnN0YWNrTmFtZV0pLFxuICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycz8ua2VlcEV4aXN0aW5nUGFyYW1ldGVycyxcbiAgICAgICAgcm9sbGJhY2s6IG9wdGlvbnMucm9sbGJhY2ssXG4gICAgICAgIG5vdGlmaWNhdGlvbkFybnMsXG4gICAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgICBhc3NldFBhcmFsbGVsaXNtOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgICB9O1xuXG4gICAgICAvLyBXaGVuIHVzaW5nIGNoYW5nZS1zZXQgbWV0aG9kLCBhbHdheXMgY3JlYXRlIHRoZSBjaGFuZ2Ugc2V0IHVwZnJvbnQuXG4gICAgICAvLyBUaGlzIGdpdmVzIHVzIGFuIGFjY3VyYXRlIGRpZmYgZm9yIGFwcHJvdmFsIGFuZCBhdm9pZHMgY3JlYXRpbmcgaXQgdHdpY2UuXG4gICAgICAvLyBGb3Igbm9uLWV4ZWN1dGluZyBkZXBsb3ltZW50cyAocHJlcGFyZS1jaGFuZ2Utc2V0KSwgdGhpcyBpcyB0aGUgZmluYWwgcmVzdWx0LlxuICAgICAgY29uc3QgcHJlcGFyZVJlc3VsdCA9IGlzQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgID8gYXdhaXQgZGVwbG95bWVudHMucHJlcGFyZVN0YWNrKHtcbiAgICAgICAgICAuLi5zaGFyZWREZXBsb3lPcHRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgICAgICBjbGVhbnVwT25Ob09wOiBpc0V4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSxcbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFNraXAgdGhlIGFwcHJvdmFsIHByb21wdCBlbnRpcmVseSB3aGVuIHRoZSBwcmVwYXJlZCBjaGFuZ2Ugc2V0IGhhcyBub1xuICAgICAgLy8gY2hhbmdlcyDigJQgdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIHVzZXIgdG8gYXBwcm92ZS4gT3V0cHV0cywgc3RhY2sgQVJOLFxuICAgICAgLy8gYW5kIHRpbWluZ3MgYXJlIHN0aWxsIGVtaXR0ZWQgdmlhIHRoZSBub3JtYWwgbm8tb3AgZGVwbG95IHBhdGggYmVsb3cuXG4gICAgICBpZiAoIXByZXBhcmVSZXN1bHQ/Lm5vT3ApIHtcbiAgICAgICAgLy8gRm9yIGV4ZWN1dGUtY2hhbmdlLXNldCwgZGVzY3JpYmUgdGhlIGV4aXN0aW5nIGNoYW5nZSBzZXQgc28gd2UgY2FuIHNob3cgYW4gYWNjdXJhdGUgZGlmZlxuICAgICAgICBjb25zdCBkaWZmQ2hhbmdlU2V0ID0gaXNFeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgPyBhd2FpdCBkZXBsb3ltZW50cy5kZXNjcmliZUNoYW5nZVNldChzdGFjaywgb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLmNoYW5nZVNldE5hbWUsIHByZXBhcmVSZXN1bHQ/LnN0YWNrQXJuKVxuICAgICAgICAgIDogcHJlcGFyZVJlc3VsdD8uY2hhbmdlU2V0O1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEaWZmRm9ybWF0dGVyKHtcbiAgICAgICAgICB0ZW1wbGF0ZUluZm86IHtcbiAgICAgICAgICAgIG9sZFRlbXBsYXRlOiBjdXJyZW50VGVtcGxhdGUsXG4gICAgICAgICAgICBuZXdUZW1wbGF0ZTogc3RhY2ssXG4gICAgICAgICAgICBjaGFuZ2VTZXQ6IGRpZmZDaGFuZ2VTZXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2VjdXJpdHlEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5RGlmZigpO1xuICAgICAgICBjb25zdCBzdGFja0RpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U3RhY2tEaWZmKCk7XG5cbiAgICAgICAgLy8gU2VuZCBhIHJlcXVlc3QgcmVzcG9uc2Ugd2l0aCB0aGUgZGlmZiBhcyBwYXJ0IG9mIHRoZSBtZXNzYWdlLFxuICAgICAgICAvLyBhbmQgdGhlIHRlbXBsYXRlIGRpZmYgYXMgZGF0YVxuICAgICAgICAvLyAoSW9Ib3N0IGRlY2lkZXMgd2hldGhlciB0byBwcmludCBkZXBlbmRpbmcgb24gcGVybWlzc2lvbkNoYW5nZVR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1NlY3VyaXR5Q2hhbmdlcyA9IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORTtcbiAgICAgICAgY29uc3QgZGVwbG95TW90aXZhdGlvbiA9IGhhc1NlY3VyaXR5Q2hhbmdlc1xuICAgICAgICAgID8gJ1wiLS1yZXF1aXJlLWFwcHJvdmFsXCIgaXMgZW5hYmxlZCBhbmQgc3RhY2sgaW5jbHVkZXMgc2VjdXJpdHktc2Vuc2l0aXZlIHVwZGF0ZXMuJ1xuICAgICAgICAgIDogJ1wiLS1yZXF1aXJlLWFwcHJvdmFsXCIgaXMgZW5hYmxlZCBhbmQgc3RhY2sgaW5jbHVkZXMgdXBkYXRlcy4nO1xuICAgICAgICBjb25zdCBkaWZmT3V0cHV0ID0gaGFzU2VjdXJpdHlDaGFuZ2VzID8gc2VjdXJpdHlEaWZmLmZvcm1hdHRlZERpZmYgOiBzdGFja0RpZmYuZm9ybWF0dGVkRGlmZjtcbiAgICAgICAgY29uc3QgZGVwbG95UXVlc3Rpb24gPSBgJHtkaWZmT3V0cHV0fVxcblxcbiR7ZGVwbG95TW90aXZhdGlvbn1cXG5EbyB5b3Ugd2lzaCB0byBkZXBsb3kgdGhlc2UgY2hhbmdlc2A7XG4gICAgICAgIGNvbnN0IGRlcGxveUNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA2MC5yZXEoZGVwbG95UXVlc3Rpb24sIHtcbiAgICAgICAgICBtb3RpdmF0aW9uOiBkZXBsb3lNb3RpdmF0aW9uLFxuICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUsXG4gICAgICAgICAgdGVtcGxhdGVEaWZmczogZm9ybWF0dGVyLmRpZmZzLFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICghZGVwbG95Q29uZmlybWVkKSB7XG4gICAgICAgICAgaWYgKHByZXBhcmVSZXN1bHQ/LmNoYW5nZVNldD8uQ2hhbmdlU2V0TmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgZGVwbG95bWVudHMuY2xlYW51cENoYW5nZVNldChzdGFjaywgcHJlcGFyZVJlc3VsdC5jaGFuZ2VTZXQuQ2hhbmdlU2V0TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RlcGxveUFib3J0ZWQnLCAnQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHN0YWNrcy5pbmRleE9mKHN0YWNrKSArIDE7XG4gICAgICBjb25zdCBkZXBsb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFUExPWV9TVEFDSylcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogZGVwbG95aW5nLi4uIFske3N0YWNrSW5kZXh9LyR7c3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnR9XWAsIHtcbiAgICAgICAgICB0b3RhbDogc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQsXG4gICAgICAgICAgY3VycmVudDogc3RhY2tJbmRleCxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgfSk7XG4gICAgICBkZXBsb3lTcGFuLmluY0NvdW50ZXIoJ3Jlc291cmNlcycsIHJlc291cmNlQ291bnQpO1xuXG4gICAgICBsZXQgZGVwbG95RHVyYXRpb247XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcmVwYXJlSXNGaW5hbCA9IHByZXBhcmVSZXN1bHQgJiYgKHByZXBhcmVSZXN1bHQubm9PcCB8fCBpc05vbkV4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSk7XG4gICAgICAgIGxldCBkZXBsb3lSZXN1bHQ6IFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZCA9IHByZXBhcmVJc0ZpbmFsID8gcHJlcGFyZVJlc3VsdCA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgcm9sbGJhY2sgPSBvcHRpb25zLnJvbGxiYWNrO1xuICAgICAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICAgICAgd2hpbGUgKCFkZXBsb3lSZXN1bHQpIHtcbiAgICAgICAgICBpZiAoKytpdGVyYXRpb24gPiAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3lMb29wVW5zdGFibGUnLCAnVGhpcyBsb29wIHNob3VsZCBoYXZlIHN0YWJpbGl6ZWQgaW4gMiBpdGVyYXRpb25zLCBidXQgZGlkblxcJ3QuIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IGRlcGxveW1lbnRzLmRlcGxveVN0YWNrKHtcbiAgICAgICAgICAgIC4uLnNoYXJlZERlcGxveU9wdGlvbnMsXG4gICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBleGVjdXRlIHRoZSBwcmVwYXJlZCBjaGFuZ2Ugc2V0LlxuICAgICAgICAgICAgLy8gT24gcmV0cmllcyAoYWZ0ZXIgcm9sbGJhY2spLCBjcmVhdGUgYSBuZXcgY2hhbmdlIHNldCBzaW5jZSB0aGUgb2xkIG9uZSBpcyBnb25lLlxuICAgICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogaXRlcmF0aW9uID09PSAxICYmIGlzRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgICAgID8gdG9FeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgICAgIDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgICAgICAgcm9sbGJhY2ssXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzd2l0Y2ggKHIudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlkLWRlcGxveS1zdGFjayc6XG4gICAgICAgICAgICAgIGRlcGxveVJlc3VsdCA9IHI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdmYWlscGF1c2VkLW5lZWQtcm9sbGJhY2stZmlyc3QnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSByLnJlYXNvbiA9PT0gJ3JlcGxhY2VtZW50J1xuICAgICAgICAgICAgICAgID8gYFN0YWNrIGlzIGluIGEgcGF1c2VkIGZhaWwgc3RhdGUgKCR7ci5zdGF0dXN9KSBhbmQgY2hhbmdlIGluY2x1ZGVzIGEgcmVwbGFjZW1lbnQgd2hpY2ggY2Fubm90IGJlIGRlcGxveWVkIHdpdGggXCItLW5vLXJvbGxiYWNrXCJgXG4gICAgICAgICAgICAgICAgOiBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGRvIG5vdCBpbmNsdWRlIFwiLS1uby1yb2xsYmFja1wiYDtcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgIG1vdGl2YXRpb24sXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSb2xsYmFja0Fib3J0ZWQnLCAnQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcm9sbGJhY2tcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcm9sbGJhY2soYXNzZW1ibHksIGFjdGlvbiwge1xuICAgICAgICAgICAgICAgIHN0YWNrczoge1xuICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICAgICAgICAgICAgICBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JwaGFuRmFpbGVkUmVzb3VyY2VzOiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlc0R1cmluZ1JvbGxiYWNrLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBHbyBhcm91bmQgdGhyb3VnaCB0aGUgJ3doaWxlJyBsb29wIGFnYWluIGJ1dCBzd2l0Y2ggcm9sbGJhY2sgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgcm9sbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAncmVwbGFjZW1lbnQtcmVxdWlyZXMtcm9sbGJhY2snOiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnQ2hhbmdlIGluY2x1ZGVzIGEgcmVwbGFjZW1lbnQgd2hpY2ggY2Fubm90IGJlIGRlcGxveWVkIHdpdGggXCItLW5vLXJvbGxiYWNrXCInO1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IGAke21vdGl2YXRpb259LiBQZXJmb3JtIGEgcmVndWxhciBkZXBsb3ltZW50YDtcblxuICAgICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTUwNTAucmVxKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgICAgICAgbW90aXZhdGlvbixcbiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1JlcGxhY2VtZW50Um9sbGJhY2tBYm9ydGVkJywgJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1VuZXhwZWN0ZWREZXBsb3lSZXN1bHQnLCBgVW5leHBlY3RlZCByZXN1bHQgdHlwZSBmcm9tIGRlcGxveVN0YWNrOiAke0pTT04uc3RyaW5naWZ5KHIpfS4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2VgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGVwbG95UmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX1gO1xuXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMC5tc2coY2hhbGsuZ3JlZW4oJ1xcbicgKyBtZXNzYWdlKSwgZGVwbG95UmVzdWx0KSk7XG4gICAgICAgIGRlcGxveUR1cmF0aW9uID0gYXdhaXQgZGVwbG95U3Bhbi50aW1pbmcoSU8uQ0RLX1RPT0xLSVRfSTUwMDApO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IFsnT3V0cHV0czonXTtcbiAgICAgICAgICBzdGFja091dHB1dHNbc3RhY2suc3RhY2tOYW1lXSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcGxveVJlc3VsdC5vdXRwdXRzKS5zb3J0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVwbG95UmVzdWx0Lm91dHB1dHNbbmFtZV07XG4gICAgICAgICAgICBidWZmZXIucHVzaChgJHtjaGFsay5jeWFuKHN0YWNrLmlkKX0uJHtjaGFsay5jeWFuKG5hbWUpfSA9ICR7Y2hhbGsudW5kZXJsaW5lKGNoYWxrLmN5YW4odmFsdWUpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAxLm1zZyhidWZmZXIuam9pbignXFxuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDEubXNnKGBTdGFjayBBUk46XFxuJHtkZXBsb3lSZXN1bHQuc3RhY2tBcm59YCkpO1xuXG4gICAgICAgIHJldC5zdGFja3MucHVzaCh7XG4gICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICAgICAgICByZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YWNrQXJuOiBkZXBsb3lSZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgb3V0cHV0czogZGVwbG95UmVzdWx0Lm91dHB1dHMsXG4gICAgICAgICAgaGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBJdCBoYXMgdG8gYmUgZXhhY3RseSB0aGlzIHN0cmluZyBiZWNhdXNlIGFuIGludGVncmF0aW9uIHRlc3QgdGVzdHMgZm9yXG4gICAgICAgIC8vIFwiYm9sZChzdGFja25hbWUpIGZhaWxlZDogUmVzb3VyY2VOb3RSZWFkeTogPGVycm9yPlwiXG4gICAgICAgIGNvbnN0IGNvZGUgPSBUb29sa2l0RXJyb3IuaXNUb29sa2l0RXJyb3IoZSkgPyBlLm5hbWUgOiAnRGVwbG95U3RhY2tGYWlsZWQnO1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlID0gW2DinYwgICR7Y2hhbGsuYm9sZChzdGFjay5zdGFja05hbWUpfSBmYWlsZWQ6YCwgLi4uKGUubmFtZSA/IFtgJHtlLm5hbWV9OmBdIDogW10pLCBlLm1lc3NhZ2VdLmpvaW4oJyAnKTtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihjb2RlLCBuZXdNZXNzYWdlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNlTG9ncykge1xuICAgICAgICAgIC8vIGRlcGxveSBjYWxscyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHdhdGNoIHdpbGwgY29tZSB3aXRoIHRoZWlyIG93biBjbG91ZFdhdGNoTG9nTW9uaXRvclxuICAgICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nTW9uaXRvciA/PyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcih7IGlvSGVscGVyIH0pO1xuICAgICAgICAgIGNvbnN0IGZvdW5kTG9nR3JvdXBzUmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGVwbG95JyksIGlvSGVscGVyLCBzdGFjayk7XG4gICAgICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IuYWRkTG9nR3JvdXBzKFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuZW52LFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuc2RrLFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTAzMS5tc2coYFRoZSBmb2xsb3dpbmcgbG9nIGdyb3VwcyBhcmUgYWRkZWQ6ICR7Zm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lc31gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhbiBvdXRwdXRzIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCBjcmVhdGUgdGhlIGZpbGUgcGF0aCBhbmQgd3JpdGUgc3RhY2sgb3V0cHV0cyB0byBpdCBvbmNlLlxuICAgICAgICAvLyBPdXRwdXRzIGFyZSB3cml0dGVuIGFmdGVyIGFsbCBzdGFja3MgaGF2ZSBiZWVuIGRlcGxveWVkLiBJZiBhIHN0YWNrIGRlcGxveW1lbnQgZmFpbHMsXG4gICAgICAgIC8vIGFsbCBvZiB0aGUgb3V0cHV0cyBmcm9tIHN1Y2Nlc3NmdWxseSBkZXBsb3llZCBzdGFja3MgYmVmb3JlIHRoZSBmYWlsdXJlIHdpbGwgc3RpbGwgYmUgd3JpdHRlbi5cbiAgICAgICAgaWYgKG91dHB1dHNGaWxlKSB7XG4gICAgICAgICAgZnMuZW5zdXJlRmlsZVN5bmMob3V0cHV0c0ZpbGUpO1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSnNvbihvdXRwdXRzRmlsZSwgc3RhY2tPdXRwdXRzLCB7XG4gICAgICAgICAgICBzcGFjZXM6IDIsXG4gICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHN5bnRoRHVyYXRpb24uYXNNcyArIChkZXBsb3lEdXJhdGlvbj8uYXNNcyA/PyAwKTtcbiAgICAgIGF3YWl0IGRlcGxveVNwYW4uZW5kKGBcXG7inKggIFRvdGFsIHRpbWU6ICR7Zm9ybWF0VGltZShkdXJhdGlvbil9c1xcbmAsIHsgZHVyYXRpb24gfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2V0QnVpbGRUaW1lID0gb3B0aW9ucy5hc3NldEJ1aWxkVGltZSA/PyBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBwcmVidWlsZEFzc2V0cyA9IGFzc2V0QnVpbGRUaW1lID09PSBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcblxuICAgIGNvbnN0IHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMgPSBzdGFja3MuZmxhdE1hcCgoc3RhY2spID0+IFtcbiAgICAgIHN0YWNrLFxuICAgICAgLi4uc3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcih4ID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSksXG4gICAgXSk7XG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoaW9IZWxwZXIsIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2VBc3NldFB1Ymxpc2hpbmcpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0c0Zyb21Xb3JrR3JhcGgod29ya0dyYXBoLCBkZXBsb3ltZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JhcGhDb25jdXJyZW5jeTogQ29uY3VycmVuY3kgPSB7XG4gICAgICAnc3RhY2snOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1idWlsZCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyBvcHRpb25zLmFzc2V0QnVpbGRDb25jdXJyZW5jeSA/PyAxIDogMSwgLy8gVGhpcyB3aWxsIGJlIENQVS1ib3VuZC9tZW1vcnkgYm91bmQsIG1vc3RseSBtYXR0ZXJzIGZvciBEb2NrZXIgYnVpbGRzXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyA4IDogMSwgLy8gVGhpcyB3aWxsIGJlIEkvTy1ib3VuZCwgOCBpbiBwYXJhbGxlbCBzZWVtcyByZWFzb25hYmxlXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIGRlcGxveVN0YWNrLFxuICAgICAgYnVpbGRBc3NldCxcbiAgICAgIHB1Ymxpc2hBc3NldCxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggQWN0aW9uXG4gICAqXG4gICAqIENvbnRpbnVvdXNseSBvYnNlcnZlIHByb2plY3QgZmlsZXMgYW5kIGRlcGxveSB0aGUgc2VsZWN0ZWQgc3RhY2tzXG4gICAqIGF1dG9tYXRpY2FsbHkgd2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gRGVmYXVsdHMgdG8gaG90c3dhcCBkZXBsb3ltZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LCBzdGFydGluZyBhIHdhdGNoZXIgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2goY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBXYXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SVdhdGNoZXI+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICd3YXRjaCcpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCwgZmFsc2UpO1xuICAgIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLndhdGNoRGlyID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBGb3IgdGhlIFwiaW5jbHVkZVwiIHNldHRpbmcsIHRoZSBiZWhhdmlvciBpczpcbiAgICAvLyAxLiBcIndhdGNoXCIgc2V0dGluZyB3aXRob3V0IGFuIFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIqKlwiLlxuICAgIC8vIDIuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGggYW4gZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIioqXCIuXG4gICAgLy8gMy4gTm9uLWVtcHR5IFwiaW5jbHVkZVwiIGtleT8gSnVzdCB1c2UgdGhlIFwiaW5jbHVkZVwiIGtleS5cbiAgICBjb25zdCB3YXRjaEluY2x1ZGVzID0gb3B0aW9ucy5pbmNsdWRlID8/IFtdO1xuICAgIGlmICh3YXRjaEluY2x1ZGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICB3YXRjaEluY2x1ZGVzLnB1c2goJyoqJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSBcImV4Y2x1ZGVcIiBzZXR0aW5nLCB0aGUgYmVoYXZpb3IgaXMgdG8gYWRkIHNvbWUgZGVmYXVsdCBleGNsdWRlcyBpbiBhZGRpdGlvbiB0b1xuICAgIC8vIHBhdHRlcm5zIHNwZWNpZmllZCBieSB0aGUgdXNlciBzZW5zaWJsZSBkZWZhdWx0IHBhdHRlcm5zOlxuICAgIGNvbnN0IHdhdGNoRXhjbHVkZXMgPSBvcHRpb25zLmV4Y2x1ZGUgPz8gWy4uLldBVENIX0VYQ0xVREVfREVGQVVMVFNdO1xuICAgIC8vIDEuIFRoZSBDREsgb3V0cHV0IGRpcmVjdG9yeSwgaWYgaXQgaXMgdW5kZXIgdGhlIHJvb3REaXJcbiAgICBjb25zdCByZWxhdGl2ZU91dERpciA9IHBhdGgucmVsYXRpdmUocm9vdERpciwgYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICBpZiAoQm9vbGVhbihyZWxhdGl2ZU91dERpciAmJiAhcmVsYXRpdmVPdXREaXIuc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVPdXREaXIpKSkge1xuICAgICAgd2F0Y2hFeGNsdWRlcy5wdXNoKGAke3JlbGF0aXZlT3V0RGlyfS8qKmApO1xuICAgIH1cbiAgICAvLyAyLiBBbnkgZmlsZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnLionLCAnKiovLionKTtcbiAgICAvLyAzLiBBbnkgZGlyZWN0b3J5J3MgY29udGVudCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnKiovLiovKionKTtcbiAgICAvLyA0LiBBbnkgbm9kZV9tb2R1bGVzIGFuZCBpdHMgY29udGVudCAoZXZlbiBpZiBpdCdzIG5vdCBhIEpTL1RTIHByb2plY3QsIHlvdSBtaWdodCBiZSB1c2luZyBhIGxvY2FsIGF3cy1jbGkgcGFja2FnZSlcbiAgICB3YXRjaEV4Y2x1ZGVzLnB1c2goJyoqL25vZGVfbW9kdWxlcy8qKicpO1xuXG4gICAgLy8gUHJpbnQgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiBvbiBjb21wdXRlZCBzZXR0aW5nc1xuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMC5tc2coW1xuICAgICAgYHJvb3QgZGlyZWN0b3J5IHVzZWQgZm9yICd3YXRjaCcgaXM6ICR7cm9vdERpcn1gLFxuICAgICAgYCdpbmNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEluY2x1ZGVzKX1gLFxuICAgICAgYCdleGNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEV4Y2x1ZGVzKX1gLFxuICAgIF0uam9pbignXFxuJyksIHtcbiAgICAgIHdhdGNoRGlyOiByb290RGlyLFxuICAgICAgaW5jbHVkZXM6IHdhdGNoSW5jbHVkZXMsXG4gICAgICBleGNsdWRlczogd2F0Y2hFeGNsdWRlcyxcbiAgICB9KSk7XG5cbiAgICAvLyBTaW5jZSAnY2RrIGRlcGxveScgaXMgYSByZWxhdGl2ZWx5IHNsb3cgb3BlcmF0aW9uIGZvciBhICd3YXRjaCcgcHJvY2VzcyxcbiAgICAvLyBpbnRyb2R1Y2UgYSBjb25jdXJyZW5jeSBsYXRjaCB0aGF0IHRyYWNrcyB0aGUgc3RhdGUuXG4gICAgLy8gVGhpcyB3YXksIGlmIGZpbGUgY2hhbmdlIGV2ZW50cyBhcnJpdmUgd2hlbiBhICdjZGsgZGVwbG95JyBpcyBzdGlsbCBleGVjdXRpbmcsXG4gICAgLy8gd2Ugd2lsbCBiYXRjaCB0aGVtLCBhbmQgdHJpZ2dlciBhbm90aGVyICdjZGsgZGVwbG95JyBhZnRlciB0aGUgY3VycmVudCBvbmUgZmluaXNoZXMsXG4gICAgLy8gbWFraW5nIHN1cmUgJ2NkayBkZXBsb3kncyAgYWx3YXlzIGV4ZWN1dGUgb25lIGF0IGEgdGltZS5cbiAgICAvLyBIZXJlJ3MgYSBkaWFncmFtIHNob3dpbmcgdGhlIHN0YXRlIHRyYW5zaXRpb25zOlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tICAgIGZpbGUgY2hhbmdlZCAgICAgLS0tLS0tLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgZmlsZSBjaGFuZ2VkXG4gICAgLy8gfCAgICAgICAgICAgIHwgIHJlYWR5IGV2ZW50ICAgfCAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tfFxuICAgIC8vIHwgcHJlLXJlYWR5ICB8IC0tLS0tLS0tLS0tLS0+IHwgb3BlbiB8ICAgICAgICAgICAgICAgICAgICAgfCBkZXBsb3lpbmcgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgcXVldWVkICAgfCAgICAgICAgICAgICAgIHxcbiAgICAvLyB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS18XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICdjZGsgZGVwbG95JyBkb25lICAtLS0tLS0tLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tXG4gICAgdHlwZSBMYXRjaFN0YXRlID0gJ3ByZS1yZWFkeScgfCAnb3BlbicgfCAnZGVwbG95aW5nJyB8ICdxdWV1ZWQnO1xuICAgIGxldCBsYXRjaDogTGF0Y2hTdGF0ZSA9ICdwcmUtcmVhZHknO1xuXG4gICAgY29uc3QgY2xvdWRXYXRjaExvZ01vbml0b3IgPSBvcHRpb25zLnRyYWNlTG9ncyA/IG5ldyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yKHsgaW9IZWxwZXIgfSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVwbG95QW5kV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnIGFzIExhdGNoU3RhdGU7XG4gICAgICBhd2FpdCBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uZGVhY3RpdmF0ZSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuXG4gICAgICAvLyBJZiBsYXRjaCBpcyBzdGlsbCAnZGVwbG95aW5nJyBhZnRlciB0aGUgJ2F3YWl0JywgdGhhdCdzIGZpbmUsXG4gICAgICAvLyBidXQgaWYgaXQncyAncXVldWVkJywgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGRlcGxveSBhZ2FpblxuICAgICAgd2hpbGUgKGxhdGNoID09PSAncXVldWVkJykge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3QgcmVhbGl6ZSBsYXRjaCBjYW4gY2hhbmdlIGJldHdlZW4gJ2F3YWl0cycsXG4gICAgICAgIC8vIGFuZCB0aGlua3MgdGhlIGFib3ZlICd3aGlsZScgY29uZGl0aW9uIGlzIGFsd2F5cyAnZmFsc2UnIHdpdGhvdXQgdGhlIGNhc3RcbiAgICAgICAgbGF0Y2ggPSAnZGVwbG95aW5nJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzE1Lm1zZyhcIkRldGVjdGVkIGZpbGUgY2hhbmdlcyBkdXJpbmcgZGVwbG95bWVudC4gSW52b2tpbmcgJ2NkayBkZXBsb3knIGFnYWluXCIpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcbiAgICAgIH1cbiAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgYXdhaXQgY2xvdWRXYXRjaExvZ01vbml0b3I/LmFjdGl2YXRlKCk7XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBpZ25vcmUgbWF0Y2hlciBmb3IgY2hva2lkYXIgdjQgY29tcGF0aWJpbGl0eVxuICAgIC8vIENob2tpZGFyIHY0IHJlbW92ZWQgZ2xvYiBwYXR0ZXJuIHN1cHBvcnQsIHNvIHdlIHVzZSBwaWNvbWF0Y2ggdG8gZmlsdGVyIGZpbGVzXG4gICAgLy8gV2UgcGFzcyByb290RGlyIGJlY2F1c2UgY2hva2lkYXIgdjQgcGFzc2VzIGFic29sdXRlIHBhdGhzIHRvIHRoZSBpZ25vcmVkIGNhbGxiYWNrXG4gICAgY29uc3Qgc2hvdWxkSWdub3JlID0gY3JlYXRlSWdub3JlTWF0Y2hlcih7XG4gICAgICBpbmNsdWRlOiB3YXRjaEluY2x1ZGVzLFxuICAgICAgZXhjbHVkZTogd2F0Y2hFeGNsdWRlcyxcbiAgICAgIHJvb3REaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXJcbiAgICAgIC53YXRjaCgnLicsIHtcbiAgICAgICAgaWdub3JlZDogc2hvdWxkSWdub3JlLFxuICAgICAgICBjd2Q6IHJvb3REaXIsXG4gICAgICB9KVxuICAgICAgLm9uKCdyZWFkeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKFwiJ3dhdGNoJyByZWNlaXZlZCB0aGUgJ3JlYWR5JyBldmVudC4gRnJvbSBub3cgb24sIGFsbCBmaWxlIGNoYW5nZXMgd2lsbCB0cmlnZ2VyIGEgZGVwbG95bWVudFwiKTtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzE0Lm1zZyhcIlRyaWdnZXJpbmcgaW5pdGlhbCAnY2RrIGRlcGxveSdcIikpO1xuICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgfSlcbiAgICAgIC5vbignYWxsJywgYXN5bmMgKGV2ZW50OiBFdmVudE5hbWUsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBub24tZmlsZSBldmVudHMgKGUuZy4sICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJylcbiAgICAgICAgLy8gVGhlc2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBvciBub3QgcmVsZXZhbnQgZm9yIHdhdGNoIGRlcGxveW1lbnRzXG4gICAgICAgIGlmICghaXNGaWxlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhdGNoRXZlbnQgPSB7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsYXRjaCA9PT0gJ3ByZS1yZWFkeScpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTEubXNnKGAnd2F0Y2gnIGlzIG9ic2VydmluZyAke2V2ZW50ID09PSAnYWRkRGlyJyA/ICdkaXJlY3RvcnknIDogJ3RoZSBmaWxlJ30gJyR7ZmlsZVBhdGh9JyBmb3IgY2hhbmdlc2AsIHdhdGNoRXZlbnQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXRjaCA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEyLm1zZyhgRGV0ZWN0ZWQgY2hhbmdlIHRvICcke2ZpbGVQYXRofScgKHR5cGU6ICR7ZXZlbnR9KS4gVHJpZ2dlcmluZyAnY2RrIGRlcGxveSdgLCB3YXRjaEV2ZW50KSk7XG4gICAgICAgICAgYXdhaXQgZGVwbG95QW5kV2F0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIG1lYW5zIGxhdGNoIGlzIGVpdGhlciAnZGVwbG95aW5nJyBvciAncXVldWVkJ1xuICAgICAgICAgIGxhdGNoID0gJ3F1ZXVlZCc7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEzLm1zZyhcbiAgICAgICAgICAgIGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pIHdoaWxlICdjZGsgZGVwbG95JyBpcyBzdGlsbCBydW5uaW5nLiBXaWxsIHF1ZXVlIGZvciBhbm90aGVyIGRlcGxveW1lbnQgYWZ0ZXIgdGhpcyBvbmUgZmluaXNoZXMnYCxcbiAgICAgICAgICAgIHdhdGNoRXZlbnQsXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcHBlZFByb21pc2UgPSBwcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIC8vIHN0b3AgdGhlIGxvZ3MgbW9uaXRvciwgaWYgaXQgZXhpc3RzXG4gICAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5kZWFjdGl2YXRlKCk7XG4gICAgICAgIC8vIGNsb3NlIHRoZSB3YXRjaGVyIGl0c2VsZlxuICAgICAgICBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgICAgIHN0b3BwZWRQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgd2FpdEZvckVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICB9LFxuICAgIH0gc2F0aXNmaWVzIElXYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIEFjdGlvblxuICAgKlxuICAgKiBSb2xscyBiYWNrIHRoZSBzZWxlY3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMgPSB7fSk6IFByb21pc2U8Um9sbGJhY2tSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdyb2xsYmFjaycpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9yb2xsYmFjayhhc3NlbWJseSwgJ3JvbGxiYWNrJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHJvbGxiYWNrIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgb3Igd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcm9sbGJhY2soYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ3JvbGxiYWNrJyB8ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogUm9sbGJhY2tPcHRpb25zKTogUHJvbWlzZTxSb2xsYmFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja3MsIGlvSGVscGVyKTtcblxuICAgIGNvbnN0IHJldDogUm9sbGJhY2tSZXN1bHQgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNjAwMS5tc2coJ05vIHN0YWNrcyBzZWxlY3RlZCcpKTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgbGV0IGFueVJvbGxiYWNrYWJsZSA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0YWNrXSBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByb2xsYmFja1NwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uUk9MTEJBQ0tfU1RBQ0spLmJlZ2luKGBSb2xsaW5nIGJhY2sgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX1gLCB7XG4gICAgICAgIHRvdGFsOiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgICAgY3VycmVudDogaW5kZXggKyAxLFxuICAgICAgICBzdGFjayxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdyb2xsYmFjaycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhY2tSZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50cy5yb2xsYmFja1N0YWNrKHtcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMsXG4gICAgICAgICAgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb246IG9wdGlvbnMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgICAgb3JwaGFuTG9naWNhbElkczogb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlKSB7XG4gICAgICAgICAgYW55Um9sbGJhY2thYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCByb2xsYmFja1NwYW4uZW5kKCk7XG5cbiAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgc3RhY2tBcm46IHN0YWNrUmVzdWx0LnN0YWNrQXJuLFxuICAgICAgICAgIHJlc3VsdDogc3RhY2tSZXN1bHQubm90SW5Sb2xsYmFja2FibGVTdGF0ZSA/ICdhbHJlYWR5LXN0YWJsZScgOiAncm9sbGVkLWJhY2snLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTY5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICB0aHJvdyBUb29sa2l0RXJyb3Iud2l0aENhdXNlKCdSb2xsYmFja0ZhaWxlZCcsICdSb2xsYmFjayBmYWlsZWQgKHVzZSAtLWZvcmNlIHRvIG9ycGhhbiBmYWlsaW5nIHJlc291cmNlcyknLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbnlSb2xsYmFja2FibGUpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ05vUm9sbGJhY2thYmxlU3RhY2tzJywgJ05vIHN0YWNrcyB3ZXJlIGluIGEgc3RhdGUgdGhhdCBjb3VsZCBiZSByb2xsZWQgYmFjaycpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogT3JwaGFuIEFjdGlvbi4gRGV0YWNoZXMgcmVzb3VyY2VzIGZyb20gYSBDbG91ZEZvcm1hdGlvbiBzdGFjayB3aXRob3V0IGRlbGV0aW5nIHRoZW0uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb3JwaGFuKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogT3JwaGFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZVVuc3RhYmxlRmVhdHVyZSgnb3JwaGFuJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdvcnBoYW4nKTtcblxuICAgIC8vIFBhcnNlIGNvbnN0cnVjdCBwYXRocyBpbnRvIHN0YWNrIGNvbnN0cnVjdCBJRCArIGNvbnN0cnVjdC1sZXZlbCBwYXRocy5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFuZFZhbGlkYXRlQ29uc3RydWN0UGF0aHMob3B0aW9ucy5jb25zdHJ1Y3RQYXRocyk7XG5cbiAgICAvLyBTeW50aCBhbGwgc3RhY2tzLCB0aGVuIGZpbmQgdGhlIG9uZSB3aG9zZSBoaWVyYXJjaGljYWxJZCBtYXRjaGVzIHRoZSBzdGFjayBjb25zdHJ1Y3QgSUQuXG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBBTExfU1RBQ0tTKTtcbiAgICBjb25zdCBhbGxTdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihBTExfU1RBQ0tTKTtcbiAgICBjb25zdCBzdGFjayA9IGFsbFN0YWNrcy5zdGFja0FydGlmYWN0cy5maW5kKHMgPT4gcy5oaWVyYXJjaGljYWxJZCA9PT0gcGFyc2VkLnN0YWNrSWQpO1xuXG4gICAgaWYgKCFzdGFjaykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgJ1N0YWNrTm90Rm91bmQnLFxuICAgICAgICBgTm8gc3RhY2sgZm91bmQgd2l0aCBjb25zdHJ1Y3QgSUQgJyR7cGFyc2VkLnN0YWNrSWR9Jy4gQXZhaWxhYmxlIHN0YWNrczogJHthbGxTdGFja3Muc3RhY2tBcnRpZmFjdHMubWFwKHMgPT4gcy5oaWVyYXJjaGljYWxJZCkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdvcnBoYW4nKTtcblxuICAgIGNvbnN0IG9ycGhhbmVyID0gbmV3IFJlc291cmNlT3JwaGFuZXIoe1xuICAgICAgZGVwbG95bWVudHMsXG4gICAgICBpb0hlbHBlcixcbiAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IG9wdGlvbnMudG9vbGtpdFN0YWNrTmFtZSA/PyB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwbGFuID0gYXdhaXQgb3JwaGFuZXIubWFrZVBsYW4oc3RhY2ssIHBhcnNlZC5jb25zdHJ1Y3RQYXRocyk7XG5cbiAgICAvLyBTaG93IHRoZSBwbGFuXG4gICAgY29uc3QgcmVzb3VyY2VMaW5lcyA9IHBsYW4ub3JwaGFuZWRSZXNvdXJjZXNcbiAgICAgIC5tYXAoKHIpID0+IGAgICR7ci5sb2dpY2FsSWR9ICgke3IucmVzb3VyY2VUeXBlfSkgLSAke3IuY2RrUGF0aH1gKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oXG4gICAgICBgU3RhY2s6ICR7cGxhbi5zdGFja05hbWV9XFxuYCArXG4gICAgICBgUmVzb3VyY2VzIHRvIG9ycGhhbiAoJHtwbGFuLm9ycGhhbmVkUmVzb3VyY2VzLmxlbmd0aH0pOlxcbmAgK1xuICAgICAgcmVzb3VyY2VMaW5lcyxcbiAgICApO1xuXG4gICAgLy8gQ29uZmlybSBiZWZvcmUgb3JwaGFuaW5nXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k4ODEwLnJlcShcbiAgICAgICdEbyB5b3Ugd2lzaCB0byBvcnBoYW4gdGhlc2UgcmVzb3VyY2VzPyBUaGlzIHdpbGwgcGVyZm9ybSAzIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnRzLicsIHtcbiAgICAgICAgbW90aXZhdGlvbjogJ1VzZXIgY29uZmlybWF0aW9uIGlzIG5lZWRlZCBiZWZvcmUgb3JwaGFuaW5nIHJlc291cmNlcycsXG4gICAgICB9KSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ09ycGhhbkFib3J0ZWQnLCAnQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxhbi5leGVjdXRlKCk7XG5cbiAgICAvLyBPdXRwdXQgbmV4dCBzdGVwc1xuICAgIGNvbnN0IG1hcHBpbmdKc29uID0gT2JqZWN0LmtleXMocmVzdWx0LnJlc291cmNlTWFwcGluZykubGVuZ3RoID4gMFxuICAgICAgPyBgIC0tcmVzb3VyY2UtbWFwcGluZy1pbmxpbmUgJyR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnJlc291cmNlTWFwcGluZyl9J2BcbiAgICAgIDogJyc7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhcbiAgICAgIGDinIUgUmVzb3VyY2VzIG9ycGhhbmVkIGZyb20gJHtwbGFuLnN0YWNrTmFtZX1cXG5cXG5gICtcbiAgICAgICdOZXh0IHN0ZXBzOlxcbicgK1xuICAgICAgJyAgMS4gVXBkYXRlIHlvdXIgQ0RLIGNvZGUgdG8gdXNlIHRoZSBuZXcgcmVzb3VyY2UgdHlwZVxcbicgK1xuICAgICAgYCAgMi4gY2RrIGltcG9ydCR7bWFwcGluZ0pzb259YCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmFjdG9yIEFjdGlvbi4gTW92ZXMgcmVzb3VyY2VzIGZyb20gb25lIGxvY2F0aW9uIChzdGFjayArIGxvZ2ljYWwgSUQpIHRvIGFub3RoZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmYWN0b3IoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSZWZhY3Rvck9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZVVuc3RhYmxlRmVhdHVyZSgncmVmYWN0b3InKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3JlZmFjdG9yJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZWZhY3Rvcihhc3NlbWJseSwgaW9IZWxwZXIsIGN4LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlZmFjdG9yKGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBpb0hlbHBlcjogSW9IZWxwZXIsIGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogUmVmYWN0b3JPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZGtQcm92aWRlciA9IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ3JlZmFjdG9yJyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzdGFja3NPcHQob3B0aW9ucykpO1xuICAgIGNvbnN0IGdyb3VwcyA9IGF3YWl0IGdyb3VwU3RhY2tzKHNka1Byb3ZpZGVyLCBzZWxlY3RlZFN0YWNrcy5zdGFja0FydGlmYWN0cywgb3B0aW9ucy5hZGRpdGlvbmFsU3RhY2tOYW1lcyA/PyBbXSk7XG5cbiAgICBmb3IgKGxldCB7IGVudmlyb25tZW50LCBsb2NhbFN0YWNrcywgZGVwbG95ZWRTdGFja3MgfSBvZiBncm91cHMpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0RW52aXJvbm1lbnRTZWN0aW9uSGVhZGVyKGVudmlyb25tZW50KSk7XG5cbiAgICAgIGNvbnN0IG5ld1N0YWNrcyA9IGxvY2FsU3RhY2tzLmZpbHRlcihzID0+ICFkZXBsb3llZFN0YWNrcy5tYXAodCA9PiB0LnN0YWNrTmFtZSkuaW5jbHVkZXMocy5zdGFja05hbWUpKTtcbiAgICAgIGlmIChuZXdTdGFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAvKlxuICAgICAgICAgV2hlbiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2sgcmVmYWN0b3Igb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgc3RhY2ssIGFuZCB0aGUgcmVzb3VyY2VzIGJlaW5nIG1vdmVkIHRvIHRoYXRcbiAgICAgICAgIG5ldyBzdGFjayBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIgcmVzb3VyY2VzLCBDbG91ZEZvcm1hdGlvbiBuZWVkcyB0byBkbyB3aGF0IHRoZXkgY2FsbCBcImNvbGxhcHNpbmcgdGhlXG4gICAgICAgICB0ZW1wbGF0ZVwiLiBUaGUgZGV0YWlscyBkb24ndCByZWFsbHkgbWF0dGVyLCBleGNlcHQgdGhhdCwgaW4gdGhlIHByb2Nlc3MsIGl0IGNhbGxzIHNvbWUgc2VydmljZSBBUElzLCB0byByZWFkXG4gICAgICAgICB0aGUgcmVzb3VyY2VzIGJlaW5nIG1vdmVkLiBUaGUgcm9sZSBpdCB1c2VzIHRvIGNhbGwgdGhlc2UgQVBJcyBpbnRlcm5hbGx5IGlzIHRoZSByb2xlIHRoZSB1c2VyIGNhbGxlZCB0aGVcbiAgICAgICAgIHN0YWNrIHJlZmFjdG9yaW5nIEFQSSB3aXRoLCB3aGljaCBpbiBvdXIgY2FzZSBpcyB0aGUgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudCByb2xlLCBmcm9tIHRoZSBib290c3RyYXAgc3RhY2ssXG4gICAgICAgICBieSBkZWZhdWx0LlxuXG4gICAgICAgICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgcm9sZSBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHJlYWQgYWxsIHJlc291cmNlIHR5cGVzLiBJbiB0aGlzIGNhc2UsXG4gICAgICAgICBDbG91ZEZvcm1hdGlvbiB3aWxsIHJvbGwgYmFjayB0aGUgcmVmYWN0b3Igb3BlcmF0aW9uLiBTaW5jZSB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGUgQVBJLCB0aGF0XG4gICAgICAgICB0aGUgdXNlciBjYW5ub3Qga25vdyBhYm91dCwgYW5kIGRpZG4ndCBhc2sgZm9yLCBpdCB3aWxsIGJlIHZlcnkgc3VycHJpc2luZy4gU28gd2UndmUgZGVjaWRlZCB0byBibG9jayB0aGlzIHVzZVxuICAgICAgICAgY2FzZSB1bnRpbCBDbG91ZEZvcm1hdGlvbiBzdXBwb3J0cyBwYXNzaW5nIGEgZGlmZmVyZW50IHJvbGUgdG8gdXNlIGZvciB0aGVzZSByZWFkIG9wZXJhdGlvbnMsIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICB3aXRoIGRlcGxveW1lbnQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0gYFRoZSBmb2xsb3dpbmcgc3RhY2ske25ld1N0YWNrcy5sZW5ndGggPT09IDEgPyAnIGlzJyA6ICdzIGFyZSd9IG5ldzogJHtuZXdTdGFja3MubWFwKHMgPT4gcy5zdGFja05hbWUpLmpvaW4oJywgJyl9XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSAnQ3JlYXRpb24gb2YgbmV3IHN0YWNrcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBieSB0aGUgcmVmYWN0b3IgY29tbWFuZC4gJztcbiAgICAgICAgbWVzc2FnZSArPSAnUGxlYXNlIGRlcGxveSBhbnkgbmV3IHN0YWNrcyBzZXBhcmF0ZWx5IGJlZm9yZSByZWZhY3RvcmluZyB5b3VyIHN0YWNrcy4nO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcihjaGFsay5yZWQobWVzc2FnZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBSZWZhY3RvcmluZ0NvbnRleHQoe1xuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIGRlcGxveWVkU3RhY2tzLFxuICAgICAgICAgIGxvY2FsU3RhY2tzLFxuICAgICAgICAgIGFzc3VtZVJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICBvdmVycmlkZXM6IGdldE92ZXJyaWRlcyhlbnZpcm9ubWVudCwgZGVwbG95ZWRTdGFja3MsIGxvY2FsU3RhY2tzKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSBjb250ZXh0Lm1hcHBpbmdzO1xuXG4gICAgICAgIGlmIChtYXBwaW5ncy5sZW5ndGggPT09IDAgJiYgY29udGV4dC5hbWJpZ3VvdXNQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdOb3RoaW5nIHRvIHJlZmFjdG9yLicpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZWRNYXBwaW5ncyA9IG1hcHBpbmdzXG4gICAgICAgICAgLm1hcChtID0+IG0udG9UeXBlZE1hcHBpbmcoKSlcbiAgICAgICAgICAuZmlsdGVyKG0gPT4gbS50eXBlICE9PSAnQVdTOjpDREs6Ok1ldGFkYXRhJyk7XG5cbiAgICAgICAgbGV0IHJlZmFjdG9yTWVzc2FnZSA9IGZvcm1hdFR5cGVkTWFwcGluZ3ModHlwZWRNYXBwaW5ncyk7XG4gICAgICAgIGNvbnN0IHJlZmFjdG9yUmVzdWx0OiBSZWZhY3RvclJlc3VsdCA9IHsgdHlwZWRNYXBwaW5ncyB9O1xuXG4gICAgICAgIGNvbnN0IHN0YWNrRGVmaW5pdGlvbnMgPSBhd2FpdCBnZW5lcmF0ZVN0YWNrRGVmaW5pdGlvbnMobWFwcGluZ3MsIGRlcGxveWVkU3RhY2tzLCBsb2NhbFN0YWNrcywgZW52aXJvbm1lbnQsIHNka1Byb3ZpZGVyLCBpb0hlbHBlcik7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuYW1iaWd1b3VzUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGhzID0gY29udGV4dC5hbWJpZ3VvdXNQYXRocztcbiAgICAgICAgICByZWZhY3Rvck1lc3NhZ2UgKz0gJ1xcbicgKyBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyhwYXRocyk7XG4gICAgICAgICAgcmVmYWN0b3JSZXN1bHQuYW1iaWd1b3VzUGF0aHMgPSBwYXRocztcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JODkwMC5tc2cocmVmYWN0b3JNZXNzYWdlLCByZWZhY3RvclJlc3VsdCkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmRyeVJ1biB8fCBjb250ZXh0Lm1hcHBpbmdzLmxlbmd0aCA9PT0gMCB8fCBjb250ZXh0LmFtYmlndW91c1BhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gZG8uXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIChUVFkpIHdlIG5lZWQgY29uZmlybWF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGlmIChwcm9jZXNzLnN0ZG91dC5pc1RUWSAmJiAhYXdhaXQgY29uZmlybShvcHRpb25zLmZvcmNlID8/IGZhbHNlKSkge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oY2hhbGsucmVkKGBSZWZhY3RvcmluZyBjYW5jZWxlZCBmb3IgZW52aXJvbm1lbnQgYXdzOi8vJHtlbnZpcm9ubWVudC5hY2NvdW50fS8ke2Vudmlyb25tZW50LnJlZ2lvbn1cXG5gKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdSZWZhY3RvcmluZy4uLicpO1xuICAgICAgICBhd2FpdCBjb250ZXh0LmV4ZWN1dGUoc3RhY2tEZWZpbml0aW9ucywgc2RrUHJvdmlkZXIsIGlvSGVscGVyKTtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygn4pyFICBTdGFjayByZWZhY3RvciBjb21wbGV0ZScpO1xuXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0RlcGxveWluZyB1cGRhdGVkIHN0YWNrcyB0byBmaW5hbGl6ZSByZWZhY3Rvci4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlcGxveShjeCwge1xuICAgICAgICAgIHN0YWNrczogQUxMX1NUQUNLUyxcbiAgICAgICAgICBmb3JjZURlcGxveW1lbnQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBg4p2MICBSZWZhY3RvciBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3IoZSl9YDtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U4OTAwLm1zZyhtZXNzYWdlLCB7IGVycm9yOiBlIH0pKTtcblxuICAgICAgICAvLyBBbHNvIGRlYnVnZ2luZyB0aGUgZXJyb3IsIGJlY2F1c2UgdGhlIEFQSSBkb2VzIG5vdCBhbHdheXMgcmV0dXJuIGEgdXNlci1mcmllbmRseSBtZXNzYWdlXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3ZlcnJpZGVzKGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCwgZGVwbG95ZWRTdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSwgbG9jYWxTdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSkge1xuICAgICAgY29uc3QgbWFwcGluZ0dyb3VwID0gb3B0aW9ucy5vdmVycmlkZXNcbiAgICAgICAgPy5maW5kKGcgPT4gZy5yZWdpb24gPT09IGVudmlyb25tZW50LnJlZ2lvbiAmJiBnLmFjY291bnQgPT09IGVudmlyb25tZW50LmFjY291bnQpO1xuXG4gICAgICByZXR1cm4gbWFwcGluZ0dyb3VwID09IG51bGxcbiAgICAgICAgPyBbXVxuICAgICAgICA6IE9iamVjdC5lbnRyaWVzKG1hcHBpbmdHcm91cC5yZXNvdXJjZXMgPz8ge30pXG4gICAgICAgICAgLm1hcCgoW3NvdXJjZSwgZGVzdGluYXRpb25dKSA9PiBuZXcgUmVzb3VyY2VNYXBwaW5nKFxuICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbihzb3VyY2UsIGRlcGxveWVkU3RhY2tzKSxcbiAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24oZGVzdGluYXRpb24sIGxvY2FsU3RhY2tzKSxcbiAgICAgICAgICApKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRSZXNvdXJjZUxvY2F0aW9uKGxvY2F0aW9uOiBzdHJpbmcsIHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVzb3VyY2VMb2NhdGlvbiB7XG4gICAgICBmb3IgKGxldCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgICAgY29uc3QgW3N0YWNrTmFtZSwgbG9naWNhbElkXSA9IGxvY2F0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChzdGFja05hbWUgIT0gbnVsbCAmJiBsb2dpY2FsSWQgIT0gbnVsbCAmJiBzdGFjay5zdGFja05hbWUgPT09IHN0YWNrTmFtZSAmJiBzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Lltsb2dpY2FsSWRdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTG9jYXRpb24oc3RhY2ssIGxvZ2ljYWxJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VFbnRyeSA9IE9iamVjdFxuICAgICAgICAgICAgLmVudHJpZXMoc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KVxuICAgICAgICAgICAgLmZpbmQoKFtfLCByXSkgPT4gci5NZXRhZGF0YT8uWydhd3M6Y2RrOnBhdGgnXSA9PT0gbG9jYXRpb24pO1xuICAgICAgICAgIGlmIChyZXNvdXJjZUVudHJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VMb2NhdGlvbihzdGFjaywgcmVzb3VyY2VFbnRyeVswXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSZXNvdXJjZUxvY2F0aW9uTm90Rm91bmQnLCBgQ2Fubm90IGZpbmQgcmVzb3VyY2UgaW4gbG9jYXRpb24gJHtsb2NhdGlvbn1gKTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjb25maXJtKGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAvLyAnZm9yY2UnIGlzIHNldCB0byB0cnVlIGlzIHRoZSBlcXVpdmFsZW50IG9mIGhhdmluZyBwcmUtYXBwcm92YWwgZm9yIGFueSByZWZhY3RvclxuICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVzdGlvbiA9ICdEbyB5b3Ugd2lzaCB0byByZWZhY3RvciB0aGVzZSByZXNvdXJjZXM/JztcbiAgICAgIHJldHVybiBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTg5MTAucmVxKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vdGl2YXRpb246ICdVc2VyIGlucHV0IGlzIG5lZWRlZCcsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3I6IGFueSk6IHN0cmluZyB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChwYXlsb2FkLnJlYXNvbj8uU3RhdHVzUmVhc29uKSB7XG4gICAgICAgICAgbWVzc2FnZXMucHVzaChgUmVmYWN0b3IgY3JlYXRpb246IFske3BheWxvYWQucmVhc29uPy5TdGF0dXN9XSAke3BheWxvYWQucmVhc29uLlN0YXR1c1JlYXNvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZC5yZWFzb24/LkV4ZWN1dGlvblN0YXR1c1JlYXNvbikge1xuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYFJlZmFjdG9yIGV4ZWN1dGlvbjogWyR7cGF5bG9hZC5yZWFzb24/LlN0YXR1c31dICR7cGF5bG9hZC5yZWFzb24uRXhlY3V0aW9uU3RhdHVzUmVhc29ufWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5sZW5ndGggPiAwID8gbWVzc2FnZXMuam9pbignXFxuJykgOiBgVW5rbm93biBlcnJvciAoU3RhY2sgcmVmYWN0b3IgSUQ6ICR7cGF5bG9hZC5yZWFzb24/LlN0YWNrUmVmYWN0b3JJZCA/PyAndW5rbm93bid9KWA7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IEFjdGlvblxuICAgKlxuICAgKiBEZXN0cm95cyB0aGUgc2VsZWN0ZWQgU3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXN0cm95UmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGVzdHJveScpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2Rlc3Ryb3knLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgZGVzdHJveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rlc3Ryb3koYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ2RlcGxveScgfCAnZGVzdHJveScsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTxEZXN0cm95UmVzdWx0PiB7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgcmV0OiBEZXN0cm95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW90aXZhdGlvbiA9ICdEZXN0cm95aW5nIHN0YWNrcyBpcyBhbiBpcnJldmVyc2libGUgYWN0aW9uJztcbiAgICBjb25zdCBxdWVzdGlvbiA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlOiAke2NoYWxrLnJlZChzdGFja3MuaGllcmFyY2hpY2FsSWRzLmpvaW4oJywgJykpfWA7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k3MDEwLnJlcShxdWVzdGlvbiwgeyBtb3RpdmF0aW9uIH0pKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3MDEwLm1zZygnQWJvcnRlZCBieSB1c2VyJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcbiAgICBsZXQgZGVzdHJveUNvdW50ID0gMDtcblxuICAgIGNvbnN0IGRlc3Ryb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFU1RST1lfQUNUSU9OKS5iZWdpbih7XG4gICAgICBzdGFja3M6IHN0YWNrcy5zdGFja0FydGlmYWN0cyxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVN0YWNrID0gYXN5bmMgKHN0YWNrTm9kZTogU3RhY2tOb2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tOb2RlLnN0YWNrO1xuICAgICAgICBkZXN0cm95Q291bnQrKztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzaW5nbGVEZXN0cm95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVNUUk9ZX1NUQUNLKVxuICAgICAgICAgICAgLmJlZ2luKGNoYWxrLmdyZWVuKGAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogZGVzdHJveWluZy4uLiBbJHtkZXN0cm95Q291bnR9LyR7c3RhY2tzLnN0YWNrQ291bnR9XWApLCB7XG4gICAgICAgICAgICAgIHRvdGFsOiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgICAgICAgICAgY3VycmVudDogZGVzdHJveUNvdW50LFxuICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcGxveW1lbnRzLmRlc3Ryb3lTdGFjayh7XG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldC5zdGFja3MucHVzaCh7XG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICBhY2NvdW50OiBzdGFjay5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgICAgICAgICByZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHN0YWNrQXJuOiByZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgICBzdGFja0V4aXN0ZWQ6IHJlc3VsdC5zdGFja0FybiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k3OTAwLm1zZyhjaGFsay5ncmVlbihgXFxuIOKchSAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufWVkYCksIHN0YWNrKSk7XG4gICAgICAgICAgYXdhaXQgc2luZ2xlRGVzdHJveVNwYW4uZW5kKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNzkwMC5tc2coYFxcbiDinYwgICR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiAke2FjdGlvbn0gZmFpbGVkICR7ZX1gLCB7IGVycm9yOiBlIH0pKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3b3JrR3JhcGggPSBidWlsZERlc3Ryb3lXb3JrR3JhcGgoc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLCBpb0hlbHBlcik7XG4gICAgICBhd2FpdCB3b3JrR3JhcGgucHJvY2Vzc1N0YWNrcyhjb25jdXJyZW5jeSwgZGVzdHJveVN0YWNrKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGVzdHJveVNwYW4uZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogSW9IZWxwZXIpIHtcbiAgICBjb25zdCBidWlsZGVyID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCkgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgcmV0dXJuIElPLkNES19BU1NFTUJMWV9FOTk5OTtcbiAgICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgICAgcmV0dXJuIElPLkNES19BU1NFTUJMWV9XOTk5OTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX0k5OTk5O1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEoXG4gICAgICB0aGlzLnByb3BzLmFzc2VtYmx5RmFpbHVyZUF0LFxuICAgICAgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoYnVpbGRlcihsZXZlbCkubXNnKGBbJHtsZXZlbH0gYXQgJHttc2cuaWR9XSAke21zZy5lbnRyeS5kYXRhfWAsIG1zZykpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVwbG95bWVudHMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxEZXBsb3ltZW50cz4ge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudHMoe1xuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoYWN0aW9uKSxcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnZva2VEZXBsb3lGcm9tV2F0Y2goXG4gICAgYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksXG4gICAgb3B0aW9uczogV2F0Y2hPcHRpb25zLFxuICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPzogQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2ggZGVmYXVsdHMgdG8gaG90c3dhcCBkZXBsb3ltZW50XG4gICAgY29uc3QgZGVwbG95bWVudE1ldGhvZCA9IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCA/PyB7IG1ldGhvZDogJ2hvdHN3YXAnIH07XG4gICAgY29uc3QgZGVwbG95T3B0aW9uczogUHJpdmF0ZURlcGxveU9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IsXG4gICAgICBkZXBsb3ltZW50TWV0aG9kLFxuICAgICAgZXh0cmFVc2VyQWdlbnQ6IGBjZGstd2F0Y2gvaG90c3dhcC0ke2RlcGxveW1lbnRNZXRob2QubWV0aG9kID09PSAnaG90c3dhcCcgPyAnb24nIDogJ29mZid9YCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ3dhdGNoJywgemVyb1RpbWUoKSwgZGVwbG95T3B0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBqdXN0IGNvbnRpbnVlIC0gZGVwbG95IHdpbGwgc2hvdyB0aGUgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZmVhdHVyZSBmbGFnIGluZm9ybWF0aW9uIGZyb20gdGhlIGNsb3VkIGFzc2VtYmx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmxhZ3MoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1tdPiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdmbGFncycpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZmxhZ3MnKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIGNvbnN0IGFydGlmYWN0cyA9IE9iamVjdC52YWx1ZXMoYXNzZW1ibHkuY2xvdWRBc3NlbWJseS5tYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pO1xuICAgIGNvbnN0IGZlYXR1cmVGbGFnUmVwb3J0cyA9IGFydGlmYWN0cy5maWx0ZXIoYSA9PiBhLnR5cGUgPT09IEFydGlmYWN0VHlwZS5GRUFUVVJFX0ZMQUdfUkVQT1JUKTtcblxuICAgIGNvbnN0IGZsYWdzID0gZmVhdHVyZUZsYWdSZXBvcnRzLmZsYXRNYXAocmVwb3J0ID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSByZXBvcnQucHJvcGVydGllcyBhcyBGZWF0dXJlRmxhZ1JlcG9ydFByb3BlcnRpZXM7XG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gcHJvcGVydGllcy5tb2R1bGU7XG5cbiAgICAgIGNvbnN0IGZsYWdzV2l0aFVuY29uZmlndXJlZEJlaGF2ZXNMaWtlID0gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5mbGFncylcbiAgICAgICAgLmZpbHRlcigoW18sIGZsYWdJbmZvXSkgPT4gZmxhZ0luZm8udW5jb25maWd1cmVkQmVoYXZlc0xpa2UgIT0gdW5kZWZpbmVkKTtcblxuICAgICAgY29uc3Qgc2hvdWxkSW5jbHVkZVVuY29uZmlndXJlZEJlaGF2ZXNMaWtlID0gZmxhZ3NXaXRoVW5jb25maWd1cmVkQmVoYXZlc0xpa2UubGVuZ3RoID4gMDtcblxuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMuZmxhZ3MpLm1hcCgoW2ZsYWdOYW1lLCBmbGFnSW5mb10pID0+IHtcbiAgICAgICAgY29uc3QgYmFzZUZsYWcgPSB7XG4gICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lLFxuICAgICAgICAgIG5hbWU6IGZsYWdOYW1lLFxuICAgICAgICAgIHJlY29tbWVuZGVkVmFsdWU6IGZsYWdJbmZvLnJlY29tbWVuZGVkVmFsdWUsXG4gICAgICAgICAgdXNlclZhbHVlOiBmbGFnSW5mby51c2VyVmFsdWUgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGV4cGxhbmF0aW9uOiBmbGFnSW5mby5leHBsYW5hdGlvbiA/PyAnJyxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc2hvdWxkSW5jbHVkZVVuY29uZmlndXJlZEJlaGF2ZXNMaWtlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2VGbGFnLFxuICAgICAgICAgICAgdW5jb25maWd1cmVkQmVoYXZlc0xpa2U6IHtcbiAgICAgICAgICAgICAgdjI6IGZsYWdJbmZvLnVuY29uZmlndXJlZEJlaGF2ZXNMaWtlPy52MiA/PyBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiYXNlRmxhZztcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1aXJlVW5zdGFibGVGZWF0dXJlKHJlcXVlc3RlZEZlYXR1cmU6IFVuc3RhYmxlRmVhdHVyZSkge1xuICAgIGlmICghdGhpcy51bnN0YWJsZUZlYXR1cmVzLmluY2x1ZGVzKHJlcXVlc3RlZEZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdVbnN0YWJsZUZlYXR1cmVOb3RFbmFibGVkJywgYFVuc3RhYmxlIGZlYXR1cmUgJyR7cmVxdWVzdGVkRmVhdHVyZX0nIGlzIG5vdCBlbmFibGVkLiBQbGVhc2UgZW5hYmxlIGl0IHVuZGVyICd1bnN0YWJsZUZlYXR1cmVzJyAoY3VycmVudGx5IGVuYWJsZWQ6ICR7dGhpcy51bnN0YWJsZUZlYXR1cmVzfSlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYnVpbGRBc3NldCBmdW5jdGlvbiBmb3IgdXNlIGluIFdvcmtHcmFwaFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCdWlsZEFzc2V0RnVuY3Rpb24oXG4gICAgaW9IZWxwZXI6IElvSGVscGVyLFxuICAgIGRlcGxveW1lbnRzOiBEZXBsb3ltZW50cyxcbiAgICByb2xlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHJldHVybiBhc3luYyAoYXNzZXROb2RlOiBBc3NldEJ1aWxkTm9kZSkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRBc3NldFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uQlVJTERfQVNTRVQpLmJlZ2luKHtcbiAgICAgICAgYXNzZXQ6IGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZGVwbG95bWVudHMuYnVpbGRTaW5nbGVBc3NldChcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0TWFuaWZlc3RBcnRpZmFjdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0TWFuaWZlc3QsXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgICAge1xuICAgICAgICAgIHN0YWNrOiBhc3NldE5vZGUucGFyZW50U3RhY2ssXG4gICAgICAgICAgcm9sZUFybixcbiAgICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgYXdhaXQgYnVpbGRBc3NldFNwYW4uZW5kKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwdWJsaXNoQXNzZXQgZnVuY3Rpb24gZm9yIHVzZSBpbiBXb3JrR3JhcGhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUHVibGlzaEFzc2V0RnVuY3Rpb24oXG4gICAgaW9IZWxwZXI6IElvSGVscGVyLFxuICAgIGRlcGxveW1lbnRzOiBEZXBsb3ltZW50cyxcbiAgICByb2xlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZm9yY2VQdWJsaXNoPzogYm9vbGVhbixcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIChhc3NldE5vZGU6IEFzc2V0UHVibGlzaE5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHB1Ymxpc2hBc3NldFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uUFVCTElTSF9BU1NFVCkuYmVnaW4oe1xuICAgICAgICBhc3NldDogYXNzZXROb2RlLmFzc2V0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5wdWJsaXNoU2luZ2xlQXNzZXQoYXNzZXROb2RlLmFzc2V0TWFuaWZlc3QsIGFzc2V0Tm9kZS5hc3NldCwge1xuICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICByb2xlQXJuLFxuICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICAgIGZvcmNlUHVibGlzaCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcHVibGlzaEFzc2V0U3Bhbi5lbmQoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQ2VudHJhbGl6ZSB0aGUgZGVmYXVsdCBzdGFjayBzZWxlY3Rpb24gbG9naWMgaW4gYSBzaW5nbGUgcGxhY2VcbiAqL1xuZnVuY3Rpb24gc3RhY2tzT3B0KG86IHsgc3RhY2tzPzogU3RhY2tTZWxlY3RvciB9KTogU3RhY2tTZWxlY3RvciB7XG4gIHJldHVybiBvLnN0YWNrcyA/PyBBTExfU1RBQ0tTO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gc3ludGhlc2lzIGFuZCBlbWl0IHRoZSB0aW1lIHRha2VuIHRvIGEgbmV3IHNwYW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3ludGhBbmRNZWFzdXJlKFxuICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gIGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSxcbiAgc2VsZWN0U3RhY2tzOiBTdGFja1NlbGVjdG9yLFxuKTogUHJvbWlzZTxTdGFja0Fzc2VtYmx5ICYgeyBzeW50aER1cmF0aW9uOiBFbGFwc2VkVGltZSB9PiB7XG4gIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2Uoc3ludGhTcGFuLmFzSGVscGVyLCBjeCk7XG4gICAgY291bnRBc3NlbWJseVJlc3VsdHMoc3ludGhTcGFuLCByZXQuYXNzZW1ibHkpO1xuICAgIGNvbnN0IHN5bnRoRHVyYXRpb24gPSBhd2FpdCBzeW50aFNwYW4uZW5kKHt9KTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJldCwgeyBzeW50aER1cmF0aW9uIH0pO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgLy8gRW5kIHRoZSBzcGFuIGV2ZW4gaWYgd2UgaGFkIGEgZmFpbHVyZVxuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoeyBlcnJvciB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiB6ZXJvVGltZSgpOiBFbGFwc2VkVGltZSB7XG4gIHJldHVybiB7IGFzTXM6IDAsIGFzU2VjOiAwIH07XG59XG4iXX0=
|
|
1614
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMscURBQXFEO0FBRXJELDBFQUF3RTtBQUV4RSwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLG9EQUE2RDtBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxtQkFBTSxDQUFDLEdBQUcsRUFBRSxtQkFBTSxDQUFDLE9BQU8sRUFBRSxtQkFBTSxDQUFDLE1BQU0sRUFBRSxtQkFBTSxDQUFDLE1BQU0sRUFBRSxtQkFBTSxDQUFDLFVBQVUsQ0FBVSxDQUFDO0FBRzNHOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBZ0I7SUFDbkMsT0FBUSxXQUFpQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBQ0QsK0JBQStCO0FBQy9CLHVFQUFpRTtBQUVqRSx1Q0FBK0M7QUFDL0MsbURBQStDO0FBUS9DLG9EQUF1RDtBQUN2RCw4Q0FBdUU7QUFDdkUsdURBU21DO0FBSW5DLHFEQUFvRTtBQVVwRSw2RUFBd0U7QUFDeEUsc0RBQWtFO0FBQ2xFLGdDQUEyQztBQUMzQyw4Q0FLeUI7QUFDekIseUVBQXNFO0FBQ3RFLHFEQUF1RTtBQUN2RSxnREFBZ0Q7QUFFaEQsMERBQW9GO0FBRXBGLDJEQUEyRDtBQUMzRCxpRkFBa0Y7QUFDbEYseUVBQWtGO0FBRWxGLG9EQUFpRDtBQUNqRCxpRkFBa0Y7QUFDbEYsdUVBQWlGO0FBQ2pGLHNDQUE0QztBQUM1Qyx3Q0FBZ0Q7QUFDaEQsa0VBQThEO0FBRzlELCtDQUE2RztBQUM3RyxzREFBeUY7QUFDekYscURBQTBEO0FBQzFELDJEQUErRTtBQUMvRSwwQ0FBaUQ7QUFDakQsb0RBSzRCO0FBRTVCLHNFQUFz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LEVBQUUsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLHdDQUF3QztRQUN4QyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vcHJpdmF0ZS9kaXNwb3NlLXBvbHlmaWxsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnUmVwb3J0UHJvcGVydGllcyB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBBcnRpZmFjdFR5cGUsIE1hbmlmZXN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVEaWZmIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgeyB0eXBlIEV2ZW50TmFtZSwgRVZFTlRTIH0gZnJvbSAnY2hva2lkYXIvaGFuZGxlci5qcyc7XG5cbi8qKlxuICogRmlsZSBldmVudHMgdGhhdCB3ZSBjYXJlIGFib3V0IGZyb20gY2hva2lkYXIuXG4gKiBJbiBjaG9raWRhciB2NCwgRXZlbnROYW1lIGluY2x1ZGVzIGFkZGl0aW9uYWwgZXZlbnRzIGxpa2UgJ2Vycm9yJywgJ3JhdycsICdyZWFkeScsICdhbGwnXG4gKiB0aGF0IHdlIG5lZWQgdG8gZmlsdGVyIG91dCBpbiB0aGUgJ2FsbCcgaGFuZGxlci5cbiAqL1xuY29uc3QgRklMRV9FVkVOVFMgPSBbRVZFTlRTLkFERCwgRVZFTlRTLkFERF9ESVIsIEVWRU5UUy5DSEFOR0UsIEVWRU5UUy5VTkxJTkssIEVWRU5UUy5VTkxJTktfRElSXSBhcyBjb25zdDtcbnR5cGUgRmlsZUV2ZW50ID0gdHlwZW9mIEZJTEVfRVZFTlRTW251bWJlcl07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBldmVudCBpcyBhIGZpbGUgZXZlbnQgd2Ugc2hvdWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZUV2ZW50KGV2ZW50OiBFdmVudE5hbWUpOiBldmVudCBpcyBGaWxlRXZlbnQge1xuICByZXR1cm4gKEZJTEVfRVZFTlRTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhldmVudCk7XG59XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBOb25JbnRlcmFjdGl2ZUlvSG9zdCB9IGZyb20gJy4vbm9uLWludGVyYWN0aXZlLWlvLWhvc3QnO1xuaW1wb3J0IHR5cGUgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHsgYXNzZW1ibHlGcm9tU291cmNlIH0gZnJvbSAnLi9wcml2YXRlJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4vdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgdHlwZSB7IERlcGxveVJlc3VsdCwgRGVzdHJveVJlc3VsdCwgRmVhdHVyZUZsYWcsIFJvbGxiYWNrUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJvb3RzdHJhcEVudmlyb25tZW50cyxcbiAgQm9vdHN0cmFwT3B0aW9ucyxcbiAgQm9vdHN0cmFwUmVzdWx0LFxuICBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCxcbn0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQm9vdHN0cmFwU291cmNlIH0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQXNzZXRCdWlsZFRpbWUsIHR5cGUgRGVwbG95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95JztcbmltcG9ydCB7XG4gIGJ1aWxkUGFyYW1ldGVyTWFwLFxuICBpc0NoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudCxcbiAgaXNOb25FeGVjdXRpbmdDaGFuZ2VTZXREZXBsb3ltZW50LFxuICB0eXBlIFByaXZhdGVEZXBsb3lPcHRpb25zLFxuICByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoLFxuICB0b0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50LFxufSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveS9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgRGVzdHJveU9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2Rlc3Ryb3knO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zZWRTdGFjaywgRGlhZ25vc2VPcHRpb25zLCBEaWFnbm9zZVJlc3VsdCB9IGZyb20gJy4uL2FjdGlvbnMvZGlhZ25vc2UnO1xuaW1wb3J0IHR5cGUgeyBEaWZmT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZic7XG5pbXBvcnQgeyBhcHBlbmRPYmplY3QsIHByZXBhcmVEaWZmIH0gZnJvbSAnLi4vYWN0aW9ucy9kaWZmL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBEcmlmdE9wdGlvbnMsIERyaWZ0UmVzdWx0IH0gZnJvbSAnLi4vYWN0aW9ucy9kcmlmdCc7XG5pbXBvcnQgeyB0eXBlIExpc3RPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9saXN0JztcbmltcG9ydCB0eXBlIHsgT3JwaGFuT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvb3JwaGFuJztcbmltcG9ydCB0eXBlIHsgUHVibGlzaEFzc2V0c09wdGlvbnMsIFB1Ymxpc2hBc3NldHNSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL3B1Ymxpc2gtYXNzZXRzJztcbmltcG9ydCB0eXBlIHsgUmVmYWN0b3JPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9yZWZhY3Rvcic7XG5pbXBvcnQgeyB0eXBlIFJvbGxiYWNrT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvcm9sbGJhY2snO1xuaW1wb3J0IHsgdHlwZSBTeW50aE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3N5bnRoJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGVPcHRpb25zLCBWYWxpZGF0ZVJlc3VsdCwgUG9saWN5VmFsaWRhdGlvblJlcG9ydENvbmNsdXNpb24gfSBmcm9tICcuLi9hY3Rpb25zL3ZhbGlkYXRlJztcbmltcG9ydCB0eXBlIHsgSVdhdGNoZXIsIFdhdGNoT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gnO1xuaW1wb3J0IHsgY291bnRBc3NlbWJseVJlc3VsdHMgfSBmcm9tICcuL3ByaXZhdGUvY291bnQtYXNzZW1ibHktcmVzdWx0cyc7XG5pbXBvcnQgeyBXQVRDSF9FWENMVURFX0RFRkFVTFRTIH0gZnJvbSAnLi4vYWN0aW9ucy93YXRjaC9wcml2YXRlJztcbmltcG9ydCB7IEVudmlyb25tZW50QWNjZXNzIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7XG4gIEJhc2VDcmVkZW50aWFscyxcbiAgdHlwZSBJQmFzZUNyZWRlbnRpYWxzUHJvdmlkZXIsXG4gIHR5cGUgU2RrQmFzZUNsaWVudENvbmZpZyxcbiAgdHlwZSBTZGtDb25maWcsXG59IGZyb20gJy4uL2FwaS9hd3MtYXV0aCc7XG5pbXBvcnQgeyBzZGtSZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9hd3NjbGktY29tcGF0aWJsZSc7XG5pbXBvcnQgeyBJb0hvc3RTZGtMb2dnZXIsIFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHsgQm9vdHN0cmFwcGVyIH0gZnJvbSAnLi4vYXBpL2Jvb3RzdHJhcCc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlLCBTdGFja1NlbGVjdG9yIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IENhY2hlZENsb3VkQXNzZW1ibHksIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBTdGFja0Fzc2VtYmx5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUnO1xuaW1wb3J0IHsgQUxMX1NUQUNLUyB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZUJveCB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlL2Rpc3Bvc2FibGUtYm94JztcbmltcG9ydCB7IENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3NvdXJjZS1idWlsZGVyJztcbmltcG9ydCB0eXBlIHsgU3RhY2tDb2xsZWN0aW9uIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3N0YWNrLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgRGVwbG95bWVudHMgfSBmcm9tICcuLi9hcGkvZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzIH0gZnJvbSAnLi4vYXBpL2RpYWdub3NpbmcvZGlhZ25vc2lzLWZvcm1hdHRpbmcnO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3NlciB9IGZyb20gJy4uL2FwaS9kaWFnbm9zaW5nL3N0YWNrLWRpYWdub3Nlcic7XG5pbXBvcnQgeyBEaWZmRm9ybWF0dGVyIH0gZnJvbSAnLi4vYXBpL2RpZmYnO1xuaW1wb3J0IHsgZGV0ZWN0U3RhY2tEcmlmdCB9IGZyb20gJy4uL2FwaS9kcmlmdCc7XG5pbXBvcnQgeyBEcmlmdEZvcm1hdHRlciB9IGZyb20gJy4uL2FwaS9kcmlmdC9kcmlmdC1mb3JtYXR0ZXInO1xuaW1wb3J0IHR5cGUgeyBJSW9Ib3N0LCBJb01lc3NhZ2VMZXZlbCwgVG9vbGtpdEFjdGlvbiB9IGZyb20gJy4uL2FwaS9pbyc7XG5pbXBvcnQgdHlwZSB7IEVsYXBzZWRUaW1lLCBJb0hlbHBlciB9IGZyb20gJy4uL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IGFzSW9IZWxwZXIsIElPLCBTUEFOLCB3aXRob3V0Q29sb3IsIHdpdGhvdXRFbW9qaXMsIHdpdGhUcmltbWVkV2hpdGVzcGFjZSB9IGZyb20gJy4uL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsIGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzIH0gZnJvbSAnLi4vYXBpL2xvZ3MtbW9uaXRvcic7XG5pbXBvcnQgeyBSZXNvdXJjZU9ycGhhbmVyIH0gZnJvbSAnLi4vYXBpL29ycGhhbi9vcnBoYW5lcic7XG5pbXBvcnQgeyBwYXJzZUFuZFZhbGlkYXRlQ29uc3RydWN0UGF0aHMgfSBmcm9tICcuLi9hcGkvb3JwaGFuL3ByaXZhdGUvaGVscGVycyc7XG5pbXBvcnQgeyBNb2RlLCBQbHVnaW5Ib3N0IH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5pbXBvcnQge1xuICBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyxcbiAgZm9ybWF0RW52aXJvbm1lbnRTZWN0aW9uSGVhZGVyLFxuICBmb3JtYXRUeXBlZE1hcHBpbmdzLFxuICBncm91cFN0YWNrcyxcbn0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZy9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZU1hcHBpbmcsIFJlc291cmNlTG9jYXRpb24gfSBmcm9tICcuLi9hcGkvcmVmYWN0b3JpbmcvY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVmYWN0b3JpbmdDb250ZXh0IH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTdGFja0RlZmluaXRpb25zIH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL3N0YWNrLWRlZmluaXRpb25zJztcbmltcG9ydCB7IFJlc291cmNlTWlncmF0b3IgfSBmcm9tICcuLi9hcGkvcmVzb3VyY2UtaW1wb3J0JztcbmltcG9ydCB7IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIgfSBmcm9tICcuLi9hcGkvc291cmNlLXRyYWNpbmcvcHJpdmF0ZS9zdGFjay1zb3VyY2UtdHJhY2luZyc7XG5pbXBvcnQgeyB0YWdzRm9yU3RhY2sgfSBmcm9tICcuLi9hcGkvdGFncy9wcml2YXRlJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FIH0gZnJvbSAnLi4vYXBpL3Rvb2xraXQtaW5mbyc7XG5pbXBvcnQgdHlwZSB7IEFzc2V0QnVpbGROb2RlLCBBc3NldFB1Ymxpc2hOb2RlLCBDb25jdXJyZW5jeSwgU3RhY2tOb2RlIH0gZnJvbSAnLi4vYXBpL3dvcmstZ3JhcGgnO1xuaW1wb3J0IHsgV29ya0dyYXBoLCBXb3JrR3JhcGhCdWlsZGVyLCBidWlsZERlc3Ryb3lXb3JrR3JhcGggfSBmcm9tICcuLi9hcGkvd29yay1ncmFwaCc7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5RGF0YSwgUmVmYWN0b3JSZXN1bHQsIFN0YWNrRGV0YWlscywgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNoYW5nZVR5cGUgfSBmcm9tICcuLi9wYXlsb2Fkcyc7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UsIGZvcm1hdFRpbWUsIG9ic2N1cmVUZW1wbGF0ZSwgc2VyaWFsaXplU3RydWN0dXJlLCB2YWxpZGF0ZVNuc1RvcGljQXJuIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBwTGltaXQgfSBmcm9tICcuLi91dGlsL2NvbmN1cnJlbmN5JztcbmltcG9ydCB7IGNyZWF0ZUlnbm9yZU1hdGNoZXIgfSBmcm9tICcuLi91dGlsL2dsb2ItbWF0Y2hlcic7XG5pbXBvcnQgeyBwcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gJy4uL3V0aWwvcHJvbWlzZXMnO1xuXG5jb25zdCBQT0xJQ1lfVkFMSURBVElPTl9SRVBPUlRfRklMRSA9ICd2YWxpZGF0aW9uLXJlcG9ydC5qc29uJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IGltcGxlbWVudGF0aW9uLCBoYW5kbGluZyB0aGUgaW5saW5lIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBUb29sa2l0IGFuZCBhbiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIEFsbG93IGVtb2ppcyBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVtb2ppcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgQU5TSSBjb2xvcnMgYW5kIGZvcm1hdHRpbmcgaW4gSW9Ib3N0IG1lc3NhZ2VzLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBlbmZvcmNlcyB0aGF0IG5vIGNvbG9yIG9yIHN0eWxlIHNob3dzIHVwXG4gICAqIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgaXMgYSBuby1vcDsgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZXRlY3RzIGNvbG9yIGZyb20gdGhlIFRUWSBzdGF0dXMgb2YgdGhlIElvSG9zdFxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBTREsuXG4gICAqL1xuICByZWFkb25seSBzZGtDb25maWc/OiBTZGtDb25maWc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2sgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDREtUb29sa2l0XCJcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWwgQ2xvdWQgQXNzZW1ibGllc1xuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIHJlYWRvbmx5IGFzc2VtYmx5RmFpbHVyZUF0PzogJ2Vycm9yJyB8ICd3YXJuJyB8ICdub25lJztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBob3N0IHRvIHVzZSBmb3IgbG9hZGluZyBhbmQgcXVlcnlpbmcgcGx1Z2luc1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIHVuaXF1ZSBpbnN0YW5jZSBvZiBhIHBsdWdpbiBtYW5hZ2luZyBjbGFzcyB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFVzZSBgdG9vbGtpdC5wbHVnaW5Ib3N0LmxvYWQoKWAgdG8gbG9hZCBwbHVnaW5zIGludG8gdGhlIHBsdWdpbiBob3N0IGZyb20gZGlzay5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIGZyZXNoIHBsdWdpbiBob3N0XG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ib3N0PzogUGx1Z2luSG9zdDtcblxuICAvKipcbiAgICogU2V0IG9mIHVuc3RhYmxlIGZlYXR1cmVzIHRvIG9wdCBpbnRvLiBJZiB5b3UgYXJlIHVzaW5nIGFuIHVuc3RhYmxlIGZlYXR1cmUsXG4gICAqIHlvdSBtdXN0IGV4cGxpY2l0bHkgYWNrbm93bGVkZ2UgdGhhdCB5b3UgYXJlIGF3YXJlIG9mIHRoZSByaXNrcyBvZiB1c2luZyBpdCxcbiAgICogYnkgcGFzc2luZyBpdCBpbiB0aGlzIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHVuc3RhYmxlRmVhdHVyZXM/OiBBcnJheTxVbnN0YWJsZUZlYXR1cmU+O1xufVxuXG4vKipcbiAqIE5hbWVzIG9mIHRvb2xraXQgZmVhdHVyZXMgdGhhdCBhcmUgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQsIGFuZCBtYXkgY2hhbmdlIGluXG4gKiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgdHlwZSBVbnN0YWJsZUZlYXR1cmUgPSAncmVmYWN0b3InIHwgJ29ycGhhbicgfCAnZmxhZ3MnIHwgJ3B1Ymxpc2gtYXNzZXRzJyB8ICdkaWFnbm9zZSc7XG5cbi8qKlxuICogVGhlIEFXUyBDREsgUHJvZ3JhbW1hdGljIFRvb2xraXRcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2xraXQgZXh0ZW5kcyBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB7XG4gIC8qKlxuICAgKiBUaGUgdG9vbGtpdCBzdGFjayBuYW1lIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElvSG9zdCBvZiB0aGlzIFRvb2xraXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpb0hvc3Q6IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaG9zdCBmb3IgbG9hZGluZyBhbmQgbWFuYWdpbmcgcGx1Z2luc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbkhvc3Q6IFBsdWdpbkhvc3Q7XG5cbiAgLyoqXG4gICAqIENhY2hlIG9mIHRoZSBpbnRlcm5hbCBTREsgUHJvdmlkZXIgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgc2RrUHJvdmlkZXJDYWNoZT86IFNka1Byb3ZpZGVyO1xuXG4gIHByaXZhdGUgYmFzZUNyZWRlbnRpYWxzOiBJQmFzZUNyZWRlbnRpYWxzUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB1bnN0YWJsZUZlYXR1cmVzOiBBcnJheTxVbnN0YWJsZUZlYXR1cmU+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBUb29sa2l0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRvb2xraXRTdGFja05hbWUgPSBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuXG4gICAgdGhpcy5wbHVnaW5Ib3N0ID0gcHJvcHMucGx1Z2luSG9zdCA/PyBuZXcgUGx1Z2luSG9zdCgpO1xuXG4gICAgbGV0IGlvSG9zdCA9IHByb3BzLmlvSG9zdCA/PyBuZXcgTm9uSW50ZXJhY3RpdmVJb0hvc3QoKTtcbiAgICBpZiAocHJvcHMuZW1vamlzID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dEVtb2ppcyhpb0hvc3QpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuY29sb3IgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0Q29sb3IoaW9Ib3N0KTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgZW1vamlzIGFuZCBjb2xvciwgd2UgbWlnaHQgZW5kIHVwIHdpdGggZmxvYXRpbmcgd2hpdGVzcGFjZSBhdCBlaXRoZXIgZW5kIG9mIHRoZSBtZXNzYWdlXG4gICAgLy8gVGhpcyBhbHNvIHJlbW92ZXMgbmV3bGluZXMgdGhhdCB3ZSBjdXJyZW50bHkgZW1pdCBmb3IgQ0xJIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHRoaXMuaW9Ib3N0ID0gd2l0aFRyaW1tZWRXaGl0ZXNwYWNlKGlvSG9zdCk7XG5cbiAgICB0aGlzLmJhc2VDcmVkZW50aWFscyA9IHByb3BzLnNka0NvbmZpZz8uYmFzZUNyZWRlbnRpYWxzID8/IEJhc2VDcmVkZW50aWFscy5hd3NDbGlDb21wYXRpYmxlKCk7XG4gICAgdGhpcy51bnN0YWJsZUZlYXR1cmVzID0gcHJvcHMudW5zdGFibGVGZWF0dXJlcyA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gdGhlIEFXUyBTREtcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2RrUHJvdmlkZXIoYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxTZGtQcm92aWRlcj4ge1xuICAgIC8vIEB0b2RvIHRoaXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50IGluc3RhbmNlIHBlciBhY3Rpb25cbiAgICBpZiAoIXRoaXMuc2RrUHJvdmlkZXJDYWNoZSkge1xuICAgICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgICAgY29uc3QgY2xpZW50Q29uZmlnOiBTZGtCYXNlQ2xpZW50Q29uZmlnID0ge1xuICAgICAgICByZXF1ZXN0SGFuZGxlcjogc2RrUmVxdWVzdEhhbmRsZXIodGhpcy5wcm9wcy5zZGtDb25maWc/Lmh0dHBPcHRpb25zPy5hZ2VudCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmJhc2VDcmVkZW50aWFscy5zZGtCYXNlQ29uZmlnKGlvSGVscGVyLCBjbGllbnRDb25maWcpO1xuICAgICAgdGhpcy5zZGtQcm92aWRlckNhY2hlID0gbmV3IFNka1Byb3ZpZGVyKGNvbmZpZy5jcmVkZW50aWFsUHJvdmlkZXIsIGNvbmZpZy5kZWZhdWx0UmVnaW9uLCB7XG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICBsb2dnZXI6IG5ldyBJb0hvc3RTZGtMb2dnZXIoaW9IZWxwZXIpLFxuICAgICAgICBwbHVnaW5Ib3N0OiB0aGlzLnBsdWdpbkhvc3QsXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiBjbGllbnRDb25maWcucmVxdWVzdEhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZGtQcm92aWRlckNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBwcm92aWRlIHRoZSBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB3aXRoIHJlcXVpcmVkIHRvb2xraXQgc2VydmljZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc291cmNlQnVpbGRlclNlcnZpY2VzKCk6IFByb21pc2U8VG9vbGtpdFNlcnZpY2VzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnYXNzZW1ibHknKSxcbiAgICAgIHNka1Byb3ZpZGVyOiBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdhc3NlbWJseScpLFxuICAgICAgcGx1Z2luSG9zdDogdGhpcy5wbHVnaW5Ib3N0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJvb3RzdHJhcChlbnZpcm9ubWVudHM6IEJvb3RzdHJhcEVudmlyb25tZW50cywgb3B0aW9uczogQm9vdHN0cmFwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxCb290c3RyYXBSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEVudmlyb25tZW50Qm9vdHN0cmFwUmVzdWx0W10gPSBbXTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHModGhpcy5pb0hvc3QpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IEJvb3RzdHJhcFNvdXJjZS5kZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBib290c3RyYXBwZXIgPSBuZXcgQm9vdHN0cmFwcGVyKHNvdXJjZSwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG5cbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdCgyMCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICBhd2FpdCBQcm9taXNlLmFsbChib290c3RyYXBFbnZpcm9ubWVudHMubWFwKChlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsIGN1cnJlbnRJZHgpID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uQk9PVFNUUkFQX1NJTkdMRSlcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9OiBib290c3RyYXBwaW5nLi4uYCwge1xuICAgICAgICAgIHRvdGFsOiBib290c3RyYXBFbnZpcm9ubWVudHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnRJZHggKyAxLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwUmVzdWx0ID0gYXdhaXQgYm9vdHN0cmFwcGVyLmJvb3RzdHJhcEVudmlyb25tZW50KFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIHNka1Byb3ZpZGVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGJvb3RzdHJhcFJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5OTAwLm1zZyhjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCB7IGVudmlyb25tZW50IH0pKTtcbiAgICAgICAgY29uc3QgZW52VGltZSA9IGF3YWl0IGJvb3RzdHJhcFNwYW4uZW5kKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQgPSB7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc3RhdHVzOiBib290c3RyYXBSZXN1bHQubm9PcCA/ICduby1vcCcgOiAnc3VjY2VzcycsXG4gICAgICAgICAgZHVyYXRpb246IGVudlRpbWUuYXNNcyxcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U5OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ib2xkKGVudmlyb25tZW50Lm5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnRzOiByZXN1bHRzLFxuICAgICAgZHVyYXRpb246IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCBBY3Rpb25cbiAgICpcbiAgICogVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgYENhY2hlZENsb3VkQXNzZW1ibHlgIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgZGlzcG9zZSgpYCBvblxuICAgKiBpdCBhZnRlciB1c2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3ludGgoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBTeW50aE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkQ2xvdWRBc3NlbWJseT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IG5ldyBBc3luY0Rpc3Bvc2FibGVCb3goYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKSk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkudmFsdWUuc2VsZWN0U3RhY2tzVjIoc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICBjb25zdCBhdXRvVmFsaWRhdGVTdGFja3MgPSBvcHRpb25zLnZhbGlkYXRlU3RhY2tzID8gW2Fzc2VtYmx5LnZhbHVlLnNlbGVjdFN0YWNrc0ZvclZhbGlkYXRpb24oKV0gOiBbXTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzLmNvbmNhdCguLi5hdXRvVmFsaWRhdGVTdGFja3MpLCBpb0hlbHBlcik7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGEgc2luZ2xlIHN0YWNrLCBwcmludCBpdCB0byBTVERPVVRcbiAgICBjb25zdCBtZXNzYWdlID0gYFN1Y2Nlc3NmdWxseSBzeW50aGVzaXplZCB0byAke2NoYWxrLmJsdWUocGF0aC5yZXNvbHZlKHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnkpKX1gO1xuICAgIGNvbnN0IGFzc2VtYmx5RGF0YTogQXNzZW1ibHlEYXRhID0ge1xuICAgICAgYXNzZW1ibHlEaXJlY3Rvcnk6IHN0YWNrcy5hc3NlbWJseS5kaXJlY3RvcnksXG4gICAgICBzdGFja3NDb3VudDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICBzdGFja0lkczogc3RhY2tzLmhpZXJhcmNoaWNhbElkcyxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdFN0YWNrID0gc3RhY2tzLmZpcnN0U3RhY2shO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmaXJzdFN0YWNrLnRlbXBsYXRlO1xuICAgICAgY29uc3Qgb2JzY3VyZWRUZW1wbGF0ZSA9IG9ic2N1cmVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTE5MDEubXNnKG1lc3NhZ2UsIHtcbiAgICAgICAgLi4uYXNzZW1ibHlEYXRhLFxuICAgICAgICBzdGFjazoge1xuICAgICAgICAgIHN0YWNrTmFtZTogZmlyc3RTdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgaGllcmFyY2hpY2FsSWQ6IGZpcnN0U3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgc3RyaW5naWZpZWRKc29uOiBzZXJpYWxpemVTdHJ1Y3R1cmUob2JzY3VyZWRUZW1wbGF0ZSwgdHJ1ZSksXG4gICAgICAgICAgc3RyaW5naWZpZWRZYW1sOiBzZXJpYWxpemVTdHJ1Y3R1cmUob2JzY3VyZWRUZW1wbGF0ZSwgZmFsc2UpLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3Qgb3V0cHV0dGluZyB0ZW1wbGF0ZSB0byBzdGRvdXQsIGxldCdzIGV4cGxhaW4gdGhpbmdzIHRvIHRoZSB1c2VyIGEgbGl0dGxlIGJpdC4uLlxuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0kxOTAyLm1zZyhjaGFsay5ncmVlbihtZXNzYWdlKSwgYXNzZW1ibHlEYXRhKSk7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBTdXBwbHkgYSBzdGFjayBpZCAoJHtzdGFja3Muc3RhY2tBcnRpZmFjdHMubWFwKChzKSA9PiBjaGFsay5ncmVlbihzLmhpZXJhcmNoaWNhbElkKSkuam9pbignLCAnKX0pIHRvIGRpc3BsYXkgaXRzIHRlbXBsYXRlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ2FjaGVkQ2xvdWRBc3NlbWJseShhc3NlbWJseS50YWtlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZmYgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlmZihjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERpZmZPcHRpb25zID0ge30pOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IFRlbXBsYXRlRGlmZiB9PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGlmZicpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IGRpZmZTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRJRkZfU1RBQ0spLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdkaWZmJyk7XG5cbiAgICBjb25zdCBzdHJpY3QgPSAhIW9wdGlvbnMuc3RyaWN0O1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IG9wdGlvbnMuY29udGV4dExpbmVzIHx8IDM7XG5cbiAgICBsZXQgZGlmZnMgPSAwO1xuICAgIGxldCBzZWN1cml0eURpZmZzID0gMDtcblxuICAgIGNvbnN0IHRlbXBsYXRlSW5mb3MgPSBhd2FpdCBwcmVwYXJlRGlmZihkaWZmU3Bhbi5hc0hlbHBlciwgc3RhY2tzLCBkZXBsb3ltZW50cywgYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGlmZicpLCBvcHRpb25zKTtcbiAgICBjb25zdCB0ZW1wbGF0ZURpZmZzOiB7IFtuYW1lOiBzdHJpbmddOiBUZW1wbGF0ZURpZmYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGVJbmZvIG9mIHRlbXBsYXRlSW5mb3MpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEaWZmRm9ybWF0dGVyKHsgdGVtcGxhdGVJbmZvIH0pO1xuICAgICAgY29uc3Qgc3RhY2tEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFN0YWNrRGlmZih7IHN0cmljdCwgY29udGV4dExpbmVzIH0pO1xuXG4gICAgICAvLyBTZWN1cml0eSBEaWZmXG4gICAgICBjb25zdCBzZWN1cml0eURpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U2VjdXJpdHlEaWZmKCk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRTZWN1cml0eURpZmYgPSBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUgIT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUgPyBzdGFja0RpZmYuZm9ybWF0dGVkRGlmZiA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFdlIG9ubHkgd2FybiBhYm91dCBCUk9BREVOSU5HIGNoYW5nZXNcbiAgICAgIGlmIChzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUgPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORykge1xuICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9ICdUaGlzIGRlcGxveW1lbnQgd2lsbCBtYWtlIHBvdGVudGlhbGx5IHNlbnNpdGl2ZSBjaGFuZ2VzIGFjY29yZGluZyB0byB5b3VyIGN1cnJlbnQgc2VjdXJpdHkgYXBwcm92YWwgbGV2ZWwuXFxuUGxlYXNlIGNvbmZpcm0geW91IGludGVuZCB0byBtYWtlIHRoZSBmb2xsb3dpbmcgbW9kaWZpY2F0aW9uczpcXG4nO1xuICAgICAgICBhd2FpdCBkaWZmU3Bhbi5kZWZhdWx0cy53YXJuKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgICAgYXdhaXQgZGlmZlNwYW4uZGVmYXVsdHMuaW5mbyhzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZik7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YWNrIERpZmZcbiAgICAgIGRpZmZzICs9IHN0YWNrRGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIHNlY3VyaXR5RGlmZnMgKz0gc2VjdXJpdHlEaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgYXBwZW5kT2JqZWN0KHRlbXBsYXRlRGlmZnMsIGZvcm1hdHRlci5kaWZmcyk7XG4gICAgICBhd2FpdCBkaWZmU3Bhbi5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTQwMDIubXNnKHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmLCB7XG4gICAgICAgIHN0YWNrOiB0ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUsXG4gICAgICAgIGRpZmZzOiBmb3JtYXR0ZXIuZGlmZnMsXG4gICAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBzdGFja0RpZmYubnVtU3RhY2tzV2l0aENoYW5nZXMsXG4gICAgICAgIG51bVN0YWNrc1dpdGhTZWN1cml0eUNoYW5nZXM6IHNlY3VyaXR5RGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcyxcbiAgICAgICAgcGVybWlzc2lvbkNoYW5nZXM6IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSxcbiAgICAgICAgZm9ybWF0dGVkRGlmZjoge1xuICAgICAgICAgIGRpZmY6IHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmLFxuICAgICAgICAgIHNlY3VyaXR5OiBmb3JtYXR0ZWRTZWN1cml0eURpZmYsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGlmZlNwYW4uZW5kKGDinKggTnVtYmVyIG9mIHN0YWNrcyB3aXRoIGRpZmZlcmVuY2VzOiAke2RpZmZzfWAsIHtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzOiBkaWZmcyxcbiAgICAgIG51bVN0YWNrc1dpdGhTZWN1cml0eUNoYW5nZXM6IHNlY3VyaXR5RGlmZnMsXG4gICAgICBkaWZmczogdGVtcGxhdGVEaWZmcyxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZW1wbGF0ZURpZmZzO1xuICB9XG5cbiAgLyoqXG4gICAqIERyaWZ0IEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRyaWZ0KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRHJpZnRPcHRpb25zID0ge30pOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IERyaWZ0UmVzdWx0IH0+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkcmlmdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgZHJpZnRTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRSSUZUX0FQUCkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBhbGxEcmlmdFJlc3VsdHM6IHsgW25hbWU6IHN0cmluZ106IERyaWZ0UmVzdWx0IH0gPSB7fTtcbiAgICBjb25zdCB1bmF2YWlsYWJsZURyaWZ0cyA9IFtdO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZHJpZnQnKTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzKSB7XG4gICAgICBjb25zdCBjZm4gPSAoYXdhaXQgc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQoc3RhY2suZW52aXJvbm1lbnQsIE1vZGUuRm9yUmVhZGluZykpLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgICAgY29uc3QgZHJpZnRSZXN1bHRzID0gYXdhaXQgZGV0ZWN0U3RhY2tEcmlmdChjZm4sIGRyaWZ0U3Bhbi5hc0hlbHBlciwgc3RhY2suc3RhY2tOYW1lKTtcblxuICAgICAgaWYgKCFkcmlmdFJlc3VsdHMuU3RhY2tSZXNvdXJjZURyaWZ0cykge1xuICAgICAgICBjb25zdCBzdGFja05hbWUgPSBzdGFjay5kaXNwbGF5TmFtZSA/PyBzdGFjay5zdGFja05hbWU7XG4gICAgICAgIHVuYXZhaWxhYmxlRHJpZnRzLnB1c2goc3RhY2tOYW1lKTtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNDU5MS5tc2coYCR7c3RhY2tOYW1lfTogTm8gZHJpZnQgcmVzdWx0cyBhdmFpbGFibGVgLCB7IHN0YWNrIH0pKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEcmlmdEZvcm1hdHRlcih7IHN0YWNrLCByZXNvdXJjZURyaWZ0czogZHJpZnRSZXN1bHRzLlN0YWNrUmVzb3VyY2VEcmlmdHMgfSk7XG4gICAgICBjb25zdCBkcmlmdE91dHB1dCA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RyaWZ0KCk7XG4gICAgICBjb25zdCBzdGFja0RyaWZ0ID0ge1xuICAgICAgICBudW1SZXNvdXJjZXNXaXRoRHJpZnQ6IGRyaWZ0T3V0cHV0Lm51bVJlc291cmNlc1dpdGhEcmlmdCxcbiAgICAgICAgbnVtUmVzb3VyY2VzVW5jaGVja2VkOiBkcmlmdE91dHB1dC5udW1SZXNvdXJjZXNVbmNoZWNrZWQsXG4gICAgICAgIGZvcm1hdHRlZERyaWZ0OiB7XG4gICAgICAgICAgdW5jaGFuZ2VkOiBkcmlmdE91dHB1dC51bmNoYW5nZWQsXG4gICAgICAgICAgdW5jaGVja2VkOiBkcmlmdE91dHB1dC51bmNoZWNrZWQsXG4gICAgICAgICAgbW9kaWZpZWQ6IGRyaWZ0T3V0cHV0Lm1vZGlmaWVkLFxuICAgICAgICAgIGRlbGV0ZWQ6IGRyaWZ0T3V0cHV0LmRlbGV0ZWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYWxsRHJpZnRSZXN1bHRzW2Zvcm1hdHRlci5zdGFja05hbWVdID0gc3RhY2tEcmlmdDtcblxuICAgICAgLy8gaGVhZGVyXG4gICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuaW5mbyhkcmlmdE91dHB1dC5zdGFja0hlYWRlcik7XG5cbiAgICAgIC8vIHByaW50IHRoZSBkaWZmZXJlbnQgc2VjdGlvbnMgYXQgZGlmZmVyZW50IGxldmVsc1xuICAgICAgaWYgKGRyaWZ0T3V0cHV0LnVuY2hhbmdlZCkge1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuZGVidWcoZHJpZnRPdXRwdXQudW5jaGFuZ2VkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmlmdE91dHB1dC51bmNoZWNrZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmRlYnVnKGRyaWZ0T3V0cHV0LnVuY2hlY2tlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZHJpZnRPdXRwdXQubW9kaWZpZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmluZm8oZHJpZnRPdXRwdXQubW9kaWZpZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWZ0T3V0cHV0LmRlbGV0ZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmluZm8oZHJpZnRPdXRwdXQuZGVsZXRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIG1haW4gc3RhY2sgcmVzdWx0XG4gICAgICBhd2FpdCBkcmlmdFNwYW4ubm90aWZ5KElPLkNES19UT09MS0lUX0k0NTkwLm1zZyhkcmlmdE91dHB1dC5zdW1tYXJ5LCB7XG4gICAgICAgIHN0YWNrLFxuICAgICAgICBkcmlmdDogc3RhY2tEcmlmdCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBwcmludCBzdW1tYXJ5XG4gICAgY29uc3QgdG90YWxEcmlmdHMgPSBPYmplY3QudmFsdWVzKGFsbERyaWZ0UmVzdWx0cykucmVkdWNlKCh0b3RhbCwgY3VycmVudCkgPT4gdG90YWwgKyAoY3VycmVudC5udW1SZXNvdXJjZXNXaXRoRHJpZnQgPz8gMCksIDApO1xuICAgIGNvbnN0IHRvdGFsVW5jaGVja2VkID0gT2JqZWN0LnZhbHVlcyhhbGxEcmlmdFJlc3VsdHMpLnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQubnVtUmVzb3VyY2VzVW5jaGVja2VkID8/IDApLCAwKTtcbiAgICBhd2FpdCBkcmlmdFNwYW4uZW5kKGBcXG7inKggIE51bWJlciBvZiByZXNvdXJjZXMgd2l0aCBkcmlmdDogJHt0b3RhbERyaWZ0c30ke3RvdGFsVW5jaGVja2VkID8gYCAoJHt0b3RhbFVuY2hlY2tlZH0gdW5jaGVja2VkKWAgOiAnJ31gKTtcbiAgICBpZiAodW5hdmFpbGFibGVEcmlmdHMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMud2FybihgXFxu4pqg77iPICBGYWlsZWQgdG8gY2hlY2sgZHJpZnQgZm9yICR7dW5hdmFpbGFibGVEcmlmdHMubGVuZ3RofSBzdGFjayhzKS4gQ2hlY2sgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbERyaWZ0UmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIEFzc2V0cyBBY3Rpb25cbiAgICpcbiAgICogUHVibGlzaGVzIGFzc2V0cyBmb3IgdGhlIHNlbGVjdGVkIHN0YWNrcyB3aXRob3V0IGRlcGxveWluZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2hBc3NldHMoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBQdWJsaXNoQXNzZXRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQdWJsaXNoQXNzZXRzUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdwdWJsaXNoLWFzc2V0cycpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAncHVibGlzaC1hc3NldHMnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tDb2xsZWN0aW9uLCBpb0hlbHBlcik7XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAwMS5tc2coJ05vIHN0YWNrcyBzZWxlY3RlZCcpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncHVibGlzaC1hc3NldHMnKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzID0gc3RhY2tzLmZsYXRNYXAoKHN0YWNrKSA9PiBbXG4gICAgICBzdGFjayxcbiAgICAgIC4uLnN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoeCA9PiBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3QuaXNBc3NldE1hbmlmZXN0QXJ0aWZhY3QoeCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoXG4gICAgICBpb0hlbHBlcixcbiAgICAgIHRydWUsIC8vIHByZWJ1aWxkIGFsbCBhc3NldHNcbiAgICApLmJ1aWxkKHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMpO1xuXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhd2FpdCByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoKHdvcmtHcmFwaCwgZGVwbG95bWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0Tm9kZXMgPSBPYmplY3QudmFsdWVzKHdvcmtHcmFwaC5ub2RlcylcbiAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIEFzc2V0UHVibGlzaE5vZGUgPT4gbi50eXBlID09PSAnYXNzZXQtcHVibGlzaCcpO1xuXG4gICAgaWYgKGFzc2V0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk0MDAubXNnKGNoYWxrLmdyZWVuKCdcXG7inKggIEFsbCBhc3NldHMgYXJlIGFscmVhZHkgcHVibGlzaGVkXFxuJykpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0cyA9IGFzc2V0Tm9kZXMubWFwKG4gPT4gbi5hc3NldCk7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAxLm1zZygnUHVibGlzaGluZyBhc3NldHMnLCB7IGFzc2V0cyB9KSk7XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgPz8gNDtcbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IDEsXG4gICAgICAnYXNzZXQtYnVpbGQnOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1wdWJsaXNoJzogY29uY3VycmVuY3ksXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIC8vIE5vLW9wOiB3ZSdyZSBvbmx5IHB1Ymxpc2hpbmcgYXNzZXRzLCBub3QgZGVwbG95aW5nXG4gICAgICBkZXBsb3lTdGFjazogV29ya0dyYXBoLk5PT1AsXG4gICAgICBidWlsZEFzc2V0OiB0aGlzLmNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIHVuZGVmaW5lZCksXG4gICAgICBwdWJsaXNoQXNzZXQ6IHRoaXMuY3JlYXRlUHVibGlzaEFzc2V0RnVuY3Rpb24oaW9IZWxwZXIsIGRlcGxveW1lbnRzLCB1bmRlZmluZWQsIG9wdGlvbnMuZm9yY2UpLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAyLm1zZyhjaGFsay5ncmVlbignXFxu4pyoICBBc3NldHMgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseVxcbicpLCB7IGFzc2V0cyB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGlzaGVkQXNzZXRzOiBhc3NldHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IEFjdGlvblxuICAgKlxuICAgKiBMaXN0IHNlbGVjdGVkIHN0YWNrcyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IExpc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFN0YWNrRGV0YWlsc1tdPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnbGlzdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMjkwMS5tc2cobWVzc2FnZSwgeyBzdGFja3MgfSkpO1xuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGZpbmQgdGhlIHJvb3QgY2F1c2VzIGZvciBkZXBsb3ltZW50IGZhaWx1cmVzIG9mIHRoZSBnaXZlbiBzdGFja3MuXG4gICAqXG4gICAqIEJvdGggZW1pdHMgdGhlIGRpYWdub3NpcyByZXN1bHRzIG92ZXIgdGhlIElPIGhvc3QgYXMgdGhleSBhcmUgY29taW5nIGluLCBhcyB3ZWxsXG4gICAqIGFzIHJldHVybnMgYWxsIG9mIHRoZW0gYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIE5PVEU6IFRoZSBDbG91ZCBBc3NlbWJseSBTb3VyY2UgKipzaG91bGQqKiBiZSBjb25maWd1cmVkIHdpdGggYGRlYnVnOiB0cnVlYCB0byBhZGRcbiAgICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpYWdub3NlKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGlhZ25vc2VPcHRpb25zID0ge30pOiBQcm9taXNlPERpYWdub3NlUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdkaWFnbm9zZScpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGlhZ25vc2UnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2Vzcyhhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkaWFnbm9zZScpLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsIGlvSGVscGVyKTtcblxuICAgIC8vIERvIHN0YWNrcyBpbiBwYXJhbGxlbCwgZm9yIHNwZWVkLlxuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KG9wdGlvbnMuY29uY3VycmVuY3kgPz8gMTApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzLm1hcCgoc3RhY2spID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2spO1xuXG4gICAgICBjb25zdCBkaWFnbm9zZXIgPSBuZXcgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3Nlcih7XG4gICAgICAgIHNkazogc3RhY2tFbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IHN0YWNrRW52LnJlc291cmNlcyxcbiAgICAgICAgc291cmNlVHJhY2VyOiBuZXcgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlcihzdGFjayksXG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCBkaWFnbm9zZXIuZGlhZ25vc2VGcm9tRnJlc2goc3RhY2suc3RhY2tOYW1lKTtcblxuICAgICAgY29uc3QgcmV0OiBEaWFnbm9zZWRTdGFjayA9IHtcbiAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIGhpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgcmVzdWx0OiBkaWFnbm9zaXMsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoe1xuICAgICAgICBhY3Rpb246ICdkaWFnbm9zZScsXG4gICAgICAgIC4uLmhvc3RNZXNzYWdlRnJvbURpYWdub3NpcyhyZXQpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7IHN0YWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIEFjdGlvblxuICAgKlxuICAgKiBTeW50aGVzaXplcyB0aGUgQ0RLIGFwcCBhbmQgcmVhZHMgdGhlIHBvbGljeSB2YWxpZGF0aW9uIHJlcG9ydFxuICAgKiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogVmFsaWRhdGVPcHRpb25zID0ge30pOiBQcm9taXNlPFZhbGlkYXRlUmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAndmFsaWRhdGUnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgcmVwb3J0UGF0aCA9IHBhdGguam9pbihhc3NlbWJseS5kaXJlY3RvcnksIFBPTElDWV9WQUxJREFUSU9OX1JFUE9SVF9GSUxFKTtcblxuICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhyZXBvcnRQYXRoKSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBWYWxpZGF0ZVJlc3VsdCA9IHtcbiAgICAgICAgY29uY2x1c2lvbjogJ3N1Y2Nlc3MnLFxuICAgICAgICBwbHVnaW5SZXBvcnRzOiBbXSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk2MDEubXNnKCdObyB2YWxpZGF0aW9uIHBsdWdpbnMgY29uZmlndXJlZC4gQWRkIGEgcGx1Z2luIHRvIHlvdXIgQ0RLIGFwcCB0byBlbmFibGUgdmFsaWRhdGlvbi4nKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IE1hbmlmZXN0LmxvYWRWYWxpZGF0aW9uUmVwb3J0KHJlcG9ydFBhdGgpO1xuXG4gICAgY29uc3QgY29uY2x1c2lvbjogUG9saWN5VmFsaWRhdGlvblJlcG9ydENvbmNsdXNpb24gPSByZXBvcnQucGx1Z2luUmVwb3J0cy5zb21lKFxuICAgICAgKHByKSA9PiBwci5jb25jbHVzaW9uID09PSAnZmFpbHVyZScsXG4gICAgKSA/ICdmYWlsdXJlJyA6ICdzdWNjZXNzJztcblxuICAgIGNvbnN0IHJlc3VsdDogVmFsaWRhdGVSZXN1bHQgPSB7XG4gICAgICBjb25jbHVzaW9uLFxuICAgICAgdGl0bGU6IHJlcG9ydC50aXRsZSxcbiAgICAgIHBsdWdpblJlcG9ydHM6IHJlcG9ydC5wbHVnaW5SZXBvcnRzLFxuICAgIH07XG5cbiAgICBpZiAoY29uY2x1c2lvbiA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTk2MDAubXNnKCfinYwgY2RrIHZhbGlkYXRlIGZvdW5kIHByb2JsZW1zJywgcmVzdWx0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JOTYwMC5tc2coJ+KchSBObyBwcm9ibGVtcyBmb3VuZCcsIHJlc3VsdCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IEFjdGlvblxuICAgKlxuICAgKiBEZXBsb3lzIHRoZSBzZWxlY3RlZCBzdGFja3MgaW50byBhbiBBV1MgYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlcGxveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RGVwbG95UmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGVwbG95Jyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ2RlcGxveScsIGFzc2VtYmx5LnN5bnRoRHVyYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXBsb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RlcGxveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICd3YXRjaCcsIHN5bnRoRHVyYXRpb246IEVsYXBzZWRUaW1lLCBvcHRpb25zOiBQcml2YXRlRGVwbG95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXBsb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrQ29sbGVjdGlvbiwgaW9IZWxwZXIpO1xuXG4gICAgY29uc3QgcmV0OiBEZXBsb3lSZXN1bHQgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAwMS5tc2coJ1RoaXMgYXBwIGNvbnRhaW5zIG5vIHN0YWNrcycpKTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdkZXBsb3knKTtcblxuICAgIGlmICghaXNFeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpKSB7XG4gICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBSZXNvdXJjZU1pZ3JhdG9yKHsgZGVwbG95bWVudHMsIGlvSGVscGVyIH0pO1xuICAgICAgYXdhaXQgbWlncmF0b3IudHJ5TWlncmF0ZVJlc291cmNlcyhzdGFja0NvbGxlY3Rpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlck1hcCA9IGJ1aWxkUGFyYW1ldGVyTWFwKG9wdGlvbnMucGFyYW1ldGVycz8ucGFyYW1ldGVycyk7XG5cbiAgICBpZiAob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kPy5tZXRob2QgPT09ICdob3Rzd2FwJykge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1NDAwLm1zZyhbXG4gICAgICAgICfimqDvuI8gSG90c3dhcCBkZXBsb3ltZW50cyBkZWxpYmVyYXRlbHkgaW50cm9kdWNlIENsb3VkRm9ybWF0aW9uIGRyaWZ0IHRvIHNwZWVkIHVwIGRlcGxveW1lbnRzJyxcbiAgICAgICAgJ+KaoO+4jyBUaGV5IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IC0gbmV2ZXIgdXNlIHRoZW0gZm9yIHlvdXIgcHJvZHVjdGlvbiBTdGFja3MhJyxcbiAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24uc3RhY2tBcnRpZmFjdHM7XG4gICAgY29uc3Qgc3RhY2tPdXRwdXRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgY29uc3Qgb3V0cHV0c0ZpbGUgPSBvcHRpb25zLm91dHB1dHNGaWxlO1xuXG4gICAgY29uc3QgeyBidWlsZEFzc2V0LCBwdWJsaXNoQXNzZXQgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoaXNFeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpKSB7XG4gICAgICAgIC8vIE5vLW9wOiBhc3NldHMgYXJlIGFscmVhZHkgcHVibGlzaGVkXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVpbGRBc3NldDogV29ya0dyYXBoLk5PT1AsXG4gICAgICAgICAgcHVibGlzaEFzc2V0OiBXb3JrR3JhcGguTk9PUCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnVpbGRBc3NldDogdGhpcy5jcmVhdGVCdWlsZEFzc2V0RnVuY3Rpb24oaW9IZWxwZXIsIGRlcGxveW1lbnRzLCBvcHRpb25zLnJvbGVBcm4pLFxuICAgICAgICBwdWJsaXNoQXNzZXQ6IHRoaXMuY3JlYXRlUHVibGlzaEFzc2V0RnVuY3Rpb24oaW9IZWxwZXIsIGRlcGxveW1lbnRzLCBvcHRpb25zLnJvbGVBcm4sIG9wdGlvbnMuZm9yY2VBc3NldFB1Ymxpc2hpbmcpLFxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgZGVwbG95U3RhY2sgPSBhc3luYyAoc3RhY2tOb2RlOiBTdGFja05vZGUpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tOb2RlLnN0YWNrO1xuICAgICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ICE9PSAxKSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oY2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YWNrLmVudmlyb25tZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgJ1N0YWNrRW52aXJvbm1lbnRNaXNzaW5nJyxcbiAgICAgICAgICBgU3RhY2sgJHtzdGFjay5kaXNwbGF5TmFtZX0gZG9lcyBub3QgZGVmaW5lIGFuIGVudmlyb25tZW50LCBhbmQgQVdTIGNyZWRlbnRpYWxzIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBmcm9tIHN0YW5kYXJkIGxvY2F0aW9ucyBvciBubyByZWdpb24gd2FzIGNvbmZpZ3VyZWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGdlbmVyYXRlZCBzdGFjayBoYXMgbm8gcmVzb3VyY2VzXG4gICAgICBjb25zdCByZXNvdXJjZUNvdW50ID0gT2JqZWN0LmtleXMoc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9KS5sZW5ndGg7XG4gICAgICBpZiAocmVzb3VyY2VDb3VudCA9PT0gMCkge1xuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSBhbmQgZG9lc24ndCBleGlzdCA9PiBkbyBub3RoaW5nXG4gICAgICAgIGNvbnN0IHN0YWNrRXhpc3RzID0gYXdhaXQgZGVwbG95bWVudHMuc3RhY2tFeGlzdHMoeyBzdGFjayB9KTtcbiAgICAgICAgaWYgKCFzdGFja0V4aXN0cykge1xuICAgICAgICAgIHJldHVybiBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzUwMjEubXNnKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgc2tpcHBpbmcgZGVwbG95bWVudC5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSwgYnV0IGV4aXN0cyA9PiBkZWxldGVcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1MDIyLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIGRlbGV0aW5nIGV4aXN0aW5nIHN0YWNrLmApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2RlcGxveScsIHtcbiAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgZGVwbG95bWVudHMucmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFjayk7XG5cbiAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHNhbWUgc2VtYW50aWNzIHdlIGFwcGx5IHdpdGggcmVzcGVjdCB0byBOb3RpZmljYXRpb24gQVJOcyAoZGljdGF0ZWQgYnkgdGhlIFNESylcbiAgICAgIC8vXG4gICAgICAvLyAgLSB1bmRlZmluZWQgID0+ICBjZGsgaWdub3JlcyBpdCwgYXMgaWYgaXQgd2Fzbid0IHN1cHBvcnRlZCAoYWxsb3dzIGV4dGVybmFsIG1hbmFnZW1lbnQpLlxuICAgICAgLy8gIC0gW106ICAgICAgICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byB3aXBlIGl0IG91dC5cbiAgICAgIC8vICAtIFsnYXJuLTEnXSAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gc2V0IGl0IHRvIFsnYXJuLTEnXS5cbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFybnMgPSAoISFvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgfHwgISFzdGFjay5ub3RpZmljYXRpb25Bcm5zKVxuICAgICAgICA/IChvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pLmNvbmNhdChzdGFjay5ub3RpZmljYXRpb25Bcm5zID8/IFtdKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBub3RpZmljYXRpb25Bcm4gb2Ygbm90aWZpY2F0aW9uQXJucyA/PyBbXSkge1xuICAgICAgICBpZiAoIXZhbGlkYXRlU25zVG9waWNBcm4obm90aWZpY2F0aW9uQXJuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ludmFsaWRTbnNUb3BpY0FybicsIGBOb3RpZmljYXRpb24gYXJuICR7bm90aWZpY2F0aW9uQXJufSBpcyBub3QgYSB2YWxpZCBhcm4gZm9yIGFuIFNOUyB0b3BpY2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERlcGxveSBvcHRpb25zIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGNoYW5nZSBzZXQgY3JlYXRpb24gYW5kIGV4ZWN1dGlvblxuICAgICAgY29uc3Qgc2hhcmVkRGVwbG95T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgIHJldXNlQXNzZXRzOiBvcHRpb25zLnJldXNlQXNzZXRzLFxuICAgICAgICB0YWdzOiBvcHRpb25zLnRhZ3M/Lmxlbmd0aCA/IG9wdGlvbnMudGFncyA6IHRhZ3NGb3JTdGFjayhzdGFjayksXG4gICAgICAgIGZvcmNlRGVwbG95bWVudDogb3B0aW9ucy5mb3JjZURlcGxveW1lbnQsXG4gICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtZXRlck1hcFsnKiddLCBwYXJhbWV0ZXJNYXBbc3RhY2suc3RhY2tOYW1lXSksXG4gICAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy5wYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICAgICAgbm90aWZpY2F0aW9uQXJucyxcbiAgICAgICAgZXh0cmFVc2VyQWdlbnQ6IG9wdGlvbnMuZXh0cmFVc2VyQWdlbnQsXG4gICAgICAgIGFzc2V0UGFyYWxsZWxpc206IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFdoZW4gdXNpbmcgY2hhbmdlLXNldCBtZXRob2QsIGFsd2F5cyBjcmVhdGUgdGhlIGNoYW5nZSBzZXQgdXBmcm9udC5cbiAgICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYW4gYWNjdXJhdGUgZGlmZiBmb3IgYXBwcm92YWwgYW5kIGF2b2lkcyBjcmVhdGluZyBpdCB0d2ljZS5cbiAgICAgIC8vIEZvciBub24tZXhlY3V0aW5nIGRlcGxveW1lbnRzIChwcmVwYXJlLWNoYW5nZS1zZXQpLCB0aGlzIGlzIHRoZSBmaW5hbCByZXN1bHQuXG4gICAgICBjb25zdCBwcmVwYXJlUmVzdWx0ID0gaXNDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZClcbiAgICAgICAgPyBhd2FpdCBkZXBsb3ltZW50cy5wcmVwYXJlU3RhY2soe1xuICAgICAgICAgIC4uLnNoYXJlZERlcGxveU9wdGlvbnMsXG4gICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgICAgIGNsZWFudXBPbk5vT3A6IGlzRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpLFxuICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gU2tpcCB0aGUgYXBwcm92YWwgcHJvbXB0IGVudGlyZWx5IHdoZW4gdGhlIHByZXBhcmVkIGNoYW5nZSBzZXQgaGFzIG5vXG4gICAgICAvLyBjaGFuZ2VzIOKAlCB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgdXNlciB0byBhcHByb3ZlLiBPdXRwdXRzLCBzdGFjayBBUk4sXG4gICAgICAvLyBhbmQgdGltaW5ncyBhcmUgc3RpbGwgZW1pdHRlZCB2aWEgdGhlIG5vcm1hbCBuby1vcCBkZXBsb3kgcGF0aCBiZWxvdy5cbiAgICAgIGlmICghcHJlcGFyZVJlc3VsdD8ubm9PcCkge1xuICAgICAgICAvLyBGb3IgZXhlY3V0ZS1jaGFuZ2Utc2V0LCBkZXNjcmliZSB0aGUgZXhpc3RpbmcgY2hhbmdlIHNldCBzbyB3ZSBjYW4gc2hvdyBhbiBhY2N1cmF0ZSBkaWZmXG4gICAgICAgIGNvbnN0IGRpZmZDaGFuZ2VTZXQgPSBpc0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZClcbiAgICAgICAgICA/IGF3YWl0IGRlcGxveW1lbnRzLmRlc2NyaWJlQ2hhbmdlU2V0KHN0YWNrLCBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QuY2hhbmdlU2V0TmFtZSwgcHJlcGFyZVJlc3VsdD8uc3RhY2tBcm4pXG4gICAgICAgICAgOiBwcmVwYXJlUmVzdWx0Py5jaGFuZ2VTZXQ7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IERpZmZGb3JtYXR0ZXIoe1xuICAgICAgICAgIHRlbXBsYXRlSW5mbzoge1xuICAgICAgICAgICAgb2xkVGVtcGxhdGU6IGN1cnJlbnRUZW1wbGF0ZSxcbiAgICAgICAgICAgIG5ld1RlbXBsYXRlOiBzdGFjayxcbiAgICAgICAgICAgIGNoYW5nZVNldDogZGlmZkNoYW5nZVNldCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzZWN1cml0eURpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U2VjdXJpdHlEaWZmKCk7XG4gICAgICAgIGNvbnN0IHN0YWNrRGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RpZmYoKTtcblxuICAgICAgICAvLyBTZW5kIGEgcmVxdWVzdCByZXNwb25zZSB3aXRoIHRoZSBkaWZmIGFzIHBhcnQgb2YgdGhlIG1lc3NhZ2UsXG4gICAgICAgIC8vIGFuZCB0aGUgdGVtcGxhdGUgZGlmZiBhcyBkYXRhXG4gICAgICAgIC8vIChJb0hvc3QgZGVjaWRlcyB3aGV0aGVyIHRvIHByaW50IGRlcGVuZGluZyBvbiBwZXJtaXNzaW9uQ2hhbmdlVHlwZSlcbiAgICAgICAgY29uc3QgaGFzU2VjdXJpdHlDaGFuZ2VzID0gc2VjdXJpdHlEaWZmLnBlcm1pc3Npb25DaGFuZ2VUeXBlICE9PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FO1xuICAgICAgICBjb25zdCBkZXBsb3lNb3RpdmF0aW9uID0gaGFzU2VjdXJpdHlDaGFuZ2VzXG4gICAgICAgICAgPyAnXCItLXJlcXVpcmUtYXBwcm92YWxcIiBpcyBlbmFibGVkIGFuZCBzdGFjayBpbmNsdWRlcyBzZWN1cml0eS1zZW5zaXRpdmUgdXBkYXRlcy4nXG4gICAgICAgICAgOiAnXCItLXJlcXVpcmUtYXBwcm92YWxcIiBpcyBlbmFibGVkIGFuZCBzdGFjayBpbmNsdWRlcyB1cGRhdGVzLic7XG4gICAgICAgIGNvbnN0IGRpZmZPdXRwdXQgPSBoYXNTZWN1cml0eUNoYW5nZXMgPyBzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZiA6IHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgICAgICBjb25zdCBkZXBsb3lRdWVzdGlvbiA9IGAke2RpZmZPdXRwdXR9XFxuXFxuJHtkZXBsb3lNb3RpdmF0aW9ufVxcbkRvIHlvdSB3aXNoIHRvIGRlcGxveSB0aGVzZSBjaGFuZ2VzYDtcbiAgICAgICAgY29uc3QgZGVwbG95Q29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDYwLnJlcShkZXBsb3lRdWVzdGlvbiwge1xuICAgICAgICAgIG1vdGl2YXRpb246IGRlcGxveU1vdGl2YXRpb24sXG4gICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgcGVybWlzc2lvbkNoYW5nZVR5cGU6IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSxcbiAgICAgICAgICB0ZW1wbGF0ZURpZmZzOiBmb3JtYXR0ZXIuZGlmZnMsXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKCFkZXBsb3lDb25maXJtZWQpIHtcbiAgICAgICAgICBpZiAocHJlcGFyZVJlc3VsdD8uY2hhbmdlU2V0Py5DaGFuZ2VTZXROYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCBkZXBsb3ltZW50cy5jbGVhbnVwQ2hhbmdlU2V0KHN0YWNrLCBwcmVwYXJlUmVzdWx0LmNoYW5nZVNldC5DaGFuZ2VTZXROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignRGVwbG95QWJvcnRlZCcsICdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFja0luZGV4ID0gc3RhY2tzLmluZGV4T2Yoc3RhY2spICsgMTtcbiAgICAgIGNvbnN0IGRlcGxveVNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uREVQTE9ZX1NUQUNLKVxuICAgICAgICAuYmVnaW4oYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXBsb3lpbmcuLi4gWyR7c3RhY2tJbmRleH0vJHtzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudH1dYCwge1xuICAgICAgICAgIHRvdGFsOiBzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCxcbiAgICAgICAgICBjdXJyZW50OiBzdGFja0luZGV4LFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICB9KTtcbiAgICAgIGRlcGxveVNwYW4uaW5jQ291bnRlcigncmVzb3VyY2VzJywgcmVzb3VyY2VDb3VudCk7XG5cbiAgICAgIGxldCBkZXBsb3lEdXJhdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXBhcmVJc0ZpbmFsID0gcHJlcGFyZVJlc3VsdCAmJiAocHJlcGFyZVJlc3VsdC5ub09wIHx8IGlzTm9uRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpKTtcbiAgICAgICAgbGV0IGRlcGxveVJlc3VsdDogU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IHwgdW5kZWZpbmVkID0gcHJlcGFyZUlzRmluYWwgPyBwcmVwYXJlUmVzdWx0IDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCByb2xsYmFjayA9IG9wdGlvbnMucm9sbGJhY2s7XG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgICAgICB3aGlsZSAoIWRlcGxveVJlc3VsdCkge1xuICAgICAgICAgIGlmICgrK2l0ZXJhdGlvbiA+IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RlcGxveUxvb3BVbnN0YWJsZScsICdUaGlzIGxvb3Agc2hvdWxkIGhhdmUgc3RhYmlsaXplZCBpbiAyIGl0ZXJhdGlvbnMsIGJ1dCBkaWRuXFwndC4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2UnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZGVwbG95bWVudHMuZGVwbG95U3RhY2soe1xuICAgICAgICAgICAgLi4uc2hhcmVkRGVwbG95T3B0aW9ucyxcbiAgICAgICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGV4ZWN1dGUgdGhlIHByZXBhcmVkIGNoYW5nZSBzZXQuXG4gICAgICAgICAgICAvLyBPbiByZXRyaWVzIChhZnRlciByb2xsYmFjayksIGNyZWF0ZSBhIG5ldyBjaGFuZ2Ugc2V0IHNpbmNlIHRoZSBvbGQgb25lIGlzIGdvbmUuXG4gICAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiBpdGVyYXRpb24gPT09IDEgJiYgaXNFeGVjdXRpbmdDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZClcbiAgICAgICAgICAgICAgPyB0b0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICAgICAgICByb2xsYmFjayxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHN3aXRjaCAoci50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaWQtZGVwbG95LXN0YWNrJzpcbiAgICAgICAgICAgICAgZGVwbG95UmVzdWx0ID0gcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9IHIucmVhc29uID09PSAncmVwbGFjZW1lbnQnXG4gICAgICAgICAgICAgICAgPyBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcImBcbiAgICAgICAgICAgICAgICA6IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZG8gbm90IGluY2x1ZGUgXCItLW5vLXJvbGxiYWNrXCJgO1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IGAke21vdGl2YXRpb259LiBQZXJmb3JtIGEgcmVndWxhciBkZXBsb3ltZW50YDtcblxuICAgICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTUwNTAucmVxKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgICAgICAgbW90aXZhdGlvbixcbiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1JvbGxiYWNrQWJvcnRlZCcsICdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSByb2xsYmFja1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yb2xsYmFjayhhc3NlbWJseSwgYWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgc3RhY2tzOiB7XG4gICAgICAgICAgICAgICAgICBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSxcbiAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcnBoYW5GYWlsZWRSZXNvdXJjZXM6IG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzRHVyaW5nUm9sbGJhY2ssXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdyZXBsYWNlbWVudC1yZXF1aXJlcy1yb2xsYmFjayc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdDaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcIic7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA1MC5yZXEocXVlc3Rpb24sIHtcbiAgICAgICAgICAgICAgICBtb3RpdmF0aW9uLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVwbGFjZW1lbnRSb2xsYmFja0Fib3J0ZWQnLCAnQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBHbyBhcm91bmQgdGhyb3VnaCB0aGUgJ3doaWxlJyBsb29wIGFnYWluIGJ1dCBzd2l0Y2ggcm9sbGJhY2sgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgcm9sbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5leHBlY3RlZERlcGxveVJlc3VsdCcsIGBVbmV4cGVjdGVkIHJlc3VsdCB0eXBlIGZyb20gZGVwbG95U3RhY2s6ICR7SlNPTi5zdHJpbmdpZnkocil9LiBJZiB5b3UgYXJlIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkZXBsb3lSZXN1bHQubm9PcFxuICAgICAgICAgID8gYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAwLm1zZyhjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCBkZXBsb3lSZXN1bHQpKTtcbiAgICAgICAgZGVwbG95RHVyYXRpb24gPSBhd2FpdCBkZXBsb3lTcGFuLnRpbWluZyhJTy5DREtfVE9PTEtJVF9JNTAwMCk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRlcGxveVJlc3VsdC5vdXRwdXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gWydPdXRwdXRzOiddO1xuICAgICAgICAgIHN0YWNrT3V0cHV0c1tzdGFjay5zdGFja05hbWVdID0gZGVwbG95UmVzdWx0Lm91dHB1dHM7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLnNvcnQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXBsb3lSZXN1bHQub3V0cHV0c1tuYW1lXTtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke2NoYWxrLmN5YW4oc3RhY2suaWQpfS4ke2NoYWxrLmN5YW4obmFtZSl9ID0gJHtjaGFsay51bmRlcmxpbmUoY2hhbGsuY3lhbih2YWx1ZSkpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDEubXNnKGJ1ZmZlci5qb2luKCdcXG4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMS5tc2coYFN0YWNrIEFSTjpcXG4ke2RlcGxveVJlc3VsdC5zdGFja0Fybn1gKSk7XG5cbiAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhY2tBcm46IGRlcGxveVJlc3VsdC5zdGFja0FybixcbiAgICAgICAgICBvdXRwdXRzOiBkZXBsb3lSZXN1bHQub3V0cHV0cyxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogc3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIC8vIEl0IGhhcyB0byBiZSBleGFjdGx5IHRoaXMgc3RyaW5nIGJlY2F1c2UgYW4gaW50ZWdyYXRpb24gdGVzdCB0ZXN0cyBmb3JcbiAgICAgICAgLy8gXCJib2xkKHN0YWNrbmFtZSkgZmFpbGVkOiBSZXNvdXJjZU5vdFJlYWR5OiA8ZXJyb3I+XCJcbiAgICAgICAgY29uc3QgY29kZSA9IFRvb2xraXRFcnJvci5pc1Rvb2xraXRFcnJvcihlKSA/IGUubmFtZSA6ICdEZXBsb3lTdGFja0ZhaWxlZCc7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2UgPSBbYOKdjCAgJHtjaGFsay5ib2xkKHN0YWNrLnN0YWNrTmFtZSl9IGZhaWxlZDpgLCAuLi4oZS5uYW1lID8gW2Ake2UubmFtZX06YF0gOiBbXSksIGUubWVzc2FnZV0uam9pbignICcpO1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGNvZGUsIG5ld01lc3NhZ2UpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG9wdGlvbnMudHJhY2VMb2dzKSB7XG4gICAgICAgICAgLy8gZGVwbG95IGNhbGxzIHRoYXQgb3JpZ2luYXRlIGZyb20gd2F0Y2ggd2lsbCBjb21lIHdpdGggdGhlaXIgb3duIGNsb3VkV2F0Y2hMb2dNb25pdG9yXG4gICAgICAgICAgY29uc3QgY2xvdWRXYXRjaExvZ01vbml0b3IgPSBvcHRpb25zLmNsb3VkV2F0Y2hMb2dNb25pdG9yID8/IG5ldyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yKHsgaW9IZWxwZXIgfSk7XG4gICAgICAgICAgY29uc3QgZm91bmRMb2dHcm91cHNSZXN1bHQgPSBhd2FpdCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3Vwcyhhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkZXBsb3knKSwgaW9IZWxwZXIsIHN0YWNrKTtcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvci5hZGRMb2dHcm91cHMoXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5lbnYsXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5zZGssXG4gICAgICAgICAgICBmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5sb2dHcm91cE5hbWVzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MDMxLm1zZyhgVGhlIGZvbGxvd2luZyBsb2cgZ3JvdXBzIGFyZSBhZGRlZDogJHtmb3VuZExvZ0dyb3Vwc1Jlc3VsdC5sb2dHcm91cE5hbWVzfWApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGFuIG91dHB1dHMgZmlsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGNyZWF0ZSB0aGUgZmlsZSBwYXRoIGFuZCB3cml0ZSBzdGFjayBvdXRwdXRzIHRvIGl0IG9uY2UuXG4gICAgICAgIC8vIE91dHB1dHMgYXJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIHN0YWNrcyBoYXZlIGJlZW4gZGVwbG95ZWQuIElmIGEgc3RhY2sgZGVwbG95bWVudCBmYWlscyxcbiAgICAgICAgLy8gYWxsIG9mIHRoZSBvdXRwdXRzIGZyb20gc3VjY2Vzc2Z1bGx5IGRlcGxveWVkIHN0YWNrcyBiZWZvcmUgdGhlIGZhaWx1cmUgd2lsbCBzdGlsbCBiZSB3cml0dGVuLlxuICAgICAgICBpZiAob3V0cHV0c0ZpbGUpIHtcbiAgICAgICAgICBmcy5lbnN1cmVGaWxlU3luYyhvdXRwdXRzRmlsZSk7XG4gICAgICAgICAgYXdhaXQgZnMud3JpdGVKc29uKG91dHB1dHNGaWxlLCBzdGFja091dHB1dHMsIHtcbiAgICAgICAgICAgIHNwYWNlczogMixcbiAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gc3ludGhEdXJhdGlvbi5hc01zICsgKGRlcGxveUR1cmF0aW9uPy5hc01zID8/IDApO1xuICAgICAgYXdhaXQgZGVwbG95U3Bhbi5lbmQoYFxcbuKcqCAgVG90YWwgdGltZTogJHtmb3JtYXRUaW1lKGR1cmF0aW9uKX1zXFxuYCwgeyBkdXJhdGlvbiB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYXNzZXRCdWlsZFRpbWUgPSBvcHRpb25zLmFzc2V0QnVpbGRUaW1lID8/IEFzc2V0QnVpbGRUaW1lLkFMTF9CRUZPUkVfREVQTE9ZO1xuICAgIGNvbnN0IHByZWJ1aWxkQXNzZXRzID0gYXNzZXRCdWlsZFRpbWUgPT09IEFzc2V0QnVpbGRUaW1lLkFMTF9CRUZPUkVfREVQTE9ZO1xuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gb3B0aW9ucy5jb25jdXJyZW5jeSB8fCAxO1xuXG4gICAgY29uc3Qgc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyA9IHN0YWNrcy5mbGF0TWFwKChzdGFjaykgPT4gW1xuICAgICAgc3RhY2ssXG4gICAgICAuLi5zdGFjay5kZXBlbmRlbmNpZXMuZmlsdGVyKHggPT4gY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LmlzQXNzZXRNYW5pZmVzdEFydGlmYWN0KHgpKSxcbiAgICBdKTtcbiAgICBjb25zdCB3b3JrR3JhcGggPSBuZXcgV29ya0dyYXBoQnVpbGRlcihpb0hlbHBlciwgcHJlYnVpbGRBc3NldHMpLmJ1aWxkKHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMpO1xuXG4gICAgLy8gVW5sZXNzIHdlIGFyZSBydW5uaW5nIHdpdGggJy0tZm9yY2UnLCBza2lwIGFscmVhZHkgcHVibGlzaGVkIGFzc2V0c1xuICAgIGlmICghb3B0aW9ucy5mb3JjZUFzc2V0UHVibGlzaGluZykge1xuICAgICAgYXdhaXQgcmVtb3ZlUHVibGlzaGVkQXNzZXRzRnJvbVdvcmtHcmFwaCh3b3JrR3JhcGgsIGRlcGxveW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IGNvbmN1cnJlbmN5LFxuICAgICAgJ2Fzc2V0LWJ1aWxkJzogKG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSA/PyB0cnVlKSA/IG9wdGlvbnMuYXNzZXRCdWlsZENvbmN1cnJlbmN5ID8/IDEgOiAxLCAvLyBUaGlzIHdpbGwgYmUgQ1BVLWJvdW5kL21lbW9yeSBib3VuZCwgbW9zdGx5IG1hdHRlcnMgZm9yIERvY2tlciBidWlsZHNcbiAgICAgICdhc3NldC1wdWJsaXNoJzogKG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSA/PyB0cnVlKSA/IDggOiAxLCAvLyBUaGlzIHdpbGwgYmUgSS9PLWJvdW5kLCA4IGluIHBhcmFsbGVsIHNlZW1zIHJlYXNvbmFibGVcbiAgICB9O1xuXG4gICAgYXdhaXQgd29ya0dyYXBoLmRvUGFyYWxsZWwoZ3JhcGhDb25jdXJyZW5jeSwge1xuICAgICAgZGVwbG95U3RhY2ssXG4gICAgICBidWlsZEFzc2V0LFxuICAgICAgcHVibGlzaEFzc2V0LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBBY3Rpb25cbiAgICpcbiAgICogQ29udGludW91c2x5IG9ic2VydmUgcHJvamVjdCBmaWxlcyBhbmQgZGVwbG95IHRoZSBzZWxlY3RlZCBzdGFja3NcbiAgICogYXV0b21hdGljYWxseSB3aGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLiBEZWZhdWx0cyB0byBob3Rzd2FwIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHksIHN0YXJ0aW5nIGEgd2F0Y2hlciBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YXRjaChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFdhdGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJV2F0Y2hlcj4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3dhdGNoJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4LCBmYWxzZSk7XG4gICAgY29uc3Qgcm9vdERpciA9IG9wdGlvbnMud2F0Y2hEaXIgPz8gcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIEZvciB0aGUgXCJpbmNsdWRlXCIgc2V0dGluZywgdGhlIGJlaGF2aW9yIGlzOlxuICAgIC8vIDEuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGhvdXQgYW4gXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIioqXCIuXG4gICAgLy8gMi4gXCJ3YXRjaFwiIHNldHRpbmcgd2l0aCBhbiBlbXB0eSBcImluY2x1ZGVcIiBrZXk/IFdlIGRlZmF1bHQgdG8gb2JzZXJ2aW5nIFwiKipcIi5cbiAgICAvLyAzLiBOb24tZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBKdXN0IHVzZSB0aGUgXCJpbmNsdWRlXCIga2V5LlxuICAgIGNvbnN0IHdhdGNoSW5jbHVkZXMgPSBvcHRpb25zLmluY2x1ZGUgPz8gW107XG4gICAgaWYgKHdhdGNoSW5jbHVkZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHdhdGNoSW5jbHVkZXMucHVzaCgnKionKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIFwiZXhjbHVkZVwiIHNldHRpbmcsIHRoZSBiZWhhdmlvciBpcyB0byBhZGQgc29tZSBkZWZhdWx0IGV4Y2x1ZGVzIGluIGFkZGl0aW9uIHRvXG4gICAgLy8gcGF0dGVybnMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHNlbnNpYmxlIGRlZmF1bHQgcGF0dGVybnM6XG4gICAgY29uc3Qgd2F0Y2hFeGNsdWRlcyA9IG9wdGlvbnMuZXhjbHVkZSA/PyBbLi4uV0FUQ0hfRVhDTFVERV9ERUZBVUxUU107XG4gICAgLy8gMS4gVGhlIENESyBvdXRwdXQgZGlyZWN0b3J5LCBpZiBpdCBpcyB1bmRlciB0aGUgcm9vdERpclxuICAgIGNvbnN0IHJlbGF0aXZlT3V0RGlyID0gcGF0aC5yZWxhdGl2ZShyb290RGlyLCBhc3NlbWJseS5kaXJlY3RvcnkpO1xuICAgIGlmIChCb29sZWFuKHJlbGF0aXZlT3V0RGlyICYmICFyZWxhdGl2ZU91dERpci5zdGFydHNXaXRoKCcuLicgKyBwYXRoLnNlcCkgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZU91dERpcikpKSB7XG4gICAgICB3YXRjaEV4Y2x1ZGVzLnB1c2goYCR7cmVsYXRpdmVPdXREaXJ9LyoqYCk7XG4gICAgfVxuICAgIC8vIDIuIEFueSBmaWxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgd2F0Y2hFeGNsdWRlcy5wdXNoKCcuKicsICcqKi8uKicpO1xuICAgIC8vIDMuIEFueSBkaXJlY3RvcnkncyBjb250ZW50IHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgd2F0Y2hFeGNsdWRlcy5wdXNoKCcqKi8uKi8qKicpO1xuICAgIC8vIDQuIEFueSBub2RlX21vZHVsZXMgYW5kIGl0cyBjb250ZW50IChldmVuIGlmIGl0J3Mgbm90IGEgSlMvVFMgcHJvamVjdCwgeW91IG1pZ2h0IGJlIHVzaW5nIGEgbG9jYWwgYXdzLWNsaSBwYWNrYWdlKVxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnKiovbm9kZV9tb2R1bGVzLyoqJyk7XG5cbiAgICAvLyBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIG9uIGNvbXB1dGVkIHNldHRpbmdzXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEwLm1zZyhbXG4gICAgICBgcm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgJ3dhdGNoJyBpczogJHtyb290RGlyfWAsXG4gICAgICBgJ2luY2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoSW5jbHVkZXMpfWAsXG4gICAgICBgJ2V4Y2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoRXhjbHVkZXMpfWAsXG4gICAgXS5qb2luKCdcXG4nKSwge1xuICAgICAgd2F0Y2hEaXI6IHJvb3REaXIsXG4gICAgICBpbmNsdWRlczogd2F0Y2hJbmNsdWRlcyxcbiAgICAgIGV4Y2x1ZGVzOiB3YXRjaEV4Y2x1ZGVzLFxuICAgIH0pKTtcblxuICAgIC8vIFNpbmNlICdjZGsgZGVwbG95JyBpcyBhIHJlbGF0aXZlbHkgc2xvdyBvcGVyYXRpb24gZm9yIGEgJ3dhdGNoJyBwcm9jZXNzLFxuICAgIC8vIGludHJvZHVjZSBhIGNvbmN1cnJlbmN5IGxhdGNoIHRoYXQgdHJhY2tzIHRoZSBzdGF0ZS5cbiAgICAvLyBUaGlzIHdheSwgaWYgZmlsZSBjaGFuZ2UgZXZlbnRzIGFycml2ZSB3aGVuIGEgJ2NkayBkZXBsb3knIGlzIHN0aWxsIGV4ZWN1dGluZyxcbiAgICAvLyB3ZSB3aWxsIGJhdGNoIHRoZW0sIGFuZCB0cmlnZ2VyIGFub3RoZXIgJ2NkayBkZXBsb3knIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlcyxcbiAgICAvLyBtYWtpbmcgc3VyZSAnY2RrIGRlcGxveSdzICBhbHdheXMgZXhlY3V0ZSBvbmUgYXQgYSB0aW1lLlxuICAgIC8vIEhlcmUncyBhIGRpYWdyYW0gc2hvd2luZyB0aGUgc3RhdGUgdHJhbnNpdGlvbnM6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICBmaWxlIGNoYW5nZWRcbiAgICAvLyB8ICAgICAgICAgICAgfCAgcmVhZHkgZXZlbnQgICB8ICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS18XG4gICAgLy8gfCBwcmUtcmVhZHkgIHwgLS0tLS0tLS0tLS0tLT4gfCBvcGVuIHwgICAgICAgICAgICAgICAgICAgICB8IGRlcGxveWluZyAgfCAgICAgICAgICAgICAgICAgICAgIHwgICBxdWV1ZWQgICB8ICAgICAgICAgICAgICAgfFxuICAgIC8vIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLXxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS1cbiAgICB0eXBlIExhdGNoU3RhdGUgPSAncHJlLXJlYWR5JyB8ICdvcGVuJyB8ICdkZXBsb3lpbmcnIHwgJ3F1ZXVlZCc7XG4gICAgbGV0IGxhdGNoOiBMYXRjaFN0YXRlID0gJ3ByZS1yZWFkeSc7XG5cbiAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMudHJhY2VMb2dzID8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoeyBpb0hlbHBlciB9KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZXBsb3lBbmRXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxhdGNoID0gJ2RlcGxveWluZycgYXMgTGF0Y2hTdGF0ZTtcbiAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG5cbiAgICAgIC8vIElmIGxhdGNoIGlzIHN0aWxsICdkZXBsb3lpbmcnIGFmdGVyIHRoZSAnYXdhaXQnLCB0aGF0J3MgZmluZSxcbiAgICAgIC8vIGJ1dCBpZiBpdCdzICdxdWV1ZWQnLCB0aGF0IG1lYW5zIHdlIG5lZWQgdG8gZGVwbG95IGFnYWluXG4gICAgICB3aGlsZSAobGF0Y2ggPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCByZWFsaXplIGxhdGNoIGNhbiBjaGFuZ2UgYmV0d2VlbiAnYXdhaXRzJyxcbiAgICAgICAgLy8gYW5kIHRoaW5rcyB0aGUgYWJvdmUgJ3doaWxlJyBjb25kaXRpb24gaXMgYWx3YXlzICdmYWxzZScgd2l0aG91dCB0aGUgY2FzdFxuICAgICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTUubXNnKFwiRGV0ZWN0ZWQgZmlsZSBjaGFuZ2VzIGR1cmluZyBkZXBsb3ltZW50LiBJbnZva2luZyAnY2RrIGRlcGxveScgYWdhaW5cIikpO1xuICAgICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuICAgICAgfVxuICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICBhd2FpdCBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uYWN0aXZhdGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGlnbm9yZSBtYXRjaGVyIGZvciBjaG9raWRhciB2NCBjb21wYXRpYmlsaXR5XG4gICAgLy8gQ2hva2lkYXIgdjQgcmVtb3ZlZCBnbG9iIHBhdHRlcm4gc3VwcG9ydCwgc28gd2UgdXNlIHBpY29tYXRjaCB0byBmaWx0ZXIgZmlsZXNcbiAgICAvLyBXZSBwYXNzIHJvb3REaXIgYmVjYXVzZSBjaG9raWRhciB2NCBwYXNzZXMgYWJzb2x1dGUgcGF0aHMgdG8gdGhlIGlnbm9yZWQgY2FsbGJhY2tcbiAgICBjb25zdCBzaG91bGRJZ25vcmUgPSBjcmVhdGVJZ25vcmVNYXRjaGVyKHtcbiAgICAgIGluY2x1ZGU6IHdhdGNoSW5jbHVkZXMsXG4gICAgICBleGNsdWRlOiB3YXRjaEV4Y2x1ZGVzLFxuICAgICAgcm9vdERpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhclxuICAgICAgLndhdGNoKCcuJywge1xuICAgICAgICBpZ25vcmVkOiBzaG91bGRJZ25vcmUsXG4gICAgICAgIGN3ZDogcm9vdERpcixcbiAgICAgIH0pXG4gICAgICAub24oJ3JlYWR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsYXRjaCA9ICdvcGVuJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoXCInd2F0Y2gnIHJlY2VpdmVkIHRoZSAncmVhZHknIGV2ZW50LiBGcm9tIG5vdyBvbiwgYWxsIGZpbGUgY2hhbmdlcyB3aWxsIHRyaWdnZXIgYSBkZXBsb3ltZW50XCIpO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTQubXNnKFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKSk7XG4gICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQ6IEV2ZW50TmFtZSwgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IG5vbi1maWxlIGV2ZW50cyAoZS5nLiwgJ2Vycm9yJywgJ3JhdycsICdyZWFkeScsICdhbGwnKVxuICAgICAgICAvLyBUaGVzZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IG9yIG5vdCByZWxldmFudCBmb3Igd2F0Y2ggZGVwbG95bWVudHNcbiAgICAgICAgaWYgKCFpc0ZpbGVFdmVudChldmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2F0Y2hFdmVudCA9IHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGxhdGNoID09PSAncHJlLXJlYWR5Jykge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMS5tc2coYCd3YXRjaCcgaXMgb2JzZXJ2aW5nICR7ZXZlbnQgPT09ICdhZGREaXInID8gJ2RpcmVjdG9yeScgOiAndGhlIGZpbGUnfSAnJHtmaWxlUGF0aH0nIGZvciBjaGFuZ2VzYCwgd2F0Y2hFdmVudCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhdGNoID09PSAnb3BlbicpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTIubXNnKGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pLiBUcmlnZ2VyaW5nICdjZGsgZGVwbG95J2AsIHdhdGNoRXZlbnQpKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgbWVhbnMgbGF0Y2ggaXMgZWl0aGVyICdkZXBsb3lpbmcnIG9yICdxdWV1ZWQnXG4gICAgICAgICAgbGF0Y2ggPSAncXVldWVkJztcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTMubXNnKFxuICAgICAgICAgICAgYERldGVjdGVkIGNoYW5nZSB0byAnJHtmaWxlUGF0aH0nICh0eXBlOiAke2V2ZW50fSkgd2hpbGUgJ2NkayBkZXBsb3knIGlzIHN0aWxsIHJ1bm5pbmcuIFdpbGwgcXVldWUgZm9yIGFub3RoZXIgZGVwbG95bWVudCBhZnRlciB0aGlzIG9uZSBmaW5pc2hlcydgLFxuICAgICAgICAgICAgd2F0Y2hFdmVudCxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzdG9wcGVkUHJvbWlzZSA9IHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXN5bmMgZGlzcG9zZSgpIHtcbiAgICAgICAgLy8gc3RvcCB0aGUgbG9ncyBtb25pdG9yLCBpZiBpdCBleGlzdHNcbiAgICAgICAgYXdhaXQgY2xvdWRXYXRjaExvZ01vbml0b3I/LmRlYWN0aXZhdGUoKTtcbiAgICAgICAgLy8gY2xvc2UgdGhlIHdhdGNoZXIgaXRzZWxmXG4gICAgICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgICAgc3RvcHBlZFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm4gc3RvcHBlZFByb21pc2UucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyB3YWl0Rm9yRW5kKCkge1xuICAgICAgICByZXR1cm4gc3RvcHBlZFByb21pc2UucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgSVdhdGNoZXI7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgQWN0aW9uXG4gICAqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHNlbGVjdGVkIHN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByb2xsYmFjayhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSb2xsYmFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3JvbGxiYWNrJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCAncm9sbGJhY2snLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgcm9sbGJhY2sgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBvciB3YXRjaCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9yb2xsYmFjayhhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAncm9sbGJhY2snIHwgJ2RlcGxveScgfCAnd2F0Y2gnLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrUmVzdWx0PiB7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcywgaW9IZWxwZXIpO1xuXG4gICAgY29uc3QgcmV0OiBSb2xsYmFja1Jlc3VsdCA9IHtcbiAgICAgIHN0YWNrczogW10sXG4gICAgfTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U2MDAxLm1zZygnTm8gc3RhY2tzIHNlbGVjdGVkJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBsZXQgYW55Um9sbGJhY2thYmxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RhY2tdIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHJvbGxiYWNrU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ST0xMQkFDS19TVEFDSykuYmVnaW4oYFJvbGxpbmcgYmFjayAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfWAsIHtcbiAgICAgICAgdG90YWw6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgICBjdXJyZW50OiBpbmRleCArIDEsXG4gICAgICAgIHN0YWNrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ3JvbGxiYWNrJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGFja1Jlc3VsdCA9IGF3YWl0IGRlcGxveW1lbnRzLnJvbGxiYWNrU3RhY2soe1xuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgb3JwaGFuRmFpbGVkUmVzb3VyY2VzOiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcyxcbiAgICAgICAgICB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbjogb3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgICAgICBvcnBoYW5Mb2dpY2FsSWRzOiBvcHRpb25zLm9ycGhhbkxvZ2ljYWxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXN0YWNrUmVzdWx0Lm5vdEluUm9sbGJhY2thYmxlU3RhdGUpIHtcbiAgICAgICAgICBhbnlSb2xsYmFja2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJvbGxiYWNrU3Bhbi5lbmQoKTtcblxuICAgICAgICByZXQuc3RhY2tzLnB1c2goe1xuICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICBhY2NvdW50OiBzdGFjay5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgICAgICAgcmVnaW9uOiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBzdGFja0Fybjogc3RhY2tSZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgcmVzdWx0OiBzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlID8gJ2FscmVhZHktc3RhYmxlJyA6ICdyb2xsZWQtYmFjaycsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNjkwMC5tc2coYFxcbiDinYwgICR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ1JvbGxiYWNrRmFpbGVkJywgJ1JvbGxiYWNrIGZhaWxlZCAodXNlIC0tZm9yY2UgdG8gb3JwaGFuIGZhaWxpbmcgcmVzb3VyY2VzKScsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFueVJvbGxiYWNrYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm9Sb2xsYmFja2FibGVTdGFja3MnLCAnTm8gc3RhY2tzIHdlcmUgaW4gYSBzdGF0ZSB0aGF0IGNvdWxkIGJlIHJvbGxlZCBiYWNrJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcnBoYW4gQWN0aW9uLiBEZXRhY2hlcyByZXNvdXJjZXMgZnJvbSBhIENsb3VkRm9ybWF0aW9uIHN0YWNrIHdpdGhvdXQgZGVsZXRpbmcgdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvcnBoYW4oY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBPcnBoYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdvcnBoYW4nKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ29ycGhhbicpO1xuXG4gICAgLy8gUGFyc2UgY29uc3RydWN0IHBhdGhzIGludG8gc3RhY2sgY29uc3RydWN0IElEICsgY29uc3RydWN0LWxldmVsIHBhdGhzLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQW5kVmFsaWRhdGVDb25zdHJ1Y3RQYXRocyhvcHRpb25zLmNvbnN0cnVjdFBhdGhzKTtcblxuICAgIC8vIFN5bnRoIGFsbCBzdGFja3MsIHRoZW4gZmluZCB0aGUgb25lIHdob3NlIGhpZXJhcmNoaWNhbElkIG1hdGNoZXMgdGhlIHN0YWNrIGNvbnN0cnVjdCBJRC5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIEFMTF9TVEFDS1MpO1xuICAgIGNvbnN0IGFsbFN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKEFMTF9TVEFDS1MpO1xuICAgIGNvbnN0IHN0YWNrID0gYWxsU3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmZpbmQocyA9PiBzLmhpZXJhcmNoaWNhbElkID09PSBwYXJzZWQuc3RhY2tJZCk7XG5cbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAnU3RhY2tOb3RGb3VuZCcsXG4gICAgICAgIGBObyBzdGFjayBmb3VuZCB3aXRoIGNvbnN0cnVjdCBJRCAnJHtwYXJzZWQuc3RhY2tJZH0nLiBBdmFpbGFibGUgc3RhY2tzOiAke2FsbFN0YWNrcy5zdGFja0FydGlmYWN0cy5tYXAocyA9PiBzLmhpZXJhcmNoaWNhbElkKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ29ycGhhbicpO1xuXG4gICAgY29uc3Qgb3JwaGFuZXIgPSBuZXcgUmVzb3VyY2VPcnBoYW5lcih7XG4gICAgICBkZXBsb3ltZW50cyxcbiAgICAgIGlvSGVscGVyLFxuICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lID8/IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBsYW4gPSBhd2FpdCBvcnBoYW5lci5tYWtlUGxhbihzdGFjaywgcGFyc2VkLmNvbnN0cnVjdFBhdGhzKTtcblxuICAgIC8vIFNob3cgdGhlIHBsYW5cbiAgICBjb25zdCByZXNvdXJjZUxpbmVzID0gcGxhbi5vcnBoYW5lZFJlc291cmNlc1xuICAgICAgLm1hcCgocikgPT4gYCAgJHtyLmxvZ2ljYWxJZH0gKCR7ci5yZXNvdXJjZVR5cGV9KSAtICR7ci5jZGtQYXRofWApXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhcbiAgICAgIGBTdGFjazogJHtwbGFuLnN0YWNrTmFtZX1cXG5gICtcbiAgICAgIGBSZXNvdXJjZXMgdG8gb3JwaGFuICgke3BsYW4ub3JwaGFuZWRSZXNvdXJjZXMubGVuZ3RofSk6XFxuYCArXG4gICAgICByZXNvdXJjZUxpbmVzLFxuICAgICk7XG5cbiAgICAvLyBDb25maXJtIGJlZm9yZSBvcnBoYW5pbmdcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTg4MTAucmVxKFxuICAgICAgJ0RvIHlvdSB3aXNoIHRvIG9ycGhhbiB0aGVzZSByZXNvdXJjZXM/IFRoaXMgd2lsbCBwZXJmb3JtIDMgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudHMuJywge1xuICAgICAgICBtb3RpdmF0aW9uOiAnVXNlciBjb25maXJtYXRpb24gaXMgbmVlZGVkIGJlZm9yZSBvcnBoYW5pbmcgcmVzb3VyY2VzJyxcbiAgICAgIH0pKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3JwaGFuQWJvcnRlZCcsICdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbGFuLmV4ZWN1dGUoKTtcblxuICAgIC8vIE91dHB1dCBuZXh0IHN0ZXBzXG4gICAgY29uc3QgbWFwcGluZ0pzb24gPSBPYmplY3Qua2V5cyhyZXN1bHQucmVzb3VyY2VNYXBwaW5nKS5sZW5ndGggPiAwXG4gICAgICA/IGAgLS1yZXNvdXJjZS1tYXBwaW5nLWlubGluZSAnJHtKU09OLnN0cmluZ2lmeShyZXN1bHQucmVzb3VyY2VNYXBwaW5nKX0nYFxuICAgICAgOiAnJztcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKFxuICAgICAgYOKchSBSZXNvdXJjZXMgb3JwaGFuZWQgZnJvbSAke3BsYW4uc3RhY2tOYW1lfVxcblxcbmAgK1xuICAgICAgJ05leHQgc3RlcHM6XFxuJyArXG4gICAgICAnICAxLiBVcGRhdGUgeW91ciBDREsgY29kZSB0byB1c2UgdGhlIG5ldyByZXNvdXJjZSB0eXBlXFxuJyArXG4gICAgICBgICAyLiBjZGsgaW1wb3J0JHttYXBwaW5nSnNvbn1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmYWN0b3IgQWN0aW9uLiBNb3ZlcyByZXNvdXJjZXMgZnJvbSBvbmUgbG9jYXRpb24gKHN0YWNrICsgbG9naWNhbCBJRCkgdG8gYW5vdGhlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZhY3RvcihjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJlZmFjdG9yT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdyZWZhY3RvcicpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAncmVmYWN0b3InKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHN0YWNrc09wdChvcHRpb25zKSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlZmFjdG9yKGFzc2VtYmx5LCBpb0hlbHBlciwgY3gsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVmYWN0b3IoYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGlvSGVscGVyOiBJb0hlbHBlciwgY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSZWZhY3Rvck9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcigncmVmYWN0b3InKTtcbiAgICBjb25zdCBzZWxlY3RlZFN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHN0YWNrc09wdChvcHRpb25zKSk7XG4gICAgY29uc3QgZ3JvdXBzID0gYXdhaXQgZ3JvdXBTdGFja3Moc2RrUHJvdmlkZXIsIHNlbGVjdGVkU3RhY2tzLnN0YWNrQXJ0aWZhY3RzLCBvcHRpb25zLmFkZGl0aW9uYWxTdGFja05hbWVzID8/IFtdKTtcblxuICAgIGZvciAobGV0IHsgZW52aXJvbm1lbnQsIGxvY2FsU3RhY2tzLCBkZXBsb3llZFN0YWNrcyB9IG9mIGdyb3Vwcykge1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhmb3JtYXRFbnZpcm9ubWVudFNlY3Rpb25IZWFkZXIoZW52aXJvbm1lbnQpKTtcblxuICAgICAgY29uc3QgbmV3U3RhY2tzID0gbG9jYWxTdGFja3MuZmlsdGVyKHMgPT4gIWRlcGxveWVkU3RhY2tzLm1hcCh0ID0+IHQuc3RhY2tOYW1lKS5pbmNsdWRlcyhzLnN0YWNrTmFtZSkpO1xuICAgICAgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8qXG4gICAgICAgICBXaGVuIHRoZSBDbG91ZEZvcm1hdGlvbiBzdGFjayByZWZhY3RvciBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBzdGFjaywgYW5kIHRoZSByZXNvdXJjZXMgYmVpbmcgbW92ZWQgdG8gdGhhdFxuICAgICAgICAgbmV3IHN0YWNrIGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciByZXNvdXJjZXMsIENsb3VkRm9ybWF0aW9uIG5lZWRzIHRvIGRvIHdoYXQgdGhleSBjYWxsIFwiY29sbGFwc2luZyB0aGVcbiAgICAgICAgIHRlbXBsYXRlXCIuIFRoZSBkZXRhaWxzIGRvbid0IHJlYWxseSBtYXR0ZXIsIGV4Y2VwdCB0aGF0LCBpbiB0aGUgcHJvY2VzcywgaXQgY2FsbHMgc29tZSBzZXJ2aWNlIEFQSXMsIHRvIHJlYWRcbiAgICAgICAgIHRoZSByZXNvdXJjZXMgYmVpbmcgbW92ZWQuIFRoZSByb2xlIGl0IHVzZXMgdG8gY2FsbCB0aGVzZSBBUElzIGludGVybmFsbHkgaXMgdGhlIHJvbGUgdGhlIHVzZXIgY2FsbGVkIHRoZVxuICAgICAgICAgc3RhY2sgcmVmYWN0b3JpbmcgQVBJIHdpdGgsIHdoaWNoIGluIG91ciBjYXNlIGlzIHRoZSBDbG91ZEZvcm1hdGlvbiBkZXBsb3ltZW50IHJvbGUsIGZyb20gdGhlIGJvb3RzdHJhcCBzdGFjayxcbiAgICAgICAgIGJ5IGRlZmF1bHQuXG5cbiAgICAgICAgIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyByb2xlIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCBhbGwgcmVzb3VyY2UgdHlwZXMuIEluIHRoaXMgY2FzZSxcbiAgICAgICAgIENsb3VkRm9ybWF0aW9uIHdpbGwgcm9sbCBiYWNrIHRoZSByZWZhY3RvciBvcGVyYXRpb24uIFNpbmNlIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBBUEksIHRoYXRcbiAgICAgICAgIHRoZSB1c2VyIGNhbm5vdCBrbm93IGFib3V0LCBhbmQgZGlkbid0IGFzayBmb3IsIGl0IHdpbGwgYmUgdmVyeSBzdXJwcmlzaW5nLiBTbyB3ZSd2ZSBkZWNpZGVkIHRvIGJsb2NrIHRoaXMgdXNlXG4gICAgICAgICBjYXNlIHVudGlsIENsb3VkRm9ybWF0aW9uIHN1cHBvcnRzIHBhc3NpbmcgYSBkaWZmZXJlbnQgcm9sZSB0byB1c2UgZm9yIHRoZXNlIHJlYWQgb3BlcmF0aW9ucywgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgIHdpdGggZGVwbG95bWVudC5cbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgVGhlIGZvbGxvd2luZyBzdGFjayR7bmV3U3RhY2tzLmxlbmd0aCA9PT0gMSA/ICcgaXMnIDogJ3MgYXJlJ30gbmV3OiAke25ld1N0YWNrcy5tYXAocyA9PiBzLnN0YWNrTmFtZSkuam9pbignLCAnKX1cXG5gO1xuICAgICAgICBtZXNzYWdlICs9ICdDcmVhdGlvbiBvZiBuZXcgc3RhY2tzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoZSByZWZhY3RvciBjb21tYW5kLiAnO1xuICAgICAgICBtZXNzYWdlICs9ICdQbGVhc2UgZGVwbG95IGFueSBuZXcgc3RhY2tzIHNlcGFyYXRlbHkgYmVmb3JlIHJlZmFjdG9yaW5nIHlvdXIgc3RhY2tzLic7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGNoYWxrLnJlZChtZXNzYWdlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFJlZmFjdG9yaW5nQ29udGV4dCh7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgZGVwbG95ZWRTdGFja3MsXG4gICAgICAgICAgbG9jYWxTdGFja3MsXG4gICAgICAgICAgYXNzdW1lUm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIG92ZXJyaWRlczogZ2V0T3ZlcnJpZGVzKGVudmlyb25tZW50LCBkZXBsb3llZFN0YWNrcywgbG9jYWxTdGFja3MpLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtYXBwaW5ncyA9IGNvbnRleHQubWFwcGluZ3M7XG5cbiAgICAgICAgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMCAmJiBjb250ZXh0LmFtYmlndW91c1BhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ05vdGhpbmcgdG8gcmVmYWN0b3IuJyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlZE1hcHBpbmdzID0gbWFwcGluZ3NcbiAgICAgICAgICAubWFwKG0gPT4gbS50b1R5cGVkTWFwcGluZygpKVxuICAgICAgICAgIC5maWx0ZXIobSA9PiBtLnR5cGUgIT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKTtcblxuICAgICAgICBsZXQgcmVmYWN0b3JNZXNzYWdlID0gZm9ybWF0VHlwZWRNYXBwaW5ncyh0eXBlZE1hcHBpbmdzKTtcbiAgICAgICAgY29uc3QgcmVmYWN0b3JSZXN1bHQ6IFJlZmFjdG9yUmVzdWx0ID0geyB0eXBlZE1hcHBpbmdzIH07XG5cbiAgICAgICAgY29uc3Qgc3RhY2tEZWZpbml0aW9ucyA9IGF3YWl0IGdlbmVyYXRlU3RhY2tEZWZpbml0aW9ucyhtYXBwaW5ncywgZGVwbG95ZWRTdGFja3MsIGxvY2FsU3RhY2tzLCBlbnZpcm9ubWVudCwgc2RrUHJvdmlkZXIsIGlvSGVscGVyKTtcblxuICAgICAgICBpZiAoY29udGV4dC5hbWJpZ3VvdXNQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBjb250ZXh0LmFtYmlndW91c1BhdGhzO1xuICAgICAgICAgIHJlZmFjdG9yTWVzc2FnZSArPSAnXFxuJyArIGZvcm1hdEFtYmlndW91c01hcHBpbmdzKHBhdGhzKTtcbiAgICAgICAgICByZWZhY3RvclJlc3VsdC5hbWJpZ3VvdXNQYXRocyA9IHBhdGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k4OTAwLm1zZyhyZWZhY3Rvck1lc3NhZ2UsIHJlZmFjdG9yUmVzdWx0KSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuIHx8IGNvbnRleHQubWFwcGluZ3MubGVuZ3RoID09PSAwIHx8IGNvbnRleHQuYW1iaWd1b3VzUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkby5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluIGludGVyYWN0aXZlIG1vZGUgKFRUWSkgd2UgbmVlZCBjb25maXJtYXRpb24gYmVmb3JlIHByb2NlZWRpbmdcbiAgICAgICAgaWYgKHByb2Nlc3Muc3Rkb3V0LmlzVFRZICYmICFhd2FpdCBjb25maXJtKG9wdGlvbnMuZm9yY2UgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhjaGFsay5yZWQoYFJlZmFjdG9yaW5nIGNhbmNlbGVkIGZvciBlbnZpcm9ubWVudCBhd3M6Ly8ke2Vudmlyb25tZW50LmFjY291bnR9LyR7ZW52aXJvbm1lbnQucmVnaW9ufVxcbmApKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1JlZmFjdG9yaW5nLi4uJyk7XG4gICAgICAgIGF3YWl0IGNvbnRleHQuZXhlY3V0ZShzdGFja0RlZmluaXRpb25zLCBzZGtQcm92aWRlciwgaW9IZWxwZXIpO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfinIUgIFN0YWNrIHJlZmFjdG9yIGNvbXBsZXRlJyk7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnRGVwbG95aW5nIHVwZGF0ZWQgc3RhY2tzIHRvIGZpbmFsaXplIHJlZmFjdG9yLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVwbG95KGN4LCB7XG4gICAgICAgICAgc3RhY2tzOiBBTExfU1RBQ0tTLFxuICAgICAgICAgIGZvcmNlRGVwbG95bWVudDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGDinYwgIFJlZmFjdG9yIGZhaWxlZDogJHtmb3JtYXRFcnJvcihlKX1gO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTg5MDAubXNnKG1lc3NhZ2UsIHsgZXJyb3I6IGUgfSkpO1xuXG4gICAgICAgIC8vIEFsc28gZGVidWdnaW5nIHRoZSBlcnJvciwgYmVjYXVzZSB0aGUgQVBJIGRvZXMgbm90IGFsd2F5cyByZXR1cm4gYSB1c2VyLWZyaWVuZGx5IG1lc3NhZ2VcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRPdmVycmlkZXMoZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LCBkZXBsb3llZFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdLCBsb2NhbFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKSB7XG4gICAgICBjb25zdCBtYXBwaW5nR3JvdXAgPSBvcHRpb25zLm92ZXJyaWRlc1xuICAgICAgICA/LmZpbmQoZyA9PiBnLnJlZ2lvbiA9PT0gZW52aXJvbm1lbnQucmVnaW9uICYmIGcuYWNjb3VudCA9PT0gZW52aXJvbm1lbnQuYWNjb3VudCk7XG5cbiAgICAgIHJldHVybiBtYXBwaW5nR3JvdXAgPT0gbnVsbFxuICAgICAgICA/IFtdXG4gICAgICAgIDogT2JqZWN0LmVudHJpZXMobWFwcGluZ0dyb3VwLnJlc291cmNlcyA/PyB7fSlcbiAgICAgICAgICAubWFwKChbc291cmNlLCBkZXN0aW5hdGlvbl0pID0+IG5ldyBSZXNvdXJjZU1hcHBpbmcoXG4gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKHNvdXJjZSwgZGVwbG95ZWRTdGFja3MpLFxuICAgICAgICAgICAgZ2V0UmVzb3VyY2VMb2NhdGlvbihkZXN0aW5hdGlvbiwgbG9jYWxTdGFja3MpLFxuICAgICAgICAgICkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFJlc291cmNlTG9jYXRpb24obG9jYXRpb246IHN0cmluZywgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBSZXNvdXJjZUxvY2F0aW9uIHtcbiAgICAgIGZvciAobGV0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgICAgICBjb25zdCBbc3RhY2tOYW1lLCBsb2dpY2FsSWRdID0gbG9jYXRpb24uc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKHN0YWNrTmFtZSAhPSBudWxsICYmIGxvZ2ljYWxJZCAhPSBudWxsICYmIHN0YWNrLnN0YWNrTmFtZSA9PT0gc3RhY2tOYW1lICYmIHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcz8uW2xvZ2ljYWxJZF0gIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VMb2NhdGlvbihzdGFjaywgbG9naWNhbElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXNvdXJjZUVudHJ5ID0gT2JqZWN0XG4gICAgICAgICAgICAuZW50cmllcyhzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge30pXG4gICAgICAgICAgICAuZmluZCgoW18sIHJdKSA9PiByLk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID09PSBsb2NhdGlvbik7XG4gICAgICAgICAgaWYgKHJlc291cmNlRW50cnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUxvY2F0aW9uKHN0YWNrLCByZXNvdXJjZUVudHJ5WzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1Jlc291cmNlTG9jYXRpb25Ob3RGb3VuZCcsIGBDYW5ub3QgZmluZCByZXNvdXJjZSBpbiBsb2NhdGlvbiAke2xvY2F0aW9ufWApO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNvbmZpcm0oZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIC8vICdmb3JjZScgaXMgc2V0IHRvIHRydWUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgaGF2aW5nIHByZS1hcHByb3ZhbCBmb3IgYW55IHJlZmFjdG9yXG4gICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXN0aW9uID0gJ0RvIHlvdSB3aXNoIHRvIHJlZmFjdG9yIHRoZXNlIHJlc291cmNlcz8nO1xuICAgICAgcmV0dXJuIGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JODkxMC5yZXEocXVlc3Rpb24sIHtcbiAgICAgICAgbW90aXZhdGlvbjogJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXRFcnJvcihlcnJvcjogYW55KTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHBheWxvYWQucmVhc29uPy5TdGF0dXNSZWFzb24pIHtcbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKGBSZWZhY3RvciBjcmVhdGlvbjogWyR7cGF5bG9hZC5yZWFzb24/LlN0YXR1c31dICR7cGF5bG9hZC5yZWFzb24uU3RhdHVzUmVhc29ufWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXlsb2FkLnJlYXNvbj8uRXhlY3V0aW9uU3RhdHVzUmVhc29uKSB7XG4gICAgICAgICAgbWVzc2FnZXMucHVzaChgUmVmYWN0b3IgZXhlY3V0aW9uOiBbJHtwYXlsb2FkLnJlYXNvbj8uU3RhdHVzfV0gJHtwYXlsb2FkLnJlYXNvbi5FeGVjdXRpb25TdGF0dXNSZWFzb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLmxlbmd0aCA+IDAgPyBtZXNzYWdlcy5qb2luKCdcXG4nKSA6IGBVbmtub3duIGVycm9yIChTdGFjayByZWZhY3RvciBJRDogJHtwYXlsb2FkLnJlYXNvbj8uU3RhY2tSZWZhY3RvcklkID8/ICd1bmtub3duJ30pYDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgQWN0aW9uXG4gICAqXG4gICAqIERlc3Ryb3lzIHRoZSBzZWxlY3RlZCBTdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zID0ge30pOiBQcm9taXNlPERlc3Ryb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkZXN0cm95Jyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kZXN0cm95KGFzc2VtYmx5LCAnZGVzdHJveScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXN0cm95IGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVzdHJveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICdkZXN0cm95Jywgb3B0aW9uczogRGVzdHJveU9wdGlvbnMpOiBQcm9taXNlPERlc3Ryb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCByZXQ6IERlc3Ryb3lSZXN1bHQgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgIH07XG5cbiAgICBjb25zdCBtb3RpdmF0aW9uID0gJ0Rlc3Ryb3lpbmcgc3RhY2tzIGlzIGFuIGlycmV2ZXJzaWJsZSBhY3Rpb24nO1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGU6ICR7Y2hhbGsucmVkKHN0YWNrcy5oaWVyYXJjaGljYWxJZHMuam9pbignLCAnKSl9YDtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTcwMTAucmVxKHF1ZXN0aW9uLCB7IG1vdGl2YXRpb24gfSkpO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTcwMTAubXNnKCdBYm9ydGVkIGJ5IHVzZXInKSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gb3B0aW9ucy5jb25jdXJyZW5jeSB8fCAxO1xuICAgIGxldCBkZXN0cm95Q291bnQgPSAwO1xuXG4gICAgY29uc3QgZGVzdHJveVNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uREVTVFJPWV9BQ1RJT04pLmJlZ2luKHtcbiAgICAgIHN0YWNrczogc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0cm95U3RhY2sgPSBhc3luYyAoc3RhY2tOb2RlOiBTdGFja05vZGUpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja05vZGUuc3RhY2s7XG4gICAgICAgIGRlc3Ryb3lDb3VudCsrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNpbmdsZURlc3Ryb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFU1RST1lfU1RBQ0spXG4gICAgICAgICAgICAuYmVnaW4oY2hhbGsuZ3JlZW4oYCR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXN0cm95aW5nLi4uIFske2Rlc3Ryb3lDb3VudH0vJHtzdGFja3Muc3RhY2tDb3VudH1dYCksIHtcbiAgICAgICAgICAgICAgdG90YWw6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgICAgICAgICBjdXJyZW50OiBkZXN0cm95Q291bnQsXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMuZGVzdHJveVN0YWNrKHtcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YWNrTmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgc3RhY2tBcm46IHJlc3VsdC5zdGFja0FybixcbiAgICAgICAgICAgIHN0YWNrRXhpc3RlZDogcmVzdWx0LnN0YWNrQXJuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTc5MDAubXNnKGNoYWxrLmdyZWVuKGBcXG4g4pyFICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259ZWRgKSwgc3RhY2spKTtcbiAgICAgICAgICBhd2FpdCBzaW5nbGVEZXN0cm95U3Bhbi5lbmQoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufSBmYWlsZWQgJHtlfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdvcmtHcmFwaCA9IGJ1aWxkRGVzdHJveVdvcmtHcmFwaChzdGFja3Muc3RhY2tBcnRpZmFjdHMsIGlvSGVscGVyKTtcbiAgICAgIGF3YWl0IHdvcmtHcmFwaC5wcm9jZXNzU3RhY2tzKGNvbmN1cnJlbmN5LCBkZXN0cm95U3RhY2spO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkZXN0cm95U3Bhbi5lbmQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIHN0YWNrcyBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncyBhY2NvcmRpbmcgdG8gdGhlIENMSSdzIGN1cnJlbnQgc2V0dGluZ3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTdGFja3NNZXRhZGF0YShzdGFja3M6IFN0YWNrQ29sbGVjdGlvbiwgaW9Ib3N0OiBJb0hlbHBlcikge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSAobGV2ZWw6IElvTWVzc2FnZUxldmVsKSA9PiB7XG4gICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX0U5OTk5O1xuICAgICAgICBjYXNlICd3YXJuJzpcbiAgICAgICAgICByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX1c5OTk5O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBJTy5DREtfQVNTRU1CTFlfSTk5OTk7XG4gICAgICB9XG4gICAgfTtcbiAgICBhd2FpdCBzdGFja3MudmFsaWRhdGVNZXRhZGF0YShcbiAgICAgIHRoaXMucHJvcHMuYXNzZW1ibHlGYWlsdXJlQXQsXG4gICAgICBhc3luYyAobGV2ZWwsIG1zZykgPT4gaW9Ib3N0Lm5vdGlmeShidWlsZGVyKGxldmVsKS5tc2coYFske2xldmVsfSBhdCAke21zZy5pZH1dICR7bXNnLmVudHJ5LmRhdGF9YCwgbXNnKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkZXBsb3ltZW50cyBjbGFzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPERlcGxveW1lbnRzPiB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50cyh7XG4gICAgICBzZGtQcm92aWRlcjogYXdhaXQgdGhpcy5zZGtQcm92aWRlcihhY3Rpb24pLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgaW9IZWxwZXI6IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludm9rZURlcGxveUZyb21XYXRjaChcbiAgICBhc3NlbWJseTogU3RhY2tBc3NlbWJseSxcbiAgICBvcHRpb25zOiBXYXRjaE9wdGlvbnMsXG4gICAgY2xvdWRXYXRjaExvZ01vbml0b3I/OiBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB3YXRjaCBkZWZhdWx0cyB0byBob3Rzd2FwIGRlcGxveW1lbnRcbiAgICBjb25zdCBkZXBsb3ltZW50TWV0aG9kID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kID8/IHsgbWV0aG9kOiAnaG90c3dhcCcgfTtcbiAgICBjb25zdCBkZXBsb3lPcHRpb25zOiBQcml2YXRlRGVwbG95T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcixcbiAgICAgIGRlcGxveW1lbnRNZXRob2QsXG4gICAgICBleHRyYVVzZXJBZ2VudDogYGNkay13YXRjaC9ob3Rzd2FwLSR7ZGVwbG95bWVudE1ldGhvZC5tZXRob2QgPT09ICdob3Rzd2FwJyA/ICdvbicgOiAnb2ZmJ31gLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnd2F0Y2gnLCB6ZXJvVGltZSgpLCBkZXBsb3lPcHRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGp1c3QgY29udGludWUgLSBkZXBsb3kgd2lsbCBzaG93IHRoZSBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBmZWF0dXJlIGZsYWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmbGFncyhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UpOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ2ZsYWdzJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdmbGFncycpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCk7XG4gICAgY29uc3QgYXJ0aWZhY3RzID0gT2JqZWN0LnZhbHVlcyhhc3NlbWJseS5jbG91ZEFzc2VtYmx5Lm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSk7XG4gICAgY29uc3QgZmVhdHVyZUZsYWdSZXBvcnRzID0gYXJ0aWZhY3RzLmZpbHRlcihhID0+IGEudHlwZSA9PT0gQXJ0aWZhY3RUeXBlLkZFQVRVUkVfRkxBR19SRVBPUlQpO1xuXG4gICAgY29uc3QgZmxhZ3MgPSBmZWF0dXJlRmxhZ1JlcG9ydHMuZmxhdE1hcChyZXBvcnQgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHJlcG9ydC5wcm9wZXJ0aWVzIGFzIEZlYXR1cmVGbGFnUmVwb3J0UHJvcGVydGllcztcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBwcm9wZXJ0aWVzLm1vZHVsZTtcblxuICAgICAgY29uc3QgZmxhZ3NXaXRoVW5jb25maWd1cmVkQmVoYXZlc0xpa2UgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLmZsYWdzKVxuICAgICAgICAuZmlsdGVyKChbXywgZmxhZ0luZm9dKSA9PiBmbGFnSW5mby51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSAhPSB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBzaG91bGRJbmNsdWRlVW5jb25maWd1cmVkQmVoYXZlc0xpa2UgPSBmbGFnc1dpdGhVbmNvbmZpZ3VyZWRCZWhhdmVzTGlrZS5sZW5ndGggPiAwO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5mbGFncykubWFwKChbZmxhZ05hbWUsIGZsYWdJbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlRmxhZyA9IHtcbiAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgbmFtZTogZmxhZ05hbWUsXG4gICAgICAgICAgcmVjb21tZW5kZWRWYWx1ZTogZmxhZ0luZm8ucmVjb21tZW5kZWRWYWx1ZSxcbiAgICAgICAgICB1c2VyVmFsdWU6IGZsYWdJbmZvLnVzZXJWYWx1ZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwbGFuYXRpb246IGZsYWdJbmZvLmV4cGxhbmF0aW9uID8/ICcnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzaG91bGRJbmNsdWRlVW5jb25maWd1cmVkQmVoYXZlc0xpa2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUZsYWcsXG4gICAgICAgICAgICB1bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZToge1xuICAgICAgICAgICAgICB2MjogZmxhZ0luZm8udW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyID8/IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhc2VGbGFnO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmxhZ3M7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVVbnN0YWJsZUZlYXR1cmUocmVxdWVzdGVkRmVhdHVyZTogVW5zdGFibGVGZWF0dXJlKSB7XG4gICAgaWYgKCF0aGlzLnVuc3RhYmxlRmVhdHVyZXMuaW5jbHVkZXMocmVxdWVzdGVkRmVhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1Vuc3RhYmxlRmVhdHVyZU5vdEVuYWJsZWQnLCBgVW5zdGFibGUgZmVhdHVyZSAnJHtyZXF1ZXN0ZWRGZWF0dXJlfScgaXMgbm90IGVuYWJsZWQuIFBsZWFzZSBlbmFibGUgaXQgdW5kZXIgJ3Vuc3RhYmxlRmVhdHVyZXMnIChjdXJyZW50bHkgZW5hYmxlZDogJHt0aGlzLnVuc3RhYmxlRmVhdHVyZXN9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBidWlsZEFzc2V0IGZ1bmN0aW9uIGZvciB1c2UgaW4gV29ya0dyYXBoXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgZGVwbG95bWVudHM6IERlcGxveW1lbnRzLFxuICAgIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIChhc3NldE5vZGU6IEFzc2V0QnVpbGROb2RlKSA9PiB7XG4gICAgICBjb25zdCBidWlsZEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5CVUlMRF9BU1NFVCkuYmVnaW4oe1xuICAgICAgICBhc3NldDogYXNzZXROb2RlLmFzc2V0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5idWlsZFNpbmdsZUFzc2V0KFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdEFydGlmYWN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgICByb2xlQXJuLFxuICAgICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBidWlsZEFzc2V0U3Bhbi5lbmQoKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHB1Ymxpc2hBc3NldCBmdW5jdGlvbiBmb3IgdXNlIGluIFdvcmtHcmFwaFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQdWJsaXNoQXNzZXRGdW5jdGlvbihcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgZGVwbG95bWVudHM6IERlcGxveW1lbnRzLFxuICAgIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmb3JjZVB1Ymxpc2g/OiBib29sZWFuLFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4ge1xuICAgICAgY29uc3QgcHVibGlzaEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5QVUJMSVNIX0FTU0VUKS5iZWdpbih7XG4gICAgICAgIGFzc2V0OiBhc3NldE5vZGUuYXNzZXQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLnB1Ymxpc2hTaW5nbGVBc3NldChhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCwgYXNzZXROb2RlLmFzc2V0LCB7XG4gICAgICAgIHN0YWNrOiBhc3NldE5vZGUucGFyZW50U3RhY2ssXG4gICAgICAgIHJvbGVBcm4sXG4gICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgZm9yY2VQdWJsaXNoLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBwdWJsaXNoQXNzZXRTcGFuLmVuZCgpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDZW50cmFsaXplIHRoZSBkZWZhdWx0IHN0YWNrIHNlbGVjdGlvbiBsb2dpYyBpbiBhIHNpbmdsZSBwbGFjZVxuICovXG5mdW5jdGlvbiBzdGFja3NPcHQobzogeyBzdGFja3M/OiBTdGFja1NlbGVjdG9yIH0pOiBTdGFja1NlbGVjdG9yIHtcbiAgcmV0dXJuIG8uc3RhY2tzID8/IEFMTF9TVEFDS1M7XG59XG5cbi8qKlxuICogUGVyZm9ybSBzeW50aGVzaXMgYW5kIGVtaXQgdGhlIHRpbWUgdGFrZW4gdG8gYSBuZXcgc3BhblxuICovXG5hc3luYyBmdW5jdGlvbiBzeW50aEFuZE1lYXN1cmUoXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLFxuICBzZWxlY3RTdGFja3M6IFN0YWNrU2VsZWN0b3IsXG4pOiBQcm9taXNlPFN0YWNrQXNzZW1ibHkgJiB7IHN5bnRoRHVyYXRpb246IEVsYXBzZWRUaW1lIH0+IHtcbiAgY29uc3Qgc3ludGhTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlNZTlRIX0FTU0VNQkxZKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShzeW50aFNwYW4uYXNIZWxwZXIsIGN4KTtcbiAgICBjb3VudEFzc2VtYmx5UmVzdWx0cyhzeW50aFNwYW4sIHJldC5hc3NlbWJseSk7XG4gICAgY29uc3Qgc3ludGhEdXJhdGlvbiA9IGF3YWl0IHN5bnRoU3Bhbi5lbmQoe30pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmV0LCB7IHN5bnRoRHVyYXRpb24gfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAvLyBFbmQgdGhlIHNwYW4gZXZlbiBpZiB3ZSBoYWQgYSBmYWlsdXJlXG4gICAgYXdhaXQgc3ludGhTcGFuLmVuZCh7IGVycm9yIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHplcm9UaW1lKCk6IEVsYXBzZWRUaW1lIHtcbiAgcmV0dXJuIHsgYXNNczogMCwgYXNTZWM6IDAgfTtcbn1cbiJdfQ==
|