@aws-cdk/toolkit-lib 1.30.0 → 1.31.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.
Files changed (90) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.js +35 -2
  3. package/lib/actions/diff/private/helpers.js +36 -3
  4. package/lib/api/aws-auth/account-cache.js +36 -3
  5. package/lib/api/aws-auth/sdk-provider.js +36 -3
  6. package/lib/api/aws-auth/sdk.d.ts +2 -1
  7. package/lib/api/aws-auth/sdk.js +2 -1
  8. package/lib/api/aws-auth/user-agent.js +35 -2
  9. package/lib/api/aws-auth/util.js +35 -2
  10. package/lib/api/bootstrap/bootstrap-environment.js +35 -2
  11. package/lib/api/bootstrap/deploy-bootstrap.js +37 -4
  12. package/lib/api/cloud-assembly/context-store.js +36 -3
  13. package/lib/api/cloud-assembly/environment.js +37 -4
  14. package/lib/api/cloud-assembly/private/context-aware-source.js +35 -2
  15. package/lib/api/cloud-assembly/private/exec.js +35 -2
  16. package/lib/api/cloud-assembly/private/prepare-source.js +39 -6
  17. package/lib/api/cloud-assembly/source-builder.js +37 -4
  18. package/lib/api/cloud-assembly/stack-assembly.js +8 -4
  19. package/lib/api/cloudformation/logical-id-map.js +35 -2
  20. package/lib/api/cloudformation/nested-stack-helpers.js +36 -3
  21. package/lib/api/cloudformation/template-body-parameter.js +42 -6
  22. package/lib/api/deployments/asset-manifest-builder.js +35 -2
  23. package/lib/api/deployments/assets.js +42 -6
  24. package/lib/api/deployments/cfn-api.d.ts +4 -2
  25. package/lib/api/deployments/cfn-api.js +47 -6
  26. package/lib/api/deployments/deploy-stack.js +8 -5
  27. package/lib/api/deployments/deployments.js +40 -4
  28. package/lib/api/diagnosing/format-utils.d.ts +29 -0
  29. package/lib/api/diagnosing/format-utils.js +141 -1
  30. package/lib/api/diagnosing/investigate-custom-resource.d.ts +17 -0
  31. package/lib/api/diagnosing/investigate-custom-resource.js +247 -0
  32. package/lib/api/diagnosing/investigate-ecs-service.d.ts +20 -0
  33. package/lib/api/diagnosing/investigate-ecs-service.js +242 -0
  34. package/lib/api/diagnosing/resource-identifiers.d.ts +39 -0
  35. package/lib/api/diagnosing/resource-identifiers.js +90 -0
  36. package/lib/api/diagnosing/resource-investigation.d.ts +2 -30
  37. package/lib/api/diagnosing/resource-investigation.js +9 -289
  38. package/lib/api/diff/diff-formatter.js +11 -8
  39. package/lib/api/drift/drift-formatter.js +20 -17
  40. package/lib/api/garbage-collection/garbage-collector.js +7 -4
  41. package/lib/api/garbage-collection/progress-printer.js +7 -4
  42. package/lib/api/hotswap/hotswap-deployments.js +46 -10
  43. package/lib/api/hotswap/hotswap-template-cache.js +36 -3
  44. package/lib/api/io/private/io-default-messages.js +35 -2
  45. package/lib/api/io/private/message-maker.d.ts +4 -0
  46. package/lib/api/io/private/message-maker.js +3 -1
  47. package/lib/api/io/private/messages.d.ts +2 -0
  48. package/lib/api/io/private/messages.js +43 -2
  49. package/lib/api/io/private/span.js +35 -2
  50. package/lib/api/logs-monitor/logs-monitor.js +40 -4
  51. package/lib/api/network-detector/network-detector.js +37 -4
  52. package/lib/api/notices/cached-data-source.js +35 -2
  53. package/lib/api/notices/filter.js +35 -2
  54. package/lib/api/notices/notices.js +35 -2
  55. package/lib/api/notices/web-data-source.js +35 -2
  56. package/lib/api/refactoring/digest.js +35 -2
  57. package/lib/api/refactoring/stack-definitions.js +40 -4
  58. package/lib/api/resource-import/importer.js +58 -15
  59. package/lib/api/resource-import/migrator.js +42 -6
  60. package/lib/api/rwlock.js +35 -2
  61. package/lib/api/settings.js +38 -5
  62. package/lib/api/source-tracing/private/stack-source-tracing.js +38 -5
  63. package/lib/api/stack-events/resource-errors.d.ts +12 -0
  64. package/lib/api/stack-events/resource-errors.js +2 -1
  65. package/lib/api/stack-events/stack-activity-monitor.js +35 -2
  66. package/lib/api/stack-events/stack-progress-monitor.js +35 -2
  67. package/lib/api/toolkit-info.js +7 -4
  68. package/lib/api/tree.js +36 -3
  69. package/lib/api/validate/validate-formatting.js +53 -17
  70. package/lib/api/work-graph/build-destroy-work-graph.js +35 -2
  71. package/lib/api/work-graph/work-graph-builder.js +35 -2
  72. package/lib/context-providers/index.js +35 -2
  73. package/lib/private/activity-printer/current.js +52 -16
  74. package/lib/private/activity-printer/history.js +50 -14
  75. package/lib/private/tools.js +38 -1
  76. package/lib/toolkit/non-interactive-io-host.js +11 -8
  77. package/lib/toolkit/private/collect-annotation-report.js +35 -2
  78. package/lib/toolkit/private/validation-report.js +36 -3
  79. package/lib/toolkit/toolkit-error.d.ts +20 -0
  80. package/lib/toolkit/toolkit-error.js +30 -2
  81. package/lib/toolkit/toolkit.d.ts +8 -0
  82. package/lib/toolkit/toolkit.js +81 -35
  83. package/lib/util/content-hash.js +35 -2
  84. package/lib/util/directories.js +38 -5
  85. package/lib/util/guess-language.js +36 -3
  86. package/lib/util/package-info.js +35 -2
  87. package/lib/util/serialize.js +36 -3
  88. package/lib/util/version-range.js +35 -2
  89. package/lib/util/yaml-cfn.js +36 -3
  90. package/package.json +2 -2
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
3
36
  if (value !== null && value !== void 0) {
4
37
  if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
@@ -51,15 +84,18 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
51
84
  var e = new Error(message);
52
85
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
53
86
  });
87
+ var __importDefault = (this && this.__importDefault) || function (mod) {
88
+ return (mod && mod.__esModule) ? mod : { "default": mod };
89
+ };
54
90
  Object.defineProperty(exports, "__esModule", { value: true });
55
91
  exports.Toolkit = void 0;
56
92
  require("../private/dispose-polyfill");
57
93
  const node_crypto_1 = require("node:crypto");
58
- const path = require("node:path");
59
- const cxapi = require("@aws-cdk/cloud-assembly-api");
94
+ const path = __importStar(require("node:path"));
95
+ const cxapi = __importStar(require("@aws-cdk/cloud-assembly-api"));
60
96
  const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
61
- const chalk = require("chalk");
62
- const chokidar = require("chokidar");
97
+ const chalk_1 = __importDefault(require("chalk"));
98
+ const chokidar = __importStar(require("chokidar"));
63
99
  const handler_js_1 = require("chokidar/handler.js");
64
100
  /**
65
101
  * File events that we care about from chokidar.
@@ -73,7 +109,7 @@ const FILE_EVENTS = [handler_js_1.EVENTS.ADD, handler_js_1.EVENTS.ADD_DIR, handl
73
109
  function isFileEvent(event) {
74
110
  return FILE_EVENTS.includes(event);
75
111
  }
76
- const fs = require("fs-extra");
112
+ const fs = __importStar(require("fs-extra"));
77
113
  const non_interactive_io_host_1 = require("./non-interactive-io-host");
78
114
  const private_1 = require("./private");
79
115
  const toolkit_error_1 = require("./toolkit-error");
@@ -211,7 +247,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
211
247
  // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
212
248
  await Promise.all(bootstrapEnvironments.map((environment, currentIdx) => limit(async () => {
213
249
  const bootstrapSpan = await ioHelper.span(private_7.SPAN.BOOTSTRAP_SINGLE)
214
- .begin(`${chalk.bold(environment.name)}: bootstrapping...`, {
250
+ .begin(`${chalk_1.default.bold(environment.name)}: bootstrapping...`, {
215
251
  total: bootstrapEnvironments.length,
216
252
  current: currentIdx + 1,
217
253
  environment,
@@ -227,7 +263,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
227
263
  const message = bootstrapResult.noOp
228
264
  ? ` ✅ ${environment.name} (no changes)`
229
265
  : ` ✅ ${environment.name}`;
230
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9900.msg(chalk.green('\n' + message), { environment }));
266
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9900.msg(chalk_1.default.green('\n' + message), { environment }));
231
267
  const envTime = await bootstrapSpan.end();
232
268
  const result = {
233
269
  environment,
@@ -237,7 +273,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
237
273
  results.push(result);
238
274
  }
239
275
  catch (e) {
240
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E9900.msg(`\n ❌ ${chalk.bold(environment.name)} failed: ${(0, util_1.formatErrorMessage)(e)}`, { error: e }));
276
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E9900.msg(`\n ❌ ${chalk_1.default.bold(environment.name)} failed: ${(0, util_1.formatErrorMessage)(e)}`, { error: e }));
241
277
  throw e;
242
278
  }
243
279
  })));
@@ -261,7 +297,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
261
297
  const autoValidateStacks = options.validateStacks ? [assembly.value.selectStacksForValidation()] : [];
262
298
  await (0, validation_report_1.throwIfValidationFailures)(assembly.value, stacks.concat(...autoValidateStacks), this.assemblyFailureAt, ioHelper);
263
299
  // if we have a single stack, print it to STDOUT
264
- const message = `Successfully synthesized to ${chalk.blue(path.resolve(stacks.assembly.directory))}`;
300
+ const message = `Successfully synthesized to ${chalk_1.default.blue(path.resolve(stacks.assembly.directory))}`;
265
301
  const assemblyData = {
266
302
  assemblyDirectory: stacks.assembly.directory,
267
303
  stacksCount: stacks.stackCount,
@@ -284,8 +320,8 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
284
320
  }
285
321
  else {
286
322
  // not outputting template to stdout, let's explain things to the user a little bit...
287
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I1902.msg(chalk.green(message), assemblyData));
288
- await ioHelper.defaults.info(`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk.green(s.hierarchicalId)).join(', ')}) to display its template.`);
323
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I1902.msg(chalk_1.default.green(message), assemblyData));
324
+ await ioHelper.defaults.info(`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk_1.default.green(s.hierarchicalId)).join(', ')}) to display its template.`);
289
325
  }
290
326
  return new cloud_assembly_1.CachedCloudAssembly(assembly.take());
291
327
  }
@@ -471,7 +507,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
471
507
  const assetNodes = Object.values(workGraph.nodes)
472
508
  .filter((n) => n.type === 'asset-publish');
473
509
  if (assetNodes.length === 0) {
474
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9400.msg(chalk.green('\n✨ All assets are already published\n')));
510
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9400.msg(chalk_1.default.green('\n✨ All assets are already published\n')));
475
511
  return {
476
512
  publishedAssets: [],
477
513
  };
@@ -492,7 +528,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
492
528
  publishAsset: this.createPublishAssetFunction(ioHelper, deployments, undefined, options.force),
493
529
  marker: work_graph_1.WorkGraph.NOOP,
494
530
  });
495
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9402.msg(chalk.green('\n✨ Assets published successfully\n'), { assets }));
531
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I9402.msg(chalk_1.default.green('\n✨ Assets published successfully\n'), { assets }));
496
532
  return {
497
533
  publishedAssets: assets,
498
534
  };
@@ -746,7 +782,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
746
782
  const deployStack = async (stackNode) => {
747
783
  const stack = stackNode.stack;
748
784
  if (stackCollection.stackCount !== 1) {
749
- await ioHelper.defaults.info(chalk.bold(stack.displayName));
785
+ await ioHelper.defaults.info(chalk_1.default.bold(stack.displayName));
750
786
  }
751
787
  if (!stack.environment) {
752
788
  throw new toolkit_error_1.ToolkitError('StackEnvironmentMissing', `Stack ${stack.displayName} does not define an environment, and AWS credentials could not be obtained from standard locations or no region was configured.`);
@@ -757,10 +793,10 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
757
793
  // stack is empty and doesn't exist => do nothing
758
794
  const stackExists = await deployments.stackExists({ stack });
759
795
  if (!stackExists) {
760
- return ioHelper.notify(private_7.IO.CDK_TOOLKIT_W5021.msg(`${chalk.bold(stack.displayName)}: stack has no resources, skipping deployment.`));
796
+ return ioHelper.notify(private_7.IO.CDK_TOOLKIT_W5021.msg(`${chalk_1.default.bold(stack.displayName)}: stack has no resources, skipping deployment.`));
761
797
  }
762
798
  // stack is empty, but exists => delete
763
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_W5022.msg(`${chalk.bold(stack.displayName)}: stack has no resources, deleting existing stack.`));
799
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_W5022.msg(`${chalk_1.default.bold(stack.displayName)}: stack has no resources, deleting existing stack.`));
764
800
  await this._destroy(assembly, 'deploy', {
765
801
  stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
766
802
  roleArn: options.roleArn,
@@ -843,12 +879,12 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
843
879
  if (prepareResult?.changeSet?.ChangeSetName) {
844
880
  await deployments.cleanupChangeSet(stack, prepareResult.changeSet.ChangeSetName);
845
881
  }
846
- throw new toolkit_error_1.ToolkitError('DeployAborted', 'Aborted by user');
882
+ throw new toolkit_error_1.AbortError('DeployAborted', 'Deployment cancelled');
847
883
  }
848
884
  }
849
885
  const stackIndex = stacks.indexOf(stack) + 1;
850
886
  const deploySpan = await ioHelper.span(private_7.SPAN.DEPLOY_STACK)
851
- .begin(`${chalk.bold(stack.displayName)}: deploying... [${stackIndex}/${stackCollection.stackCount}]`, {
887
+ .begin(`${chalk_1.default.bold(stack.displayName)}: deploying... [${stackIndex}/${stackCollection.stackCount}]`, {
852
888
  total: stackCollection.stackCount,
853
889
  current: stackIndex,
854
890
  stack,
@@ -887,7 +923,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
887
923
  concurrency,
888
924
  }));
889
925
  if (!confirmed) {
890
- throw new toolkit_error_1.ToolkitError('RollbackAborted', 'Aborted by user');
926
+ throw new toolkit_error_1.AbortError('RollbackAborted', 'Rollback cancelled');
891
927
  }
892
928
  // Perform a rollback
893
929
  await this._rollback(assembly, action, {
@@ -909,7 +945,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
909
945
  concurrency,
910
946
  }));
911
947
  if (!confirmed) {
912
- throw new toolkit_error_1.ToolkitError('ReplacementRollbackAborted', 'Aborted by user');
948
+ throw new toolkit_error_1.AbortError('ReplacementRollbackAborted', 'Rollback cancelled');
913
949
  }
914
950
  // Go around through the 'while' loop again but switch rollback to true.
915
951
  rollback = true;
@@ -922,14 +958,14 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
922
958
  const message = deployResult.noOp
923
959
  ? ` ✅ ${stack.displayName} (no changes)`
924
960
  : ` ✅ ${stack.displayName}`;
925
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I5900.msg(chalk.green('\n' + message), deployResult));
961
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I5900.msg(chalk_1.default.green('\n' + message), deployResult));
926
962
  deployDuration = await deploySpan.timing(private_7.IO.CDK_TOOLKIT_I5000);
927
963
  if (Object.keys(deployResult.outputs).length > 0) {
928
964
  const buffer = ['Outputs:'];
929
965
  stackOutputs[stack.stackName] = deployResult.outputs;
930
966
  for (const name of Object.keys(deployResult.outputs).sort()) {
931
967
  const value = deployResult.outputs[name];
932
- buffer.push(`${chalk.cyan(stack.id)}.${chalk.cyan(name)} = ${chalk.underline(chalk.cyan(value))}`);
968
+ buffer.push(`${chalk_1.default.cyan(stack.id)}.${chalk_1.default.cyan(name)} = ${chalk_1.default.underline(chalk_1.default.cyan(value))}`);
933
969
  }
934
970
  await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I5901.msg(buffer.join('\n')));
935
971
  }
@@ -950,7 +986,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
950
986
  // It has to be exactly this string because an integration test tests for
951
987
  // "bold(stackname) failed: ResourceNotReady: <error>"
952
988
  const code = toolkit_error_1.ToolkitError.isToolkitError(e) ? e.name : 'DeployStackFailed';
953
- const newMessage = [`❌ ${chalk.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' ');
989
+ const newMessage = [`❌ ${chalk_1.default.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' ');
954
990
  throw new toolkit_error_1.ToolkitError(code, newMessage);
955
991
  }
956
992
  finally {
@@ -1175,7 +1211,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1175
1211
  }
1176
1212
  let anyRollbackable = false;
1177
1213
  for (const [index, stack] of stacks.stackArtifacts.entries()) {
1178
- const rollbackSpan = await ioHelper.span(private_7.SPAN.ROLLBACK_STACK).begin(`Rolling back ${chalk.bold(stack.displayName)}`, {
1214
+ const rollbackSpan = await ioHelper.span(private_7.SPAN.ROLLBACK_STACK).begin(`Rolling back ${chalk_1.default.bold(stack.displayName)}`, {
1179
1215
  total: stacks.stackCount,
1180
1216
  current: index + 1,
1181
1217
  stack,
@@ -1205,7 +1241,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1205
1241
  });
1206
1242
  }
1207
1243
  catch (e) {
1208
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E6900.msg(`\n ❌ ${chalk.bold(stack.displayName)} failed: ${(0, util_1.formatErrorMessage)(e)}`, { error: e }));
1244
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E6900.msg(`\n ❌ ${chalk_1.default.bold(stack.displayName)} failed: ${(0, util_1.formatErrorMessage)(e)}`, { error: e }));
1209
1245
  throw toolkit_error_1.ToolkitError.withCause('RollbackFailed', 'Rollback failed (use --force to orphan failing resources)', e);
1210
1246
  }
1211
1247
  }
@@ -1251,7 +1287,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1251
1287
  motivation: 'User confirmation is needed before orphaning resources',
1252
1288
  }));
1253
1289
  if (!confirmed) {
1254
- throw new toolkit_error_1.ToolkitError('OrphanAborted', 'Aborted by user');
1290
+ throw new toolkit_error_1.AbortError('OrphanAborted', 'Orphaning cancelled');
1255
1291
  }
1256
1292
  const result = await plan.execute();
1257
1293
  // Output next steps
@@ -1319,7 +1355,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1319
1355
  let message = `The following stack${newStacks.length === 1 ? ' is' : 's are'} new: ${newStacks.map(s => s.stackName).join(', ')}\n`;
1320
1356
  message += 'Creation of new stacks is not yet supported by the refactor command. ';
1321
1357
  message += 'Please deploy any new stacks separately before refactoring your stacks.';
1322
- await ioHelper.defaults.error(chalk.red(message));
1358
+ await ioHelper.defaults.error(chalk_1.default.red(message));
1323
1359
  continue;
1324
1360
  }
1325
1361
  try {
@@ -1353,7 +1389,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1353
1389
  }
1354
1390
  // In interactive mode (TTY) we need confirmation before proceeding
1355
1391
  if (process.stdout.isTTY && !await confirm(options.force ?? false)) {
1356
- await ioHelper.defaults.info(chalk.red(`Refactoring canceled for environment aws://${environment.account}/${environment.region}\n`));
1392
+ await ioHelper.defaults.info(chalk_1.default.red(`Refactoring canceled for environment aws://${environment.account}/${environment.region}\n`));
1357
1393
  continue;
1358
1394
  }
1359
1395
  await ioHelper.defaults.info('Refactoring...');
@@ -1430,11 +1466,21 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1430
1466
  * Destroys the selected Stacks.
1431
1467
  */
1432
1468
  async destroy(cx, options = {}) {
1469
+ return this._destroyWithAction(cx, 'destroy', options);
1470
+ }
1471
+ /**
1472
+ * Synthesize and destroy, labelling the work with an explicit action.
1473
+ *
1474
+ * Kept private: the CLI reaches it (via a `// @ts-ignore`) to keep the
1475
+ * "deployed" wording when a destroy runs as part of a deploy (rollback
1476
+ * cleanup). Not part of the public API.
1477
+ */
1478
+ async _destroyWithAction(cx, action, options = {}) {
1433
1479
  const env_13 = { stack: [], error: void 0, hasError: false };
1434
1480
  try {
1435
- const ioHelper = (0, private_7.asIoHelper)(this.ioHost, 'destroy');
1481
+ const ioHelper = (0, private_7.asIoHelper)(this.ioHost, action);
1436
1482
  const assembly = __addDisposableResource(env_13, await synthAndMeasure(ioHelper, cx, stacksOpt(options)), true);
1437
- return await this._destroy(assembly, 'destroy', options);
1483
+ return await this._destroy(assembly, action, options);
1438
1484
  }
1439
1485
  catch (e_13) {
1440
1486
  env_13.error = e_13;
@@ -1457,7 +1503,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1457
1503
  stacks: [],
1458
1504
  };
1459
1505
  const motivation = 'Destroying stacks is an irreversible action';
1460
- const question = `Are you sure you want to delete: ${chalk.red(stacks.hierarchicalIds.join(', '))}`;
1506
+ const question = `Are you sure you want to delete: ${chalk_1.default.red(stacks.hierarchicalIds.join(', '))}`;
1461
1507
  const confirmed = await ioHelper.requestResponse(private_7.IO.CDK_TOOLKIT_I7010.req(question, { motivation }));
1462
1508
  if (!confirmed) {
1463
1509
  await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E7010.msg('Aborted by user'));
@@ -1474,7 +1520,7 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1474
1520
  destroyCount++;
1475
1521
  try {
1476
1522
  const singleDestroySpan = await ioHelper.span(private_7.SPAN.DESTROY_STACK)
1477
- .begin(chalk.green(`${chalk.blue(stack.displayName)}: destroying... [${destroyCount}/${stacks.stackCount}]`), {
1523
+ .begin(chalk_1.default.green(`${chalk_1.default.blue(stack.displayName)}: destroying... [${destroyCount}/${stacks.stackCount}]`), {
1478
1524
  total: stacks.stackCount,
1479
1525
  current: destroyCount,
1480
1526
  stack,
@@ -1494,11 +1540,11 @@ class Toolkit extends source_builder_1.CloudAssemblySourceBuilder {
1494
1540
  stackArn: result.stackArn,
1495
1541
  stackExisted: result.stackArn !== undefined,
1496
1542
  });
1497
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I7900.msg(chalk.green(`\n ✅ ${chalk.blue(stack.displayName)}: ${action}ed`), stack));
1543
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_I7900.msg(chalk_1.default.green(`\n ✅ ${chalk_1.default.blue(stack.displayName)}: ${action}ed`), stack));
1498
1544
  await singleDestroySpan.end();
1499
1545
  }
1500
1546
  catch (e) {
1501
- await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E7900.msg(`\n ❌ ${chalk.blue(stack.displayName)}: ${action} failed ${e}`, { error: e }));
1547
+ await ioHelper.notify(private_7.IO.CDK_TOOLKIT_E7900.msg(`\n ❌ ${chalk_1.default.blue(stack.displayName)}: ${action} failed ${e}`, { error: e }));
1502
1548
  throw e;
1503
1549
  }
1504
1550
  };
@@ -1653,4 +1699,4 @@ async function synthAndMeasure(ioHelper, cx, selectStacks) {
1653
1699
  function zeroTime() {
1654
1700
  return { asMs: 0, asSec: 0 };
1655
1701
  }
1656
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUFxQztBQUNyQyw2Q0FBeUM7QUFDekMsa0NBQWtDO0FBQ2xDLHFEQUFxRDtBQUVyRCwwRUFBOEQ7QUFFOUQsK0JBQStCO0FBQy9CLHFDQUFxQztBQUNyQyxvREFBNkQ7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsbUJBQU0sQ0FBQyxHQUFHLEVBQUUsbUJBQU0sQ0FBQyxPQUFPLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQU0sQ0FBQyxVQUFVLENBQVUsQ0FBQztBQUczRzs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWdCO0lBQ25DLE9BQVEsV0FBaUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUNELCtCQUErQjtBQUMvQix1RUFBaUU7QUFFakUsdUNBQStDO0FBQy9DLG1EQUErQztBQVEvQyxvREFBdUQ7QUFDdkQsOENBQXVFO0FBQ3ZFLHVEQVNtQztBQUluQyxxREFBb0U7QUFVcEUsNkVBQXdFO0FBQ3hFLHNEQUFrRTtBQUNsRSxnQ0FBMkM7QUFDM0MsOENBS3lCO0FBQ3pCLHlFQUFzRTtBQUN0RSxxREFBdUU7QUFDdkUsZ0RBQWdEO0FBRWhELDBEQUFvRjtBQUVwRiwyREFBMkQ7QUFDM0QsaUZBQWtGO0FBQ2xGLHlFQUFrRjtBQUVsRixvREFBaUQ7QUFDakQsd0RBQXVFO0FBQ3ZFLGlGQUFrRjtBQUNsRix1RUFBaUY7QUFDakYsc0NBQTRDO0FBQzVDLHdDQUFnRDtBQUNoRCxrRUFBOEQ7QUFHOUQsK0NBQTZHO0FBQzdHLHNEQUF5RjtBQUN6RixxREFBMEQ7QUFDMUQsMkRBQStFO0FBQy9FLDBDQUFpRDtBQUNqRCxvREFLNEI7QUFFNUIsc0VBQXNGO0FBQ3RGLHdEQUFnRTtBQUNoRSw0RUFBZ0Y7QUFDaEYsNERBQTBEO0FBQzFELDZGQUErRjtBQUMvRixpREFBbUQ7QUFDbkQsc0RBQWlFO0FBQ2pFLDZFQUFnRjtBQUVoRixrREFBdUY7QUFFdkYsMENBQW1EO0FBQ25ELGtDQUFtSDtBQUNuSCxxREFBNkM7QUFDN0MsdURBQTJEO0FBQzNELCtDQUF3RDtBQUN4RCxtRUFBMkg7QUFxRTNIOztHQUVHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsMkNBQTBCO0lBMkJqQjtJQTFCcEM7O09BRUc7SUFDYSxnQkFBZ0IsQ0FBUztJQUV6Qzs7T0FFRztJQUNhLE1BQU0sQ0FBVTtJQUVoQzs7T0FFRztJQUNhLFVBQVUsQ0FBYTtJQUV2Qzs7T0FFRztJQUNLLGdCQUFnQixDQUFlO0lBRS9CLGVBQWUsQ0FBMkI7SUFFakMsZ0JBQWdCLENBQXlCO0lBRXpDLGlCQUFpQixDQUFrQjtJQUVwRCxZQUFvQyxRQUF3QixFQUFFO1FBQzVELEtBQUssRUFBRSxDQUFDO1FBRDBCLFVBQUssR0FBTCxLQUFLLENBQXFCO1FBRTVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUkseUNBQTBCLENBQUM7UUFDN0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUM7UUFFNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksbUJBQVUsRUFBRSxDQUFDO1FBRXZELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSw4Q0FBb0IsRUFBRSxDQUFDO1FBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsSUFBQSx1QkFBYSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxHQUFHLElBQUEsc0JBQVksRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QseUdBQXlHO1FBQ3pHLHFGQUFxRjtRQUNyRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLGVBQWUsSUFBSSwwQkFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBcUI7UUFDL0MsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxNQUFNLFlBQVksR0FBd0I7Z0JBQ3hDLGNBQWMsRUFBRSxJQUFBLHFDQUFpQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7YUFDNUUsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFXLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZGLFFBQVE7Z0JBQ1IsTUFBTSxFQUFFLElBQUkseUJBQWUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsY0FBYyxFQUFFLFlBQVksQ0FBQyxjQUFjO2FBQzVDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ2dCLEtBQUssQ0FBQyxxQkFBcUI7UUFDNUMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDN0MsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDL0MsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQW1DLEVBQUUsVUFBNEIsRUFBRTtRQUN4RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxPQUFPLEdBQWlDLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSwyQkFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSx3QkFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpCLHdFQUF3RTtRQUN4RSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBOEIsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMzRyxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUM3RCxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzFELEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxNQUFNO2dCQUNuQyxPQUFPLEVBQUUsVUFBVSxHQUFHLENBQUM7Z0JBQ3ZCLFdBQVc7YUFDWixDQUFDLENBQUM7WUFFTCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxZQUFZLENBQUMsb0JBQW9CLENBQzdELFdBQVcsRUFDWCxXQUFXLEVBQ1g7b0JBQ0UsR0FBRyxPQUFPO29CQUNWLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQ3ZDLE1BQU07b0JBQ04sVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO29CQUNsQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsc0JBQXNCO2lCQUMxRCxDQUNGLENBQUM7Z0JBRUYsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUk7b0JBQ2xDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLGVBQWU7b0JBQ3hDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFOUIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlGLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLE1BQU0sR0FBK0I7b0JBQ3pDLFdBQVc7b0JBQ1gsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2lCQUN2QixDQUFDO2dCQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBQSx5QkFBa0IsRUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEksTUFBTSxDQUFDLENBQUM7WUFDVixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsT0FBTztZQUNMLFlBQVksRUFBRSxPQUFPO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUF3QixFQUFFLFVBQXdCLEVBQUU7OztZQUNyRSxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVsRCxNQUFZLFFBQVEsa0NBQUcsSUFBSSxtQ0FBa0IsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQUEsQ0FBQztZQUN2RyxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RHLE1BQU0sSUFBQSw2Q0FBeUIsRUFBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4SCxnREFBZ0Q7WUFDaEQsTUFBTSxPQUFPLEdBQUcsK0JBQStCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRyxNQUFNLFlBQVksR0FBaUI7Z0JBQ2pDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDNUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM5QixRQUFRLEVBQUUsTUFBTSxDQUFDLGVBQWU7YUFDakMsQ0FBQztZQUVGLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVcsQ0FBQztnQkFDdEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDckMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHNCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDdEQsR0FBRyxZQUFZO29CQUNmLEtBQUssRUFBRTt3QkFDTCxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7d0JBQy9CLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYzt3QkFDekMsUUFBUTt3QkFDUixlQUFlLEVBQUUsSUFBQSx5QkFBa0IsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7d0JBQzNELGVBQWUsRUFBRSxJQUFBLHlCQUFrQixFQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQztxQkFDN0Q7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sc0ZBQXNGO2dCQUN0RixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM3SixDQUFDO1lBRUQsT0FBTyxJQUFJLG9DQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztLQUNqRDtJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUF3QixFQUFFLFVBQXVCLEVBQUU7OztZQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsTUFBWSxRQUFRLGtDQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLE9BQUEsQ0FBQztZQUV6RSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN0RixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1RCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNoQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztZQUUvQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFFdEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFBLHFCQUFXLEVBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6SCxNQUFNLGFBQWEsR0FBcUMsRUFBRSxDQUFDO1lBQzNELEtBQUssTUFBTSxZQUFZLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksb0JBQWEsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFFdEUsZ0JBQWdCO2dCQUNoQixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsb0JBQW9CLEtBQUssK0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BJLHdDQUF3QztnQkFDeEMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLElBQUksK0JBQW9CLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3pFLE1BQU0sY0FBYyxHQUFHLDhLQUE4SyxDQUFDO29CQUN0TSxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM3QyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFFRCxhQUFhO2dCQUNiLEtBQUssSUFBSSxTQUFTLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3hDLGFBQWEsSUFBSSxZQUFZLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELElBQUEsc0JBQVksRUFBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO29CQUN0RSxLQUFLLEVBQUUsWUFBWSxDQUFDLFdBQVc7b0JBQy9CLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztvQkFDdEIsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLG9CQUFvQjtvQkFDcEQsNEJBQTRCLEVBQUUsWUFBWSxDQUFDLG9CQUFvQjtvQkFDL0QsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLG9CQUFvQjtvQkFDcEQsYUFBYSxFQUFFO3dCQUNiLElBQUksRUFBRSxTQUFTLENBQUMsYUFBYTt3QkFDN0IsUUFBUSxFQUFFLHFCQUFxQjtxQkFDaEM7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxLQUFLLEVBQUUsRUFBRTtnQkFDbEUsb0JBQW9CLEVBQUUsS0FBSztnQkFDM0IsNEJBQTRCLEVBQUUsYUFBYTtnQkFDM0MsS0FBSyxFQUFFLGFBQWE7YUFDckIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxhQUFhLENBQUM7Ozs7Ozs7Ozs7O0tBQ3RCO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQXdCLEVBQUUsVUFBd0IsRUFBRTs7O1lBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFZLFFBQVEsa0NBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBQSxDQUFDO1lBRXpFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUzRCxNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sZUFBZSxHQUFvQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7WUFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXBELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGFBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEcsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFBLHdCQUFnQixFQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFdEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7b0JBQ3ZELGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLDhCQUE4QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN4RyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxVQUFVLEdBQUc7b0JBQ2pCLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxxQkFBcUI7b0JBQ3hELHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxxQkFBcUI7b0JBQ3hELGNBQWMsRUFBRTt3QkFDZCxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7d0JBQ2hDLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUzt3QkFDaEMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUM5QixPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87cUJBQzdCO2lCQUNGLENBQUM7Z0JBQ0YsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBRWxELFNBQVM7Z0JBQ1QsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRXZELG1EQUFtRDtnQkFDbkQsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDO2dCQUNELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxQixNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBQ0QsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2dCQUVELG9CQUFvQjtnQkFDcEIsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDbkUsS0FBSztvQkFDTCxLQUFLLEVBQUUsVUFBVTtpQkFDbEIsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsZ0JBQWdCO1lBQ2hCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9ILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xJLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxjQUFjLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwSSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxpQkFBaUIsQ0FBQyxNQUFNLHdDQUF3QyxDQUFDLENBQUM7WUFDckksQ0FBQztZQUVELE9BQU8sZUFBZSxDQUFDOzs7Ozs7Ozs7OztLQUN4QjtJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQXdCLEVBQUUsVUFBZ0MsRUFBRTs7O1lBQ3JGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDM0QsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLE1BQVksUUFBUSxrQ0FBRyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFBLENBQUM7WUFFekUsTUFBTSxlQUFlLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBQSw2Q0FBeUIsRUFBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUU3RixJQUFJLGVBQWUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDdEUsT0FBTztvQkFDTCxlQUFlLEVBQUUsRUFBRTtpQkFDcEIsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXRFLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDOUMsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDN0QsS0FBSztnQkFDTCxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFGLENBQUMsQ0FBQztZQUVILE1BQU0sU0FBUyxHQUFHLElBQUksNkJBQWdCLENBQ3BDLFFBQVEsRUFDUixJQUFJLENBQ0wsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUEsNENBQWtDLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2lCQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBRXBFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEcsT0FBTztvQkFDTCxlQUFlLEVBQUUsRUFBRTtpQkFDcEIsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRWpGLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sZ0JBQWdCLEdBQWdCO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQztnQkFDVixhQUFhLEVBQUUsV0FBVztnQkFDMUIsZUFBZSxFQUFFLFdBQVc7Z0JBQzVCLFFBQVEsRUFBRSxDQUFDO2FBQ1osQ0FBQztZQUVGLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDM0MscURBQXFEO2dCQUNyRCxXQUFXLEVBQUUsc0JBQVMsQ0FBQyxJQUFJO2dCQUMzQixVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDO2dCQUMzRSxZQUFZLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzlGLE1BQU0sRUFBRSxzQkFBUyxDQUFDLElBQUk7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRWpILE9BQU87Z0JBQ0wsZUFBZSxFQUFFLE1BQU07YUFDeEIsQ0FBQzs7Ozs7Ozs7Ozs7S0FDSDtJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQXdCLEVBQUUsVUFBdUIsRUFBRTs7O1lBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFZLFFBQVEsa0NBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBQSxDQUFDO1lBRXpFLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwRSxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqRCxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsT0FBTyxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0tBQ2Y7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBd0IsRUFBRSxVQUEyQixFQUFFOzs7WUFDM0UsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXhDLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFZLFFBQVEsa0NBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBQSxDQUFDO1lBQ3pFLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwRSxNQUFNLElBQUksR0FBRyxJQUFJLHVCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLElBQUkseUNBQTBCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFekksb0NBQW9DO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQU0sRUFBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRWhELHdFQUF3RTtZQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDOUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWxFLE1BQU0sU0FBUyxHQUFHLElBQUksOENBQTRCLENBQUM7b0JBQ2pELEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztvQkFDakIsWUFBWSxFQUFFLFFBQVEsQ0FBQyxTQUFTO29CQUNoQyxZQUFZLEVBQUUsSUFBSSxnREFBeUIsQ0FBQyxLQUFLLENBQUM7b0JBQ2xELFFBQVE7b0JBQ1IsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLGNBQWM7b0JBQ2pELGdDQUFnQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztpQkFDdEUsQ0FBQyxDQUFDO2dCQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFckUsTUFBTSxHQUFHLEdBQW1CO29CQUMxQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztvQkFDcEMsTUFBTSxFQUFFLFNBQVM7aUJBQ2xCLENBQUM7Z0JBRUYsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDdkIsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLEdBQUcsSUFBQSwrQ0FBd0IsRUFBQyxHQUFHLENBQUM7aUJBQ2pDLENBQUMsQ0FBQztnQkFFSCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVMLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7S0FDbkI7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBd0IsRUFBRSxVQUEyQixFQUFFOzs7WUFDM0UsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXhDLE1BQVksUUFBUSxrQ0FBRyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFBLENBQUM7WUFFekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTNELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSxpREFBNkIsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdEUsNkVBQTZFO1lBQzdFLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRWhFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFbkcsTUFBTSxNQUFNLEdBQW1CO2dCQUM3QixVQUFVLEVBQUUsSUFBQSxzQ0FBa0IsRUFBQyxPQUFPLENBQUM7Z0JBQ3ZDLEtBQUssRUFBRSxTQUFTO2dCQUNoQixhQUFhLEVBQUUsT0FBTzthQUN2QixDQUFDO1lBRUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLCtDQUF5QixFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7S0FDZjtJQUVPLEtBQUssQ0FBQyxjQUFjLENBQzFCLFFBQWtCLEVBQ2xCLE1BQXVCLEVBQ3ZCLFdBQXdCO1FBRXhCLE1BQU0sVUFBVSxHQUFtQyxFQUFFLENBQUM7UUFFdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxtQ0FBeUIsRUFBQyxRQUFRLEVBQUU7b0JBQ3ZELFdBQVc7b0JBQ1gsS0FBSztvQkFDTCxVQUFVLEVBQUUsRUFBRTtvQkFDZCxJQUFJLEVBQUUsSUFBQSx3QkFBVSxHQUFFO29CQUNsQixXQUFXLEVBQUUsS0FBSztvQkFDbEIsV0FBVyxFQUFFLElBQUk7aUJBQ2xCLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4QyxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUM7NEJBQ2QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksMEJBQTBCOzRCQUN6RCxXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxDQUFDOzRCQUM5RSxRQUFRLEVBQUUsT0FBTzs0QkFDakIsbUJBQW1CLEVBQUUsQ0FBQztvQ0FDcEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztvQ0FDaEosc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0NBQzFDLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLGdCQUFnQjt3Q0FDaEQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO3FDQUM3QixDQUFDLENBQUMsQ0FBQyxTQUFTO29DQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7aUNBQ3ZILENBQUM7eUJBQ0gsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyx1REFBdUQsS0FBSyxDQUFDLGNBQWMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPO1lBQ0wsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixVQUFVLEVBQUUsU0FBUztZQUNyQixVQUFVO1NBQ1gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUF3QixFQUFFLFVBQXlCLEVBQUU7OztZQUN2RSxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRCxNQUFZLFFBQVEsa0NBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBQSxDQUFDO1lBRS9FLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7S0FDaEY7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBdUIsRUFBRSxNQUEwQixFQUFFLGFBQTBCLEVBQUUsVUFBZ0MsRUFBRTtRQUN2SSxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsTUFBTSxlQUFlLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sSUFBQSw2Q0FBeUIsRUFBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RixNQUFNLEdBQUcsR0FBaUI7WUFDeEIsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBRUYsSUFBSSxlQUFlLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsSUFBQSxzQ0FBNEIsRUFBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLElBQUksa0NBQWdCLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNqRSxNQUFNLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsMkJBQWlCLEVBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV2RSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkQsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7Z0JBQzdDLDRGQUE0RjtnQkFDNUYsMEZBQTBGO2FBQzNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBMkIsRUFBRSxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFFeEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN6QyxJQUFJLElBQUEsc0NBQTRCLEVBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDM0Qsc0NBQXNDO2dCQUN0QyxPQUFPO29CQUNMLFVBQVUsRUFBRSxzQkFBUyxDQUFDLElBQUk7b0JBQzFCLFlBQVksRUFBRSxzQkFBUyxDQUFDLElBQUk7aUJBQzdCLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTztnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDakYsWUFBWSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixDQUFDO2FBQ3BILENBQUM7UUFDSixDQUFDLENBQUMsRUFBRSxDQUFDO1FBRUwsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLFNBQW9CLEVBQUUsRUFBRTtZQUNqRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzlCLElBQUksZUFBZSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksNEJBQVksQ0FDcEIseUJBQXlCLEVBQ3pCLFNBQVMsS0FBSyxDQUFDLFdBQVcsaUlBQWlJLENBQzVKLENBQUM7WUFDSixDQUFDO1lBRUQsdUNBQXVDO1lBQ3ZDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pFLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QixpREFBaUQ7Z0JBQ2pELE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO2dCQUNySSxDQUFDO2dCQUVELHVDQUF1QztnQkFDdkMsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsb0RBQW9ELENBQUMsQ0FBQyxDQUFDO2dCQUN0SSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRTtvQkFDdEMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSx1Q0FBc0IsQ0FBQyx5QkFBeUIsRUFBRTtvQkFDeEcsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QixDQUFDLENBQUM7Z0JBRUgsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyRSxvR0FBb0c7WUFDcEcsRUFBRTtZQUNGLDRGQUE0RjtZQUM1Rix1RUFBdUU7WUFDdkUsK0VBQStFO1lBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9FLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztnQkFDdkUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVkLEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxJQUFBLDBCQUFtQixFQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzFDLE1BQU0sSUFBSSw0QkFBWSxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixlQUFlLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzFILENBQUM7WUFDSCxDQUFDO1lBRUQsMkVBQTJFO1lBQzNFLE1BQU0sbUJBQW1CLEdBQUc7Z0JBQzFCLEtBQUs7Z0JBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3ZDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDaEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFZLEVBQUMsS0FBSyxDQUFDO2dCQUMvRCxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7Z0JBQ3hDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0UscUJBQXFCLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxzQkFBc0I7Z0JBQ2pFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsZ0JBQWdCO2dCQUNoQixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7Z0JBQ3RDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7YUFDM0MsQ0FBQztZQUVGLHNFQUFzRTtZQUN0RSw0RUFBNEU7WUFDNUUsZ0ZBQWdGO1lBQ2hGLE1BQU0sYUFBYSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2dCQUNuRSxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDO29CQUMvQixHQUFHLG1CQUFtQjtvQkFDdEIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtvQkFDMUMsYUFBYSxFQUFFLElBQUEsd0NBQThCLEVBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2lCQUN4RSxDQUFDO2dCQUNGLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFZCx3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUN6QiwyRkFBMkY7Z0JBQzNGLE1BQU0sYUFBYSxHQUFHLElBQUEsc0NBQTRCLEVBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO29CQUMxRSxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQztvQkFDN0csQ0FBQyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUM7Z0JBRTdCLE1BQU0sU0FBUyxHQUFHLElBQUksb0JBQWEsQ0FBQztvQkFDbEMsWUFBWSxFQUFFO3dCQUNaLFdBQVcsRUFBRSxlQUFlO3dCQUM1QixXQUFXLEVBQUUsS0FBSzt3QkFDbEIsU0FBUyxFQUFFLGFBQWE7cUJBQ3pCO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUU5QyxnRUFBZ0U7Z0JBQ2hFLGdDQUFnQztnQkFDaEMsc0VBQXNFO2dCQUN0RSxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxvQkFBb0IsS0FBSywrQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzNGLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCO29CQUN6QyxDQUFDLENBQUMsZ0ZBQWdGO29CQUNsRixDQUFDLENBQUMsNkRBQTZELENBQUM7Z0JBQ2xFLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2dCQUM3RixNQUFNLGNBQWMsR0FBRyxHQUFHLFVBQVUsT0FBTyxnQkFBZ0IsdUNBQXVDLENBQUM7Z0JBQ25HLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRTtvQkFDOUYsVUFBVSxFQUFFLGdCQUFnQjtvQkFDNUIsV0FBVztvQkFDWCxvQkFBb0IsRUFBRSxZQUFZLENBQUMsb0JBQW9CO29CQUN2RCxhQUFhLEVBQUUsU0FBUyxDQUFDLEtBQUs7aUJBQy9CLENBQUMsQ0FBQyxDQUFDO2dCQUNKLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO3dCQUM1QyxNQUFNLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbkYsQ0FBQztvQkFDRCxNQUFNLElBQUksNEJBQVksQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLFlBQVksQ0FBQztpQkFDdEQsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLG1CQUFtQixVQUFVLElBQUksZUFBZSxDQUFDLFVBQVUsR0FBRyxFQUFFO2dCQUNyRyxLQUFLLEVBQUUsZUFBZSxDQUFDLFVBQVU7Z0JBQ2pDLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixLQUFLO2FBQ04sQ0FBQyxDQUFDO1lBQ0wsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFbEQsSUFBSSxjQUFjLENBQUM7WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sY0FBYyxHQUFHLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksSUFBQSwyQ0FBaUMsRUFBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUM1SCxJQUFJLFlBQVksR0FBNEMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFFdkcsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDaEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3JCLElBQUksRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3BCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLG9CQUFvQixFQUFFLG1LQUFtSyxDQUFDLENBQUM7b0JBQ3BOLENBQUM7b0JBRUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDO3dCQUN0QyxHQUFHLG1CQUFtQjt3QkFDdEIsMkRBQTJEO3dCQUMzRCxrRkFBa0Y7d0JBQ2xGLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDLElBQUksSUFBQSx3Q0FBOEIsRUFBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7NEJBQzNGLENBQUMsQ0FBQyxJQUFBLHNDQUE0QixFQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs0QkFDeEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7d0JBQzVCLFFBQVE7cUJBQ1QsQ0FBQyxDQUFDO29CQUVILFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNmLEtBQUssa0JBQWtCOzRCQUNyQixZQUFZLEdBQUcsQ0FBQyxDQUFDOzRCQUNqQixNQUFNO3dCQUVSLEtBQUssZ0NBQWdDLENBQUMsQ0FBQyxDQUFDOzRCQUN0QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLGFBQWE7Z0NBQzNDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLE1BQU0sbUZBQW1GO2dDQUNqSSxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxNQUFNLDZEQUE2RCxDQUFDOzRCQUM5RyxNQUFNLFFBQVEsR0FBRyxHQUFHLFVBQVUsZ0NBQWdDLENBQUM7NEJBRS9ELE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQ0FDbEYsVUFBVTtnQ0FDVixXQUFXOzZCQUNaLENBQUMsQ0FBQyxDQUFDOzRCQUNKLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQ0FDZixNQUFNLElBQUksNEJBQVksQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDOzRCQUMvRCxDQUFDOzRCQUVELHFCQUFxQjs0QkFDckIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0NBQ3JDLE1BQU0sRUFBRTtvQ0FDTixRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO29DQUNoQyxRQUFRLEVBQUUsdUNBQXNCLENBQUMseUJBQXlCO2lDQUMzRDtnQ0FDRCxxQkFBcUIsRUFBRSxPQUFPLENBQUMsbUNBQW1DOzZCQUNuRSxDQUFDLENBQUM7NEJBRUgsd0VBQXdFOzRCQUN4RSxRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNoQixNQUFNO3dCQUNSLENBQUM7d0JBRUQsS0FBSywrQkFBK0IsQ0FBQyxDQUFDLENBQUM7NEJBQ3JDLE1BQU0sVUFBVSxHQUFHLDZFQUE2RSxDQUFDOzRCQUNqRyxNQUFNLFFBQVEsR0FBRyxHQUFHLFVBQVUsZ0NBQWdDLENBQUM7NEJBRS9ELE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtnQ0FDbEYsVUFBVTtnQ0FDVixXQUFXOzZCQUNaLENBQUMsQ0FBQyxDQUFDOzRCQUNKLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQ0FDZixNQUFNLElBQUksNEJBQVksQ0FBQyw0QkFBNEIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDOzRCQUMxRSxDQUFDOzRCQUVELHdFQUF3RTs0QkFDeEUsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDaEIsTUFBTTt3QkFDUixDQUFDO3dCQUVEOzRCQUNFLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHdCQUF3QixFQUFFLDRDQUE0QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxzR0FBc0csQ0FBQyxDQUFDO29CQUMxTixDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUk7b0JBQy9CLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxXQUFXLGVBQWU7b0JBQ3pDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFL0IsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDM0YsY0FBYyxHQUFHLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFFL0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2pELE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzVCLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztvQkFFckQsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUM1RCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3JHLENBQUM7b0JBQ0QsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV4RixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDZCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLFdBQVcsRUFBRTt3QkFDWCxPQUFPLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPO3dCQUNsQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNO3FCQUNqQztvQkFDRCxRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVE7b0JBQy9CLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTztvQkFDN0IsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO29CQUNwQyxjQUFjLEVBQUUsWUFBWSxDQUFDLGNBQWM7aUJBQzVDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQix5RUFBeUU7Z0JBQ3pFLHNEQUFzRDtnQkFDdEQsTUFBTSxJQUFJLEdBQUcsNEJBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2dCQUMzRSxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6SCxNQUFNLElBQUksNEJBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0MsQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN0Qix1RkFBdUY7b0JBQ3ZGLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixJQUFJLElBQUksd0NBQXlCLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUN6RyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBQSxzQ0FBdUIsRUFBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUM5RyxvQkFBb0IsQ0FBQyxZQUFZLENBQy9CLG9CQUFvQixDQUFDLEdBQUcsRUFDeEIsb0JBQW9CLENBQUMsR0FBRyxFQUN4QixvQkFBb0IsQ0FBQyxhQUFhLENBQ25DLENBQUM7b0JBQ0YsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsdUNBQXVDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0gsQ0FBQztnQkFFRCxrR0FBa0c7Z0JBQ2xHLHdGQUF3RjtnQkFDeEYsaUdBQWlHO2dCQUNqRyxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixFQUFFLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMvQixNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRTt3QkFDNUMsTUFBTSxFQUFFLENBQUM7d0JBQ1QsUUFBUSxFQUFFLE1BQU07cUJBQ2pCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sVUFBVSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBQSxpQkFBVSxFQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksdUJBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNsRixNQUFNLGNBQWMsR0FBRyxjQUFjLEtBQUssdUJBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUMzRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUU3QyxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzdELEtBQUs7WUFDTCxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFGLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUksNkJBQWdCLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBRXJHLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFBLDRDQUFrQyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQWdCO1lBQ3BDLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLHdFQUF3RTtZQUNwSyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLHlEQUF5RDtZQUN0SCxRQUFRLEVBQUUsQ0FBQztTQUNaLENBQUM7UUFFRixNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7WUFDM0MsV0FBVztZQUNYLFVBQVU7WUFDVixZQUFZO1lBQ1osNEdBQTRHO1lBQzVHLE1BQU0sRUFBRSxzQkFBUyxDQUFDLElBQUk7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBd0IsRUFBRSxVQUF3QixFQUFFOzs7WUFDckUsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbEQsTUFBWSxRQUFRLGtDQUFHLE1BQU0sSUFBQSw0QkFBa0IsRUFBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFBLENBQUM7WUFDckUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFbEQsOENBQThDO1lBQzlDLDZFQUE2RTtZQUM3RSxnRkFBZ0Y7WUFDaEYsMERBQTBEO1lBQzFELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDO1lBRUQseUZBQXlGO1lBQ3pGLDREQUE0RDtZQUM1RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxnQ0FBc0IsQ0FBQyxDQUFDO1lBQ3JFLDBEQUEwRDtZQUMxRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsSUFBSSxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9HLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCw0Q0FBNEM7WUFDNUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbEMsMkRBQTJEO1lBQzNELGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0IscUhBQXFIO1lBQ3JILGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUV6QyxvREFBb0Q7WUFDcEQsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7Z0JBQzdDLHVDQUF1QyxPQUFPLEVBQUU7Z0JBQ2hELG1DQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNsRSxtQ0FBbUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTthQUNuRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDWixRQUFRLEVBQUUsT0FBTztnQkFDakIsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRSxhQUFhO2FBQ3hCLENBQUMsQ0FBQyxDQUFDO1lBY0osSUFBSSxLQUFLLEdBQWUsV0FBVyxDQUFDO1lBRXBDLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSx3Q0FBeUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6RyxNQUFNLGNBQWMsR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDaEMsS0FBSyxHQUFHLFdBQXlCLENBQUM7Z0JBQ2xDLE1BQU0sb0JBQW9CLEVBQUUsVUFBVSxFQUFFLENBQUM7Z0JBRXpDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFFMUUsZ0VBQWdFO2dCQUNoRSwyREFBMkQ7Z0JBQzNELE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMxQixnRUFBZ0U7b0JBQ2hFLDRFQUE0RTtvQkFDNUUsS0FBSyxHQUFHLFdBQVcsQ0FBQztvQkFDcEIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsc0VBQXNFLENBQUMsQ0FBQyxDQUFDO29CQUN4SCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUM7Z0JBQzVFLENBQUM7Z0JBQ0QsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFDZixNQUFNLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLENBQUMsQ0FBQztZQUVGLHNEQUFzRDtZQUN0RCxnRkFBZ0Y7WUFDaEYsb0ZBQW9GO1lBQ3BGLE1BQU0sWUFBWSxHQUFHLElBQUEsa0NBQW1CLEVBQUM7Z0JBQ3ZDLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsT0FBTzthQUNSLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxHQUFHLFFBQVE7aUJBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLEdBQUcsRUFBRSxPQUFPO2FBQ2IsQ0FBQztpQkFDRCxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN0QixLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUNmLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsNkZBQTZGLENBQUMsQ0FBQztnQkFDN0gsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQztpQkFDRCxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFnQixFQUFFLFFBQWdCLEVBQUUsRUFBRTtnQkFDdEQsb0VBQW9FO2dCQUNwRSxxRUFBcUU7Z0JBQ3JFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sVUFBVSxHQUFHO29CQUNqQixLQUFLO29CQUNMLElBQUksRUFBRSxRQUFRO2lCQUNmLENBQUM7Z0JBQ0YsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHdCQUF3QixLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNqSyxDQUFDO3FCQUFNLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUM1QixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsUUFBUSxZQUFZLEtBQUssNEJBQTRCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDMUksTUFBTSxjQUFjLEVBQUUsQ0FBQztnQkFDekIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHFEQUFxRDtvQkFDckQsS0FBSyxHQUFHLFFBQVEsQ0FBQztvQkFDakIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQzVDLHVCQUF1QixRQUFRLFlBQVksS0FBSyxtR0FBbUcsRUFDbkosVUFBVSxDQUNYLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFTCxNQUFNLGNBQWMsR0FBRyxJQUFBLCtCQUFvQixHQUFRLENBQUM7WUFFcEQsT0FBTztnQkFDTCxLQUFLLENBQUMsT0FBTztvQkFDWCxzQ0FBc0M7b0JBQ3RDLE1BQU0sb0JBQW9CLEVBQUUsVUFBVSxFQUFFLENBQUM7b0JBQ3pDLDJCQUEyQjtvQkFDM0IsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELEtBQUssQ0FBQyxVQUFVO29CQUNkLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO29CQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQzthQUNpQixDQUFDOzs7Ozs7Ozs7OztLQUN0QjtJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQXdCLEVBQUUsVUFBMkIsRUFBRTs7O1lBQzNFLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQVksUUFBUSxtQ0FBRyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFBLENBQUM7WUFFL0UsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7S0FDNUQ7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBdUIsRUFBRSxNQUF1QyxFQUFFLE9BQXdCO1FBQ2hILE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFBLDZDQUF5QixFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBGLE1BQU0sR0FBRyxHQUFtQjtZQUMxQixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUU1QixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO2dCQUNuSCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQ3hCLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxhQUFhLENBQUM7b0JBQ2xELEtBQUs7b0JBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO29CQUN2QyxxQkFBcUIsRUFBRSxPQUFPLENBQUMscUJBQXFCO29CQUNwRCw2QkFBNkIsRUFBRSxPQUFPLENBQUMsNkJBQTZCO29CQUNwRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO2lCQUMzQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUN4QyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixDQUFDO2dCQUNELE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUV6QixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDZCxXQUFXLEVBQUU7d0JBQ1gsT0FBTyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTzt3QkFDbEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTTtxQkFDakM7b0JBQ0QsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMxQixRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7b0JBQzlCLE1BQU0sRUFBRSxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxhQUFhO2lCQUM5RSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFBLHlCQUFrQixFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6SSxNQUFNLDRCQUFZLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLDJEQUEyRCxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHNCQUFzQixFQUFFLHFEQUFxRCxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUF3QixFQUFFLE9BQXNCOzs7WUFDbEUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXRDLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRW5ELHlFQUF5RTtZQUN6RSxNQUFNLE1BQU0sR0FBRyxJQUFBLHdDQUE4QixFQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV0RSwyRkFBMkY7WUFDM0YsTUFBWSxRQUFRLG1DQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsb0JBQVUsQ0FBQyxPQUFBLENBQUM7WUFDdkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLG9CQUFVLENBQUMsQ0FBQztZQUM1RCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksNEJBQVksQ0FDcEIsZUFBZSxFQUNmLHFDQUFxQyxNQUFNLENBQUMsT0FBTyx3QkFBd0IsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzVJLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSwyQkFBZ0IsQ0FBQztnQkFDcEMsV0FBVztnQkFDWCxRQUFRO2dCQUNSLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0I7YUFDcEUsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbkUsZ0JBQWdCO1lBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUI7aUJBQ3pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxZQUFZLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUMxQixVQUFVLElBQUksQ0FBQyxTQUFTLElBQUk7Z0JBQzVCLHdCQUF3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxNQUFNO2dCQUMzRCxhQUFhLENBQ2QsQ0FBQztZQUVGLDJCQUEyQjtZQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FDdkUsd0ZBQXdGLEVBQUU7Z0JBQ3hGLFVBQVUsRUFBRSx3REFBd0Q7YUFDckUsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXBDLG9CQUFvQjtZQUNwQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDaEUsQ0FBQyxDQUFDLCtCQUErQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRztnQkFDMUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzFCLDZCQUE2QixJQUFJLENBQUMsU0FBUyxNQUFNO2dCQUNqRCxlQUFlO2dCQUNmLDBEQUEwRDtnQkFDMUQsa0JBQWtCLFdBQVcsRUFBRSxDQUNoQyxDQUFDOzs7Ozs7Ozs7OztLQUNIO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQXdCLEVBQUUsVUFBMkIsRUFBRTs7O1lBQzNFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV4QyxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFZLFFBQVEsbUNBQUcsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBQSxDQUFDO1lBQy9FLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7Ozs7Ozs7OztLQUM5RDtJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBdUIsRUFBRSxRQUFrQixFQUFFLEVBQXdCLEVBQUUsVUFBMkIsRUFBRTtRQUMxSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsTUFBTSxjQUFjLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVqSCxLQUFLLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBQSw0Q0FBOEIsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBRTFFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekI7Ozs7Ozs7Ozs7Ozs7bUJBYUc7Z0JBRUgsSUFBSSxPQUFPLEdBQUcsc0JBQXNCLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNwSSxPQUFPLElBQUksdUVBQXVFLENBQUM7Z0JBQ25GLE9BQU8sSUFBSSx5RUFBeUUsQ0FBQztnQkFDckYsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksNEJBQWtCLENBQUM7b0JBQ3JDLFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxXQUFXO29CQUNYLGFBQWEsRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDOUIsU0FBUyxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQztpQkFDbEUsQ0FBQyxDQUFDO2dCQUVILE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBRWxDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2pFLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQkFDckQsU0FBUztnQkFDWCxDQUFDO2dCQUVELE1BQU0sYUFBYSxHQUFHLFFBQVE7cUJBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztxQkFDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLGVBQWUsR0FBRyxJQUFBLGlDQUFtQixFQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLGNBQWMsR0FBbUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFFekQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUEsNENBQXdCLEVBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFbkksSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztvQkFDckMsZUFBZSxJQUFJLElBQUksR0FBRyxJQUFBLHFDQUF1QixFQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6RCxjQUFjLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDeEMsQ0FBQztnQkFFRCxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFFakYsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekYsc0JBQXNCO29CQUN0QixTQUFTO2dCQUNYLENBQUM7Z0JBRUQsbUVBQW1FO2dCQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuRSxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsOENBQThDLFdBQVcsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDckksU0FBUztnQkFDWCxDQUFDO2dCQUVELE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUUzRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUU7b0JBQ3BCLE1BQU0sRUFBRSxvQkFBVTtvQkFDbEIsZUFBZSxFQUFFLElBQUk7aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLE9BQU8sR0FBRyx1QkFBdUIsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRXZFLDJGQUEyRjtnQkFDM0YsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFFRCxTQUFTLFlBQVksQ0FBQyxXQUE4QixFQUFFLGNBQXFDLEVBQUUsV0FBa0M7WUFDN0gsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFNBQVM7Z0JBQ3BDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXBGLE9BQU8sWUFBWSxJQUFJLElBQUk7Z0JBQ3pCLENBQUMsQ0FBQyxFQUFFO2dCQUNKLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO3FCQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxnQ0FBZSxDQUNqRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLEVBQzNDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FDOUMsQ0FBQyxDQUFDO1FBQ1QsQ0FBQztRQUVELFNBQVMsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxNQUE2QjtZQUMxRSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUN6QixNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzdILE9BQU8sSUFBSSxpQ0FBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2hELENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLGFBQWEsR0FBRyxNQUFNO3lCQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO3lCQUN2QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDMUIsT0FBTyxJQUFJLGlDQUFnQixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sSUFBSSw0QkFBWSxDQUFDLDBCQUEwQixFQUFFLG9DQUFvQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7UUFFRCxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWM7WUFDbkMsbUZBQW1GO1lBQ25GLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsMENBQTBDLENBQUM7WUFDNUQsT0FBTyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNqRSxVQUFVLEVBQUUsc0JBQXNCO2FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELFNBQVMsV0FBVyxDQUFDLEtBQVU7WUFDN0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7Z0JBQzlCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztvQkFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRyxDQUFDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO29CQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLHdCQUF3QixPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztnQkFDM0csQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxlQUFlLElBQUksU0FBUyxHQUFHLENBQUM7WUFDMUksQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxJQUFBLHlCQUFrQixFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQXdCLEVBQUUsVUFBMEIsRUFBRTs7O1lBQ3pFLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELE1BQVksUUFBUSxtQ0FBRyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFBLENBQUM7WUFDL0UsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7S0FDMUQ7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBdUIsRUFBRSxNQUE0QixFQUFFLE9BQXVCO1FBQ25HLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFM0QsTUFBTSxHQUFHLEdBQWtCO1lBQ3pCLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLDZDQUE2QyxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLG9DQUFvQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRyxNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUVyQixNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNqRSxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWM7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLFNBQW9CLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDOUIsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDO29CQUNILE1BQU0saUJBQWlCLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxhQUFhLENBQUM7eUJBQzlELEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLG9CQUFvQixZQUFZLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUU7d0JBQzVHLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVTt3QkFDeEIsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLEtBQUs7cUJBQ04sQ0FBQyxDQUFDO29CQUNMLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUM7d0JBQzVDLEtBQUs7d0JBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87cUJBQ3pCLENBQUMsQ0FBQztvQkFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDZCxXQUFXLEVBQUU7NEJBQ1gsT0FBTyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTzs0QkFDbEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTTt5QkFDakM7d0JBQ0QsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUMxQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7d0JBQ3pCLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVM7cUJBQzVDLENBQUMsQ0FBQztvQkFFSCxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMzSCxNQUFNLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0gsTUFBTSxDQUFDLENBQUM7Z0JBQ1YsQ0FBQztZQUNILENBQUMsQ0FBQztZQUVGLE1BQU0sU0FBUyxHQUFHLElBQUEsa0NBQXFCLEVBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RSxNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRXpELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFxQjtRQUN0RCxPQUFPLElBQUkseUJBQVcsQ0FBQztZQUNyQixXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMzQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3ZDLFFBQVEsRUFBRSxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FDakMsUUFBdUIsRUFDdkIsT0FBcUIsRUFDckIsb0JBQWdEO1FBRWhELHVDQUF1QztRQUN2QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMzRSxNQUFNLGFBQWEsR0FBeUI7WUFDMUMsR0FBRyxPQUFPO1lBQ1Ysb0JBQW9CO1lBQ3BCLGdCQUFnQjtZQUNoQixjQUFjLEVBQUUscUJBQXFCLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO1NBQzVGLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsNkNBQTZDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQXdCOzs7WUFDekMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQVksUUFBUSxtQ0FBRyxNQUFNLElBQUEsNEJBQWtCLEVBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxPQUFBLENBQUM7WUFDOUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakYsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxvQ0FBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFFOUYsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBeUMsQ0FBQztnQkFDcEUsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFFckMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7cUJBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLElBQUksU0FBUyxDQUFDLENBQUM7Z0JBRTVFLE1BQU0sb0NBQW9DLEdBQUcsZ0NBQWdDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFFekYsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO29CQUNuRSxNQUFNLFFBQVEsR0FBRzt3QkFDZixNQUFNLEVBQUUsVUFBVTt3QkFDbEIsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjt3QkFDM0MsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLElBQUksU0FBUzt3QkFDMUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRTtxQkFDeEMsQ0FBQztvQkFFRixJQUFJLG9DQUFvQyxFQUFFLENBQUM7d0JBQ3pDLE9BQU87NEJBQ0wsR0FBRyxRQUFROzRCQUNYLHVCQUF1QixFQUFFO2dDQUN2QixFQUFFLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxLQUFLOzZCQUNsRDt5QkFDRixDQUFDO29CQUNKLENBQUM7b0JBRUQsT0FBTyxRQUFRLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7S0FDZDtJQUVPLHNCQUFzQixDQUFDLGdCQUFpQztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLDRCQUFZLENBQUMsMkJBQTJCLEVBQUUscUJBQXFCLGdCQUFnQixtRkFBbUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN4TSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQzlCLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLE9BQTJCO1FBRTNCLE9BQU8sS0FBSyxFQUFFLFNBQXlCLEVBQUUsRUFBRTtZQUN6QyxNQUFNLGNBQWMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDakUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE1BQU0sV0FBVyxDQUFDLGdCQUFnQixDQUNoQyxTQUFTLENBQUMscUJBQXFCLEVBQy9CLFNBQVMsQ0FBQyxhQUFhLEVBQ3ZCLFNBQVMsQ0FBQyxLQUFLLEVBQ2Y7Z0JBQ0UsS0FBSyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dCQUM1QixPQUFPO2dCQUNQLFNBQVMsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVM7YUFDM0MsQ0FDRixDQUFDO1lBQ0YsTUFBTSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCLENBQ2hDLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLE9BQTJCLEVBQzNCLFlBQXNCO1FBRXRCLE9BQU8sS0FBSyxFQUFFLFNBQTJCLEVBQUUsRUFBRTtZQUMzQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNyRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFO2dCQUM3RSxLQUFLLEVBQUUsU0FBUyxDQUFDLFdBQVc7Z0JBQzVCLE9BQU87Z0JBQ1AsU0FBUyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDMUMsWUFBWTthQUNiLENBQUMsQ0FBQztZQUNILE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBL2pERCwwQkErakRDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUE2QjtJQUM5QyxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksb0JBQVUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUM1QixRQUFrQixFQUNsQixFQUF3QixFQUN4QixZQUEyQjtJQUUzQixNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSw0QkFBa0IsRUFBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUEsNkNBQW9CLEVBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFOUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsd0NBQXdDO1FBQ3hDLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsUUFBUTtJQUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuLi9wcml2YXRlL2Rpc3Bvc2UtcG9seWZpbGwnO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnUmVwb3J0UHJvcGVydGllcywgUGx1Z2luUmVwb3J0SnNvbiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBBcnRpZmFjdFR5cGUgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZURpZmYgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCB7IHR5cGUgRXZlbnROYW1lLCBFVkVOVFMgfSBmcm9tICdjaG9raWRhci9oYW5kbGVyLmpzJztcblxuLyoqXG4gKiBGaWxlIGV2ZW50cyB0aGF0IHdlIGNhcmUgYWJvdXQgZnJvbSBjaG9raWRhci5cbiAqIEluIGNob2tpZGFyIHY0LCBFdmVudE5hbWUgaW5jbHVkZXMgYWRkaXRpb25hbCBldmVudHMgbGlrZSAnZXJyb3InLCAncmF3JywgJ3JlYWR5JywgJ2FsbCdcbiAqIHRoYXQgd2UgbmVlZCB0byBmaWx0ZXIgb3V0IGluIHRoZSAnYWxsJyBoYW5kbGVyLlxuICovXG5jb25zdCBGSUxFX0VWRU5UUyA9IFtFVkVOVFMuQURELCBFVkVOVFMuQUREX0RJUiwgRVZFTlRTLkNIQU5HRSwgRVZFTlRTLlVOTElOSywgRVZFTlRTLlVOTElOS19ESVJdIGFzIGNvbnN0O1xudHlwZSBGaWxlRXZlbnQgPSB0eXBlb2YgRklMRV9FVkVOVFNbbnVtYmVyXTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGV2ZW50IGlzIGEgZmlsZSBldmVudCB3ZSBzaG91bGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gaXNGaWxlRXZlbnQoZXZlbnQ6IEV2ZW50TmFtZSk6IGV2ZW50IGlzIEZpbGVFdmVudCB7XG4gIHJldHVybiAoRklMRV9FVkVOVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGV2ZW50KTtcbn1cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IE5vbkludGVyYWN0aXZlSW9Ib3N0IH0gZnJvbSAnLi9ub24taW50ZXJhY3RpdmUtaW8taG9zdCc7XG5pbXBvcnQgdHlwZSB7IFRvb2xraXRTZXJ2aWNlcyB9IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc3NlbWJseUZyb21Tb3VyY2UgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi90b29sa2l0LWVycm9yJztcbmltcG9ydCB0eXBlIHsgRGVwbG95UmVzdWx0LCBEZXN0cm95UmVzdWx0LCBGZWF0dXJlRmxhZywgTWluaW11bVNldmVyaXR5LCBSb2xsYmFja1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICBCb290c3RyYXBFbnZpcm9ubWVudHMsXG4gIEJvb3RzdHJhcE9wdGlvbnMsXG4gIEJvb3RzdHJhcFJlc3VsdCxcbiAgRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQsXG59IGZyb20gJy4uL2FjdGlvbnMvYm9vdHN0cmFwJztcbmltcG9ydCB7IEJvb3RzdHJhcFNvdXJjZSB9IGZyb20gJy4uL2FjdGlvbnMvYm9vdHN0cmFwJztcbmltcG9ydCB7IEFzc2V0QnVpbGRUaW1lLCB0eXBlIERlcGxveU9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveSc7XG5pbXBvcnQge1xuICBidWlsZFBhcmFtZXRlck1hcCxcbiAgaXNDaGFuZ2VTZXREZXBsb3ltZW50LFxuICBpc0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50LFxuICBpc0V4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzTm9uRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudCxcbiAgdHlwZSBQcml2YXRlRGVwbG95T3B0aW9ucyxcbiAgcmVtb3ZlUHVibGlzaGVkQXNzZXRzRnJvbVdvcmtHcmFwaCxcbiAgdG9FeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudCxcbn0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3kvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIERlc3Ryb3lPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXN0cm95JztcbmltcG9ydCB0eXBlIHsgRGlhZ25vc2VkU3RhY2ssIERpYWdub3NlT3B0aW9ucywgRGlhZ25vc2VSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL2RpYWdub3NlJztcbmltcG9ydCB0eXBlIHsgRGlmZk9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RpZmYnO1xuaW1wb3J0IHsgYXBwZW5kT2JqZWN0LCBwcmVwYXJlRGlmZiB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRHJpZnRPcHRpb25zLCBEcmlmdFJlc3VsdCB9IGZyb20gJy4uL2FjdGlvbnMvZHJpZnQnO1xuaW1wb3J0IHsgdHlwZSBMaXN0T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvbGlzdCc7XG5pbXBvcnQgdHlwZSB7IE9ycGhhbk9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL29ycGhhbic7XG5pbXBvcnQgdHlwZSB7IFB1Ymxpc2hBc3NldHNPcHRpb25zLCBQdWJsaXNoQXNzZXRzUmVzdWx0IH0gZnJvbSAnLi4vYWN0aW9ucy9wdWJsaXNoLWFzc2V0cyc7XG5pbXBvcnQgdHlwZSB7IFJlZmFjdG9yT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvcmVmYWN0b3InO1xuaW1wb3J0IHsgdHlwZSBSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JvbGxiYWNrJztcbmltcG9ydCB7IHR5cGUgU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9zeW50aCc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRlT3B0aW9ucywgVmFsaWRhdGVSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL3ZhbGlkYXRlJztcbmltcG9ydCB0eXBlIHsgSVdhdGNoZXIsIFdhdGNoT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gnO1xuaW1wb3J0IHsgY291bnRBc3NlbWJseVJlc3VsdHMgfSBmcm9tICcuL3ByaXZhdGUvY291bnQtYXNzZW1ibHktcmVzdWx0cyc7XG5pbXBvcnQgeyBXQVRDSF9FWENMVURFX0RFRkFVTFRTIH0gZnJvbSAnLi4vYWN0aW9ucy93YXRjaC9wcml2YXRlJztcbmltcG9ydCB7IEVudmlyb25tZW50QWNjZXNzIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7XG4gIEJhc2VDcmVkZW50aWFscyxcbiAgdHlwZSBJQmFzZUNyZWRlbnRpYWxzUHJvdmlkZXIsXG4gIHR5cGUgU2RrQmFzZUNsaWVudENvbmZpZyxcbiAgdHlwZSBTZGtDb25maWcsXG59IGZyb20gJy4uL2FwaS9hd3MtYXV0aCc7XG5pbXBvcnQgeyBzZGtSZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9hd3NjbGktY29tcGF0aWJsZSc7XG5pbXBvcnQgeyBJb0hvc3RTZGtMb2dnZXIsIFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHsgQm9vdHN0cmFwcGVyIH0gZnJvbSAnLi4vYXBpL2Jvb3RzdHJhcCc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlLCBTdGFja1NlbGVjdG9yIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IENhY2hlZENsb3VkQXNzZW1ibHksIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBTdGFja0Fzc2VtYmx5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUnO1xuaW1wb3J0IHsgQUxMX1NUQUNLUyB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZUJveCB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlL2Rpc3Bvc2FibGUtYm94JztcbmltcG9ydCB7IENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3NvdXJjZS1idWlsZGVyJztcbmltcG9ydCB0eXBlIHsgU3RhY2tDb2xsZWN0aW9uIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3N0YWNrLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgRGVwbG95bWVudHMgfSBmcm9tICcuLi9hcGkvZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgY3JlYXRlVmFsaWRhdGlvbkNoYW5nZVNldCB9IGZyb20gJy4uL2FwaS9kZXBsb3ltZW50cy9jZm4tYXBpJztcbmltcG9ydCB7IGhvc3RNZXNzYWdlRnJvbURpYWdub3NpcyB9IGZyb20gJy4uL2FwaS9kaWFnbm9zaW5nL2RpYWdub3Npcy1mb3JtYXR0aW5nJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIgfSBmcm9tICcuLi9hcGkvZGlhZ25vc2luZy9zdGFjay1kaWFnbm9zZXInO1xuaW1wb3J0IHsgRGlmZkZvcm1hdHRlciB9IGZyb20gJy4uL2FwaS9kaWZmJztcbmltcG9ydCB7IGRldGVjdFN0YWNrRHJpZnQgfSBmcm9tICcuLi9hcGkvZHJpZnQnO1xuaW1wb3J0IHsgRHJpZnRGb3JtYXR0ZXIgfSBmcm9tICcuLi9hcGkvZHJpZnQvZHJpZnQtZm9ybWF0dGVyJztcbmltcG9ydCB0eXBlIHsgSUlvSG9zdCwgVG9vbGtpdEFjdGlvbiB9IGZyb20gJy4uL2FwaS9pbyc7XG5pbXBvcnQgdHlwZSB7IEVsYXBzZWRUaW1lLCBJb0hlbHBlciB9IGZyb20gJy4uL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IGFzSW9IZWxwZXIsIElPLCBTUEFOLCB3aXRob3V0Q29sb3IsIHdpdGhvdXRFbW9qaXMsIHdpdGhUcmltbWVkV2hpdGVzcGFjZSB9IGZyb20gJy4uL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsIGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzIH0gZnJvbSAnLi4vYXBpL2xvZ3MtbW9uaXRvcic7XG5pbXBvcnQgeyBSZXNvdXJjZU9ycGhhbmVyIH0gZnJvbSAnLi4vYXBpL29ycGhhbi9vcnBoYW5lcic7XG5pbXBvcnQgeyBwYXJzZUFuZFZhbGlkYXRlQ29uc3RydWN0UGF0aHMgfSBmcm9tICcuLi9hcGkvb3JwaGFuL3ByaXZhdGUvaGVscGVycyc7XG5pbXBvcnQgeyBNb2RlLCBQbHVnaW5Ib3N0IH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5pbXBvcnQge1xuICBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyxcbiAgZm9ybWF0RW52aXJvbm1lbnRTZWN0aW9uSGVhZGVyLFxuICBmb3JtYXRUeXBlZE1hcHBpbmdzLFxuICBncm91cFN0YWNrcyxcbn0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZy9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZU1hcHBpbmcsIFJlc291cmNlTG9jYXRpb24gfSBmcm9tICcuLi9hcGkvcmVmYWN0b3JpbmcvY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVmYWN0b3JpbmdDb250ZXh0IH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTdGFja0RlZmluaXRpb25zIH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL3N0YWNrLWRlZmluaXRpb25zJztcbmltcG9ydCB7IFJlc291cmNlTWlncmF0b3IgfSBmcm9tICcuLi9hcGkvcmVzb3VyY2UtaW1wb3J0JztcbmltcG9ydCB7IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIgfSBmcm9tICcuLi9hcGkvc291cmNlLXRyYWNpbmcvcHJpdmF0ZS9zdGFjay1zb3VyY2UtdHJhY2luZyc7XG5pbXBvcnQgeyB0YWdzRm9yU3RhY2sgfSBmcm9tICcuLi9hcGkvdGFncy9wcml2YXRlJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FIH0gZnJvbSAnLi4vYXBpL3Rvb2xraXQtaW5mbyc7XG5pbXBvcnQgeyBob3N0TWVzc2FnZUZyb21WYWxpZGF0aW9uIH0gZnJvbSAnLi4vYXBpL3ZhbGlkYXRlL3ZhbGlkYXRlLWZvcm1hdHRpbmcnO1xuaW1wb3J0IHR5cGUgeyBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSwgQ29uY3VycmVuY3ksIFN0YWNrTm9kZSB9IGZyb20gJy4uL2FwaS93b3JrLWdyYXBoJztcbmltcG9ydCB7IFdvcmtHcmFwaCwgV29ya0dyYXBoQnVpbGRlciwgYnVpbGREZXN0cm95V29ya0dyYXBoIH0gZnJvbSAnLi4vYXBpL3dvcmstZ3JhcGgnO1xuaW1wb3J0IHR5cGUgeyBBc3NlbWJseURhdGEsIFJlZmFjdG9yUmVzdWx0LCBTdGFja0RldGFpbHMsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB9IGZyb20gJy4uL3BheWxvYWRzJztcbmltcG9ydCB7IFBlcm1pc3Npb25DaGFuZ2VUeXBlIH0gZnJvbSAnLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlLCBmb3JtYXRUaW1lLCBvYnNjdXJlVGVtcGxhdGUsIHNlcmlhbGl6ZVN0cnVjdHVyZSwgdmFsaWRhdGVTbnNUb3BpY0FybiB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcExpbWl0IH0gZnJvbSAnLi4vdXRpbC9jb25jdXJyZW5jeSc7XG5pbXBvcnQgeyBjcmVhdGVJZ25vcmVNYXRjaGVyIH0gZnJvbSAnLi4vdXRpbC9nbG9iLW1hdGNoZXInO1xuaW1wb3J0IHsgcHJvbWlzZVdpdGhSZXNvbHZlcnMgfSBmcm9tICcuLi91dGlsL3Byb21pc2VzJztcbmltcG9ydCB7IGNvbWJpbmVDb25jbHVzaW9ucywgb2J0YWluVW5pZmllZFZhbGlkYXRpb25SZXBvcnQsIHRocm93SWZWYWxpZGF0aW9uRmFpbHVyZXMgfSBmcm9tICcuL3ByaXZhdGUvdmFsaWRhdGlvbi1yZXBvcnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xraXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBJb0hvc3QgaW1wbGVtZW50YXRpb24sIGhhbmRsaW5nIHRoZSBpbmxpbmUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIFRvb2xraXQgYW5kIGFuIGludGVncmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW9Ib3N0PzogSUlvSG9zdDtcblxuICAvKipcbiAgICogQWxsb3cgZW1vamlzIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW1vamlzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBBTlNJIGNvbG9ycyBhbmQgZm9ybWF0dGluZyBpbiBJb0hvc3QgbWVzc2FnZXMuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBgZmFsc2VgIGVuZm9yY2VzIHRoYXQgbm8gY29sb3Igb3Igc3R5bGUgc2hvd3MgdXBcbiAgICogaW4gbWVzc2FnZXMgc2VudCB0byB0aGUgSW9Ib3N0LlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBpcyBhIG5vLW9wOyBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERldGVjdHMgY29sb3IgZnJvbSB0aGUgVFRZIHN0YXR1cyBvZiB0aGUgSW9Ib3N0XG4gICAqL1xuICByZWFkb25seSBjb2xvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFNESy5cbiAgICovXG4gIHJlYWRvbmx5IHNka0NvbmZpZz86IFNka0NvbmZpZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjayB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkNES1Rvb2xraXRcIlxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmFpbCBDbG91ZCBBc3NlbWJseSBvcGVyYXRpb25zIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzIGluIHRoZSBhc3NlbWJseSB3aXRoIGF0IGxlYXN0IHRoZSBpbmRpY2F0ZWQgc2V2ZXJpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZXJyb3JcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZW1ibHlGYWlsdXJlQXQ/OiBNaW5pbXVtU2V2ZXJpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaG9zdCB0byB1c2UgZm9yIGxvYWRpbmcgYW5kIHF1ZXJ5aW5nIHBsdWdpbnNcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYSB1bmlxdWUgaW5zdGFuY2Ugb2YgYSBwbHVnaW4gbWFuYWdpbmcgY2xhc3Mgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBVc2UgYHRvb2xraXQucGx1Z2luSG9zdC5sb2FkKClgIHRvIGxvYWQgcGx1Z2lucyBpbnRvIHRoZSBwbHVnaW4gaG9zdCBmcm9tIGRpc2suXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBmcmVzaCBwbHVnaW4gaG9zdFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSG9zdD86IFBsdWdpbkhvc3Q7XG5cbiAgLyoqXG4gICAqIFNldCBvZiB1bnN0YWJsZSBmZWF0dXJlcyB0byBvcHQgaW50by4gSWYgeW91IGFyZSB1c2luZyBhbiB1bnN0YWJsZSBmZWF0dXJlLFxuICAgKiB5b3UgbXVzdCBleHBsaWNpdGx5IGFja25vd2xlZGdlIHRoYXQgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlza3Mgb2YgdXNpbmcgaXQsXG4gICAqIGJ5IHBhc3NpbmcgaXQgaW4gdGhpcyBzZXQuXG4gICAqL1xuICByZWFkb25seSB1bnN0YWJsZUZlYXR1cmVzPzogQXJyYXk8VW5zdGFibGVGZWF0dXJlPjtcbn1cblxuLyoqXG4gKiBOYW1lcyBvZiB0b29sa2l0IGZlYXR1cmVzIHRoYXQgYXJlIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50LCBhbmQgbWF5IGNoYW5nZSBpblxuICogdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgVW5zdGFibGVGZWF0dXJlID0gJ3JlZmFjdG9yJyB8ICdvcnBoYW4nIHwgJ2ZsYWdzJyB8ICdwdWJsaXNoLWFzc2V0cycgfCAnZGlhZ25vc2UnIHwgJ3ZhbGlkYXRlJztcblxuLyoqXG4gKiBUaGUgQVdTIENESyBQcm9ncmFtbWF0aWMgVG9vbGtpdFxuICovXG5leHBvcnQgY2xhc3MgVG9vbGtpdCBleHRlbmRzIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIHtcbiAgLyoqXG4gICAqIFRoZSB0b29sa2l0IHN0YWNrIG5hbWUgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IG9mIHRoaXMgVG9vbGtpdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlvSG9zdDogSUlvSG9zdDtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBob3N0IGZvciBsb2FkaW5nIGFuZCBtYW5hZ2luZyBwbHVnaW5zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSG9zdDogUGx1Z2luSG9zdDtcblxuICAvKipcbiAgICogQ2FjaGUgb2YgdGhlIGludGVybmFsIFNESyBQcm92aWRlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBzZGtQcm92aWRlckNhY2hlPzogU2RrUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSBiYXNlQ3JlZGVudGlhbHM6IElCYXNlQ3JlZGVudGlhbHNQcm92aWRlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVuc3RhYmxlRmVhdHVyZXM6IEFycmF5PFVuc3RhYmxlRmVhdHVyZT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseUZhaWx1cmVBdDogTWluaW11bVNldmVyaXR5O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBUb29sa2l0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRvb2xraXRTdGFja05hbWUgPSBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuICAgIHRoaXMuYXNzZW1ibHlGYWlsdXJlQXQgPSBwcm9wcy5hc3NlbWJseUZhaWx1cmVBdCA/PyAnZXJyb3InO1xuXG4gICAgdGhpcy5wbHVnaW5Ib3N0ID0gcHJvcHMucGx1Z2luSG9zdCA/PyBuZXcgUGx1Z2luSG9zdCgpO1xuXG4gICAgbGV0IGlvSG9zdCA9IHByb3BzLmlvSG9zdCA/PyBuZXcgTm9uSW50ZXJhY3RpdmVJb0hvc3QoKTtcbiAgICBpZiAocHJvcHMuZW1vamlzID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dEVtb2ppcyhpb0hvc3QpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuY29sb3IgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0Q29sb3IoaW9Ib3N0KTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgZW1vamlzIGFuZCBjb2xvciwgd2UgbWlnaHQgZW5kIHVwIHdpdGggZmxvYXRpbmcgd2hpdGVzcGFjZSBhdCBlaXRoZXIgZW5kIG9mIHRoZSBtZXNzYWdlXG4gICAgLy8gVGhpcyBhbHNvIHJlbW92ZXMgbmV3bGluZXMgdGhhdCB3ZSBjdXJyZW50bHkgZW1pdCBmb3IgQ0xJIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHRoaXMuaW9Ib3N0ID0gd2l0aFRyaW1tZWRXaGl0ZXNwYWNlKGlvSG9zdCk7XG5cbiAgICB0aGlzLmJhc2VDcmVkZW50aWFscyA9IHByb3BzLnNka0NvbmZpZz8uYmFzZUNyZWRlbnRpYWxzID8/IEJhc2VDcmVkZW50aWFscy5hd3NDbGlDb21wYXRpYmxlKCk7XG4gICAgdGhpcy51bnN0YWJsZUZlYXR1cmVzID0gcHJvcHMudW5zdGFibGVGZWF0dXJlcyA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gdGhlIEFXUyBTREtcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2RrUHJvdmlkZXIoYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxTZGtQcm92aWRlcj4ge1xuICAgIC8vIEB0b2RvIHRoaXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50IGluc3RhbmNlIHBlciBhY3Rpb25cbiAgICBpZiAoIXRoaXMuc2RrUHJvdmlkZXJDYWNoZSkge1xuICAgICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgICAgY29uc3QgY2xpZW50Q29uZmlnOiBTZGtCYXNlQ2xpZW50Q29uZmlnID0ge1xuICAgICAgICByZXF1ZXN0SGFuZGxlcjogc2RrUmVxdWVzdEhhbmRsZXIodGhpcy5wcm9wcy5zZGtDb25maWc/Lmh0dHBPcHRpb25zPy5hZ2VudCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmJhc2VDcmVkZW50aWFscy5zZGtCYXNlQ29uZmlnKGlvSGVscGVyLCBjbGllbnRDb25maWcpO1xuICAgICAgdGhpcy5zZGtQcm92aWRlckNhY2hlID0gbmV3IFNka1Byb3ZpZGVyKGNvbmZpZy5jcmVkZW50aWFsUHJvdmlkZXIsIGNvbmZpZy5kZWZhdWx0UmVnaW9uLCB7XG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICBsb2dnZXI6IG5ldyBJb0hvc3RTZGtMb2dnZXIoaW9IZWxwZXIpLFxuICAgICAgICBwbHVnaW5Ib3N0OiB0aGlzLnBsdWdpbkhvc3QsXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiBjbGllbnRDb25maWcucmVxdWVzdEhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZGtQcm92aWRlckNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBwcm92aWRlIHRoZSBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB3aXRoIHJlcXVpcmVkIHRvb2xraXQgc2VydmljZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc291cmNlQnVpbGRlclNlcnZpY2VzKCk6IFByb21pc2U8VG9vbGtpdFNlcnZpY2VzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnYXNzZW1ibHknKSxcbiAgICAgIHNka1Byb3ZpZGVyOiBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdhc3NlbWJseScpLFxuICAgICAgcGx1Z2luSG9zdDogdGhpcy5wbHVnaW5Ib3N0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJvb3RzdHJhcChlbnZpcm9ubWVudHM6IEJvb3RzdHJhcEVudmlyb25tZW50cywgb3B0aW9uczogQm9vdHN0cmFwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxCb290c3RyYXBSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEVudmlyb25tZW50Qm9vdHN0cmFwUmVzdWx0W10gPSBbXTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHModGhpcy5pb0hvc3QpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IEJvb3RzdHJhcFNvdXJjZS5kZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBib290c3RyYXBwZXIgPSBuZXcgQm9vdHN0cmFwcGVyKHNvdXJjZSwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG5cbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdCgyMCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICBhd2FpdCBQcm9taXNlLmFsbChib290c3RyYXBFbnZpcm9ubWVudHMubWFwKChlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsIGN1cnJlbnRJZHgpID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uQk9PVFNUUkFQX1NJTkdMRSlcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9OiBib290c3RyYXBwaW5nLi4uYCwge1xuICAgICAgICAgIHRvdGFsOiBib290c3RyYXBFbnZpcm9ubWVudHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnRJZHggKyAxLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwUmVzdWx0ID0gYXdhaXQgYm9vdHN0cmFwcGVyLmJvb3RzdHJhcEVudmlyb25tZW50KFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIHNka1Byb3ZpZGVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGJvb3RzdHJhcFJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtlbnZpcm9ubWVudC5uYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5OTAwLm1zZyhjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCB7IGVudmlyb25tZW50IH0pKTtcbiAgICAgICAgY29uc3QgZW52VGltZSA9IGF3YWl0IGJvb3RzdHJhcFNwYW4uZW5kKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQgPSB7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc3RhdHVzOiBib290c3RyYXBSZXN1bHQubm9PcCA/ICduby1vcCcgOiAnc3VjY2VzcycsXG4gICAgICAgICAgZHVyYXRpb246IGVudlRpbWUuYXNNcyxcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U5OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ib2xkKGVudmlyb25tZW50Lm5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnRzOiByZXN1bHRzLFxuICAgICAgZHVyYXRpb246IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCBBY3Rpb25cbiAgICpcbiAgICogVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgYENhY2hlZENsb3VkQXNzZW1ibHlgIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgZGlzcG9zZSgpYCBvblxuICAgKiBpdCBhZnRlciB1c2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3ludGgoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBTeW50aE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkQ2xvdWRBc3NlbWJseT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3N5bnRoJyk7XG5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IG5ldyBBc3luY0Rpc3Bvc2FibGVCb3goYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKSk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkudmFsdWUuc2VsZWN0U3RhY2tzVjIoc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICBjb25zdCBhdXRvVmFsaWRhdGVTdGFja3MgPSBvcHRpb25zLnZhbGlkYXRlU3RhY2tzID8gW2Fzc2VtYmx5LnZhbHVlLnNlbGVjdFN0YWNrc0ZvclZhbGlkYXRpb24oKV0gOiBbXTtcbiAgICBhd2FpdCB0aHJvd0lmVmFsaWRhdGlvbkZhaWx1cmVzKGFzc2VtYmx5LnZhbHVlLCBzdGFja3MuY29uY2F0KC4uLmF1dG9WYWxpZGF0ZVN0YWNrcyksIHRoaXMuYXNzZW1ibHlGYWlsdXJlQXQsIGlvSGVscGVyKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgc3RhY2ssIHByaW50IGl0IHRvIFNURE9VVFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3VjY2Vzc2Z1bGx5IHN5bnRoZXNpemVkIHRvICR7Y2hhbGsuYmx1ZShwYXRoLnJlc29sdmUoc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSkpfWA7XG4gICAgY29uc3QgYXNzZW1ibHlEYXRhOiBBc3NlbWJseURhdGEgPSB7XG4gICAgICBhc3NlbWJseURpcmVjdG9yeTogc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSxcbiAgICAgIHN0YWNrc0NvdW50OiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgIHN0YWNrSWRzOiBzdGFja3MuaGllcmFyY2hpY2FsSWRzLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0U3RhY2sgPSBzdGFja3MuZmlyc3RTdGFjayE7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZpcnN0U3RhY2sudGVtcGxhdGU7XG4gICAgICBjb25zdCBvYnNjdXJlZFRlbXBsYXRlID0gb2JzY3VyZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMTkwMS5tc2cobWVzc2FnZSwge1xuICAgICAgICAuLi5hc3NlbWJseURhdGEsXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgc3RhY2tOYW1lOiBmaXJzdFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogZmlyc3RTdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBzdHJpbmdpZmllZEpzb246IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICBzdHJpbmdpZmllZFlhbWw6IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCBmYWxzZSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBvdXRwdXR0aW5nIHRlbXBsYXRlIHRvIHN0ZG91dCwgbGV0J3MgZXhwbGFpbiB0aGluZ3MgdG8gdGhlIHVzZXIgYSBsaXR0bGUgYml0Li4uXG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTE5MDIubXNnKGNoYWxrLmdyZWVuKG1lc3NhZ2UpLCBhc3NlbWJseURhdGEpKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFN1cHBseSBhIHN0YWNrIGlkICgke3N0YWNrcy5zdGFja0FydGlmYWN0cy5tYXAoKHMpID0+IGNoYWxrLmdyZWVuKHMuaGllcmFyY2hpY2FsSWQpKS5qb2luKCcsICcpfSkgdG8gZGlzcGxheSBpdHMgdGVtcGxhdGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDYWNoZWRDbG91ZEFzc2VtYmx5KGFzc2VtYmx5LnRha2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlmZiBBY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWZmKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGlmZk9wdGlvbnMgPSB7fSk6IFByb21pc2U8eyBbbmFtZTogc3RyaW5nXTogVGVtcGxhdGVEaWZmIH0+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkaWZmJyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgZGlmZlNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uRElGRl9TVEFDSykuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ2RpZmYnKTtcblxuICAgIGNvbnN0IHN0cmljdCA9ICEhb3B0aW9ucy5zdHJpY3Q7XG4gICAgY29uc3QgY29udGV4dExpbmVzID0gb3B0aW9ucy5jb250ZXh0TGluZXMgfHwgMztcblxuICAgIGxldCBkaWZmcyA9IDA7XG4gICAgbGV0IHNlY3VyaXR5RGlmZnMgPSAwO1xuXG4gICAgY29uc3QgdGVtcGxhdGVJbmZvcyA9IGF3YWl0IHByZXBhcmVEaWZmKGRpZmZTcGFuLmFzSGVscGVyLCBzdGFja3MsIGRlcGxveW1lbnRzLCBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkaWZmJyksIG9wdGlvbnMpO1xuICAgIGNvbnN0IHRlbXBsYXRlRGlmZnM6IHsgW25hbWU6IHN0cmluZ106IFRlbXBsYXRlRGlmZiB9ID0ge307XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZUluZm8gb2YgdGVtcGxhdGVJbmZvcykge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IERpZmZGb3JtYXR0ZXIoeyB0ZW1wbGF0ZUluZm8gfSk7XG4gICAgICBjb25zdCBzdGFja0RpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U3RhY2tEaWZmKHsgc3RyaWN0LCBjb250ZXh0TGluZXMgfSk7XG5cbiAgICAgIC8vIFNlY3VyaXR5IERpZmZcbiAgICAgIGNvbnN0IHNlY3VyaXR5RGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTZWN1cml0eURpZmYoKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFNlY3VyaXR5RGlmZiA9IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSA/IHN0YWNrRGlmZi5mb3JtYXR0ZWREaWZmIDogdW5kZWZpbmVkO1xuICAgICAgLy8gV2Ugb25seSB3YXJuIGFib3V0IEJST0FERU5JTkcgY2hhbmdlc1xuICAgICAgaWYgKHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSA9PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5CUk9BREVOSU5HKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gJ1RoaXMgZGVwbG95bWVudCB3aWxsIG1ha2UgcG90ZW50aWFsbHkgc2Vuc2l0aXZlIGNoYW5nZXMgYWNjb3JkaW5nIHRvIHlvdXIgY3VycmVudCBzZWN1cml0eSBhcHByb3ZhbCBsZXZlbC5cXG5QbGVhc2UgY29uZmlybSB5b3UgaW50ZW5kIHRvIG1ha2UgdGhlIGZvbGxvd2luZyBtb2RpZmljYXRpb25zOlxcbic7XG4gICAgICAgIGF3YWl0IGRpZmZTcGFuLmRlZmF1bHRzLndhcm4od2FybmluZ01lc3NhZ2UpO1xuICAgICAgICBhd2FpdCBkaWZmU3Bhbi5kZWZhdWx0cy5pbmZvKHNlY3VyaXR5RGlmZi5mb3JtYXR0ZWREaWZmKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RhY2sgRGlmZlxuICAgICAgZGlmZnMgKz0gc3RhY2tEaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgc2VjdXJpdHlEaWZmcyArPSBzZWN1cml0eURpZmYubnVtU3RhY2tzV2l0aENoYW5nZXM7XG4gICAgICBhcHBlbmRPYmplY3QodGVtcGxhdGVEaWZmcywgZm9ybWF0dGVyLmRpZmZzKTtcbiAgICAgIGF3YWl0IGRpZmZTcGFuLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNDAwMi5tc2coc3RhY2tEaWZmLmZvcm1hdHRlZERpZmYsIHtcbiAgICAgICAgc3RhY2s6IHRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZSxcbiAgICAgICAgZGlmZnM6IGZvcm1hdHRlci5kaWZmcyxcbiAgICAgICAgbnVtU3RhY2tzV2l0aENoYW5nZXM6IHN0YWNrRGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcyxcbiAgICAgICAgbnVtU3RhY2tzV2l0aFNlY3VyaXR5Q2hhbmdlczogc2VjdXJpdHlEaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzLFxuICAgICAgICBwZXJtaXNzaW9uQ2hhbmdlczogc2VjdXJpdHlEaWZmLnBlcm1pc3Npb25DaGFuZ2VUeXBlLFxuICAgICAgICBmb3JtYXR0ZWREaWZmOiB7XG4gICAgICAgICAgZGlmZjogc3RhY2tEaWZmLmZvcm1hdHRlZERpZmYsXG4gICAgICAgICAgc2VjdXJpdHk6IGZvcm1hdHRlZFNlY3VyaXR5RGlmZixcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkaWZmU3Bhbi5lbmQoYOKcqCBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggZGlmZmVyZW5jZXM6ICR7ZGlmZnN9YCwge1xuICAgICAgbnVtU3RhY2tzV2l0aENoYW5nZXM6IGRpZmZzLFxuICAgICAgbnVtU3RhY2tzV2l0aFNlY3VyaXR5Q2hhbmdlczogc2VjdXJpdHlEaWZmcyxcbiAgICAgIGRpZmZzOiB0ZW1wbGF0ZURpZmZzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlbXBsYXRlRGlmZnM7XG4gIH1cblxuICAvKipcbiAgICogRHJpZnQgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZHJpZnQoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEcmlmdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8eyBbbmFtZTogc3RyaW5nXTogRHJpZnRSZXN1bHQgfT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RyaWZ0Jyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBkcmlmdFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uRFJJRlRfQVBQKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICAgIGNvbnN0IGFsbERyaWZ0UmVzdWx0czogeyBbbmFtZTogc3RyaW5nXTogRHJpZnRSZXN1bHQgfSA9IHt9O1xuICAgIGNvbnN0IHVuYXZhaWxhYmxlRHJpZnRzID0gW107XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkcmlmdCcpO1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMpIHtcbiAgICAgIGNvbnN0IGNmbiA9IChhd2FpdCBzZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChzdGFjay5lbnZpcm9ubWVudCwgTW9kZS5Gb3JSZWFkaW5nKSkuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICBjb25zdCBkcmlmdFJlc3VsdHMgPSBhd2FpdCBkZXRlY3RTdGFja0RyaWZ0KGNmbiwgZHJpZnRTcGFuLmFzSGVscGVyLCBzdGFjay5zdGFja05hbWUpO1xuXG4gICAgICBpZiAoIWRyaWZ0UmVzdWx0cy5TdGFja1Jlc291cmNlRHJpZnRzKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrTmFtZSA9IHN0YWNrLmRpc3BsYXlOYW1lID8/IHN0YWNrLnN0YWNrTmFtZTtcbiAgICAgICAgdW5hdmFpbGFibGVEcmlmdHMucHVzaChzdGFja05hbWUpO1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4ubm90aWZ5KElPLkNES19UT09MS0lUX1c0NTkxLm1zZyhgJHtzdGFja05hbWV9OiBObyBkcmlmdCByZXN1bHRzIGF2YWlsYWJsZWAsIHsgc3RhY2sgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IERyaWZ0Rm9ybWF0dGVyKHsgc3RhY2ssIHJlc291cmNlRHJpZnRzOiBkcmlmdFJlc3VsdHMuU3RhY2tSZXNvdXJjZURyaWZ0cyB9KTtcbiAgICAgIGNvbnN0IGRyaWZ0T3V0cHV0ID0gZm9ybWF0dGVyLmZvcm1hdFN0YWNrRHJpZnQoKTtcbiAgICAgIGNvbnN0IHN0YWNrRHJpZnQgPSB7XG4gICAgICAgIG51bVJlc291cmNlc1dpdGhEcmlmdDogZHJpZnRPdXRwdXQubnVtUmVzb3VyY2VzV2l0aERyaWZ0LFxuICAgICAgICBudW1SZXNvdXJjZXNVbmNoZWNrZWQ6IGRyaWZ0T3V0cHV0Lm51bVJlc291cmNlc1VuY2hlY2tlZCxcbiAgICAgICAgZm9ybWF0dGVkRHJpZnQ6IHtcbiAgICAgICAgICB1bmNoYW5nZWQ6IGRyaWZ0T3V0cHV0LnVuY2hhbmdlZCxcbiAgICAgICAgICB1bmNoZWNrZWQ6IGRyaWZ0T3V0cHV0LnVuY2hlY2tlZCxcbiAgICAgICAgICBtb2RpZmllZDogZHJpZnRPdXRwdXQubW9kaWZpZWQsXG4gICAgICAgICAgZGVsZXRlZDogZHJpZnRPdXRwdXQuZGVsZXRlZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBhbGxEcmlmdFJlc3VsdHNbZm9ybWF0dGVyLnN0YWNrTmFtZV0gPSBzdGFja0RyaWZ0O1xuXG4gICAgICAvLyBoZWFkZXJcbiAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy5pbmZvKGRyaWZ0T3V0cHV0LnN0YWNrSGVhZGVyKTtcblxuICAgICAgLy8gcHJpbnQgdGhlIGRpZmZlcmVudCBzZWN0aW9ucyBhdCBkaWZmZXJlbnQgbGV2ZWxzXG4gICAgICBpZiAoZHJpZnRPdXRwdXQudW5jaGFuZ2VkKSB7XG4gICAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy5kZWJ1ZyhkcmlmdE91dHB1dC51bmNoYW5nZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWZ0T3V0cHV0LnVuY2hlY2tlZCkge1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuZGVidWcoZHJpZnRPdXRwdXQudW5jaGVja2VkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmlmdE91dHB1dC5tb2RpZmllZCkge1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuaW5mbyhkcmlmdE91dHB1dC5tb2RpZmllZCk7XG4gICAgICB9XG4gICAgICBpZiAoZHJpZnRPdXRwdXQuZGVsZXRlZCkge1xuICAgICAgICBhd2FpdCBkcmlmdFNwYW4uZGVmYXVsdHMuaW5mbyhkcmlmdE91dHB1dC5kZWxldGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFpbiBzdGFjayByZXN1bHRcbiAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTQ1OTAubXNnKGRyaWZ0T3V0cHV0LnN1bW1hcnksIHtcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGRyaWZ0OiBzdGFja0RyaWZ0LFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIHByaW50IHN1bW1hcnlcbiAgICBjb25zdCB0b3RhbERyaWZ0cyA9IE9iamVjdC52YWx1ZXMoYWxsRHJpZnRSZXN1bHRzKS5yZWR1Y2UoKHRvdGFsLCBjdXJyZW50KSA9PiB0b3RhbCArIChjdXJyZW50Lm51bVJlc291cmNlc1dpdGhEcmlmdCA/PyAwKSwgMCk7XG4gICAgY29uc3QgdG90YWxVbmNoZWNrZWQgPSBPYmplY3QudmFsdWVzKGFsbERyaWZ0UmVzdWx0cykucmVkdWNlKCh0b3RhbCwgY3VycmVudCkgPT4gdG90YWwgKyAoY3VycmVudC5udW1SZXNvdXJjZXNVbmNoZWNrZWQgPz8gMCksIDApO1xuICAgIGF3YWl0IGRyaWZ0U3Bhbi5lbmQoYFxcbuKcqCAgTnVtYmVyIG9mIHJlc291cmNlcyB3aXRoIGRyaWZ0OiAke3RvdGFsRHJpZnRzfSR7dG90YWxVbmNoZWNrZWQgPyBgICgke3RvdGFsVW5jaGVja2VkfSB1bmNoZWNrZWQpYCA6ICcnfWApO1xuICAgIGlmICh1bmF2YWlsYWJsZURyaWZ0cy5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy53YXJuKGBcXG7imqDvuI8gIEZhaWxlZCB0byBjaGVjayBkcmlmdCBmb3IgJHt1bmF2YWlsYWJsZURyaWZ0cy5sZW5ndGh9IHN0YWNrKHMpLiBDaGVjayBsb2cgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsRHJpZnRSZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggQXNzZXRzIEFjdGlvblxuICAgKlxuICAgKiBQdWJsaXNoZXMgYXNzZXRzIGZvciB0aGUgc2VsZWN0ZWQgc3RhY2tzIHdpdGhvdXQgZGVwbG95aW5nXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaEFzc2V0cyhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFB1Ymxpc2hBc3NldHNPcHRpb25zID0ge30pOiBQcm9taXNlPFB1Ymxpc2hBc3NldHNSZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ3B1Ymxpc2gtYXNzZXRzJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdwdWJsaXNoLWFzc2V0cycpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHRocm93SWZWYWxpZGF0aW9uRmFpbHVyZXMoYXNzZW1ibHksIHN0YWNrQ29sbGVjdGlvbiwgdGhpcy5hc3NlbWJseUZhaWx1cmVBdCwgaW9IZWxwZXIpO1xuXG4gICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTUwMDEubXNnKCdObyBzdGFja3Mgc2VsZWN0ZWQnKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwdWJsaXNoZWRBc3NldHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ3B1Ymxpc2gtYXNzZXRzJyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24uc3RhY2tBcnRpZmFjdHM7XG4gICAgY29uc3Qgc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyA9IHN0YWNrcy5mbGF0TWFwKChzdGFjaykgPT4gW1xuICAgICAgc3RhY2ssXG4gICAgICAuLi5zdGFjay5kZXBlbmRlbmNpZXMuZmlsdGVyKHggPT4gY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LmlzQXNzZXRNYW5pZmVzdEFydGlmYWN0KHgpKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHdvcmtHcmFwaCA9IG5ldyBXb3JrR3JhcGhCdWlsZGVyKFxuICAgICAgaW9IZWxwZXIsXG4gICAgICB0cnVlLCAvLyBwcmVidWlsZCBhbGwgYXNzZXRzXG4gICAgKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIGlmICghb3B0aW9ucy5mb3JjZSkge1xuICAgICAgYXdhaXQgcmVtb3ZlUHVibGlzaGVkQXNzZXRzRnJvbVdvcmtHcmFwaCh3b3JrR3JhcGgsIGRlcGxveW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3NldE5vZGVzID0gT2JqZWN0LnZhbHVlcyh3b3JrR3JhcGgubm9kZXMpXG4gICAgICAuZmlsdGVyKChuKTogbiBpcyBBc3NldFB1Ymxpc2hOb2RlID0+IG4udHlwZSA9PT0gJ2Fzc2V0LXB1Ymxpc2gnKTtcblxuICAgIGlmIChhc3NldE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAwLm1zZyhjaGFsay5ncmVlbignXFxu4pyoICBBbGwgYXNzZXRzIGFyZSBhbHJlYWR5IHB1Ymxpc2hlZFxcbicpKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwdWJsaXNoZWRBc3NldHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3NldHMgPSBhc3NldE5vZGVzLm1hcChuID0+IG4uYXNzZXQpO1xuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JOTQwMS5tc2coJ1B1Ymxpc2hpbmcgYXNzZXRzJywgeyBhc3NldHMgfSkpO1xuXG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5ID8/IDQ7XG4gICAgY29uc3QgZ3JhcGhDb25jdXJyZW5jeTogQ29uY3VycmVuY3kgPSB7XG4gICAgICAnc3RhY2snOiAxLFxuICAgICAgJ2Fzc2V0LWJ1aWxkJzogY29uY3VycmVuY3ksXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IGNvbmN1cnJlbmN5LFxuICAgICAgJ21hcmtlcic6IDEsXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIC8vIE5vLW9wOiB3ZSdyZSBvbmx5IHB1Ymxpc2hpbmcgYXNzZXRzLCBub3QgZGVwbG95aW5nXG4gICAgICBkZXBsb3lTdGFjazogV29ya0dyYXBoLk5PT1AsXG4gICAgICBidWlsZEFzc2V0OiB0aGlzLmNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIHVuZGVmaW5lZCksXG4gICAgICBwdWJsaXNoQXNzZXQ6IHRoaXMuY3JlYXRlUHVibGlzaEFzc2V0RnVuY3Rpb24oaW9IZWxwZXIsIGRlcGxveW1lbnRzLCB1bmRlZmluZWQsIG9wdGlvbnMuZm9yY2UpLFxuICAgICAgbWFya2VyOiBXb3JrR3JhcGguTk9PUCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JOTQwMi5tc2coY2hhbGsuZ3JlZW4oJ1xcbuKcqCAgQXNzZXRzIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHlcXG4nKSwgeyBhc3NldHMgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Ymxpc2hlZEFzc2V0czogYXNzZXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBBY3Rpb25cbiAgICpcbiAgICogTGlzdCBzZWxlY3RlZCBzdGFja3MgYW5kIHRoZWlyIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBMaXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTdGFja0RldGFpbHNbXT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2xpc3QnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24ud2l0aERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBzdGFja3MubWFwKHMgPT4gcy5pZCkuam9pbignXFxuJyk7XG5cbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTI5MDEubXNnKG1lc3NhZ2UsIHsgc3RhY2tzIH0pKTtcbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBmaW5kIHRoZSByb290IGNhdXNlcyBmb3IgZGVwbG95bWVudCBmYWlsdXJlcyBvZiB0aGUgZ2l2ZW4gc3RhY2tzLlxuICAgKlxuICAgKiBCb3RoIGVtaXRzIHRoZSBkaWFnbm9zaXMgcmVzdWx0cyBvdmVyIHRoZSBJTyBob3N0IGFzIHRoZXkgYXJlIGNvbWluZyBpbiwgYXMgd2VsbFxuICAgKiBhcyByZXR1cm5zIGFsbCBvZiB0aGVtIGFzIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBOT1RFOiBUaGUgQ2xvdWQgQXNzZW1ibHkgU291cmNlICoqc2hvdWxkKiogYmUgY29uZmlndXJlZCB3aXRoIGBkZWJ1ZzogdHJ1ZWAgdG8gYWRkXG4gICAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWFnbm9zdGljcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWFnbm9zZShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERpYWdub3NlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEaWFnbm9zZVJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVVuc3RhYmxlRmVhdHVyZSgnZGlhZ25vc2UnKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RpYWdub3NlJyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc2VsZWN0U3RhY2tzKTtcbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IGVudnMgPSBuZXcgRW52aXJvbm1lbnRBY2Nlc3MoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGlhZ25vc2UnKSwgb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLCBpb0hlbHBlcik7XG5cbiAgICAvLyBEbyBzdGFja3MgaW4gcGFyYWxsZWwsIGZvciBzcGVlZC5cbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChvcHRpb25zLmNvbmN1cnJlbmN5ID8/IDEwKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IFByb21pc2UuYWxsKHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cy5tYXAoKHN0YWNrKSA9PiBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IGVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHN0YWNrKTtcblxuICAgICAgY29uc3QgZGlhZ25vc2VyID0gbmV3IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIoe1xuICAgICAgICBzZGs6IHN0YWNrRW52LnNkayxcbiAgICAgICAgZW52UmVzb3VyY2VzOiBzdGFja0Vudi5yZXNvdXJjZXMsXG4gICAgICAgIHNvdXJjZVRyYWNlcjogbmV3IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIoc3RhY2spLFxuICAgICAgICBpb0hlbHBlcixcbiAgICAgICAgdG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgYWRkaXRpb25hbEV4cGxvcmF0aW9uU2RrUHJvdmlkZXI6ICgpID0+IFByb21pc2UucmVzb2x2ZShzdGFja0Vudi5zZGspLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCBkaWFnbm9zZXIuZGlhZ25vc2VGcm9tRnJlc2goc3RhY2suc3RhY2tOYW1lKTtcblxuICAgICAgY29uc3QgcmV0OiBEaWFnbm9zZWRTdGFjayA9IHtcbiAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIGhpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgcmVzdWx0OiBkaWFnbm9zaXMsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoe1xuICAgICAgICBhY3Rpb246ICdkaWFnbm9zZScsXG4gICAgICAgIC4uLmhvc3RNZXNzYWdlRnJvbURpYWdub3NpcyhyZXQpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7IHN0YWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIEFjdGlvblxuICAgKlxuICAgKiBTeW50aGVzaXplcyB0aGUgQ0RLIGFwcCBhbmQgcmVhZHMgdGhlIHBvbGljeSB2YWxpZGF0aW9uIHJlcG9ydFxuICAgKiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogVmFsaWRhdGVPcHRpb25zID0ge30pOiBQcm9taXNlPFZhbGlkYXRlUmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAndmFsaWRhdGUnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgcmVwb3J0cyA9IGF3YWl0IG9idGFpblVuaWZpZWRWYWxpZGF0aW9uUmVwb3J0KGFzc2VtYmx5LCBzdGFja3MpO1xuXG4gICAgLy8gT25saW5lIHZhbGlkYXRpb246IHN1Ym1pdCB0ZW1wbGF0ZXMgdG8gQ2xvdWRGb3JtYXRpb24gZm9yIGVhcmx5IHZhbGlkYXRpb25cbiAgICBpZiAob3B0aW9ucy5vbmxpbmUgPz8gdHJ1ZSkge1xuICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCd2YWxpZGF0ZScpO1xuXG4gICAgICBjb25zdCBvbmxpbmVSZXBvcnQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlT25saW5lKGlvSGVscGVyLCBzdGFja3MsIGRlcGxveW1lbnRzKTtcbiAgICAgIGlmIChvbmxpbmVSZXBvcnQpIHtcbiAgICAgICAgcmVwb3J0cy5wdXNoKG9ubGluZVJlcG9ydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQW55VmlvbGF0aW9ucyA9IHJlcG9ydHMuc29tZShyZXBvcnQgPT4gcmVwb3J0LnZpb2xhdGlvbnMgJiYgcmVwb3J0LnZpb2xhdGlvbnMubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRlUmVzdWx0ID0ge1xuICAgICAgY29uY2x1c2lvbjogY29tYmluZUNvbmNsdXNpb25zKHJlcG9ydHMpLFxuICAgICAgdGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgIHBsdWdpblJlcG9ydHM6IHJlcG9ydHMsXG4gICAgfTtcblxuICAgIGlmICghaGFzQW55VmlvbGF0aW9ucykge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NjAwLm1zZygnVmFsaWRhdGlvbiBkaWQgbm90IGZpbmQgYW55IHByb2JsZW1zLicsIHJlc3VsdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoaG9zdE1lc3NhZ2VGcm9tVmFsaWRhdGlvbihwcm9jZXNzLmN3ZCgpLCByZXN1bHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU9ubGluZShcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sXG4gICAgZGVwbG95bWVudHM6IERlcGxveW1lbnRzLFxuICApOiBQcm9taXNlPFBsdWdpblJlcG9ydEpzb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQbHVnaW5SZXBvcnRKc29uWyd2aW9sYXRpb25zJ10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXBvcnQgPSBhd2FpdCBjcmVhdGVWYWxpZGF0aW9uQ2hhbmdlU2V0KGlvSGVscGVyLCB7XG4gICAgICAgICAgZGVwbG95bWVudHMsXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgcGFyYW1ldGVyczoge30sXG4gICAgICAgICAgdXVpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgIHdpbGxFeGVjdXRlOiBmYWxzZSxcbiAgICAgICAgICBmYWlsT25FcnJvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcG9ydC5kaWFnbm9zaXMudHlwZSA9PT0gJ3Byb2JsZW0nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHJlcG9ydC5kaWFnbm9zaXMucHJvYmxlbXMpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIHJ1bGVOYW1lOiBwcm9ibGVtLmVycm9yQ29kZSA/PyAnQ2xvdWRGb3JtYXRpb25WYWxpZGF0aW9uJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHByb2JsZW0ubWVzc2FnZS5yZXBsYWNlKC9cXHMqXFwoYXRcXHMrXFwvUmVzb3VyY2VzXFwvW14pXStcXClcXHMqJC8sICcnKSxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdmYXRhbCcsXG4gICAgICAgICAgICAgIHZpb2xhdGluZ0NvbnN0cnVjdHM6IFt7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0UGF0aDogcHJvYmxlbS5zb3VyY2VUcmFjZT8uY29uc3RydWN0UGF0aCA/PyAocHJvYmxlbS5sb2dpY2FsSWQgPyBgJHtzdGFjay5oaWVyYXJjaGljYWxJZH0vJHtwcm9ibGVtLmxvZ2ljYWxJZH1gIDogc3RhY2suaGllcmFyY2hpY2FsSWQpLFxuICAgICAgICAgICAgICAgIGNsb3VkRm9ybWF0aW9uUmVzb3VyY2U6IHByb2JsZW0ubG9naWNhbElkID8ge1xuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoOiBgJHtzdGFjay5zdGFja05hbWV9LnRlbXBsYXRlLmpzb25gLFxuICAgICAgICAgICAgICAgICAgbG9naWNhbElkOiBwcm9ibGVtLmxvZ2ljYWxJZCxcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YWNrVHJhY2VzOiBwcm9ibGVtLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UgPyBbcHJvYmxlbS5zb3VyY2VUcmFjZS5jcmVhdGlvblN0YWNrVHJhY2Uuam9pbignXFxuJyldIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XOTYwMi5tc2coYE9ubGluZSB2YWxpZGF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZm9yIHN0YWNrICcke3N0YWNrLmhpZXJhcmNoaWNhbElkfSc6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBsdWdpbk5hbWU6ICdDbG91ZEZvcm1hdGlvbicsXG4gICAgICBjb25jbHVzaW9uOiAnZmFpbHVyZScsXG4gICAgICB2aW9sYXRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IEFjdGlvblxuICAgKlxuICAgKiBEZXBsb3lzIHRoZSBzZWxlY3RlZCBzdGFja3MgaW50byBhbiBBV1MgYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlcGxveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RGVwbG95UmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGVwbG95Jyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ2RlcGxveScsIGFzc2VtYmx5LnN5bnRoRHVyYXRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXBsb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RlcGxveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICd3YXRjaCcsIHN5bnRoRHVyYXRpb246IEVsYXBzZWRUaW1lLCBvcHRpb25zOiBQcml2YXRlRGVwbG95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXBsb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhyb3dJZlZhbGlkYXRpb25GYWlsdXJlcyhhc3NlbWJseSwgc3RhY2tDb2xsZWN0aW9uLCB0aGlzLmFzc2VtYmx5RmFpbHVyZUF0LCBpb0hlbHBlcik7XG5cbiAgICBjb25zdCByZXQ6IERlcGxveVJlc3VsdCA9IHtcbiAgICAgIHN0YWNrczogW10sXG4gICAgfTtcblxuICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U1MDAxLm1zZygnVGhpcyBhcHAgY29udGFpbnMgbm8gc3RhY2tzJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ2RlcGxveScpO1xuXG4gICAgaWYgKCFpc0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IG1pZ3JhdG9yID0gbmV3IFJlc291cmNlTWlncmF0b3IoeyBkZXBsb3ltZW50cywgaW9IZWxwZXIgfSk7XG4gICAgICBhd2FpdCBtaWdyYXRvci50cnlNaWdyYXRlUmVzb3VyY2VzKHN0YWNrQ29sbGVjdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyTWFwID0gYnVpbGRQYXJhbWV0ZXJNYXAob3B0aW9ucy5wYXJhbWV0ZXJzPy5wYXJhbWV0ZXJzKTtcblxuICAgIGlmIChvcHRpb25zLmRlcGxveW1lbnRNZXRob2Q/Lm1ldGhvZCA9PT0gJ2hvdHN3YXAnKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzU0MDAubXNnKFtcbiAgICAgICAgJ+KaoO+4jyBIb3Rzd2FwIGRlcGxveW1lbnRzIGRlbGliZXJhdGVseSBpbnRyb2R1Y2UgQ2xvdWRGb3JtYXRpb24gZHJpZnQgdG8gc3BlZWQgdXAgZGVwbG95bWVudHMnLFxuICAgICAgICAn4pqg77iPIFRoZXkgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgLSBuZXZlciB1c2UgdGhlbSBmb3IgeW91ciBwcm9kdWN0aW9uIFN0YWNrcyEnLFxuICAgICAgXS5qb2luKCdcXG4nKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja091dHB1dHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBjb25zdCBvdXRwdXRzRmlsZSA9IG9wdGlvbnMub3V0cHV0c0ZpbGU7XG5cbiAgICBjb25zdCB7IGJ1aWxkQXNzZXQsIHB1Ymxpc2hBc3NldCB9ID0gKCgpID0+IHtcbiAgICAgIGlmIChpc0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCkpIHtcbiAgICAgICAgLy8gTm8tb3A6IGFzc2V0cyBhcmUgYWxyZWFkeSBwdWJsaXNoZWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBidWlsZEFzc2V0OiBXb3JrR3JhcGguTk9PUCxcbiAgICAgICAgICBwdWJsaXNoQXNzZXQ6IFdvcmtHcmFwaC5OT09QLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWlsZEFzc2V0OiB0aGlzLmNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIG9wdGlvbnMucm9sZUFybiksXG4gICAgICAgIHB1Ymxpc2hBc3NldDogdGhpcy5jcmVhdGVQdWJsaXNoQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIG9wdGlvbnMucm9sZUFybiwgb3B0aW9ucy5mb3JjZUFzc2V0UHVibGlzaGluZyksXG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBkZXBsb3lTdGFjayA9IGFzeW5jIChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4ge1xuICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja05vZGUuc3RhY2s7XG4gICAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgIT09IDEpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhY2suZW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICAnU3RhY2tFbnZpcm9ubWVudE1pc3NpbmcnLFxuICAgICAgICAgIGBTdGFjayAke3N0YWNrLmRpc3BsYXlOYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gZW52aXJvbm1lbnQsIGFuZCBBV1MgY3JlZGVudGlhbHMgY291bGQgbm90IGJlIG9idGFpbmVkIGZyb20gc3RhbmRhcmQgbG9jYXRpb25zIG9yIG5vIHJlZ2lvbiB3YXMgY29uZmlndXJlZC5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgZ2VuZXJhdGVkIHN0YWNrIGhhcyBubyByZXNvdXJjZXNcbiAgICAgIGNvbnN0IHJlc291cmNlQ291bnQgPSBPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge30pLmxlbmd0aDtcbiAgICAgIGlmIChyZXNvdXJjZUNvdW50ID09PSAwKSB7XG4gICAgICAgIC8vIHN0YWNrIGlzIGVtcHR5IGFuZCBkb2Vzbid0IGV4aXN0ID0+IGRvIG5vdGhpbmdcbiAgICAgICAgY29uc3Qgc3RhY2tFeGlzdHMgPSBhd2FpdCBkZXBsb3ltZW50cy5zdGFja0V4aXN0cyh7IHN0YWNrIH0pO1xuICAgICAgICBpZiAoIXN0YWNrRXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTAyMS5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBzdGFjayBoYXMgbm8gcmVzb3VyY2VzLCBza2lwcGluZyBkZXBsb3ltZW50LmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0YWNrIGlzIGVtcHR5LCBidXQgZXhpc3RzID0+IGRlbGV0ZVxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzUwMjIubXNnKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgZGVsZXRpbmcgZXhpc3Rpbmcgc3RhY2suYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLl9kZXN0cm95KGFzc2VtYmx5LCAnZGVwbG95Jywge1xuICAgICAgICAgIHN0YWNrczogeyBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSwgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSB9LFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50VGVtcGxhdGUgPSBhd2FpdCBkZXBsb3ltZW50cy5yZWFkQ3VycmVudFRlbXBsYXRlKHN0YWNrKTtcblxuICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc2FtZSBzZW1hbnRpY3Mgd2UgYXBwbHkgd2l0aCByZXNwZWN0IHRvIE5vdGlmaWNhdGlvbiBBUk5zIChkaWN0YXRlZCBieSB0aGUgU0RLKVxuICAgICAgLy9cbiAgICAgIC8vICAtIHVuZGVmaW5lZCAgPT4gIGNkayBpZ25vcmVzIGl0LCBhcyBpZiBpdCB3YXNuJ3Qgc3VwcG9ydGVkIChhbGxvd3MgZXh0ZXJuYWwgbWFuYWdlbWVudCkuXG4gICAgICAvLyAgLSBbXTogICAgICAgID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHdpcGUgaXQgb3V0LlxuICAgICAgLy8gIC0gWydhcm4tMSddICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byBzZXQgaXQgdG8gWydhcm4tMSddLlxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uQXJucyA9ICghIW9wdGlvbnMubm90aWZpY2F0aW9uQXJucyB8fCAhIXN0YWNrLm5vdGlmaWNhdGlvbkFybnMpXG4gICAgICAgID8gKG9wdGlvbnMubm90aWZpY2F0aW9uQXJucyA/PyBbXSkuY29uY2F0KHN0YWNrLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbkFybiBvZiBub3RpZmljYXRpb25Bcm5zID8/IFtdKSB7XG4gICAgICAgIGlmICghdmFsaWRhdGVTbnNUb3BpY0Fybihub3RpZmljYXRpb25Bcm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignSW52YWxpZFNuc1RvcGljQXJuJywgYE5vdGlmaWNhdGlvbiBhcm4gJHtub3RpZmljYXRpb25Bcm59IGlzIG5vdCBhIHZhbGlkIGFybiBmb3IgYW4gU05TIHRvcGljYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVwbG95IG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gY2hhbmdlIHNldCBjcmVhdGlvbiBhbmQgZXhlY3V0aW9uXG4gICAgICBjb25zdCBzaGFyZWREZXBsb3lPcHRpb25zID0ge1xuICAgICAgICBzdGFjayxcbiAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgcmV1c2VBc3NldHM6IG9wdGlvbnMucmV1c2VBc3NldHMsXG4gICAgICAgIHRhZ3M6IG9wdGlvbnMudGFncz8ubGVuZ3RoID8gb3B0aW9ucy50YWdzIDogdGFnc0ZvclN0YWNrKHN0YWNrKSxcbiAgICAgICAgZm9yY2VEZXBsb3ltZW50OiBvcHRpb25zLmZvcmNlRGVwbG95bWVudCxcbiAgICAgICAgcGFyYW1ldGVyczogT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1ldGVyTWFwWycqJ10sIHBhcmFtZXRlck1hcFtzdGFjay5zdGFja05hbWVdKSxcbiAgICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnM/LmtlZXBFeGlzdGluZ1BhcmFtZXRlcnMsXG4gICAgICAgIHJvbGxiYWNrOiBvcHRpb25zLnJvbGxiYWNrLFxuICAgICAgICBub3RpZmljYXRpb25Bcm5zLFxuICAgICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgICAgfTtcblxuICAgICAgLy8gV2hlbiB1c2luZyBjaGFuZ2Utc2V0IG1ldGhvZCwgYWx3YXlzIGNyZWF0ZSB0aGUgY2hhbmdlIHNldCB1cGZyb250LlxuICAgICAgLy8gVGhpcyBnaXZlcyB1cyBhbiBhY2N1cmF0ZSBkaWZmIGZvciBhcHByb3ZhbCBhbmQgYXZvaWRzIGNyZWF0aW5nIGl0IHR3aWNlLlxuICAgICAgLy8gRm9yIG5vbi1leGVjdXRpbmcgZGVwbG95bWVudHMgKHByZXBhcmUtY2hhbmdlLXNldCksIHRoaXMgaXMgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICAgIGNvbnN0IHByZXBhcmVSZXN1bHQgPSBpc0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKVxuICAgICAgICA/IGF3YWl0IGRlcGxveW1lbnRzLnByZXBhcmVTdGFjayh7XG4gICAgICAgICAgLi4uc2hhcmVkRGVwbG95T3B0aW9ucyxcbiAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICAgICAgY2xlYW51cE9uTm9PcDogaXNFeGVjdXRpbmdDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCksXG4gICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBTa2lwIHRoZSBhcHByb3ZhbCBwcm9tcHQgZW50aXJlbHkgd2hlbiB0aGUgcHJlcGFyZWQgY2hhbmdlIHNldCBoYXMgbm9cbiAgICAgIC8vIGNoYW5nZXMg4oCUIHRoZXJlIGlzIG5vdGhpbmcgZm9yIHRoZSB1c2VyIHRvIGFwcHJvdmUuIE91dHB1dHMsIHN0YWNrIEFSTixcbiAgICAgIC8vIGFuZCB0aW1pbmdzIGFyZSBzdGlsbCBlbWl0dGVkIHZpYSB0aGUgbm9ybWFsIG5vLW9wIGRlcGxveSBwYXRoIGJlbG93LlxuICAgICAgaWYgKCFwcmVwYXJlUmVzdWx0Py5ub09wKSB7XG4gICAgICAgIC8vIEZvciBleGVjdXRlLWNoYW5nZS1zZXQsIGRlc2NyaWJlIHRoZSBleGlzdGluZyBjaGFuZ2Ugc2V0IHNvIHdlIGNhbiBzaG93IGFuIGFjY3VyYXRlIGRpZmZcbiAgICAgICAgY29uc3QgZGlmZkNoYW5nZVNldCA9IGlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKVxuICAgICAgICAgID8gYXdhaXQgZGVwbG95bWVudHMuZGVzY3JpYmVDaGFuZ2VTZXQoc3RhY2ssIG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZC5jaGFuZ2VTZXROYW1lLCBwcmVwYXJlUmVzdWx0Py5zdGFja0FybilcbiAgICAgICAgICA6IHByZXBhcmVSZXN1bHQ/LmNoYW5nZVNldDtcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRGlmZkZvcm1hdHRlcih7XG4gICAgICAgICAgdGVtcGxhdGVJbmZvOiB7XG4gICAgICAgICAgICBvbGRUZW1wbGF0ZTogY3VycmVudFRlbXBsYXRlLFxuICAgICAgICAgICAgbmV3VGVtcGxhdGU6IHN0YWNrLFxuICAgICAgICAgICAgY2hhbmdlU2V0OiBkaWZmQ2hhbmdlU2V0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNlY3VyaXR5RGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTZWN1cml0eURpZmYoKTtcbiAgICAgICAgY29uc3Qgc3RhY2tEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFN0YWNrRGlmZigpO1xuXG4gICAgICAgIC8vIFNlbmQgYSByZXF1ZXN0IHJlc3BvbnNlIHdpdGggdGhlIGRpZmYgYXMgcGFydCBvZiB0aGUgbWVzc2FnZSxcbiAgICAgICAgLy8gYW5kIHRoZSB0ZW1wbGF0ZSBkaWZmIGFzIGRhdGFcbiAgICAgICAgLy8gKElvSG9zdCBkZWNpZGVzIHdoZXRoZXIgdG8gcHJpbnQgZGVwZW5kaW5nIG9uIHBlcm1pc3Npb25DaGFuZ2VUeXBlKVxuICAgICAgICBjb25zdCBoYXNTZWN1cml0eUNoYW5nZXMgPSBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUgIT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkU7XG4gICAgICAgIGNvbnN0IGRlcGxveU1vdGl2YXRpb24gPSBoYXNTZWN1cml0eUNoYW5nZXNcbiAgICAgICAgICA/ICdcIi0tcmVxdWlyZS1hcHByb3ZhbFwiIGlzIGVuYWJsZWQgYW5kIHN0YWNrIGluY2x1ZGVzIHNlY3VyaXR5LXNlbnNpdGl2ZSB1cGRhdGVzLidcbiAgICAgICAgICA6ICdcIi0tcmVxdWlyZS1hcHByb3ZhbFwiIGlzIGVuYWJsZWQgYW5kIHN0YWNrIGluY2x1ZGVzIHVwZGF0ZXMuJztcbiAgICAgICAgY29uc3QgZGlmZk91dHB1dCA9IGhhc1NlY3VyaXR5Q2hhbmdlcyA/IHNlY3VyaXR5RGlmZi5mb3JtYXR0ZWREaWZmIDogc3RhY2tEaWZmLmZvcm1hdHRlZERpZmY7XG4gICAgICAgIGNvbnN0IGRlcGxveVF1ZXN0aW9uID0gYCR7ZGlmZk91dHB1dH1cXG5cXG4ke2RlcGxveU1vdGl2YXRpb259XFxuRG8geW91IHdpc2ggdG8gZGVwbG95IHRoZXNlIGNoYW5nZXNgO1xuICAgICAgICBjb25zdCBkZXBsb3lDb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTUwNjAucmVxKGRlcGxveVF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW90aXZhdGlvbjogZGVwbG95TW90aXZhdGlvbixcbiAgICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgICBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogc2VjdXJpdHlEaWZmLnBlcm1pc3Npb25DaGFuZ2VUeXBlLFxuICAgICAgICAgIHRlbXBsYXRlRGlmZnM6IGZvcm1hdHRlci5kaWZmcyxcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIWRlcGxveUNvbmZpcm1lZCkge1xuICAgICAgICAgIGlmIChwcmVwYXJlUmVzdWx0Py5jaGFuZ2VTZXQ/LkNoYW5nZVNldE5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmNsZWFudXBDaGFuZ2VTZXQoc3RhY2ssIHByZXBhcmVSZXN1bHQuY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3lBYm9ydGVkJywgJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBzdGFja3MuaW5kZXhPZihzdGFjaykgKyAxO1xuICAgICAgY29uc3QgZGVwbG95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVBMT1lfU1RBQ0spXG4gICAgICAgIC5iZWdpbihgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IGRlcGxveWluZy4uLiBbJHtzdGFja0luZGV4fS8ke3N0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50fV1gLCB7XG4gICAgICAgICAgdG90YWw6IHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50LFxuICAgICAgICAgIGN1cnJlbnQ6IHN0YWNrSW5kZXgsXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgIH0pO1xuICAgICAgZGVwbG95U3Bhbi5pbmNDb3VudGVyKCdyZXNvdXJjZXMnLCByZXNvdXJjZUNvdW50KTtcblxuICAgICAgbGV0IGRlcGxveUR1cmF0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJlcGFyZUlzRmluYWwgPSBwcmVwYXJlUmVzdWx0ICYmIChwcmVwYXJlUmVzdWx0Lm5vT3AgfHwgaXNOb25FeGVjdXRpbmdDaGFuZ2VTZXREZXBsb3ltZW50KG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCkpO1xuICAgICAgICBsZXQgZGVwbG95UmVzdWx0OiBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQgPSBwcmVwYXJlSXNGaW5hbCA/IHByZXBhcmVSZXN1bHQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJvbGxiYWNrID0gb3B0aW9ucy5yb2xsYmFjaztcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG4gICAgICAgIHdoaWxlICghZGVwbG95UmVzdWx0KSB7XG4gICAgICAgICAgaWYgKCsraXRlcmF0aW9uID4gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignRGVwbG95TG9vcFVuc3RhYmxlJywgJ1RoaXMgbG9vcCBzaG91bGQgaGF2ZSBzdGFiaWxpemVkIGluIDIgaXRlcmF0aW9ucywgYnV0IGRpZG5cXCd0LiBJZiB5b3UgYXJlIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBkZXBsb3ltZW50cy5kZXBsb3lTdGFjayh7XG4gICAgICAgICAgICAuLi5zaGFyZWREZXBsb3lPcHRpb25zLFxuICAgICAgICAgICAgLy8gT24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgZXhlY3V0ZSB0aGUgcHJlcGFyZWQgY2hhbmdlIHNldC5cbiAgICAgICAgICAgIC8vIE9uIHJldHJpZXMgKGFmdGVyIHJvbGxiYWNrKSwgY3JlYXRlIGEgbmV3IGNoYW5nZSBzZXQgc2luY2UgdGhlIG9sZCBvbmUgaXMgZ29uZS5cbiAgICAgICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IGl0ZXJhdGlvbiA9PT0gMSAmJiBpc0V4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKVxuICAgICAgICAgICAgICA/IHRvRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKVxuICAgICAgICAgICAgICA6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgICAgICAgIHJvbGxiYWNrLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc3dpdGNoIChyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RpZC1kZXBsb3ktc3RhY2snOlxuICAgICAgICAgICAgICBkZXBsb3lSZXN1bHQgPSByO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0Jzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gci5yZWFzb24gPT09ICdyZXBsYWNlbWVudCdcbiAgICAgICAgICAgICAgICA/IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiYFxuICAgICAgICAgICAgICAgIDogYFN0YWNrIGlzIGluIGEgcGF1c2VkIGZhaWwgc3RhdGUgKCR7ci5zdGF0dXN9KSBhbmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBkbyBub3QgaW5jbHVkZSBcIi0tbm8tcm9sbGJhY2tcImA7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA1MC5yZXEocXVlc3Rpb24sIHtcbiAgICAgICAgICAgICAgICBtb3RpdmF0aW9uLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUm9sbGJhY2tBYm9ydGVkJywgJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCBhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzdGFja3M6IHtcbiAgICAgICAgICAgICAgICAgIHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLFxuICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXNEdXJpbmdSb2xsYmFjayxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2VtZW50LXJlcXVpcmVzLXJvbGxiYWNrJzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gJ0NoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiJztcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgIG1vdGl2YXRpb24sXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSZXBsYWNlbWVudFJvbGxiYWNrQWJvcnRlZCcsICdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdVbmV4cGVjdGVkRGVwbG95UmVzdWx0JywgYFVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUgZnJvbSBkZXBsb3lTdGFjazogJHtKU09OLnN0cmluZ2lmeShyKX0uIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRlcGxveVJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX0gKG5vIGNoYW5nZXMpYFxuICAgICAgICAgIDogYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDAubXNnKGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIGRlcGxveVJlc3VsdCkpO1xuICAgICAgICBkZXBsb3lEdXJhdGlvbiA9IGF3YWl0IGRlcGxveVNwYW4udGltaW5nKElPLkNES19UT09MS0lUX0k1MDAwKTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBbJ091dHB1dHM6J107XG4gICAgICAgICAgc3RhY2tPdXRwdXRzW3N0YWNrLnN0YWNrTmFtZV0gPSBkZXBsb3lSZXN1bHQub3V0cHV0cztcblxuICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykuc29ydCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7Y2hhbGsuY3lhbihzdGFjay5pZCl9LiR7Y2hhbGsuY3lhbihuYW1lKX0gPSAke2NoYWxrLnVuZGVybGluZShjaGFsay5jeWFuKHZhbHVlKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMS5tc2coYnVmZmVyLmpvaW4oJ1xcbicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAxLm1zZyhgU3RhY2sgQVJOOlxcbiR7ZGVwbG95UmVzdWx0LnN0YWNrQXJufWApKTtcblxuICAgICAgICByZXQuc3RhY2tzLnB1c2goe1xuICAgICAgICAgIHN0YWNrTmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICBhY2NvdW50OiBzdGFjay5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgICAgICAgcmVnaW9uOiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFja0FybjogZGVwbG95UmVzdWx0LnN0YWNrQXJuLFxuICAgICAgICAgIG91dHB1dHM6IGRlcGxveVJlc3VsdC5vdXRwdXRzLFxuICAgICAgICAgIGhpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICBkZWxldGVGYWlsdXJlczogZGVwbG95UmVzdWx0LmRlbGV0ZUZhaWx1cmVzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBJdCBoYXMgdG8gYmUgZXhhY3RseSB0aGlzIHN0cmluZyBiZWNhdXNlIGFuIGludGVncmF0aW9uIHRlc3QgdGVzdHMgZm9yXG4gICAgICAgIC8vIFwiYm9sZChzdGFja25hbWUpIGZhaWxlZDogUmVzb3VyY2VOb3RSZWFkeTogPGVycm9yPlwiXG4gICAgICAgIGNvbnN0IGNvZGUgPSBUb29sa2l0RXJyb3IuaXNUb29sa2l0RXJyb3IoZSkgPyBlLm5hbWUgOiAnRGVwbG95U3RhY2tGYWlsZWQnO1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlID0gW2DinYwgICR7Y2hhbGsuYm9sZChzdGFjay5zdGFja05hbWUpfSBmYWlsZWQ6YCwgLi4uKGUubmFtZSA/IFtgJHtlLm5hbWV9OmBdIDogW10pLCBlLm1lc3NhZ2VdLmpvaW4oJyAnKTtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihjb2RlLCBuZXdNZXNzYWdlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNlTG9ncykge1xuICAgICAgICAgIC8vIGRlcGxveSBjYWxscyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHdhdGNoIHdpbGwgY29tZSB3aXRoIHRoZWlyIG93biBjbG91ZFdhdGNoTG9nTW9uaXRvclxuICAgICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nTW9uaXRvciA/PyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcih7IGlvSGVscGVyIH0pO1xuICAgICAgICAgIGNvbnN0IGZvdW5kTG9nR3JvdXBzUmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGVwbG95JyksIGlvSGVscGVyLCBzdGFjayk7XG4gICAgICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IuYWRkTG9nR3JvdXBzKFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuZW52LFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuc2RrLFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTAzMS5tc2coYFRoZSBmb2xsb3dpbmcgbG9nIGdyb3VwcyBhcmUgYWRkZWQ6ICR7Zm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lc31gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhbiBvdXRwdXRzIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCBjcmVhdGUgdGhlIGZpbGUgcGF0aCBhbmQgd3JpdGUgc3RhY2sgb3V0cHV0cyB0byBpdCBvbmNlLlxuICAgICAgICAvLyBPdXRwdXRzIGFyZSB3cml0dGVuIGFmdGVyIGFsbCBzdGFja3MgaGF2ZSBiZWVuIGRlcGxveWVkLiBJZiBhIHN0YWNrIGRlcGxveW1lbnQgZmFpbHMsXG4gICAgICAgIC8vIGFsbCBvZiB0aGUgb3V0cHV0cyBmcm9tIHN1Y2Nlc3NmdWxseSBkZXBsb3llZCBzdGFja3MgYmVmb3JlIHRoZSBmYWlsdXJlIHdpbGwgc3RpbGwgYmUgd3JpdHRlbi5cbiAgICAgICAgaWYgKG91dHB1dHNGaWxlKSB7XG4gICAgICAgICAgZnMuZW5zdXJlRmlsZVN5bmMob3V0cHV0c0ZpbGUpO1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSnNvbihvdXRwdXRzRmlsZSwgc3RhY2tPdXRwdXRzLCB7XG4gICAgICAgICAgICBzcGFjZXM6IDIsXG4gICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHN5bnRoRHVyYXRpb24uYXNNcyArIChkZXBsb3lEdXJhdGlvbj8uYXNNcyA/PyAwKTtcbiAgICAgIGF3YWl0IGRlcGxveVNwYW4uZW5kKGBcXG7inKggIFRvdGFsIHRpbWU6ICR7Zm9ybWF0VGltZShkdXJhdGlvbil9c1xcbmAsIHsgZHVyYXRpb24gfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2V0QnVpbGRUaW1lID0gb3B0aW9ucy5hc3NldEJ1aWxkVGltZSA/PyBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBwcmVidWlsZEFzc2V0cyA9IGFzc2V0QnVpbGRUaW1lID09PSBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcblxuICAgIGNvbnN0IHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMgPSBzdGFja3MuZmxhdE1hcCgoc3RhY2spID0+IFtcbiAgICAgIHN0YWNrLFxuICAgICAgLi4uc3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcih4ID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSksXG4gICAgXSk7XG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoaW9IZWxwZXIsIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2VBc3NldFB1Ymxpc2hpbmcpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0c0Zyb21Xb3JrR3JhcGgod29ya0dyYXBoLCBkZXBsb3ltZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JhcGhDb25jdXJyZW5jeTogQ29uY3VycmVuY3kgPSB7XG4gICAgICAnc3RhY2snOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1idWlsZCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyBvcHRpb25zLmFzc2V0QnVpbGRDb25jdXJyZW5jeSA/PyAxIDogMSwgLy8gVGhpcyB3aWxsIGJlIENQVS1ib3VuZC9tZW1vcnkgYm91bmQsIG1vc3RseSBtYXR0ZXJzIGZvciBEb2NrZXIgYnVpbGRzXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyA4IDogMSwgLy8gVGhpcyB3aWxsIGJlIEkvTy1ib3VuZCwgOCBpbiBwYXJhbGxlbCBzZWVtcyByZWFzb25hYmxlXG4gICAgICAnbWFya2VyJzogMSxcbiAgICB9O1xuXG4gICAgYXdhaXQgd29ya0dyYXBoLmRvUGFyYWxsZWwoZ3JhcGhDb25jdXJyZW5jeSwge1xuICAgICAgZGVwbG95U3RhY2ssXG4gICAgICBidWlsZEFzc2V0LFxuICAgICAgcHVibGlzaEFzc2V0LFxuICAgICAgLy8gTWFya2VycyBhcmUgb25seSB1c2VkIGZvciB0ZWxlbWV0cnksIGFuZCB0aGUgdG9vbGtpdC1saWIgaXNuJ3QgY3VycmVudGx5IGNvbGxlY3RpbmcgYW55LCBzbyBOT09QIGlzIGZpbmUuXG4gICAgICBtYXJrZXI6IFdvcmtHcmFwaC5OT09QLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBBY3Rpb25cbiAgICpcbiAgICogQ29udGludW91c2x5IG9ic2VydmUgcHJvamVjdCBmaWxlcyBhbmQgZGVwbG95IHRoZSBzZWxlY3RlZCBzdGFja3NcbiAgICogYXV0b21hdGljYWxseSB3aGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLiBEZWZhdWx0cyB0byBob3Rzd2FwIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHksIHN0YXJ0aW5nIGEgd2F0Y2hlciBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YXRjaChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFdhdGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJV2F0Y2hlcj4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3dhdGNoJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4LCBmYWxzZSk7XG4gICAgY29uc3Qgcm9vdERpciA9IG9wdGlvbnMud2F0Y2hEaXIgPz8gcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIEZvciB0aGUgXCJpbmNsdWRlXCIgc2V0dGluZywgdGhlIGJlaGF2aW9yIGlzOlxuICAgIC8vIDEuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGhvdXQgYW4gXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIioqXCIuXG4gICAgLy8gMi4gXCJ3YXRjaFwiIHNldHRpbmcgd2l0aCBhbiBlbXB0eSBcImluY2x1ZGVcIiBrZXk/IFdlIGRlZmF1bHQgdG8gb2JzZXJ2aW5nIFwiKipcIi5cbiAgICAvLyAzLiBOb24tZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBKdXN0IHVzZSB0aGUgXCJpbmNsdWRlXCIga2V5LlxuICAgIGNvbnN0IHdhdGNoSW5jbHVkZXMgPSBvcHRpb25zLmluY2x1ZGUgPz8gW107XG4gICAgaWYgKHdhdGNoSW5jbHVkZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHdhdGNoSW5jbHVkZXMucHVzaCgnKionKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIFwiZXhjbHVkZVwiIHNldHRpbmcsIHRoZSBiZWhhdmlvciBpcyB0byBhZGQgc29tZSBkZWZhdWx0IGV4Y2x1ZGVzIGluIGFkZGl0aW9uIHRvXG4gICAgLy8gcGF0dGVybnMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHNlbnNpYmxlIGRlZmF1bHQgcGF0dGVybnM6XG4gICAgY29uc3Qgd2F0Y2hFeGNsdWRlcyA9IG9wdGlvbnMuZXhjbHVkZSA/PyBbLi4uV0FUQ0hfRVhDTFVERV9ERUZBVUxUU107XG4gICAgLy8gMS4gVGhlIENESyBvdXRwdXQgZGlyZWN0b3J5LCBpZiBpdCBpcyB1bmRlciB0aGUgcm9vdERpclxuICAgIGNvbnN0IHJlbGF0aXZlT3V0RGlyID0gcGF0aC5yZWxhdGl2ZShyb290RGlyLCBhc3NlbWJseS5kaXJlY3RvcnkpO1xuICAgIGlmIChCb29sZWFuKHJlbGF0aXZlT3V0RGlyICYmICFyZWxhdGl2ZU91dERpci5zdGFydHNXaXRoKCcuLicgKyBwYXRoLnNlcCkgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZU91dERpcikpKSB7XG4gICAgICB3YXRjaEV4Y2x1ZGVzLnB1c2goYCR7cmVsYXRpdmVPdXREaXJ9LyoqYCk7XG4gICAgfVxuICAgIC8vIDIuIEFueSBmaWxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgd2F0Y2hFeGNsdWRlcy5wdXNoKCcuKicsICcqKi8uKicpO1xuICAgIC8vIDMuIEFueSBkaXJlY3RvcnkncyBjb250ZW50IHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgd2F0Y2hFeGNsdWRlcy5wdXNoKCcqKi8uKi8qKicpO1xuICAgIC8vIDQuIEFueSBub2RlX21vZHVsZXMgYW5kIGl0cyBjb250ZW50IChldmVuIGlmIGl0J3Mgbm90IGEgSlMvVFMgcHJvamVjdCwgeW91IG1pZ2h0IGJlIHVzaW5nIGEgbG9jYWwgYXdzLWNsaSBwYWNrYWdlKVxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnKiovbm9kZV9tb2R1bGVzLyoqJyk7XG5cbiAgICAvLyBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIG9uIGNvbXB1dGVkIHNldHRpbmdzXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEwLm1zZyhbXG4gICAgICBgcm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgJ3dhdGNoJyBpczogJHtyb290RGlyfWAsXG4gICAgICBgJ2luY2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoSW5jbHVkZXMpfWAsXG4gICAgICBgJ2V4Y2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoRXhjbHVkZXMpfWAsXG4gICAgXS5qb2luKCdcXG4nKSwge1xuICAgICAgd2F0Y2hEaXI6IHJvb3REaXIsXG4gICAgICBpbmNsdWRlczogd2F0Y2hJbmNsdWRlcyxcbiAgICAgIGV4Y2x1ZGVzOiB3YXRjaEV4Y2x1ZGVzLFxuICAgIH0pKTtcblxuICAgIC8vIFNpbmNlICdjZGsgZGVwbG95JyBpcyBhIHJlbGF0aXZlbHkgc2xvdyBvcGVyYXRpb24gZm9yIGEgJ3dhdGNoJyBwcm9jZXNzLFxuICAgIC8vIGludHJvZHVjZSBhIGNvbmN1cnJlbmN5IGxhdGNoIHRoYXQgdHJhY2tzIHRoZSBzdGF0ZS5cbiAgICAvLyBUaGlzIHdheSwgaWYgZmlsZSBjaGFuZ2UgZXZlbnRzIGFycml2ZSB3aGVuIGEgJ2NkayBkZXBsb3knIGlzIHN0aWxsIGV4ZWN1dGluZyxcbiAgICAvLyB3ZSB3aWxsIGJhdGNoIHRoZW0sIGFuZCB0cmlnZ2VyIGFub3RoZXIgJ2NkayBkZXBsb3knIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlcyxcbiAgICAvLyBtYWtpbmcgc3VyZSAnY2RrIGRlcGxveSdzICBhbHdheXMgZXhlY3V0ZSBvbmUgYXQgYSB0aW1lLlxuICAgIC8vIEhlcmUncyBhIGRpYWdyYW0gc2hvd2luZyB0aGUgc3RhdGUgdHJhbnNpdGlvbnM6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICBmaWxlIGNoYW5nZWRcbiAgICAvLyB8ICAgICAgICAgICAgfCAgcmVhZHkgZXZlbnQgICB8ICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS18XG4gICAgLy8gfCBwcmUtcmVhZHkgIHwgLS0tLS0tLS0tLS0tLT4gfCBvcGVuIHwgICAgICAgICAgICAgICAgICAgICB8IGRlcGxveWluZyAgfCAgICAgICAgICAgICAgICAgICAgIHwgICBxdWV1ZWQgICB8ICAgICAgICAgICAgICAgfFxuICAgIC8vIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLXxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS1cbiAgICB0eXBlIExhdGNoU3RhdGUgPSAncHJlLXJlYWR5JyB8ICdvcGVuJyB8ICdkZXBsb3lpbmcnIHwgJ3F1ZXVlZCc7XG4gICAgbGV0IGxhdGNoOiBMYXRjaFN0YXRlID0gJ3ByZS1yZWFkeSc7XG5cbiAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMudHJhY2VMb2dzID8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoeyBpb0hlbHBlciB9KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZXBsb3lBbmRXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxhdGNoID0gJ2RlcGxveWluZycgYXMgTGF0Y2hTdGF0ZTtcbiAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG5cbiAgICAgIC8vIElmIGxhdGNoIGlzIHN0aWxsICdkZXBsb3lpbmcnIGFmdGVyIHRoZSAnYXdhaXQnLCB0aGF0J3MgZmluZSxcbiAgICAgIC8vIGJ1dCBpZiBpdCdzICdxdWV1ZWQnLCB0aGF0IG1lYW5zIHdlIG5lZWQgdG8gZGVwbG95IGFnYWluXG4gICAgICB3aGlsZSAobGF0Y2ggPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCByZWFsaXplIGxhdGNoIGNhbiBjaGFuZ2UgYmV0d2VlbiAnYXdhaXRzJyxcbiAgICAgICAgLy8gYW5kIHRoaW5rcyB0aGUgYWJvdmUgJ3doaWxlJyBjb25kaXRpb24gaXMgYWx3YXlzICdmYWxzZScgd2l0aG91dCB0aGUgY2FzdFxuICAgICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTUubXNnKFwiRGV0ZWN0ZWQgZmlsZSBjaGFuZ2VzIGR1cmluZyBkZXBsb3ltZW50LiBJbnZva2luZyAnY2RrIGRlcGxveScgYWdhaW5cIikpO1xuICAgICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuICAgICAgfVxuICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICBhd2FpdCBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uYWN0aXZhdGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGlnbm9yZSBtYXRjaGVyIGZvciBjaG9raWRhciB2NCBjb21wYXRpYmlsaXR5XG4gICAgLy8gQ2hva2lkYXIgdjQgcmVtb3ZlZCBnbG9iIHBhdHRlcm4gc3VwcG9ydCwgc28gd2UgdXNlIHBpY29tYXRjaCB0byBmaWx0ZXIgZmlsZXNcbiAgICAvLyBXZSBwYXNzIHJvb3REaXIgYmVjYXVzZSBjaG9raWRhciB2NCBwYXNzZXMgYWJzb2x1dGUgcGF0aHMgdG8gdGhlIGlnbm9yZWQgY2FsbGJhY2tcbiAgICBjb25zdCBzaG91bGRJZ25vcmUgPSBjcmVhdGVJZ25vcmVNYXRjaGVyKHtcbiAgICAgIGluY2x1ZGU6IHdhdGNoSW5jbHVkZXMsXG4gICAgICBleGNsdWRlOiB3YXRjaEV4Y2x1ZGVzLFxuICAgICAgcm9vdERpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhclxuICAgICAgLndhdGNoKCcuJywge1xuICAgICAgICBpZ25vcmVkOiBzaG91bGRJZ25vcmUsXG4gICAgICAgIGN3ZDogcm9vdERpcixcbiAgICAgIH0pXG4gICAgICAub24oJ3JlYWR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsYXRjaCA9ICdvcGVuJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoXCInd2F0Y2gnIHJlY2VpdmVkIHRoZSAncmVhZHknIGV2ZW50LiBGcm9tIG5vdyBvbiwgYWxsIGZpbGUgY2hhbmdlcyB3aWxsIHRyaWdnZXIgYSBkZXBsb3ltZW50XCIpO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTQubXNnKFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKSk7XG4gICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQ6IEV2ZW50TmFtZSwgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IG5vbi1maWxlIGV2ZW50cyAoZS5nLiwgJ2Vycm9yJywgJ3JhdycsICdyZWFkeScsICdhbGwnKVxuICAgICAgICAvLyBUaGVzZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IG9yIG5vdCByZWxldmFudCBmb3Igd2F0Y2ggZGVwbG95bWVudHNcbiAgICAgICAgaWYgKCFpc0ZpbGVFdmVudChldmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2F0Y2hFdmVudCA9IHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGxhdGNoID09PSAncHJlLXJlYWR5Jykge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMS5tc2coYCd3YXRjaCcgaXMgb2JzZXJ2aW5nICR7ZXZlbnQgPT09ICdhZGREaXInID8gJ2RpcmVjdG9yeScgOiAndGhlIGZpbGUnfSAnJHtmaWxlUGF0aH0nIGZvciBjaGFuZ2VzYCwgd2F0Y2hFdmVudCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhdGNoID09PSAnb3BlbicpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTIubXNnKGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pLiBUcmlnZ2VyaW5nICdjZGsgZGVwbG95J2AsIHdhdGNoRXZlbnQpKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgbWVhbnMgbGF0Y2ggaXMgZWl0aGVyICdkZXBsb3lpbmcnIG9yICdxdWV1ZWQnXG4gICAgICAgICAgbGF0Y2ggPSAncXVldWVkJztcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTMubXNnKFxuICAgICAgICAgICAgYERldGVjdGVkIGNoYW5nZSB0byAnJHtmaWxlUGF0aH0nICh0eXBlOiAke2V2ZW50fSkgd2hpbGUgJ2NkayBkZXBsb3knIGlzIHN0aWxsIHJ1bm5pbmcuIFdpbGwgcXVldWUgZm9yIGFub3RoZXIgZGVwbG95bWVudCBhZnRlciB0aGlzIG9uZSBmaW5pc2hlcydgLFxuICAgICAgICAgICAgd2F0Y2hFdmVudCxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzdG9wcGVkUHJvbWlzZSA9IHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXN5bmMgZGlzcG9zZSgpIHtcbiAgICAgICAgLy8gc3RvcCB0aGUgbG9ncyBtb25pdG9yLCBpZiBpdCBleGlzdHNcbiAgICAgICAgYXdhaXQgY2xvdWRXYXRjaExvZ01vbml0b3I/LmRlYWN0aXZhdGUoKTtcbiAgICAgICAgLy8gY2xvc2UgdGhlIHdhdGNoZXIgaXRzZWxmXG4gICAgICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgICAgc3RvcHBlZFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm4gc3RvcHBlZFByb21pc2UucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyB3YWl0Rm9yRW5kKCkge1xuICAgICAgICByZXR1cm4gc3RvcHBlZFByb21pc2UucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgSVdhdGNoZXI7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgQWN0aW9uXG4gICAqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHNlbGVjdGVkIHN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByb2xsYmFjayhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSb2xsYmFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3JvbGxiYWNrJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCAncm9sbGJhY2snLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgcm9sbGJhY2sgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBvciB3YXRjaCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9yb2xsYmFjayhhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAncm9sbGJhY2snIHwgJ2RlcGxveScgfCAnd2F0Y2gnLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrUmVzdWx0PiB7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhyb3dJZlZhbGlkYXRpb25GYWlsdXJlcyhhc3NlbWJseSwgc3RhY2tzLCB0aGlzLmFzc2VtYmx5RmFpbHVyZUF0LCBpb0hlbHBlcik7XG5cbiAgICBjb25zdCByZXQ6IFJvbGxiYWNrUmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrcy5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTYwMDEubXNnKCdObyBzdGFja3Mgc2VsZWN0ZWQnKSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGxldCBhbnlSb2xsYmFja2FibGUgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGFja10gb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgcm9sbGJhY2tTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlJPTExCQUNLX1NUQUNLKS5iZWdpbihgUm9sbGluZyBiYWNrICR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9YCwge1xuICAgICAgICB0b3RhbDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICAgIGN1cnJlbnQ6IGluZGV4ICsgMSxcbiAgICAgICAgc3RhY2ssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncm9sbGJhY2snKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YWNrUmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICBvcnBoYW5GYWlsZWRSZXNvdXJjZXM6IG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzLFxuICAgICAgICAgIHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uOiBvcHRpb25zLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uLFxuICAgICAgICAgIG9ycGhhbkxvZ2ljYWxJZHM6IG9wdGlvbnMub3JwaGFuTG9naWNhbElkcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghc3RhY2tSZXN1bHQubm90SW5Sb2xsYmFja2FibGVTdGF0ZSkge1xuICAgICAgICAgIGFueVJvbGxiYWNrYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcm9sbGJhY2tTcGFuLmVuZCgpO1xuXG4gICAgICAgIHJldC5zdGFja3MucHVzaCh7XG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICAgICAgICByZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YWNrTmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgIHN0YWNrQXJuOiBzdGFja1Jlc3VsdC5zdGFja0FybixcbiAgICAgICAgICByZXN1bHQ6IHN0YWNrUmVzdWx0Lm5vdEluUm9sbGJhY2thYmxlU3RhdGUgPyAnYWxyZWFkeS1zdGFibGUnIDogJ3JvbGxlZC1iYWNrJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U2OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX0gZmFpbGVkOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gLCB7IGVycm9yOiBlIH0pKTtcbiAgICAgICAgdGhyb3cgVG9vbGtpdEVycm9yLndpdGhDYXVzZSgnUm9sbGJhY2tGYWlsZWQnLCAnUm9sbGJhY2sgZmFpbGVkICh1c2UgLS1mb3JjZSB0byBvcnBoYW4gZmFpbGluZyByZXNvdXJjZXMpJywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYW55Um9sbGJhY2thYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdOb1JvbGxiYWNrYWJsZVN0YWNrcycsICdObyBzdGFja3Mgd2VyZSBpbiBhIHN0YXRlIHRoYXQgY291bGQgYmUgcm9sbGVkIGJhY2snKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ycGhhbiBBY3Rpb24uIERldGFjaGVzIHJlc291cmNlcyBmcm9tIGEgQ2xvdWRGb3JtYXRpb24gc3RhY2sgd2l0aG91dCBkZWxldGluZyB0aGVtLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9ycGhhbihjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IE9ycGhhbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ29ycGhhbicpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnb3JwaGFuJyk7XG5cbiAgICAvLyBQYXJzZSBjb25zdHJ1Y3QgcGF0aHMgaW50byBzdGFjayBjb25zdHJ1Y3QgSUQgKyBjb25zdHJ1Y3QtbGV2ZWwgcGF0aHMuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VBbmRWYWxpZGF0ZUNvbnN0cnVjdFBhdGhzKG9wdGlvbnMuY29uc3RydWN0UGF0aHMpO1xuXG4gICAgLy8gU3ludGggYWxsIHN0YWNrcywgdGhlbiBmaW5kIHRoZSBvbmUgd2hvc2UgaGllcmFyY2hpY2FsSWQgbWF0Y2hlcyB0aGUgc3RhY2sgY29uc3RydWN0IElELlxuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgQUxMX1NUQUNLUyk7XG4gICAgY29uc3QgYWxsU3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoQUxMX1NUQUNLUyk7XG4gICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3Muc3RhY2tBcnRpZmFjdHMuZmluZChzID0+IHMuaGllcmFyY2hpY2FsSWQgPT09IHBhcnNlZC5zdGFja0lkKTtcblxuICAgIGlmICghc3RhY2spIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICdTdGFja05vdEZvdW5kJyxcbiAgICAgICAgYE5vIHN0YWNrIGZvdW5kIHdpdGggY29uc3RydWN0IElEICcke3BhcnNlZC5zdGFja0lkfScuIEF2YWlsYWJsZSBzdGFja3M6ICR7YWxsU3RhY2tzLnN0YWNrQXJ0aWZhY3RzLm1hcChzID0+IHMuaGllcmFyY2hpY2FsSWQpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignb3JwaGFuJyk7XG5cbiAgICBjb25zdCBvcnBoYW5lciA9IG5ldyBSZXNvdXJjZU9ycGhhbmVyKHtcbiAgICAgIGRlcGxveW1lbnRzLFxuICAgICAgaW9IZWxwZXIsXG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICB0b29sa2l0U3RhY2tOYW1lOiBvcHRpb25zLnRvb2xraXRTdGFja05hbWUgPz8gdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGxhbiA9IGF3YWl0IG9ycGhhbmVyLm1ha2VQbGFuKHN0YWNrLCBwYXJzZWQuY29uc3RydWN0UGF0aHMpO1xuXG4gICAgLy8gU2hvdyB0aGUgcGxhblxuICAgIGNvbnN0IHJlc291cmNlTGluZXMgPSBwbGFuLm9ycGhhbmVkUmVzb3VyY2VzXG4gICAgICAubWFwKChyKSA9PiBgICAke3IubG9naWNhbElkfSAoJHtyLnJlc291cmNlVHlwZX0pIC0gJHtyLmNka1BhdGh9YClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKFxuICAgICAgYFN0YWNrOiAke3BsYW4uc3RhY2tOYW1lfVxcbmAgK1xuICAgICAgYFJlc291cmNlcyB0byBvcnBoYW4gKCR7cGxhbi5vcnBoYW5lZFJlc291cmNlcy5sZW5ndGh9KTpcXG5gICtcbiAgICAgIHJlc291cmNlTGluZXMsXG4gICAgKTtcblxuICAgIC8vIENvbmZpcm0gYmVmb3JlIG9ycGhhbmluZ1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JODgxMC5yZXEoXG4gICAgICAnRG8geW91IHdpc2ggdG8gb3JwaGFuIHRoZXNlIHJlc291cmNlcz8gVGhpcyB3aWxsIHBlcmZvcm0gMyBDbG91ZEZvcm1hdGlvbiBkZXBsb3ltZW50cy4nLCB7XG4gICAgICAgIG1vdGl2YXRpb246ICdVc2VyIGNvbmZpcm1hdGlvbiBpcyBuZWVkZWQgYmVmb3JlIG9ycGhhbmluZyByZXNvdXJjZXMnLFxuICAgICAgfSkpO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdPcnBoYW5BYm9ydGVkJywgJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYW4uZXhlY3V0ZSgpO1xuXG4gICAgLy8gT3V0cHV0IG5leHQgc3RlcHNcbiAgICBjb25zdCBtYXBwaW5nSnNvbiA9IE9iamVjdC5rZXlzKHJlc3VsdC5yZXNvdXJjZU1hcHBpbmcpLmxlbmd0aCA+IDBcbiAgICAgID8gYCAtLXJlc291cmNlLW1hcHBpbmctaW5saW5lICcke0pTT04uc3RyaW5naWZ5KHJlc3VsdC5yZXNvdXJjZU1hcHBpbmcpfSdgXG4gICAgICA6ICcnO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oXG4gICAgICBg4pyFIFJlc291cmNlcyBvcnBoYW5lZCBmcm9tICR7cGxhbi5zdGFja05hbWV9XFxuXFxuYCArXG4gICAgICAnTmV4dCBzdGVwczpcXG4nICtcbiAgICAgICcgIDEuIFVwZGF0ZSB5b3VyIENESyBjb2RlIHRvIHVzZSB0aGUgbmV3IHJlc291cmNlIHR5cGVcXG4nICtcbiAgICAgIGAgIDIuIGNkayBpbXBvcnQke21hcHBpbmdKc29ufWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZhY3RvciBBY3Rpb24uIE1vdmVzIHJlc291cmNlcyBmcm9tIG9uZSBsb2NhdGlvbiAoc3RhY2sgKyBsb2dpY2FsIElEKSB0byBhbm90aGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZmFjdG9yKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogUmVmYWN0b3JPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ3JlZmFjdG9yJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdyZWZhY3RvcicpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmYWN0b3IoYXNzZW1ibHksIGlvSGVscGVyLCBjeCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWZhY3Rvcihhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgaW9IZWxwZXI6IElvSGVscGVyLCBjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJlZmFjdG9yT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdyZWZhY3RvcicpO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICBjb25zdCBncm91cHMgPSBhd2FpdCBncm91cFN0YWNrcyhzZGtQcm92aWRlciwgc2VsZWN0ZWRTdGFja3Muc3RhY2tBcnRpZmFjdHMsIG9wdGlvbnMuYWRkaXRpb25hbFN0YWNrTmFtZXMgPz8gW10pO1xuXG4gICAgZm9yIChsZXQgeyBlbnZpcm9ubWVudCwgbG9jYWxTdGFja3MsIGRlcGxveWVkU3RhY2tzIH0gb2YgZ3JvdXBzKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGZvcm1hdEVudmlyb25tZW50U2VjdGlvbkhlYWRlcihlbnZpcm9ubWVudCkpO1xuXG4gICAgICBjb25zdCBuZXdTdGFja3MgPSBsb2NhbFN0YWNrcy5maWx0ZXIocyA9PiAhZGVwbG95ZWRTdGFja3MubWFwKHQgPT4gdC5zdGFja05hbWUpLmluY2x1ZGVzKHMuc3RhY2tOYW1lKSk7XG4gICAgICBpZiAobmV3U3RhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLypcbiAgICAgICAgIFdoZW4gdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrIHJlZmFjdG9yIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHN0YWNrLCBhbmQgdGhlIHJlc291cmNlcyBiZWluZyBtb3ZlZCB0byB0aGF0XG4gICAgICAgICBuZXcgc3RhY2sgaGF2ZSByZWZlcmVuY2VzIHRvIG90aGVyIHJlc291cmNlcywgQ2xvdWRGb3JtYXRpb24gbmVlZHMgdG8gZG8gd2hhdCB0aGV5IGNhbGwgXCJjb2xsYXBzaW5nIHRoZVxuICAgICAgICAgdGVtcGxhdGVcIi4gVGhlIGRldGFpbHMgZG9uJ3QgcmVhbGx5IG1hdHRlciwgZXhjZXB0IHRoYXQsIGluIHRoZSBwcm9jZXNzLCBpdCBjYWxscyBzb21lIHNlcnZpY2UgQVBJcywgdG8gcmVhZFxuICAgICAgICAgdGhlIHJlc291cmNlcyBiZWluZyBtb3ZlZC4gVGhlIHJvbGUgaXQgdXNlcyB0byBjYWxsIHRoZXNlIEFQSXMgaW50ZXJuYWxseSBpcyB0aGUgcm9sZSB0aGUgdXNlciBjYWxsZWQgdGhlXG4gICAgICAgICBzdGFjayByZWZhY3RvcmluZyBBUEkgd2l0aCwgd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnQgcm9sZSwgZnJvbSB0aGUgYm9vdHN0cmFwIHN0YWNrLFxuICAgICAgICAgYnkgZGVmYXVsdC5cblxuICAgICAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGlzIHJvbGUgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0byByZWFkIGFsbCByZXNvdXJjZSB0eXBlcy4gSW4gdGhpcyBjYXNlLFxuICAgICAgICAgQ2xvdWRGb3JtYXRpb24gd2lsbCByb2xsIGJhY2sgdGhlIHJlZmFjdG9yIG9wZXJhdGlvbi4gU2luY2UgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlIEFQSSwgdGhhdFxuICAgICAgICAgdGhlIHVzZXIgY2Fubm90IGtub3cgYWJvdXQsIGFuZCBkaWRuJ3QgYXNrIGZvciwgaXQgd2lsbCBiZSB2ZXJ5IHN1cnByaXNpbmcuIFNvIHdlJ3ZlIGRlY2lkZWQgdG8gYmxvY2sgdGhpcyB1c2VcbiAgICAgICAgIGNhc2UgdW50aWwgQ2xvdWRGb3JtYXRpb24gc3VwcG9ydHMgcGFzc2luZyBhIGRpZmZlcmVudCByb2xlIHRvIHVzZSBmb3IgdGhlc2UgcmVhZCBvcGVyYXRpb25zLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgd2l0aCBkZXBsb3ltZW50LlxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaGUgZm9sbG93aW5nIHN0YWNrJHtuZXdTdGFja3MubGVuZ3RoID09PSAxID8gJyBpcycgOiAncyBhcmUnfSBuZXc6ICR7bmV3U3RhY2tzLm1hcChzID0+IHMuc3RhY2tOYW1lKS5qb2luKCcsICcpfVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ0NyZWF0aW9uIG9mIG5ldyBzdGFja3MgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHJlZmFjdG9yIGNvbW1hbmQuICc7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1BsZWFzZSBkZXBsb3kgYW55IG5ldyBzdGFja3Mgc2VwYXJhdGVseSBiZWZvcmUgcmVmYWN0b3JpbmcgeW91ciBzdGFja3MuJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoY2hhbGsucmVkKG1lc3NhZ2UpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgUmVmYWN0b3JpbmdDb250ZXh0KHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBkZXBsb3llZFN0YWNrcyxcbiAgICAgICAgICBsb2NhbFN0YWNrcyxcbiAgICAgICAgICBhc3N1bWVSb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgb3ZlcnJpZGVzOiBnZXRPdmVycmlkZXMoZW52aXJvbm1lbnQsIGRlcGxveWVkU3RhY2tzLCBsb2NhbFN0YWNrcyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG1hcHBpbmdzID0gY29udGV4dC5tYXBwaW5ncztcblxuICAgICAgICBpZiAobWFwcGluZ3MubGVuZ3RoID09PSAwICYmIGNvbnRleHQuYW1iaWd1b3VzUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnTm90aGluZyB0byByZWZhY3Rvci4nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGVkTWFwcGluZ3MgPSBtYXBwaW5nc1xuICAgICAgICAgIC5tYXAobSA9PiBtLnRvVHlwZWRNYXBwaW5nKCkpXG4gICAgICAgICAgLmZpbHRlcihtID0+IG0udHlwZSAhPT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpO1xuXG4gICAgICAgIGxldCByZWZhY3Rvck1lc3NhZ2UgPSBmb3JtYXRUeXBlZE1hcHBpbmdzKHR5cGVkTWFwcGluZ3MpO1xuICAgICAgICBjb25zdCByZWZhY3RvclJlc3VsdDogUmVmYWN0b3JSZXN1bHQgPSB7IHR5cGVkTWFwcGluZ3MgfTtcblxuICAgICAgICBjb25zdCBzdGFja0RlZmluaXRpb25zID0gYXdhaXQgZ2VuZXJhdGVTdGFja0RlZmluaXRpb25zKG1hcHBpbmdzLCBkZXBsb3llZFN0YWNrcywgbG9jYWxTdGFja3MsIGVudmlyb25tZW50LCBzZGtQcm92aWRlciwgaW9IZWxwZXIpO1xuXG4gICAgICAgIGlmIChjb250ZXh0LmFtYmlndW91c1BhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwYXRocyA9IGNvbnRleHQuYW1iaWd1b3VzUGF0aHM7XG4gICAgICAgICAgcmVmYWN0b3JNZXNzYWdlICs9ICdcXG4nICsgZm9ybWF0QW1iaWd1b3VzTWFwcGluZ3MocGF0aHMpO1xuICAgICAgICAgIHJlZmFjdG9yUmVzdWx0LmFtYmlndW91c1BhdGhzID0gcGF0aHM7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTg5MDAubXNnKHJlZmFjdG9yTWVzc2FnZSwgcmVmYWN0b3JSZXN1bHQpKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4gfHwgY29udGV4dC5tYXBwaW5ncy5sZW5ndGggPT09IDAgfHwgY29udGV4dC5hbWJpZ3VvdXNQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRvLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gaW50ZXJhY3RpdmUgbW9kZSAoVFRZKSB3ZSBuZWVkIGNvbmZpcm1hdGlvbiBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkgJiYgIWF3YWl0IGNvbmZpcm0ob3B0aW9ucy5mb3JjZSA/PyBmYWxzZSkpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGNoYWxrLnJlZChgUmVmYWN0b3JpbmcgY2FuY2VsZWQgZm9yIGVudmlyb25tZW50IGF3czovLyR7ZW52aXJvbm1lbnQuYWNjb3VudH0vJHtlbnZpcm9ubWVudC5yZWdpb259XFxuYCkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnUmVmYWN0b3JpbmcuLi4nKTtcbiAgICAgICAgYXdhaXQgY29udGV4dC5leGVjdXRlKHN0YWNrRGVmaW5pdGlvbnMsIHNka1Byb3ZpZGVyLCBpb0hlbHBlcik7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ+KchSAgU3RhY2sgcmVmYWN0b3IgY29tcGxldGUnKTtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdEZXBsb3lpbmcgdXBkYXRlZCBzdGFja3MgdG8gZmluYWxpemUgcmVmYWN0b3IuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXBsb3koY3gsIHtcbiAgICAgICAgICBzdGFja3M6IEFMTF9TVEFDS1MsXG4gICAgICAgICAgZm9yY2VEZXBsb3ltZW50OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYOKdjCAgUmVmYWN0b3IgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGUpfWA7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FODkwMC5tc2cobWVzc2FnZSwgeyBlcnJvcjogZSB9KSk7XG5cbiAgICAgICAgLy8gQWxzbyBkZWJ1Z2dpbmcgdGhlIGVycm9yLCBiZWNhdXNlIHRoZSBBUEkgZG9lcyBub3QgYWx3YXlzIHJldHVybiBhIHVzZXItZnJpZW5kbHkgbWVzc2FnZVxuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE92ZXJyaWRlcyhlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsIGRlcGxveWVkU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sIGxvY2FsU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pIHtcbiAgICAgIGNvbnN0IG1hcHBpbmdHcm91cCA9IG9wdGlvbnMub3ZlcnJpZGVzXG4gICAgICAgID8uZmluZChnID0+IGcucmVnaW9uID09PSBlbnZpcm9ubWVudC5yZWdpb24gJiYgZy5hY2NvdW50ID09PSBlbnZpcm9ubWVudC5hY2NvdW50KTtcblxuICAgICAgcmV0dXJuIG1hcHBpbmdHcm91cCA9PSBudWxsXG4gICAgICAgID8gW11cbiAgICAgICAgOiBPYmplY3QuZW50cmllcyhtYXBwaW5nR3JvdXAucmVzb3VyY2VzID8/IHt9KVxuICAgICAgICAgIC5tYXAoKFtzb3VyY2UsIGRlc3RpbmF0aW9uXSkgPT4gbmV3IFJlc291cmNlTWFwcGluZyhcbiAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24oc291cmNlLCBkZXBsb3llZFN0YWNrcyksXG4gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKGRlc3RpbmF0aW9uLCBsb2NhbFN0YWNrcyksXG4gICAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UmVzb3VyY2VMb2NhdGlvbihsb2NhdGlvbjogc3RyaW5nLCBzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFJlc291cmNlTG9jYXRpb24ge1xuICAgICAgZm9yIChsZXQgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgICAgIGNvbnN0IFtzdGFja05hbWUsIGxvZ2ljYWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICBpZiAoc3RhY2tOYW1lICE9IG51bGwgJiYgbG9naWNhbElkICE9IG51bGwgJiYgc3RhY2suc3RhY2tOYW1lID09PSBzdGFja05hbWUgJiYgc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzPy5bbG9naWNhbElkXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUxvY2F0aW9uKHN0YWNrLCBsb2dpY2FsSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlRW50cnkgPSBPYmplY3RcbiAgICAgICAgICAgIC5lbnRyaWVzKHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSlcbiAgICAgICAgICAgIC5maW5kKChbXywgcl0pID0+IHIuTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ10gPT09IGxvY2F0aW9uKTtcbiAgICAgICAgICBpZiAocmVzb3VyY2VFbnRyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTG9jYXRpb24oc3RhY2ssIHJlc291cmNlRW50cnlbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVzb3VyY2VMb2NhdGlvbk5vdEZvdW5kJywgYENhbm5vdCBmaW5kIHJlc291cmNlIGluIGxvY2F0aW9uICR7bG9jYXRpb259YCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY29uZmlybShmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgLy8gJ2ZvcmNlJyBpcyBzZXQgdG8gdHJ1ZSBpcyB0aGUgZXF1aXZhbGVudCBvZiBoYXZpbmcgcHJlLWFwcHJvdmFsIGZvciBhbnkgcmVmYWN0b3JcbiAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlc3Rpb24gPSAnRG8geW91IHdpc2ggdG8gcmVmYWN0b3IgdGhlc2UgcmVzb3VyY2VzPyc7XG4gICAgICByZXR1cm4gaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k4OTEwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICBtb3RpdmF0aW9uOiAnVXNlciBpbnB1dCBpcyBuZWVkZWQnLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yOiBhbnkpOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAocGF5bG9hZC5yZWFzb24/LlN0YXR1c1JlYXNvbikge1xuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYFJlZmFjdG9yIGNyZWF0aW9uOiBbJHtwYXlsb2FkLnJlYXNvbj8uU3RhdHVzfV0gJHtwYXlsb2FkLnJlYXNvbi5TdGF0dXNSZWFzb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQucmVhc29uPy5FeGVjdXRpb25TdGF0dXNSZWFzb24pIHtcbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKGBSZWZhY3RvciBleGVjdXRpb246IFske3BheWxvYWQucmVhc29uPy5TdGF0dXN9XSAke3BheWxvYWQucmVhc29uLkV4ZWN1dGlvblN0YXR1c1JlYXNvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXMubGVuZ3RoID4gMCA/IG1lc3NhZ2VzLmpvaW4oJ1xcbicpIDogYFVua25vd24gZXJyb3IgKFN0YWNrIHJlZmFjdG9yIElEOiAke3BheWxvYWQucmVhc29uPy5TdGFja1JlZmFjdG9ySWQgPz8gJ3Vua25vd24nfSlgO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBBY3Rpb25cbiAgICpcbiAgICogRGVzdHJveXMgdGhlIHNlbGVjdGVkIFN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGVzdHJveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RGVzdHJveVJlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Rlc3Ryb3knKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHN0YWNrc09wdChvcHRpb25zKSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXN0cm95Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlc3Ryb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlcGxveSBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kZXN0cm95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ2Rlc3Ryb3knLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyk6IFByb21pc2U8RGVzdHJveVJlc3VsdD4ge1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IHJldDogRGVzdHJveVJlc3VsdCA9IHtcbiAgICAgIHN0YWNrczogW10sXG4gICAgfTtcblxuICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnRGVzdHJveWluZyBzdGFja3MgaXMgYW4gaXJyZXZlcnNpYmxlIGFjdGlvbic7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTogJHtjaGFsay5yZWQoc3RhY2tzLmhpZXJhcmNoaWNhbElkcy5qb2luKCcsICcpKX1gO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNzAxMC5yZXEocXVlc3Rpb24sIHsgbW90aXZhdGlvbiB9KSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNzAxMC5tc2coJ0Fib3J0ZWQgYnkgdXNlcicpKTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5IHx8IDE7XG4gICAgbGV0IGRlc3Ryb3lDb3VudCA9IDA7XG5cbiAgICBjb25zdCBkZXN0cm95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVNUUk9ZX0FDVElPTikuYmVnaW4oe1xuICAgICAgc3RhY2tzOiBzdGFja3Muc3RhY2tBcnRpZmFjdHMsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc3Ryb3lTdGFjayA9IGFzeW5jIChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrTm9kZS5zdGFjaztcbiAgICAgICAgZGVzdHJveUNvdW50Kys7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2luZ2xlRGVzdHJveVNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uREVTVFJPWV9TVEFDSylcbiAgICAgICAgICAgIC5iZWdpbihjaGFsay5ncmVlbihgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06IGRlc3Ryb3lpbmcuLi4gWyR7ZGVzdHJveUNvdW50fS8ke3N0YWNrcy5zdGFja0NvdW50fV1gKSwge1xuICAgICAgICAgICAgICB0b3RhbDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICAgICAgICAgIGN1cnJlbnQ6IGRlc3Ryb3lDb3VudCxcbiAgICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50cy5kZXN0cm95U3RhY2soe1xuICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXQuc3RhY2tzLnB1c2goe1xuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgYWNjb3VudDogc3RhY2suZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgICAgICAgICAgcmVnaW9uOiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICBzdGFja0FybjogcmVzdWx0LnN0YWNrQXJuLFxuICAgICAgICAgICAgc3RhY2tFeGlzdGVkOiByZXN1bHQuc3RhY2tBcm4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNzkwMC5tc2coY2hhbGsuZ3JlZW4oYFxcbiDinIUgICR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiAke2FjdGlvbn1lZGApLCBzdGFjaykpO1xuICAgICAgICAgIGF3YWl0IHNpbmdsZURlc3Ryb3lTcGFuLmVuZCgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTc5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259IGZhaWxlZCAke2V9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgd29ya0dyYXBoID0gYnVpbGREZXN0cm95V29ya0dyYXBoKHN0YWNrcy5zdGFja0FydGlmYWN0cywgaW9IZWxwZXIpO1xuICAgICAgYXdhaXQgd29ya0dyYXBoLnByb2Nlc3NTdGFja3MoY29uY3VycmVuY3ksIGRlc3Ryb3lTdGFjayk7XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRlc3Ryb3lTcGFuLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBkZXBsb3ltZW50cyBjbGFzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPERlcGxveW1lbnRzPiB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50cyh7XG4gICAgICBzZGtQcm92aWRlcjogYXdhaXQgdGhpcy5zZGtQcm92aWRlcihhY3Rpb24pLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgaW9IZWxwZXI6IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludm9rZURlcGxveUZyb21XYXRjaChcbiAgICBhc3NlbWJseTogU3RhY2tBc3NlbWJseSxcbiAgICBvcHRpb25zOiBXYXRjaE9wdGlvbnMsXG4gICAgY2xvdWRXYXRjaExvZ01vbml0b3I/OiBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB3YXRjaCBkZWZhdWx0cyB0byBob3Rzd2FwIGRlcGxveW1lbnRcbiAgICBjb25zdCBkZXBsb3ltZW50TWV0aG9kID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kID8/IHsgbWV0aG9kOiAnaG90c3dhcCcgfTtcbiAgICBjb25zdCBkZXBsb3lPcHRpb25zOiBQcml2YXRlRGVwbG95T3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcixcbiAgICAgIGRlcGxveW1lbnRNZXRob2QsXG4gICAgICBleHRyYVVzZXJBZ2VudDogYGNkay13YXRjaC9ob3Rzd2FwLSR7ZGVwbG95bWVudE1ldGhvZC5tZXRob2QgPT09ICdob3Rzd2FwJyA/ICdvbicgOiAnb2ZmJ31gLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnd2F0Y2gnLCB6ZXJvVGltZSgpLCBkZXBsb3lPcHRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGp1c3QgY29udGludWUgLSBkZXBsb3kgd2lsbCBzaG93IHRoZSBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBmZWF0dXJlIGZsYWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmbGFncyhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UpOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ2ZsYWdzJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdmbGFncycpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCk7XG4gICAgY29uc3QgYXJ0aWZhY3RzID0gT2JqZWN0LnZhbHVlcyhhc3NlbWJseS5jbG91ZEFzc2VtYmx5Lm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSk7XG4gICAgY29uc3QgZmVhdHVyZUZsYWdSZXBvcnRzID0gYXJ0aWZhY3RzLmZpbHRlcihhID0+IGEudHlwZSA9PT0gQXJ0aWZhY3RUeXBlLkZFQVRVUkVfRkxBR19SRVBPUlQpO1xuXG4gICAgY29uc3QgZmxhZ3MgPSBmZWF0dXJlRmxhZ1JlcG9ydHMuZmxhdE1hcChyZXBvcnQgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHJlcG9ydC5wcm9wZXJ0aWVzIGFzIEZlYXR1cmVGbGFnUmVwb3J0UHJvcGVydGllcztcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBwcm9wZXJ0aWVzLm1vZHVsZTtcblxuICAgICAgY29uc3QgZmxhZ3NXaXRoVW5jb25maWd1cmVkQmVoYXZlc0xpa2UgPSBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLmZsYWdzKVxuICAgICAgICAuZmlsdGVyKChbXywgZmxhZ0luZm9dKSA9PiBmbGFnSW5mby51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSAhPSB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBzaG91bGRJbmNsdWRlVW5jb25maWd1cmVkQmVoYXZlc0xpa2UgPSBmbGFnc1dpdGhVbmNvbmZpZ3VyZWRCZWhhdmVzTGlrZS5sZW5ndGggPiAwO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5mbGFncykubWFwKChbZmxhZ05hbWUsIGZsYWdJbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlRmxhZyA9IHtcbiAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgbmFtZTogZmxhZ05hbWUsXG4gICAgICAgICAgcmVjb21tZW5kZWRWYWx1ZTogZmxhZ0luZm8ucmVjb21tZW5kZWRWYWx1ZSxcbiAgICAgICAgICB1c2VyVmFsdWU6IGZsYWdJbmZvLnVzZXJWYWx1ZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwbGFuYXRpb246IGZsYWdJbmZvLmV4cGxhbmF0aW9uID8/ICcnLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzaG91bGRJbmNsdWRlVW5jb25maWd1cmVkQmVoYXZlc0xpa2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZUZsYWcsXG4gICAgICAgICAgICB1bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZToge1xuICAgICAgICAgICAgICB2MjogZmxhZ0luZm8udW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyID8/IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhc2VGbGFnO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmxhZ3M7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVVbnN0YWJsZUZlYXR1cmUocmVxdWVzdGVkRmVhdHVyZTogVW5zdGFibGVGZWF0dXJlKSB7XG4gICAgaWYgKCF0aGlzLnVuc3RhYmxlRmVhdHVyZXMuaW5jbHVkZXMocmVxdWVzdGVkRmVhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1Vuc3RhYmxlRmVhdHVyZU5vdEVuYWJsZWQnLCBgVW5zdGFibGUgZmVhdHVyZSAnJHtyZXF1ZXN0ZWRGZWF0dXJlfScgaXMgbm90IGVuYWJsZWQuIFBsZWFzZSBlbmFibGUgaXQgdW5kZXIgJ3Vuc3RhYmxlRmVhdHVyZXMnIChjdXJyZW50bHkgZW5hYmxlZDogJHt0aGlzLnVuc3RhYmxlRmVhdHVyZXN9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBidWlsZEFzc2V0IGZ1bmN0aW9uIGZvciB1c2UgaW4gV29ya0dyYXBoXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJ1aWxkQXNzZXRGdW5jdGlvbihcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgZGVwbG95bWVudHM6IERlcGxveW1lbnRzLFxuICAgIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIChhc3NldE5vZGU6IEFzc2V0QnVpbGROb2RlKSA9PiB7XG4gICAgICBjb25zdCBidWlsZEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5CVUlMRF9BU1NFVCkuYmVnaW4oe1xuICAgICAgICBhc3NldDogYXNzZXROb2RlLmFzc2V0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5idWlsZFNpbmdsZUFzc2V0KFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdEFydGlmYWN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgICByb2xlQXJuLFxuICAgICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBidWlsZEFzc2V0U3Bhbi5lbmQoKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHB1Ymxpc2hBc3NldCBmdW5jdGlvbiBmb3IgdXNlIGluIFdvcmtHcmFwaFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQdWJsaXNoQXNzZXRGdW5jdGlvbihcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgZGVwbG95bWVudHM6IERlcGxveW1lbnRzLFxuICAgIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmb3JjZVB1Ymxpc2g/OiBib29sZWFuLFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4ge1xuICAgICAgY29uc3QgcHVibGlzaEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5QVUJMSVNIX0FTU0VUKS5iZWdpbih7XG4gICAgICAgIGFzc2V0OiBhc3NldE5vZGUuYXNzZXQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLnB1Ymxpc2hTaW5nbGVBc3NldChhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCwgYXNzZXROb2RlLmFzc2V0LCB7XG4gICAgICAgIHN0YWNrOiBhc3NldE5vZGUucGFyZW50U3RhY2ssXG4gICAgICAgIHJvbGVBcm4sXG4gICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgZm9yY2VQdWJsaXNoLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBwdWJsaXNoQXNzZXRTcGFuLmVuZCgpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDZW50cmFsaXplIHRoZSBkZWZhdWx0IHN0YWNrIHNlbGVjdGlvbiBsb2dpYyBpbiBhIHNpbmdsZSBwbGFjZVxuICpcbiAqIERlZmF1bHRzIHRvIGFsbCBzdGFja3MgaW4gdGhlIGFzc2VtYmx5IChpbmNsdWRpbmcgbmVzdGVkIGFzc2VtYmxpZXMpIGlmIG5vIGV4cGxpY2l0XG4gKiBzZWxlY3RvciBpcyBnaXZlbi5cbiAqL1xuZnVuY3Rpb24gc3RhY2tzT3B0KG86IHsgc3RhY2tzPzogU3RhY2tTZWxlY3RvciB9KTogU3RhY2tTZWxlY3RvciB7XG4gIHJldHVybiBvLnN0YWNrcyA/PyBBTExfU1RBQ0tTO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gc3ludGhlc2lzIGFuZCBlbWl0IHRoZSB0aW1lIHRha2VuIHRvIGEgbmV3IHNwYW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3ludGhBbmRNZWFzdXJlKFxuICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gIGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSxcbiAgc2VsZWN0U3RhY2tzOiBTdGFja1NlbGVjdG9yLFxuKTogUHJvbWlzZTxTdGFja0Fzc2VtYmx5ICYgeyBzeW50aER1cmF0aW9uOiBFbGFwc2VkVGltZSB9PiB7XG4gIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2Uoc3ludGhTcGFuLmFzSGVscGVyLCBjeCk7XG4gICAgY291bnRBc3NlbWJseVJlc3VsdHMoc3ludGhTcGFuLCByZXQuYXNzZW1ibHkpO1xuICAgIGNvbnN0IHN5bnRoRHVyYXRpb24gPSBhd2FpdCBzeW50aFNwYW4uZW5kKHt9KTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJldCwgeyBzeW50aER1cmF0aW9uIH0pO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgLy8gRW5kIHRoZSBzcGFuIGV2ZW4gaWYgd2UgaGFkIGEgZmFpbHVyZVxuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoeyBlcnJvciB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiB6ZXJvVGltZSgpOiBFbGFwc2VkVGltZSB7XG4gIHJldHVybiB7IGFzTXM6IDAsIGFzU2VjOiAwIH07XG59XG4iXX0=
1702
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUFxQztBQUNyQyw2Q0FBeUM7QUFDekMsZ0RBQWtDO0FBQ2xDLG1FQUFxRDtBQUVyRCwwRUFBOEQ7QUFFOUQsa0RBQTBCO0FBQzFCLG1EQUFxQztBQUNyQyxvREFBNkQ7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsbUJBQU0sQ0FBQyxHQUFHLEVBQUUsbUJBQU0sQ0FBQyxPQUFPLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQU0sQ0FBQyxVQUFVLENBQVUsQ0FBQztBQUczRzs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWdCO0lBQ25DLE9BQVEsV0FBaUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUNELDZDQUErQjtBQUMvQix1RUFBaUU7QUFFakUsdUNBQStDO0FBQy9DLG1EQUEyRDtBQVEzRCxvREFBdUQ7QUFDdkQsOENBQXVFO0FBQ3ZFLHVEQVNtQztBQUluQyxxREFBb0U7QUFVcEUsNkVBQXdFO0FBQ3hFLHNEQUFrRTtBQUNsRSxnQ0FBMkM7QUFDM0MsOENBS3lCO0FBQ3pCLHlFQUFzRTtBQUN0RSxxREFBdUU7QUFDdkUsZ0RBQWdEO0FBRWhELDBEQUFvRjtBQUVwRiwyREFBMkQ7QUFDM0QsaUZBQWtGO0FBQ2xGLHlFQUFrRjtBQUVsRixvREFBaUQ7QUFDakQsd0RBQXVFO0FBQ3ZFLGlGQUFrRjtBQUNsRix1RUFBaUY7QUFDakYsc0NBQTRDO0FBQzVDLHdDQUFnRDtBQUNoRCxrRUFBOEQ7QUFHOUQsK0NBQTZHO0FBQzdHLHNEQUF5RjtB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QztBQUNILENBQUM7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vcHJpdmF0ZS9kaXNwb3NlLXBvbHlmaWxsJztcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ1JlcG9ydFByb3BlcnRpZXMsIFBsdWdpblJlcG9ydEpzb24gfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgQXJ0aWZhY3RUeXBlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVEaWZmIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IHsgdHlwZSBFdmVudE5hbWUsIEVWRU5UUyB9IGZyb20gJ2Nob2tpZGFyL2hhbmRsZXIuanMnO1xuXG4vKipcbiAqIEZpbGUgZXZlbnRzIHRoYXQgd2UgY2FyZSBhYm91dCBmcm9tIGNob2tpZGFyLlxuICogSW4gY2hva2lkYXIgdjQsIEV2ZW50TmFtZSBpbmNsdWRlcyBhZGRpdGlvbmFsIGV2ZW50cyBsaWtlICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJ1xuICogdGhhdCB3ZSBuZWVkIHRvIGZpbHRlciBvdXQgaW4gdGhlICdhbGwnIGhhbmRsZXIuXG4gKi9cbmNvbnN0IEZJTEVfRVZFTlRTID0gW0VWRU5UUy5BREQsIEVWRU5UUy5BRERfRElSLCBFVkVOVFMuQ0hBTkdFLCBFVkVOVFMuVU5MSU5LLCBFVkVOVFMuVU5MSU5LX0RJUl0gYXMgY29uc3Q7XG50eXBlIEZpbGVFdmVudCA9IHR5cGVvZiBGSUxFX0VWRU5UU1tudW1iZXJdO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gZXZlbnQgaXMgYSBmaWxlIGV2ZW50IHdlIHNob3VsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBpc0ZpbGVFdmVudChldmVudDogRXZlbnROYW1lKTogZXZlbnQgaXMgRmlsZUV2ZW50IHtcbiAgcmV0dXJuIChGSUxFX0VWRU5UUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoZXZlbnQpO1xufVxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgTm9uSW50ZXJhY3RpdmVJb0hvc3QgfSBmcm9tICcuL25vbi1pbnRlcmFjdGl2ZS1pby1ob3N0JztcbmltcG9ydCB0eXBlIHsgVG9vbGtpdFNlcnZpY2VzIH0gZnJvbSAnLi9wcml2YXRlJztcbmltcG9ydCB7IGFzc2VtYmx5RnJvbVNvdXJjZSB9IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IsIEFib3J0RXJyb3IgfSBmcm9tICcuL3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3lSZXN1bHQsIERlc3Ryb3lSZXN1bHQsIEZlYXR1cmVGbGFnLCBNaW5pbXVtU2V2ZXJpdHksIFJvbGxiYWNrUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJvb3RzdHJhcEVudmlyb25tZW50cyxcbiAgQm9vdHN0cmFwT3B0aW9ucyxcbiAgQm9vdHN0cmFwUmVzdWx0LFxuICBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCxcbn0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQm9vdHN0cmFwU291cmNlIH0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQXNzZXRCdWlsZFRpbWUsIHR5cGUgRGVwbG95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95JztcbmltcG9ydCB7XG4gIGJ1aWxkUGFyYW1ldGVyTWFwLFxuICBpc0NoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQsXG4gIGlzRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudCxcbiAgaXNOb25FeGVjdXRpbmdDaGFuZ2VTZXREZXBsb3ltZW50LFxuICB0eXBlIFByaXZhdGVEZXBsb3lPcHRpb25zLFxuICByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoLFxuICB0b0V4ZWN1dGVDaGFuZ2VTZXREZXBsb3ltZW50LFxufSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveS9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgRGVzdHJveU9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2Rlc3Ryb3knO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zZWRTdGFjaywgRGlhZ25vc2VPcHRpb25zLCBEaWFnbm9zZVJlc3VsdCB9IGZyb20gJy4uL2FjdGlvbnMvZGlhZ25vc2UnO1xuaW1wb3J0IHR5cGUgeyBEaWZmT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZic7XG5pbXBvcnQgeyBhcHBlbmRPYmplY3QsIHByZXBhcmVEaWZmIH0gZnJvbSAnLi4vYWN0aW9ucy9kaWZmL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBEcmlmdE9wdGlvbnMsIERyaWZ0UmVzdWx0IH0gZnJvbSAnLi4vYWN0aW9ucy9kcmlmdCc7XG5pbXBvcnQgeyB0eXBlIExpc3RPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9saXN0JztcbmltcG9ydCB0eXBlIHsgT3JwaGFuT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvb3JwaGFuJztcbmltcG9ydCB0eXBlIHsgUHVibGlzaEFzc2V0c09wdGlvbnMsIFB1Ymxpc2hBc3NldHNSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL3B1Ymxpc2gtYXNzZXRzJztcbmltcG9ydCB0eXBlIHsgUmVmYWN0b3JPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9yZWZhY3Rvcic7XG5pbXBvcnQgeyB0eXBlIFJvbGxiYWNrT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvcm9sbGJhY2snO1xuaW1wb3J0IHsgdHlwZSBTeW50aE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3N5bnRoJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGVPcHRpb25zLCBWYWxpZGF0ZVJlc3VsdCB9IGZyb20gJy4uL2FjdGlvbnMvdmFsaWRhdGUnO1xuaW1wb3J0IHR5cGUgeyBJV2F0Y2hlciwgV2F0Y2hPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy93YXRjaCc7XG5pbXBvcnQgeyBjb3VudEFzc2VtYmx5UmVzdWx0cyB9IGZyb20gJy4vcHJpdmF0ZS9jb3VudC1hc3NlbWJseS1yZXN1bHRzJztcbmltcG9ydCB7IFdBVENIX0VYQ0xVREVfREVGQVVMVFMgfSBmcm9tICcuLi9hY3Rpb25zL3dhdGNoL3ByaXZhdGUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHtcbiAgQmFzZUNyZWRlbnRpYWxzLFxuICB0eXBlIElCYXNlQ3JlZGVudGlhbHNQcm92aWRlcixcbiAgdHlwZSBTZGtCYXNlQ2xpZW50Q29uZmlnLFxuICB0eXBlIFNka0NvbmZpZyxcbn0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoJztcbmltcG9ydCB7IHNka1JlcXVlc3RIYW5kbGVyIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoL2F3c2NsaS1jb21wYXRpYmxlJztcbmltcG9ydCB7IElvSG9zdFNka0xvZ2dlciwgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hcGkvYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBCb290c3RyYXBwZXIgfSBmcm9tICcuLi9hcGkvYm9vdHN0cmFwJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkQXNzZW1ibHlTb3VyY2UsIFN0YWNrU2VsZWN0b3IgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHsgQ2FjaGVkQ2xvdWRBc3NlbWJseSwgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrQXNzZW1ibHkgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgeyBBTExfU1RBQ0tTIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlQm94IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUvZGlzcG9zYWJsZS1ib3gnO1xuaW1wb3J0IHsgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvc291cmNlLWJ1aWxkZXInO1xuaW1wb3J0IHR5cGUgeyBTdGFja0NvbGxlY3Rpb24gfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvc3RhY2stY29sbGVjdGlvbic7XG5pbXBvcnQgeyBEZXBsb3ltZW50cyB9IGZyb20gJy4uL2FwaS9kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBjcmVhdGVWYWxpZGF0aW9uQ2hhbmdlU2V0IH0gZnJvbSAnLi4vYXBpL2RlcGxveW1lbnRzL2Nmbi1hcGknO1xuaW1wb3J0IHsgaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzIH0gZnJvbSAnLi4vYXBpL2RpYWdub3NpbmcvZGlhZ25vc2lzLWZvcm1hdHRpbmcnO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3NlciB9IGZyb20gJy4uL2FwaS9kaWFnbm9zaW5nL3N0YWNrLWRpYWdub3Nlcic7XG5pbXBvcnQgeyBEaWZmRm9ybWF0dGVyIH0gZnJvbSAnLi4vYXBpL2RpZmYnO1xuaW1wb3J0IHsgZGV0ZWN0U3RhY2tEcmlmdCB9IGZyb20gJy4uL2FwaS9kcmlmdCc7XG5pbXBvcnQgeyBEcmlmdEZvcm1hdHRlciB9IGZyb20gJy4uL2FwaS9kcmlmdC9kcmlmdC1mb3JtYXR0ZXInO1xuaW1wb3J0IHR5cGUgeyBJSW9Ib3N0LCBUb29sa2l0QWN0aW9uIH0gZnJvbSAnLi4vYXBpL2lvJztcbmltcG9ydCB0eXBlIHsgRWxhcHNlZFRpbWUsIElvSGVscGVyIH0gZnJvbSAnLi4vYXBpL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgYXNJb0hlbHBlciwgSU8sIFNQQU4sIHdpdGhvdXRDb2xvciwgd2l0aG91dEVtb2ppcywgd2l0aFRyaW1tZWRXaGl0ZXNwYWNlIH0gZnJvbSAnLi4vYXBpL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvciwgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMgfSBmcm9tICcuLi9hcGkvbG9ncy1tb25pdG9yJztcbmltcG9ydCB7IFJlc291cmNlT3JwaGFuZXIgfSBmcm9tICcuLi9hcGkvb3JwaGFuL29ycGhhbmVyJztcbmltcG9ydCB7IHBhcnNlQW5kVmFsaWRhdGVDb25zdHJ1Y3RQYXRocyB9IGZyb20gJy4uL2FwaS9vcnBoYW4vcHJpdmF0ZS9oZWxwZXJzJztcbmltcG9ydCB7IE1vZGUsIFBsdWdpbkhvc3QgfSBmcm9tICcuLi9hcGkvcGx1Z2luJztcbmltcG9ydCB7XG4gIGZvcm1hdEFtYmlndW91c01hcHBpbmdzLFxuICBmb3JtYXRFbnZpcm9ubWVudFNlY3Rpb25IZWFkZXIsXG4gIGZvcm1hdFR5cGVkTWFwcGluZ3MsXG4gIGdyb3VwU3RhY2tzLFxufSBmcm9tICcuLi9hcGkvcmVmYWN0b3JpbmcnO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi4vYXBpL3JlZmFjdG9yaW5nL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFJlc291cmNlTWFwcGluZywgUmVzb3VyY2VMb2NhdGlvbiB9IGZyb20gJy4uL2FwaS9yZWZhY3RvcmluZy9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZWZhY3RvcmluZ0NvbnRleHQgfSBmcm9tICcuLi9hcGkvcmVmYWN0b3JpbmcvY29udGV4dCc7XG5pbXBvcnQgeyBnZW5lcmF0ZVN0YWNrRGVmaW5pdGlvbnMgfSBmcm9tICcuLi9hcGkvcmVmYWN0b3Jpbmcvc3RhY2stZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgUmVzb3VyY2VNaWdyYXRvciB9IGZyb20gJy4uL2FwaS9yZXNvdXJjZS1pbXBvcnQnO1xuaW1wb3J0IHsgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlciB9IGZyb20gJy4uL2FwaS9zb3VyY2UtdHJhY2luZy9wcml2YXRlL3N0YWNrLXNvdXJjZS10cmFjaW5nJztcbmltcG9ydCB7IHRhZ3NGb3JTdGFjayB9IGZyb20gJy4uL2FwaS90YWdzL3ByaXZhdGUnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUgfSBmcm9tICcuLi9hcGkvdG9vbGtpdC1pbmZvJztcbmltcG9ydCB7IGhvc3RNZXNzYWdlRnJvbVZhbGlkYXRpb24gfSBmcm9tICcuLi9hcGkvdmFsaWRhdGUvdmFsaWRhdGUtZm9ybWF0dGluZyc7XG5pbXBvcnQgdHlwZSB7IEFzc2V0QnVpbGROb2RlLCBBc3NldFB1Ymxpc2hOb2RlLCBDb25jdXJyZW5jeSwgU3RhY2tOb2RlIH0gZnJvbSAnLi4vYXBpL3dvcmstZ3JhcGgnO1xuaW1wb3J0IHsgV29ya0dyYXBoLCBXb3JrR3JhcGhCdWlsZGVyLCBidWlsZERlc3Ryb3lXb3JrR3JhcGggfSBmcm9tICcuLi9hcGkvd29yay1ncmFwaCc7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5RGF0YSwgUmVmYWN0b3JSZXN1bHQsIFN0YWNrRGV0YWlscywgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNoYW5nZVR5cGUgfSBmcm9tICcuLi9wYXlsb2Fkcyc7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UsIGZvcm1hdFRpbWUsIG9ic2N1cmVUZW1wbGF0ZSwgc2VyaWFsaXplU3RydWN0dXJlLCB2YWxpZGF0ZVNuc1RvcGljQXJuIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBwTGltaXQgfSBmcm9tICcuLi91dGlsL2NvbmN1cnJlbmN5JztcbmltcG9ydCB7IGNyZWF0ZUlnbm9yZU1hdGNoZXIgfSBmcm9tICcuLi91dGlsL2dsb2ItbWF0Y2hlcic7XG5pbXBvcnQgeyBwcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gJy4uL3V0aWwvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY29tYmluZUNvbmNsdXNpb25zLCBvYnRhaW5VbmlmaWVkVmFsaWRhdGlvblJlcG9ydCwgdGhyb3dJZlZhbGlkYXRpb25GYWlsdXJlcyB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uLXJlcG9ydCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIElvSG9zdCBpbXBsZW1lbnRhdGlvbiwgaGFuZGxpbmcgdGhlIGlubGluZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGUgVG9vbGtpdCBhbmQgYW4gaW50ZWdyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpb0hvc3Q/OiBJSW9Ib3N0O1xuXG4gIC8qKlxuICAgKiBBbGxvdyBlbW9qaXMgaW4gbWVzc2FnZXMgc2VudCB0byB0aGUgSW9Ib3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbW9qaXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IEFOU0kgY29sb3JzIGFuZCBmb3JtYXR0aW5nIGluIElvSG9zdCBtZXNzYWdlcy5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBmYWxzZWAgZW5mb3JjZXMgdGhhdCBubyBjb2xvciBvciBzdHlsZSBzaG93cyB1cFxuICAgKiBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIGlzIGEgbm8tb3A7IGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlZmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGV0ZWN0cyBjb2xvciBmcm9tIHRoZSBUVFkgc3RhdHVzIG9mIHRoZSBJb0hvc3RcbiAgICovXG4gIHJlYWRvbmx5IGNvbG9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgU0RLLlxuICAgKi9cbiAgcmVhZG9ubHkgc2RrQ29uZmlnPzogU2RrQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiQ0RLVG9vbGtpdFwiXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlsIENsb3VkIEFzc2VtYmx5IG9wZXJhdGlvbnMgd2l0aCBhbiBlcnJvciBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnMgaW4gdGhlIGFzc2VtYmx5IHdpdGggYXQgbGVhc3QgdGhlIGluZGljYXRlZCBzZXZlcml0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJlcnJvclwiXG4gICAqL1xuICByZWFkb25seSBhc3NlbWJseUZhaWx1cmVBdD86IE1pbmltdW1TZXZlcml0eTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBob3N0IHRvIHVzZSBmb3IgbG9hZGluZyBhbmQgcXVlcnlpbmcgcGx1Z2luc1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIHVuaXF1ZSBpbnN0YW5jZSBvZiBhIHBsdWdpbiBtYW5hZ2luZyBjbGFzcyB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFVzZSBgdG9vbGtpdC5wbHVnaW5Ib3N0LmxvYWQoKWAgdG8gbG9hZCBwbHVnaW5zIGludG8gdGhlIHBsdWdpbiBob3N0IGZyb20gZGlzay5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIGZyZXNoIHBsdWdpbiBob3N0XG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ib3N0PzogUGx1Z2luSG9zdDtcblxuICAvKipcbiAgICogU2V0IG9mIHVuc3RhYmxlIGZlYXR1cmVzIHRvIG9wdCBpbnRvLiBJZiB5b3UgYXJlIHVzaW5nIGFuIHVuc3RhYmxlIGZlYXR1cmUsXG4gICAqIHlvdSBtdXN0IGV4cGxpY2l0bHkgYWNrbm93bGVkZ2UgdGhhdCB5b3UgYXJlIGF3YXJlIG9mIHRoZSByaXNrcyBvZiB1c2luZyBpdCxcbiAgICogYnkgcGFzc2luZyBpdCBpbiB0aGlzIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHVuc3RhYmxlRmVhdHVyZXM/OiBBcnJheTxVbnN0YWJsZUZlYXR1cmU+O1xufVxuXG4vKipcbiAqIE5hbWVzIG9mIHRvb2xraXQgZmVhdHVyZXMgdGhhdCBhcmUgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQsIGFuZCBtYXkgY2hhbmdlIGluXG4gKiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgdHlwZSBVbnN0YWJsZUZlYXR1cmUgPSAncmVmYWN0b3InIHwgJ29ycGhhbicgfCAnZmxhZ3MnIHwgJ3B1Ymxpc2gtYXNzZXRzJyB8ICdkaWFnbm9zZScgfCAndmFsaWRhdGUnO1xuXG4vKipcbiAqIFRoZSBBV1MgQ0RLIFByb2dyYW1tYXRpYyBUb29sa2l0XG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sa2l0IGV4dGVuZHMgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIge1xuICAvKipcbiAgICogVGhlIHRvb2xraXQgc3RhY2sgbmFtZSB1c2VkIGZvciBib290c3RyYXBwaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJb0hvc3Qgb2YgdGhpcyBUb29sa2l0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW9Ib3N0OiBJSW9Ib3N0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGhvc3QgZm9yIGxvYWRpbmcgYW5kIG1hbmFnaW5nIHBsdWdpbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5Ib3N0OiBQbHVnaW5Ib3N0O1xuXG4gIC8qKlxuICAgKiBDYWNoZSBvZiB0aGUgaW50ZXJuYWwgU0RLIFByb3ZpZGVyIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHNka1Byb3ZpZGVyQ2FjaGU/OiBTZGtQcm92aWRlcjtcblxuICBwcml2YXRlIGJhc2VDcmVkZW50aWFsczogSUJhc2VDcmVkZW50aWFsc1Byb3ZpZGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdGFibGVGZWF0dXJlczogQXJyYXk8VW5zdGFibGVGZWF0dXJlPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5RmFpbHVyZUF0OiBNaW5pbXVtU2V2ZXJpdHk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFRvb2xraXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudG9vbGtpdFN0YWNrTmFtZSA9IHByb3BzLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUU7XG4gICAgdGhpcy5hc3NlbWJseUZhaWx1cmVBdCA9IHByb3BzLmFzc2VtYmx5RmFpbHVyZUF0ID8/ICdlcnJvcic7XG5cbiAgICB0aGlzLnBsdWdpbkhvc3QgPSBwcm9wcy5wbHVnaW5Ib3N0ID8/IG5ldyBQbHVnaW5Ib3N0KCk7XG5cbiAgICBsZXQgaW9Ib3N0ID0gcHJvcHMuaW9Ib3N0ID8/IG5ldyBOb25JbnRlcmFjdGl2ZUlvSG9zdCgpO1xuICAgIGlmIChwcm9wcy5lbW9qaXMgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0RW1vamlzKGlvSG9zdCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5jb2xvciA9PT0gZmFsc2UpIHtcbiAgICAgIGlvSG9zdCA9IHdpdGhvdXRDb2xvcihpb0hvc3QpO1xuICAgIH1cbiAgICAvLyBBZnRlciByZW1vdmluZyBlbW9qaXMgYW5kIGNvbG9yLCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBmbG9hdGluZyB3aGl0ZXNwYWNlIGF0IGVpdGhlciBlbmQgb2YgdGhlIG1lc3NhZ2VcbiAgICAvLyBUaGlzIGFsc28gcmVtb3ZlcyBuZXdsaW5lcyB0aGF0IHdlIGN1cnJlbnRseSBlbWl0IGZvciBDTEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgdGhpcy5pb0hvc3QgPSB3aXRoVHJpbW1lZFdoaXRlc3BhY2UoaW9Ib3N0KTtcblxuICAgIHRoaXMuYmFzZUNyZWRlbnRpYWxzID0gcHJvcHMuc2RrQ29uZmlnPy5iYXNlQ3JlZGVudGlhbHMgPz8gQmFzZUNyZWRlbnRpYWxzLmF3c0NsaUNvbXBhdGlibGUoKTtcbiAgICB0aGlzLnVuc3RhYmxlRmVhdHVyZXMgPSBwcm9wcy51bnN0YWJsZUZlYXR1cmVzID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0byB0aGUgQVdTIFNES1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzZGtQcm92aWRlcihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPFNka1Byb3ZpZGVyPiB7XG4gICAgLy8gQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkaWZmZXJlbnQgaW5zdGFuY2UgcGVyIGFjdGlvblxuICAgIGlmICghdGhpcy5zZGtQcm92aWRlckNhY2hlKSB7XG4gICAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgICBjb25zdCBjbGllbnRDb25maWc6IFNka0Jhc2VDbGllbnRDb25maWcgPSB7XG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiBzZGtSZXF1ZXN0SGFuZGxlcih0aGlzLnByb3BzLnNka0NvbmZpZz8uaHR0cE9wdGlvbnM/LmFnZW50KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuYmFzZUNyZWRlbnRpYWxzLnNka0Jhc2VDb25maWcoaW9IZWxwZXIsIGNsaWVudENvbmZpZyk7XG4gICAgICB0aGlzLnNka1Byb3ZpZGVyQ2FjaGUgPSBuZXcgU2RrUHJvdmlkZXIoY29uZmlnLmNyZWRlbnRpYWxQcm92aWRlciwgY29uZmlnLmRlZmF1bHRSZWdpb24sIHtcbiAgICAgICAgaW9IZWxwZXIsXG4gICAgICAgIGxvZ2dlcjogbmV3IElvSG9zdFNka0xvZ2dlcihpb0hlbHBlciksXG4gICAgICAgIHBsdWdpbkhvc3Q6IHRoaXMucGx1Z2luSG9zdCxcbiAgICAgICAgcmVxdWVzdEhhbmRsZXI6IGNsaWVudENvbmZpZy5yZXF1ZXN0SGFuZGxlcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNka1Byb3ZpZGVyQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHByb3ZpZGUgdGhlIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIHdpdGggcmVxdWlyZWQgdG9vbGtpdCBzZXJ2aWNlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzb3VyY2VCdWlsZGVyU2VydmljZXMoKTogUHJvbWlzZTxUb29sa2l0U2VydmljZXM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW9IZWxwZXI6IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdhc3NlbWJseScpLFxuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2Fzc2VtYmx5JyksXG4gICAgICBwbHVnaW5Ib3N0OiB0aGlzLnBsdWdpbkhvc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb290c3RyYXAgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwKGVudmlyb25tZW50czogQm9vdHN0cmFwRW52aXJvbm1lbnRzLCBvcHRpb25zOiBCb290c3RyYXBPcHRpb25zID0ge30pOiBQcm9taXNlPEJvb3RzdHJhcFJlc3VsdD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzdWx0czogRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHRbXSA9IFtdO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnYm9vdHN0cmFwJyk7XG4gICAgY29uc3QgYm9vdHN0cmFwRW52aXJvbm1lbnRzID0gYXdhaXQgZW52aXJvbm1lbnRzLmdldEVudmlyb25tZW50cyh0aGlzLmlvSG9zdCk7XG4gICAgY29uc3Qgc291cmNlID0gb3B0aW9ucy5zb3VyY2UgPz8gQm9vdHN0cmFwU291cmNlLmRlZmF1bHQoKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gb3B0aW9ucy5wYXJhbWV0ZXJzO1xuICAgIGNvbnN0IGJvb3RzdHJhcHBlciA9IG5ldyBCb290c3RyYXBwZXIoc291cmNlLCBpb0hlbHBlcik7XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdib290c3RyYXAnKTtcblxuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KDIwKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGJvb3RzdHJhcEVudmlyb25tZW50cy5tYXAoKGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCwgY3VycmVudElkeCkgPT4gbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYm9vdHN0cmFwU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5CT09UU1RSQVBfU0lOR0xFKVxuICAgICAgICAuYmVnaW4oYCR7Y2hhbGsuYm9sZChlbnZpcm9ubWVudC5uYW1lKX06IGJvb3RzdHJhcHBpbmcuLi5gLCB7XG4gICAgICAgICAgdG90YWw6IGJvb3RzdHJhcEVudmlyb25tZW50cy5sZW5ndGgsXG4gICAgICAgICAgY3VycmVudDogY3VycmVudElkeCArIDEsXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib290c3RyYXBSZXN1bHQgPSBhd2FpdCBib290c3RyYXBwZXIuYm9vdHN0cmFwRW52aXJvbm1lbnQoXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc2RrUHJvdmlkZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LnBhcmFtZXRlcnMsXG4gICAgICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LmtlZXBFeGlzdGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYm9vdHN0cmFwUmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk5MDAubXNnKGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIHsgZW52aXJvbm1lbnQgfSkpO1xuICAgICAgICBjb25zdCBlbnZUaW1lID0gYXdhaXQgYm9vdHN0cmFwU3Bhbi5lbmQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCA9IHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBzdGF0dXM6IGJvb3RzdHJhcFJlc3VsdC5ub09wID8gJ25vLW9wJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICBkdXJhdGlvbjogZW52VGltZS5hc01zLFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTk5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudHM6IHJlc3VsdHMsXG4gICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIEFjdGlvblxuICAgKlxuICAgKiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBgQ2FjaGVkQ2xvdWRBc3NlbWJseWAgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGBkaXNwb3NlKClgIG9uXG4gICAqIGl0IGFmdGVyIHVzZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW50aChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFN5bnRoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRDbG91ZEFzc2VtYmx5PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnc3ludGgnKTtcblxuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gbmV3IEFzeW5jRGlzcG9zYWJsZUJveChhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzdGFja3NPcHQob3B0aW9ucykpKTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS52YWx1ZS5zZWxlY3RTdGFja3NWMihzdGFja3NPcHQob3B0aW9ucykpO1xuICAgIGNvbnN0IGF1dG9WYWxpZGF0ZVN0YWNrcyA9IG9wdGlvbnMudmFsaWRhdGVTdGFja3MgPyBbYXNzZW1ibHkudmFsdWUuc2VsZWN0U3RhY2tzRm9yVmFsaWRhdGlvbigpXSA6IFtdO1xuICAgIGF3YWl0IHRocm93SWZWYWxpZGF0aW9uRmFpbHVyZXMoYXNzZW1ibHkudmFsdWUsIHN0YWNrcy5jb25jYXQoLi4uYXV0b1ZhbGlkYXRlU3RhY2tzKSwgdGhpcy5hc3NlbWJseUZhaWx1cmVBdCwgaW9IZWxwZXIpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIHNpbmdsZSBzdGFjaywgcHJpbnQgaXQgdG8gU1RET1VUXG4gICAgY29uc3QgbWVzc2FnZSA9IGBTdWNjZXNzZnVsbHkgc3ludGhlc2l6ZWQgdG8gJHtjaGFsay5ibHVlKHBhdGgucmVzb2x2ZShzdGFja3MuYXNzZW1ibHkuZGlyZWN0b3J5KSl9YDtcbiAgICBjb25zdCBhc3NlbWJseURhdGE6IEFzc2VtYmx5RGF0YSA9IHtcbiAgICAgIGFzc2VtYmx5RGlyZWN0b3J5OiBzdGFja3MuYXNzZW1ibHkuZGlyZWN0b3J5LFxuICAgICAgc3RhY2tzQ291bnQ6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgc3RhY2tJZHM6IHN0YWNrcy5oaWVyYXJjaGljYWxJZHMsXG4gICAgfTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3RTdGFjayA9IHN0YWNrcy5maXJzdFN0YWNrITtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZmlyc3RTdGFjay50ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IG9ic2N1cmVkVGVtcGxhdGUgPSBvYnNjdXJlVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0kxOTAxLm1zZyhtZXNzYWdlLCB7XG4gICAgICAgIC4uLmFzc2VtYmx5RGF0YSxcbiAgICAgICAgc3RhY2s6IHtcbiAgICAgICAgICBzdGFja05hbWU6IGZpcnN0U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgIGhpZXJhcmNoaWNhbElkOiBmaXJzdFN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIHN0cmluZ2lmaWVkSnNvbjogc2VyaWFsaXplU3RydWN0dXJlKG9ic2N1cmVkVGVtcGxhdGUsIHRydWUpLFxuICAgICAgICAgIHN0cmluZ2lmaWVkWWFtbDogc2VyaWFsaXplU3RydWN0dXJlKG9ic2N1cmVkVGVtcGxhdGUsIGZhbHNlKSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm90IG91dHB1dHRpbmcgdGVtcGxhdGUgdG8gc3Rkb3V0LCBsZXQncyBleHBsYWluIHRoaW5ncyB0byB0aGUgdXNlciBhIGxpdHRsZSBiaXQuLi5cbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMTkwMi5tc2coY2hhbGsuZ3JlZW4obWVzc2FnZSksIGFzc2VtYmx5RGF0YSkpO1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgU3VwcGx5IGEgc3RhY2sgaWQgKCR7c3RhY2tzLnN0YWNrQXJ0aWZhY3RzLm1hcCgocykgPT4gY2hhbGsuZ3JlZW4ocy5oaWVyYXJjaGljYWxJZCkpLmpvaW4oJywgJyl9KSB0byBkaXNwbGF5IGl0cyB0ZW1wbGF0ZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENhY2hlZENsb3VkQXNzZW1ibHkoYXNzZW1ibHkudGFrZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaWZmIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpZmYoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEaWZmT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IFtuYW1lOiBzdHJpbmddOiBUZW1wbGF0ZURpZmYgfT4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RpZmYnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBjb25zdCBkaWZmU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ESUZGX1NUQUNLKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGlmZicpO1xuXG4gICAgY29uc3Qgc3RyaWN0ID0gISFvcHRpb25zLnN0cmljdDtcbiAgICBjb25zdCBjb250ZXh0TGluZXMgPSBvcHRpb25zLmNvbnRleHRMaW5lcyB8fCAzO1xuXG4gICAgbGV0IGRpZmZzID0gMDtcbiAgICBsZXQgc2VjdXJpdHlEaWZmcyA9IDA7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZUluZm9zID0gYXdhaXQgcHJlcGFyZURpZmYoZGlmZlNwYW4uYXNIZWxwZXIsIHN0YWNrcywgZGVwbG95bWVudHMsIGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RpZmYnKSwgb3B0aW9ucyk7XG4gICAgY29uc3QgdGVtcGxhdGVEaWZmczogeyBbbmFtZTogc3RyaW5nXTogVGVtcGxhdGVEaWZmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRlbXBsYXRlSW5mbyBvZiB0ZW1wbGF0ZUluZm9zKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRGlmZkZvcm1hdHRlcih7IHRlbXBsYXRlSW5mbyB9KTtcbiAgICAgIGNvbnN0IHN0YWNrRGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RpZmYoeyBzdHJpY3QsIGNvbnRleHRMaW5lcyB9KTtcblxuICAgICAgLy8gU2VjdXJpdHkgRGlmZlxuICAgICAgY29uc3Qgc2VjdXJpdHlEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5RGlmZigpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkU2VjdXJpdHlEaWZmID0gc2VjdXJpdHlEaWZmLnBlcm1pc3Npb25DaGFuZ2VUeXBlICE9PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FID8gc3RhY2tEaWZmLmZvcm1hdHRlZERpZmYgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBXZSBvbmx5IHdhcm4gYWJvdXQgQlJPQURFTklORyBjaGFuZ2VzXG4gICAgICBpZiAoc2VjdXJpdHlEaWZmLnBlcm1pc3Npb25DaGFuZ2VUeXBlID09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLkJST0FERU5JTkcpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSAnVGhpcyBkZXBsb3ltZW50IHdpbGwgbWFrZSBwb3RlbnRpYWxseSBzZW5zaXRpdmUgY2hhbmdlcyBhY2NvcmRpbmcgdG8geW91ciBjdXJyZW50IHNlY3VyaXR5IGFwcHJvdmFsIGxldmVsLlxcblBsZWFzZSBjb25maXJtIHlvdSBpbnRlbmQgdG8gbWFrZSB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbnM6XFxuJztcbiAgICAgICAgYXdhaXQgZGlmZlNwYW4uZGVmYXVsdHMud2Fybih3YXJuaW5nTWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IGRpZmZTcGFuLmRlZmF1bHRzLmluZm8oc2VjdXJpdHlEaWZmLmZvcm1hdHRlZERpZmYpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFjayBEaWZmXG4gICAgICBkaWZmcyArPSBzdGFja0RpZmYubnVtU3RhY2tzV2l0aENoYW5nZXM7XG4gICAgICBzZWN1cml0eURpZmZzICs9IHNlY3VyaXR5RGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIGFwcGVuZE9iamVjdCh0ZW1wbGF0ZURpZmZzLCBmb3JtYXR0ZXIuZGlmZnMpO1xuICAgICAgYXdhaXQgZGlmZlNwYW4ubm90aWZ5KElPLkNES19UT09MS0lUX0k0MDAyLm1zZyhzdGFja0RpZmYuZm9ybWF0dGVkRGlmZiwge1xuICAgICAgICBzdGFjazogdGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLFxuICAgICAgICBkaWZmczogZm9ybWF0dGVyLmRpZmZzLFxuICAgICAgICBudW1TdGFja3NXaXRoQ2hhbmdlczogc3RhY2tEaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzLFxuICAgICAgICBudW1TdGFja3NXaXRoU2VjdXJpdHlDaGFuZ2VzOiBzZWN1cml0eURpZmYubnVtU3RhY2tzV2l0aENoYW5nZXMsXG4gICAgICAgIHBlcm1pc3Npb25DaGFuZ2VzOiBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUsXG4gICAgICAgIGZvcm1hdHRlZERpZmY6IHtcbiAgICAgICAgICBkaWZmOiBzdGFja0RpZmYuZm9ybWF0dGVkRGlmZixcbiAgICAgICAgICBzZWN1cml0eTogZm9ybWF0dGVkU2VjdXJpdHlEaWZmLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGF3YWl0IGRpZmZTcGFuLmVuZChg4pyoIE51bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmZXJlbmNlczogJHtkaWZmc31gLCB7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlczogZGlmZnMsXG4gICAgICBudW1TdGFja3NXaXRoU2VjdXJpdHlDaGFuZ2VzOiBzZWN1cml0eURpZmZzLFxuICAgICAgZGlmZnM6IHRlbXBsYXRlRGlmZnMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGVtcGxhdGVEaWZmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmlmdCBBY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkcmlmdChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERyaWZ0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IFtuYW1lOiBzdHJpbmddOiBEcmlmdFJlc3VsdCB9PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZHJpZnQnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IGRyaWZ0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5EUklGVF9BUFApLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3QgYWxsRHJpZnRSZXN1bHRzOiB7IFtuYW1lOiBzdHJpbmddOiBEcmlmdFJlc3VsdCB9ID0ge307XG4gICAgY29uc3QgdW5hdmFpbGFibGVEcmlmdHMgPSBbXTtcbiAgICBjb25zdCBzZGtQcm92aWRlciA9IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RyaWZ0Jyk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cykge1xuICAgICAgY29uc3QgY2ZuID0gKGF3YWl0IHNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KHN0YWNrLmVudmlyb25tZW50LCBNb2RlLkZvclJlYWRpbmcpKS5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIGNvbnN0IGRyaWZ0UmVzdWx0cyA9IGF3YWl0IGRldGVjdFN0YWNrRHJpZnQoY2ZuLCBkcmlmdFNwYW4uYXNIZWxwZXIsIHN0YWNrLnN0YWNrTmFtZSk7XG5cbiAgICAgIGlmICghZHJpZnRSZXN1bHRzLlN0YWNrUmVzb3VyY2VEcmlmdHMpIHtcbiAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gc3RhY2suZGlzcGxheU5hbWUgPz8gc3RhY2suc3RhY2tOYW1lO1xuICAgICAgICB1bmF2YWlsYWJsZURyaWZ0cy5wdXNoKHN0YWNrTmFtZSk7XG4gICAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzQ1OTEubXNnKGAke3N0YWNrTmFtZX06IE5vIGRyaWZ0IHJlc3VsdHMgYXZhaWxhYmxlYCwgeyBzdGFjayB9KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRHJpZnRGb3JtYXR0ZXIoeyBzdGFjaywgcmVzb3VyY2VEcmlmdHM6IGRyaWZ0UmVzdWx0cy5TdGFja1Jlc291cmNlRHJpZnRzIH0pO1xuICAgICAgY29uc3QgZHJpZnRPdXRwdXQgPSBmb3JtYXR0ZXIuZm9ybWF0U3RhY2tEcmlmdCgpO1xuICAgICAgY29uc3Qgc3RhY2tEcmlmdCA9IHtcbiAgICAgICAgbnVtUmVzb3VyY2VzV2l0aERyaWZ0OiBkcmlmdE91dHB1dC5udW1SZXNvdXJjZXNXaXRoRHJpZnQsXG4gICAgICAgIG51bVJlc291cmNlc1VuY2hlY2tlZDogZHJpZnRPdXRwdXQubnVtUmVzb3VyY2VzVW5jaGVja2VkLFxuICAgICAgICBmb3JtYXR0ZWREcmlmdDoge1xuICAgICAgICAgIHVuY2hhbmdlZDogZHJpZnRPdXRwdXQudW5jaGFuZ2VkLFxuICAgICAgICAgIHVuY2hlY2tlZDogZHJpZnRPdXRwdXQudW5jaGVja2VkLFxuICAgICAgICAgIG1vZGlmaWVkOiBkcmlmdE91dHB1dC5tb2RpZmllZCxcbiAgICAgICAgICBkZWxldGVkOiBkcmlmdE91dHB1dC5kZWxldGVkLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGFsbERyaWZ0UmVzdWx0c1tmb3JtYXR0ZXIuc3RhY2tOYW1lXSA9IHN0YWNrRHJpZnQ7XG5cbiAgICAgIC8vIGhlYWRlclxuICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmluZm8oZHJpZnRPdXRwdXQuc3RhY2tIZWFkZXIpO1xuXG4gICAgICAvLyBwcmludCB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGF0IGRpZmZlcmVudCBsZXZlbHNcbiAgICAgIGlmIChkcmlmdE91dHB1dC51bmNoYW5nZWQpIHtcbiAgICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLmRlYnVnKGRyaWZ0T3V0cHV0LnVuY2hhbmdlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZHJpZnRPdXRwdXQudW5jaGVja2VkKSB7XG4gICAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy5kZWJ1ZyhkcmlmdE91dHB1dC51bmNoZWNrZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWZ0T3V0cHV0Lm1vZGlmaWVkKSB7XG4gICAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy5pbmZvKGRyaWZ0T3V0cHV0Lm1vZGlmaWVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmlmdE91dHB1dC5kZWxldGVkKSB7XG4gICAgICAgIGF3YWl0IGRyaWZ0U3Bhbi5kZWZhdWx0cy5pbmZvKGRyaWZ0T3V0cHV0LmRlbGV0ZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBtYWluIHN0YWNrIHJlc3VsdFxuICAgICAgYXdhaXQgZHJpZnRTcGFuLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNDU5MC5tc2coZHJpZnRPdXRwdXQuc3VtbWFyeSwge1xuICAgICAgICBzdGFjayxcbiAgICAgICAgZHJpZnQ6IHN0YWNrRHJpZnQsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gcHJpbnQgc3VtbWFyeVxuICAgIGNvbnN0IHRvdGFsRHJpZnRzID0gT2JqZWN0LnZhbHVlcyhhbGxEcmlmdFJlc3VsdHMpLnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQubnVtUmVzb3VyY2VzV2l0aERyaWZ0ID8/IDApLCAwKTtcbiAgICBjb25zdCB0b3RhbFVuY2hlY2tlZCA9IE9iamVjdC52YWx1ZXMoYWxsRHJpZnRSZXN1bHRzKS5yZWR1Y2UoKHRvdGFsLCBjdXJyZW50KSA9PiB0b3RhbCArIChjdXJyZW50Lm51bVJlc291cmNlc1VuY2hlY2tlZCA/PyAwKSwgMCk7XG4gICAgYXdhaXQgZHJpZnRTcGFuLmVuZChgXFxu4pyoICBOdW1iZXIgb2YgcmVzb3VyY2VzIHdpdGggZHJpZnQ6ICR7dG90YWxEcmlmdHN9JHt0b3RhbFVuY2hlY2tlZCA/IGAgKCR7dG90YWxVbmNoZWNrZWR9IHVuY2hlY2tlZClgIDogJyd9YCk7XG4gICAgaWYgKHVuYXZhaWxhYmxlRHJpZnRzLmxlbmd0aCkge1xuICAgICAgYXdhaXQgZHJpZnRTcGFuLmRlZmF1bHRzLndhcm4oYFxcbuKaoO+4jyAgRmFpbGVkIHRvIGNoZWNrIGRyaWZ0IGZvciAke3VuYXZhaWxhYmxlRHJpZnRzLmxlbmd0aH0gc3RhY2socykuIENoZWNrIGxvZyBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICAgIH1cblxuICAgIHJldHVybiBhbGxEcmlmdFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBBc3NldHMgQWN0aW9uXG4gICAqXG4gICAqIFB1Ymxpc2hlcyBhc3NldHMgZm9yIHRoZSBzZWxlY3RlZCBzdGFja3Mgd2l0aG91dCBkZXBsb3lpbmdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoQXNzZXRzKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogUHVibGlzaEFzc2V0c09wdGlvbnMgPSB7fSk6IFByb21pc2U8UHVibGlzaEFzc2V0c1Jlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVVuc3RhYmxlRmVhdHVyZSgncHVibGlzaC1hc3NldHMnKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3B1Ymxpc2gtYXNzZXRzJyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhyb3dJZlZhbGlkYXRpb25GYWlsdXJlcyhhc3NlbWJseSwgc3RhY2tDb2xsZWN0aW9uLCB0aGlzLmFzc2VtYmx5RmFpbHVyZUF0LCBpb0hlbHBlcik7XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAwMS5tc2coJ05vIHN0YWNrcyBzZWxlY3RlZCcpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncHVibGlzaC1hc3NldHMnKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi5zdGFja0FydGlmYWN0cztcbiAgICBjb25zdCBzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzID0gc3RhY2tzLmZsYXRNYXAoKHN0YWNrKSA9PiBbXG4gICAgICBzdGFjayxcbiAgICAgIC4uLnN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoeCA9PiBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3QuaXNBc3NldE1hbmlmZXN0QXJ0aWZhY3QoeCkpLFxuICAgIF0pO1xuXG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoXG4gICAgICBpb0hlbHBlcixcbiAgICAgIHRydWUsIC8vIHByZWJ1aWxkIGFsbCBhc3NldHNcbiAgICApLmJ1aWxkKHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMpO1xuXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhd2FpdCByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoKHdvcmtHcmFwaCwgZGVwbG95bWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0Tm9kZXMgPSBPYmplY3QudmFsdWVzKHdvcmtHcmFwaC5ub2RlcylcbiAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIEFzc2V0UHVibGlzaE5vZGUgPT4gbi50eXBlID09PSAnYXNzZXQtcHVibGlzaCcpO1xuXG4gICAgaWYgKGFzc2V0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk0MDAubXNnKGNoYWxrLmdyZWVuKCdcXG7inKggIEFsbCBhc3NldHMgYXJlIGFscmVhZHkgcHVibGlzaGVkXFxuJykpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHB1Ymxpc2hlZEFzc2V0czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2V0cyA9IGFzc2V0Tm9kZXMubWFwKG4gPT4gbi5hc3NldCk7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAxLm1zZygnUHVibGlzaGluZyBhc3NldHMnLCB7IGFzc2V0cyB9KSk7XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgPz8gNDtcbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IDEsXG4gICAgICAnYXNzZXQtYnVpbGQnOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1wdWJsaXNoJzogY29uY3VycmVuY3ksXG4gICAgICAnbWFya2VyJzogMSxcbiAgICB9O1xuXG4gICAgYXdhaXQgd29ya0dyYXBoLmRvUGFyYWxsZWwoZ3JhcGhDb25jdXJyZW5jeSwge1xuICAgICAgLy8gTm8tb3A6IHdlJ3JlIG9ubHkgcHVibGlzaGluZyBhc3NldHMsIG5vdCBkZXBsb3lpbmdcbiAgICAgIGRlcGxveVN0YWNrOiBXb3JrR3JhcGguTk9PUCxcbiAgICAgIGJ1aWxkQXNzZXQ6IHRoaXMuY3JlYXRlQnVpbGRBc3NldEZ1bmN0aW9uKGlvSGVscGVyLCBkZXBsb3ltZW50cywgdW5kZWZpbmVkKSxcbiAgICAgIHB1Ymxpc2hBc3NldDogdGhpcy5jcmVhdGVQdWJsaXNoQXNzZXRGdW5jdGlvbihpb0hlbHBlciwgZGVwbG95bWVudHMsIHVuZGVmaW5lZCwgb3B0aW9ucy5mb3JjZSksXG4gICAgICBtYXJrZXI6IFdvcmtHcmFwaC5OT09QLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k5NDAyLm1zZyhjaGFsay5ncmVlbignXFxu4pyoICBBc3NldHMgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseVxcbicpLCB7IGFzc2V0cyB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGlzaGVkQXNzZXRzOiBhc3NldHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IEFjdGlvblxuICAgKlxuICAgKiBMaXN0IHNlbGVjdGVkIHN0YWNrcyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IExpc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFN0YWNrRGV0YWlsc1tdPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnbGlzdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMjkwMS5tc2cobWVzc2FnZSwgeyBzdGFja3MgfSkpO1xuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGZpbmQgdGhlIHJvb3QgY2F1c2VzIGZvciBkZXBsb3ltZW50IGZhaWx1cmVzIG9mIHRoZSBnaXZlbiBzdGFja3MuXG4gICAqXG4gICAqIEJvdGggZW1pdHMgdGhlIGRpYWdub3NpcyByZXN1bHRzIG92ZXIgdGhlIElPIGhvc3QgYXMgdGhleSBhcmUgY29taW5nIGluLCBhcyB3ZWxsXG4gICAqIGFzIHJldHVybnMgYWxsIG9mIHRoZW0gYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIE5PVEU6IFRoZSBDbG91ZCBBc3NlbWJseSBTb3VyY2UgKipzaG91bGQqKiBiZSBjb25maWd1cmVkIHdpdGggYGRlYnVnOiB0cnVlYCB0byBhZGRcbiAgICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpYWdub3NlKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGlhZ25vc2VPcHRpb25zID0ge30pOiBQcm9taXNlPERpYWdub3NlUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdkaWFnbm9zZScpO1xuXG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnZGlhZ25vc2UnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBzeW50aEFuZE1lYXN1cmUoaW9IZWxwZXIsIGN4LCBzZWxlY3RTdGFja3MpO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2Vzcyhhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdkaWFnbm9zZScpLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUgPz8gREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsIGlvSGVscGVyKTtcblxuICAgIC8vIERvIHN0YWNrcyBpbiBwYXJhbGxlbCwgZm9yIHNwZWVkLlxuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KG9wdGlvbnMuY29uY3VycmVuY3kgPz8gMTApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzLm1hcCgoc3RhY2spID0+IGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2spO1xuXG4gICAgICBjb25zdCBkaWFnbm9zZXIgPSBuZXcgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3Nlcih7XG4gICAgICAgIHNkazogc3RhY2tFbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IHN0YWNrRW52LnJlc291cmNlcyxcbiAgICAgICAgc291cmNlVHJhY2VyOiBuZXcgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlcihzdGFjayksXG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICBhZGRpdGlvbmFsRXhwbG9yYXRpb25TZGtQcm92aWRlcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHN0YWNrRW52LnNkayksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGF3YWl0IGRpYWdub3Nlci5kaWFnbm9zZUZyb21GcmVzaChzdGFjay5zdGFja05hbWUpO1xuXG4gICAgICBjb25zdCByZXQ6IERpYWdub3NlZFN0YWNrID0ge1xuICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgaGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICByZXN1bHQ6IGRpYWdub3NpcyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIGFjdGlvbjogJ2RpYWdub3NlJyxcbiAgICAgICAgLi4uaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzKHJldCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9KSkpO1xuXG4gICAgcmV0dXJuIHsgc3RhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgQWN0aW9uXG4gICAqXG4gICAqIFN5bnRoZXNpemVzIHRoZSBDREsgYXBwIGFuZCByZWFkcyB0aGUgcG9saWN5IHZhbGlkYXRpb24gcmVwb3J0XG4gICAqIGZyb20gdGhlIGNsb3VkIGFzc2VtYmx5IG91dHB1dCBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBWYWxpZGF0ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8VmFsaWRhdGVSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICd2YWxpZGF0ZScpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcblxuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc2VsZWN0U3RhY2tzKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG5cbiAgICBjb25zdCByZXBvcnRzID0gYXdhaXQgb2J0YWluVW5pZmllZFZhbGlkYXRpb25SZXBvcnQoYXNzZW1ibHksIHN0YWNrcyk7XG5cbiAgICAvLyBPbmxpbmUgdmFsaWRhdGlvbjogc3VibWl0IHRlbXBsYXRlcyB0byBDbG91ZEZvcm1hdGlvbiBmb3IgZWFybHkgdmFsaWRhdGlvblxuICAgIGlmIChvcHRpb25zLm9ubGluZSA/PyB0cnVlKSB7XG4gICAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ3ZhbGlkYXRlJyk7XG5cbiAgICAgIGNvbnN0IG9ubGluZVJlcG9ydCA9IGF3YWl0IHRoaXMudmFsaWRhdGVPbmxpbmUoaW9IZWxwZXIsIHN0YWNrcywgZGVwbG95bWVudHMpO1xuICAgICAgaWYgKG9ubGluZVJlcG9ydCkge1xuICAgICAgICByZXBvcnRzLnB1c2gob25saW5lUmVwb3J0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNBbnlWaW9sYXRpb25zID0gcmVwb3J0cy5zb21lKHJlcG9ydCA9PiByZXBvcnQudmlvbGF0aW9ucyAmJiByZXBvcnQudmlvbGF0aW9ucy5sZW5ndGggPiAwKTtcblxuICAgIGNvbnN0IHJlc3VsdDogVmFsaWRhdGVSZXN1bHQgPSB7XG4gICAgICBjb25jbHVzaW9uOiBjb21iaW5lQ29uY2x1c2lvbnMocmVwb3J0cyksXG4gICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgcGx1Z2luUmVwb3J0czogcmVwb3J0cyxcbiAgICB9O1xuXG4gICAgaWYgKCFoYXNBbnlWaW9sYXRpb25zKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk2MDAubXNnKCdWYWxpZGF0aW9uIGRpZCBub3QgZmluZCBhbnkgcHJvYmxlbXMuJywgcmVzdWx0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShob3N0TWVzc2FnZUZyb21WYWxpZGF0aW9uKHByb2Nlc3MuY3dkKCksIHJlc3VsdCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlT25saW5lKFxuICAgIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgICBzdGFja3M6IFN0YWNrQ29sbGVjdGlvbixcbiAgICBkZXBsb3ltZW50czogRGVwbG95bWVudHMsXG4gICk6IFByb21pc2U8UGx1Z2luUmVwb3J0SnNvbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHZpb2xhdGlvbnM6IFBsdWdpblJlcG9ydEpzb25bJ3Zpb2xhdGlvbnMnXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IGNyZWF0ZVZhbGlkYXRpb25DaGFuZ2VTZXQoaW9IZWxwZXIsIHtcbiAgICAgICAgICBkZXBsb3ltZW50cyxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7fSxcbiAgICAgICAgICB1dWlkOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgd2lsbEV4ZWN1dGU6IGZhbHNlLFxuICAgICAgICAgIGZhaWxPbkVycm9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVwb3J0LmRpYWdub3Npcy50eXBlID09PSAncHJvYmxlbScpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHByb2JsZW0gb2YgcmVwb3J0LmRpYWdub3Npcy5wcm9ibGVtcykge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgcnVsZU5hbWU6IHByb2JsZW0uZXJyb3JDb2RlID8/ICdDbG91ZEZvcm1hdGlvblZhbGlkYXRpb24nLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvYmxlbS5tZXNzYWdlLnJlcGxhY2UoL1xccypcXChhdFxccytcXC9SZXNvdXJjZXNcXC9bXildK1xcKVxccyokLywgJycpLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ2ZhdGFsJyxcbiAgICAgICAgICAgICAgdmlvbGF0aW5nQ29uc3RydWN0czogW3tcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RQYXRoOiBwcm9ibGVtLnNvdXJjZVRyYWNlPy5jb25zdHJ1Y3RQYXRoID8/IChwcm9ibGVtLmxvZ2ljYWxJZCA/IGAke3N0YWNrLmhpZXJhcmNoaWNhbElkfS8ke3Byb2JsZW0ubG9naWNhbElkfWAgOiBzdGFjay5oaWVyYXJjaGljYWxJZCksXG4gICAgICAgICAgICAgICAgY2xvdWRGb3JtYXRpb25SZXNvdXJjZTogcHJvYmxlbS5sb2dpY2FsSWQgPyB7XG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IGAke3N0YWNrLnN0YWNrTmFtZX0udGVtcGxhdGUuanNvbmAsXG4gICAgICAgICAgICAgICAgICBsb2dpY2FsSWQ6IHByb2JsZW0ubG9naWNhbElkLFxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZXM6IHByb2JsZW0uc291cmNlVHJhY2U/LmNyZWF0aW9uU3RhY2tUcmFjZSA/IFtwcm9ibGVtLnNvdXJjZVRyYWNlLmNyZWF0aW9uU3RhY2tUcmFjZS5qb2luKCdcXG4nKV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c5NjAyLm1zZyhgT25saW5lIHZhbGlkYXRpb24gY291bGQgbm90IGJlIGNvbXBsZXRlZCBmb3Igc3RhY2sgJyR7c3RhY2suaGllcmFyY2hpY2FsSWR9JzogJHtlLm1lc3NhZ2V9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGx1Z2luTmFtZTogJ0Nsb3VkRm9ybWF0aW9uJyxcbiAgICAgIGNvbmNsdXNpb246ICdmYWlsdXJlJyxcbiAgICAgIHZpb2xhdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgQWN0aW9uXG4gICAqXG4gICAqIERlcGxveXMgdGhlIHNlbGVjdGVkIHN0YWNrcyBpbnRvIGFuIEFXUyBhY2NvdW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVwbG95KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGVwbG95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXBsb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkZXBsb3knKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIHN0YWNrc09wdChvcHRpb25zKSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnZGVwbG95JywgYXNzZW1ibHkuc3ludGhEdXJhdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IGRlcGxveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVwbG95KGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdkZXBsb3knIHwgJ3dhdGNoJywgc3ludGhEdXJhdGlvbjogRWxhcHNlZFRpbWUsIG9wdGlvbnM6IFByaXZhdGVEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPERlcGxveVJlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBzdGFja3NPcHQob3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBhd2FpdCB0aHJvd0lmVmFsaWRhdGlvbkZhaWx1cmVzKGFzc2VtYmx5LCBzdGFja0NvbGxlY3Rpb24sIHRoaXMuYXNzZW1ibHlGYWlsdXJlQXQsIGlvSGVscGVyKTtcblxuICAgIGNvbnN0IHJldDogRGVwbG95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTUwMDEubXNnKCdUaGlzIGFwcCBjb250YWlucyBubyBzdGFja3MnKSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGVwbG95Jyk7XG5cbiAgICBpZiAoIWlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSkge1xuICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hlbHBlciB9KTtcbiAgICAgIGF3YWl0IG1pZ3JhdG9yLnRyeU1pZ3JhdGVSZXNvdXJjZXMoc3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJNYXAgPSBidWlsZFBhcmFtZXRlck1hcChvcHRpb25zLnBhcmFtZXRlcnM/LnBhcmFtZXRlcnMpO1xuXG4gICAgaWYgKG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZD8ubWV0aG9kID09PSAnaG90c3dhcCcpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTQwMC5tc2coW1xuICAgICAgICAn4pqg77iPIEhvdHN3YXAgZGVwbG95bWVudHMgZGVsaWJlcmF0ZWx5IGludHJvZHVjZSBDbG91ZEZvcm1hdGlvbiBkcmlmdCB0byBzcGVlZCB1cCBkZXBsb3ltZW50cycsXG4gICAgICAgICfimqDvuI8gVGhleSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAtIG5ldmVyIHVzZSB0aGVtIGZvciB5b3VyIHByb2R1Y3Rpb24gU3RhY2tzIScsXG4gICAgICBdLmpvaW4oJ1xcbicpKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tzID0gc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzO1xuICAgIGNvbnN0IHN0YWNrT3V0cHV0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IG91dHB1dHNGaWxlID0gb3B0aW9ucy5vdXRwdXRzRmlsZTtcblxuICAgIGNvbnN0IHsgYnVpbGRBc3NldCwgcHVibGlzaEFzc2V0IH0gPSAoKCkgPT4ge1xuICAgICAgaWYgKGlzRXhlY3V0ZUNoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSkge1xuICAgICAgICAvLyBOby1vcDogYXNzZXRzIGFyZSBhbHJlYWR5IHB1Ymxpc2hlZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJ1aWxkQXNzZXQ6IFdvcmtHcmFwaC5OT09QLFxuICAgICAgICAgIHB1Ymxpc2hBc3NldDogV29ya0dyYXBoLk5PT1AsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1aWxkQXNzZXQ6IHRoaXMuY3JlYXRlQnVpbGRBc3NldEZ1bmN0aW9uKGlvSGVscGVyLCBkZXBsb3ltZW50cywgb3B0aW9ucy5yb2xlQXJuKSxcbiAgICAgICAgcHVibGlzaEFzc2V0OiB0aGlzLmNyZWF0ZVB1Ymxpc2hBc3NldEZ1bmN0aW9uKGlvSGVscGVyLCBkZXBsb3ltZW50cywgb3B0aW9ucy5yb2xlQXJuLCBvcHRpb25zLmZvcmNlQXNzZXRQdWJsaXNoaW5nKSxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGRlcGxveVN0YWNrID0gYXN5bmMgKHN0YWNrTm9kZTogU3RhY2tOb2RlKSA9PiB7XG4gICAgICBjb25zdCBzdGFjayA9IHN0YWNrTm9kZS5zdGFjaztcbiAgICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCAhPT0gMSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGNoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGFjay5lbnZpcm9ubWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgICdTdGFja0Vudmlyb25tZW50TWlzc2luZycsXG4gICAgICAgICAgYFN0YWNrICR7c3RhY2suZGlzcGxheU5hbWV9IGRvZXMgbm90IGRlZmluZSBhbiBlbnZpcm9ubWVudCwgYW5kIEFXUyBjcmVkZW50aWFscyBjb3VsZCBub3QgYmUgb2J0YWluZWQgZnJvbSBzdGFuZGFyZCBsb2NhdGlvbnMgb3Igbm8gcmVnaW9uIHdhcyBjb25maWd1cmVkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBnZW5lcmF0ZWQgc3RhY2sgaGFzIG5vIHJlc291cmNlc1xuICAgICAgY29uc3QgcmVzb3VyY2VDb3VudCA9IE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcyB8fCB7fSkubGVuZ3RoO1xuICAgICAgaWYgKHJlc291cmNlQ291bnQgPT09IDApIHtcbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHkgYW5kIGRvZXNuJ3QgZXhpc3QgPT4gZG8gbm90aGluZ1xuICAgICAgICBjb25zdCBzdGFja0V4aXN0cyA9IGF3YWl0IGRlcGxveW1lbnRzLnN0YWNrRXhpc3RzKHsgc3RhY2sgfSk7XG4gICAgICAgIGlmICghc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1MDIxLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIHNraXBwaW5nIGRlcGxveW1lbnQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHksIGJ1dCBleGlzdHMgPT4gZGVsZXRlXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTAyMi5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBzdGFjayBoYXMgbm8gcmVzb3VyY2VzLCBkZWxldGluZyBleGlzdGluZyBzdGFjay5gKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXBsb3knLCB7XG4gICAgICAgICAgc3RhY2tzOiB7IHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLCBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFIH0sXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRUZW1wbGF0ZSA9IGF3YWl0IGRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2spO1xuXG4gICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzYW1lIHNlbWFudGljcyB3ZSBhcHBseSB3aXRoIHJlc3BlY3QgdG8gTm90aWZpY2F0aW9uIEFSTnMgKGRpY3RhdGVkIGJ5IHRoZSBTREspXG4gICAgICAvL1xuICAgICAgLy8gIC0gdW5kZWZpbmVkICA9PiAgY2RrIGlnbm9yZXMgaXQsIGFzIGlmIGl0IHdhc24ndCBzdXBwb3J0ZWQgKGFsbG93cyBleHRlcm5hbCBtYW5hZ2VtZW50KS5cbiAgICAgIC8vICAtIFtdOiAgICAgICAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gd2lwZSBpdCBvdXQuXG4gICAgICAvLyAgLSBbJ2Fybi0xJ10gID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNldCBpdCB0byBbJ2Fybi0xJ10uXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Bcm5zID0gKCEhb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zIHx8ICEhc3RhY2subm90aWZpY2F0aW9uQXJucylcbiAgICAgICAgPyAob3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zID8/IFtdKS5jb25jYXQoc3RhY2subm90aWZpY2F0aW9uQXJucyA/PyBbXSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uQXJuIG9mIG5vdGlmaWNhdGlvbkFybnMgPz8gW10pIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVNuc1RvcGljQXJuKG5vdGlmaWNhdGlvbkFybikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdJbnZhbGlkU25zVG9waWNBcm4nLCBgTm90aWZpY2F0aW9uIGFybiAke25vdGlmaWNhdGlvbkFybn0gaXMgbm90IGEgdmFsaWQgYXJuIGZvciBhbiBTTlMgdG9waWNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZXBsb3kgb3B0aW9ucyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBjaGFuZ2Ugc2V0IGNyZWF0aW9uIGFuZCBleGVjdXRpb25cbiAgICAgIGNvbnN0IHNoYXJlZERlcGxveU9wdGlvbnMgPSB7XG4gICAgICAgIHN0YWNrLFxuICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgICAgdGFnczogb3B0aW9ucy50YWdzPy5sZW5ndGggPyBvcHRpb25zLnRhZ3MgOiB0YWdzRm9yU3RhY2soc3RhY2spLFxuICAgICAgICBmb3JjZURlcGxveW1lbnQ6IG9wdGlvbnMuZm9yY2VEZXBsb3ltZW50LFxuICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuYXNzaWduKHt9LCBwYXJhbWV0ZXJNYXBbJyonXSwgcGFyYW1ldGVyTWFwW3N0YWNrLnN0YWNrTmFtZV0pLFxuICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycz8ua2VlcEV4aXN0aW5nUGFyYW1ldGVycyxcbiAgICAgICAgcm9sbGJhY2s6IG9wdGlvbnMucm9sbGJhY2ssXG4gICAgICAgIG5vdGlmaWNhdGlvbkFybnMsXG4gICAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgICBhc3NldFBhcmFsbGVsaXNtOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgICB9O1xuXG4gICAgICAvLyBXaGVuIHVzaW5nIGNoYW5nZS1zZXQgbWV0aG9kLCBhbHdheXMgY3JlYXRlIHRoZSBjaGFuZ2Ugc2V0IHVwZnJvbnQuXG4gICAgICAvLyBUaGlzIGdpdmVzIHVzIGFuIGFjY3VyYXRlIGRpZmYgZm9yIGFwcHJvdmFsIGFuZCBhdm9pZHMgY3JlYXRpbmcgaXQgdHdpY2UuXG4gICAgICAvLyBGb3Igbm9uLWV4ZWN1dGluZyBkZXBsb3ltZW50cyAocHJlcGFyZS1jaGFuZ2Utc2V0KSwgdGhpcyBpcyB0aGUgZmluYWwgcmVzdWx0LlxuICAgICAgY29uc3QgcHJlcGFyZVJlc3VsdCA9IGlzQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgID8gYXdhaXQgZGVwbG95bWVudHMucHJlcGFyZVN0YWNrKHtcbiAgICAgICAgICAuLi5zaGFyZWREZXBsb3lPcHRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgICAgICBjbGVhbnVwT25Ob09wOiBpc0V4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSxcbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFNraXAgdGhlIGFwcHJvdmFsIHByb21wdCBlbnRpcmVseSB3aGVuIHRoZSBwcmVwYXJlZCBjaGFuZ2Ugc2V0IGhhcyBub1xuICAgICAgLy8gY2hhbmdlcyDigJQgdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIHVzZXIgdG8gYXBwcm92ZS4gT3V0cHV0cywgc3RhY2sgQVJOLFxuICAgICAgLy8gYW5kIHRpbWluZ3MgYXJlIHN0aWxsIGVtaXR0ZWQgdmlhIHRoZSBub3JtYWwgbm8tb3AgZGVwbG95IHBhdGggYmVsb3cuXG4gICAgICBpZiAoIXByZXBhcmVSZXN1bHQ/Lm5vT3ApIHtcbiAgICAgICAgLy8gRm9yIGV4ZWN1dGUtY2hhbmdlLXNldCwgZGVzY3JpYmUgdGhlIGV4aXN0aW5nIGNoYW5nZSBzZXQgc28gd2UgY2FuIHNob3cgYW4gYWNjdXJhdGUgZGlmZlxuICAgICAgICBjb25zdCBkaWZmQ2hhbmdlU2V0ID0gaXNFeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgPyBhd2FpdCBkZXBsb3ltZW50cy5kZXNjcmliZUNoYW5nZVNldChzdGFjaywgb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLmNoYW5nZVNldE5hbWUsIHByZXBhcmVSZXN1bHQ/LnN0YWNrQXJuKVxuICAgICAgICAgIDogcHJlcGFyZVJlc3VsdD8uY2hhbmdlU2V0O1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEaWZmRm9ybWF0dGVyKHtcbiAgICAgICAgICB0ZW1wbGF0ZUluZm86IHtcbiAgICAgICAgICAgIG9sZFRlbXBsYXRlOiBjdXJyZW50VGVtcGxhdGUsXG4gICAgICAgICAgICBuZXdUZW1wbGF0ZTogc3RhY2ssXG4gICAgICAgICAgICBjaGFuZ2VTZXQ6IGRpZmZDaGFuZ2VTZXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2VjdXJpdHlEaWZmID0gZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5RGlmZigpO1xuICAgICAgICBjb25zdCBzdGFja0RpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U3RhY2tEaWZmKCk7XG5cbiAgICAgICAgLy8gU2VuZCBhIHJlcXVlc3QgcmVzcG9uc2Ugd2l0aCB0aGUgZGlmZiBhcyBwYXJ0IG9mIHRoZSBtZXNzYWdlLFxuICAgICAgICAvLyBhbmQgdGhlIHRlbXBsYXRlIGRpZmYgYXMgZGF0YVxuICAgICAgICAvLyAoSW9Ib3N0IGRlY2lkZXMgd2hldGhlciB0byBwcmludCBkZXBlbmRpbmcgb24gcGVybWlzc2lvbkNoYW5nZVR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1NlY3VyaXR5Q2hhbmdlcyA9IHNlY3VyaXR5RGlmZi5wZXJtaXNzaW9uQ2hhbmdlVHlwZSAhPT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORTtcbiAgICAgICAgY29uc3QgZGVwbG95TW90aXZhdGlvbiA9IGhhc1NlY3VyaXR5Q2hhbmdlc1xuICAgICAgICAgID8gJ1wiLS1yZXF1aXJlLWFwcHJvdmFsXCIgaXMgZW5hYmxlZCBhbmQgc3RhY2sgaW5jbHVkZXMgc2VjdXJpdHktc2Vuc2l0aXZlIHVwZGF0ZXMuJ1xuICAgICAgICAgIDogJ1wiLS1yZXF1aXJlLWFwcHJvdmFsXCIgaXMgZW5hYmxlZCBhbmQgc3RhY2sgaW5jbHVkZXMgdXBkYXRlcy4nO1xuICAgICAgICBjb25zdCBkaWZmT3V0cHV0ID0gaGFzU2VjdXJpdHlDaGFuZ2VzID8gc2VjdXJpdHlEaWZmLmZvcm1hdHRlZERpZmYgOiBzdGFja0RpZmYuZm9ybWF0dGVkRGlmZjtcbiAgICAgICAgY29uc3QgZGVwbG95UXVlc3Rpb24gPSBgJHtkaWZmT3V0cHV0fVxcblxcbiR7ZGVwbG95TW90aXZhdGlvbn1cXG5EbyB5b3Ugd2lzaCB0byBkZXBsb3kgdGhlc2UgY2hhbmdlc2A7XG4gICAgICAgIGNvbnN0IGRlcGxveUNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA2MC5yZXEoZGVwbG95UXVlc3Rpb24sIHtcbiAgICAgICAgICBtb3RpdmF0aW9uOiBkZXBsb3lNb3RpdmF0aW9uLFxuICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgIHBlcm1pc3Npb25DaGFuZ2VUeXBlOiBzZWN1cml0eURpZmYucGVybWlzc2lvbkNoYW5nZVR5cGUsXG4gICAgICAgICAgdGVtcGxhdGVEaWZmczogZm9ybWF0dGVyLmRpZmZzLFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICghZGVwbG95Q29uZmlybWVkKSB7XG4gICAgICAgICAgaWYgKHByZXBhcmVSZXN1bHQ/LmNoYW5nZVNldD8uQ2hhbmdlU2V0TmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgZGVwbG95bWVudHMuY2xlYW51cENoYW5nZVNldChzdGFjaywgcHJlcGFyZVJlc3VsdC5jaGFuZ2VTZXQuQ2hhbmdlU2V0TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKCdEZXBsb3lBYm9ydGVkJywgJ0RlcGxveW1lbnQgY2FuY2VsbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHN0YWNrcy5pbmRleE9mKHN0YWNrKSArIDE7XG4gICAgICBjb25zdCBkZXBsb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFUExPWV9TVEFDSylcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogZGVwbG95aW5nLi4uIFske3N0YWNrSW5kZXh9LyR7c3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnR9XWAsIHtcbiAgICAgICAgICB0b3RhbDogc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQsXG4gICAgICAgICAgY3VycmVudDogc3RhY2tJbmRleCxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgfSk7XG4gICAgICBkZXBsb3lTcGFuLmluY0NvdW50ZXIoJ3Jlc291cmNlcycsIHJlc291cmNlQ291bnQpO1xuXG4gICAgICBsZXQgZGVwbG95RHVyYXRpb247XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcmVwYXJlSXNGaW5hbCA9IHByZXBhcmVSZXN1bHQgJiYgKHByZXBhcmVSZXN1bHQubm9PcCB8fCBpc05vbkV4ZWN1dGluZ0NoYW5nZVNldERlcGxveW1lbnQob3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kKSk7XG4gICAgICAgIGxldCBkZXBsb3lSZXN1bHQ6IFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZCA9IHByZXBhcmVJc0ZpbmFsID8gcHJlcGFyZVJlc3VsdCA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgcm9sbGJhY2sgPSBvcHRpb25zLnJvbGxiYWNrO1xuICAgICAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICAgICAgd2hpbGUgKCFkZXBsb3lSZXN1bHQpIHtcbiAgICAgICAgICBpZiAoKytpdGVyYXRpb24gPiAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3lMb29wVW5zdGFibGUnLCAnVGhpcyBsb29wIHNob3VsZCBoYXZlIHN0YWJpbGl6ZWQgaW4gMiBpdGVyYXRpb25zLCBidXQgZGlkblxcJ3QuIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IGRlcGxveW1lbnRzLmRlcGxveVN0YWNrKHtcbiAgICAgICAgICAgIC4uLnNoYXJlZERlcGxveU9wdGlvbnMsXG4gICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBleGVjdXRlIHRoZSBwcmVwYXJlZCBjaGFuZ2Ugc2V0LlxuICAgICAgICAgICAgLy8gT24gcmV0cmllcyAoYWZ0ZXIgcm9sbGJhY2spLCBjcmVhdGUgYSBuZXcgY2hhbmdlIHNldCBzaW5jZSB0aGUgb2xkIG9uZSBpcyBnb25lLlxuICAgICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogaXRlcmF0aW9uID09PSAxICYmIGlzRXhlY3V0aW5nQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgICAgID8gdG9FeGVjdXRlQ2hhbmdlU2V0RGVwbG95bWVudChvcHRpb25zLmRlcGxveW1lbnRNZXRob2QpXG4gICAgICAgICAgICAgIDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgICAgICAgcm9sbGJhY2ssXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzd2l0Y2ggKHIudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlkLWRlcGxveS1zdGFjayc6XG4gICAgICAgICAgICAgIGRlcGxveVJlc3VsdCA9IHI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdmYWlscGF1c2VkLW5lZWQtcm9sbGJhY2stZmlyc3QnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSByLnJlYXNvbiA9PT0gJ3JlcGxhY2VtZW50J1xuICAgICAgICAgICAgICAgID8gYFN0YWNrIGlzIGluIGEgcGF1c2VkIGZhaWwgc3RhdGUgKCR7ci5zdGF0dXN9KSBhbmQgY2hhbmdlIGluY2x1ZGVzIGEgcmVwbGFjZW1lbnQgd2hpY2ggY2Fubm90IGJlIGRlcGxveWVkIHdpdGggXCItLW5vLXJvbGxiYWNrXCJgXG4gICAgICAgICAgICAgICAgOiBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGRvIG5vdCBpbmNsdWRlIFwiLS1uby1yb2xsYmFja1wiYDtcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgIG1vdGl2YXRpb24sXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcignUm9sbGJhY2tBYm9ydGVkJywgJ1JvbGxiYWNrIGNhbmNlbGxlZCcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCBhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzdGFja3M6IHtcbiAgICAgICAgICAgICAgICAgIHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLFxuICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXNEdXJpbmdSb2xsYmFjayxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2VtZW50LXJlcXVpcmVzLXJvbGxiYWNrJzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gJ0NoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiJztcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBgJHttb3RpdmF0aW9ufS4gUGVyZm9ybSBhIHJlZ3VsYXIgZGVwbG95bWVudGA7XG5cbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgIG1vdGl2YXRpb24sXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcignUmVwbGFjZW1lbnRSb2xsYmFja0Fib3J0ZWQnLCAnUm9sbGJhY2sgY2FuY2VsbGVkJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBHbyBhcm91bmQgdGhyb3VnaCB0aGUgJ3doaWxlJyBsb29wIGFnYWluIGJ1dCBzd2l0Y2ggcm9sbGJhY2sgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgcm9sbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5leHBlY3RlZERlcGxveVJlc3VsdCcsIGBVbmV4cGVjdGVkIHJlc3VsdCB0eXBlIGZyb20gZGVwbG95U3RhY2s6ICR7SlNPTi5zdHJpbmdpZnkocil9LiBJZiB5b3UgYXJlIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkZXBsb3lSZXN1bHQubm9PcFxuICAgICAgICAgID8gYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfWA7XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAwLm1zZyhjaGFsay5ncmVlbignXFxuJyArIG1lc3NhZ2UpLCBkZXBsb3lSZXN1bHQpKTtcbiAgICAgICAgZGVwbG95RHVyYXRpb24gPSBhd2FpdCBkZXBsb3lTcGFuLnRpbWluZyhJTy5DREtfVE9PTEtJVF9JNTAwMCk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRlcGxveVJlc3VsdC5vdXRwdXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gWydPdXRwdXRzOiddO1xuICAgICAgICAgIHN0YWNrT3V0cHV0c1tzdGFjay5zdGFja05hbWVdID0gZGVwbG95UmVzdWx0Lm91dHB1dHM7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLnNvcnQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXBsb3lSZXN1bHQub3V0cHV0c1tuYW1lXTtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke2NoYWxrLmN5YW4oc3RhY2suaWQpfS4ke2NoYWxrLmN5YW4obmFtZSl9ID0gJHtjaGFsay51bmRlcmxpbmUoY2hhbGsuY3lhbih2YWx1ZSkpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDEubXNnKGJ1ZmZlci5qb2luKCdcXG4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMS5tc2coYFN0YWNrIEFSTjpcXG4ke2RlcGxveVJlc3VsdC5zdGFja0Fybn1gKSk7XG5cbiAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhY2tBcm46IGRlcGxveVJlc3VsdC5zdGFja0FybixcbiAgICAgICAgICBvdXRwdXRzOiBkZXBsb3lSZXN1bHQub3V0cHV0cyxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogc3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICAgICAgZGVsZXRlRmFpbHVyZXM6IGRlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgLy8gSXQgaGFzIHRvIGJlIGV4YWN0bHkgdGhpcyBzdHJpbmcgYmVjYXVzZSBhbiBpbnRlZ3JhdGlvbiB0ZXN0IHRlc3RzIGZvclxuICAgICAgICAvLyBcImJvbGQoc3RhY2tuYW1lKSBmYWlsZWQ6IFJlc291cmNlTm90UmVhZHk6IDxlcnJvcj5cIlxuICAgICAgICBjb25zdCBjb2RlID0gVG9vbGtpdEVycm9yLmlzVG9vbGtpdEVycm9yKGUpID8gZS5uYW1lIDogJ0RlcGxveVN0YWNrRmFpbGVkJztcbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZSA9IFtg4p2MICAke2NoYWxrLmJvbGQoc3RhY2suc3RhY2tOYW1lKX0gZmFpbGVkOmAsIC4uLihlLm5hbWUgPyBbYCR7ZS5uYW1lfTpgXSA6IFtdKSwgZS5tZXNzYWdlXS5qb2luKCcgJyk7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoY29kZSwgbmV3TWVzc2FnZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAob3B0aW9ucy50cmFjZUxvZ3MpIHtcbiAgICAgICAgICAvLyBkZXBsb3kgY2FsbHMgdGhhdCBvcmlnaW5hdGUgZnJvbSB3YXRjaCB3aWxsIGNvbWUgd2l0aCB0aGVpciBvd24gY2xvdWRXYXRjaExvZ01vbml0b3JcbiAgICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMuY2xvdWRXYXRjaExvZ01vbml0b3IgPz8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoeyBpb0hlbHBlciB9KTtcbiAgICAgICAgICBjb25zdCBmb3VuZExvZ0dyb3Vwc1Jlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RlcGxveScpLCBpb0hlbHBlciwgc3RhY2spO1xuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLmFkZExvZ0dyb3VwcyhcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LmVudixcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LnNkayxcbiAgICAgICAgICAgIGZvdW5kTG9nR3JvdXBzUmVzdWx0LmxvZ0dyb3VwTmFtZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUwMzEubXNnKGBUaGUgZm9sbG93aW5nIGxvZyBncm91cHMgYXJlIGFkZGVkOiAke2ZvdW5kTG9nR3JvdXBzUmVzdWx0LmxvZ0dyb3VwTmFtZXN9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYW4gb3V0cHV0cyBmaWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgY3JlYXRlIHRoZSBmaWxlIHBhdGggYW5kIHdyaXRlIHN0YWNrIG91dHB1dHMgdG8gaXQgb25jZS5cbiAgICAgICAgLy8gT3V0cHV0cyBhcmUgd3JpdHRlbiBhZnRlciBhbGwgc3RhY2tzIGhhdmUgYmVlbiBkZXBsb3llZC4gSWYgYSBzdGFjayBkZXBsb3ltZW50IGZhaWxzLFxuICAgICAgICAvLyBhbGwgb2YgdGhlIG91dHB1dHMgZnJvbSBzdWNjZXNzZnVsbHkgZGVwbG95ZWQgc3RhY2tzIGJlZm9yZSB0aGUgZmFpbHVyZSB3aWxsIHN0aWxsIGJlIHdyaXR0ZW4uXG4gICAgICAgIGlmIChvdXRwdXRzRmlsZSkge1xuICAgICAgICAgIGZzLmVuc3VyZUZpbGVTeW5jKG91dHB1dHNGaWxlKTtcbiAgICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24ob3V0cHV0c0ZpbGUsIHN0YWNrT3V0cHV0cywge1xuICAgICAgICAgICAgc3BhY2VzOiAyLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBzeW50aER1cmF0aW9uLmFzTXMgKyAoZGVwbG95RHVyYXRpb24/LmFzTXMgPz8gMCk7XG4gICAgICBhd2FpdCBkZXBsb3lTcGFuLmVuZChgXFxu4pyoICBUb3RhbCB0aW1lOiAke2Zvcm1hdFRpbWUoZHVyYXRpb24pfXNcXG5gLCB7IGR1cmF0aW9uIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBhc3NldEJ1aWxkVGltZSA9IG9wdGlvbnMuYXNzZXRCdWlsZFRpbWUgPz8gQXNzZXRCdWlsZFRpbWUuQUxMX0JFRk9SRV9ERVBMT1k7XG4gICAgY29uc3QgcHJlYnVpbGRBc3NldHMgPSBhc3NldEJ1aWxkVGltZSA9PT0gQXNzZXRCdWlsZFRpbWUuQUxMX0JFRk9SRV9ERVBMT1k7XG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5IHx8IDE7XG5cbiAgICBjb25zdCBzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzID0gc3RhY2tzLmZsYXRNYXAoKHN0YWNrKSA9PiBbXG4gICAgICBzdGFjayxcbiAgICAgIC4uLnN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoeCA9PiBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3QuaXNBc3NldE1hbmlmZXN0QXJ0aWZhY3QoeCkpLFxuICAgIF0pO1xuICAgIGNvbnN0IHdvcmtHcmFwaCA9IG5ldyBXb3JrR3JhcGhCdWlsZGVyKGlvSGVscGVyLCBwcmVidWlsZEFzc2V0cykuYnVpbGQoc3RhY2tzQW5kVGhlaXJBc3NldE1hbmlmZXN0cyk7XG5cbiAgICAvLyBVbmxlc3Mgd2UgYXJlIHJ1bm5pbmcgd2l0aCAnLS1mb3JjZScsIHNraXAgYWxyZWFkeSBwdWJsaXNoZWQgYXNzZXRzXG4gICAgaWYgKCFvcHRpb25zLmZvcmNlQXNzZXRQdWJsaXNoaW5nKSB7XG4gICAgICBhd2FpdCByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoKHdvcmtHcmFwaCwgZGVwbG95bWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYXBoQ29uY3VycmVuY3k6IENvbmN1cnJlbmN5ID0ge1xuICAgICAgJ3N0YWNrJzogY29uY3VycmVuY3ksXG4gICAgICAnYXNzZXQtYnVpbGQnOiAob3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtID8/IHRydWUpID8gb3B0aW9ucy5hc3NldEJ1aWxkQ29uY3VycmVuY3kgPz8gMSA6IDEsIC8vIFRoaXMgd2lsbCBiZSBDUFUtYm91bmQvbWVtb3J5IGJvdW5kLCBtb3N0bHkgbWF0dGVycyBmb3IgRG9ja2VyIGJ1aWxkc1xuICAgICAgJ2Fzc2V0LXB1Ymxpc2gnOiAob3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtID8/IHRydWUpID8gOCA6IDEsIC8vIFRoaXMgd2lsbCBiZSBJL08tYm91bmQsIDggaW4gcGFyYWxsZWwgc2VlbXMgcmVhc29uYWJsZVxuICAgICAgJ21hcmtlcic6IDEsXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIGRlcGxveVN0YWNrLFxuICAgICAgYnVpbGRBc3NldCxcbiAgICAgIHB1Ymxpc2hBc3NldCxcbiAgICAgIC8vIE1hcmtlcnMgYXJlIG9ubHkgdXNlZCBmb3IgdGVsZW1ldHJ5LCBhbmQgdGhlIHRvb2xraXQtbGliIGlzbid0IGN1cnJlbnRseSBjb2xsZWN0aW5nIGFueSwgc28gTk9PUCBpcyBmaW5lLlxuICAgICAgbWFya2VyOiBXb3JrR3JhcGguTk9PUCxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggQWN0aW9uXG4gICAqXG4gICAqIENvbnRpbnVvdXNseSBvYnNlcnZlIHByb2plY3QgZmlsZXMgYW5kIGRlcGxveSB0aGUgc2VsZWN0ZWQgc3RhY2tzXG4gICAqIGF1dG9tYXRpY2FsbHkgd2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gRGVmYXVsdHMgdG8gaG90c3dhcCBkZXBsb3ltZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LCBzdGFydGluZyBhIHdhdGNoZXIgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2goY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBXYXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SVdhdGNoZXI+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICd3YXRjaCcpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCwgZmFsc2UpO1xuICAgIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLndhdGNoRGlyID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBGb3IgdGhlIFwiaW5jbHVkZVwiIHNldHRpbmcsIHRoZSBiZWhhdmlvciBpczpcbiAgICAvLyAxLiBcIndhdGNoXCIgc2V0dGluZyB3aXRob3V0IGFuIFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIqKlwiLlxuICAgIC8vIDIuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGggYW4gZW1wdHkgXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIioqXCIuXG4gICAgLy8gMy4gTm9uLWVtcHR5IFwiaW5jbHVkZVwiIGtleT8gSnVzdCB1c2UgdGhlIFwiaW5jbHVkZVwiIGtleS5cbiAgICBjb25zdCB3YXRjaEluY2x1ZGVzID0gb3B0aW9ucy5pbmNsdWRlID8/IFtdO1xuICAgIGlmICh3YXRjaEluY2x1ZGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICB3YXRjaEluY2x1ZGVzLnB1c2goJyoqJyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSBcImV4Y2x1ZGVcIiBzZXR0aW5nLCB0aGUgYmVoYXZpb3IgaXMgdG8gYWRkIHNvbWUgZGVmYXVsdCBleGNsdWRlcyBpbiBhZGRpdGlvbiB0b1xuICAgIC8vIHBhdHRlcm5zIHNwZWNpZmllZCBieSB0aGUgdXNlciBzZW5zaWJsZSBkZWZhdWx0IHBhdHRlcm5zOlxuICAgIGNvbnN0IHdhdGNoRXhjbHVkZXMgPSBvcHRpb25zLmV4Y2x1ZGUgPz8gWy4uLldBVENIX0VYQ0xVREVfREVGQVVMVFNdO1xuICAgIC8vIDEuIFRoZSBDREsgb3V0cHV0IGRpcmVjdG9yeSwgaWYgaXQgaXMgdW5kZXIgdGhlIHJvb3REaXJcbiAgICBjb25zdCByZWxhdGl2ZU91dERpciA9IHBhdGgucmVsYXRpdmUocm9vdERpciwgYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICBpZiAoQm9vbGVhbihyZWxhdGl2ZU91dERpciAmJiAhcmVsYXRpdmVPdXREaXIuc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVPdXREaXIpKSkge1xuICAgICAgd2F0Y2hFeGNsdWRlcy5wdXNoKGAke3JlbGF0aXZlT3V0RGlyfS8qKmApO1xuICAgIH1cbiAgICAvLyAyLiBBbnkgZmlsZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnLionLCAnKiovLionKTtcbiAgICAvLyAzLiBBbnkgZGlyZWN0b3J5J3MgY29udGVudCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnKiovLiovKionKTtcbiAgICAvLyA0LiBBbnkgbm9kZV9tb2R1bGVzIGFuZCBpdHMgY29udGVudCAoZXZlbiBpZiBpdCdzIG5vdCBhIEpTL1RTIHByb2plY3QsIHlvdSBtaWdodCBiZSB1c2luZyBhIGxvY2FsIGF3cy1jbGkgcGFja2FnZSlcbiAgICB3YXRjaEV4Y2x1ZGVzLnB1c2goJyoqL25vZGVfbW9kdWxlcy8qKicpO1xuXG4gICAgLy8gUHJpbnQgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiBvbiBjb21wdXRlZCBzZXR0aW5nc1xuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMC5tc2coW1xuICAgICAgYHJvb3QgZGlyZWN0b3J5IHVzZWQgZm9yICd3YXRjaCcgaXM6ICR7cm9vdERpcn1gLFxuICAgICAgYCdpbmNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEluY2x1ZGVzKX1gLFxuICAgICAgYCdleGNsdWRlJyBwYXR0ZXJucyBmb3IgJ3dhdGNoJzogJHtKU09OLnN0cmluZ2lmeSh3YXRjaEV4Y2x1ZGVzKX1gLFxuICAgIF0uam9pbignXFxuJyksIHtcbiAgICAgIHdhdGNoRGlyOiByb290RGlyLFxuICAgICAgaW5jbHVkZXM6IHdhdGNoSW5jbHVkZXMsXG4gICAgICBleGNsdWRlczogd2F0Y2hFeGNsdWRlcyxcbiAgICB9KSk7XG5cbiAgICAvLyBTaW5jZSAnY2RrIGRlcGxveScgaXMgYSByZWxhdGl2ZWx5IHNsb3cgb3BlcmF0aW9uIGZvciBhICd3YXRjaCcgcHJvY2VzcyxcbiAgICAvLyBpbnRyb2R1Y2UgYSBjb25jdXJyZW5jeSBsYXRjaCB0aGF0IHRyYWNrcyB0aGUgc3RhdGUuXG4gICAgLy8gVGhpcyB3YXksIGlmIGZpbGUgY2hhbmdlIGV2ZW50cyBhcnJpdmUgd2hlbiBhICdjZGsgZGVwbG95JyBpcyBzdGlsbCBleGVjdXRpbmcsXG4gICAgLy8gd2Ugd2lsbCBiYXRjaCB0aGVtLCBhbmQgdHJpZ2dlciBhbm90aGVyICdjZGsgZGVwbG95JyBhZnRlciB0aGUgY3VycmVudCBvbmUgZmluaXNoZXMsXG4gICAgLy8gbWFraW5nIHN1cmUgJ2NkayBkZXBsb3kncyAgYWx3YXlzIGV4ZWN1dGUgb25lIGF0IGEgdGltZS5cbiAgICAvLyBIZXJlJ3MgYSBkaWFncmFtIHNob3dpbmcgdGhlIHN0YXRlIHRyYW5zaXRpb25zOlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tICAgIGZpbGUgY2hhbmdlZCAgICAgLS0tLS0tLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgZmlsZSBjaGFuZ2VkXG4gICAgLy8gfCAgICAgICAgICAgIHwgIHJlYWR5IGV2ZW50ICAgfCAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tfFxuICAgIC8vIHwgcHJlLXJlYWR5ICB8IC0tLS0tLS0tLS0tLS0+IHwgb3BlbiB8ICAgICAgICAgICAgICAgICAgICAgfCBkZXBsb3lpbmcgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgcXVldWVkICAgfCAgICAgICAgICAgICAgIHxcbiAgICAvLyB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS18XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICdjZGsgZGVwbG95JyBkb25lICAtLS0tLS0tLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tXG4gICAgdHlwZSBMYXRjaFN0YXRlID0gJ3ByZS1yZWFkeScgfCAnb3BlbicgfCAnZGVwbG95aW5nJyB8ICdxdWV1ZWQnO1xuICAgIGxldCBsYXRjaDogTGF0Y2hTdGF0ZSA9ICdwcmUtcmVhZHknO1xuXG4gICAgY29uc3QgY2xvdWRXYXRjaExvZ01vbml0b3IgPSBvcHRpb25zLnRyYWNlTG9ncyA/IG5ldyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yKHsgaW9IZWxwZXIgfSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVwbG95QW5kV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnIGFzIExhdGNoU3RhdGU7XG4gICAgICBhd2FpdCBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uZGVhY3RpdmF0ZSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuXG4gICAgICAvLyBJZiBsYXRjaCBpcyBzdGlsbCAnZGVwbG95aW5nJyBhZnRlciB0aGUgJ2F3YWl0JywgdGhhdCdzIGZpbmUsXG4gICAgICAvLyBidXQgaWYgaXQncyAncXVldWVkJywgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGRlcGxveSBhZ2FpblxuICAgICAgd2hpbGUgKGxhdGNoID09PSAncXVldWVkJykge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3QgcmVhbGl6ZSBsYXRjaCBjYW4gY2hhbmdlIGJldHdlZW4gJ2F3YWl0cycsXG4gICAgICAgIC8vIGFuZCB0aGlua3MgdGhlIGFib3ZlICd3aGlsZScgY29uZGl0aW9uIGlzIGFsd2F5cyAnZmFsc2UnIHdpdGhvdXQgdGhlIGNhc3RcbiAgICAgICAgbGF0Y2ggPSAnZGVwbG95aW5nJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzE1Lm1zZyhcIkRldGVjdGVkIGZpbGUgY2hhbmdlcyBkdXJpbmcgZGVwbG95bWVudC4gSW52b2tpbmcgJ2NkayBkZXBsb3knIGFnYWluXCIpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcbiAgICAgIH1cbiAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgYXdhaXQgY2xvdWRXYXRjaExvZ01vbml0b3I/LmFjdGl2YXRlKCk7XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBpZ25vcmUgbWF0Y2hlciBmb3IgY2hva2lkYXIgdjQgY29tcGF0aWJpbGl0eVxuICAgIC8vIENob2tpZGFyIHY0IHJlbW92ZWQgZ2xvYiBwYXR0ZXJuIHN1cHBvcnQsIHNvIHdlIHVzZSBwaWNvbWF0Y2ggdG8gZmlsdGVyIGZpbGVzXG4gICAgLy8gV2UgcGFzcyByb290RGlyIGJlY2F1c2UgY2hva2lkYXIgdjQgcGFzc2VzIGFic29sdXRlIHBhdGhzIHRvIHRoZSBpZ25vcmVkIGNhbGxiYWNrXG4gICAgY29uc3Qgc2hvdWxkSWdub3JlID0gY3JlYXRlSWdub3JlTWF0Y2hlcih7XG4gICAgICBpbmNsdWRlOiB3YXRjaEluY2x1ZGVzLFxuICAgICAgZXhjbHVkZTogd2F0Y2hFeGNsdWRlcyxcbiAgICAgIHJvb3REaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXJcbiAgICAgIC53YXRjaCgnLicsIHtcbiAgICAgICAgaWdub3JlZDogc2hvdWxkSWdub3JlLFxuICAgICAgICBjd2Q6IHJvb3REaXIsXG4gICAgICB9KVxuICAgICAgLm9uKCdyZWFkeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKFwiJ3dhdGNoJyByZWNlaXZlZCB0aGUgJ3JlYWR5JyBldmVudC4gRnJvbSBub3cgb24sIGFsbCBmaWxlIGNoYW5nZXMgd2lsbCB0cmlnZ2VyIGEgZGVwbG95bWVudFwiKTtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzE0Lm1zZyhcIlRyaWdnZXJpbmcgaW5pdGlhbCAnY2RrIGRlcGxveSdcIikpO1xuICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgfSlcbiAgICAgIC5vbignYWxsJywgYXN5bmMgKGV2ZW50OiBFdmVudE5hbWUsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBub24tZmlsZSBldmVudHMgKGUuZy4sICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJylcbiAgICAgICAgLy8gVGhlc2UgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSBvciBub3QgcmVsZXZhbnQgZm9yIHdhdGNoIGRlcGxveW1lbnRzXG4gICAgICAgIGlmICghaXNGaWxlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhdGNoRXZlbnQgPSB7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsYXRjaCA9PT0gJ3ByZS1yZWFkeScpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTEubXNnKGAnd2F0Y2gnIGlzIG9ic2VydmluZyAke2V2ZW50ID09PSAnYWRkRGlyJyA/ICdkaXJlY3RvcnknIDogJ3RoZSBmaWxlJ30gJyR7ZmlsZVBhdGh9JyBmb3IgY2hhbmdlc2AsIHdhdGNoRXZlbnQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXRjaCA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEyLm1zZyhgRGV0ZWN0ZWQgY2hhbmdlIHRvICcke2ZpbGVQYXRofScgKHR5cGU6ICR7ZXZlbnR9KS4gVHJpZ2dlcmluZyAnY2RrIGRlcGxveSdgLCB3YXRjaEV2ZW50KSk7XG4gICAgICAgICAgYXdhaXQgZGVwbG95QW5kV2F0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIG1lYW5zIGxhdGNoIGlzIGVpdGhlciAnZGVwbG95aW5nJyBvciAncXVldWVkJ1xuICAgICAgICAgIGxhdGNoID0gJ3F1ZXVlZCc7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEzLm1zZyhcbiAgICAgICAgICAgIGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pIHdoaWxlICdjZGsgZGVwbG95JyBpcyBzdGlsbCBydW5uaW5nLiBXaWxsIHF1ZXVlIGZvciBhbm90aGVyIGRlcGxveW1lbnQgYWZ0ZXIgdGhpcyBvbmUgZmluaXNoZXMnYCxcbiAgICAgICAgICAgIHdhdGNoRXZlbnQsXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcHBlZFByb21pc2UgPSBwcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIC8vIHN0b3AgdGhlIGxvZ3MgbW9uaXRvciwgaWYgaXQgZXhpc3RzXG4gICAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5kZWFjdGl2YXRlKCk7XG4gICAgICAgIC8vIGNsb3NlIHRoZSB3YXRjaGVyIGl0c2VsZlxuICAgICAgICBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgICAgIHN0b3BwZWRQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgd2FpdEZvckVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICB9LFxuICAgIH0gc2F0aXNmaWVzIElXYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIEFjdGlvblxuICAgKlxuICAgKiBSb2xscyBiYWNrIHRoZSBzZWxlY3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMgPSB7fSk6IFByb21pc2U8Um9sbGJhY2tSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdyb2xsYmFjaycpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9yb2xsYmFjayhhc3NlbWJseSwgJ3JvbGxiYWNrJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHJvbGxiYWNrIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgb3Igd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcm9sbGJhY2soYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ3JvbGxiYWNrJyB8ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogUm9sbGJhY2tPcHRpb25zKTogUHJvbWlzZTxSb2xsYmFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IHN0YWNrc09wdChvcHRpb25zKTtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG5cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHRocm93SWZWYWxpZGF0aW9uRmFpbHVyZXMoYXNzZW1ibHksIHN0YWNrcywgdGhpcy5hc3NlbWJseUZhaWx1cmVBdCwgaW9IZWxwZXIpO1xuXG4gICAgY29uc3QgcmV0OiBSb2xsYmFja1Jlc3VsdCA9IHtcbiAgICAgIHN0YWNrczogW10sXG4gICAgfTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U2MDAxLm1zZygnTm8gc3RhY2tzIHNlbGVjdGVkJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBsZXQgYW55Um9sbGJhY2thYmxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RhY2tdIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHJvbGxiYWNrU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ST0xMQkFDS19TVEFDSykuYmVnaW4oYFJvbGxpbmcgYmFjayAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfWAsIHtcbiAgICAgICAgdG90YWw6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgICBjdXJyZW50OiBpbmRleCArIDEsXG4gICAgICAgIHN0YWNrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ3JvbGxiYWNrJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGFja1Jlc3VsdCA9IGF3YWl0IGRlcGxveW1lbnRzLnJvbGxiYWNrU3RhY2soe1xuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgb3JwaGFuRmFpbGVkUmVzb3VyY2VzOiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcyxcbiAgICAgICAgICB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbjogb3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgICAgICBvcnBoYW5Mb2dpY2FsSWRzOiBvcHRpb25zLm9ycGhhbkxvZ2ljYWxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXN0YWNrUmVzdWx0Lm5vdEluUm9sbGJhY2thYmxlU3RhdGUpIHtcbiAgICAgICAgICBhbnlSb2xsYmFja2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJvbGxiYWNrU3Bhbi5lbmQoKTtcblxuICAgICAgICByZXQuc3RhY2tzLnB1c2goe1xuICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICBhY2NvdW50OiBzdGFjay5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgICAgICAgcmVnaW9uOiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBzdGFja0Fybjogc3RhY2tSZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgcmVzdWx0OiBzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlID8gJ2FscmVhZHktc3RhYmxlJyA6ICdyb2xsZWQtYmFjaycsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNjkwMC5tc2coYFxcbiDinYwgICR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ1JvbGxiYWNrRmFpbGVkJywgJ1JvbGxiYWNrIGZhaWxlZCAodXNlIC0tZm9yY2UgdG8gb3JwaGFuIGZhaWxpbmcgcmVzb3VyY2VzKScsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFueVJvbGxiYWNrYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm9Sb2xsYmFja2FibGVTdGFja3MnLCAnTm8gc3RhY2tzIHdlcmUgaW4gYSBzdGF0ZSB0aGF0IGNvdWxkIGJlIHJvbGxlZCBiYWNrJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcnBoYW4gQWN0aW9uLiBEZXRhY2hlcyByZXNvdXJjZXMgZnJvbSBhIENsb3VkRm9ybWF0aW9uIHN0YWNrIHdpdGhvdXQgZGVsZXRpbmcgdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvcnBoYW4oY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBPcnBoYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlVW5zdGFibGVGZWF0dXJlKCdvcnBoYW4nKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ29ycGhhbicpO1xuXG4gICAgLy8gUGFyc2UgY29uc3RydWN0IHBhdGhzIGludG8gc3RhY2sgY29uc3RydWN0IElEICsgY29uc3RydWN0LWxldmVsIHBhdGhzLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQW5kVmFsaWRhdGVDb25zdHJ1Y3RQYXRocyhvcHRpb25zLmNvbnN0cnVjdFBhdGhzKTtcblxuICAgIC8vIFN5bnRoIGFsbCBzdGFja3MsIHRoZW4gZmluZCB0aGUgb25lIHdob3NlIGhpZXJhcmNoaWNhbElkIG1hdGNoZXMgdGhlIHN0YWNrIGNvbnN0cnVjdCBJRC5cbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IHN5bnRoQW5kTWVhc3VyZShpb0hlbHBlciwgY3gsIEFMTF9TVEFDS1MpO1xuICAgIGNvbnN0IGFsbFN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKEFMTF9TVEFDS1MpO1xuICAgIGNvbnN0IHN0YWNrID0gYWxsU3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmZpbmQocyA9PiBzLmhpZXJhcmNoaWNhbElkID09PSBwYXJzZWQuc3RhY2tJZCk7XG5cbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAnU3RhY2tOb3RGb3VuZCcsXG4gICAgICAgIGBObyBzdGFjayBmb3VuZCB3aXRoIGNvbnN0cnVjdCBJRCAnJHtwYXJzZWQuc3RhY2tJZH0nLiBBdmFpbGFibGUgc3RhY2tzOiAke2FsbFN0YWNrcy5zdGFja0FydGlmYWN0cy5tYXAocyA9PiBzLmhpZXJhcmNoaWNhbElkKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ29ycGhhbicpO1xuXG4gICAgY29uc3Qgb3JwaGFuZXIgPSBuZXcgUmVzb3VyY2VPcnBoYW5lcih7XG4gICAgICBkZXBsb3ltZW50cyxcbiAgICAgIGlvSGVscGVyLFxuICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lID8/IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBsYW4gPSBhd2FpdCBvcnBoYW5lci5tYWtlUGxhbihzdGFjaywgcGFyc2VkLmNvbnN0cnVjdFBhdGhzKTtcblxuICAgIC8vIFNob3cgdGhlIHBsYW5cbiAgICBjb25zdCByZXNvdXJjZUxpbmVzID0gcGxhbi5vcnBoYW5lZFJlc291cmNlc1xuICAgICAgLm1hcCgocikgPT4gYCAgJHtyLmxvZ2ljYWxJZH0gKCR7ci5yZXNvdXJjZVR5cGV9KSAtICR7ci5jZGtQYXRofWApXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhcbiAgICAgIGBTdGFjazogJHtwbGFuLnN0YWNrTmFtZX1cXG5gICtcbiAgICAgIGBSZXNvdXJjZXMgdG8gb3JwaGFuICgke3BsYW4ub3JwaGFuZWRSZXNvdXJjZXMubGVuZ3RofSk6XFxuYCArXG4gICAgICByZXNvdXJjZUxpbmVzLFxuICAgICk7XG5cbiAgICAvLyBDb25maXJtIGJlZm9yZSBvcnBoYW5pbmdcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTg4MTAucmVxKFxuICAgICAgJ0RvIHlvdSB3aXNoIHRvIG9ycGhhbiB0aGVzZSByZXNvdXJjZXM/IFRoaXMgd2lsbCBwZXJmb3JtIDMgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudHMuJywge1xuICAgICAgICBtb3RpdmF0aW9uOiAnVXNlciBjb25maXJtYXRpb24gaXMgbmVlZGVkIGJlZm9yZSBvcnBoYW5pbmcgcmVzb3VyY2VzJyxcbiAgICAgIH0pKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoJ09ycGhhbkFib3J0ZWQnLCAnT3JwaGFuaW5nIGNhbmNlbGxlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYW4uZXhlY3V0ZSgpO1xuXG4gICAgLy8gT3V0cHV0IG5leHQgc3RlcHNcbiAgICBjb25zdCBtYXBwaW5nSnNvbiA9IE9iamVjdC5rZXlzKHJlc3VsdC5yZXNvdXJjZU1hcHBpbmcpLmxlbmd0aCA+IDBcbiAgICAgID8gYCAtLXJlc291cmNlLW1hcHBpbmctaW5saW5lICcke0pTT04uc3RyaW5naWZ5KHJlc3VsdC5yZXNvdXJjZU1hcHBpbmcpfSdgXG4gICAgICA6ICcnO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oXG4gICAgICBg4pyFIFJlc291cmNlcyBvcnBoYW5lZCBmcm9tICR7cGxhbi5zdGFja05hbWV9XFxuXFxuYCArXG4gICAgICAnTmV4dCBzdGVwczpcXG4nICtcbiAgICAgICcgIDEuIFVwZGF0ZSB5b3VyIENESyBjb2RlIHRvIHVzZSB0aGUgbmV3IHJlc291cmNlIHR5cGVcXG4nICtcbiAgICAgIGAgIDIuIGNkayBpbXBvcnQke21hcHBpbmdKc29ufWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZhY3RvciBBY3Rpb24uIE1vdmVzIHJlc291cmNlcyBmcm9tIG9uZSBsb2NhdGlvbiAoc3RhY2sgKyBsb2dpY2FsIElEKSB0byBhbm90aGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZmFjdG9yKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogUmVmYWN0b3JPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVVbnN0YWJsZUZlYXR1cmUoJ3JlZmFjdG9yJyk7XG5cbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdyZWZhY3RvcicpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmYWN0b3IoYXNzZW1ibHksIGlvSGVscGVyLCBjeCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWZhY3Rvcihhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgaW9IZWxwZXI6IElvSGVscGVyLCBjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJlZmFjdG9yT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKCdyZWZhY3RvcicpO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhY2tzID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICBjb25zdCBncm91cHMgPSBhd2FpdCBncm91cFN0YWNrcyhzZGtQcm92aWRlciwgc2VsZWN0ZWRTdGFja3Muc3RhY2tBcnRpZmFjdHMsIG9wdGlvbnMuYWRkaXRpb25hbFN0YWNrTmFtZXMgPz8gW10pO1xuXG4gICAgZm9yIChsZXQgeyBlbnZpcm9ubWVudCwgbG9jYWxTdGFja3MsIGRlcGxveWVkU3RhY2tzIH0gb2YgZ3JvdXBzKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGZvcm1hdEVudmlyb25tZW50U2VjdGlvbkhlYWRlcihlbnZpcm9ubWVudCkpO1xuXG4gICAgICBjb25zdCBuZXdTdGFja3MgPSBsb2NhbFN0YWNrcy5maWx0ZXIocyA9PiAhZGVwbG95ZWRTdGFja3MubWFwKHQgPT4gdC5zdGFja05hbWUpLmluY2x1ZGVzKHMuc3RhY2tOYW1lKSk7XG4gICAgICBpZiAobmV3U3RhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLypcbiAgICAgICAgIFdoZW4gdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrIHJlZmFjdG9yIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHN0YWNrLCBhbmQgdGhlIHJlc291cmNlcyBiZWluZyBtb3ZlZCB0byB0aGF0XG4gICAgICAgICBuZXcgc3RhY2sgaGF2ZSByZWZlcmVuY2VzIHRvIG90aGVyIHJlc291cmNlcywgQ2xvdWRGb3JtYXRpb24gbmVlZHMgdG8gZG8gd2hhdCB0aGV5IGNhbGwgXCJjb2xsYXBzaW5nIHRoZVxuICAgICAgICAgdGVtcGxhdGVcIi4gVGhlIGRldGFpbHMgZG9uJ3QgcmVhbGx5IG1hdHRlciwgZXhjZXB0IHRoYXQsIGluIHRoZSBwcm9jZXNzLCBpdCBjYWxscyBzb21lIHNlcnZpY2UgQVBJcywgdG8gcmVhZFxuICAgICAgICAgdGhlIHJlc291cmNlcyBiZWluZyBtb3ZlZC4gVGhlIHJvbGUgaXQgdXNlcyB0byBjYWxsIHRoZXNlIEFQSXMgaW50ZXJuYWxseSBpcyB0aGUgcm9sZSB0aGUgdXNlciBjYWxsZWQgdGhlXG4gICAgICAgICBzdGFjayByZWZhY3RvcmluZyBBUEkgd2l0aCwgd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnQgcm9sZSwgZnJvbSB0aGUgYm9vdHN0cmFwIHN0YWNrLFxuICAgICAgICAgYnkgZGVmYXVsdC5cblxuICAgICAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGlzIHJvbGUgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0byByZWFkIGFsbCByZXNvdXJjZSB0eXBlcy4gSW4gdGhpcyBjYXNlLFxuICAgICAgICAgQ2xvdWRGb3JtYXRpb24gd2lsbCByb2xsIGJhY2sgdGhlIHJlZmFjdG9yIG9wZXJhdGlvbi4gU2luY2UgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlIEFQSSwgdGhhdFxuICAgICAgICAgdGhlIHVzZXIgY2Fubm90IGtub3cgYWJvdXQsIGFuZCBkaWRuJ3QgYXNrIGZvciwgaXQgd2lsbCBiZSB2ZXJ5IHN1cnByaXNpbmcuIFNvIHdlJ3ZlIGRlY2lkZWQgdG8gYmxvY2sgdGhpcyB1c2VcbiAgICAgICAgIGNhc2UgdW50aWwgQ2xvdWRGb3JtYXRpb24gc3VwcG9ydHMgcGFzc2luZyBhIGRpZmZlcmVudCByb2xlIHRvIHVzZSBmb3IgdGhlc2UgcmVhZCBvcGVyYXRpb25zLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgd2l0aCBkZXBsb3ltZW50LlxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaGUgZm9sbG93aW5nIHN0YWNrJHtuZXdTdGFja3MubGVuZ3RoID09PSAxID8gJyBpcycgOiAncyBhcmUnfSBuZXc6ICR7bmV3U3RhY2tzLm1hcChzID0+IHMuc3RhY2tOYW1lKS5qb2luKCcsICcpfVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ0NyZWF0aW9uIG9mIG5ldyBzdGFja3MgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHJlZmFjdG9yIGNvbW1hbmQuICc7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ1BsZWFzZSBkZXBsb3kgYW55IG5ldyBzdGFja3Mgc2VwYXJhdGVseSBiZWZvcmUgcmVmYWN0b3JpbmcgeW91ciBzdGFja3MuJztcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoY2hhbGsucmVkKG1lc3NhZ2UpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgUmVmYWN0b3JpbmdDb250ZXh0KHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBkZXBsb3llZFN0YWNrcyxcbiAgICAgICAgICBsb2NhbFN0YWNrcyxcbiAgICAgICAgICBhc3N1bWVSb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgb3ZlcnJpZGVzOiBnZXRPdmVycmlkZXMoZW52aXJvbm1lbnQsIGRlcGxveWVkU3RhY2tzLCBsb2NhbFN0YWNrcyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG1hcHBpbmdzID0gY29udGV4dC5tYXBwaW5ncztcblxuICAgICAgICBpZiAobWFwcGluZ3MubGVuZ3RoID09PSAwICYmIGNvbnRleHQuYW1iaWd1b3VzUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnTm90aGluZyB0byByZWZhY3Rvci4nKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGVkTWFwcGluZ3MgPSBtYXBwaW5nc1xuICAgICAgICAgIC5tYXAobSA9PiBtLnRvVHlwZWRNYXBwaW5nKCkpXG4gICAgICAgICAgLmZpbHRlcihtID0+IG0udHlwZSAhPT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpO1xuXG4gICAgICAgIGxldCByZWZhY3Rvck1lc3NhZ2UgPSBmb3JtYXRUeXBlZE1hcHBpbmdzKHR5cGVkTWFwcGluZ3MpO1xuICAgICAgICBjb25zdCByZWZhY3RvclJlc3VsdDogUmVmYWN0b3JSZXN1bHQgPSB7IHR5cGVkTWFwcGluZ3MgfTtcblxuICAgICAgICBjb25zdCBzdGFja0RlZmluaXRpb25zID0gYXdhaXQgZ2VuZXJhdGVTdGFja0RlZmluaXRpb25zKG1hcHBpbmdzLCBkZXBsb3llZFN0YWNrcywgbG9jYWxTdGFja3MsIGVudmlyb25tZW50LCBzZGtQcm92aWRlciwgaW9IZWxwZXIpO1xuXG4gICAgICAgIGlmIChjb250ZXh0LmFtYmlndW91c1BhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwYXRocyA9IGNvbnRleHQuYW1iaWd1b3VzUGF0aHM7XG4gICAgICAgICAgcmVmYWN0b3JNZXNzYWdlICs9ICdcXG4nICsgZm9ybWF0QW1iaWd1b3VzTWFwcGluZ3MocGF0aHMpO1xuICAgICAgICAgIHJlZmFjdG9yUmVzdWx0LmFtYmlndW91c1BhdGhzID0gcGF0aHM7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTg5MDAubXNnKHJlZmFjdG9yTWVzc2FnZSwgcmVmYWN0b3JSZXN1bHQpKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4gfHwgY29udGV4dC5tYXBwaW5ncy5sZW5ndGggPT09IDAgfHwgY29udGV4dC5hbWJpZ3VvdXNQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRvLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gaW50ZXJhY3RpdmUgbW9kZSAoVFRZKSB3ZSBuZWVkIGNvbmZpcm1hdGlvbiBiZWZvcmUgcHJvY2VlZGluZ1xuICAgICAgICBpZiAocHJvY2Vzcy5zdGRvdXQuaXNUVFkgJiYgIWF3YWl0IGNvbmZpcm0ob3B0aW9ucy5mb3JjZSA/PyBmYWxzZSkpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGNoYWxrLnJlZChgUmVmYWN0b3JpbmcgY2FuY2VsZWQgZm9yIGVudmlyb25tZW50IGF3czovLyR7ZW52aXJvbm1lbnQuYWNjb3VudH0vJHtlbnZpcm9ubWVudC5yZWdpb259XFxuYCkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnUmVmYWN0b3JpbmcuLi4nKTtcbiAgICAgICAgYXdhaXQgY29udGV4dC5leGVjdXRlKHN0YWNrRGVmaW5pdGlvbnMsIHNka1Byb3ZpZGVyLCBpb0hlbHBlcik7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ+KchSAgU3RhY2sgcmVmYWN0b3IgY29tcGxldGUnKTtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdEZXBsb3lpbmcgdXBkYXRlZCBzdGFja3MgdG8gZmluYWxpemUgcmVmYWN0b3IuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXBsb3koY3gsIHtcbiAgICAgICAgICBzdGFja3M6IEFMTF9TVEFDS1MsXG4gICAgICAgICAgZm9yY2VEZXBsb3ltZW50OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYOKdjCAgUmVmYWN0b3IgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGUpfWA7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FODkwMC5tc2cobWVzc2FnZSwgeyBlcnJvcjogZSB9KSk7XG5cbiAgICAgICAgLy8gQWxzbyBkZWJ1Z2dpbmcgdGhlIGVycm9yLCBiZWNhdXNlIHRoZSBBUEkgZG9lcyBub3QgYWx3YXlzIHJldHVybiBhIHVzZXItZnJpZW5kbHkgbWVzc2FnZVxuICAgICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE92ZXJyaWRlcyhlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsIGRlcGxveWVkU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sIGxvY2FsU3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pIHtcbiAgICAgIGNvbnN0IG1hcHBpbmdHcm91cCA9IG9wdGlvbnMub3ZlcnJpZGVzXG4gICAgICAgID8uZmluZChnID0+IGcucmVnaW9uID09PSBlbnZpcm9ubWVudC5yZWdpb24gJiYgZy5hY2NvdW50ID09PSBlbnZpcm9ubWVudC5hY2NvdW50KTtcblxuICAgICAgcmV0dXJuIG1hcHBpbmdHcm91cCA9PSBudWxsXG4gICAgICAgID8gW11cbiAgICAgICAgOiBPYmplY3QuZW50cmllcyhtYXBwaW5nR3JvdXAucmVzb3VyY2VzID8/IHt9KVxuICAgICAgICAgIC5tYXAoKFtzb3VyY2UsIGRlc3RpbmF0aW9uXSkgPT4gbmV3IFJlc291cmNlTWFwcGluZyhcbiAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24oc291cmNlLCBkZXBsb3llZFN0YWNrcyksXG4gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uKGRlc3RpbmF0aW9uLCBsb2NhbFN0YWNrcyksXG4gICAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UmVzb3VyY2VMb2NhdGlvbihsb2NhdGlvbjogc3RyaW5nLCBzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFJlc291cmNlTG9jYXRpb24ge1xuICAgICAgZm9yIChsZXQgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgICAgIGNvbnN0IFtzdGFja05hbWUsIGxvZ2ljYWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICBpZiAoc3RhY2tOYW1lICE9IG51bGwgJiYgbG9naWNhbElkICE9IG51bGwgJiYgc3RhY2suc3RhY2tOYW1lID09PSBzdGFja05hbWUgJiYgc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzPy5bbG9naWNhbElkXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUxvY2F0aW9uKHN0YWNrLCBsb2dpY2FsSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlRW50cnkgPSBPYmplY3RcbiAgICAgICAgICAgIC5lbnRyaWVzKHN0YWNrLnRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSlcbiAgICAgICAgICAgIC5maW5kKChbXywgcl0pID0+IHIuTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ10gPT09IGxvY2F0aW9uKTtcbiAgICAgICAgICBpZiAocmVzb3VyY2VFbnRyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTG9jYXRpb24oc3RhY2ssIHJlc291cmNlRW50cnlbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVzb3VyY2VMb2NhdGlvbk5vdEZvdW5kJywgYENhbm5vdCBmaW5kIHJlc291cmNlIGluIGxvY2F0aW9uICR7bG9jYXRpb259YCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY29uZmlybShmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgLy8gJ2ZvcmNlJyBpcyBzZXQgdG8gdHJ1ZSBpcyB0aGUgZXF1aXZhbGVudCBvZiBoYXZpbmcgcHJlLWFwcHJvdmFsIGZvciBhbnkgcmVmYWN0b3JcbiAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlc3Rpb24gPSAnRG8geW91IHdpc2ggdG8gcmVmYWN0b3IgdGhlc2UgcmVzb3VyY2VzPyc7XG4gICAgICByZXR1cm4gaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k4OTEwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICBtb3RpdmF0aW9uOiAnVXNlciBpbnB1dCBpcyBuZWVkZWQnLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yOiBhbnkpOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAocGF5bG9hZC5yZWFzb24/LlN0YXR1c1JlYXNvbikge1xuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYFJlZmFjdG9yIGNyZWF0aW9uOiBbJHtwYXlsb2FkLnJlYXNvbj8uU3RhdHVzfV0gJHtwYXlsb2FkLnJlYXNvbi5TdGF0dXNSZWFzb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQucmVhc29uPy5FeGVjdXRpb25TdGF0dXNSZWFzb24pIHtcbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKGBSZWZhY3RvciBleGVjdXRpb246IFske3BheWxvYWQucmVhc29uPy5TdGF0dXN9XSAke3BheWxvYWQucmVhc29uLkV4ZWN1dGlvblN0YXR1c1JlYXNvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXMubGVuZ3RoID4gMCA/IG1lc3NhZ2VzLmpvaW4oJ1xcbicpIDogYFVua25vd24gZXJyb3IgKFN0YWNrIHJlZmFjdG9yIElEOiAke3BheWxvYWQucmVhc29uPy5TdGFja1JlZmFjdG9ySWQgPz8gJ3Vua25vd24nfSlgO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBBY3Rpb25cbiAgICpcbiAgICogRGVzdHJveXMgdGhlIHNlbGVjdGVkIFN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGVzdHJveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RGVzdHJveVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9kZXN0cm95V2l0aEFjdGlvbihjeCwgJ2Rlc3Ryb3knLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aGVzaXplIGFuZCBkZXN0cm95LCBsYWJlbGxpbmcgdGhlIHdvcmsgd2l0aCBhbiBleHBsaWNpdCBhY3Rpb24uXG4gICAqXG4gICAqIEtlcHQgcHJpdmF0ZTogdGhlIENMSSByZWFjaGVzIGl0ICh2aWEgYSBgLy8gQHRzLWlnbm9yZWApIHRvIGtlZXAgdGhlXG4gICAqIFwiZGVwbG95ZWRcIiB3b3JkaW5nIHdoZW4gYSBkZXN0cm95IHJ1bnMgYXMgcGFydCBvZiBhIGRlcGxveSAocm9sbGJhY2tcbiAgICogY2xlYW51cCkuIE5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVzdHJveVdpdGhBY3Rpb24oY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBhY3Rpb246ICdkZXBsb3knIHwgJ2Rlc3Ryb3knLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXN0cm95UmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgc3ludGhBbmRNZWFzdXJlKGlvSGVscGVyLCBjeCwgc3RhY2tzT3B0KG9wdGlvbnMpKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVzdHJveShhc3NlbWJseSwgYWN0aW9uLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgZGVzdHJveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rlc3Ryb3koYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ2RlcGxveScgfCAnZGVzdHJveScsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTxEZXN0cm95UmVzdWx0PiB7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gc3RhY2tzT3B0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuXG4gICAgY29uc3QgcmV0OiBEZXN0cm95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW90aXZhdGlvbiA9ICdEZXN0cm95aW5nIHN0YWNrcyBpcyBhbiBpcnJldmVyc2libGUgYWN0aW9uJztcbiAgICBjb25zdCBxdWVzdGlvbiA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlOiAke2NoYWxrLnJlZChzdGFja3MuaGllcmFyY2hpY2FsSWRzLmpvaW4oJywgJykpfWA7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k3MDEwLnJlcShxdWVzdGlvbiwgeyBtb3RpdmF0aW9uIH0pKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3MDEwLm1zZygnQWJvcnRlZCBieSB1c2VyJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcbiAgICBsZXQgZGVzdHJveUNvdW50ID0gMDtcblxuICAgIGNvbnN0IGRlc3Ryb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFU1RST1lfQUNUSU9OKS5iZWdpbih7XG4gICAgICBzdGFja3M6IHN0YWNrcy5zdGFja0FydGlmYWN0cyxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVN0YWNrID0gYXN5bmMgKHN0YWNrTm9kZTogU3RhY2tOb2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tOb2RlLnN0YWNrO1xuICAgICAgICBkZXN0cm95Q291bnQrKztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzaW5nbGVEZXN0cm95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVNUUk9ZX1NUQUNLKVxuICAgICAgICAgICAgLmJlZ2luKGNoYWxrLmdyZWVuKGAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogZGVzdHJveWluZy4uLiBbJHtkZXN0cm95Q291bnR9LyR7c3RhY2tzLnN0YWNrQ291bnR9XWApLCB7XG4gICAgICAgICAgICAgIHRvdGFsOiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgICAgICAgICAgY3VycmVudDogZGVzdHJveUNvdW50LFxuICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcGxveW1lbnRzLmRlc3Ryb3lTdGFjayh7XG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldC5zdGFja3MucHVzaCh7XG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICBhY2NvdW50OiBzdGFjay5lbnZpcm9ubWVudC5hY2NvdW50LFxuICAgICAgICAgICAgICByZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHN0YWNrQXJuOiByZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgICBzdGFja0V4aXN0ZWQ6IHJlc3VsdC5zdGFja0FybiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k3OTAwLm1zZyhjaGFsay5ncmVlbihgXFxuIOKchSAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufWVkYCksIHN0YWNrKSk7XG4gICAgICAgICAgYXdhaXQgc2luZ2xlRGVzdHJveVNwYW4uZW5kKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNzkwMC5tc2coYFxcbiDinYwgICR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiAke2FjdGlvbn0gZmFpbGVkICR7ZX1gLCB7IGVycm9yOiBlIH0pKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB3b3JrR3JhcGggPSBidWlsZERlc3Ryb3lXb3JrR3JhcGgoc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLCBpb0hlbHBlcik7XG4gICAgICBhd2FpdCB3b3JrR3JhcGgucHJvY2Vzc1N0YWNrcyhjb25jdXJyZW5jeSwgZGVzdHJveVN0YWNrKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGVzdHJveVNwYW4uZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlcGxveW1lbnRzIGNsYXNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlcGxveW1lbnRzRm9yQWN0aW9uKGFjdGlvbjogVG9vbGtpdEFjdGlvbik6IFByb21pc2U8RGVwbG95bWVudHM+IHtcbiAgICByZXR1cm4gbmV3IERlcGxveW1lbnRzKHtcbiAgICAgIHNka1Byb3ZpZGVyOiBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyKGFjdGlvbiksXG4gICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICBpb0hlbHBlcjogYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52b2tlRGVwbG95RnJvbVdhdGNoKFxuICAgIGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LFxuICAgIG9wdGlvbnM6IFdhdGNoT3B0aW9ucyxcbiAgICBjbG91ZFdhdGNoTG9nTW9uaXRvcj86IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoIGRlZmF1bHRzIHRvIGhvdHN3YXAgZGVwbG95bWVudFxuICAgIGNvbnN0IGRlcGxveW1lbnRNZXRob2QgPSBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QgPz8geyBtZXRob2Q6ICdob3Rzd2FwJyB9O1xuICAgIGNvbnN0IGRlcGxveU9wdGlvbnM6IFByaXZhdGVEZXBsb3lPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLFxuICAgICAgZGVwbG95bWVudE1ldGhvZCxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBgY2RrLXdhdGNoL2hvdHN3YXAtJHtkZXBsb3ltZW50TWV0aG9kLm1ldGhvZCA9PT0gJ2hvdHN3YXAnID8gJ29uJyA6ICdvZmYnfWAsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9kZXBsb3koYXNzZW1ibHksICd3YXRjaCcsIHplcm9UaW1lKCksIGRlcGxveU9wdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8ganVzdCBjb250aW51ZSAtIGRlcGxveSB3aWxsIHNob3cgdGhlIGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGZlYXR1cmUgZmxhZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZsYWdzKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSk6IFByb21pc2U8RmVhdHVyZUZsYWdbXT4ge1xuICAgIHRoaXMucmVxdWlyZVVuc3RhYmxlRmVhdHVyZSgnZmxhZ3MnKTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2ZsYWdzJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcbiAgICBjb25zdCBhcnRpZmFjdHMgPSBPYmplY3QudmFsdWVzKGFzc2VtYmx5LmNsb3VkQXNzZW1ibHkubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KTtcbiAgICBjb25zdCBmZWF0dXJlRmxhZ1JlcG9ydHMgPSBhcnRpZmFjdHMuZmlsdGVyKGEgPT4gYS50eXBlID09PSBBcnRpZmFjdFR5cGUuRkVBVFVSRV9GTEFHX1JFUE9SVCk7XG5cbiAgICBjb25zdCBmbGFncyA9IGZlYXR1cmVGbGFnUmVwb3J0cy5mbGF0TWFwKHJlcG9ydCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVwb3J0LnByb3BlcnRpZXMgYXMgRmVhdHVyZUZsYWdSZXBvcnRQcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IHByb3BlcnRpZXMubW9kdWxlO1xuXG4gICAgICBjb25zdCBmbGFnc1dpdGhVbmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSA9IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMuZmxhZ3MpXG4gICAgICAgIC5maWx0ZXIoKFtfLCBmbGFnSW5mb10pID0+IGZsYWdJbmZvLnVuY29uZmlndXJlZEJlaGF2ZXNMaWtlICE9IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNvbnN0IHNob3VsZEluY2x1ZGVVbmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSA9IGZsYWdzV2l0aFVuY29uZmlndXJlZEJlaGF2ZXNMaWtlLmxlbmd0aCA+IDA7XG5cbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLmZsYWdzKS5tYXAoKFtmbGFnTmFtZSwgZmxhZ0luZm9dKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2VGbGFnID0ge1xuICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICBuYW1lOiBmbGFnTmFtZSxcbiAgICAgICAgICByZWNvbW1lbmRlZFZhbHVlOiBmbGFnSW5mby5yZWNvbW1lbmRlZFZhbHVlLFxuICAgICAgICAgIHVzZXJWYWx1ZTogZmxhZ0luZm8udXNlclZhbHVlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBleHBsYW5hdGlvbjogZmxhZ0luZm8uZXhwbGFuYXRpb24gPz8gJycsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNob3VsZEluY2x1ZGVVbmNvbmZpZ3VyZWRCZWhhdmVzTGlrZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlRmxhZyxcbiAgICAgICAgICAgIHVuY29uZmlndXJlZEJlaGF2ZXNMaWtlOiB7XG4gICAgICAgICAgICAgIHYyOiBmbGFnSW5mby51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIgPz8gZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFzZUZsYWc7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZVVuc3RhYmxlRmVhdHVyZShyZXF1ZXN0ZWRGZWF0dXJlOiBVbnN0YWJsZUZlYXR1cmUpIHtcbiAgICBpZiAoIXRoaXMudW5zdGFibGVGZWF0dXJlcy5pbmNsdWRlcyhyZXF1ZXN0ZWRGZWF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5zdGFibGVGZWF0dXJlTm90RW5hYmxlZCcsIGBVbnN0YWJsZSBmZWF0dXJlICcke3JlcXVlc3RlZEZlYXR1cmV9JyBpcyBub3QgZW5hYmxlZC4gUGxlYXNlIGVuYWJsZSBpdCB1bmRlciAndW5zdGFibGVGZWF0dXJlcycgKGN1cnJlbnRseSBlbmFibGVkOiAke3RoaXMudW5zdGFibGVGZWF0dXJlc30pYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJ1aWxkQXNzZXQgZnVuY3Rpb24gZm9yIHVzZSBpbiBXb3JrR3JhcGhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnVpbGRBc3NldEZ1bmN0aW9uKFxuICAgIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgICBkZXBsb3ltZW50czogRGVwbG95bWVudHMsXG4gICAgcm9sZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRCdWlsZE5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkQXNzZXRTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkJVSUxEX0FTU0VUKS5iZWdpbih7XG4gICAgICAgIGFzc2V0OiBhc3NldE5vZGUuYXNzZXQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0QXJ0aWZhY3QsXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXQsXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFjazogYXNzZXROb2RlLnBhcmVudFN0YWNrLFxuICAgICAgICAgIHJvbGVBcm4sXG4gICAgICAgICAgc3RhY2tOYW1lOiBhc3NldE5vZGUucGFyZW50U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGJ1aWxkQXNzZXRTcGFuLmVuZCgpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcHVibGlzaEFzc2V0IGZ1bmN0aW9uIGZvciB1c2UgaW4gV29ya0dyYXBoXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVB1Ymxpc2hBc3NldEZ1bmN0aW9uKFxuICAgIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgICBkZXBsb3ltZW50czogRGVwbG95bWVudHMsXG4gICAgcm9sZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZvcmNlUHVibGlzaD86IGJvb2xlYW4sXG4gICkge1xuICAgIHJldHVybiBhc3luYyAoYXNzZXROb2RlOiBBc3NldFB1Ymxpc2hOb2RlKSA9PiB7XG4gICAgICBjb25zdCBwdWJsaXNoQXNzZXRTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlBVQkxJU0hfQVNTRVQpLmJlZ2luKHtcbiAgICAgICAgYXNzZXQ6IGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZGVwbG95bWVudHMucHVibGlzaFNpbmdsZUFzc2V0KGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LCBhc3NldE5vZGUuYXNzZXQsIHtcbiAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgcm9sZUFybixcbiAgICAgICAgc3RhY2tOYW1lOiBhc3NldE5vZGUucGFyZW50U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBmb3JjZVB1Ymxpc2gsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHB1Ymxpc2hBc3NldFNwYW4uZW5kKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENlbnRyYWxpemUgdGhlIGRlZmF1bHQgc3RhY2sgc2VsZWN0aW9uIGxvZ2ljIGluIGEgc2luZ2xlIHBsYWNlXG4gKlxuICogRGVmYXVsdHMgdG8gYWxsIHN0YWNrcyBpbiB0aGUgYXNzZW1ibHkgKGluY2x1ZGluZyBuZXN0ZWQgYXNzZW1ibGllcykgaWYgbm8gZXhwbGljaXRcbiAqIHNlbGVjdG9yIGlzIGdpdmVuLlxuICovXG5mdW5jdGlvbiBzdGFja3NPcHQobzogeyBzdGFja3M/OiBTdGFja1NlbGVjdG9yIH0pOiBTdGFja1NlbGVjdG9yIHtcbiAgcmV0dXJuIG8uc3RhY2tzID8/IEFMTF9TVEFDS1M7XG59XG5cbi8qKlxuICogUGVyZm9ybSBzeW50aGVzaXMgYW5kIGVtaXQgdGhlIHRpbWUgdGFrZW4gdG8gYSBuZXcgc3BhblxuICovXG5hc3luYyBmdW5jdGlvbiBzeW50aEFuZE1lYXN1cmUoXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLFxuICBzZWxlY3RTdGFja3M6IFN0YWNrU2VsZWN0b3IsXG4pOiBQcm9taXNlPFN0YWNrQXNzZW1ibHkgJiB7IHN5bnRoRHVyYXRpb246IEVsYXBzZWRUaW1lIH0+IHtcbiAgY29uc3Qgc3ludGhTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlNZTlRIX0FTU0VNQkxZKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShzeW50aFNwYW4uYXNIZWxwZXIsIGN4KTtcbiAgICBjb3VudEFzc2VtYmx5UmVzdWx0cyhzeW50aFNwYW4sIHJldC5hc3NlbWJseSk7XG4gICAgY29uc3Qgc3ludGhEdXJhdGlvbiA9IGF3YWl0IHN5bnRoU3Bhbi5lbmQoe30pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmV0LCB7IHN5bnRoRHVyYXRpb24gfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAvLyBFbmQgdGhlIHNwYW4gZXZlbiBpZiB3ZSBoYWQgYSBmYWlsdXJlXG4gICAgYXdhaXQgc3ludGhTcGFuLmVuZCh7IGVycm9yIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHplcm9UaW1lKCk6IEVsYXBzZWRUaW1lIHtcbiAgcmV0dXJuIHsgYXNNczogMCwgYXNTZWM6IDAgfTtcbn1cbiJdfQ==