@workflow/core 5.0.0-beta.40 → 5.0.0-beta.41

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 (70) hide show
  1. package/dist/events-consumer.d.ts +127 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +364 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +116 -44
  7. package/dist/runtime/constants.d.ts +15 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +22 -3
  10. package/dist/runtime/helpers.d.ts +116 -8
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +174 -2
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  16. package/dist/runtime/quickjs-entrypoint.js +13 -5
  17. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  18. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-runtime.js +613 -185
  20. package/dist/runtime/quickjs-serde.d.ts +107 -0
  21. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-serde.js +2098 -0
  23. package/dist/runtime/replay-budget.d.ts +5 -14
  24. package/dist/runtime/replay-budget.d.ts.map +1 -1
  25. package/dist/runtime/replay-budget.js +19 -72
  26. package/dist/runtime/resume-hook.d.ts.map +1 -1
  27. package/dist/runtime/resume-hook.js +5 -1
  28. package/dist/runtime/runs.d.ts.map +1 -1
  29. package/dist/runtime/runs.js +3 -4
  30. package/dist/runtime/start.js +2 -7
  31. package/dist/runtime/step-executor.d.ts.map +1 -1
  32. package/dist/runtime/step-executor.js +1 -4
  33. package/dist/runtime/suspension-handler.d.ts +7 -0
  34. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  35. package/dist/runtime/suspension-handler.js +58 -11
  36. package/dist/runtime/world-compatibility.d.ts +15 -0
  37. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  38. package/dist/runtime/world-compatibility.js +25 -5
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +474 -418
  41. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  42. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  43. package/dist/serialization/codec-devalue-vm.js +12 -1
  44. package/dist/serialization/workflow-vm.d.ts +8 -3
  45. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  46. package/dist/serialization/workflow-vm.js +9 -4
  47. package/dist/step.js +2 -2
  48. package/dist/telemetry/semantic-conventions.d.ts +23 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +18 -1
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/vm/index.d.ts.map +1 -1
  54. package/dist/vm/index.js +9 -6
  55. package/dist/workflow/abort-controller.d.ts.map +1 -1
  56. package/dist/workflow/abort-controller.js +4 -6
  57. package/dist/workflow/attribute-dispatcher.js +2 -2
  58. package/dist/workflow/hook.js +2 -2
  59. package/dist/workflow/sleep.js +2 -2
  60. package/dist/workflow.d.ts +10 -0
  61. package/dist/workflow.d.ts.map +1 -1
  62. package/dist/workflow.js +60 -19
  63. package/docs/how-it-works/event-sourcing.mdx +11 -3
  64. package/package.json +6 -6
  65. package/dist/correlation-id.d.ts +0 -109
  66. package/dist/correlation-id.d.ts.map +0 -1
  67. package/dist/correlation-id.js +0 -139
  68. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  69. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  70. package/dist/serialization/vm-bundle-entry.js +0 -58
@@ -25,7 +25,7 @@ import { serializeTraceCarrier } from '../telemetry.js';
25
25
  import { getInlineOwnershipLeaseSeconds, getMaxInlineSteps, } from './constants.js';
26
26
  import { getPortLazy } from './get-port-lazy.js';
27
27
  import { getWorkflowQueueName, queueMessage } from './helpers.js';
28
- import { startQuickJSWorkflow, } from './quickjs-runtime.js';
28
+ import { BASELINE_BUNDLE_FILENAME, startQuickJSWorkflow, } from './quickjs-runtime.js';
29
29
  import { ReplayBudget } from './replay-budget.js';
30
30
  import { executeStep } from './step-executor.js';
31
31
  import { runStepSingleFlight } from './step-single-flight.js';
@@ -1268,12 +1268,18 @@ export async function runWorkflowWithQuickJS(params) {
1268
1268
  });
1269
1269
  }
1270
1270
  else if (result.failed) {
1271
- // Workflow failed — remap stack trace using inline source maps
1271
+ // Workflow failed — remap stack trace using inline source maps.
1272
+ // Frames carry the run's workflowId as their filename on the fresh
1273
+ // path, but the workflow-independent BASELINE_BUNDLE_FILENAME on the
1274
+ // snapshot path (the name is baked into the shared baseline's
1275
+ // compiled code at hydrate) — remap against both. remapErrorStack
1276
+ // early-exits on a cheap includes() when a filename has no frames.
1272
1277
  let errorStack = result.failed.stack;
1273
1278
  if (errorStack) {
1274
1279
  const parsedName = parseWorkflowName(workflowName);
1275
1280
  const filename = parsedName?.moduleSpecifier || workflowName;
1276
1281
  errorStack = remapErrorStack(errorStack, filename, workflowCode);
1282
+ errorStack = remapErrorStack(errorStack, BASELINE_BUNDLE_FILENAME, workflowCode);
1277
1283
  }
1278
1284
  // Classify the error so consumers (`run.returnValue`, observability)
1279
1285
  // get `USER_ERROR` / `RUNTIME_ERROR` on `error.cause.code`, matching
@@ -1354,7 +1360,8 @@ export async function runWorkflowWithQuickJS(params) {
1354
1360
  typeof hydrated.stack === 'string') {
1355
1361
  const parsedName = parseWorkflowName(workflowName);
1356
1362
  const filename = parsedName?.moduleSpecifier || workflowName;
1357
- hydrated.stack = remapErrorStack(hydrated.stack, filename, workflowCode);
1363
+ // Both filename spaces — see the failed-branch comment above.
1364
+ hydrated.stack = remapErrorStack(remapErrorStack(hydrated.stack, filename, workflowCode), BASELINE_BUNDLE_FILENAME, workflowCode);
1358
1365
  }
1359
1366
  // Walk the cause chain and remap nested stacks too.
1360
1367
  const seen = new WeakSet();
@@ -1365,7 +1372,8 @@ export async function runWorkflowWithQuickJS(params) {
1365
1372
  if (typeof nodeStack === 'string') {
1366
1373
  const parsedName = parseWorkflowName(workflowName);
1367
1374
  const filename = parsedName?.moduleSpecifier || workflowName;
1368
- node.stack = remapErrorStack(nodeStack, filename, workflowCode);
1375
+ // Both filename spaces — see the failed-branch comment above.
1376
+ node.stack = remapErrorStack(remapErrorStack(nodeStack, filename, workflowCode), BASELINE_BUNDLE_FILENAME, workflowCode);
1369
1377
  }
1370
1378
  node = node.cause;
1371
1379
  }
@@ -1426,4 +1434,4 @@ export async function runWorkflowWithQuickJS(params) {
1426
1434
  wfdiag('exit_failed', { result: 'run_failed_written' });
1427
1435
  }
1428
1436
  }
1429
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEdBRXJCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE9BQU8sSUFBSSxxQkFBcUIsR0FFakMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixZQUFZLEdBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFPTCxvQkFBb0IsR0FDckIs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S0FBSyxFQUFFLGVBQWU7b0JBQ3RCLFNBQVM7aUJBQ1Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsYUFBYSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRTtvQkFDbkUsYUFBYSxFQUFFLEtBQUs7aUJBQ3JCLENBQUMsQ0FBQztnQkFDSCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDdEQsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFCLFNBQVMsRUFBRyxHQUFhLEVBQUUsSUFBSTtnQkFDL0IsWUFBWSxFQUFHLEdBQWEsRUFBRSxPQUFPO2FBQ3RDLENBQUMsQ0FBQztZQUNILE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWlja0pTIFZNIGludGVncmF0aW9uIHdpdGggdGhlIFdvcmtmbG93IERldktpdC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJ1bm5pbmcgd29ya2Zsb3dzIGluIHRoZVxuICogUXVpY2tKUyBXQVNNIFZNIGVuZ2luZSBpbnN0ZWFkIG9mIHRoZSBgbm9kZTp2bWAgZW5naW5lLiBCb3RoIGVuZ2luZXNcbiAqIGltcGxlbWVudCB0aGUgc2FtZSBldmVudC1yZXBsYXkgZXhlY3V0aW9uIG1vZGVsIOKAlCBldmVyeSBpbnZvY2F0aW9uOlxuICpcbiAqIDEuIExvYWRzIHRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1blxuICogMi4gUnVucyB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gZnJvbSB0aGUgdG9wIGluIGEgZnJlc2ggUXVpY2tKUyBWTSxcbiAqICAgIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIHRvIHJlc29sdmUgYXdhaXRlZCBwcmltaXRpdmVzXG4gKiAzLiBPbiBzdXNwZW5zaW9uOiBjcmVhdGVzIGV2ZW50cyArIHF1ZXVlcyBzdGVwcyBmb3IgbmV3IHBlbmRpbmcgb3BzXG4gKiA0LiBPbiBjb21wbGV0aW9uOiBjcmVhdGVzIHJ1bl9jb21wbGV0ZWRcbiAqIDUuIE9uIGZhaWx1cmU6IGNyZWF0ZXMgcnVuX2ZhaWxlZFxuICovXG5cbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgdHlwZSBSdW5JbnB1dCxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjbGFzc2lmeVJ1bkVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0U2VyaWFsaXplZERhdGEsXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsIHF1ZXVlTWVzc2FnZSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQga2VlcHMgdGhlIGJhcmUgY29ycmVsYXRpb25JZCBzbyBpdCBzdGF5cyBtdXR1YWxseVxuICAgKiBleGNsdXNpdmUgd2l0aCB0aGUgbm9kZSBlbmdpbmUncyBkaXNwYXRjaCBvZiB0aGUgc2FtZSBzdGVwO1xuICAgKiBgYmFja3N0b3A6PGVwb2NoPmAgY292ZXJzIGRlbGF5ZWQgY3Jhc2ggYmFja3N0b3BzLCBzY29wZWQgdG8gdGhlXG4gICAqIG93bmVyc2hpcCBlcG9jaCBzbyBhIHJlZnJlc2hlZCBsZWFzZSByZS1hcm1zIGEgTkVXIGJhY2tzdG9wIGluc3RlYWRcbiAgICogb2YgYmVpbmcgYWJzb3JiZWQgYnkgdGhlIGluLWZsaWdodCBvbmU7IGByZXRyeTo8bj5gIGNvdmVycyBkZWxheWVkXG4gICAqIHJldHJ5L3Rocm90dGxlIHJlLWVucXVldWVzLCBzY29wZWQgdG8gdGhlIGF0dGVtcHQgc28gZWFjaCBiYWNrb2ZmXG4gICAqIGhvcCBpcyBlbnF1ZXVlYWJsZS5cbiAgICovXG4gIHB1cnBvc2U6ICdkaXNwYXRjaCcgfCBgYmFja3N0b3A6JHtzdHJpbmd9YCB8IGByZXRyeToke251bWJlcn1gO1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHdmZGlhZyxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgd29ybGQsXG4gICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgIHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkZW1wb3RlbmN5S2V5OlxuICAgICAgICBwdXJwb3NlID09PSAnZGlzcGF0Y2gnXG4gICAgICAgICAgPyBzdGVwLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICA6IGAke3N0ZXAuY29ycmVsYXRpb25JZH06JHtwdXJwb3NlfWAsXG4gICAgICAuLi4oZGVsYXlTZWNvbmRzICYmIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDoge30pLFxuICAgIH1cbiAgKTtcbiAgd2ZkaWFnKCdzdGVwX3F1ZXVlZCcsIHtcbiAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICBwdXJwb3NlLFxuICAgIGRlbGF5U2Vjb25kczogZGVsYXlTZWNvbmRzID8/IDAsXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCBuZXZlciBxdWV1ZWQgaGVyZSDigJQgcXVldWVpbmcgKG9yIGlubGluZVxuICogZXhlY3V0aW9uKSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24uIFVzZWQgYm90aCBmb3Igc3VzcGVuc2lvblxuICogcHJvY2Vzc2luZyAodGhlIGlubGluZSBsb29wKSBhbmQgZm9yIHRoZSB0ZXJtaW5hbCBkcmFpbiAoZmx1c2hpbmdcbiAqIGxlZnRvdmVyIHNpZGUgZWZmZWN0cyB3aGVuIHRoZSB3b3JrZmxvdyBjb21wbGV0ZWQgb3IgZmFpbGVkLCBtaXJyb3JpbmdcbiAqIHRoZSBub2RlOnZtIGVuZ2luZSdzIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNwYXRjaFBlbmRpbmdPcHMocGFyYW1zOiB7XG4gIHdvcmxkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmxkPj47XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgZW5jcnlwdGlvbktleTogUnVuUGF5bG9hZEtleXMgfCB1bmRlZmluZWQ7XG4gIHBlbmRpbmdPcGVyYXRpb25zOiBQZW5kaW5nT3BlcmF0aW9uW107XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgbXVzdCBOT1QgYmUgd3JpdHRlbiBoZXJlOiB0aGUgaW5saW5lXG4gICAqIGxvb3AgY2xhaW1zIHRoZXNlIGF0b21pY2FsbHkgdmlhIGEgbGF6eSBgc3RlcF9zdGFydGVkYCAoY2FycnlpbmcgdGhlXG4gICAqIGlucHV0KSwgc28gYSBjb25jdXJyZW50IGNsYWltYW50IGxvc2VzIHdpdGggRW50aXR5Q29uZmxpY3RFcnJvclxuICAgKiBpbnN0ZWFkIG9mIGJvdGggaW52b2NhdGlvbnMgYmFyZS1zdGFydGluZyB0aGUgc2FtZSBzdGVwLlxuICAgKi9cbiAgc2tpcFN0ZXBDcmVhdGlvbj86IFNldDxzdHJpbmc+O1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciBhbGwgbWVzc2FnZSBwdWJsaXNoZXMgKHNlZSBydW50aW1lLnRzKS4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzLiBJbiB0aGUgZGVmYXVsdFxuICAgKiBgbGlua2VkYCB0cmFjZSBtb2RlIHRoaXMgcmV0dXJucyB0aGUgY2FycmllciBvZiB0aGUgcnVuJ3MgT1JJR0lOXG4gICAqIGNvbnRleHQgKHdvcmtmbG93LnN0YXJ0KSwgc28gZXZlcnkgaW52b2NhdGlvbiBsaW5rcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFydCBpbiBhIHN0YXIg4oCUIGNhcHR1cmluZyB0aGUgY3VycmVudCBjb250ZXh0IGhlcmUgaW5zdGVhZCB3b3VsZFxuICAgKiBjaGFpbiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmNcbiAgICogcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgd2ZkaWFnOiAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufSk6IFByb21pc2U8e1xuICBjcmVhdGVkQXR0cmlidXRlRXZlbnQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRHZXRDb25mbGljdEhvb2s6IGJvb2xlYW47XG59PiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBlbmRpbmdPcGVyYXRpb25zLFxuICAgIG5hbWVzcGFjZSxcbiAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBza2lwU3RlcENyZWF0aW9uID0gcGFyYW1zLnNraXBTdGVwQ3JlYXRpb247XG4gIGNvbnN0IHdmZGlhZyA9IHBhcmFtcy53ZmRpYWc7XG4gIC8vIFNldCB3aGVuIGEgaG9vayB3aXRoIGEgcGFya2VkIGdldENvbmZsaWN0KCkgYXdhaXRlciBoYWQgaXRzXG4gIC8vIGhvb2tfY3JlYXRlZCB3cml0dGVuIHRoaXMgaW52b2NhdGlvbi4gVGhlIHdvcmtmbG93IG11c3QgYmUgcmUtaW52b2tlZFxuICAvLyBzbyByZXBsYXkgY2FuIGNvbmZpcm0gY3JlYXRpb24gYW5kIHJlc29sdmUgdGhlIGF3YWl0ZXIuXG4gIGxldCBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIGEgbmV3IGF0dHJfc2V0IGV2ZW50IGlzIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGVcbiAgLy8gd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkIHRvIGNvbnN1bWUgaXQgKHJlc29sdmluZyB0aGUgcGVuZGluZ1xuICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZSksIHNvIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5IOKAlFxuICAvLyBzYW1lIHBhdHRlcm4gYXMgYW4gZWxhcHNlZCB3YWl0LlxuICBsZXQgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gZmFsc2U7XG4gIGNvbnN0IG9wc1Byb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICBjb25zdCBwcm9jZXNzSG9va09wID0gYXN5bmMgKGhvb2s6IFBlbmRpbmdIb29rKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2sgb3AnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgdG9rZW5UeXBlOiB0eXBlb2YgaG9vay50b2tlbixcbiAgICAgIGlzV2ViaG9vazogaG9vay5pc1dlYmhvb2ssXG4gICAgICBpc1N5c3RlbTogaG9vay5pc1N5c3RlbSxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogaG9vay5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICBhYm9ydFJlcXVlc3RlZDogaG9vay5hYm9ydFJlcXVlc3RlZCxcbiAgICB9KTtcblxuICAgIGlmICghaG9vay5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIGBob29rLm1ldGFkYXRhYCBpcyB0aGUgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAgIC8vIHByb2R1Y2VkIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXVxuICAgICAgLy8gKG9wdGlvbnMubWV0YWRhdGEpYCBpbnNpZGUgdGhlIFZNLiBFbmNyeXB0IG9uIHRoZSBob3N0XG4gICAgICAvLyBzaWRlIGJlZm9yZSB3cml0aW5nIOKAlCBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBObyBwcmUtY2hlY2sgdmlhIGhvb2tzLmxpc3Q6IHdpdGggZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkc1xuICAgICAgLy8gKHNhbWUgVk0gc2VlZCBhY3Jvc3MgcmVwbGF5cykgYW5kIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpXG4gICAgICAvLyB1bmlxdWVuZXNzIGluIHdvcmxkcywgdGhlIHN0b3JhZ2UgbGF5ZXIgcmVqZWN0cyBkdXBsaWNhdGVzIGFzXG4gICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aGljaCB3ZSBzd2FsbG93IGJlbG93LiBUaGlzIGRyb3BzIG9uZVxuICAgICAgLy8gbmV0d29yayByb3VuZC10cmlwIHBlciBwZW5kaW5nIGhvb2suXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRNZXRhZGF0YSA9XG4gICAgICAgICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoaG9vay5tZXRhZGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NyZWF0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgIHRva2VuUmV0ZW50aW9uVW50aWw6XG4gICAgICAgICAgICAgIGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCksXG4gICAgICAgICAgICBtZXRhZGF0YTogZW5jcnlwdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSBpc1dlYmhvb2sgZXhwbGljaXRseS4gV29ybGRzIGRlZmF1bHQgaXQgdG9cbiAgICAgICAgICAgIC8vIGB0cnVlYCB3aGVuIGFic2VudCwgd2hpY2ggd291bGQgYnJlYWsgdGhlIHB1YmxpYyB3ZWJob29rXG4gICAgICAgICAgICAvLyBlbmRwb2ludCdzIDQwNCBndWFyZCBmb3IgaG9va3MgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpLlxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgICAgICAgIC8vIFN5c3RlbSBob29rcyAoQWJvcnRDb250cm9sbGVyKSBhcmUgZXhlbXB0IGZyb20gdXNlclxuICAgICAgICAgICAgLy8gdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0IGNoZWNrcy5cbiAgICAgICAgICAgIC4uLihob29rLmlzU3lzdGVtID8geyBpc1N5c3RlbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBzdG9yYWdlIGRldGVjdGVkIGEgcmVhbCB0b2tlbiBjb25mbGljdCB3aXRoIGFub3RoZXJcbiAgICAgICAgLy8gd29ya2Zsb3cncyBob29rLCByZS1xdWV1ZSBzbyB0aGUgd29ya2Zsb3cgaGFuZGxlciBjYW5cbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgY29uZmxpY3QgZXZlbnQgYW5kIGZhaWwgZ3JhY2VmdWxseS5cbiAgICAgICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBgaG9va19jb25mbGljdF8ke2hvb2suY29ycmVsYXRpb25JZH1gIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjcmVhdGVkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIOKAlCBmYWxsIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWJvcnQgcHJvY2Vzc2luZyBiZWxvdyAoaWYgYW55KSBpbnN0ZWFkIG9mIGJhaWxpbmcuXG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoaG9vay5oYXNHZXRDb25mbGljdEF3YWl0ZXIpIHtcbiAgICAgICAgY3JlYXRlZEdldENvbmZsaWN0SG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhvb2suYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgYWJvcnQgZHVyYWJseTogYSBob29rX3JlY2VpdmVkIGV2ZW50IGNhcnJ5aW5nXG4gICAgICAvLyB0aGUgVk0tc2VyaWFsaXplZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgcGF5bG9hZCxcbiAgICAgIC8vIHBsdXMgYSBiZXN0LWVmZm9ydCBzdHJlYW0gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcFxuICAgICAgLy8gcHJvcGFnYXRpb24uIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3Mgc3VzcGVuc2lvblxuICAgICAgLy8gaGFuZGxlciAoaG9va3NOZWVkaW5nQWJvcnQpLlxuICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID1cbiAgICAgICAgaG9vay5hYm9ydFBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgPyAoKGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgaG9vay5hYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gc3RyZWFtTmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGFib3J0IGhvb2sgdG9rZW5cbiAgICAgIC8vIChgYWJydF97aWR9YCDihpIgYHN0cm1fe2lkfV9zeXN0ZW1fYWJvcnRgKS5cbiAgICAgIGlmIChob29rLnRva2VuLnN0YXJ0c1dpdGgoJ2FicnRfJykgJiYgYWJvcnRQYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBgc3RybV8ke2hvb2sudG9rZW4uc2xpY2UoJ2FicnRfJy5sZW5ndGgpfV9zeXN0ZW1fYWJvcnRgO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIHN0cmVhbU5hbWUsIGFib3J0UGF5bG9hZCk7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IOKAlCB0aGUgaG9vayBldmVudCBwcm92aWRlcyB0aGUgZHVyYWJsZVxuICAgICAgICAgIC8vIGZhbGxiYWNrLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdhYm9ydF9yZWNvcmRlZCcsIHtcbiAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcCA9IGFzeW5jIChcbiAgICBvcDogUGVuZGluZ0hvb2tEaXNwb3NlXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IG9wLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIC8vIERpc3Bvc2luZyBhIGhvb2sgd2hvc2UgZW50aXR5IG5vIGxvbmdlciAob3IgbmV2ZXIpIGV4aXN0cyBpcyBhblxuICAgICAgLy8gaWRlbXBvdGVudCBuby1vcDogdGhlIGVudGl0eSBtYXkgaGF2ZSBiZWVuIHRvcm4gZG93biBieSBhXG4gICAgICAvLyBjb25jdXJyZW50IHJ1biBjYW5jZWxsYXRpb24sIG9yIHRoZSBob29rIG1heSBoYXZlIGxvc3QgaXRzXG4gICAgICAvLyB0b2tlbiBjbGFpbSB0byBhIGNvbmZsaWN0LiBUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVsZWFzZS5cbiAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIC8vIEhvb2sgb3BlcmF0aW9ucyBhcmUgZ3JvdXBlZCBieSB0b2tlbiBhbmQgcHJvY2Vzc2VkIFNFUVVFTlRJQUxMWSBpblxuICAvLyBjb2RlIG9yZGVyIHdpdGhpbiBlYWNoIGdyb3VwLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gc3VzcGVuc2lvblxuICAvLyBoYW5kbGVyIChob29rSXRlbXNCeVRva2VuKTogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIG11c3RcbiAgLy8gcmVsZWFzZSB0aGUgdG9rZW4gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXNcbiAgLy8gdmFsaWRhdGVkIGJ5IHRoZSB3b3JsZCDigJQgcGFyYWxsZWwgZGlzcGF0Y2ggd291bGQgb3RoZXJ3aXNlIHJlY29yZCBhXG4gIC8vIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duIGRpc3Bvc2VkIGhvb2sgKGUuZy4gYVxuICAvLyBkaXNwb3Nl4oaScmVjcmVhdGUgbG9vcCByZXVzaW5nIG9uZSB0b2tlbikuIERpZmZlcmVudCB0b2tlbnMgaGF2ZSBub1xuICAvLyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXJcbiAgLy8gYW5kIHdpdGggdGhlIG5vbi1ob29rIG9wcyBiZWxvdy5cbiAgY29uc3QgaG9va09wc0J5VG9rZW4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICAoUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpW11cbiAgPigpO1xuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgKCFvcC5oYXNDcmVhdGVkRXZlbnQgfHwgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZClcbiAgICApIHtcbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9vaykudG9rZW47XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnaG9va19kaXNwb3NlJyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAvLyBQZXItb3AgZmFsbGJhY2sgZ3JvdXAgd2hlbiB0aGUgdG9rZW4gaXMgdW5rbm93biDigJQgbm8gb3JkZXJpbmdcbiAgICAgIC8vIGd1YXJhbnRlZXMsIG1hdGNoaW5nIHRoZSBwcmV2aW91cyBwYXJhbGxlbCBiZWhhdmlvci5cbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9va0Rpc3Bvc2UpLnRva2VuID8/IGBfX2NpZDoke29wLmNvcnJlbGF0aW9uSWR9YDtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBncm91cCA9IGhvb2tPcHNCeVRva2VuLmdldChrZXkpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tPcHNCeVRva2VuLnNldChrZXksIFtvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZV0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGhvb2tPcHNCeVRva2VuLnZhbHVlcygpKSB7XG4gICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb3Agb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va09wKG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tEaXNwb3NlT3Aob3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ3N0ZXAnICYmXG4gICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAhc2tpcFN0ZXBDcmVhdGlvbj8uaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzdGVwID0gb3AgYXMgUGVuZGluZ1N0ZXA7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIENyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnQuIGBzdGVwLmlucHV0YCBpcyB0aGVcbiAgICAgICAgICAvLyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAoXCJkZXZsXCIgKyBkZXZhbHVlKSBwcm9kdWNlZFxuICAgICAgICAgIC8vIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXSh7YXJncyxcbiAgICAgICAgICAvLyBjbG9zdXJlVmFycywgdGhpc1ZhbH0pYCBpbnNpZGUgdGhlIFZNLiBUaGUgVk0gaGFzIG5vXG4gICAgICAgICAgLy8gYWNjZXNzIHRvIHRoZSBDcnlwdG9LZXksIHNvIGVuY3J5cHRpb24gaXMgYXBwbGllZCBoZXJlXG4gICAgICAgICAgLy8gb24gdGhlIGhvc3Qgc2lkZSDigJQgbWF0Y2hpbmcgd2hhdFxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGluIHRoZSBub2RlOnZtIGVuZ2luZS5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoc3RlcC5pbnB1dCwgZW5jcnlwdGlvbktleSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbiDigJQgdGhlIGlubGluZVxuICAgICAgICAgIC8vIGxvb3AgZXhlY3V0ZXMgZnJlc2ggc3RlcHMgaW4gdGhlIGxpdmUgVk0gYW5kIG9ubHkgcXVldWVzIHRoZVxuICAgICAgICAgIC8vIG92ZXJmbG93IC8gcmV0cnkgLyBiYWNrc3RvcCBjYXNlcyAoc2VlIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vayB9O1xufVxuXG4vKipcbiAqIFJ1biBhIHdvcmtmbG93IHVzaW5nIHRoZSBRdWlja0pTIFdBU00gVk0gZW5naW5lLlxuICpcbiAqIFRoaXMgcmVwbGFjZXMgdGhlIGBub2RlOnZtYCByZXBsYXkgcGF0aCAocnVuV29ya2Zsb3cgKyBFdmVudHNDb25zdW1lcilcbiAqIHdpdGggYSBRdWlja0pTIFZNIGludm9jYXRpb24gdGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheS5cbiAqXG4gKiBLTk9XTiBHQVAg4oCUIHByZWNvbmRpdGlvbiBndWFyZDogdW5saWtlIHRoZSBub2RlOnZtIHBhdGgsIG5vIGV2ZW50IHdyaXRlXG4gKiBpbiB0aGlzIGZpbGUgcGFydGljaXBhdGVzIGluIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IHByZWNvbmRpdGlvblxuICogZ3VhcmQgKGB3aXRoUHJlY29uZGl0aW9uUmV0cnlgICsgYHN0YXRlVXBkYXRlZEF0Rm9yQ3JlYXRlYCksIHdoaWNoXG4gKiBwcm90ZWN0cyBhIHdyaXRlciBob2xkaW5nIGEgc3RhbGUgZXZlbnQtbG9nIHNuYXBzaG90IGZyb20gY2xvYmJlcmluZyBhXG4gKiBjb25jdXJyZW50IG9uZS4gVGhlIGVuZ2luZSBjdXJyZW50bHkgcmVsaWVzIG9uIHBlci0ocnVuSWQsXG4gKiBjb3JyZWxhdGlvbklkKSBldmVudCB1bmlxdWVuZXNzIChFbnRpdHlDb25mbGljdEVycm9yIGRlZHVwKSBhbG9uZS4gVGhpc1xuICogaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIHdoaWxlIHRoZSBlbmdpbmUgaXMgZXhwZXJpbWVudGFsIOKAlCB3aXJpbmdcbiAqIHRoZSBndWFyZCBpcyB0cmFja2VkIGZvbGxvdy11cCB3b3JrOyBhbnlvbmUgYWRkaW5nIG5ldyB3cml0ZSBwYXRocyBoZXJlXG4gKiBzaG91bGQgbm90IGFzc3VtZSBwYXJpdHkgd2l0aCB0aGUgbm9kZSBlbmdpbmUgb24gdGhpcyBheGlzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyhwYXJhbXM6IHtcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIC8qKlxuICAgKiBFdmVudHMgcmV0dXJuZWQgaW5saW5lIGJ5IGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcsIC4uLilgIG9yIGJ5XG4gICAqIHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQuIFdoZW4gdGhleSBpbmRpY2F0ZVxuICAgKiBhIGZpcnN0IGludm9jYXRpb24g4oCUIG9yIHdoZW4gYHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlYCBhdHRlc3RzIHRoZXlcbiAgICogYXJlIHRoZSBjb21wbGV0ZSBsb2cg4oCUIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGV2ZW50IGxvZyBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIHZpYSBgZXZlbnRzLmxpc3RgLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmYXN0IHBhdGguXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHM/OiBFdmVudFtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgaGFzIHZhbGlkYXRlZCB0aGF0IGBwcmVsb2FkZWRFdmVudHNgIGlzIHRoZSBydW4nc1xuICAgKiBDT01QTEVURSBldmVudCBsb2cgKGUuZy4gdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBoYXNNb3JlLWZhbHNlXG4gICAqIHJlcGxheSBwcmVsb2FkKS4gVGhlIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljIGJlbG93IG9ubHkgcmVjb2duaXplc1xuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC1vbmx5IHByZWxvYWRzLCBzbyB3aXRob3V0IHRoaXMgYXR0ZXN0YXRpb24gYVxuICAgKiBob29rLXJlc3VtZSBwcmVsb2FkIHdvdWxkIGJlIGRpc2NhcmRlZCBhbmQgcmVmZXRjaGVkLlxuICAgKi9cbiAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGlucHV0IGNhcnJpZWQgdGhyb3VnaCB0aGUgcXVldWUgbWVzc2FnZSBvbiBmaXJzdCBkZWxpdmVyeS4gVXNlZFxuICAgKiBhcyBhIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGZvciBgcnVuX2NyZWF0ZWQuZXZlbnREYXRhLmlucHV0YCB3aGVuXG4gICAqIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIHJ1bklucHV0PzogUnVuSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IE9UZWwgc3BhbiAodGhlIG91dGVyIGBXT1JLRkxPVyB7d29ya2Zsb3dOYW1lfWAgc3BhbiBmcm9tXG4gICAqIGBydW50aW1lLnRzYCkuIFdoZW4gc3VwcGxpZWQsIFZNIGxpZmVjeWNsZSBhdHRyaWJ1dGVzIGFyZSBhdHRhY2hlZFxuICAgKiB0byBpdCBmb3IgZW5kLXRvLWVuZCB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcGFyZW50U3Bhbj86IFNwYW47XG4gIC8qKlxuICAgKiBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlXG4gICAqICh1bmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50KS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBndWFyZDpcbiAgICogYSBydW5hd2F5IHJ1biBpcyBmYWlsZWQgb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlIGNlaWxpbmcuIFRoZSB0aHJvd1xuICAgKiBwcm9wYWdhdGVzIHRvIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMgKHRoZSBRdWlja0pTXG4gICAqIGRpc3BhdGNoIHJ1bnMgaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIGNsYXNzaWZpZXMgaXQgYW5kXG4gICAqIHJlY29yZHMgcnVuX2ZhaWxlZCB3aXRoIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAqL1xuICBtYXhFdmVudHNMaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHQgb2YgdGhlIG1lc3NhZ2UgZHJpdmluZyB0aGlzIGludm9jYXRpb24gKGZyb21cbiAgICogdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhZGF0YTsgMSA9IGZpcnN0IGRlbGl2ZXJ5KS4gU3VyZmFjZWQgaW5cbiAgICogZGlhZ25vc3RpY3M7IGNyYXNoIHJlY292ZXJ5IGl0c2VsZiBpcyBkcml2ZW4gYnkgdGhlIG93bmVyc2hpcC1sZWFzZVxuICAgKiBkZWNpc2lvbiB0YWJsZSBpbiB0aGUgbG9vcCwgbm90IGJ5IHRoZSBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZGVsaXZlcnlBdHRlbXB0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgZGVsaXZlcnkgZHJpdmluZyB0aGlzIGludm9jYXRpb24sIHN0YW1wZWQgYXNcbiAgICogYG93bmVyTWVzc2FnZUlkYCBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXMgZGVmZXIgdG9cbiAgICogdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2YgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIHJlc29sdmVkIGF0IHJvdXRlIHJlZ2lzdHJhdGlvbiAocnVudGltZS50cykuIE11c3QgYmVcbiAgICogdGhyZWFkZWQgaW50byBldmVyeSBtZXNzYWdlIHB1Ymxpc2g6IHRoZSBidWlsZGVycyBiYWtlIHRoZSBuYW1lc3BhY2VcbiAgICogaW50byBnZW5lcmF0ZWQgcm91dGVzLCBzbyBjb25zdW1lcnMgbGlzdGVuIG9uIGBfXzxucz5fd2tmX3dvcmtmbG93XypgXG4gICAqIOKAlCBhIHB1Ymxpc2ggd2l0aG91dCBpdCBsYW5kcyBvbiBgX193a2Zfd29ya2Zsb3dfKmAgYW5kIGlzIG5ldmVyXG4gICAqIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHNcbiAgICogKGdldE5leHRUcmFjZUNhcnJpZXIpLiBJbiB0aGUgZGVmYXVsdCBgbGlua2VkYCB0cmFjZSBtb2RlIGV2ZXJ5XG4gICAqIGludm9jYXRpb24gbXVzdCBsaW5rIGJhY2sgdG8gdGhlIHJ1bidzIG9yaWdpbiAod29ya2Zsb3cuc3RhcnQpIGluIGFcbiAgICogc3RhcjsgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dCBpbnN0ZWFkIHdvdWxkIGNoYWluXG4gICAqIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luYyBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn0pOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM/OiBudW1iZXIgfSB8IHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlLFxuICAgIHJ1bklucHV0LFxuICAgIHBhcmVudFNwYW4sXG4gICAgbWF4RXZlbnRzTGltaXQsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIG93bmVyTWVzc2FnZUlkLFxuICAgIG5hbWVzcGFjZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gU3RhbmRhbG9uZS1jYWxsZXIgZmFsbGJhY2sgKHRlc3RzKTogd2l0aG91dCBhIHJ1bnRpbWUudHMgY2FycmllclxuICAvLyBhY2Nlc3NvciwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dC5cbiAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9XG4gICAgcGFyYW1zLm5leHRUcmFjZUNhcnJpZXIgPz8gKCgpID0+IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpKTtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBydW5JZCA9IHdvcmtmbG93UnVuLnJ1bklkO1xuICBjb25zdCBpbnZvY2F0aW9uU3RhcnQgPSB0aWNrKCk7XG5cbiAgLy8gU3RyaXAgdGhlIGlubGluZSBzb3VyY2UgbWFwIGNvbW1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIGJ1bmRsZSBpblxuICAvLyB0aGUgUXVpY2tKUyBWTS4gVGhlIG1hcCBpcyBwdXJlbHkgaG9zdC1zaWRlIG1ldGFkYXRhIGZvclxuICAvLyBgcmVtYXBFcnJvclN0YWNrYCAoY2FsbGVkIGJlbG93IG9uIHdvcmtmbG93IGZhaWx1cmVzLCBhZ2FpbnN0IHRoZVxuICAvLyBPUklHSU5BTCBgd29ya2Zsb3dDb2RlYCkuIFF1aWNrSlMgcmV0YWlucyBzb3VyY2UgdGV4dCBmb3JcbiAgLy8gc3RhY2stdHJhY2UgbGluZSBsb29rdXBzLCBzbyB0aGUgZmV3LU1CIGJhc2U2NCBjb21tZW50IHdvdWxkIGJsb2F0XG4gIC8vIHRoZSBWTSBoZWFwIGZvciBubyBiZW5lZml0LlxuICBjb25zdCB3b3JrZmxvd0NvZGVGb3JWTSA9IHN0cmlwSW5saW5lU291cmNlTWFwKHdvcmtmbG93Q29kZSk7XG5cbiAgLy8gUGVyLWludm9jYXRpb24gZGlhZ25vc3RpYyBpZCBzbyBkZWJ1ZyBsb2dzIGNhbiBiZSBjb3JyZWxhdGVkIGV2ZW4gaWZcbiAgLy8gdGhlIHNhbWUgcnVuSWQgaXMgcHJvY2Vzc2VkIGJ5IG92ZXJsYXBwaW5nIGludm9jYXRpb25zIG9uIGRpZmZlcmVudFxuICAvLyBmdW5jdGlvbiBpbnN0YW5jZXMuXG4gIGNvbnN0IGludm9jYXRpb25JZCA9IGBpbnZfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcblxuICAvLyBTdHJ1Y3R1cmVkIHBlci1jaGVja3BvaW50IGRpYWdub3N0aWMgaGVscGVyLCBncmVwLWZyaWVuZGx5IGJ5IHJ1bklkLlxuICBjb25zdCB3ZmRpYWcgPSAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUVVJQ0tKU19WTV9ESUFHJywge1xuICAgICAgY2hlY2twb2ludCxcbiAgICAgIHJ1bklkLFxuICAgICAgaW52b2NhdGlvbklkLFxuICAgICAgdEVsYXBzZWRNczogTWF0aC5yb3VuZCh0aWNrKCkgLSBpbnZvY2F0aW9uU3RhcnQpLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9O1xuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1ZtKCdxdWlja2pzJyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZW50ZXInLCB7XG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBoYXNQcmVsb2FkZWRFdmVudHM6XG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiYgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDAsXG4gICAgcHJlbG9hZGVkRXZlbnRDb3VudDogcHJlbG9hZGVkRXZlbnRzPy5sZW5ndGggPz8gMCxcbiAgICBoYXNSdW5JbnB1dDogISFydW5JbnB1dCxcbiAgfSk7XG5cbiAgLy8gVGhlIHdvcmtmbG93TmFtZSBmcm9tIHRoZSBxdWV1ZSB0b3BpYyBpcyBhbHJlYWR5IHRoZSBmdWxsIHdvcmtmbG93IElEXG4gIC8vIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIilcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IHdvcmtmbG93TmFtZTtcblxuICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB1cCBmcm9udCDigJQgbmVlZGVkIHRvIGRlY3J5cHQgZXZlbnRcbiAgLy8gcGF5bG9hZHMgaW5zaWRlIHRoZSBWTSBhbmQgdG8gZW5jcnlwdCBldmVudCBwYXlsb2FkcyB3cml0dGVuIGJlbG93LlxuICAvLyBSZXNvbHZlIHRoZSBGVUxMIGNhcGFiaWxpdHkgKHN5bW1ldHJpYyBBRVMga2V5ICsgWDI1NTE5IGtleXBhaXIpLCBub3RcbiAgLy8ganVzdCBgaW1wb3J0S2V5KHJhd0tleSlgOiBhIHJ1biByZWFkaW5nIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXJcbiAgLy8gc2VhbGVkIChgZW5jcGApIGhvb2sgcGF5bG9hZHMgdGhhdCBhIGNyb3NzLWRlcGxveW1lbnQgYHJlc3VtZUhvb2soKWBcbiAgLy8gd3JvdGUgdG8gaXQgKHNlYWxpbmcgaXMgcHJlc2VuY2UtZ2F0ZWQgb24gdGhlIHJ1bidzIHB1Ymxpc2hlZFxuICAvLyBlbmNyeXB0aW9uUHVibGljS2V5LCB3aGljaCB0aGUgc2hhcmVkIHN0YXJ0KCkgcGF0aCBzdGFtcHMgcmVnYXJkbGVzcyBvZlxuICAvLyBlbmdpbmUpLiBBIGJhcmUgc3ltbWV0cmljIGtleSBjYW5ub3Qgb3BlbiB0aG9zZSBhbmQgd291bGQgd2VkZ2UgdGhlIHJ1blxuICAvLyByaWdodCBhZnRlciBob29rX3JlY2VpdmVkIOKAlCB0aGUgbm9kZTp2bSBlbmdpbmUgcmVzb2x2ZXMgdGhlIHNhbWUgZnVsbFxuICAvLyBjYXBhYmlsaXR5IHZpYSBtZW1vaXplRW5jcnlwdGlvbktleS5cbiAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gTG9hZCB0aGUgRlVMTCBldmVudCBsb2cgZm9yIHRoZSBydW4uIE9uIGZpcnN0IGludm9jYXRpb24gdGhlXG4gIC8vIHByZWxvYWRlZCBldmVudHMgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2UgYXJlIHRoZSBjb21wbGV0ZSBsb2dcbiAgLy8gYW5kIHNhdmUgdGhlIGV2ZW50cy5saXN0IHJvdW5kLXRyaXBzOyBhIGNhbGxlci1hdHRlc3RlZCBjb21wbGV0ZVxuICAvLyBwcmVsb2FkIChsYXp5IGhvb2sgZmFzdCBwYXRoKSBpcyB0cnVzdGVkIHRoZSBzYW1lIHdheS5cbiAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgbGV0IGV2ZW50c0ZldGNoZWRQYWdlcyA9IDA7XG4gIGNvbnN0IHVzZVByZWxvYWRlZCA9XG4gICAgKHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID09PSB0cnVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiZcbiAgICAgIHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPiAwKSB8fFxuICAgIGlzRmlyc3RJbnZvY2F0aW9uKHByZWxvYWRlZEV2ZW50cyk7XG4gIGlmICh1c2VQcmVsb2FkZWQgJiYgcHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcblxuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXZlbnRzRmV0Y2hlZFBhZ2VzKys7XG4gICAgICBhbGxFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBmZXRjaGVkIHBhZ2UncyBjdXJzb3IuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIHdlIGdvdCByZXN1bHRzIOKAlCB0aGUgZmluYWwgZW1wdHktcGFnZSByZXNwb25zZVxuICAgICAgLy8gcmV0dXJucyBjdXJzb3I9bnVsbCB3aGljaCB3ZSBtdXN0IE5PVCB1c2UgKGl0IHdvdWxkIHJlc2V0IHRoZSBjdXJzb3IpLlxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikge1xuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICB9XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cblxuICAgIGV2ZW50cyA9IGFsbEV2ZW50cztcbiAgfVxuXG4gIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlXG4gIC8vIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nIOKAlCBzYW1lIGVuZm9yY2VtZW50IHBvaW50IGFzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHJlcGxheSBsb29wLlxuICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoZXZlbnRzLmxlbmd0aCwgbWF4RXZlbnRzTGltaXQpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNFdmVudHNQcmVsb2FkZWQodXNlUHJlbG9hZGVkKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRDb3VudChldmVudHMubGVuZ3RoKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRQYWdlcyhldmVudHNGZXRjaGVkUGFnZXMpLFxuICB9KTtcblxuICB3ZmRpYWcoJ2V2ZW50c19mZXRjaGVkJywge1xuICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgZXZlbnRzRmV0Y2hlZFBhZ2VzLFxuICAgIHVzZVByZWxvYWRlZCxcbiAgICBldmVudFR5cGVzOiBldmVudHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KChhY2MsIGUpID0+IHtcbiAgICAgIGFjY1tlLmV2ZW50VHlwZV0gPSAoYWNjW2UuZXZlbnRUeXBlXSA/PyAwKSArIDE7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KSxcbiAgfSk7XG5cbiAgLy8gQ2hlY2sgZm9yIGVsYXBzZWQgd2FpdHNcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgZXZlbnRzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50XG4gICAgICAgICAgPyAoZXZlbnQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzdW1lQXQgPSBldmVudERhdGE/LnJlc3VtZUF0O1xuICAgICAgaWYgKHJlc3VtZUF0ICYmIG5vdyA+PSBuZXcgRGF0ZShyZXN1bWVBdCBhcyBzdHJpbmcpLmdldFRpbWUoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5ldmVudCkgZXZlbnRzLnB1c2gocmVzdWx0LmV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgY29udGludWU7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSB0aGUgd29ya2Zsb3cgc2VydmVyIHBvcnQgc28gYGdldFdvcmtmbG93TWV0YWRhdGEoKS51cmxgIGluc2lkZVxuICAvLyB0aGUgVk0gbWF0Y2hlcyB3aGF0IHRoZSBzdGVwLXNpZGUgaGFuZGxlciByZXBvcnRzLiBTa2lwcGVkIG9uIFZlcmNlbCDigJRcbiAgLy8gdGhlIFZNIHJlYWRzIFZFUkNFTF9VUkwgZGlyZWN0bHkgaW4gdGhhdCBlbnZpcm9ubWVudC5cbiAgY29uc3QgaXNWZXJjZWwgPSBwcm9jZXNzLmVudi5WRVJDRUxfVVJMICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcnQgPSBpc1ZlcmNlbCA/IHVuZGVmaW5lZCA6IGF3YWl0IGdldFBvcnRMYXp5KCk7XG5cbiAgLy8gUnVuIHRoZSB3b3JrZmxvdyBpbiB0aGUgUXVpY2tKUyBWTVxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IGludm9raW5nIFZNJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIHdvcmtmbG93SWQsXG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgfSk7XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0UXVpY2tKU1dvcmtmbG93KHtcbiAgICAvLyBQYXNzIHRoZSBTVFJJUFBFRCBidW5kbGUgdG8gdGhlIFZNIHNvIHRoZSBpbmxpbmUgc291cmNlIG1hcFxuICAgIC8vIGRvZXNuJ3QgZW5kIHVwIGluIHRoZSBRdWlja0pTIGhlYXAuIFRoZSBvcmlnaW5hbCAodW5zdHJpcHBlZClcbiAgICAvLyBgd29ya2Zsb3dDb2RlYCBpcyBzdGlsbCBrZXB0IGluIHRoaXMgaG9zdC1zaWRlIHNjb3BlIGFuZCBpcyB1c2VkXG4gICAgLy8gYnkgYHJlbWFwRXJyb3JTdGFja2Agb24gd29ya2Zsb3cgZmFpbHVyZXMgYmVsb3cuXG4gICAgd29ya2Zsb3dDb2RlOiB3b3JrZmxvd0NvZGVGb3JWTSxcbiAgICB3b3JrZmxvd0lkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICB3b3JsZENhcGFiaWxpdGllczogd29ybGQuY2FwYWJpbGl0aWVzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcG9ydCxcbiAgICBydW5JbnB1dCxcbiAgfSk7XG4gIGxldCByZXN1bHQgPSBzZXNzaW9uLnJlc3VsdDtcblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IFZNIHJldHVybmVkJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGNvbXBsZXRlZDogISFyZXN1bHQuY29tcGxldGVkLFxuICAgIHN1c3BlbmRlZDogISFyZXN1bHQuc3VzcGVuZGVkLFxuICAgIGZhaWxlZDogISFyZXN1bHQuZmFpbGVkLFxuICAgIHBlbmRpbmdPcHNDb3VudDogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lmxlbmd0aCxcbiAgfSk7XG5cbiAgd2ZkaWFnKCd2bV9yZXR1cm5lZCcsIHtcbiAgICBvdXRjb21lOiByZXN1bHQuY29tcGxldGVkXG4gICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICA6IHJlc3VsdC5zdXNwZW5kZWRcbiAgICAgICAgPyAnc3VzcGVuZGVkJ1xuICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgOiAndW5rbm93bicsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoID8/IDAsXG4gICAgcGVuZGluZ09wU3VtbWFyeTogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lm1hcCgocCkgPT4gKHtcbiAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAuLi4ocC50eXBlID09PSAnc3RlcCcgPyB7IHN0ZXBJZDogKHAgYXMgUGVuZGluZ1N0ZXApLnN0ZXBJZCB9IDoge30pLFxuICAgIH0pKSxcbiAgICBmYWlsdXJlTWVzc2FnZTogcmVzdWx0LmZhaWxlZD8ubWVzc2FnZSxcbiAgICBmYWlsdXJlTmFtZTogcmVzdWx0LmZhaWxlZD8ubmFtZSxcbiAgfSk7XG5cbiAgLy8gLS0tLSBJbmxpbmUgY29udGludWF0aW9uIGxvb3AgLS0tLVxuICAvL1xuICAvLyBXaGlsZSB0aGUgd29ya2Zsb3cgaXMgc3VzcGVuZGVkLCB0aGlzIGxvb3Aga2VlcHMgdGhlIFZNIGFsaXZlIGFuZFxuICAvLyBtYWtlcyBhcyBtdWNoIGZvcndhcmQgcHJvZ3Jlc3MgYXMgcG9zc2libGUgd2l0aGluIG9uZSBpbnZvY2F0aW9uOlxuICAvL1xuICAvLyAgIDEuIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzXG4gIC8vICAgICAgKHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIGF0dHJfc2V0IC8gd2FpdF9jcmVhdGVkIC9cbiAgLy8gICAgICBob29rX3JlY2VpdmVkIGZvciBhYm9ydHMpIGFuZCBjb21wbGV0ZSBlbGFwc2VkIHdhaXRzLlxuICAvLyAgIDIuIEZlZWQgYWxsIG5ld2x5IHJlY29yZGVkIGV2ZW50cyAoYXR0cl9zZXQsIGhvb2tfY3JlYXRlZCwgZWxhcHNlZFxuICAvLyAgICAgIHdhaXRfY29tcGxldGVkLCB0ZXJtaW5hbHMgd3JpdHRlbiBieSBjb25jdXJyZW50IGludm9jYXRpb25zLCAuLi4pXG4gIC8vICAgICAgaW50byB0aGUgTElWRSBWTSB2aWEgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMg4oCUIHJlc3VtaW5nXG4gIC8vICAgICAgZXhlY3V0aW9uIGV4YWN0bHkgd2hlcmUgaXQgbGVmdCBvZmYsIG5vIGZyZXNoLVZNIHJlLXJlcGxheS5cbiAgLy8gICAgICBDaGVhcCBwcm9ncmVzcyBpcyBmZWQgQkVGT1JFIHJ1bm5pbmcgc3RlcCBib2RpZXMgc28gcHJvbWlzZVxuICAvLyAgICAgIGNoYWlucyB0aGF0IGFyZSBub3QgZ2F0ZWQgb24gc3RlcHMgKGhvb2suZ2V0Q29uZmxpY3QoKSxcbiAgLy8gICAgICBzZXRBdHRyaWJ1dGVzKCksIHJhY2luZyBzbGVlcHMpIGFkdmFuY2UgZmlyc3QgYW5kIGNhbiBzdXJmYWNlXG4gIC8vICAgICAgYWRkaXRpb25hbCBwZW5kaW5nIHN0ZXBzIGZvciB0aGUgc2FtZSBpbmxpbmUgYmF0Y2guXG4gIC8vICAgMy4gT25jZSBubyBjaGVhcCBwcm9ncmVzcyByZW1haW5zLCBleGVjdXRlIHVwIHRvXG4gIC8vICAgICAgZ2V0TWF4SW5saW5lU3RlcHMoKSBzdGVwcyBjcmVhdGVkIGJ5IFRISVMgaW52b2NhdGlvbiBpbmxpbmUgKG5vXG4gIC8vICAgICAgcXVldWUgcm91bmQtdHJpcCksIGluIHBhcmFsbGVsLCB3aXRoIHRoZSByZXBsYXkgYnVkZ2V0IHBhdXNlZFxuICAvLyAgICAgIGR1cmluZyBzdGVwIGJvZGllcyDigJQgbWlycm9yaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGlubGluZVxuICAvLyAgICAgIHJlcGxheSBsb29wLiBPdmVyZmxvdyBhbmQgcmV0cnkvdGhyb3R0bGVkIHN0ZXBzIGFyZSBxdWV1ZWQgZm9yXG4gIC8vICAgICAgYmFja2dyb3VuZCBleGVjdXRpb24uIEEgZGVsYXllZCB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlIGlzXG4gIC8vICAgICAgZW5xdWV1ZWQgZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCBmaXJzdCwgc28gcmFjaW5nIHRpbWVyc1xuICAvLyAgICAgIGZpcmUgb24gdGltZSAoaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uKSB3aGlsZSBzdGVwIGJvZGllcyBibG9ja1xuICAvLyAgICAgIHRoaXMgb25lLlxuICAvL1xuICAvLyBUaGUgbG9vcCBleGl0cyB3aGVuIHRoZSB3b3JrZmxvdyBzZXR0bGVzLCBubyBmb3J3YXJkIHByb2dyZXNzIGlzXG4gIC8vIHBvc3NpYmxlIGluLXByb2Nlc3MsIHRoZSByZXBsYXkgYnVkZ2V0IGlzIGV4aGF1c3RlZCwgb3IgdGhlIHJ1biBpc1xuICAvLyBnb25lLlxuICBjb25zdCBzZWVuRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgfVxuICAvLyBTdGVwIGNpZHMgYWxyZWFkeSBleGVjdXRlZCBpbmxpbmUgYnkgdGhpcyBpbnZvY2F0aW9uLlxuICBjb25zdCBleGVjdXRlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gU3RlcHMgZm9yIHdoaWNoIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHNlbnQgYSBxdWV1ZSBtZXNzYWdlLlxuICBjb25zdCBxdWV1ZWRTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIEFib3J0cyBUSElTIGludm9jYXRpb24gYWxyZWFkeSByZWNvcmRlZCAoaG9va19yZWNlaXZlZCB3cml0dGVuKSDigJRcbiAgLy8gZ3VhcmRzIGFnYWluc3QgcmUtcmVjb3JkaW5nIHdoZW4gdGhlIFZNLXNpZGUgZmxhZyBoYXMgbm90IGJlZW5cbiAgLy8gY2xlYXJlZCB5ZXQgd2l0aGluIHRoZSBzYW1lIGl0ZXJhdGlvbi5cbiAgY29uc3QgcmVjb3JkZWRBYm9ydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBXYWl0cyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgY29tcGxldGVkL3NjaGVkdWxlZCB3b3JrLlxuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzMiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YXRlIHBlciBzdGVwIGNvcnJlbGF0aW9uSWQsIGRlcml2ZWQgZnJvbSBldmVyeVxuICAvLyBldmVudCB0aGlzIGludm9jYXRpb24gb2JzZXJ2ZXMgKGluaXRpYWwgbG9nICsgZXZlcnkgZmVlZCkg4oCUIHRoZVxuICAvLyBxdWlja2pzIGFuYWxvZyBvZiB0aGUgcmVwbGF5LWRlcml2ZWQgb3duZXJzaGlwIG9uIHRoZSBub2RlIGVuZ2luZSdzXG4gIC8vIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIChzZWUgc3RlcC1vd25lcnNoaXAudHMpLiBMYXRlc3Qtd2luczpcbiAgLy8gZXZlbnRzIGFycml2ZSBpbiBsb2cgb3JkZXIsIHNvIGEgbGF0ZXIgc3RlcF9zdGFydGVkIG92ZXJ3cml0ZXMgdGhlXG4gIC8vIHN0YW1wOyBhIHN0ZXBfcmV0cnlpbmcgbGFwc2VzIG93bmVyc2hpcCBwZXJtYW5lbnRseSBmb3IgdGhlIGlkLlxuICBjb25zdCBzdGVwT3duZXJzaGlwID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBvd25lcj86IHN0cmluZzsgc3RhcnRlZEF0TXM/OiBudW1iZXI7IHNhd1JldHJ5aW5nOiBib29sZWFuIH1cbiAgPigpO1xuICBjb25zdCBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwID0gKG9ic2VydmVkOiBFdmVudFtdKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBlIG9mIG9ic2VydmVkKSB7XG4gICAgICBpZiAoZS5jb3JyZWxhdGlvbklkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICBjb25zdCBvd25lciA9XG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZSAmJlxuICAgICAgICAgIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgJ293bmVyTWVzc2FnZUlkJyBpbiBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAgIHR5cGVvZiBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHN0YXJ0ZWRBdE1zOiBlLmNyZWF0ZWRBdCA/ICtuZXcgRGF0ZShlLmNyZWF0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHByaW9yPy5zYXdSZXRyeWluZyA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgY29uc3QgcHJpb3IgPSBzdGVwT3duZXJzaGlwLmdldChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBzdGVwT3duZXJzaGlwLnNldChlLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICAuLi4ocHJpb3IgPz8ge30pLFxuICAgICAgICAgIHNhd1JldHJ5aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAoZXZlbnRzKTtcbiAgY29uc3Qgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWF4SW5saW5lU3RlcHMgPSBnZXRNYXhJbmxpbmVTdGVwcygpO1xuICBjb25zdCBidWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG4gIGNvbnN0IHdvcmtmbG93U3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgPyArd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgOiBEYXRlLm5vdygpO1xuICBjb25zdCByb290UnVuSWQgPVxuICAgICh3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bXG4gICAgICBST09UX1JVTl9JRF9BVFRSSUJVVEVcbiAgICBdID8/IHJ1bklkO1xuICBsZXQgaW5saW5lU3RlcHNFeGVjdXRlZCA9IDA7XG4gIGxldCBydW5Hb25lID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIHRoaXMgaW52b2NhdGlvbiB3cm90ZSBhbiBldmVudCB0aGUgd29ya2Zsb3cgbXVzdCBjb25zdW1lIHRvXG4gIC8vIG1ha2UgcHJvZ3Jlc3MgKGF0dHJfc2V0LCBnZXRDb25mbGljdC1hd2FpdGVkIGhvb2tfY3JlYXRlZCkgYW5kIHRoZVxuICAvLyBsb29wIGhhcyBub3QgeWV0IHJlYWQgaXQgYmFjayDigJQgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmdzIGNhblxuICAvLyByZXR1cm4gMCBuZXcgZXZlbnRzIHJpZ2h0IGFmdGVyIGEgd3JpdGUuIElmIGl0IGlzIHN0aWxsIHNldCB3aGVuIHRoZVxuICAvLyBsb29wIGV4aXRzIHN1c3BlbmRlZCwgdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZlxuICAvLyBleGl0aW5nIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggdGhlIHVuYmxvY2tpbmcgZXZlbnQgYWxyZWFkeSB3cml0dGVuXG4gIC8vIGFuZCBub3RoaW5nIHNjaGVkdWxlZCB0byByZWFkIGl0LlxuICBsZXQgcGVuZGluZ1JlcXVldWVTaWduYWwgPSBmYWxzZTtcblxuICAvKiogRmV0Y2ggYWxsIGV2ZW50cyBub3QgeWV0IHByb2Nlc3NlZCBieSB0aGUgbGl2ZSBWTSAobG9nIG9yZGVyKS4gKi9cbiAgY29uc3QgZmV0Y2hVbnNlZW5FdmVudHMgPSBhc3luYyAoKTogUHJvbWlzZTxFdmVudFtdPiA9PiB7XG4gICAgY29uc3QgdW5zZWVuOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgaWYgKGUuZXZlbnRJZCAmJiBzZWVuRXZlbnRJZHMuaGFzKGUuZXZlbnRJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoZS5ldmVudElkKSBzZWVuRXZlbnRJZHMuYWRkKGUuZXZlbnRJZCk7XG4gICAgICAgIHVuc2Vlbi5wdXNoKGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikgY3Vyc29yID0gcmVzcG9uc2UuY3Vyc29yO1xuICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmRhdGEubGVuZ3RoID4gMCAmJiByZXNwb25zZS5jdXJzb3IgIT0gbnVsbDtcbiAgICB9XG4gICAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcCh1bnNlZW4pO1xuICAgIHJldHVybiB1bnNlZW47XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICB3aGlsZSAocmVzdWx0LnN1c3BlbmRlZCAmJiAhcnVuR29uZSAmJiAhYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIGl0ZXJhdGlvbisrO1xuICAgICAgLy8gUmUtY2hlY2sgdGhlIGV2ZW50IGNlaWxpbmcgZXZlcnkgdHVybjogdGhlIGxvb3AgYXBwZW5kcyBldmVudHMgb25cbiAgICAgIC8vIGVhY2ggY29udGludWVXaXRoRXZlbnRzLCBzbyBhIHNpbmdsZSBpbnZvY2F0aW9uIGNhbiBvdGhlcndpc2UgZ3Jvd1xuICAgICAgLy8gdGhlIGxvZyBhcmJpdHJhcmlseSBmYXIgcGFzdCB0aGUgb3BlcmF0b3IncyBsaW1pdCAodGhlIG5vZGUgZW5naW5lXG4gICAgICAvLyByZS1jaGVja3MgcGVyIHJlcGxheSBmb3IgdGhlIHNhbWUgcmVhc29uKS4gYHNlZW5FdmVudElkc2AgY291bnRzXG4gICAgICAvLyBldmVyeSBldmVudCB0aGlzIGludm9jYXRpb24gaGFzIG9ic2VydmVkIOKAlCBpbml0aWFsIGxvZyArIGFsbFxuICAgICAgLy8gZmVlZHMuXG4gICAgICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBzZWVuRXZlbnRJZHMuc2l6ZSA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihzZWVuRXZlbnRJZHMuc2l6ZSwgbWF4RXZlbnRzTGltaXQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGVuZGluZ09wZXJhdGlvbnMgPSByZXN1bHQuc3VzcGVuZGVkLnBlbmRpbmdPcGVyYXRpb25zO1xuXG4gICAgICAvLyBTZWxlY3QgdGhpcyB0dXJuJ3MgaW5saW5lIGNhbmRpZGF0ZXMgQkVGT1JFIGRpc3BhdGNoOiBmcmVzaCBzdGVwc1xuICAgICAgLy8gKG5vIHN0ZXBfY3JlYXRlZCB5ZXQpIHRoYXQgdGhpcyBpbnZvY2F0aW9uIGhhc24ndCBhbHJlYWR5IGhhbmRsZWQuXG4gICAgICAvLyBUaGVpciBzdGVwX2NyZWF0ZWQgaXMgZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGJ5IGRpc3BhdGNoIOKAlCB0aGVcbiAgICAgIC8vIGlubGluZSBjbGFpbSBiZWxvdyBpcyBhIGxhenkgc3RlcF9zdGFydGVkIGNhcnJ5aW5nIHRoZSBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIHRoZSB3b3JsZCBhcHBsaWVzIGFzIGFuIGF0b21pYyBjcmVhdGUtY2xhaW0uIEEgY29uY3VycmVudFxuICAgICAgLy8gaW52b2NhdGlvbiByYWNpbmcgb24gdGhlIHNhbWUgZnJlc2ggc3RlcCBsb3NlcyB0aGF0IGNsYWltIHdpdGhcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IgYW5kIHNraXBzLCBzbyBzdGVwIGJvZGllcyBjYW5ub3QgZG91YmxlLXJ1blxuICAgICAgLy8gKHByZXZpb3VzbHkgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0ZWQgdGhlIHN0ZXAgYWZ0ZXIgb25lIGxvc3RcbiAgICAgIC8vIHRoZSBzd2FsbG93ZWQgc3RlcF9jcmVhdGVkIHJhY2UpLlxuICAgICAgY29uc3QgZnJlc2hTdGVwcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT5cbiAgICAgICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAgICAgIWV4ZWN1dGVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAhcXVldWVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgICBjb25zdCBpbmxpbmVDYW5kaWRhdGVzID1cbiAgICAgICAgbWF4SW5saW5lU3RlcHMgPD0gMCA/IFtdIDogZnJlc2hTdGVwcy5zbGljZSgwLCBtYXhJbmxpbmVTdGVwcyk7XG4gICAgICBjb25zdCBpbmxpbmVDbGFpbUNpZHMgPSBuZXcgU2V0KFxuICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT4gc3RlcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcblxuICAgICAgLy8gMS4gRHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzLlxuICAgICAgY29uc3Qgb3BzVG9EaXNwYXRjaCA9IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgob3ApID0+XG4gICAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgICAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkICYmXG4gICAgICAgIHJlY29yZGVkQWJvcnRJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgPyAoeyAuLi5vcCwgYWJvcnRSZXF1ZXN0ZWQ6IGZhbHNlIH0gYXMgUGVuZGluZ09wZXJhdGlvbilcbiAgICAgICAgICA6IG9wXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snICYmIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICByZWNvcmRlZEFib3J0SWRzLmFkZChvcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZGlzcGF0Y2hlZCA9IGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgIHdvcmxkLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IG9wc1RvRGlzcGF0Y2gsXG4gICAgICAgIHNraXBTdGVwQ3JlYXRpb246IGlubGluZUNsYWltQ2lkcyxcbiAgICAgICAgd2ZkaWFnLFxuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEF0dHJpYnV0ZUV2ZW50IHx8XG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEdldENvbmZsaWN0SG9va1xuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZCBzdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgdG8gdGhlIHF1ZXVlIE5PVyDigJQgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIHdhcyB3cml0dGVuIGJ5IHRoZSBkaXNwYXRjaCBhYm92ZS4gVGhpc1xuICAgICAgLy8gbXVzdCBoYXBwZW4gQkVGT1JFIHRoZSBldmVudCBmZWVkIGJlbG93OiB0aGUgZmVlZCBhbHdheXMgb2JzZXJ2ZXNcbiAgICAgIC8vIHRob3NlIHZlcnkgc3RlcF9jcmVhdGVkIHdyaXRlcyBhcyB1bnNlZW4gZXZlbnRzIGFuZCBgY29udGludWVgcyxcbiAgICAgIC8vIHNvIGEgaGFuZG9mZiBwbGFjZWQgYWZ0ZXIgaXQgaXMgdW5yZWFjaGFibGUgb24gdGhlIG9ubHkgaXRlcmF0aW9uXG4gICAgICAvLyB0aGF0IHN0aWxsIGNsYXNzaWZpZXMgdGhlc2Ugc3RlcHMgYXMgZnJlc2gg4oCUIG5leHQgdHVybiB0aGV5IGNhcnJ5XG4gICAgICAvLyBoYXNDcmVhdGVkRXZlbnQgYW5kIHdvdWxkIG5ldmVyIGJlIHF1ZXVlZCBhdCBhbGwgKHRoZSB3ZWRnZSBiZWhpbmRcbiAgICAgIC8vIHByb21pc2VSYWNlU3RyZXNzVGVzdFdvcmtmbG93IGhhbmdpbmcgaW4gdGhlIHF1aWNranMgQ0kgbGVncykuIFRoZVxuICAgICAgLy8gYmFyZS1jb3JyZWxhdGlvbklkIGlkZW1wb3RlbmN5IGtleSBtYWtlcyByZXBlYXRzIGhhcm1sZXNzLlxuICAgICAgY29uc3Qgb3ZlcmZsb3dTdGVwcyA9IGZyZXNoU3RlcHMuc2xpY2UoaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIG92ZXJmbG93U3RlcHMpIHtcbiAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBiYXJlLWNvcnJlbGF0aW9uSWQgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgIC8vICAgICBvcmlnaW5hbCBoYW5kb2ZmLlxuICAgICAgY29uc3Qgbm93TXMgPSBEYXRlLm5vdygpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBPcHMpIHtcbiAgICAgICAgaWYgKCFzdGVwLmhhc0NyZWF0ZWRFdmVudCkgY29udGludWU7XG4gICAgICAgIGlmIChleGVjdXRlZFN0ZXBJZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVldWVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcCA9IHN0ZXBPd25lcnNoaXAuZ2V0KHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgb3duZXJzaGlwICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICFvd25lcnNoaXAuc2F3UmV0cnlpbmc7XG4gICAgICAgIGxldCBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSAwO1xuICAgICAgICBpZiAob3duZXJzaGlwQWN0aXZlICYmIG93bmVyc2hpcC5zdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID0gTWF0aC5taW4oXG4gICAgICAgICAgICBsZWFzZVNlY29uZHMsXG4gICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgIChvd25lcnNoaXAuc3RhcnRlZEF0TXMgKyBsZWFzZVNlY29uZHMgKiAxMDAwIC0gbm93TXMpIC8gMTAwMFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgb3duZXJzaGlwLm93bmVyICE9PSBvd25lck1lc3NhZ2VJZCAmJlxuICAgICAgICAgIGxlYXNlUmVtYWluaW5nU2Vjb25kcyA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBhd2FpdCBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBkZWxheVNlY29uZHM6IGxlYXNlUmVtYWluaW5nU2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiBgYmFja3N0b3A6JHtvd25lcnNoaXAuc3RhcnRlZEF0TXN9YCxcbiAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBObyBpbi1wcm9jZXNzIHByb2dyZXNzIHBvc3NpYmxlIOKAlCB0aGUgcnVuIGF3YWl0cyBhbiBleHRlcm5hbFxuICAgICAgICAvLyBzdGltdWx1cyAoaG9vayBwYXlsb2FkLCBxdWV1ZWQgc3RlcCwgd2FpdCB0aW1lcikuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBSYWNpbmcgdGltZXJzIG11c3QgZmlyZSBvbiB0aW1lIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrIHRoaXNcbiAgICAgIC8vIGludm9jYXRpb246IGVucXVldWUgYSBkZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3RcbiAgICAgIC8vIHBlbmRpbmcgd2FpdCAoYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIHdyaXRlcyBpdHMgd2FpdF9jb21wbGV0ZWQgYXRcbiAgICAgIC8vIHRoZSByaWdodCBsb2cgcG9zaXRpb24g4oCUIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyB3YWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaCkuXG4gICAgICBsZXQgc29vbmVzdFdhaXQ6IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBzZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgLy8gV2FpdHMgd2hvc2Ugd2FpdF9jb21wbGV0ZWQgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgd3JvdGUgKHRoZVxuICAgICAgICAvLyBlbGFwc2VkLXdhaXQgcGFzcyBhYm92ZSkgYXJlIGRvbmUg4oCUIHRoZSBldmVudCBqdXN0IGhhc24ndCBmZWRcbiAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBWTSB5ZXQuIE5vIGNvbnRpbnVhdGlvbiBuZWVkZWQuXG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1lbGFwc2VkIHdhaXQgTVVTVCBzdGlsbCBnZXQgYSBjb250aW51YXRpb24gKGNsYW1wZWRcbiAgICAgICAgLy8gdG8gdGhlIDFzIG1pbmltdW0sIGV4YWN0bHkgbGlrZSB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgICAvLyBgTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdylgKSwgbm90IGJlIHNraXBwZWQ6IGEgd2FpdFxuICAgICAgICAvLyB3aG9zZSBkZWFkbGluZSBmYWxscyBiZXR3ZWVuIHRoaXMgaXRlcmF0aW9uJ3MgZWxhcHNlZC13YWl0XG4gICAgICAgIC8vIHBhc3MgKHdoaWNoIHNhdyBpdCBhcyBzdGlsbCBwZW5kaW5nIGFuZCB3cm90ZSBub3RoaW5nKSBhbmRcbiAgICAgICAgLy8gdGhpcyBzd2VlcCB3b3VsZCBvdGhlcndpc2UgZ2V0IE5FSVRIRVIgYSB3YWl0X2NvbXBsZXRlZCBOT1IgYVxuICAgICAgICAvLyBjb250aW51YXRpb24g4oCUIGFuZCB0aGUgaW5saW5lIGJhdGNoIGJlbG93IHRoZW4gYmxvY2tzIHRoaXNcbiAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiB3aXRoIG5vIHdha2UgYXJtZWRcbiAgICAgICAgLy8gYW55d2hlcmUuIEZvciBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgdGhhdCBzaWxlbnRseSBoYW5kc1xuICAgICAgICAvLyB0aGUgcmFjZSB0byB0aGUgc3RlcDogdGhlIHNsZWVwJ3Mgd2FpdF9jb21wbGV0ZWQgaXMgbmV2ZXJcbiAgICAgICAgLy8gd3JpdHRlbiBhbmQgdGhlIHJ1biBjb21wbGV0ZXMgd2l0aCB0aGUgd3Jvbmcgd2lubmVyLiBUaGVcbiAgICAgICAgLy8gd2luZG93IGJldHdlZW4gdGhlIHR3byBjaGVja3Mgc3BhbnMgdGhpcyBpdGVyYXRpb24ncyBkaXNwYXRjaFxuICAgICAgICAvLyArIGZlZWQgcm91bmQtdHJpcHMsIHNvIG9uIG5ldHdvcmstYmFja2VkIHdvcmxkcyAod29ybGQtdmVyY2VsKVxuICAgICAgICAvLyBhIHNob3J0IHNsZWVwIGxhbmRzIGluIGl0IHJvdXRpbmVseSDigJQgb2JzZXJ2ZWQgYXMgYSB+NTAlXG4gICAgICAgIC8vIHNsZWVwV2luc1JhY2VXb3JrZmxvdyBmYWlsdXJlIHJhdGUgaW4gdGhlIFZlcmNlbCBlMmUgbGVncyxcbiAgICAgICAgLy8gd2hpbGUgd29ybGQtbG9jYWwncyBzdWItbXMgcm91bmQtdHJpcHMgbWFza2VkIGl0IGxvY2FsbHkuIFRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gaW52b2NhdGlvbidzIHByZS1WTSBlbGFwc2VkIGNoZWNrIHdyaXRlcyB0aGVcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQgfjFzIGxhdGVyLlxuICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7IGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCwgc2Vjb25kcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ3dhaXRfY29udGludWF0aW9uX3NjaGVkdWxlZCcsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGRlbGF5U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBiYXRjaCBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheSBidWRnZXQgaXNcbiAgICAgIC8vIHBhdXNlZCB3aGlsZSBzdGVwIGJvZGllcyBydW4g4oCUIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGVcbiAgICAgIC8vIHBsYXRmb3JtIGZ1bmN0aW9uIGR1cmF0aW9uLCBub3QgdGhlIHJlcGxheSB0aW1lb3V0LiBOT1RFIChieVxuICAgICAgLy8gZGVzaWduKTogd2l0aCB0aGUgYnVkZ2V0IHBhcmtlZCBwZXIgYmF0Y2gsIHRoZSBvbmx5IGJvdW5kIG9uIGhvd1xuICAgICAgLy8gbWFueSBpbmxpbmUgc3RlcHMgb25lIGludm9jYXRpb24gY2FuIGNoYWluIGlzIHRoZSBwbGF0Zm9ybSdzXG4gICAgICAvLyBmdW5jdGlvbiB0aW1lb3V0IOKAlCB0aGUgU0RLIGRlbGliZXJhdGVseSBpbXBvc2VzIG5vIGNhcCBvZiBpdHNcbiAgICAgIC8vIG93biwgbWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lLCB3aGVyZSBhIGxvbmcgc2VxdWVudGlhbFxuICAgICAgLy8gd29ya2Zsb3cgbGlrZXdpc2UgcnVucyBzdGVwLWJ5LXN0ZXAgdW50aWwgdGhlIHBsYXRmb3JtIHJlY2xhaW1zXG4gICAgICAvLyB0aGUgaW52b2NhdGlvbiBhbmQgYSByZWRlbGl2ZXJ5IHJlc3VtZXMgZnJvbSB0aGUgbG9nLlxuICAgICAgYnVkZ2V0LnBhdXNlKCk7XG4gICAgICBsZXQgb3V0Y29tZXM6IFN0ZXBFeGVjdXRpb25SZXN1bHRbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dGNvbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaW5saW5lQ2FuZGlkYXRlcy5tYXAoKHN0ZXApID0+XG4gICAgICAgICAgICBydW5TdGVwU2luZ2xlRmxpZ2h0KHJ1bklkLCBzdGVwLmNvcnJlbGF0aW9uSWQsICgpID0+XG4gICAgICAgICAgICAgIChhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIGNsYWltOiBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQgKGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGl0KSBhbmQgdGhpcyBzdGVwX3N0YXJ0ZWQgY2FycmllcyB0aGUgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBhdG9taWNhbGx5IOKAlFxuICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseS1vbmUtb3duZXIuIEEgY29uY3VycmVudCBjbGFpbWFudCBnZXRzXG4gICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKGkiB7IHR5cGU6ICdza2lwcGVkJyB9IGFuZCBuZXZlclxuICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgYm9keS4gTWlycm9ycyB0aGUgbm9kZSBlbmdpbmUncyBpbmxpbmUgcGF0aC5cbiAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCBzdGFtcDogd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keSBhcyBpblxuICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IGluIHRoaXMgaW52b2NhdGlvbiBhbmQgYXJtIGEgZGVsYXllZCBiYWNrc3RvcFxuICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIOKAlCBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiAxLFxuICAgICAgICAgICAgICAgIH0pKSgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgfVxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCArPSBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBpbmxpbmVDYW5kaWRhdGVzW2ldO1xuICAgICAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZXNbaV07XG4gICAgICAgIGV4ZWN1dGVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKG91dGNvbWUudHlwZSA9PT0gJ3JldHJ5JyB8fCBvdXRjb21lLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgLy8gSGFuZCB0aGUgc3RlcCB0byB0aGUgcXVldWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJhY2tvZmYg4oCUXG4gICAgICAgICAgLy8gYmFja2dyb3VuZCBkZWxpdmVyeSBkcml2ZXMgdGhlIHJldHJ5IGZyb20gaGVyZS5cbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogb3V0Y29tZS50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAvLyBTdWZmaXhlZCBrZXk6IHRoaXMgc3RlcCB3YXMgaW5saW5lLWNsYWltZWQsIHNvIG5vIGRpc3BhdGNoXG4gICAgICAgICAgICAvLyBwdWJsaXNoIGV4aXN0cyB1bmRlciB0aGUgYmFyZSBjb3JyZWxhdGlvbklkIOKAlCBidXQgc3VmZml4aW5nXG4gICAgICAgICAgICAvLyBrZWVwcyB0aGUgcmV0cnkgZW5xdWV1ZWFibGUgZXZlbiBpZiBhIHdvcmxkIHJldGlyZWQgYVxuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBrZXkgZm9yIHRoaXMgc3RlcCAoc2VlIHRoZSBwdXJwb3NlIGRvY3MgYWJvdmUpLlxuICAgICAgICAgICAgcHVycG9zZTogJ3JldHJ5OjEnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG91dGNvbWUudHlwZSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgcnVuR29uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gJ3NraXBwZWQnOiBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3b24gdGhlIGxhenkgY3JlYXRlLWNsYWltIGFuZFxuICAgICAgICAvLyBvd25zIHRoZSBib2R5LiBNYXJrZWQgZXhlY3V0ZWQgYWJvdmUgc28gdGhpcyBpbnZvY2F0aW9uIG5ldmVyXG4gICAgICAgIC8vIHJlLWNsYWltcyBpdDsgdGhlIHdpbm5lcidzIHRlcm1pbmFsIGV2ZW50cyBhcnJpdmUgdmlhIHRoZSBmZWVkXG4gICAgICAgIC8vIChvciBkcml2ZSBhIHNlcGFyYXRlIGludm9jYXRpb24pLlxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdpbmxpbmVfc3RlcHNfZXhlY3V0ZWQnLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgY291bnQ6IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoLFxuICAgICAgICBvdXRjb21lczogb3V0Y29tZXMubWFwKChvKSA9PiBvLnR5cGUpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZlZWQgdGhlIGlubGluZSBiYXRjaCdzIHRlcm1pbmFsIGV2ZW50cyBpbnRvIHRoZSBsaXZlIFZNLiBXaGVuXG4gICAgICAvLyB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgaGFzIG5vdCBzdXJmYWNlZCB0aGVtIHlldCxcbiAgICAgIC8vIGV4aXRpbmcgbXVzdCBOT1QgYWNrIHNpbGVudGx5OiB0aGUgdGVybWluYWxzIHRoaXMgaW52b2NhdGlvbiBqdXN0XG4gICAgICAvLyBjYXVzZWQgYXJlIGR1cmFibHkgd3JpdHRlbiB3aXRoIG5vIHF1ZXVlIG1lc3NhZ2UgbGVmdCB0byBjb25zdW1lXG4gICAgICAvLyB0aGVtIChpbmxpbmUgc3RlcHMgaGF2ZSBub25lKSwgc28gYW4gYXdhaXRpbmdfZXh0ZXJuYWwgZXhpdCB3b3VsZFxuICAgICAgLy8gcGFyayB0aGUgcnVuICdydW5uaW5nJyB3aXRoIGFsbCBpdHMgc3RlcHMgY29tcGxldGUuIFJhaXNlIHRoZVxuICAgICAgLy8gcmVxdWV1ZSBzaWduYWwgc28gdGhlIHN1c3BlbmRlZCBleGl0IHNjaGVkdWxlcyBhIGZyZXNoIGltbWVkaWF0ZVxuICAgICAgLy8gaW52b2NhdGlvbiB3aG9zZSBmcmVzaCByZWFkIHBpY2tzIHRoZSB0ZXJtaW5hbHMgdXAuIE91dGNvbWVzIHRoYXRcbiAgICAgIC8vIHdyb3RlIG5vIHRlcm1pbmFsICgnc2tpcHBlZCcg4oCUIGEgY29uY3VycmVudCBjbGFpbWFudCBvd25zIHRoZVxuICAgICAgLy8gYm9keTsgJ2dvbmUnLCByZXRyeS90aHJvdHRsZWQg4oCUIGEgcXVldWUgbWVzc2FnZSBleGlzdHMpIGRvbid0XG4gICAgICAvLyBuZWVkIGl0LCBidXQgc2lnbmFsaW5nIG9uIHRoZW0gdG9vIG9ubHkgY29zdHMgYSBuby1vcCBpbnZvY2F0aW9uXG4gICAgICAvLyBpbiBhbiBhbHJlYWR5LXJhcmUgbGFnIHdpbmRvdy5cbiAgICAgIGNvbnN0IG5ld0V2ZW50cyA9IGF3YWl0IGZldGNoVW5zZWVuRXZlbnRzKCk7XG4gICAgICBpZiAobmV3RXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcblxuICAgICAgd2ZkaWFnKCdpbmxpbmVfaXRlcmF0aW9uJywge1xuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIHBoYXNlOiAnc3RlcHMnLFxuICAgICAgICBmZWRFdmVudHM6IG5ld0V2ZW50cy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICBidWRnZXRFeGhhdXN0ZWQ6IGJ1ZGdldC5pc0V4aGF1c3RlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNlc3Npb24uZGlzcG9zZSgpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNJbmxpbmVTdGVwcyhpbmxpbmVTdGVwc0V4ZWN1dGVkKSxcbiAgfSk7XG5cbiAgaWYgKHJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWRcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgY29tcGxldGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgfSk7XG4gICAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU091dGNvbWUoJ2NvbXBsZXRlZCcpLFxuICAgIH0pO1xuXG4gICAgLy8gRmx1c2ggbGVmdG92ZXIgcGVuZGluZyBzaWRlIGVmZmVjdHMgKGFib3J0IHJlY29yZGluZ3MsIHN5c3RlbS1ob29rXG4gICAgLy8gZGlzcG9zYWxzLCBmaXJlLWFuZC1mb3JnZXQgYXR0cmlidXRlL2hvb2sgZXZlbnRzKSBCRUZPUkUgd3JpdGluZ1xuICAgIC8vIHJ1bl9jb21wbGV0ZWQg4oCUIG1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcy5cbiAgICAvLyBEcmFpbiBmYWlsdXJlcyBhcmUgc3dhbGxvd2VkOiB0aGUgd29ya2Zsb3cncyBvd24gb3V0Y29tZSBpcyB0aGVcbiAgICAvLyBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaWYgKHJlc3VsdC5jb21wbGV0ZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2NvbXBsZXRlZCBldmVudC5cbiAgICAvLyBUaGUgVk0gc2VyaWFsaXplcyB0aGUgd29ya2Zsb3cgcmVzdWx0IGFzIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzXG4gICAgLy8gKFwiZGV2bFwiICsgZGV2YWx1ZSkgd2l0aCBubyBlbmNyeXB0aW9uICh0aGUgVk0gaGFzIG5vIGFjY2VzcyB0byB0aGVcbiAgICAvLyBDcnlwdG9LZXkpLiBIb3N0LXNpZGUgZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmUgc28gdGhhdCBgcnVuX2NvbXBsZXRlZGBcbiAgICAvLyBldmVudHMgaGF2ZSB0aGUgc2FtZSBgZW5jcmAtcHJlZml4ZWQgcGF5bG9hZCBzaGFwZSB0aGF0IHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lJ3MgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgIHByb2R1Y2VzLlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIG91dHB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlZC5yZXN1bHQsXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAncnVuX2NvbXBsZXRlZF93cml0dGVuJyB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBydW5fY29tcGxldGVkJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgKTtcbiAgICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAnYWxyZWFkeV9maW5pc2hlZCcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWRfZXJyb3InLCB7XG4gICAgICAgIGVycm9yTmFtZTogKGVyciBhcyBFcnJvcik/Lm5hbWUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmVzdWx0LnN1c3BlbmRlZCkge1xuICAgIC8vIFdvcmtmbG93IHN0aWxsIHN1c3BlbmRlZCBhZnRlciB0aGUgaW5saW5lIGxvb3AuIEFsbCBkdXJhYmxlIHNpZGVcbiAgICAvLyBlZmZlY3RzIGZvciB0aGUgZmluYWwgc3VzcGVuc2lvbiBzdGF0ZSB3ZXJlIGFscmVhZHkgZGlzcGF0Y2hlZCBieVxuICAgIC8vIHRoZSBsb29wOyB3aGF0IHJlbWFpbnMgaXMgZGVjaWRpbmcgaG93IHRoZSBydW4gZ2V0cyByZS1pbnZva2VkLlxuICAgIGNvbnN0IHsgcGVuZGluZ09wZXJhdGlvbnMgfSA9IHJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkLFxuICAgICAgcGVuZGluZ1N0ZXBzOiBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gJ3N0ZXAnKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nV2FpdHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnd2FpdCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPcHM6IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgocCkgPT4gKHtcbiAgICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgICB9KSksXG4gICAgfSk7XG5cbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnc3VzcGVuZGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU1BlbmRpbmdPcHNDb3VudChwZW5kaW5nT3BlcmF0aW9ucy5sZW5ndGgpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJ1bkdvbmUpIHtcbiAgICAgIC8vIFRoZSBydW4gbm8gbG9uZ2VyIGV4aXN0cyAoZXhwaXJlZCAvIGRlbGV0ZWQpIOKAlCBub3RoaW5nIHRvIGRyaXZlLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAncnVuX2dvbmUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4aXQgcmVxdWV1ZXMgYXJlIEZSRVNIIG1lc3NhZ2VzLCBuZXZlciBhIGB7IHRpbWVvdXRTZWNvbmRzIH1gXG4gICAgLy8gdmlzaWJpbGl0eS1yZWRlbGl2ZXJ5IG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAvLyBDVVJSRU5UIG1lc3NhZ2UgaXMgYSB0cmFwOiBhIGhvb2stcmVzdW1lIGRlbGl2ZXJ5IGNhcnJpZXNcbiAgICAvLyBgaG9va0lucHV0YCwgYW5kIGl0cyByZWRlbGl2ZXJ5IHJlLXJ1bnMgdGhlIGxhenktcmVzdW1lIHJlLWVuc3VyZVxuICAgIC8vIGluIHRoZSBoYW5kbGVyIHByb2xvZ3VlIOKAlCBpZiB0aGUgd29ya2Zsb3cgZGlzcG9zZWQgdGhhdCBob29rXG4gICAgLy8gZHVyaW5nIHRoaXMgaW52b2NhdGlvbiAoZGlzcG9zZSDihpIgc2xlZXApLCBhIHdvcmxkIHRoYXQgcmVqZWN0c1xuICAgIC8vIHRoZSByZS1lbnN1cmUgd291bGQgYWNrIHRoZSBtZXNzYWdlIGFzIFwibm90aGluZyBsZWZ0IHRvIHJlc3VtZVwiXG4gICAgLy8gYW5kIHRoZSBjb250aW51YXRpb24gaXQgY2FycmllZCBpcyBzaWxlbnRseSBsb3N0LiBBIGZyZXNoIG1lc3NhZ2VcbiAgICAvLyBjYXJyaWVzIG9ubHkgYHJ1bklkYCwgc28gaXRzIGRlbGl2ZXJ5IGFsd2F5cyByZWFjaGVzIHJlcGxheSAoYW5kXG4gICAgLy8gdW5kZXIgdHVyYm8gYSByZXNjaGVkdWxlIHdvdWxkIHJlLWVuZ2FnZSB0dXJibyBhZ2FpbnN0IGEgc3RhbGVcbiAgICAvLyBwcmVsb2FkZWQgbG9nIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jcyBpbiBydW50aW1lLnRzKS5cbiAgICBjb25zdCByZXF1ZXVlSW1tZWRpYXRlbHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKGJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAvLyBUaGUgbG9vcCBzdG9wcGVkIG9uIHRoZSByZXBsYXkgYnVkZ2V0IHdpdGggcHJvZ3Jlc3Mgc3RpbGxcbiAgICAgIC8vIHBvc3NpYmxlIOKAlCBjb250aW51ZSBpbiBhIGZyZXNoIGludm9jYXRpb24uXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdidWRnZXRfZXhoYXVzdGVkX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCB3YWl0IHN3ZWVwLiBBIHdhaXQgdGhhdCBlbGFwc2VkIGluIHRoZSB3aW5kb3cgc2luY2UgdGhlXG4gICAgLy8gbG9vcCdzIGxhc3QgY2hlY2sgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgKGl0cyB3YWl0X2NvbXBsZXRlZCBpc1xuICAgIC8vIHdyaXR0ZW4gYnkgdGhlIG5leHQgaW52b2NhdGlvbidzIGVsYXBzZWQtd2FpdCBwYXNzKTsgcGVuZGluZyB3YWl0c1xuICAgIC8vIHdob3NlIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBhbHJlYWR5IGVucXVldWVkIGFyZSBza2lwcGVkLlxuICAgIGxldCBzb29uZXN0V2FpdDogeyBzZWNvbmRzOiBudW1iZXI7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCBoYXNFbGFwc2VkV2FpdCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHJlc3VtZU1zIDw9IDApIHtcbiAgICAgICAgaGFzRWxhcHNlZFdhaXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgdGltZW91dFNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7XG4gICAgICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0VsYXBzZWRXYWl0KSB7XG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd3YWl0X2VsYXBzZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ1JlcXVldWVTaWduYWwpIHtcbiAgICAgIC8vIFRoaXMgaW52b2NhdGlvbiB3cm90ZSBldmVudHMgdGhlIHdvcmtmbG93IG5lZWRzIHRvIGNvbnN1bWVcbiAgICAgIC8vIChhdHRyX3NldCAvIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkIC8gaW5saW5lIHN0ZXBcbiAgICAgIC8vIHRlcm1pbmFscykgYnV0IHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBuZXZlciByZXR1cm5lZFxuICAgICAgLy8gdGhlbSBiZWZvcmUgdGhlIGxvb3AgZXhpdGVkLiBXaXRob3V0IGEgcmVxdWV1ZSB0aGUgcnVuIHdvdWxkXG4gICAgICAvLyBwYXJrIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggaXRzIHVuYmxvY2tpbmcgZXZlbnRzIGFscmVhZHlcbiAgICAgIC8vIGR1cmFibHkgd3JpdHRlbiBhbmQgbm8gZnV0dXJlIGludm9jYXRpb24gY29taW5nIOKAlCByZXF1ZXVlXG4gICAgICAvLyBpbW1lZGlhdGVseSBzbyBhIGZyZXNoIHJlYWQgcGlja3MgdGhlbSB1cC4gSW4gdGhlIGNvbW1vbiBjYXNlXG4gICAgICAvLyB0aGUgbG9vcCdzIG93biBmZWVkIG9ic2VydmVzIHRoZSB3cml0ZXMgYW5kIGNsZWFycyB0aGlzIGZsYWcsIHNvXG4gICAgICAvLyB0aGlzIG9ubHkgZmlyZXMgd2hlbiB0aGUgcmVhZCBhY3R1YWxseSBsYWdnZWQuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd1bnJlYWRfc2VsZl93cml0ZV9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgLy8gRGVsYXllZCBjb250aW51YXRpb24gZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCB0aGUgbG9vcCBoYXNcbiAgICAgIC8vIG5vdCBhbHJlYWR5IHNjaGVkdWxlZC4gVGhlIGRpc3BhdGNoIGhlbHBlciBoYW5kbGVzIGRlbGF5XG4gICAgICAvLyBjbGFtcGluZyAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3MgaG9wcykgYW5kIGlkZW1wb3RlbmN5LWtleVxuICAgICAgLy8gZGVkdXAgb2YgcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCDigJQgc2VlXG4gICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgICAgYWN0aW9uOiAnc2NoZWR1bGVfd2FpdF90aW1lb3V0JyxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgIHdhaXRDb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICBhY3Rpb246ICdhd2FpdGluZ19leHRlcm5hbCcsXG4gICAgICBwZW5kaW5nT3BzQ291bnQ6IHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQuZmFpbGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgZmFpbGVkIOKAlCByZW1hcCBzdGFjayB0cmFjZSB1c2luZyBpbmxpbmUgc291cmNlIG1hcHNcbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICB9XG5cbiAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3Igc28gY29uc3VtZXJzIChgcnVuLnJldHVyblZhbHVlYCwgb2JzZXJ2YWJpbGl0eSlcbiAgICAvLyBnZXQgYFVTRVJfRVJST1JgIC8gYFJVTlRJTUVfRVJST1JgIG9uIGBlcnJvci5jYXVzZS5jb2RlYCwgbWF0Y2hpbmdcbiAgICAvLyB3aGF0IHRoZSBub2RlOnZtIGVuZ2luZSBhbHJlYWR5IGRvZXMgaW4gcnVudGltZS50cy5cbiAgICAvL1xuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIGVycm9ycyBhcyBgeyBuYW1lLCBtZXNzYWdlLCBzdGFjayB9YCwgc28gd2VcbiAgICAvLyByZWNvbnN0cnVjdCBhIGhvc3Qtc2lkZSBFcnJvciBvZiB0aGUgY29ycmVjdCBjbGFzcyBiYXNlZCBvbiB0aGVcbiAgICAvLyBWTS1zaWRlIGBuYW1lYCDigJQgc3BlY2lmaWMgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3NlcyBuZWVkXG4gICAgLy8gdG8gYmUgcHJlc2VydmVkIHNvIGNsYXNzaWZ5UnVuRXJyb3IoKSB0YWdzIHRoZW0gYXMgUlVOVElNRV9FUlJPUi5cbiAgICBjb25zdCByZWNvbnN0cnVjdGVkOiBFcnJvciA9XG4gICAgICByZXN1bHQuZmFpbGVkLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcidcbiAgICAgICAgPyBuZXcgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3Iod29ya2Zsb3dOYW1lKVxuICAgICAgICA6IHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICAgID8gbmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSlcbiAgICAgICAgICA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihyZWNvbnN0cnVjdGVkKTtcblxuICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBlcnJvck5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0LmZhaWxlZC5tZXNzYWdlLFxuICAgICAgZXJyb3JTdGFjayxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnZmFpbGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyBiZWZvcmUgd3JpdGluZyBydW5fZmFpbGVkIOKAlFxuICAgIC8vIHNhbWUgZHJhaW4gc2VtYW50aWNzIGFzIHRoZSBjb21wbGV0ZWQgYnJhbmNoLlxuICAgIGlmIChyZXN1bHQuZmFpbGVkLmRyYWluT3BlcmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdRdWlja0pTIHJ1bnRpbWU6IHRlcm1pbmFsIGRyYWluIGZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJ1bl9mYWlsZWQgZXZlbnQuIFNlcmlhbGl6ZSB0aGUgZXJyb3IgdGhyb3VnaCB0aGVcbiAgICAvLyBmaXJzdC1jbGFzcyBkZWh5ZHJhdGlvbiBwaXBlbGluZSBzbyBjb25zdW1lcnMgKENMSSwgb2JzZXJ2YWJpbGl0eSxcbiAgICAvLyBydW4ucmV0dXJuVmFsdWUpIGdldCB0aGUgc2FtZSBoeWRyYXRlZCB2YWx1ZSBzaGFwZSBhcyB0aGUgbm9kZTp2bVxuICAgIC8vIGVuZ2luZSBlbWl0cy4gVHdvIHBhdGhzOlxuICAgIC8vICAgKiBNb2Rlcm4gKHZhbHVlQnl0ZXMgcHJlc2VudCk6IHRoZSBWTS1zaWRlIHJlamVjdGlvbiBoYW5kbGVyXG4gICAgLy8gICAgIHNlcmlhbGl6ZWQgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSAoRXJyb3Igc3ViY2xhc3Mgd2l0aFxuICAgIC8vICAgICBjYXVzZSBjaGFpbiwgcGxhaW4gb2JqZWN0LCBwcmltaXRpdmUsIGV0Yy4pIHVzaW5nIHRoZSBWTSdzXG4gICAgLy8gICAgIHdvcmtmbG93LXNlcmlhbGl6ZS4gUGFzcyB0aG9zZSBieXRlcyB0aHJvdWdoIGRpcmVjdGx5IHNvXG4gICAgLy8gICAgIHR5cGUgaWRlbnRpdHksIGNhdXNlIGNoYWlucywgYW5kIG5vbi1FcnJvciB0aHJvd3Mgc3Vydml2ZS5cbiAgICAvLyAgICAgV2UganVzdCBuZWVkIHRvIGFwcGx5IGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCAodGhlIFZNJ3NcbiAgICAvLyAgICAgc2VyaWFsaXplciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBlbmNyeXB0aW9uIGtleSkuXG4gICAgLy8gICAqIExlZ2FjeSBmYWxsYmFjazogcmVjb25zdHJ1Y3QgYW4gRXJyb3IgZnJvbSB0aGUgaG9zdC12aXNpYmxlXG4gICAgLy8gICAgIHtuYW1lLCBtZXNzYWdlLCBzdGFja30gZmllbGRzIGFuZCBydW4gaXQgdGhyb3VnaFxuICAgIC8vICAgICBgZGVoeWRyYXRlUnVuRXJyb3JgLiBVc2VkIHdoZW4gdmFsdWVCeXRlcyBpcyBhYnNlbnQgKGUuZy5cbiAgICAvLyAgICAgZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcyBmcm9tIFZNIGJvb3RzdHJhcCkuXG4gICAgbGV0IGRlaHlkcmF0ZWRFcnJvcjogVWludDhBcnJheTtcbiAgICBpZiAocmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBWTS1zaWRlIGJ5dGVzLCByZW1hcCB0aGUgZXJyb3Igc3RhY2sgd2l0aCB0aGVcbiAgICAgIC8vIGhvc3Qtc2lkZSBzb3VyY2UgbWFwICh0aGUgVk0gY2FuJ3QgZG8gdGhpcyDigJQgaXQgbGFja3MgYm90aCB0aGVcbiAgICAgIC8vIHNvdXJjZSBtYXAgYW5kIGByZW1hcEVycm9yU3RhY2tgKSwgYW5kIHJlLWRlaHlkcmF0ZS4gVGhpc1xuICAgICAgLy8gcHJlc2VydmVzIHRoZSBvcmlnaW5hbCB2YWx1ZSdzIHR5cGUgaWRlbnRpdHkgLyBjYXVzZSBjaGFpblxuICAgICAgLy8gd2hpbGUgZml4aW5nIHVwIGZyYW1lcyB0byBwb2ludCBhdCB0aGUgdXNlcidzIHNvdXJjZSBmaWxlcy5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQudmFsdWVCeXRlcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB1bmRlZmluZWQgLy8gVk0gYnl0ZXMgYXJlIHVuZW5jcnlwdGVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgIHR5cGVvZiBoeWRyYXRlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAnc3RhY2snIGluIChoeWRyYXRlZCBhcyBvYmplY3QpICYmXG4gICAgICAgICAgdHlwZW9mIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogdW5rbm93biB9KS5zdGFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgKGh5ZHJhdGVkIGFzIHsgc3RhY2s6IHN0cmluZyB9KS5zdGFjayxcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSBjYXVzZSBjaGFpbiBhbmQgcmVtYXAgbmVzdGVkIHN0YWNrcyB0b28uXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICAgIGxldCBub2RlID0gKGh5ZHJhdGVkIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pPy5jYXVzZTtcbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyhub2RlIGFzIG9iamVjdCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChub2RlIGFzIG9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVN0YWNrID0gKG5vZGUgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2s7XG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlU3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgIChub2RlIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIG5vZGVTdGFjayxcbiAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IChub2RlIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICAgICAgICB9XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIGh5ZHJhdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHJlaHlkcmF0ZUVycikge1xuICAgICAgICAvLyBJZiBoeWRyYXRpb24gLyByZS1kZWh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luYWwgVk0gYnl0ZXMgKGp1c3QgYXBwbHlcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBkZWh5ZHJhdGVkRXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2ZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ3J1bl9mYWlsZWRfd3JpdHRlbicgfSk7XG4gIH1cbn1cbiJdfQ==
1437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEdBRXJCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE9BQU8sSUFBSSxxQkFBcUIsR0FFakMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixZQUFZLEdBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCx3QkFBd0IsRUFPeEIs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QUFDLEVBQUU7b0JBQzlDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7aUJBQ3pCLENBQUMsRUFDRixLQUFLLEVBQ0wsYUFBYSxDQUNkLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsWUFBWTtnQkFDdkIsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRSxlQUFlO29CQUN0QixTQUFTO2lCQUNWO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUU7b0JBQ25FLGFBQWEsRUFBRSxLQUFLO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxDQUFDLG1CQUFtQixFQUFFO2dCQUMxQixTQUFTLEVBQUcsR0FBYSxFQUFFLElBQUk7Z0JBQy9CLFlBQVksRUFBRyxHQUFhLEVBQUUsT0FBTzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVpY2tKUyBWTSBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBXb3JrZmxvdyBEZXZLaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGVudHJ5IHBvaW50IGZvciBydW5uaW5nIHdvcmtmbG93cyBpbiB0aGVcbiAqIFF1aWNrSlMgV0FTTSBWTSBlbmdpbmUgaW5zdGVhZCBvZiB0aGUgYG5vZGU6dm1gIGVuZ2luZS4gQm90aCBlbmdpbmVzXG4gKiBpbXBsZW1lbnQgdGhlIHNhbWUgZXZlbnQtcmVwbGF5IGV4ZWN1dGlvbiBtb2RlbCDigJQgZXZlcnkgaW52b2NhdGlvbjpcbiAqXG4gKiAxLiBMb2FkcyB0aGUgZnVsbCBldmVudCBsb2cgZm9yIHRoZSBydW5cbiAqIDIuIFJ1bnMgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCBpbiBhIGZyZXNoIFF1aWNrSlMgVk0sXG4gKiAgICByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyB0byByZXNvbHZlIGF3YWl0ZWQgcHJpbWl0aXZlc1xuICogMy4gT24gc3VzcGVuc2lvbjogY3JlYXRlcyBldmVudHMgKyBxdWV1ZXMgc3RlcHMgZm9yIG5ldyBwZW5kaW5nIG9wc1xuICogNC4gT24gY29tcGxldGlvbjogY3JlYXRlcyBydW5fY29tcGxldGVkXG4gKiA1LiBPbiBmYWlsdXJlOiBjcmVhdGVzIHJ1bl9mYWlsZWRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdFNlcmlhbGl6ZWREYXRhLFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlUnVuRXJyb3IsXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgbWF5YmVFbmNyeXB0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjaywgc3RyaXBJbmxpbmVTb3VyY2VNYXAgfSBmcm9tICcuLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcyxcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBxdWV1ZU1lc3NhZ2UgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQga2VlcHMgdGhlIGJhcmUgY29ycmVsYXRpb25JZCBzbyBpdCBzdGF5cyBtdXR1YWxseVxuICAgKiBleGNsdXNpdmUgd2l0aCB0aGUgbm9kZSBlbmdpbmUncyBkaXNwYXRjaCBvZiB0aGUgc2FtZSBzdGVwO1xuICAgKiBgYmFja3N0b3A6PGVwb2NoPmAgY292ZXJzIGRlbGF5ZWQgY3Jhc2ggYmFja3N0b3BzLCBzY29wZWQgdG8gdGhlXG4gICAqIG93bmVyc2hpcCBlcG9jaCBzbyBhIHJlZnJlc2hlZCBsZWFzZSByZS1hcm1zIGEgTkVXIGJhY2tzdG9wIGluc3RlYWRcbiAgICogb2YgYmVpbmcgYWJzb3JiZWQgYnkgdGhlIGluLWZsaWdodCBvbmU7IGByZXRyeTo8bj5gIGNvdmVycyBkZWxheWVkXG4gICAqIHJldHJ5L3Rocm90dGxlIHJlLWVucXVldWVzLCBzY29wZWQgdG8gdGhlIGF0dGVtcHQgc28gZWFjaCBiYWNrb2ZmXG4gICAqIGhvcCBpcyBlbnF1ZXVlYWJsZS5cbiAgICovXG4gIHB1cnBvc2U6ICdkaXNwYXRjaCcgfCBgYmFja3N0b3A6JHtzdHJpbmd9YCB8IGByZXRyeToke251bWJlcn1gO1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHdmZGlhZyxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgd29ybGQsXG4gICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgIHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkZW1wb3RlbmN5S2V5OlxuICAgICAgICBwdXJwb3NlID09PSAnZGlzcGF0Y2gnXG4gICAgICAgICAgPyBzdGVwLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICA6IGAke3N0ZXAuY29ycmVsYXRpb25JZH06JHtwdXJwb3NlfWAsXG4gICAgICAuLi4oZGVsYXlTZWNvbmRzICYmIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDoge30pLFxuICAgIH1cbiAgKTtcbiAgd2ZkaWFnKCdzdGVwX3F1ZXVlZCcsIHtcbiAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICBwdXJwb3NlLFxuICAgIGRlbGF5U2Vjb25kczogZGVsYXlTZWNvbmRzID8/IDAsXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCBuZXZlciBxdWV1ZWQgaGVyZSDigJQgcXVldWVpbmcgKG9yIGlubGluZVxuICogZXhlY3V0aW9uKSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24uIFVzZWQgYm90aCBmb3Igc3VzcGVuc2lvblxuICogcHJvY2Vzc2luZyAodGhlIGlubGluZSBsb29wKSBhbmQgZm9yIHRoZSB0ZXJtaW5hbCBkcmFpbiAoZmx1c2hpbmdcbiAqIGxlZnRvdmVyIHNpZGUgZWZmZWN0cyB3aGVuIHRoZSB3b3JrZmxvdyBjb21wbGV0ZWQgb3IgZmFpbGVkLCBtaXJyb3JpbmdcbiAqIHRoZSBub2RlOnZtIGVuZ2luZSdzIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNwYXRjaFBlbmRpbmdPcHMocGFyYW1zOiB7XG4gIHdvcmxkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmxkPj47XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgZW5jcnlwdGlvbktleTogUnVuUGF5bG9hZEtleXMgfCB1bmRlZmluZWQ7XG4gIHBlbmRpbmdPcGVyYXRpb25zOiBQZW5kaW5nT3BlcmF0aW9uW107XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgbXVzdCBOT1QgYmUgd3JpdHRlbiBoZXJlOiB0aGUgaW5saW5lXG4gICAqIGxvb3AgY2xhaW1zIHRoZXNlIGF0b21pY2FsbHkgdmlhIGEgbGF6eSBgc3RlcF9zdGFydGVkYCAoY2FycnlpbmcgdGhlXG4gICAqIGlucHV0KSwgc28gYSBjb25jdXJyZW50IGNsYWltYW50IGxvc2VzIHdpdGggRW50aXR5Q29uZmxpY3RFcnJvclxuICAgKiBpbnN0ZWFkIG9mIGJvdGggaW52b2NhdGlvbnMgYmFyZS1zdGFydGluZyB0aGUgc2FtZSBzdGVwLlxuICAgKi9cbiAgc2tpcFN0ZXBDcmVhdGlvbj86IFNldDxzdHJpbmc+O1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciBhbGwgbWVzc2FnZSBwdWJsaXNoZXMgKHNlZSBydW50aW1lLnRzKS4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzLiBJbiB0aGUgZGVmYXVsdFxuICAgKiBgbGlua2VkYCB0cmFjZSBtb2RlIHRoaXMgcmV0dXJucyB0aGUgY2FycmllciBvZiB0aGUgcnVuJ3MgT1JJR0lOXG4gICAqIGNvbnRleHQgKHdvcmtmbG93LnN0YXJ0KSwgc28gZXZlcnkgaW52b2NhdGlvbiBsaW5rcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFydCBpbiBhIHN0YXIg4oCUIGNhcHR1cmluZyB0aGUgY3VycmVudCBjb250ZXh0IGhlcmUgaW5zdGVhZCB3b3VsZFxuICAgKiBjaGFpbiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmNcbiAgICogcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgd2ZkaWFnOiAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufSk6IFByb21pc2U8e1xuICBjcmVhdGVkQXR0cmlidXRlRXZlbnQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRHZXRDb25mbGljdEhvb2s6IGJvb2xlYW47XG59PiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBlbmRpbmdPcGVyYXRpb25zLFxuICAgIG5hbWVzcGFjZSxcbiAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBza2lwU3RlcENyZWF0aW9uID0gcGFyYW1zLnNraXBTdGVwQ3JlYXRpb247XG4gIGNvbnN0IHdmZGlhZyA9IHBhcmFtcy53ZmRpYWc7XG4gIC8vIFNldCB3aGVuIGEgaG9vayB3aXRoIGEgcGFya2VkIGdldENvbmZsaWN0KCkgYXdhaXRlciBoYWQgaXRzXG4gIC8vIGhvb2tfY3JlYXRlZCB3cml0dGVuIHRoaXMgaW52b2NhdGlvbi4gVGhlIHdvcmtmbG93IG11c3QgYmUgcmUtaW52b2tlZFxuICAvLyBzbyByZXBsYXkgY2FuIGNvbmZpcm0gY3JlYXRpb24gYW5kIHJlc29sdmUgdGhlIGF3YWl0ZXIuXG4gIGxldCBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIGEgbmV3IGF0dHJfc2V0IGV2ZW50IGlzIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGVcbiAgLy8gd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkIHRvIGNvbnN1bWUgaXQgKHJlc29sdmluZyB0aGUgcGVuZGluZ1xuICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZSksIHNvIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5IOKAlFxuICAvLyBzYW1lIHBhdHRlcm4gYXMgYW4gZWxhcHNlZCB3YWl0LlxuICBsZXQgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gZmFsc2U7XG4gIGNvbnN0IG9wc1Byb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICBjb25zdCBwcm9jZXNzSG9va09wID0gYXN5bmMgKGhvb2s6IFBlbmRpbmdIb29rKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2sgb3AnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgdG9rZW5UeXBlOiB0eXBlb2YgaG9vay50b2tlbixcbiAgICAgIGlzV2ViaG9vazogaG9vay5pc1dlYmhvb2ssXG4gICAgICBpc1N5c3RlbTogaG9vay5pc1N5c3RlbSxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogaG9vay5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICBhYm9ydFJlcXVlc3RlZDogaG9vay5hYm9ydFJlcXVlc3RlZCxcbiAgICB9KTtcblxuICAgIGlmICghaG9vay5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIGBob29rLm1ldGFkYXRhYCBpcyB0aGUgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAgIC8vIHByb2R1Y2VkIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXVxuICAgICAgLy8gKG9wdGlvbnMubWV0YWRhdGEpYCBpbnNpZGUgdGhlIFZNLiBFbmNyeXB0IG9uIHRoZSBob3N0XG4gICAgICAvLyBzaWRlIGJlZm9yZSB3cml0aW5nIOKAlCBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBObyBwcmUtY2hlY2sgdmlhIGhvb2tzLmxpc3Q6IHdpdGggZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkc1xuICAgICAgLy8gKHNhbWUgVk0gc2VlZCBhY3Jvc3MgcmVwbGF5cykgYW5kIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpXG4gICAgICAvLyB1bmlxdWVuZXNzIGluIHdvcmxkcywgdGhlIHN0b3JhZ2UgbGF5ZXIgcmVqZWN0cyBkdXBsaWNhdGVzIGFzXG4gICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aGljaCB3ZSBzd2FsbG93IGJlbG93LiBUaGlzIGRyb3BzIG9uZVxuICAgICAgLy8gbmV0d29yayByb3VuZC10cmlwIHBlciBwZW5kaW5nIGhvb2suXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRNZXRhZGF0YSA9XG4gICAgICAgICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoaG9vay5tZXRhZGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NyZWF0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgIHRva2VuUmV0ZW50aW9uVW50aWw6XG4gICAgICAgICAgICAgIGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCksXG4gICAgICAgICAgICBtZXRhZGF0YTogZW5jcnlwdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSBpc1dlYmhvb2sgZXhwbGljaXRseS4gV29ybGRzIGRlZmF1bHQgaXQgdG9cbiAgICAgICAgICAgIC8vIGB0cnVlYCB3aGVuIGFic2VudCwgd2hpY2ggd291bGQgYnJlYWsgdGhlIHB1YmxpYyB3ZWJob29rXG4gICAgICAgICAgICAvLyBlbmRwb2ludCdzIDQwNCBndWFyZCBmb3IgaG9va3MgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpLlxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgICAgICAgIC8vIFN5c3RlbSBob29rcyAoQWJvcnRDb250cm9sbGVyKSBhcmUgZXhlbXB0IGZyb20gdXNlclxuICAgICAgICAgICAgLy8gdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0IGNoZWNrcy5cbiAgICAgICAgICAgIC4uLihob29rLmlzU3lzdGVtID8geyBpc1N5c3RlbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBzdG9yYWdlIGRldGVjdGVkIGEgcmVhbCB0b2tlbiBjb25mbGljdCB3aXRoIGFub3RoZXJcbiAgICAgICAgLy8gd29ya2Zsb3cncyBob29rLCByZS1xdWV1ZSBzbyB0aGUgd29ya2Zsb3cgaGFuZGxlciBjYW5cbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgY29uZmxpY3QgZXZlbnQgYW5kIGZhaWwgZ3JhY2VmdWxseS5cbiAgICAgICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBgaG9va19jb25mbGljdF8ke2hvb2suY29ycmVsYXRpb25JZH1gIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjcmVhdGVkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIOKAlCBmYWxsIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWJvcnQgcHJvY2Vzc2luZyBiZWxvdyAoaWYgYW55KSBpbnN0ZWFkIG9mIGJhaWxpbmcuXG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoaG9vay5oYXNHZXRDb25mbGljdEF3YWl0ZXIpIHtcbiAgICAgICAgY3JlYXRlZEdldENvbmZsaWN0SG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhvb2suYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgYWJvcnQgZHVyYWJseTogYSBob29rX3JlY2VpdmVkIGV2ZW50IGNhcnJ5aW5nXG4gICAgICAvLyB0aGUgVk0tc2VyaWFsaXplZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgcGF5bG9hZCxcbiAgICAgIC8vIHBsdXMgYSBiZXN0LWVmZm9ydCBzdHJlYW0gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcFxuICAgICAgLy8gcHJvcGFnYXRpb24uIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3Mgc3VzcGVuc2lvblxuICAgICAgLy8gaGFuZGxlciAoaG9va3NOZWVkaW5nQWJvcnQpLlxuICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID1cbiAgICAgICAgaG9vay5hYm9ydFBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgPyAoKGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgaG9vay5hYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gc3RyZWFtTmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGFib3J0IGhvb2sgdG9rZW5cbiAgICAgIC8vIChgYWJydF97aWR9YCDihpIgYHN0cm1fe2lkfV9zeXN0ZW1fYWJvcnRgKS5cbiAgICAgIGlmIChob29rLnRva2VuLnN0YXJ0c1dpdGgoJ2FicnRfJykgJiYgYWJvcnRQYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBgc3RybV8ke2hvb2sudG9rZW4uc2xpY2UoJ2FicnRfJy5sZW5ndGgpfV9zeXN0ZW1fYWJvcnRgO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIHN0cmVhbU5hbWUsIGFib3J0UGF5bG9hZCk7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IOKAlCB0aGUgaG9vayBldmVudCBwcm92aWRlcyB0aGUgZHVyYWJsZVxuICAgICAgICAgIC8vIGZhbGxiYWNrLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdhYm9ydF9yZWNvcmRlZCcsIHtcbiAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcCA9IGFzeW5jIChcbiAgICBvcDogUGVuZGluZ0hvb2tEaXNwb3NlXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IG9wLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIC8vIERpc3Bvc2luZyBhIGhvb2sgd2hvc2UgZW50aXR5IG5vIGxvbmdlciAob3IgbmV2ZXIpIGV4aXN0cyBpcyBhblxuICAgICAgLy8gaWRlbXBvdGVudCBuby1vcDogdGhlIGVudGl0eSBtYXkgaGF2ZSBiZWVuIHRvcm4gZG93biBieSBhXG4gICAgICAvLyBjb25jdXJyZW50IHJ1biBjYW5jZWxsYXRpb24sIG9yIHRoZSBob29rIG1heSBoYXZlIGxvc3QgaXRzXG4gICAgICAvLyB0b2tlbiBjbGFpbSB0byBhIGNvbmZsaWN0LiBUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVsZWFzZS5cbiAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIC8vIEhvb2sgb3BlcmF0aW9ucyBhcmUgZ3JvdXBlZCBieSB0b2tlbiBhbmQgcHJvY2Vzc2VkIFNFUVVFTlRJQUxMWSBpblxuICAvLyBjb2RlIG9yZGVyIHdpdGhpbiBlYWNoIGdyb3VwLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gc3VzcGVuc2lvblxuICAvLyBoYW5kbGVyIChob29rSXRlbXNCeVRva2VuKTogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIG11c3RcbiAgLy8gcmVsZWFzZSB0aGUgdG9rZW4gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXNcbiAgLy8gdmFsaWRhdGVkIGJ5IHRoZSB3b3JsZCDigJQgcGFyYWxsZWwgZGlzcGF0Y2ggd291bGQgb3RoZXJ3aXNlIHJlY29yZCBhXG4gIC8vIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duIGRpc3Bvc2VkIGhvb2sgKGUuZy4gYVxuICAvLyBkaXNwb3Nl4oaScmVjcmVhdGUgbG9vcCByZXVzaW5nIG9uZSB0b2tlbikuIERpZmZlcmVudCB0b2tlbnMgaGF2ZSBub1xuICAvLyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXJcbiAgLy8gYW5kIHdpdGggdGhlIG5vbi1ob29rIG9wcyBiZWxvdy5cbiAgY29uc3QgaG9va09wc0J5VG9rZW4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICAoUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpW11cbiAgPigpO1xuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgKCFvcC5oYXNDcmVhdGVkRXZlbnQgfHwgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZClcbiAgICApIHtcbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9vaykudG9rZW47XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnaG9va19kaXNwb3NlJyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAvLyBQZXItb3AgZmFsbGJhY2sgZ3JvdXAgd2hlbiB0aGUgdG9rZW4gaXMgdW5rbm93biDigJQgbm8gb3JkZXJpbmdcbiAgICAgIC8vIGd1YXJhbnRlZXMsIG1hdGNoaW5nIHRoZSBwcmV2aW91cyBwYXJhbGxlbCBiZWhhdmlvci5cbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9va0Rpc3Bvc2UpLnRva2VuID8/IGBfX2NpZDoke29wLmNvcnJlbGF0aW9uSWR9YDtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBncm91cCA9IGhvb2tPcHNCeVRva2VuLmdldChrZXkpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tPcHNCeVRva2VuLnNldChrZXksIFtvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZV0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGhvb2tPcHNCeVRva2VuLnZhbHVlcygpKSB7XG4gICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb3Agb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va09wKG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tEaXNwb3NlT3Aob3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ3N0ZXAnICYmXG4gICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAhc2tpcFN0ZXBDcmVhdGlvbj8uaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzdGVwID0gb3AgYXMgUGVuZGluZ1N0ZXA7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIENyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnQuIGBzdGVwLmlucHV0YCBpcyB0aGVcbiAgICAgICAgICAvLyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAoXCJkZXZsXCIgKyBkZXZhbHVlKSBwcm9kdWNlZFxuICAgICAgICAgIC8vIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXSh7YXJncyxcbiAgICAgICAgICAvLyBjbG9zdXJlVmFycywgdGhpc1ZhbH0pYCBpbnNpZGUgdGhlIFZNLiBUaGUgVk0gaGFzIG5vXG4gICAgICAgICAgLy8gYWNjZXNzIHRvIHRoZSBDcnlwdG9LZXksIHNvIGVuY3J5cHRpb24gaXMgYXBwbGllZCBoZXJlXG4gICAgICAgICAgLy8gb24gdGhlIGhvc3Qgc2lkZSDigJQgbWF0Y2hpbmcgd2hhdFxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGluIHRoZSBub2RlOnZtIGVuZ2luZS5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoc3RlcC5pbnB1dCwgZW5jcnlwdGlvbktleSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbiDigJQgdGhlIGlubGluZVxuICAgICAgICAgIC8vIGxvb3AgZXhlY3V0ZXMgZnJlc2ggc3RlcHMgaW4gdGhlIGxpdmUgVk0gYW5kIG9ubHkgcXVldWVzIHRoZVxuICAgICAgICAgIC8vIG92ZXJmbG93IC8gcmV0cnkgLyBiYWNrc3RvcCBjYXNlcyAoc2VlIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vayB9O1xufVxuXG4vKipcbiAqIFJ1biBhIHdvcmtmbG93IHVzaW5nIHRoZSBRdWlja0pTIFdBU00gVk0gZW5naW5lLlxuICpcbiAqIFRoaXMgcmVwbGFjZXMgdGhlIGBub2RlOnZtYCByZXBsYXkgcGF0aCAocnVuV29ya2Zsb3cgKyBFdmVudHNDb25zdW1lcilcbiAqIHdpdGggYSBRdWlja0pTIFZNIGludm9jYXRpb24gdGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheS5cbiAqXG4gKiBLTk9XTiBHQVAg4oCUIHByZWNvbmRpdGlvbiBndWFyZDogdW5saWtlIHRoZSBub2RlOnZtIHBhdGgsIG5vIGV2ZW50IHdyaXRlXG4gKiBpbiB0aGlzIGZpbGUgcGFydGljaXBhdGVzIGluIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IHByZWNvbmRpdGlvblxuICogZ3VhcmQgKGB3aXRoUHJlY29uZGl0aW9uUmV0cnlgICsgYHN0YXRlVXBkYXRlZEF0Rm9yQ3JlYXRlYCksIHdoaWNoXG4gKiBwcm90ZWN0cyBhIHdyaXRlciBob2xkaW5nIGEgc3RhbGUgZXZlbnQtbG9nIHNuYXBzaG90IGZyb20gY2xvYmJlcmluZyBhXG4gKiBjb25jdXJyZW50IG9uZS4gVGhlIGVuZ2luZSBjdXJyZW50bHkgcmVsaWVzIG9uIHBlci0ocnVuSWQsXG4gKiBjb3JyZWxhdGlvbklkKSBldmVudCB1bmlxdWVuZXNzIChFbnRpdHlDb25mbGljdEVycm9yIGRlZHVwKSBhbG9uZS4gVGhpc1xuICogaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIHdoaWxlIHRoZSBlbmdpbmUgaXMgZXhwZXJpbWVudGFsIOKAlCB3aXJpbmdcbiAqIHRoZSBndWFyZCBpcyB0cmFja2VkIGZvbGxvdy11cCB3b3JrOyBhbnlvbmUgYWRkaW5nIG5ldyB3cml0ZSBwYXRocyBoZXJlXG4gKiBzaG91bGQgbm90IGFzc3VtZSBwYXJpdHkgd2l0aCB0aGUgbm9kZSBlbmdpbmUgb24gdGhpcyBheGlzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyhwYXJhbXM6IHtcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIC8qKlxuICAgKiBFdmVudHMgcmV0dXJuZWQgaW5saW5lIGJ5IGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcsIC4uLilgIG9yIGJ5XG4gICAqIHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQuIFdoZW4gdGhleSBpbmRpY2F0ZVxuICAgKiBhIGZpcnN0IGludm9jYXRpb24g4oCUIG9yIHdoZW4gYHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlYCBhdHRlc3RzIHRoZXlcbiAgICogYXJlIHRoZSBjb21wbGV0ZSBsb2cg4oCUIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGV2ZW50IGxvZyBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIHZpYSBgZXZlbnRzLmxpc3RgLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmYXN0IHBhdGguXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHM/OiBFdmVudFtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgaGFzIHZhbGlkYXRlZCB0aGF0IGBwcmVsb2FkZWRFdmVudHNgIGlzIHRoZSBydW4nc1xuICAgKiBDT01QTEVURSBldmVudCBsb2cgKGUuZy4gdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBoYXNNb3JlLWZhbHNlXG4gICAqIHJlcGxheSBwcmVsb2FkKS4gVGhlIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljIGJlbG93IG9ubHkgcmVjb2duaXplc1xuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC1vbmx5IHByZWxvYWRzLCBzbyB3aXRob3V0IHRoaXMgYXR0ZXN0YXRpb24gYVxuICAgKiBob29rLXJlc3VtZSBwcmVsb2FkIHdvdWxkIGJlIGRpc2NhcmRlZCBhbmQgcmVmZXRjaGVkLlxuICAgKi9cbiAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGlucHV0IGNhcnJpZWQgdGhyb3VnaCB0aGUgcXVldWUgbWVzc2FnZSBvbiBmaXJzdCBkZWxpdmVyeS4gVXNlZFxuICAgKiBhcyBhIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGZvciBgcnVuX2NyZWF0ZWQuZXZlbnREYXRhLmlucHV0YCB3aGVuXG4gICAqIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIHJ1bklucHV0PzogUnVuSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IE9UZWwgc3BhbiAodGhlIG91dGVyIGBXT1JLRkxPVyB7d29ya2Zsb3dOYW1lfWAgc3BhbiBmcm9tXG4gICAqIGBydW50aW1lLnRzYCkuIFdoZW4gc3VwcGxpZWQsIFZNIGxpZmVjeWNsZSBhdHRyaWJ1dGVzIGFyZSBhdHRhY2hlZFxuICAgKiB0byBpdCBmb3IgZW5kLXRvLWVuZCB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcGFyZW50U3Bhbj86IFNwYW47XG4gIC8qKlxuICAgKiBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlXG4gICAqICh1bmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50KS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBndWFyZDpcbiAgICogYSBydW5hd2F5IHJ1biBpcyBmYWlsZWQgb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlIGNlaWxpbmcuIFRoZSB0aHJvd1xuICAgKiBwcm9wYWdhdGVzIHRvIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMgKHRoZSBRdWlja0pTXG4gICAqIGRpc3BhdGNoIHJ1bnMgaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIGNsYXNzaWZpZXMgaXQgYW5kXG4gICAqIHJlY29yZHMgcnVuX2ZhaWxlZCB3aXRoIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAqL1xuICBtYXhFdmVudHNMaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHQgb2YgdGhlIG1lc3NhZ2UgZHJpdmluZyB0aGlzIGludm9jYXRpb24gKGZyb21cbiAgICogdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhZGF0YTsgMSA9IGZpcnN0IGRlbGl2ZXJ5KS4gU3VyZmFjZWQgaW5cbiAgICogZGlhZ25vc3RpY3M7IGNyYXNoIHJlY292ZXJ5IGl0c2VsZiBpcyBkcml2ZW4gYnkgdGhlIG93bmVyc2hpcC1sZWFzZVxuICAgKiBkZWNpc2lvbiB0YWJsZSBpbiB0aGUgbG9vcCwgbm90IGJ5IHRoZSBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZGVsaXZlcnlBdHRlbXB0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgZGVsaXZlcnkgZHJpdmluZyB0aGlzIGludm9jYXRpb24sIHN0YW1wZWQgYXNcbiAgICogYG93bmVyTWVzc2FnZUlkYCBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXMgZGVmZXIgdG9cbiAgICogdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2YgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIHJlc29sdmVkIGF0IHJvdXRlIHJlZ2lzdHJhdGlvbiAocnVudGltZS50cykuIE11c3QgYmVcbiAgICogdGhyZWFkZWQgaW50byBldmVyeSBtZXNzYWdlIHB1Ymxpc2g6IHRoZSBidWlsZGVycyBiYWtlIHRoZSBuYW1lc3BhY2VcbiAgICogaW50byBnZW5lcmF0ZWQgcm91dGVzLCBzbyBjb25zdW1lcnMgbGlzdGVuIG9uIGBfXzxucz5fd2tmX3dvcmtmbG93XypgXG4gICAqIOKAlCBhIHB1Ymxpc2ggd2l0aG91dCBpdCBsYW5kcyBvbiBgX193a2Zfd29ya2Zsb3dfKmAgYW5kIGlzIG5ldmVyXG4gICAqIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHNcbiAgICogKGdldE5leHRUcmFjZUNhcnJpZXIpLiBJbiB0aGUgZGVmYXVsdCBgbGlua2VkYCB0cmFjZSBtb2RlIGV2ZXJ5XG4gICAqIGludm9jYXRpb24gbXVzdCBsaW5rIGJhY2sgdG8gdGhlIHJ1bidzIG9yaWdpbiAod29ya2Zsb3cuc3RhcnQpIGluIGFcbiAgICogc3RhcjsgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dCBpbnN0ZWFkIHdvdWxkIGNoYWluXG4gICAqIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luYyBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn0pOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM/OiBudW1iZXIgfSB8IHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlLFxuICAgIHJ1bklucHV0LFxuICAgIHBhcmVudFNwYW4sXG4gICAgbWF4RXZlbnRzTGltaXQsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIG93bmVyTWVzc2FnZUlkLFxuICAgIG5hbWVzcGFjZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gU3RhbmRhbG9uZS1jYWxsZXIgZmFsbGJhY2sgKHRlc3RzKTogd2l0aG91dCBhIHJ1bnRpbWUudHMgY2FycmllclxuICAvLyBhY2Nlc3NvciwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dC5cbiAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9XG4gICAgcGFyYW1zLm5leHRUcmFjZUNhcnJpZXIgPz8gKCgpID0+IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpKTtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBydW5JZCA9IHdvcmtmbG93UnVuLnJ1bklkO1xuICBjb25zdCBpbnZvY2F0aW9uU3RhcnQgPSB0aWNrKCk7XG5cbiAgLy8gU3RyaXAgdGhlIGlubGluZSBzb3VyY2UgbWFwIGNvbW1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIGJ1bmRsZSBpblxuICAvLyB0aGUgUXVpY2tKUyBWTS4gVGhlIG1hcCBpcyBwdXJlbHkgaG9zdC1zaWRlIG1ldGFkYXRhIGZvclxuICAvLyBgcmVtYXBFcnJvclN0YWNrYCAoY2FsbGVkIGJlbG93IG9uIHdvcmtmbG93IGZhaWx1cmVzLCBhZ2FpbnN0IHRoZVxuICAvLyBPUklHSU5BTCBgd29ya2Zsb3dDb2RlYCkuIFF1aWNrSlMgcmV0YWlucyBzb3VyY2UgdGV4dCBmb3JcbiAgLy8gc3RhY2stdHJhY2UgbGluZSBsb29rdXBzLCBzbyB0aGUgZmV3LU1CIGJhc2U2NCBjb21tZW50IHdvdWxkIGJsb2F0XG4gIC8vIHRoZSBWTSBoZWFwIGZvciBubyBiZW5lZml0LlxuICBjb25zdCB3b3JrZmxvd0NvZGVGb3JWTSA9IHN0cmlwSW5saW5lU291cmNlTWFwKHdvcmtmbG93Q29kZSk7XG5cbiAgLy8gUGVyLWludm9jYXRpb24gZGlhZ25vc3RpYyBpZCBzbyBkZWJ1ZyBsb2dzIGNhbiBiZSBjb3JyZWxhdGVkIGV2ZW4gaWZcbiAgLy8gdGhlIHNhbWUgcnVuSWQgaXMgcHJvY2Vzc2VkIGJ5IG92ZXJsYXBwaW5nIGludm9jYXRpb25zIG9uIGRpZmZlcmVudFxuICAvLyBmdW5jdGlvbiBpbnN0YW5jZXMuXG4gIGNvbnN0IGludm9jYXRpb25JZCA9IGBpbnZfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcblxuICAvLyBTdHJ1Y3R1cmVkIHBlci1jaGVja3BvaW50IGRpYWdub3N0aWMgaGVscGVyLCBncmVwLWZyaWVuZGx5IGJ5IHJ1bklkLlxuICBjb25zdCB3ZmRpYWcgPSAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUVVJQ0tKU19WTV9ESUFHJywge1xuICAgICAgY2hlY2twb2ludCxcbiAgICAgIHJ1bklkLFxuICAgICAgaW52b2NhdGlvbklkLFxuICAgICAgdEVsYXBzZWRNczogTWF0aC5yb3VuZCh0aWNrKCkgLSBpbnZvY2F0aW9uU3RhcnQpLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9O1xuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1ZtKCdxdWlja2pzJyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZW50ZXInLCB7XG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBoYXNQcmVsb2FkZWRFdmVudHM6XG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiYgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDAsXG4gICAgcHJlbG9hZGVkRXZlbnRDb3VudDogcHJlbG9hZGVkRXZlbnRzPy5sZW5ndGggPz8gMCxcbiAgICBoYXNSdW5JbnB1dDogISFydW5JbnB1dCxcbiAgfSk7XG5cbiAgLy8gVGhlIHdvcmtmbG93TmFtZSBmcm9tIHRoZSBxdWV1ZSB0b3BpYyBpcyBhbHJlYWR5IHRoZSBmdWxsIHdvcmtmbG93IElEXG4gIC8vIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIilcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IHdvcmtmbG93TmFtZTtcblxuICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB1cCBmcm9udCDigJQgbmVlZGVkIHRvIGRlY3J5cHQgZXZlbnRcbiAgLy8gcGF5bG9hZHMgaW5zaWRlIHRoZSBWTSBhbmQgdG8gZW5jcnlwdCBldmVudCBwYXlsb2FkcyB3cml0dGVuIGJlbG93LlxuICAvLyBSZXNvbHZlIHRoZSBGVUxMIGNhcGFiaWxpdHkgKHN5bW1ldHJpYyBBRVMga2V5ICsgWDI1NTE5IGtleXBhaXIpLCBub3RcbiAgLy8ganVzdCBgaW1wb3J0S2V5KHJhd0tleSlgOiBhIHJ1biByZWFkaW5nIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXJcbiAgLy8gc2VhbGVkIChgZW5jcGApIGhvb2sgcGF5bG9hZHMgdGhhdCBhIGNyb3NzLWRlcGxveW1lbnQgYHJlc3VtZUhvb2soKWBcbiAgLy8gd3JvdGUgdG8gaXQgKHNlYWxpbmcgaXMgcHJlc2VuY2UtZ2F0ZWQgb24gdGhlIHJ1bidzIHB1Ymxpc2hlZFxuICAvLyBlbmNyeXB0aW9uUHVibGljS2V5LCB3aGljaCB0aGUgc2hhcmVkIHN0YXJ0KCkgcGF0aCBzdGFtcHMgcmVnYXJkbGVzcyBvZlxuICAvLyBlbmdpbmUpLiBBIGJhcmUgc3ltbWV0cmljIGtleSBjYW5ub3Qgb3BlbiB0aG9zZSBhbmQgd291bGQgd2VkZ2UgdGhlIHJ1blxuICAvLyByaWdodCBhZnRlciBob29rX3JlY2VpdmVkIOKAlCB0aGUgbm9kZTp2bSBlbmdpbmUgcmVzb2x2ZXMgdGhlIHNhbWUgZnVsbFxuICAvLyBjYXBhYmlsaXR5IHZpYSBtZW1vaXplRW5jcnlwdGlvbktleS5cbiAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gTG9hZCB0aGUgRlVMTCBldmVudCBsb2cgZm9yIHRoZSBydW4uIE9uIGZpcnN0IGludm9jYXRpb24gdGhlXG4gIC8vIHByZWxvYWRlZCBldmVudHMgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2UgYXJlIHRoZSBjb21wbGV0ZSBsb2dcbiAgLy8gYW5kIHNhdmUgdGhlIGV2ZW50cy5saXN0IHJvdW5kLXRyaXBzOyBhIGNhbGxlci1hdHRlc3RlZCBjb21wbGV0ZVxuICAvLyBwcmVsb2FkIChsYXp5IGhvb2sgZmFzdCBwYXRoKSBpcyB0cnVzdGVkIHRoZSBzYW1lIHdheS5cbiAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgbGV0IGV2ZW50c0ZldGNoZWRQYWdlcyA9IDA7XG4gIGNvbnN0IHVzZVByZWxvYWRlZCA9XG4gICAgKHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID09PSB0cnVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiZcbiAgICAgIHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPiAwKSB8fFxuICAgIGlzRmlyc3RJbnZvY2F0aW9uKHByZWxvYWRlZEV2ZW50cyk7XG4gIGlmICh1c2VQcmVsb2FkZWQgJiYgcHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcblxuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXZlbnRzRmV0Y2hlZFBhZ2VzKys7XG4gICAgICBhbGxFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBmZXRjaGVkIHBhZ2UncyBjdXJzb3IuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIHdlIGdvdCByZXN1bHRzIOKAlCB0aGUgZmluYWwgZW1wdHktcGFnZSByZXNwb25zZVxuICAgICAgLy8gcmV0dXJucyBjdXJzb3I9bnVsbCB3aGljaCB3ZSBtdXN0IE5PVCB1c2UgKGl0IHdvdWxkIHJlc2V0IHRoZSBjdXJzb3IpLlxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikge1xuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICB9XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cblxuICAgIGV2ZW50cyA9IGFsbEV2ZW50cztcbiAgfVxuXG4gIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlXG4gIC8vIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nIOKAlCBzYW1lIGVuZm9yY2VtZW50IHBvaW50IGFzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHJlcGxheSBsb29wLlxuICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoZXZlbnRzLmxlbmd0aCwgbWF4RXZlbnRzTGltaXQpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNFdmVudHNQcmVsb2FkZWQodXNlUHJlbG9hZGVkKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRDb3VudChldmVudHMubGVuZ3RoKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRQYWdlcyhldmVudHNGZXRjaGVkUGFnZXMpLFxuICB9KTtcblxuICB3ZmRpYWcoJ2V2ZW50c19mZXRjaGVkJywge1xuICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgZXZlbnRzRmV0Y2hlZFBhZ2VzLFxuICAgIHVzZVByZWxvYWRlZCxcbiAgICBldmVudFR5cGVzOiBldmVudHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KChhY2MsIGUpID0+IHtcbiAgICAgIGFjY1tlLmV2ZW50VHlwZV0gPSAoYWNjW2UuZXZlbnRUeXBlXSA/PyAwKSArIDE7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KSxcbiAgfSk7XG5cbiAgLy8gQ2hlY2sgZm9yIGVsYXBzZWQgd2FpdHNcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgZXZlbnRzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50XG4gICAgICAgICAgPyAoZXZlbnQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzdW1lQXQgPSBldmVudERhdGE/LnJlc3VtZUF0O1xuICAgICAgaWYgKHJlc3VtZUF0ICYmIG5vdyA+PSBuZXcgRGF0ZShyZXN1bWVBdCBhcyBzdHJpbmcpLmdldFRpbWUoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5ldmVudCkgZXZlbnRzLnB1c2gocmVzdWx0LmV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgY29udGludWU7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSB0aGUgd29ya2Zsb3cgc2VydmVyIHBvcnQgc28gYGdldFdvcmtmbG93TWV0YWRhdGEoKS51cmxgIGluc2lkZVxuICAvLyB0aGUgVk0gbWF0Y2hlcyB3aGF0IHRoZSBzdGVwLXNpZGUgaGFuZGxlciByZXBvcnRzLiBTa2lwcGVkIG9uIFZlcmNlbCDigJRcbiAgLy8gdGhlIFZNIHJlYWRzIFZFUkNFTF9VUkwgZGlyZWN0bHkgaW4gdGhhdCBlbnZpcm9ubWVudC5cbiAgY29uc3QgaXNWZXJjZWwgPSBwcm9jZXNzLmVudi5WRVJDRUxfVVJMICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcnQgPSBpc1ZlcmNlbCA/IHVuZGVmaW5lZCA6IGF3YWl0IGdldFBvcnRMYXp5KCk7XG5cbiAgLy8gUnVuIHRoZSB3b3JrZmxvdyBpbiB0aGUgUXVpY2tKUyBWTVxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IGludm9raW5nIFZNJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIHdvcmtmbG93SWQsXG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgfSk7XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0UXVpY2tKU1dvcmtmbG93KHtcbiAgICAvLyBQYXNzIHRoZSBTVFJJUFBFRCBidW5kbGUgdG8gdGhlIFZNIHNvIHRoZSBpbmxpbmUgc291cmNlIG1hcFxuICAgIC8vIGRvZXNuJ3QgZW5kIHVwIGluIHRoZSBRdWlja0pTIGhlYXAuIFRoZSBvcmlnaW5hbCAodW5zdHJpcHBlZClcbiAgICAvLyBgd29ya2Zsb3dDb2RlYCBpcyBzdGlsbCBrZXB0IGluIHRoaXMgaG9zdC1zaWRlIHNjb3BlIGFuZCBpcyB1c2VkXG4gICAgLy8gYnkgYHJlbWFwRXJyb3JTdGFja2Agb24gd29ya2Zsb3cgZmFpbHVyZXMgYmVsb3cuXG4gICAgd29ya2Zsb3dDb2RlOiB3b3JrZmxvd0NvZGVGb3JWTSxcbiAgICB3b3JrZmxvd0lkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICB3b3JsZENhcGFiaWxpdGllczogd29ybGQuY2FwYWJpbGl0aWVzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcG9ydCxcbiAgICBydW5JbnB1dCxcbiAgfSk7XG4gIGxldCByZXN1bHQgPSBzZXNzaW9uLnJlc3VsdDtcblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IFZNIHJldHVybmVkJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGNvbXBsZXRlZDogISFyZXN1bHQuY29tcGxldGVkLFxuICAgIHN1c3BlbmRlZDogISFyZXN1bHQuc3VzcGVuZGVkLFxuICAgIGZhaWxlZDogISFyZXN1bHQuZmFpbGVkLFxuICAgIHBlbmRpbmdPcHNDb3VudDogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lmxlbmd0aCxcbiAgfSk7XG5cbiAgd2ZkaWFnKCd2bV9yZXR1cm5lZCcsIHtcbiAgICBvdXRjb21lOiByZXN1bHQuY29tcGxldGVkXG4gICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICA6IHJlc3VsdC5zdXNwZW5kZWRcbiAgICAgICAgPyAnc3VzcGVuZGVkJ1xuICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgOiAndW5rbm93bicsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoID8/IDAsXG4gICAgcGVuZGluZ09wU3VtbWFyeTogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lm1hcCgocCkgPT4gKHtcbiAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAuLi4ocC50eXBlID09PSAnc3RlcCcgPyB7IHN0ZXBJZDogKHAgYXMgUGVuZGluZ1N0ZXApLnN0ZXBJZCB9IDoge30pLFxuICAgIH0pKSxcbiAgICBmYWlsdXJlTWVzc2FnZTogcmVzdWx0LmZhaWxlZD8ubWVzc2FnZSxcbiAgICBmYWlsdXJlTmFtZTogcmVzdWx0LmZhaWxlZD8ubmFtZSxcbiAgfSk7XG5cbiAgLy8gLS0tLSBJbmxpbmUgY29udGludWF0aW9uIGxvb3AgLS0tLVxuICAvL1xuICAvLyBXaGlsZSB0aGUgd29ya2Zsb3cgaXMgc3VzcGVuZGVkLCB0aGlzIGxvb3Aga2VlcHMgdGhlIFZNIGFsaXZlIGFuZFxuICAvLyBtYWtlcyBhcyBtdWNoIGZvcndhcmQgcHJvZ3Jlc3MgYXMgcG9zc2libGUgd2l0aGluIG9uZSBpbnZvY2F0aW9uOlxuICAvL1xuICAvLyAgIDEuIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzXG4gIC8vICAgICAgKHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIGF0dHJfc2V0IC8gd2FpdF9jcmVhdGVkIC9cbiAgLy8gICAgICBob29rX3JlY2VpdmVkIGZvciBhYm9ydHMpIGFuZCBjb21wbGV0ZSBlbGFwc2VkIHdhaXRzLlxuICAvLyAgIDIuIEZlZWQgYWxsIG5ld2x5IHJlY29yZGVkIGV2ZW50cyAoYXR0cl9zZXQsIGhvb2tfY3JlYXRlZCwgZWxhcHNlZFxuICAvLyAgICAgIHdhaXRfY29tcGxldGVkLCB0ZXJtaW5hbHMgd3JpdHRlbiBieSBjb25jdXJyZW50IGludm9jYXRpb25zLCAuLi4pXG4gIC8vICAgICAgaW50byB0aGUgTElWRSBWTSB2aWEgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMg4oCUIHJlc3VtaW5nXG4gIC8vICAgICAgZXhlY3V0aW9uIGV4YWN0bHkgd2hlcmUgaXQgbGVmdCBvZmYsIG5vIGZyZXNoLVZNIHJlLXJlcGxheS5cbiAgLy8gICAgICBDaGVhcCBwcm9ncmVzcyBpcyBmZWQgQkVGT1JFIHJ1bm5pbmcgc3RlcCBib2RpZXMgc28gcHJvbWlzZVxuICAvLyAgICAgIGNoYWlucyB0aGF0IGFyZSBub3QgZ2F0ZWQgb24gc3RlcHMgKGhvb2suZ2V0Q29uZmxpY3QoKSxcbiAgLy8gICAgICBzZXRBdHRyaWJ1dGVzKCksIHJhY2luZyBzbGVlcHMpIGFkdmFuY2UgZmlyc3QgYW5kIGNhbiBzdXJmYWNlXG4gIC8vICAgICAgYWRkaXRpb25hbCBwZW5kaW5nIHN0ZXBzIGZvciB0aGUgc2FtZSBpbmxpbmUgYmF0Y2guXG4gIC8vICAgMy4gT25jZSBubyBjaGVhcCBwcm9ncmVzcyByZW1haW5zLCBleGVjdXRlIHVwIHRvXG4gIC8vICAgICAgZ2V0TWF4SW5saW5lU3RlcHMoKSBzdGVwcyBjcmVhdGVkIGJ5IFRISVMgaW52b2NhdGlvbiBpbmxpbmUgKG5vXG4gIC8vICAgICAgcXVldWUgcm91bmQtdHJpcCksIGluIHBhcmFsbGVsLCB3aXRoIHRoZSByZXBsYXkgYnVkZ2V0IHBhdXNlZFxuICAvLyAgICAgIGR1cmluZyBzdGVwIGJvZGllcyDigJQgbWlycm9yaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGlubGluZVxuICAvLyAgICAgIHJlcGxheSBsb29wLiBPdmVyZmxvdyBhbmQgcmV0cnkvdGhyb3R0bGVkIHN0ZXBzIGFyZSBxdWV1ZWQgZm9yXG4gIC8vICAgICAgYmFja2dyb3VuZCBleGVjdXRpb24uIEEgZGVsYXllZCB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlIGlzXG4gIC8vICAgICAgZW5xdWV1ZWQgZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCBmaXJzdCwgc28gcmFjaW5nIHRpbWVyc1xuICAvLyAgICAgIGZpcmUgb24gdGltZSAoaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uKSB3aGlsZSBzdGVwIGJvZGllcyBibG9ja1xuICAvLyAgICAgIHRoaXMgb25lLlxuICAvL1xuICAvLyBUaGUgbG9vcCBleGl0cyB3aGVuIHRoZSB3b3JrZmxvdyBzZXR0bGVzLCBubyBmb3J3YXJkIHByb2dyZXNzIGlzXG4gIC8vIHBvc3NpYmxlIGluLXByb2Nlc3MsIHRoZSByZXBsYXkgYnVkZ2V0IGlzIGV4aGF1c3RlZCwgb3IgdGhlIHJ1biBpc1xuICAvLyBnb25lLlxuICBjb25zdCBzZWVuRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgfVxuICAvLyBTdGVwIGNpZHMgYWxyZWFkeSBleGVjdXRlZCBpbmxpbmUgYnkgdGhpcyBpbnZvY2F0aW9uLlxuICBjb25zdCBleGVjdXRlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gU3RlcHMgZm9yIHdoaWNoIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHNlbnQgYSBxdWV1ZSBtZXNzYWdlLlxuICBjb25zdCBxdWV1ZWRTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIEFib3J0cyBUSElTIGludm9jYXRpb24gYWxyZWFkeSByZWNvcmRlZCAoaG9va19yZWNlaXZlZCB3cml0dGVuKSDigJRcbiAgLy8gZ3VhcmRzIGFnYWluc3QgcmUtcmVjb3JkaW5nIHdoZW4gdGhlIFZNLXNpZGUgZmxhZyBoYXMgbm90IGJlZW5cbiAgLy8gY2xlYXJlZCB5ZXQgd2l0aGluIHRoZSBzYW1lIGl0ZXJhdGlvbi5cbiAgY29uc3QgcmVjb3JkZWRBYm9ydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBXYWl0cyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgY29tcGxldGVkL3NjaGVkdWxlZCB3b3JrLlxuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzMiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YXRlIHBlciBzdGVwIGNvcnJlbGF0aW9uSWQsIGRlcml2ZWQgZnJvbSBldmVyeVxuICAvLyBldmVudCB0aGlzIGludm9jYXRpb24gb2JzZXJ2ZXMgKGluaXRpYWwgbG9nICsgZXZlcnkgZmVlZCkg4oCUIHRoZVxuICAvLyBxdWlja2pzIGFuYWxvZyBvZiB0aGUgcmVwbGF5LWRlcml2ZWQgb3duZXJzaGlwIG9uIHRoZSBub2RlIGVuZ2luZSdzXG4gIC8vIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIChzZWUgc3RlcC1vd25lcnNoaXAudHMpLiBMYXRlc3Qtd2luczpcbiAgLy8gZXZlbnRzIGFycml2ZSBpbiBsb2cgb3JkZXIsIHNvIGEgbGF0ZXIgc3RlcF9zdGFydGVkIG92ZXJ3cml0ZXMgdGhlXG4gIC8vIHN0YW1wOyBhIHN0ZXBfcmV0cnlpbmcgbGFwc2VzIG93bmVyc2hpcCBwZXJtYW5lbnRseSBmb3IgdGhlIGlkLlxuICBjb25zdCBzdGVwT3duZXJzaGlwID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBvd25lcj86IHN0cmluZzsgc3RhcnRlZEF0TXM/OiBudW1iZXI7IHNhd1JldHJ5aW5nOiBib29sZWFuIH1cbiAgPigpO1xuICBjb25zdCBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwID0gKG9ic2VydmVkOiBFdmVudFtdKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBlIG9mIG9ic2VydmVkKSB7XG4gICAgICBpZiAoZS5jb3JyZWxhdGlvbklkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICBjb25zdCBvd25lciA9XG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZSAmJlxuICAgICAgICAgIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgJ293bmVyTWVzc2FnZUlkJyBpbiBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAgIHR5cGVvZiBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHN0YXJ0ZWRBdE1zOiBlLmNyZWF0ZWRBdCA/ICtuZXcgRGF0ZShlLmNyZWF0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHByaW9yPy5zYXdSZXRyeWluZyA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgY29uc3QgcHJpb3IgPSBzdGVwT3duZXJzaGlwLmdldChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBzdGVwT3duZXJzaGlwLnNldChlLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICAuLi4ocHJpb3IgPz8ge30pLFxuICAgICAgICAgIHNhd1JldHJ5aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAoZXZlbnRzKTtcbiAgY29uc3Qgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWF4SW5saW5lU3RlcHMgPSBnZXRNYXhJbmxpbmVTdGVwcygpO1xuICBjb25zdCBidWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG4gIGNvbnN0IHdvcmtmbG93U3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgPyArd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgOiBEYXRlLm5vdygpO1xuICBjb25zdCByb290UnVuSWQgPVxuICAgICh3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bXG4gICAgICBST09UX1JVTl9JRF9BVFRSSUJVVEVcbiAgICBdID8/IHJ1bklkO1xuICBsZXQgaW5saW5lU3RlcHNFeGVjdXRlZCA9IDA7XG4gIGxldCBydW5Hb25lID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIHRoaXMgaW52b2NhdGlvbiB3cm90ZSBhbiBldmVudCB0aGUgd29ya2Zsb3cgbXVzdCBjb25zdW1lIHRvXG4gIC8vIG1ha2UgcHJvZ3Jlc3MgKGF0dHJfc2V0LCBnZXRDb25mbGljdC1hd2FpdGVkIGhvb2tfY3JlYXRlZCkgYW5kIHRoZVxuICAvLyBsb29wIGhhcyBub3QgeWV0IHJlYWQgaXQgYmFjayDigJQgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmdzIGNhblxuICAvLyByZXR1cm4gMCBuZXcgZXZlbnRzIHJpZ2h0IGFmdGVyIGEgd3JpdGUuIElmIGl0IGlzIHN0aWxsIHNldCB3aGVuIHRoZVxuICAvLyBsb29wIGV4aXRzIHN1c3BlbmRlZCwgdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZlxuICAvLyBleGl0aW5nIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggdGhlIHVuYmxvY2tpbmcgZXZlbnQgYWxyZWFkeSB3cml0dGVuXG4gIC8vIGFuZCBub3RoaW5nIHNjaGVkdWxlZCB0byByZWFkIGl0LlxuICBsZXQgcGVuZGluZ1JlcXVldWVTaWduYWwgPSBmYWxzZTtcblxuICAvKiogRmV0Y2ggYWxsIGV2ZW50cyBub3QgeWV0IHByb2Nlc3NlZCBieSB0aGUgbGl2ZSBWTSAobG9nIG9yZGVyKS4gKi9cbiAgY29uc3QgZmV0Y2hVbnNlZW5FdmVudHMgPSBhc3luYyAoKTogUHJvbWlzZTxFdmVudFtdPiA9PiB7XG4gICAgY29uc3QgdW5zZWVuOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgaWYgKGUuZXZlbnRJZCAmJiBzZWVuRXZlbnRJZHMuaGFzKGUuZXZlbnRJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoZS5ldmVudElkKSBzZWVuRXZlbnRJZHMuYWRkKGUuZXZlbnRJZCk7XG4gICAgICAgIHVuc2Vlbi5wdXNoKGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikgY3Vyc29yID0gcmVzcG9uc2UuY3Vyc29yO1xuICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmRhdGEubGVuZ3RoID4gMCAmJiByZXNwb25zZS5jdXJzb3IgIT0gbnVsbDtcbiAgICB9XG4gICAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcCh1bnNlZW4pO1xuICAgIHJldHVybiB1bnNlZW47XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICB3aGlsZSAocmVzdWx0LnN1c3BlbmRlZCAmJiAhcnVuR29uZSAmJiAhYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIGl0ZXJhdGlvbisrO1xuICAgICAgLy8gUmUtY2hlY2sgdGhlIGV2ZW50IGNlaWxpbmcgZXZlcnkgdHVybjogdGhlIGxvb3AgYXBwZW5kcyBldmVudHMgb25cbiAgICAgIC8vIGVhY2ggY29udGludWVXaXRoRXZlbnRzLCBzbyBhIHNpbmdsZSBpbnZvY2F0aW9uIGNhbiBvdGhlcndpc2UgZ3Jvd1xuICAgICAgLy8gdGhlIGxvZyBhcmJpdHJhcmlseSBmYXIgcGFzdCB0aGUgb3BlcmF0b3IncyBsaW1pdCAodGhlIG5vZGUgZW5naW5lXG4gICAgICAvLyByZS1jaGVja3MgcGVyIHJlcGxheSBmb3IgdGhlIHNhbWUgcmVhc29uKS4gYHNlZW5FdmVudElkc2AgY291bnRzXG4gICAgICAvLyBldmVyeSBldmVudCB0aGlzIGludm9jYXRpb24gaGFzIG9ic2VydmVkIOKAlCBpbml0aWFsIGxvZyArIGFsbFxuICAgICAgLy8gZmVlZHMuXG4gICAgICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBzZWVuRXZlbnRJZHMuc2l6ZSA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihzZWVuRXZlbnRJZHMuc2l6ZSwgbWF4RXZlbnRzTGltaXQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGVuZGluZ09wZXJhdGlvbnMgPSByZXN1bHQuc3VzcGVuZGVkLnBlbmRpbmdPcGVyYXRpb25zO1xuXG4gICAgICAvLyBTZWxlY3QgdGhpcyB0dXJuJ3MgaW5saW5lIGNhbmRpZGF0ZXMgQkVGT1JFIGRpc3BhdGNoOiBmcmVzaCBzdGVwc1xuICAgICAgLy8gKG5vIHN0ZXBfY3JlYXRlZCB5ZXQpIHRoYXQgdGhpcyBpbnZvY2F0aW9uIGhhc24ndCBhbHJlYWR5IGhhbmRsZWQuXG4gICAgICAvLyBUaGVpciBzdGVwX2NyZWF0ZWQgaXMgZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGJ5IGRpc3BhdGNoIOKAlCB0aGVcbiAgICAgIC8vIGlubGluZSBjbGFpbSBiZWxvdyBpcyBhIGxhenkgc3RlcF9zdGFydGVkIGNhcnJ5aW5nIHRoZSBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIHRoZSB3b3JsZCBhcHBsaWVzIGFzIGFuIGF0b21pYyBjcmVhdGUtY2xhaW0uIEEgY29uY3VycmVudFxuICAgICAgLy8gaW52b2NhdGlvbiByYWNpbmcgb24gdGhlIHNhbWUgZnJlc2ggc3RlcCBsb3NlcyB0aGF0IGNsYWltIHdpdGhcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IgYW5kIHNraXBzLCBzbyBzdGVwIGJvZGllcyBjYW5ub3QgZG91YmxlLXJ1blxuICAgICAgLy8gKHByZXZpb3VzbHkgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0ZWQgdGhlIHN0ZXAgYWZ0ZXIgb25lIGxvc3RcbiAgICAgIC8vIHRoZSBzd2FsbG93ZWQgc3RlcF9jcmVhdGVkIHJhY2UpLlxuICAgICAgY29uc3QgZnJlc2hTdGVwcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT5cbiAgICAgICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAgICAgIWV4ZWN1dGVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAhcXVldWVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgICBjb25zdCBpbmxpbmVDYW5kaWRhdGVzID1cbiAgICAgICAgbWF4SW5saW5lU3RlcHMgPD0gMCA/IFtdIDogZnJlc2hTdGVwcy5zbGljZSgwLCBtYXhJbmxpbmVTdGVwcyk7XG4gICAgICBjb25zdCBpbmxpbmVDbGFpbUNpZHMgPSBuZXcgU2V0KFxuICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT4gc3RlcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcblxuICAgICAgLy8gMS4gRHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzLlxuICAgICAgY29uc3Qgb3BzVG9EaXNwYXRjaCA9IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgob3ApID0+XG4gICAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgICAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkICYmXG4gICAgICAgIHJlY29yZGVkQWJvcnRJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgPyAoeyAuLi5vcCwgYWJvcnRSZXF1ZXN0ZWQ6IGZhbHNlIH0gYXMgUGVuZGluZ09wZXJhdGlvbilcbiAgICAgICAgICA6IG9wXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snICYmIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICByZWNvcmRlZEFib3J0SWRzLmFkZChvcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZGlzcGF0Y2hlZCA9IGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgIHdvcmxkLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IG9wc1RvRGlzcGF0Y2gsXG4gICAgICAgIHNraXBTdGVwQ3JlYXRpb246IGlubGluZUNsYWltQ2lkcyxcbiAgICAgICAgd2ZkaWFnLFxuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEF0dHJpYnV0ZUV2ZW50IHx8XG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEdldENvbmZsaWN0SG9va1xuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZCBzdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgdG8gdGhlIHF1ZXVlIE5PVyDigJQgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIHdhcyB3cml0dGVuIGJ5IHRoZSBkaXNwYXRjaCBhYm92ZS4gVGhpc1xuICAgICAgLy8gbXVzdCBoYXBwZW4gQkVGT1JFIHRoZSBldmVudCBmZWVkIGJlbG93OiB0aGUgZmVlZCBhbHdheXMgb2JzZXJ2ZXNcbiAgICAgIC8vIHRob3NlIHZlcnkgc3RlcF9jcmVhdGVkIHdyaXRlcyBhcyB1bnNlZW4gZXZlbnRzIGFuZCBgY29udGludWVgcyxcbiAgICAgIC8vIHNvIGEgaGFuZG9mZiBwbGFjZWQgYWZ0ZXIgaXQgaXMgdW5yZWFjaGFibGUgb24gdGhlIG9ubHkgaXRlcmF0aW9uXG4gICAgICAvLyB0aGF0IHN0aWxsIGNsYXNzaWZpZXMgdGhlc2Ugc3RlcHMgYXMgZnJlc2gg4oCUIG5leHQgdHVybiB0aGV5IGNhcnJ5XG4gICAgICAvLyBoYXNDcmVhdGVkRXZlbnQgYW5kIHdvdWxkIG5ldmVyIGJlIHF1ZXVlZCBhdCBhbGwgKHRoZSB3ZWRnZSBiZWhpbmRcbiAgICAgIC8vIHByb21pc2VSYWNlU3RyZXNzVGVzdFdvcmtmbG93IGhhbmdpbmcgaW4gdGhlIHF1aWNranMgQ0kgbGVncykuIFRoZVxuICAgICAgLy8gYmFyZS1jb3JyZWxhdGlvbklkIGlkZW1wb3RlbmN5IGtleSBtYWtlcyByZXBlYXRzIGhhcm1sZXNzLlxuICAgICAgY29uc3Qgb3ZlcmZsb3dTdGVwcyA9IGZyZXNoU3RlcHMuc2xpY2UoaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIG92ZXJmbG93U3RlcHMpIHtcbiAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBiYXJlLWNvcnJlbGF0aW9uSWQgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgIC8vICAgICBvcmlnaW5hbCBoYW5kb2ZmLlxuICAgICAgY29uc3Qgbm93TXMgPSBEYXRlLm5vdygpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBPcHMpIHtcbiAgICAgICAgaWYgKCFzdGVwLmhhc0NyZWF0ZWRFdmVudCkgY29udGludWU7XG4gICAgICAgIGlmIChleGVjdXRlZFN0ZXBJZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVldWVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcCA9IHN0ZXBPd25lcnNoaXAuZ2V0KHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgb3duZXJzaGlwICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICFvd25lcnNoaXAuc2F3UmV0cnlpbmc7XG4gICAgICAgIGxldCBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSAwO1xuICAgICAgICBpZiAob3duZXJzaGlwQWN0aXZlICYmIG93bmVyc2hpcC5zdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID0gTWF0aC5taW4oXG4gICAgICAgICAgICBsZWFzZVNlY29uZHMsXG4gICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgIChvd25lcnNoaXAuc3RhcnRlZEF0TXMgKyBsZWFzZVNlY29uZHMgKiAxMDAwIC0gbm93TXMpIC8gMTAwMFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgb3duZXJzaGlwLm93bmVyICE9PSBvd25lck1lc3NhZ2VJZCAmJlxuICAgICAgICAgIGxlYXNlUmVtYWluaW5nU2Vjb25kcyA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBhd2FpdCBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBkZWxheVNlY29uZHM6IGxlYXNlUmVtYWluaW5nU2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiBgYmFja3N0b3A6JHtvd25lcnNoaXAuc3RhcnRlZEF0TXN9YCxcbiAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBObyBpbi1wcm9jZXNzIHByb2dyZXNzIHBvc3NpYmxlIOKAlCB0aGUgcnVuIGF3YWl0cyBhbiBleHRlcm5hbFxuICAgICAgICAvLyBzdGltdWx1cyAoaG9vayBwYXlsb2FkLCBxdWV1ZWQgc3RlcCwgd2FpdCB0aW1lcikuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBSYWNpbmcgdGltZXJzIG11c3QgZmlyZSBvbiB0aW1lIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrIHRoaXNcbiAgICAgIC8vIGludm9jYXRpb246IGVucXVldWUgYSBkZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3RcbiAgICAgIC8vIHBlbmRpbmcgd2FpdCAoYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIHdyaXRlcyBpdHMgd2FpdF9jb21wbGV0ZWQgYXRcbiAgICAgIC8vIHRoZSByaWdodCBsb2cgcG9zaXRpb24g4oCUIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyB3YWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaCkuXG4gICAgICBsZXQgc29vbmVzdFdhaXQ6IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBzZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgLy8gV2FpdHMgd2hvc2Ugd2FpdF9jb21wbGV0ZWQgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgd3JvdGUgKHRoZVxuICAgICAgICAvLyBlbGFwc2VkLXdhaXQgcGFzcyBhYm92ZSkgYXJlIGRvbmUg4oCUIHRoZSBldmVudCBqdXN0IGhhc24ndCBmZWRcbiAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBWTSB5ZXQuIE5vIGNvbnRpbnVhdGlvbiBuZWVkZWQuXG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1lbGFwc2VkIHdhaXQgTVVTVCBzdGlsbCBnZXQgYSBjb250aW51YXRpb24gKGNsYW1wZWRcbiAgICAgICAgLy8gdG8gdGhlIDFzIG1pbmltdW0sIGV4YWN0bHkgbGlrZSB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgICAvLyBgTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdylgKSwgbm90IGJlIHNraXBwZWQ6IGEgd2FpdFxuICAgICAgICAvLyB3aG9zZSBkZWFkbGluZSBmYWxscyBiZXR3ZWVuIHRoaXMgaXRlcmF0aW9uJ3MgZWxhcHNlZC13YWl0XG4gICAgICAgIC8vIHBhc3MgKHdoaWNoIHNhdyBpdCBhcyBzdGlsbCBwZW5kaW5nIGFuZCB3cm90ZSBub3RoaW5nKSBhbmRcbiAgICAgICAgLy8gdGhpcyBzd2VlcCB3b3VsZCBvdGhlcndpc2UgZ2V0IE5FSVRIRVIgYSB3YWl0X2NvbXBsZXRlZCBOT1IgYVxuICAgICAgICAvLyBjb250aW51YXRpb24g4oCUIGFuZCB0aGUgaW5saW5lIGJhdGNoIGJlbG93IHRoZW4gYmxvY2tzIHRoaXNcbiAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiB3aXRoIG5vIHdha2UgYXJtZWRcbiAgICAgICAgLy8gYW55d2hlcmUuIEZvciBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgdGhhdCBzaWxlbnRseSBoYW5kc1xuICAgICAgICAvLyB0aGUgcmFjZSB0byB0aGUgc3RlcDogdGhlIHNsZWVwJ3Mgd2FpdF9jb21wbGV0ZWQgaXMgbmV2ZXJcbiAgICAgICAgLy8gd3JpdHRlbiBhbmQgdGhlIHJ1biBjb21wbGV0ZXMgd2l0aCB0aGUgd3Jvbmcgd2lubmVyLiBUaGVcbiAgICAgICAgLy8gd2luZG93IGJldHdlZW4gdGhlIHR3byBjaGVja3Mgc3BhbnMgdGhpcyBpdGVyYXRpb24ncyBkaXNwYXRjaFxuICAgICAgICAvLyArIGZlZWQgcm91bmQtdHJpcHMsIHNvIG9uIG5ldHdvcmstYmFja2VkIHdvcmxkcyAod29ybGQtdmVyY2VsKVxuICAgICAgICAvLyBhIHNob3J0IHNsZWVwIGxhbmRzIGluIGl0IHJvdXRpbmVseSDigJQgb2JzZXJ2ZWQgYXMgYSB+NTAlXG4gICAgICAgIC8vIHNsZWVwV2luc1JhY2VXb3JrZmxvdyBmYWlsdXJlIHJhdGUgaW4gdGhlIFZlcmNlbCBlMmUgbGVncyxcbiAgICAgICAgLy8gd2hpbGUgd29ybGQtbG9jYWwncyBzdWItbXMgcm91bmQtdHJpcHMgbWFza2VkIGl0IGxvY2FsbHkuIFRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gaW52b2NhdGlvbidzIHByZS1WTSBlbGFwc2VkIGNoZWNrIHdyaXRlcyB0aGVcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQgfjFzIGxhdGVyLlxuICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7IGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCwgc2Vjb25kcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ3dhaXRfY29udGludWF0aW9uX3NjaGVkdWxlZCcsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGRlbGF5U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBiYXRjaCBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheSBidWRnZXQgaXNcbiAgICAgIC8vIHBhdXNlZCB3aGlsZSBzdGVwIGJvZGllcyBydW4g4oCUIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGVcbiAgICAgIC8vIHBsYXRmb3JtIGZ1bmN0aW9uIGR1cmF0aW9uLCBub3QgdGhlIHJlcGxheSB0aW1lb3V0LiBOT1RFIChieVxuICAgICAgLy8gZGVzaWduKTogd2l0aCB0aGUgYnVkZ2V0IHBhcmtlZCBwZXIgYmF0Y2gsIHRoZSBvbmx5IGJvdW5kIG9uIGhvd1xuICAgICAgLy8gbWFueSBpbmxpbmUgc3RlcHMgb25lIGludm9jYXRpb24gY2FuIGNoYWluIGlzIHRoZSBwbGF0Zm9ybSdzXG4gICAgICAvLyBmdW5jdGlvbiB0aW1lb3V0IOKAlCB0aGUgU0RLIGRlbGliZXJhdGVseSBpbXBvc2VzIG5vIGNhcCBvZiBpdHNcbiAgICAgIC8vIG93biwgbWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lLCB3aGVyZSBhIGxvbmcgc2VxdWVudGlhbFxuICAgICAgLy8gd29ya2Zsb3cgbGlrZXdpc2UgcnVucyBzdGVwLWJ5LXN0ZXAgdW50aWwgdGhlIHBsYXRmb3JtIHJlY2xhaW1zXG4gICAgICAvLyB0aGUgaW52b2NhdGlvbiBhbmQgYSByZWRlbGl2ZXJ5IHJlc3VtZXMgZnJvbSB0aGUgbG9nLlxuICAgICAgYnVkZ2V0LnBhdXNlKCk7XG4gICAgICBsZXQgb3V0Y29tZXM6IFN0ZXBFeGVjdXRpb25SZXN1bHRbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dGNvbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaW5saW5lQ2FuZGlkYXRlcy5tYXAoKHN0ZXApID0+XG4gICAgICAgICAgICBydW5TdGVwU2luZ2xlRmxpZ2h0KHJ1bklkLCBzdGVwLmNvcnJlbGF0aW9uSWQsICgpID0+XG4gICAgICAgICAgICAgIChhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIGNsYWltOiBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQgKGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGl0KSBhbmQgdGhpcyBzdGVwX3N0YXJ0ZWQgY2FycmllcyB0aGUgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBhdG9taWNhbGx5IOKAlFxuICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseS1vbmUtb3duZXIuIEEgY29uY3VycmVudCBjbGFpbWFudCBnZXRzXG4gICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKGkiB7IHR5cGU6ICdza2lwcGVkJyB9IGFuZCBuZXZlclxuICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgYm9keS4gTWlycm9ycyB0aGUgbm9kZSBlbmdpbmUncyBpbmxpbmUgcGF0aC5cbiAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCBzdGFtcDogd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keSBhcyBpblxuICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IGluIHRoaXMgaW52b2NhdGlvbiBhbmQgYXJtIGEgZGVsYXllZCBiYWNrc3RvcFxuICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIOKAlCBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiAxLFxuICAgICAgICAgICAgICAgIH0pKSgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgfVxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCArPSBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBpbmxpbmVDYW5kaWRhdGVzW2ldO1xuICAgICAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZXNbaV07XG4gICAgICAgIGV4ZWN1dGVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKG91dGNvbWUudHlwZSA9PT0gJ3JldHJ5JyB8fCBvdXRjb21lLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgLy8gSGFuZCB0aGUgc3RlcCB0byB0aGUgcXVldWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJhY2tvZmYg4oCUXG4gICAgICAgICAgLy8gYmFja2dyb3VuZCBkZWxpdmVyeSBkcml2ZXMgdGhlIHJldHJ5IGZyb20gaGVyZS5cbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogb3V0Y29tZS50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAvLyBTdWZmaXhlZCBrZXk6IHRoaXMgc3RlcCB3YXMgaW5saW5lLWNsYWltZWQsIHNvIG5vIGRpc3BhdGNoXG4gICAgICAgICAgICAvLyBwdWJsaXNoIGV4aXN0cyB1bmRlciB0aGUgYmFyZSBjb3JyZWxhdGlvbklkIOKAlCBidXQgc3VmZml4aW5nXG4gICAgICAgICAgICAvLyBrZWVwcyB0aGUgcmV0cnkgZW5xdWV1ZWFibGUgZXZlbiBpZiBhIHdvcmxkIHJldGlyZWQgYVxuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBrZXkgZm9yIHRoaXMgc3RlcCAoc2VlIHRoZSBwdXJwb3NlIGRvY3MgYWJvdmUpLlxuICAgICAgICAgICAgcHVycG9zZTogJ3JldHJ5OjEnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG91dGNvbWUudHlwZSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgcnVuR29uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gJ3NraXBwZWQnOiBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3b24gdGhlIGxhenkgY3JlYXRlLWNsYWltIGFuZFxuICAgICAgICAvLyBvd25zIHRoZSBib2R5LiBNYXJrZWQgZXhlY3V0ZWQgYWJvdmUgc28gdGhpcyBpbnZvY2F0aW9uIG5ldmVyXG4gICAgICAgIC8vIHJlLWNsYWltcyBpdDsgdGhlIHdpbm5lcidzIHRlcm1pbmFsIGV2ZW50cyBhcnJpdmUgdmlhIHRoZSBmZWVkXG4gICAgICAgIC8vIChvciBkcml2ZSBhIHNlcGFyYXRlIGludm9jYXRpb24pLlxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdpbmxpbmVfc3RlcHNfZXhlY3V0ZWQnLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgY291bnQ6IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoLFxuICAgICAgICBvdXRjb21lczogb3V0Y29tZXMubWFwKChvKSA9PiBvLnR5cGUpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZlZWQgdGhlIGlubGluZSBiYXRjaCdzIHRlcm1pbmFsIGV2ZW50cyBpbnRvIHRoZSBsaXZlIFZNLiBXaGVuXG4gICAgICAvLyB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgaGFzIG5vdCBzdXJmYWNlZCB0aGVtIHlldCxcbiAgICAgIC8vIGV4aXRpbmcgbXVzdCBOT1QgYWNrIHNpbGVudGx5OiB0aGUgdGVybWluYWxzIHRoaXMgaW52b2NhdGlvbiBqdXN0XG4gICAgICAvLyBjYXVzZWQgYXJlIGR1cmFibHkgd3JpdHRlbiB3aXRoIG5vIHF1ZXVlIG1lc3NhZ2UgbGVmdCB0byBjb25zdW1lXG4gICAgICAvLyB0aGVtIChpbmxpbmUgc3RlcHMgaGF2ZSBub25lKSwgc28gYW4gYXdhaXRpbmdfZXh0ZXJuYWwgZXhpdCB3b3VsZFxuICAgICAgLy8gcGFyayB0aGUgcnVuICdydW5uaW5nJyB3aXRoIGFsbCBpdHMgc3RlcHMgY29tcGxldGUuIFJhaXNlIHRoZVxuICAgICAgLy8gcmVxdWV1ZSBzaWduYWwgc28gdGhlIHN1c3BlbmRlZCBleGl0IHNjaGVkdWxlcyBhIGZyZXNoIGltbWVkaWF0ZVxuICAgICAgLy8gaW52b2NhdGlvbiB3aG9zZSBmcmVzaCByZWFkIHBpY2tzIHRoZSB0ZXJtaW5hbHMgdXAuIE91dGNvbWVzIHRoYXRcbiAgICAgIC8vIHdyb3RlIG5vIHRlcm1pbmFsICgnc2tpcHBlZCcg4oCUIGEgY29uY3VycmVudCBjbGFpbWFudCBvd25zIHRoZVxuICAgICAgLy8gYm9keTsgJ2dvbmUnLCByZXRyeS90aHJvdHRsZWQg4oCUIGEgcXVldWUgbWVzc2FnZSBleGlzdHMpIGRvbid0XG4gICAgICAvLyBuZWVkIGl0LCBidXQgc2lnbmFsaW5nIG9uIHRoZW0gdG9vIG9ubHkgY29zdHMgYSBuby1vcCBpbnZvY2F0aW9uXG4gICAgICAvLyBpbiBhbiBhbHJlYWR5LXJhcmUgbGFnIHdpbmRvdy5cbiAgICAgIGNvbnN0IG5ld0V2ZW50cyA9IGF3YWl0IGZldGNoVW5zZWVuRXZlbnRzKCk7XG4gICAgICBpZiAobmV3RXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcblxuICAgICAgd2ZkaWFnKCdpbmxpbmVfaXRlcmF0aW9uJywge1xuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIHBoYXNlOiAnc3RlcHMnLFxuICAgICAgICBmZWRFdmVudHM6IG5ld0V2ZW50cy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICBidWRnZXRFeGhhdXN0ZWQ6IGJ1ZGdldC5pc0V4aGF1c3RlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNlc3Npb24uZGlzcG9zZSgpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNJbmxpbmVTdGVwcyhpbmxpbmVTdGVwc0V4ZWN1dGVkKSxcbiAgfSk7XG5cbiAgaWYgKHJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWRcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgY29tcGxldGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgfSk7XG4gICAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU091dGNvbWUoJ2NvbXBsZXRlZCcpLFxuICAgIH0pO1xuXG4gICAgLy8gRmx1c2ggbGVmdG92ZXIgcGVuZGluZyBzaWRlIGVmZmVjdHMgKGFib3J0IHJlY29yZGluZ3MsIHN5c3RlbS1ob29rXG4gICAgLy8gZGlzcG9zYWxzLCBmaXJlLWFuZC1mb3JnZXQgYXR0cmlidXRlL2hvb2sgZXZlbnRzKSBCRUZPUkUgd3JpdGluZ1xuICAgIC8vIHJ1bl9jb21wbGV0ZWQg4oCUIG1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcy5cbiAgICAvLyBEcmFpbiBmYWlsdXJlcyBhcmUgc3dhbGxvd2VkOiB0aGUgd29ya2Zsb3cncyBvd24gb3V0Y29tZSBpcyB0aGVcbiAgICAvLyBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaWYgKHJlc3VsdC5jb21wbGV0ZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2NvbXBsZXRlZCBldmVudC5cbiAgICAvLyBUaGUgVk0gc2VyaWFsaXplcyB0aGUgd29ya2Zsb3cgcmVzdWx0IGFzIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzXG4gICAgLy8gKFwiZGV2bFwiICsgZGV2YWx1ZSkgd2l0aCBubyBlbmNyeXB0aW9uICh0aGUgVk0gaGFzIG5vIGFjY2VzcyB0byB0aGVcbiAgICAvLyBDcnlwdG9LZXkpLiBIb3N0LXNpZGUgZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmUgc28gdGhhdCBgcnVuX2NvbXBsZXRlZGBcbiAgICAvLyBldmVudHMgaGF2ZSB0aGUgc2FtZSBgZW5jcmAtcHJlZml4ZWQgcGF5bG9hZCBzaGFwZSB0aGF0IHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lJ3MgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgIHByb2R1Y2VzLlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIG91dHB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlZC5yZXN1bHQsXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAncnVuX2NvbXBsZXRlZF93cml0dGVuJyB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBydW5fY29tcGxldGVkJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgKTtcbiAgICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAnYWxyZWFkeV9maW5pc2hlZCcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWRfZXJyb3InLCB7XG4gICAgICAgIGVycm9yTmFtZTogKGVyciBhcyBFcnJvcik/Lm5hbWUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmVzdWx0LnN1c3BlbmRlZCkge1xuICAgIC8vIFdvcmtmbG93IHN0aWxsIHN1c3BlbmRlZCBhZnRlciB0aGUgaW5saW5lIGxvb3AuIEFsbCBkdXJhYmxlIHNpZGVcbiAgICAvLyBlZmZlY3RzIGZvciB0aGUgZmluYWwgc3VzcGVuc2lvbiBzdGF0ZSB3ZXJlIGFscmVhZHkgZGlzcGF0Y2hlZCBieVxuICAgIC8vIHRoZSBsb29wOyB3aGF0IHJlbWFpbnMgaXMgZGVjaWRpbmcgaG93IHRoZSBydW4gZ2V0cyByZS1pbnZva2VkLlxuICAgIGNvbnN0IHsgcGVuZGluZ09wZXJhdGlvbnMgfSA9IHJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkLFxuICAgICAgcGVuZGluZ1N0ZXBzOiBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gJ3N0ZXAnKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nV2FpdHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnd2FpdCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPcHM6IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgocCkgPT4gKHtcbiAgICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgICB9KSksXG4gICAgfSk7XG5cbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnc3VzcGVuZGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU1BlbmRpbmdPcHNDb3VudChwZW5kaW5nT3BlcmF0aW9ucy5sZW5ndGgpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJ1bkdvbmUpIHtcbiAgICAgIC8vIFRoZSBydW4gbm8gbG9uZ2VyIGV4aXN0cyAoZXhwaXJlZCAvIGRlbGV0ZWQpIOKAlCBub3RoaW5nIHRvIGRyaXZlLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAncnVuX2dvbmUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4aXQgcmVxdWV1ZXMgYXJlIEZSRVNIIG1lc3NhZ2VzLCBuZXZlciBhIGB7IHRpbWVvdXRTZWNvbmRzIH1gXG4gICAgLy8gdmlzaWJpbGl0eS1yZWRlbGl2ZXJ5IG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAvLyBDVVJSRU5UIG1lc3NhZ2UgaXMgYSB0cmFwOiBhIGhvb2stcmVzdW1lIGRlbGl2ZXJ5IGNhcnJpZXNcbiAgICAvLyBgaG9va0lucHV0YCwgYW5kIGl0cyByZWRlbGl2ZXJ5IHJlLXJ1bnMgdGhlIGxhenktcmVzdW1lIHJlLWVuc3VyZVxuICAgIC8vIGluIHRoZSBoYW5kbGVyIHByb2xvZ3VlIOKAlCBpZiB0aGUgd29ya2Zsb3cgZGlzcG9zZWQgdGhhdCBob29rXG4gICAgLy8gZHVyaW5nIHRoaXMgaW52b2NhdGlvbiAoZGlzcG9zZSDihpIgc2xlZXApLCBhIHdvcmxkIHRoYXQgcmVqZWN0c1xuICAgIC8vIHRoZSByZS1lbnN1cmUgd291bGQgYWNrIHRoZSBtZXNzYWdlIGFzIFwibm90aGluZyBsZWZ0IHRvIHJlc3VtZVwiXG4gICAgLy8gYW5kIHRoZSBjb250aW51YXRpb24gaXQgY2FycmllZCBpcyBzaWxlbnRseSBsb3N0LiBBIGZyZXNoIG1lc3NhZ2VcbiAgICAvLyBjYXJyaWVzIG9ubHkgYHJ1bklkYCwgc28gaXRzIGRlbGl2ZXJ5IGFsd2F5cyByZWFjaGVzIHJlcGxheSAoYW5kXG4gICAgLy8gdW5kZXIgdHVyYm8gYSByZXNjaGVkdWxlIHdvdWxkIHJlLWVuZ2FnZSB0dXJibyBhZ2FpbnN0IGEgc3RhbGVcbiAgICAvLyBwcmVsb2FkZWQgbG9nIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jcyBpbiBydW50aW1lLnRzKS5cbiAgICBjb25zdCByZXF1ZXVlSW1tZWRpYXRlbHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKGJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAvLyBUaGUgbG9vcCBzdG9wcGVkIG9uIHRoZSByZXBsYXkgYnVkZ2V0IHdpdGggcHJvZ3Jlc3Mgc3RpbGxcbiAgICAgIC8vIHBvc3NpYmxlIOKAlCBjb250aW51ZSBpbiBhIGZyZXNoIGludm9jYXRpb24uXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdidWRnZXRfZXhoYXVzdGVkX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCB3YWl0IHN3ZWVwLiBBIHdhaXQgdGhhdCBlbGFwc2VkIGluIHRoZSB3aW5kb3cgc2luY2UgdGhlXG4gICAgLy8gbG9vcCdzIGxhc3QgY2hlY2sgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgKGl0cyB3YWl0X2NvbXBsZXRlZCBpc1xuICAgIC8vIHdyaXR0ZW4gYnkgdGhlIG5leHQgaW52b2NhdGlvbidzIGVsYXBzZWQtd2FpdCBwYXNzKTsgcGVuZGluZyB3YWl0c1xuICAgIC8vIHdob3NlIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBhbHJlYWR5IGVucXVldWVkIGFyZSBza2lwcGVkLlxuICAgIGxldCBzb29uZXN0V2FpdDogeyBzZWNvbmRzOiBudW1iZXI7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCBoYXNFbGFwc2VkV2FpdCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHJlc3VtZU1zIDw9IDApIHtcbiAgICAgICAgaGFzRWxhcHNlZFdhaXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgdGltZW91dFNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7XG4gICAgICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0VsYXBzZWRXYWl0KSB7XG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd3YWl0X2VsYXBzZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ1JlcXVldWVTaWduYWwpIHtcbiAgICAgIC8vIFRoaXMgaW52b2NhdGlvbiB3cm90ZSBldmVudHMgdGhlIHdvcmtmbG93IG5lZWRzIHRvIGNvbnN1bWVcbiAgICAgIC8vIChhdHRyX3NldCAvIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkIC8gaW5saW5lIHN0ZXBcbiAgICAgIC8vIHRlcm1pbmFscykgYnV0IHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBuZXZlciByZXR1cm5lZFxuICAgICAgLy8gdGhlbSBiZWZvcmUgdGhlIGxvb3AgZXhpdGVkLiBXaXRob3V0IGEgcmVxdWV1ZSB0aGUgcnVuIHdvdWxkXG4gICAgICAvLyBwYXJrIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggaXRzIHVuYmxvY2tpbmcgZXZlbnRzIGFscmVhZHlcbiAgICAgIC8vIGR1cmFibHkgd3JpdHRlbiBhbmQgbm8gZnV0dXJlIGludm9jYXRpb24gY29taW5nIOKAlCByZXF1ZXVlXG4gICAgICAvLyBpbW1lZGlhdGVseSBzbyBhIGZyZXNoIHJlYWQgcGlja3MgdGhlbSB1cC4gSW4gdGhlIGNvbW1vbiBjYXNlXG4gICAgICAvLyB0aGUgbG9vcCdzIG93biBmZWVkIG9ic2VydmVzIHRoZSB3cml0ZXMgYW5kIGNsZWFycyB0aGlzIGZsYWcsIHNvXG4gICAgICAvLyB0aGlzIG9ubHkgZmlyZXMgd2hlbiB0aGUgcmVhZCBhY3R1YWxseSBsYWdnZWQuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd1bnJlYWRfc2VsZl93cml0ZV9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgLy8gRGVsYXllZCBjb250aW51YXRpb24gZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCB0aGUgbG9vcCBoYXNcbiAgICAgIC8vIG5vdCBhbHJlYWR5IHNjaGVkdWxlZC4gVGhlIGRpc3BhdGNoIGhlbHBlciBoYW5kbGVzIGRlbGF5XG4gICAgICAvLyBjbGFtcGluZyAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3MgaG9wcykgYW5kIGlkZW1wb3RlbmN5LWtleVxuICAgICAgLy8gZGVkdXAgb2YgcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCDigJQgc2VlXG4gICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgICAgYWN0aW9uOiAnc2NoZWR1bGVfd2FpdF90aW1lb3V0JyxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgIHdhaXRDb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICBhY3Rpb246ICdhd2FpdGluZ19leHRlcm5hbCcsXG4gICAgICBwZW5kaW5nT3BzQ291bnQ6IHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQuZmFpbGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgZmFpbGVkIOKAlCByZW1hcCBzdGFjayB0cmFjZSB1c2luZyBpbmxpbmUgc291cmNlIG1hcHMuXG4gICAgLy8gRnJhbWVzIGNhcnJ5IHRoZSBydW4ncyB3b3JrZmxvd0lkIGFzIHRoZWlyIGZpbGVuYW1lIG9uIHRoZSBmcmVzaFxuICAgIC8vIHBhdGgsIGJ1dCB0aGUgd29ya2Zsb3ctaW5kZXBlbmRlbnQgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FIG9uIHRoZVxuICAgIC8vIHNuYXBzaG90IHBhdGggKHRoZSBuYW1lIGlzIGJha2VkIGludG8gdGhlIHNoYXJlZCBiYXNlbGluZSdzXG4gICAgLy8gY29tcGlsZWQgY29kZSBhdCBoeWRyYXRlKSDigJQgcmVtYXAgYWdhaW5zdCBib3RoLiByZW1hcEVycm9yU3RhY2tcbiAgICAvLyBlYXJseS1leGl0cyBvbiBhIGNoZWFwIGluY2x1ZGVzKCkgd2hlbiBhIGZpbGVuYW1lIGhhcyBubyBmcmFtZXMuXG4gICAgbGV0IGVycm9yU3RhY2sgPSByZXN1bHQuZmFpbGVkLnN0YWNrO1xuICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soZXJyb3JTdGFjaywgZmlsZW5hbWUsIHdvcmtmbG93Q29kZSk7XG4gICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3Igc28gY29uc3VtZXJzIChgcnVuLnJldHVyblZhbHVlYCwgb2JzZXJ2YWJpbGl0eSlcbiAgICAvLyBnZXQgYFVTRVJfRVJST1JgIC8gYFJVTlRJTUVfRVJST1JgIG9uIGBlcnJvci5jYXVzZS5jb2RlYCwgbWF0Y2hpbmdcbiAgICAvLyB3aGF0IHRoZSBub2RlOnZtIGVuZ2luZSBhbHJlYWR5IGRvZXMgaW4gcnVudGltZS50cy5cbiAgICAvL1xuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIGVycm9ycyBhcyBgeyBuYW1lLCBtZXNzYWdlLCBzdGFjayB9YCwgc28gd2VcbiAgICAvLyByZWNvbnN0cnVjdCBhIGhvc3Qtc2lkZSBFcnJvciBvZiB0aGUgY29ycmVjdCBjbGFzcyBiYXNlZCBvbiB0aGVcbiAgICAvLyBWTS1zaWRlIGBuYW1lYCDigJQgc3BlY2lmaWMgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3NlcyBuZWVkXG4gICAgLy8gdG8gYmUgcHJlc2VydmVkIHNvIGNsYXNzaWZ5UnVuRXJyb3IoKSB0YWdzIHRoZW0gYXMgUlVOVElNRV9FUlJPUi5cbiAgICBjb25zdCByZWNvbnN0cnVjdGVkOiBFcnJvciA9XG4gICAgICByZXN1bHQuZmFpbGVkLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcidcbiAgICAgICAgPyBuZXcgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3Iod29ya2Zsb3dOYW1lKVxuICAgICAgICA6IHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICAgID8gbmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSlcbiAgICAgICAgICA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihyZWNvbnN0cnVjdGVkKTtcblxuICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBlcnJvck5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0LmZhaWxlZC5tZXNzYWdlLFxuICAgICAgZXJyb3JTdGFjayxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnZmFpbGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyBiZWZvcmUgd3JpdGluZyBydW5fZmFpbGVkIOKAlFxuICAgIC8vIHNhbWUgZHJhaW4gc2VtYW50aWNzIGFzIHRoZSBjb21wbGV0ZWQgYnJhbmNoLlxuICAgIGlmIChyZXN1bHQuZmFpbGVkLmRyYWluT3BlcmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdRdWlja0pTIHJ1bnRpbWU6IHRlcm1pbmFsIGRyYWluIGZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJ1bl9mYWlsZWQgZXZlbnQuIFNlcmlhbGl6ZSB0aGUgZXJyb3IgdGhyb3VnaCB0aGVcbiAgICAvLyBmaXJzdC1jbGFzcyBkZWh5ZHJhdGlvbiBwaXBlbGluZSBzbyBjb25zdW1lcnMgKENMSSwgb2JzZXJ2YWJpbGl0eSxcbiAgICAvLyBydW4ucmV0dXJuVmFsdWUpIGdldCB0aGUgc2FtZSBoeWRyYXRlZCB2YWx1ZSBzaGFwZSBhcyB0aGUgbm9kZTp2bVxuICAgIC8vIGVuZ2luZSBlbWl0cy4gVHdvIHBhdGhzOlxuICAgIC8vICAgKiBNb2Rlcm4gKHZhbHVlQnl0ZXMgcHJlc2VudCk6IHRoZSBWTS1zaWRlIHJlamVjdGlvbiBoYW5kbGVyXG4gICAgLy8gICAgIHNlcmlhbGl6ZWQgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSAoRXJyb3Igc3ViY2xhc3Mgd2l0aFxuICAgIC8vICAgICBjYXVzZSBjaGFpbiwgcGxhaW4gb2JqZWN0LCBwcmltaXRpdmUsIGV0Yy4pIHVzaW5nIHRoZSBWTSdzXG4gICAgLy8gICAgIHdvcmtmbG93LXNlcmlhbGl6ZS4gUGFzcyB0aG9zZSBieXRlcyB0aHJvdWdoIGRpcmVjdGx5IHNvXG4gICAgLy8gICAgIHR5cGUgaWRlbnRpdHksIGNhdXNlIGNoYWlucywgYW5kIG5vbi1FcnJvciB0aHJvd3Mgc3Vydml2ZS5cbiAgICAvLyAgICAgV2UganVzdCBuZWVkIHRvIGFwcGx5IGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCAodGhlIFZNJ3NcbiAgICAvLyAgICAgc2VyaWFsaXplciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBlbmNyeXB0aW9uIGtleSkuXG4gICAgLy8gICAqIExlZ2FjeSBmYWxsYmFjazogcmVjb25zdHJ1Y3QgYW4gRXJyb3IgZnJvbSB0aGUgaG9zdC12aXNpYmxlXG4gICAgLy8gICAgIHtuYW1lLCBtZXNzYWdlLCBzdGFja30gZmllbGRzIGFuZCBydW4gaXQgdGhyb3VnaFxuICAgIC8vICAgICBgZGVoeWRyYXRlUnVuRXJyb3JgLiBVc2VkIHdoZW4gdmFsdWVCeXRlcyBpcyBhYnNlbnQgKGUuZy5cbiAgICAvLyAgICAgZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcyBmcm9tIFZNIGJvb3RzdHJhcCkuXG4gICAgbGV0IGRlaHlkcmF0ZWRFcnJvcjogVWludDhBcnJheTtcbiAgICBpZiAocmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBWTS1zaWRlIGJ5dGVzLCByZW1hcCB0aGUgZXJyb3Igc3RhY2sgd2l0aCB0aGVcbiAgICAgIC8vIGhvc3Qtc2lkZSBzb3VyY2UgbWFwICh0aGUgVk0gY2FuJ3QgZG8gdGhpcyDigJQgaXQgbGFja3MgYm90aCB0aGVcbiAgICAgIC8vIHNvdXJjZSBtYXAgYW5kIGByZW1hcEVycm9yU3RhY2tgKSwgYW5kIHJlLWRlaHlkcmF0ZS4gVGhpc1xuICAgICAgLy8gcHJlc2VydmVzIHRoZSBvcmlnaW5hbCB2YWx1ZSdzIHR5cGUgaWRlbnRpdHkgLyBjYXVzZSBjaGFpblxuICAgICAgLy8gd2hpbGUgZml4aW5nIHVwIGZyYW1lcyB0byBwb2ludCBhdCB0aGUgdXNlcidzIHNvdXJjZSBmaWxlcy5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQudmFsdWVCeXRlcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB1bmRlZmluZWQgLy8gVk0gYnl0ZXMgYXJlIHVuZW5jcnlwdGVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgIHR5cGVvZiBoeWRyYXRlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAnc3RhY2snIGluIChoeWRyYXRlZCBhcyBvYmplY3QpICYmXG4gICAgICAgICAgdHlwZW9mIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogdW5rbm93biB9KS5zdGFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzIOKAlCBzZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjaz86IHN0cmluZyB9KS5zdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgKGh5ZHJhdGVkIGFzIHsgc3RhY2s6IHN0cmluZyB9KS5zdGFjayxcbiAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FsayB0aGUgY2F1c2UgY2hhaW4gYW5kIHJlbWFwIG5lc3RlZCBzdGFja3MgdG9vLlxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgICBsZXQgbm9kZSA9IChoeWRyYXRlZCBhcyB7IGNhdXNlPzogdW5rbm93biB9KT8uY2F1c2U7XG4gICAgICAgIHdoaWxlIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiAhc2Vlbi5oYXMobm9kZSBhcyBvYmplY3QpKSB7XG4gICAgICAgICAgc2Vlbi5hZGQobm9kZSBhcyBvYmplY3QpO1xuICAgICAgICAgIGNvbnN0IG5vZGVTdGFjayA9IChub2RlIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrO1xuICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZVN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAvLyBCb3RoIGZpbGVuYW1lIHNwYWNlcyDigJQgc2VlIHRoZSBmYWlsZWQtYnJhbmNoIGNvbW1lbnQgYWJvdmUuXG4gICAgICAgICAgICAobm9kZSBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICByZW1hcEVycm9yU3RhY2sobm9kZVN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKSxcbiAgICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSAobm9kZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZTtcbiAgICAgICAgfVxuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBoeWRyYXRlZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChyZWh5ZHJhdGVFcnIpIHtcbiAgICAgICAgLy8gSWYgaHlkcmF0aW9uIC8gcmUtZGVoeWRyYXRpb24gZmFpbHMgZm9yIGFueSByZWFzb24sIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBwYXNzaW5nIHRocm91Z2ggdGhlIG9yaWdpbmFsIFZNIGJ5dGVzIChqdXN0IGFwcGx5XG4gICAgICAgIC8vIGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCkuIEJldHRlciB0byBsb3NlIHNvdXJjZS1tYXBwZWRcbiAgICAgICAgLy8gZnJhbWVzIHRoYW4gdG8gbG9zZSB0aGUgZXJyb3IgZW50aXJlbHkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gcmVtYXAgd29ya2Zsb3cgZXJyb3Igc3RhY2ssIHBhc3NpbmcgVk0gYnl0ZXMgdGhyb3VnaCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiAocmVoeWRyYXRlRXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKSkgYXMgVWludDhBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgcmVjb25zdHJ1Y3RlZC5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICByZWNvbnN0cnVjdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHNlckVycikge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBtaW5pbWFsIHBheWxvYWQgc28gdGhlIHJ1biBzdGlsbCB0ZXJtaW5hdGVzXG4gICAgICAgIC8vIGV2ZW4gd2hlbiB0aGUgZXJyb3IgaXRzZWxmIGNvbnRhaW5zIHVuc2VyaWFsaXphYmxlIHZhbHVlcy5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byBkZWh5ZHJhdGUgcnVuIGVycm9yLCBmYWxsaW5nIGJhY2sgdG8gYmFyZSBFcnJvcicsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogKHNlckVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfVxuICAgICAgICApO1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihyZXN1bHQuZmFpbGVkLm1lc3NhZ2UpLCB7XG4gICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogZGVoeWRyYXRlZEVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9mYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2ZhaWxlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdydW5fZmFpbGVkX3dyaXR0ZW4nIH0pO1xuICB9XG59XG4iXX0=