footprintjs 10.1.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CLAUDE.md +18 -0
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/attempt/category.d.ts +6 -0
  5. package/dist/esm/lib/attempt/category.js +26 -2
  6. package/dist/esm/lib/attempt/runner.d.ts +3 -1
  7. package/dist/esm/lib/attempt/runner.js +26 -6
  8. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  9. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  10. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  11. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  12. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  13. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  14. package/dist/esm/lib/engine/handlers/stageError.d.ts +2 -0
  15. package/dist/esm/lib/engine/handlers/stageError.js +13 -1
  16. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  17. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  18. package/dist/esm/lib/engine/narrative/types.d.ts +4 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +14 -6
  21. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  22. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  23. package/dist/esm/lib/memory/StageContext.d.ts +14 -0
  24. package/dist/esm/lib/memory/StageContext.js +32 -1
  25. package/dist/esm/lib/memory/attention.d.ts +26 -0
  26. package/dist/esm/lib/memory/attention.js +171 -0
  27. package/dist/esm/lib/memory/frameTypes.d.ts +8 -0
  28. package/dist/esm/lib/memory/frameTypes.js +1 -1
  29. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +14 -0
  30. package/dist/esm/lib/recorder/ControlDepRecorder.js +18 -1
  31. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -0
  32. package/dist/esm/lib/runner/FlowChartExecutor.js +163 -127
  33. package/dist/index.js +1 -1
  34. package/dist/lib/attempt/category.js +27 -2
  35. package/dist/lib/attempt/runner.js +25 -5
  36. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  37. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  38. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  39. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  40. package/dist/lib/engine/handlers/commitStage.js +24 -5
  41. package/dist/lib/engine/handlers/stageError.js +15 -2
  42. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  43. package/dist/lib/engine/narrative/types.js +1 -1
  44. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -4
  45. package/dist/lib/errors/terminalFailure.js +64 -0
  46. package/dist/lib/memory/StageContext.js +32 -1
  47. package/dist/lib/memory/attention.js +175 -0
  48. package/dist/lib/memory/frameTypes.js +1 -1
  49. package/dist/lib/recorder/ControlDepRecorder.js +18 -1
  50. package/dist/lib/runner/FlowChartExecutor.js +163 -127
  51. package/dist/types/index.d.ts +2 -0
  52. package/dist/types/lib/attempt/category.d.ts +6 -0
  53. package/dist/types/lib/attempt/runner.d.ts +3 -1
  54. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  55. package/dist/types/lib/engine/handlers/stageError.d.ts +2 -0
  56. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  57. package/dist/types/lib/engine/narrative/types.d.ts +4 -1
  58. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  59. package/dist/types/lib/memory/StageContext.d.ts +14 -0
  60. package/dist/types/lib/memory/attention.d.ts +26 -0
  61. package/dist/types/lib/memory/frameTypes.d.ts +8 -0
  62. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +14 -0
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -0
  64. package/package.json +6 -6
@@ -65,7 +65,7 @@ import { extractErrorInfo } from '../errors/errorInfo.js';
65
65
  import { isInterruptSignal } from '../pause/interrupt.js';
66
66
  import { isPauseSignal } from '../pause/types.js';
67
67
  import { anySignal } from './anySignal.js';
68
- import { errorCategory } from './category.js';
68
+ import { errorCategory, terminalCategory } from './category.js';
69
69
  import { isCancelled, isDeadlineReason, markTimeLimit, readDeadline, setLongTimeout } from './deadline.js';
70
70
  import { decideAttempt, retryRules } from './decision.js';
71
71
  import { effectOf, recordedKeyOf, refuseKeylessRetry, unknownEffectError } from './effect.js';
@@ -129,6 +129,10 @@ export async function runAttempts(run, policy, options) {
129
129
  const delayMs = decision.next === 'retry' ? inputs.delayMs() : inputs.delayIfAsked();
130
130
  const timeLeftMs = deadline === undefined ? undefined : inputs.timeLeft();
131
131
  const category = inputs.category();
132
+ // Private terminal semantics are fixed before serving or observer fan-out.
133
+ // An already-unresolved call wrapper must not become its physical cause
134
+ // if a consumer later changes the raw error's properties or prototype.
135
+ const terminal = options.onFailure && failure ? terminalCategory(failure.error, category) : category ?? 'unknown';
132
136
  const served = inputs.failed ? (options.serve ?? extractErrorInfo)(inputs.failed.error) : undefined;
133
137
  const effect = options.effect ? effectOf(inputs.outcome, failure?.error) : undefined;
134
138
  const recordedKey = options.effect ? recordedKeyOf(options.effect) : undefined;
@@ -163,10 +167,17 @@ export async function runAttempts(run, policy, options) {
163
167
  if (record.next === 'done')
164
168
  return value;
165
169
  if (record.next === 'stop')
166
- throw stopError(options.effect, record, failure, unknownSoFar);
170
+ throw stoppedFailure(options, record, failure, unknownSoFar, terminal);
167
171
  options.onRetry?.(attempt, of, delayMs ?? 0, served);
168
- if (delayMs !== undefined && delayMs > 0)
169
- await sleep(delayMs, options.signal);
172
+ if (delayMs !== undefined && delayMs > 0) {
173
+ try {
174
+ await sleep(delayMs, options.signal);
175
+ }
176
+ catch (error) {
177
+ options.onFailure?.(error, 'unknown');
178
+ throw error;
179
+ }
180
+ }
170
181
  // No attempt follows a cut wait, so none is recorded: the summary says how the series ended. No attempt
171
182
  // STARTS at or past the deadline either — rule 6 decided with the clock, and the clock may have moved on.
172
183
  const cut = isCancelled(options.signal)
@@ -176,10 +187,19 @@ export async function runAttempts(run, policy, options) {
176
187
  : undefined;
177
188
  if (cut !== undefined) {
178
189
  options.onEnd?.(tally.summary({ ...lastOf(record, unknownSoFar), next: 'stop', reason: cut }));
179
- throw stopError(options.effect, record, failure, unknownSoFar);
190
+ throw stoppedFailure(options, record, failure, unknownSoFar, terminal);
180
191
  }
181
192
  }
182
193
  }
194
+ /** The final physical attempt owns its category; a wrapper or cut wait has no such category. */
195
+ function stoppedFailure(options, record, failure, unknownSoFar, terminal) {
196
+ const error = stopError(options.effect, record, failure, unknownSoFar);
197
+ if (record.outcome !== 'paused') {
198
+ const category = record.next === 'stop' && Object.is(error, failure?.error) ? terminal : 'unknown';
199
+ options.onFailure?.(error, category);
200
+ }
201
+ return error;
202
+ }
183
203
  /**
184
204
  * What a stopped series throws: the last attempt's own error — or, on a touching target where ANY attempt left the
185
205
  * effect unknown, `UnknownEffectError` with the last attempt's error as its cause. An earlier timeout may have
@@ -500,4 +520,4 @@ class SeriesTally {
500
520
  return freezeDeep({ ...this.counts, last });
501
521
  }
502
522
  }
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUEyRXhELHNIQUFzSDtBQUN0SCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFPLE9BQU8sS0FBSyxT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KlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/IGRlY2lkZSBhZ2FpbjogcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXMgaGVyZSwgYmVmb3JlIHRoZVxuICogICAgICAgICAgIGRpc2NhcmQgYW5kIGJlZm9yZSBiYWNrb2ZmTXMsIGFzIHRoZSA5LjE1IGFib3J0IGNoZWNrIGRpZFxuICogICAgICAgICDihpIgcmV0cnk6IGJldHdlZW4obikg4oCUIHRoZSBkaXNjYXJkIOKAlCBhbmQgVEhFTiBiYWNrb2ZmTXMobiksIHRoZSB3YWl0J3MgbGVuZ3RoXG4gKiAgICAgICAgIOKGkiB0aGUgZXJyb3IncyBzZXJ2ZWQgZm9ybSBhbmQgY2F0ZWdvcnksIHJlYWQgYWZ0ZXIgcmV0cnlPbiBhbmQgYmFja29mZk1zIHJhbiDihpIgdGhlIHJlY29yZFxuICogICAgICAgICDihpIgb25FbmQoc3VtbWFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc2VyaWVzIGVuZHMgaGVyZVxuICogICAgICAgICDihpIgb25BdHRlbXB0KHJlY29yZCwgc2VydmVkIGVycm9yKVxuICogICAgICAgICDihpIgZG9uZTogcmV0dXJuIHRoZSB2YWx1ZSDCtyBzdG9wOiByZXRocm93IHRoZSBhdHRlbXB0J3MgT1dOIGVycm9yXG4gKiAgICAgICAgIOKGkiByZXRyeTogb25SZXRyeShuLCBvZiwgZGVsYXksIHNlcnZlZCBlcnJvcikg4oaSIHdhaXQgKGN1dCBzaG9ydCBieSB0aGUgc2lnbmFsKSDihpIgYWJvcnRlZD8gc3RvcFxuICpcbiAqIFdIQVQgSVQgUFJFU0VSVkVTICh0aGUgOS4xNSBsb29wJ3MgYmVoYXZpb3VyLCBtb3ZlZCBoZXJlIHVuY2hhbmdlZCk6IHRoZSBmdW5jdGlvbiBydW5zIHRoZSBzYW1lIG51bWJlciBvZlxuICogdGltZXM7IGByZXRyeU9uYCBpcyBhc2tlZCBvbmx5IGZvciBhIGZhaWxlZCwgbm9uLWZpbmFsIGF0dGVtcHQ7IGBiYWNrb2ZmTXNgIG9ubHkgd2hlbiBhIHJldHJ5IGZvbGxvd3MsIGFmdGVyXG4gKiB0aGUgZGlzY2FyZDsgYSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiwgYSB0aHJvd2luZyBvciBub24tZmluaXRlIGJhY2tvZmYgaXMgXCJubyB3YWl0XCI7IGEgcGF1c2UgaXNcbiAqIG5ldmVyIHJldHJpZWQ7IHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIGlzIHJldGhyb3duLCBuZXZlciBhIHdyYXBwZXI7IGFuZCBhIGZhaWxlZCBhdHRlbXB0J3Mgb3JkZXIg4oCUXG4gKiBgcmV0cnlPbmAg4oaSIHRoZSBhYm9ydCBjaGVjayDihpIgdGhlIGRpc2NhcmQgKGBiZXR3ZWVuYCkg4oaSIGBiYWNrb2ZmTXNgIOKGkiB0aGUgc2VydmVkIGVycm9yIOKGkiB0aGUgcmV0cnkgZXZlbnQg4oaSXG4gKiB0aGUgd2FpdCDihpIgdGhlIGFib3J0IGNoZWNrLiBTbyBhbiBhYm9ydCBpbnNpZGUgYHJldHJ5T25gIHN0b3BzIGJlZm9yZSB0aGUgZGlzY2FyZCBhbmQgbmV2ZXIgYXNrcyBgYmFja29mZk1zYDtcbiAqIGFuIGFib3J0IGluc2lkZSBgYmFja29mZk1zYCBjb21lcyBhZnRlciB0aGUgZGlzY2FyZCwgc3RpbGwgZmlyZXMgdGhlIHJldHJ5IGV2ZW50LCB0aGVuIGVuZHMgYXQgdGhlIHdhaXQ7IGFuZFxuICogdGhlIHNlcnZlZCBlcnJvciBzaG93cyB3aGF0IGByZXRyeU9uYCBkaWQgdG8gdGhlIHRocm93biB2YWx1ZS4gVGhlIG9uZSBkaWZmZXJlbmNlOiB3aGVuIHRoZSBydW4ncyBzaWduYWwgaGFzXG4gKiBBTFJFQURZIGFib3J0ZWQgYXMgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBzZXJpZXMgc3RvcHMgd2l0aG91dCBhc2tpbmcgYHJldHJ5T25gICh0aGUgYWJvcnQgZGVjaWRlcyBmaXJzdCDigJRcbiAqIHJ1bGUgMyBiZWZvcmUgcnVsZSA1KS5cbiAqXG4gKiBXSEFUIElUIEFERFM6IHRoZSByZWNvcmQgYW5kIHRoZSBzdW1tYXJ5LiBBIHJlY29yZCBpcyBmcm96ZW4gdG8gaXRzIGxlYXZlcyBhbmQgaG9sZHMgb25seSBjbG9uZS1zYWZlIGRhdGEg4oCUXG4gKiB0aGUgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQgKGBzZXJ2ZWAsIHRoZSByZWRhY3Rpb24gcnVsZSdzIGZvcm0pIHdpdGhvdXQgYHJhd2AuIFRoZSBob29rIGdldHMgdGhlIHNlcnZlZFxuICogYFN0cnVjdHVyZWRFcnJvckluZm9gIHdob2xlLCBgcmF3YCBpbmNsdWRlZCwgYXMgYG9uU3RhZ2VSZXRyeWAgYWx3YXlzIGhhcy4gQSByZWNvcmQgbmV2ZXIgcmV3cml0ZXMgd2hhdCB0aGVcbiAqIGF0dGVtcHQgZGlkOiBhbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIG93biBlcnJvciBpcyBgZmFpbGVkYCwgd2l0aCBpdHMgY2F0ZWdvcnksIGV2ZW4gd2hlbiB0aGUgcnVuIGFib3J0ZWRcbiAqIGFyb3VuZCBpdCDigJQgdGhlIGFib3J0IGlzIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgYSB0aHJvd2luZyBgcmV0cnlPbmAgaXMgYGRlY2xpbmVkYFxuICogd2l0aCBgcmV0cnlPblRocmV3OiB0cnVlYCwgYXBhcnQgZnJvbSBhIHJlYWwgYGZhbHNlYC5cbiAqXG4gKiBUSU1FIChQMWIpLiBFYWNoIGF0dGVtcHQgcnVucyB1bmRlciBgbWluKHBvbGljeS50aW1lb3V0TXMsIHRpbWUgbGVmdCBiZWZvcmUgb3B0aW9ucy5kZWFkbGluZSlgIGFuZCBnZXRzIGFuXG4gKiBgQXR0ZW1wdENvbnRleHRgIOKAlCBpdHMgc2lnbmFsLCBjb21wb3NlZCBmcm9tIHRoZSBydW4ncyBhbmQgaXRzIG93biBjYXAncyB0aW1lciAoYExpdmVBdHRlbXB0YCkuIFRoZSBjYXAncyB0aW1lclxuICogYWJvcnRzIHdpdGggYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgOyB0aGUgcnVuJ3MgZGVhZGxpbmUgYWJvcnRzIHRoZSBydW4ncyBzaWduYWwgd2l0aCBhIGJyYW5kZWQgcmVhc29uXG4gKiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS4gRWl0aGVyIHdheSB0aGUgYXR0ZW1wdCBpcyBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2A6IHRoZSBkZWFkbGluZSBpcyBub3QgYVxuICogY2FuY2VsbGF0aW9uLCBzbyBydWxlIDMgZG9lcyBub3QgbWF0Y2ggYW5kIHJ1bGUgNiAoYHRpbWVMZWZ0QWZ0ZXJXYWl0TXMg4omkIDBgKSBzdG9wcyBhIHNlcmllcyB3aG9zZSBuZXh0IHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgaXQuIFVuZGVyIGEgZGVhZGxpbmUgcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoLCBzbyBgYmFja29mZk1zKG4sIGVycm9yKWAgaXMgYXNrZWQgRFVSSU5HIHRoZVxuICogZGVjaXNpb24g4oCUIGJlZm9yZSB0aGUgZGlzY2FyZDsgd2l0aG91dCBvbmUgdGhlIDkuMTUgb3JkZXIgYWJvdmUgaG9sZHMgdW5jaGFuZ2VkLiBObyBhdHRlbXB0IHN0YXJ0cyBhdCBvciBwYXN0XG4gKiB0aGUgZGVhZGxpbmU6IGEgd2FpdCB0aGUgZGVhZGxpbmUgY3V0IGVuZHMgdGhlIHNlcmllcyBgbm8tdGltZS1sZWZ0YCwgcmVjb3JkaW5nIG5vIGZ1cnRoZXIgYXR0ZW1wdC5cbiAqXG4gKiBUSEUgRkVOQ0UuIFRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2lnbmFsIGFib3J0cyAoc3luY2hyb25vdXNseSwgYmVmb3JlIGFueSBsaXN0ZW5lclxuICogdGhlIGZ1bmN0aW9uIGFkZGVkKSBvciBpdCB0aHJvd3Mg4oCUIGBvbkFiYW5kb24obilgIGZpcmVzIG9uY2UsIGFuZCB0aGUgZW5naW5lIGNsb3NlcyB0aGF0IGF0dGVtcHQncyBzY29wZTogdGhlXG4gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIG5vdGhpbmcgaXQgZG9lcyBhZnRlcndhcmRzIG1heSBsYW5kIGJlc2lkZSBhIGxhdGVyIGF0dGVtcHQuXG4gKlxuICogT05FIGFzeW5jIGZyYW1lIHdpdGggT05FIGF3YWl0IHBlciBhdHRlbXB0OiB0aGUgZW5naW5lIHJlbGllcyBvbiB0aGF0IHRvIGtlZXAgYSByZXRyaWVkIHN0YWdlJ3MgbWljcm90YXNrXG4gKiBzaGFwZSwgc28gcGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlciB0aGV5IGFsd2F5cyBkaWQuIFRoZSBlbmdpbmUgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmLFxuICogYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgcmFjZWQ6IHRydWVgKTsgYW55IG90aGVyIGNhbGxlciBnZXRzIHRoZSByYWNlIGhlcmUsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgd2FpdHMgb24gYW5cbiAqIGF0dGVtcHQgcGFzdCBpdHMgY2FwLlxuICpcbiAqIENBTExTIChQMikuIFRoZSBzYW1lIGxvb3AgcnVucyBhIGNhbGwgYSBzdGFnZSBtYWtlcyAoYGF0dGVtcHQvY2FsbC50cyDCtyBydW5DYWxsYCwga2luZCBgJ2NhbGwnYCwgaXRzIGB0YXJnZXRgIG9uXG4gKiBldmVyeSByZWNvcmQpIGFuZCB0aGUgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYC4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgREVBRExJTkUgb2YgZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCwgc29cbiAqIHRoZSBjYXAncyByZWFzb24gaXMgYnJhbmRlZCBhIHRpbWUgbGltaXQgKGBhdHRlbXB0L2RlYWRsaW5lLnRzIMK3IG1hcmtUaW1lTGltaXRgKTogYSBjYWxsIGN1dCBieSBpdHMgc3RhZ2VcbiAqIGF0dGVtcHQncyBjYXAgdGltZWQgb3V0LCBpdCB3YXMgbm90IGNhbmNlbGxlZC4gYGF0dGVtcHRFbmRzQXRgIHNheXMgd2hlbiBhbiBhdHRlbXB0IG11c3QgZW5kOyBhbiBgaW50ZXJydXB0KClgXG4gKiB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBhIHBhdXNlLCBsaWtlIGEgYFBhdXNlU2lnbmFsYCDigJQgbmV2ZXIgcmV0cmllZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCwgaXNEZWFkbGluZVJlYXNvbiwgbWFya1RpbWVMaW1pdCwgcmVhZERlYWRsaW5lLCBzZXRMb25nVGltZW91dCB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHsgZGVjaWRlQXR0ZW1wdCwgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBlZmZlY3RPZiwgcmVjb3JkZWRLZXlPZiwgcmVmdXNlS2V5bGVzc1JldHJ5LCB1bmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0VGltZW91dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcsIGF0dGVtcHRUaW1lb3V0TXMsIGNhcHBlZFdhaXRNcyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogV2hhdCBhIHNlcmllcyByZXBvcnRzLCBhbmQgdGhlIGVuZ2luZSdzIGJldHdlZW4tYXR0ZW1wdCBzdGVwLiBFdmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSdW5PcHRpb25zIHtcbiAgLyoqIFRoZSBzZXJpZXMgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBmb3IgYSBzdGFnZSBhdHRlbXB0LCBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGAnc3RhZ2UnYC4gKi9cbiAgcmVhZG9ubHkga2luZD86IEF0dGVtcHRLaW5kO1xuICAvKiogVGhlIG91dHNpZGUgdGFyZ2V0IGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgYSBjYWxsJ3MgKGAkY2FsbGAsIGBhdHRlbXB0KClgKTsgYWJzZW50IGZvciBhIHN0YWdlIGF0dGVtcHQuICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBzaWduYWwuIE9uY2UgaXQgaGFzIGFib3J0ZWQgKG90aGVyIHRoYW4gYXQgdGhlIGRlYWRsaW5lKSwgcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXNcbiAgICogKGByZWFzb246ICdhYm9ydGVkJ2ApOyBpdCBjdXRzIGEgd2FpdCBzaG9ydC4gQW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyByZWFzb24gaXMgcmVjb3JkZWQgYCdhYm9ydGVkJ2Ag4oCUIG9yXG4gICAqIGAndGltZW91dCdgIHdoZW4gdGhlIHJlYXNvbiBpcyB0aGUgZGVhZGxpbmUncyAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMuIEV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQ7IHJ1bGUgNiBzdG9wcyBhIHNlcmllcyB3aG9zZVxuICAgKiBuZXh0IHdhaXQgd291bGQgb3V0bGFzdCBpdCAoYG5vLXRpbWUtbGVmdGApLiBBYnNlbnQgKG9yIG5vdCBmaW5pdGUpID0gbm8gZGVhZGxpbmU6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKiogVGhlIGNsb2NrLCBlcG9jaCBtaWxsaXNlY29uZHMuIERlZmF1bHQgYERhdGUubm93YC4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgZmFpbGVkIGF0dGVtcHQncyBlcnJvci4gRGVmYXVsdCBgZXh0cmFjdEVycm9ySW5mb2AgKG5vIHJlZGFjdGlvbiBydWxlKS4gKi9cbiAgcmVhZG9ubHkgc2VydmU/OiAoZXJyb3I6IHVua25vd24pID0+IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIC8qKiBCZXR3ZWVuIGEgZmFpbGVkIGF0dGVtcHQgYW5kIHRoZSBuZXh0LCBiZWZvcmUgYGJhY2tvZmZNc2A6IHRoZSBlbmdpbmUgZGlzY2FyZHMgdGhlIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzLiAqL1xuICByZWFkb25seSBiZXR3ZWVuPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQsIGF0IGl0cyBlbmQsIHdpdGggaXRzIHNlcnZlZCBlcnJvciAoYHVuZGVmaW5lZGAgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYCkuICovXG4gIHJlYWRvbmx5IG9uQXR0ZW1wdD86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgLyoqIEEgZmFpbGVkIGF0dGVtcHQgdGhhdCBXSUxMIGJlIHJldHJpZWQg4oCUIGFmdGVyIGBiZXR3ZWVuYCBhbmQgYG9uQXR0ZW1wdGAsIGJlZm9yZSB0aGUgd2FpdC4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIG9mOiBudW1iZXIsIGRlbGF5TXM6IG51bWJlciwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvKSA9PiB2b2lkO1xuICAvKiogVGhlIHNlcmllcyBlbmRlZDogY2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgbGFzdCBgb25BdHRlbXB0YCAob3IgYWZ0ZXIgYSB3YWl0IHRoZSBydW4ncyBzaWduYWwgY3V0KS4gKi9cbiAgcmVhZG9ubHkgb25FbmQ/OiAoc3VtbWFyeTogQXR0ZW1wdFN1bW1hcnkpID0+IHZvaWQ7XG4gIC8qKiBgcmV0cnlPbmAgdGhyZXcg4oCUIHRoZSBhdHRlbXB0IGlzIHRyZWF0ZWQgYXMgZGVjbGluZWQ7IHRoZSBlbmdpbmUgbG9ncyB0aGUgdGhyb3cgaGVyZS4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeU9uVGhyZXc/OiAodGhyb3duOiB1bmtub3duKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGF0dGVtcHQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIg4oCUIGNhbGxlZCBTWU5DSFJPTk9VU0xZIHRoZSBtb21lbnQgaXRzIHNpZ25hbCBhYm9ydHMgKGl0cyBjYXAsIHRoZSBkZWFkbGluZSxcbiAgICogYSBjYW5jZWxsYXRpb24pLCBlbHNlIGFzIHNvb24gYXMgaXQgZmFpbGVkLiBXaGF0ZXZlciB0aGUgYWJhbmRvbmVkIGZ1bmN0aW9uIGRvZXMgYWZ0ZXJ3YXJkcyBpcyBub3QgdGhpc1xuICAgKiBzZXJpZXMnOiB0aGUgZW5naW5lIGZlbmNlcyBpdHMgc2NvcGUgaGVyZS4gT25jZSBwZXIgYXR0ZW1wdDsgbmV2ZXIgZm9yIGAnb2snYCBvciBgJ3BhdXNlZCdgIOKAlCBleGNlcHQgYW4gYXR0ZW1wdFxuICAgKiB0aGF0IFNUQVJURUQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgZmVuY2VkIG9uY2UgaXRzIHN5bmNocm9ub3VzIHBhcnQgaGFzIHJ1biAobm9ib2R5IHdhaXRzIGZvciBpdCkuXG4gICAqL1xuICByZWFkb25seSBvbkFiYW5kb24/OiAoYXR0ZW1wdDogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGNhbGxlciByYWNlcyBgcnVuYCdzIHByb21pc2UgYWdhaW5zdCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBpdHNlbGYg4oCUIHRoZSBlbmdpbmUgZG9lcywgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIChgU3RhZ2VSdW5uZXJgKSwgc28gYSBzdGFnZSBrZWVwcyBpdHMgb25lIGF3YWl0IHBlciBhdHRlbXB0LiBPdGhlcndpc2UgdGhlIHJ1bm5lciByYWNlcyBpdDogdGhlIHNlcmllcyBuZXZlclxuICAgKiB3YWl0cyBvbiBhbiBhdHRlbXB0IHBhc3QgaXRzIGNhcC5cbiAgICovXG4gIHJlYWRvbmx5IHJhY2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoYXQgYW4gYXR0ZW1wdCdzIGBvYnNlcnZlZChyZXBvcnQpYCBkb2VzIChQMikg4oCUIHRoZSBvd25lciBvZiB0aGUgYXR0ZW1wdCByZWNvcmRzIHRoZSByZXBvcnQ6IGBydW5DYWxsYCBoYW5kc1xuICAgKiBhIGNhbGwncyByZXBvcnRzIHRvIHRoZSBzY29wZSwgYGF0dGVtcHQoKWAga2VlcHMgaXRzIG93bi4gYGVuZGVkYCBzYXlzIHRoZSBhdHRlbXB0IGhhZCBhbHJlYWR5IGVuZGVkIHdoZW4gdGhlXG4gICAqIHJlcG9ydCBjYW1lICh0aGUgb3duZXIgZHJvcHMgaXQpLiBBYnNlbnQg4oCUIGEgc3RhZ2UgYXR0ZW1wdCdzIGNvbnRleHQsIHdob3NlIGBvYnNlcnZlZGAgdGhlIHNjb3BlJ3NcbiAgICogYCRhdHRlbXB0KClgIHJlcGxhY2VzIOKAlCBgb2JzZXJ2ZWRgIGlzIHJlZnVzZWQgd2l0aCBhIGBUeXBlRXJyb3JgLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzZXJ2ZT86IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCwgYXQ6IHsgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyOyByZWFkb25seSBlbmRlZDogYm9vbGVhbiB9KSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIG91dHNpZGUgc3lzdGVtIHRoZSB0YXJnZXQgdG91Y2hlcyAoUDMsIGRlc2lnbiDCpzMuMykuIEV2ZXJ5IHJlY29yZCB0aGVuIHNheXMgd2hhdCBpdHMgYXR0ZW1wdCBkaWQgdG8gaXRcbiAgICogKGBlZmZlY3RgKSBhbmQgbmFtZXMgdGhlIHN5c3RlbSBhbmQgdGhlIFJFQ09SREVEIGtleTsgZXZlcnkgYXR0ZW1wdCdzIGNvbnRleHQgY2FycmllcyB0aGUgUkVBTCBrZXkuIEEgc2VyaWVzXG4gICAqIHRoYXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciBhZnRlciBhbnkgYXR0ZW1wdCBvZiB1bmtub3duIGVmZmVjdCBmYWlscyB3aXRoIGBVbmtub3duRWZmZWN0RXJyb3JgIChpdHMgYGNhdXNlYCB0aGUgYXR0ZW1wdCdzIG93biBlcnJvcikg4oCUXG4gICAqIGV4Y2VwdCBhIHBhdXNlLCB3aGljaCBzdGF5cyBhIHBhdXNlLiBBIHRvdWNoaW5nIHNlcmllcyB0aGF0IG1heSByZXRyeSB3aXRob3V0IGEga2V5IGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nXG4gICAqIHJ1bnM6IHRoZSBsYXcncyBsYXN0IGRvb3IuXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBFZmZlY3RUYXJnZXQ7XG59XG5cbi8qKiBXaGVuIGVhY2ggbGl2ZSBhdHRlbXB0IG11c3QgZW5kLCBlcG9jaCBtcyDigJQgYHN0YXJ0ZWRBdCArIGNhcGAsIGZvciBhbiBhdHRlbXB0IHRoYXQgaGFzIGEgY2FwIChgYXR0ZW1wdEVuZHNBdGApLiAqL1xuY29uc3QgQVRURU1QVF9FTkRTID0gbmV3IFdlYWtNYXA8QXR0ZW1wdENvbnRleHQsIG51bWJlcj4oKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBhdHRlbXB0IGJlaGluZCBgY29udGV4dGAgbXVzdCBlbmQsIGVwb2NoIG1pbGxpc2Vjb25kcyDigJQgaXRzIHN0YXJ0IHBsdXMgaXRzIGNhcCAoYG1pbih0aW1lb3V0TXMsIHRpbWVcbiAqIGxlZnQpYCwgc28gbmV2ZXIgcGFzdCB0aGUgcnVuJ3MgZGVhZGxpbmUpIOKAlCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gdW5jYXBwZWQgYXR0ZW1wdC4gQSBjYWxsIG1hZGUgaW5zaWRlIHRoZVxuICogYXR0ZW1wdCBydW5zIHVuZGVyIGl0IGFzIGl0cyBkZWFkbGluZSAoYGF0dGVtcHQvY2FsbC50c2ApLiBPbmx5IHRoZSBydW5uZXIncyBvd24gY29udGV4dHMgYXJlIGtub3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0ZW1wdEVuZHNBdChjb250ZXh0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBBVFRFTVBUX0VORFMuZ2V0KGNvbnRleHQpO1xufVxuXG4vKiogQSBmYWlsZWQgYXR0ZW1wdCdzIHRocm93biB2YWx1ZSwgYm94ZWQ6IGB1bmRlZmluZWRgIGlzIGEgdmFsdWUgYSBzdGFnZSBtYXkgdGhyb3cuICovXG5pbnRlcmZhY2UgRmFpbHVyZSB7XG4gIHJlYWRvbmx5IGVycm9yOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFJ1biBgcnVuYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aGUgcG9saWN5IHN0b3BzIGl0OyByZXNvbHZlIHdpdGggaXRzIHZhbHVlIG9yIHJlamVjdCB3aXRoIHRoZSBMQVNUIGF0dGVtcHQnc1xuICogb3duIGVycm9yLiBgcnVuKG4pYCBpcyBjYWxsZWQgd2l0aCB0aGUgYXR0ZW1wdCBudW1iZXIsIDEtYmFzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BdHRlbXB0czxUPihcbiAgcnVuOiAoYXR0ZW1wdDogbnVtYmVyLCBjb250ZXh0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gIHBvbGljeTogUmV0cnlQb2xpY3ksXG4gIG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG9mID0gYXR0ZW1wdENlaWxpbmcocG9saWN5LmF0dGVtcHRzKTtcbiAgY29uc3QgcnVsZXMgPSByZXRyeVJ1bGVzKHsgYXR0ZW1wdHM6IG9mIH0pO1xuICBjb25zdCBub3cgPSBvcHRpb25zLm5vdyA/PyBEYXRlLm5vdztcbiAgY29uc3QgZGVhZGxpbmUgPSByZWFkRGVhZGxpbmUob3B0aW9ucy5kZWFkbGluZSk7XG4gIGNvbnN0IG93bkNhcCA9IGF0dGVtcHRUaW1lb3V0TXMocG9saWN5LnRpbWVvdXRNcyk7XG4gIGNvbnN0IHRhbGx5ID0gbmV3IFNlcmllc1RhbGx5KCk7XG4gIGlmIChvcHRpb25zLmVmZmVjdCkgcmVmdXNlS2V5bGVzc1JldHJ5KG9wdGlvbnMuZWZmZWN0LCBvZik7XG4gIC8qKiBBbiBlYXJsaWVyIGF0dGVtcHQgb2YgdGhpcyB0b3VjaGluZyBzZXJpZXMgbGVmdCB0aGUgZWZmZWN0IHVua25vd24g4oCUIGEgbGF0ZXIgYW5zd2VyIG9mIGBub25lYCBjYW5ub3QgY2xlYXIgaXQuICovXG4gIGxldCB1bmtub3duU29GYXIgPSBmYWxzZTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBub3coKTtcbiAgICBjb25zdCBsaXZlID0gbmV3IExpdmVBdHRlbXB0KG9wdGlvbnMsIGF0dGVtcHQsIG9mLCBzdGFydGVkQXQsIGRlYWRsaW5lLCBvd25DYXAsIG5vdyk7XG4gICAgbGV0IHZhbHVlOiBUIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gcnVuKGF0dGVtcHQsIGxpdmUuY29udGV4dCk7XG4gICAgICAvLyBTdGFydGVkIHVuZGVyIGEgc2lnbmFsIHRoYXQgaGFkIEFMUkVBRFkgYWJvcnRlZCAoYSBkZWNpZGVyIGVudGVyZWQgYWZ0ZXIgYSBjYW5jZWwpOiBpdHMgc3luY2hyb25vdXMgcGFydFxuICAgICAgLy8gcmFuIGFzIGl0IGFsd2F5cyBkaWQ7IGZyb20gaGVyZSBvbiBub2JvZHkgd2FpdHMgZm9yIGl0LCBzbyBub3RoaW5nIGl0IGRvZXMgYWZ0ZXIgaXRzIGZpcnN0IGF3YWl0IGxhbmRzLlxuICAgICAgaWYgKGxpdmUuY29udGV4dC5zaWduYWwuYWJvcnRlZCkgbGl2ZS5hYmFuZG9uU3RhcnRlZCgpO1xuICAgICAgdmFsdWUgPSBhd2FpdCAob3B0aW9ucy5yYWNlZCA/IHBlbmRpbmcgOiBsaXZlLnJhY2UocGVuZGluZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBmYWlsdXJlID0geyBlcnJvciB9O1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbk1zID0gTWF0aC5tYXgoMCwgbm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lT2YoZmFpbHVyZSwgb3B0aW9ucy5zaWduYWwsIGxpdmUudGltZW91dFJlYXNvbik7XG4gICAgbGl2ZS5lbmQob3V0Y29tZSk7XG4gICAgY29uc3QgaW5wdXRzID0gbmV3IEF0dGVtcHRJbnB1dFJlYWRlcihwb2xpY3ksIG9wdGlvbnMsIGF0dGVtcHQsIG9mLCBvdXRjb21lLCBmYWlsdXJlLCBkZWFkbGluZSwgbm93KTtcblxuICAgIGxldCBkZWNpc2lvbiA9IGRlY2lkZUF0dGVtcHQocnVsZXMsIGlucHV0cy5yZWFkKTtcbiAgICAvLyA5LjE1IGFza2VkIHJldHJ5T24sIFRIRU4gY2hlY2tlZCB0aGUgc2lnbmFsLiBEZWNpZGluZyBhZ2FpbiByZWFkcyB0aGUgc2lnbmFsIGFmcmVzaDogcnVsZSAzIG5vdyBtYXRjaGVzLFxuICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHVzZXIgZnVuY3Rpb24sIHNvIG5vbmUgaXMgYXNrZWQgdHdpY2Ug4oCUIGFuZCBub3RoaW5nIGlzIGRpc2NhcmRlZCwgbm90aGluZyB3YWl0ZWQgZm9yLlxuICAgIGlmIChkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknICYmIGlzQ2FuY2VsbGVkKG9wdGlvbnMuc2lnbmFsKSkgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG5cbiAgICAvLyBUaGUgZGlzY2FyZCBjb21lcyBCRUZPUkUgdGhlIHdhaXQncyBsZW5ndGggaXMgYXNrZWQgZm9yLCBhcyBpdCBkaWQgaW4gOS4xNSDigJQgd2l0aG91dCBhIGRlYWRsaW5lLiBVbmRlciBvbmUsXG4gICAgLy8gcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoIHRvIGRlY2lkZSwgc28gYGJhY2tvZmZNc2Agd2FzIGFza2VkIGR1cmluZyB0aGUgZGVjaXNpb24sIGJlZm9yZSB0aGUgZGlzY2FyZC5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5Jykgb3B0aW9ucy5iZXR3ZWVuPy4oYXR0ZW1wdCk7XG4gICAgY29uc3QgZGVsYXlNcyA9IGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScgPyBpbnB1dHMuZGVsYXlNcygpIDogaW5wdXRzLmRlbGF5SWZBc2tlZCgpO1xuICAgIGNvbnN0IHRpbWVMZWZ0TXMgPSBkZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5wdXRzLnRpbWVMZWZ0KCk7XG5cbiAgICBjb25zdCBjYXRlZ29yeSA9IGlucHV0cy5jYXRlZ29yeSgpO1xuICAgIGNvbnN0IHNlcnZlZCA9IGlucHV0cy5mYWlsZWQgPyAob3B0aW9ucy5zZXJ2ZSA/PyBleHRyYWN0RXJyb3JJbmZvKShpbnB1dHMuZmFpbGVkLmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlZmZlY3QgPSBvcHRpb25zLmVmZmVjdCA/IGVmZmVjdE9mKGlucHV0cy5vdXRjb21lLCBmYWlsdXJlPy5lcnJvcikgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSBvcHRpb25zLmVmZmVjdCA/IHJlY29yZGVkS2V5T2Yob3B0aW9ucy5lZmZlY3QpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY29yZCA9IGZyZWV6ZURlZXA8QXR0ZW1wdFJlY29yZD4oe1xuICAgICAgc2VyaWVzOiBvcHRpb25zLnNlcmllcyxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCA/PyAnc3RhZ2UnLFxuICAgICAgLi4uKG9wdGlvbnMudGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgeyB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IH0pLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc3RhcnRlZEF0LFxuICAgICAgZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IGlucHV0cy5vdXRjb21lLFxuICAgICAgLi4uKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeSB9KSxcbiAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5ldmlkZW5jZSxcbiAgICAgIG5leHQ6IGRlY2lzaW9uLm5leHQsXG4gICAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgIC4uLihpbnB1dHMucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgICAgLi4uKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiB7IGRlbGF5TXMgfSksXG4gICAgICAuLi4obGl2ZS5jYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBsaXZlLmNhcE1zIH0pLFxuICAgICAgLi4uKHRpbWVMZWZ0TXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVMZWZ0TXMgfSksXG4gICAgICAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBlcnJvcjogcmVjb3JkZWRFcnJvcihzZXJ2ZWQpIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzeXN0ZW06IG9wdGlvbnMuZWZmZWN0LnN5c3RlbSB9KSxcbiAgICAgIC4uLihyZWNvcmRlZEtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5IH0pLFxuICAgICAgLi4uKGVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0IH0pLFxuICAgIH0pO1xuICAgIHRhbGx5LmFkZChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQuZWZmZWN0ID09PSAndW5rbm93bicpIHVua25vd25Tb0ZhciA9IHRydWU7XG4gICAgaWYgKHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeShsYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpKSk7XG4gICAgb3B0aW9ucy5vbkF0dGVtcHQ/LihyZWNvcmQsIHNlcnZlZCk7XG5cbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdkb25lJykgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gICAgaWYgKHJlY29yZC5uZXh0ID09PSAnc3RvcCcpIHRocm93IHN0b3BFcnJvcihvcHRpb25zLmVmZmVjdCwgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIpO1xuXG4gICAgb3B0aW9ucy5vblJldHJ5Py4oYXR0ZW1wdCwgb2YsIGRlbGF5TXMgPz8gMCwgc2VydmVkIGFzIFN0cnVjdHVyZWRFcnJvckluZm8pO1xuICAgIGlmIChkZWxheU1zICE9PSB1bmRlZmluZWQgJiYgZGVsYXlNcyA+IDApIGF3YWl0IHNsZWVwKGRlbGF5TXMsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAvLyBObyBhdHRlbXB0IGZvbGxvd3MgYSBjdXQgd2FpdCwgc28gbm9uZSBpcyByZWNvcmRlZDogdGhlIHN1bW1hcnkgc2F5cyBob3cgdGhlIHNlcmllcyBlbmRlZC4gTm8gYXR0ZW1wdFxuICAgIC8vIFNUQVJUUyBhdCBvciBwYXN0IHRoZSBkZWFkbGluZSBlaXRoZXIg4oCUIHJ1bGUgNiBkZWNpZGVkIHdpdGggdGhlIGNsb2NrLCBhbmQgdGhlIGNsb2NrIG1heSBoYXZlIG1vdmVkIG9uLlxuICAgIGNvbnN0IGN1dCA9IGlzQ2FuY2VsbGVkKG9wdGlvbnMuc2lnbmFsKVxuICAgICAgPyAnYWJvcnRlZCdcbiAgICAgIDogb3B0aW9ucy5zaWduYWw/LmFib3J0ZWQgfHwgKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgbm93KCkgPj0gZGVhZGxpbmUpXG4gICAgICA/ICduby10aW1lLWxlZnQnXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMub25FbmQ/Lih0YWxseS5zdW1tYXJ5KHsgLi4ubGFzdE9mKHJlY29yZCwgdW5rbm93blNvRmFyKSwgbmV4dDogJ3N0b3AnLCByZWFzb246IGN1dCB9KSk7XG4gICAgICB0aHJvdyBzdG9wRXJyb3Iob3B0aW9ucy5lZmZlY3QsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RvcHBlZCBzZXJpZXMgdGhyb3dzOiB0aGUgbGFzdCBhdHRlbXB0J3Mgb3duIGVycm9yIOKAlCBvciwgb24gYSB0b3VjaGluZyB0YXJnZXQgd2hlcmUgQU5ZIGF0dGVtcHQgbGVmdCB0aGVcbiAqIGVmZmVjdCB1bmtub3duLCBgVW5rbm93bkVmZmVjdEVycm9yYCB3aXRoIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBhcyBpdHMgY2F1c2UuIEFuIGVhcmxpZXIgdGltZW91dCBtYXkgaGF2ZVxuICogYXBwbGllZCB0aGUgZWZmZWN0OyBhIGxhdGVyIGF0dGVtcHQgdGhhdCBzYXlzIFwibm90aGluZyB3YXMgc2VudFwiIHNwZWFrcyBmb3IgaXRzZWxmIG9ubHksIHNvIGl0IGNhbm5vdCB0dXJuIHRoZVxuICogc2VyaWVzIGludG8gYSBwbGFpbiBmYWlsdXJlLiBBIHBhdXNlIGlzIG5ldmVyIGNvbnZlcnRlZDogaXQgaXMgY29udHJvbCBmbG93LlxuICovXG5mdW5jdGlvbiBzdG9wRXJyb3IoXG4gIGVmZmVjdDogRWZmZWN0VGFyZ2V0IHwgdW5kZWZpbmVkLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbik6IHVua25vd24ge1xuICBpZiAoZWZmZWN0ID09PSB1bmRlZmluZWQgfHwgIXVua25vd25Tb0ZhciB8fCByZWNvcmQub3V0Y29tZSA9PT0gJ3BhdXNlZCcpIHJldHVybiBmYWlsdXJlPy5lcnJvcjtcbiAgcmV0dXJuIHVua25vd25FZmZlY3RFcnJvcihlZmZlY3QsIHJlY29yZCwgZmFpbHVyZT8uZXJyb3IpO1xufVxuXG4vKipcbiAqIE9uZSBhdHRlbXB0IGluIGZsaWdodDogaXRzIGNhcCwgaXRzIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIGl0cyBvd24gdGltZXIpLCBhbmQgdGhlIGZlbmNlLiBJdHMgb3duXG4gKiB0aW1lciBpcyBhcm1lZCB3aGVuIHRoZSBwb2xpY3kncyBjYXAgaXMgU0hPUlRFUiB0aGFuIHRoZSB0aW1lIGxlZnQ7IGF0IHRoZSBkZWFkbGluZSB0aGUgcnVuJ3Mgb3duIHNpZ25hbCBhYm9ydHMsXG4gKiB3aXRoIHRoZSBkZWFkbGluZSdzIHJlYXNvbiAoc28gYSBydW4gcmVqZWN0cyB3aXRoIHRoZSByZWFzb24gaXQgYWx3YXlzIGRpZCkuIEV2ZXJ5dGhpbmcgaXQgYXJtcyBpcyByZWxlYXNlZFxuICogd2hlbiB0aGUgYXR0ZW1wdCBlbmRzLlxuICovXG5jbGFzcyBMaXZlQXR0ZW1wdCB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIGNhcCB0aGlzIGF0dGVtcHQgcnVucyB1bmRlciDigJQgYG1pbih0aW1lb3V0TXMsIHRpbWUgbGVmdClgLCBuZXZlciBuZWdhdGl2ZTsgYWJzZW50IHdoZW4gdW5jYXBwZWQuICovXG4gIHJlYWRvbmx5IGNhcE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVhc29uIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGFib3J0ZWQgd2l0aCDigJQgc2V0IG9ubHkgaWYgaXQgZmlyZWQuICovXG4gIHRpbWVvdXRSZWFzb246IEF0dGVtcHRUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsVGltZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wb3NlZDogeyByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsOyBkaXNwb3NlKCk6IHZvaWQgfTtcbiAgcHJpdmF0ZSBhYmFuZG9uZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuIGBvYnNlcnZlZGAgcmVwb3J0IGFmdGVyIHRoaXMgaXMgdGhlIG93bmVyJ3MgdG8gcmVmdXNlLiAqL1xuICBwcml2YXRlIGVuZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BYm9ydCA9ICgpID0+IHRoaXMuYWJhbmRvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgb2Y6IG51bWJlcixcbiAgICBzdGFydGVkQXQ6IG51bWJlcixcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG93bkNhcDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG5vdzogKCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsZWZ0ID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKG93bkNhcCA/PyBJbmZpbml0eSwgbGVmdCk7XG4gICAgdGhpcy5jYXBNcyA9IE51bWJlci5pc0Zpbml0ZShjYXApID8gY2FwIDogdW5kZWZpbmVkO1xuICAgIC8vIEl0cyBvd24gdGltZXIgd2hlbiBpdHMgb3duIGNhcCBpcyB0aGUgc2hvcnRlciwgb3Igd2hlbiBubyBydW4gc2lnbmFsIHdpbGwgYWJvcnQgYXQgdGhlIGRlYWRsaW5lIChhIGNhbGxlclxuICAgIC8vIHdpdGggYSBkZWFkbGluZSBhbmQgbm8gc2lnbmFsKS4gT3RoZXJ3aXNlIHRoZSBydW4ncyBzaWduYWwgZW5kcyBpdCBhdCB0aGUgZGVhZGxpbmUsIHdpdGggdGhlIGRlYWRsaW5lJ3MgcmVhc29uLlxuICAgIGNvbnN0IG93blRpbWVyID0gdGhpcy5jYXBNcyAhPT0gdW5kZWZpbmVkICYmICgob3duQ2FwICE9PSB1bmRlZmluZWQgJiYgb3duQ2FwIDwgbGVmdCkgfHwgIW9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBvd24gPSBvd25UaW1lciA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAob3duKSB7XG4gICAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXMgYXMgbnVtYmVyO1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gQSB0aW1lIGxpbWl0LCBicmFuZGVkIGxpa2UgdGhlIHJ1bidzIGRlYWRsaW5lOiBhIGNhbGwgbWFkZSBpbnNpZGUgdGhpcyBhdHRlbXB0IHRoYXQgaXQgY3V0cyB0aW1lZCBvdXQuXG4gICAgICAgIHRoaXMudGltZW91dFJlYXNvbiA9IG1hcmtUaW1lTGltaXQobmV3IEF0dGVtcHRUaW1lb3V0RXJyb3IoYXR0ZW1wdCwgY2FwTXMpKTtcbiAgICAgICAgb3duLmFib3J0KHRoaXMudGltZW91dFJlYXNvbik7XG4gICAgICB9LCBjYXBNcyk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZWQgPSBhbnlTaWduYWwoW29wdGlvbnMuc2lnbmFsLCBvd24/LnNpZ25hbF0pO1xuICAgIC8vIFJlZ2lzdGVyZWQgQkVGT1JFIHRoZSBmdW5jdGlvbiBydW5zLCBzbyB0aGUgZmVuY2UgY2xvc2VzIGJlZm9yZSBhbnkgbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIGFkZHMuIEEgc2lnbmFsXG4gICAgLy8gQUxSRUFEWSBhYm9ydGVkIChhIGRlY2lkZXIgZW50ZXJlZCBhZnRlciBhIGNhbmNlbCDigJQgbm8gYWJvcnQgY2hlY2sgcHJlY2VkZXMgaXQpIGRvZXMgbm90IGZlbmNlIHRoZSBhdHRlbXB0XG4gICAgLy8gYmVmb3JlIGl0IHJ1bnM6IGl0IHJ1bnMgYXMgaXQgZGlkIGJlZm9yZSB0aGUgZmVuY2UgZXhpc3RlZCwgYW5kIGlzIGZlbmNlZCB3aGVuIGl0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIuXG4gICAgdGhpcy5jb21wb3NlZC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNvbXBvc2VkLnNpZ25hbDtcbiAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXM7XG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBzZXJpZXM6IG9wdGlvbnMuc2VyaWVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc2lnbmFsLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIC4uLihjYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXBNcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3lzdGVtOiBvcHRpb25zLmVmZmVjdC5zeXN0ZW0gfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogb3B0aW9ucy5lZmZlY3QuaWRlbXBvdGVuY3lLZXkgfSksXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogZGVhZGxpbmUgLSBub3coKSksXG4gICAgICBvYnNlcnZlZDogKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5vYnNlcnZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JzZXJ2ZWQoKTogcmVwb3J0IGFuIG91dHNpZGUgYXR0ZW1wdCB0aHJvdWdoIGBzY29wZS4kYXR0ZW1wdCgpLm9ic2VydmVkKC4uLilgJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5vYnNlcnZlKHJlcG9ydCwgeyBhdHRlbXB0LCBlbmRlZDogdGhpcy5lbmRlZCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGNhcE1zICE9PSB1bmRlZmluZWQpIEFUVEVNUFRfRU5EUy5zZXQodGhpcy5jb250ZXh0LCBzdGFydGVkQXQgKyBjYXBNcyk7XG4gIH1cblxuICAvKiogYHZhbHVlYCwgb3IgdGhlIGF0dGVtcHQgc2lnbmFsJ3MgcmVhc29uIHRoZSBtb21lbnQgaXQgYWJvcnRzIGZpcnN0IOKAlCB0aGUgZW5naW5lIHN0b3BzIHdhaXRpbmcgYXQgdGhlIGNhcC4gKi9cbiAgcmFjZTxUPih2YWx1ZTogUHJvbWlzZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHwgVCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY29tcG9zZWQuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBBbHJlYWR5IGFib3J0ZWQgKHRoZSBmdW5jdGlvbiBhYm9ydGVkIGl0IGFzIGl0IHJhbik6IGEgdmFsdWUgdGhhdCBhbHJlYWR5IHNldHRsZWQgc3RpbGwgd2lucyDigJQgaXRzXG4gICAgICAvLyByZWFjdGlvbiB3YXMgcXVldWVkIGFib3ZlLCBmaXJzdCDigJQgYW5kIGEgcGVuZGluZyBvbmUgaXMgY3V0IG9uIHRoZSBuZXh0IG1pY3JvdGFzay5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcXVldWVNaWNyb3Rhc2sob25BYm9ydCk7XG4gICAgICBlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdCBpcyBvdmVyOiByZWxlYXNlIHRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyczsgZmVuY2UgaXQgaWYgaXQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIuICovXG4gIGVuZChvdXRjb21lOiBBdHRlbXB0T3V0Y29tZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FuY2VsVGltZXI/LigpO1xuICAgIHRoaXMuY29tcG9zZWQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLmNvbXBvc2VkLmRpc3Bvc2UoKTtcbiAgICBpZiAob3V0Y29tZSAhPT0gJ29rJyAmJiBvdXRjb21lICE9PSAncGF1c2VkJykgdGhpcy5hYmFuZG9uKCk7XG4gIH1cblxuICAvKiogRmVuY2UgYW4gYXR0ZW1wdCB0aGF0IHN0YXJ0ZWQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgb25jZSBpdHMgc3luY2hyb25vdXMgcGFydCBoYXMgcnVuLiAqL1xuICBhYmFuZG9uU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFiYW5kb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWJhbmRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYmFuZG9uZWQpIHJldHVybjtcbiAgICB0aGlzLmFiYW5kb25lZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLm9uQWJhbmRvbj8uKHRoaXMuYXR0ZW1wdCk7XG4gIH1cbn1cblxuLyoqIFRoZSBzaWduYWwgYWJvcnRlZCBhdCBhIHRpbWUgbGltaXQg4oCUIHRoZSBydW4ncyBkZWFkbGluZSwgb3IgYSBjYWxsJ3MgYXR0ZW1wdCBjYXAg4oCUIG5vdCBieSBhIGNhbmNlbGxhdGlvbi4gKi9cbmZ1bmN0aW9uIHRpbWVkT3V0KHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiBpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgYXR0ZW1wdCBpdHNlbGYgZW5kZWQuIEEgdGhyb3duIHZhbHVlIGlzIHRoZSBhdHRlbXB0J3Mgb3duIGZhaWx1cmUgdW5sZXNzIGl0IElTIHdoYXQgYSBzaWduYWwgYWJvcnRlZFxuICogd2l0aCAoU3RhZ2VSdW5uZXIncyByYWNlIHJlamVjdHMgd2l0aCBpdDsgYSBzdGFnZSBtYXkgcmV0aHJvdyBpdCk6IGl0cyBvd24gY2FwJ3MgYEF0dGVtcHRUaW1lb3V0RXJyb3JgIG9yIHRoZVxuICogcnVuJ3MgZGVhZGxpbmUg4oaSIGAndGltZW91dCdgOyB0aGUgcnVuJ3MgY2FuY2VsbGF0aW9uIOKGkiBgJ2Fib3J0ZWQnYC5cbiAqL1xuZnVuY3Rpb24gb3V0Y29tZU9mKFxuICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0UmVhc29uOiBBdHRlbXB0VGltZW91dEVycm9yIHwgdW5kZWZpbmVkLFxuKTogQXR0ZW1wdE91dGNvbWUge1xuICBpZiAoIWZhaWx1cmUpIHJldHVybiAnb2snO1xuICAvLyBBbiBgaW50ZXJydXB0KClgIHRocm93biBpbnNpZGUgYSBjYWxsIGlzIGNvbnZlcnRlZCB0byBhIHBhdXNlIGF0IHRoZSBzdGFnZSBib3VuZGFyeSwgcGFzdCB0aGlzIHJ1bm5lci5cbiAgaWYgKGlzUGF1c2VTaWduYWwoZmFpbHVyZS5lcnJvcikgfHwgaXNJbnRlcnJ1cHRTaWduYWwoZmFpbHVyZS5lcnJvcikpIHJldHVybiAncGF1c2VkJztcbiAgLy8gSXRzIG93biBjYXAgcmFuIG91dCDigJQgdGhlIGF0dGVtcHQncyB0aW1lciBpcyB0aGUgb25lIHRoYXQgZmlyZWQsIGFuZCB0aGUgYXR0ZW1wdCB0aHJldyB3aGF0IGl0IGFib3J0ZWQgd2l0aC5cbiAgaWYgKHRpbWVvdXRSZWFzb24gIT09IHVuZGVmaW5lZCAmJiBmYWlsdXJlLmVycm9yID09PSB0aW1lb3V0UmVhc29uKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkICE9PSB0cnVlIHx8IGZhaWx1cmUuZXJyb3IgIT09IHNpZ25hbC5yZWFzb24pIHJldHVybiAnZmFpbGVkJztcbiAgLy8gVGhlIHJ1bidzIHNpZ25hbCBlbmRlZCBpdDogYXQgdGhlIGRlYWRsaW5lIHRoZSBhdHRlbXB0IHJhbiBvdXQgb2YgdGltZSAobGF3IDQpOyBvdGhlcndpc2UgaXQgd2FzIGNhbmNlbGxlZC5cbiAgcmV0dXJuIGlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbikgPyAndGltZW91dCcgOiAnYWJvcnRlZCc7XG59XG5cbi8qKlxuICogT25lIGF0dGVtcHQncyBkZWNpc2lvbiBpbnB1dHMsIGVhY2ggcmVhZCBvbmx5IHdoZW4gYSBydWxlIHJlYWNoZXMgaXQgKGBkZWNpZGVBdHRlbXB0YCdzIHJlYWRlcik6IHRoZSB1c2VyJ3NcbiAqIGByZXRyeU9uYCBhbmQgYGJhY2tvZmZNc2AgcnVuIGF0IG1vc3Qgb25jZSBlYWNoLCBhbmQgb25seSB3aGVuIHRoZSA5LjE1IGxvb3Agd291bGQgaGF2ZSBydW4gdGhlbS5cbiAqL1xuY2xhc3MgQXR0ZW1wdElucHV0UmVhZGVyIHtcbiAgLyoqIFRoZSBmYWlsdXJlIGEgY2F0ZWdvcnkgYW5kIGEgc2VydmVkIGVycm9yIGFyZSByZWFkIGZyb20g4oCUIG5vbmUgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYC4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAvKiogYHRydWVgIG9uY2UgYHJldHJ5T25gIHRocmV3IChpdHMgdmVyZGljdCBpcyB0aGVuIGBmYWxzZWApLiAqL1xuICByZXRyeU9uVGhyZXcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeU9uVmVyZGljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB3YWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmFpbHVyZUNhdGVnb3J5OiBBdHRlbXB0Q2F0ZWdvcnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2F0ZWdvcnlSZWFkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsZWZ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLFxuICAgIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZmFpbGVkID0gZmFpbHVyZSAmJiBvdXRjb21lICE9PSAncGF1c2VkJyA/IGZhaWx1cmUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogT25lIGlucHV0IGJ5IGl0cyBgQXR0ZW1wdElucHV0c2Aga2V5LiAqL1xuICByZWFkb25seSByZWFkID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ291dGNvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5vdXRjb21lO1xuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSgpO1xuICAgICAgY2FzZSAnYWJvcnRlZCc6XG4gICAgICAgIC8vIExpdmU6IGEgZGVjaXNpb24gdGFrZW4gYWdhaW4gYWZ0ZXIgYHJldHJ5T25gIHNlZXMgYW4gYWJvcnQgcmFpc2VkIGluc2lkZSBpdC4gVGhlIGRlYWRsaW5lIGlzIG5vdCBhXG4gICAgICAgIC8vIGNhbmNlbGxhdGlvbiDigJQgcnVsZSA2IG93bnMgaXQuXG4gICAgICAgIHJldHVybiBpc0NhbmNlbGxlZCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGNhc2UgJ2F0dGVtcHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0O1xuICAgICAgY2FzZSAnb2YnOlxuICAgICAgICByZXR1cm4gdGhpcy5vZjtcbiAgICAgIGNhc2UgJ3RpbWVMZWZ0TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy50aW1lTGVmdCgpO1xuICAgICAgY2FzZSAndGltZUxlZnRBZnRlcldhaXRNcyc6XG4gICAgICAgIC8vIFdpdGhvdXQgYSBkZWFkbGluZSB0aGUgdGltZSBsZWZ0IGlzIHVuYm91bmRlZCwgYmVmb3JlIGFueSB3YWl0IGFuZCBhZnRlciBpdCDigJQgc28gZGVjaWRpbmcgbmVlZHMgbm9cbiAgICAgICAgLy8gd2FpdCwgYW5kIGBiYWNrb2ZmTXNgIGlzIGFza2VkIGFmdGVyIHRoZSBkaXNjYXJkLCBhcyBpbiA5LjE1LiBVbmRlciBvbmUsIHRoZSB3YWl0J3MgbGVuZ3RoIGRlY2lkZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnVuYm91bmRlZCgpID8gSW5maW5pdHkgOiB0aGlzLnRpbWVMZWZ0KCkgLSB0aGlzLmRlbGF5TXMoKTtcbiAgICAgIGNhc2UgJ2RlbGF5TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWxheU1zKCk7XG4gICAgICBjYXNlICdyZXRyeU9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlPbigpO1xuICAgICAgY2FzZSAna2V5UHJlc2VudCc6XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBmYWlsdXJlJ3MgY2F0ZWdvcnksIHJlYWQgb25jZSDigJQgYXQgdGhlIGZpcnN0IHJ1bGUgdGhhdCBhc2tzLCBvciBhZnRlciB0aGUgZGVjaXNpb24uICovXG4gIGNhdGVnb3J5KCk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmNhdGVnb3J5UmVhZCkge1xuICAgICAgdGhpcy5jYXRlZ29yeVJlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5mYWlsdXJlQ2F0ZWdvcnkgPSB0aGlzLmZhaWxlZCA/IGVycm9yQ2F0ZWdvcnkodGhpcy5mYWlsZWQuZXJyb3IsIHRoaXMub3V0Y29tZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDYXRlZ29yeTtcbiAgfVxuXG4gIC8qKiBUaGUgcG9saWN5J3Mgd2FpdCBhZnRlciB0aGlzIGF0dGVtcHQgKGByZXNvbHZlQmFja29mZk1zYCksIGFza2VkIG9uY2Ug4oCUIGNhcHBlZCBhdCBpdHMgYG1heEJhY2tvZmZNc2AuICovXG4gIGRlbGF5TXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMud2FpdCA/Pz0gY2FwcGVkV2FpdE1zKFxuICAgICAgcmVzb2x2ZUJhY2tvZmZNcyh0aGlzLnBvbGljeS5iYWNrb2ZmTXMsIHRoaXMuYXR0ZW1wdCwgdGhpcy5mYWlsZWQ/LmVycm9yKSxcbiAgICAgIHRoaXMucG9saWN5Lm1heEJhY2tvZmZNcyxcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBUaGUgd2FpdCwgaWYgdGhlIGRlY2lzaW9uIGFscmVhZHkgYXNrZWQgZm9yIGl0IChydWxlIDYgdW5kZXIgYSBkZWFkbGluZSk7IG5ldmVyIGFza3MgYGJhY2tvZmZNc2AgaXRzZWxmLiAqL1xuICBkZWxheUlmQXNrZWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53YWl0O1xuICB9XG5cbiAgLyoqIE1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGRlYWRsaW5lIGF0IHRoZSBkZWNpc2lvbiwgcmVhZCBvbmNlIChgSW5maW5pdHlgIHdpdGhvdXQgb25lKS4gKi9cbiAgdGltZUxlZnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51bmJvdW5kZWQoKSkgcmV0dXJuIEluZmluaXR5O1xuICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2xvY2sgPSB0aGlzLmRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IHRoaXMuZGVhZGxpbmUgLSB0aGlzLm5vdygpO1xuICAgICAgLy8gQSB0aW1lIGxpbWl0IGFscmVhZHkgcmVhY2hlZCDigJQgdGhlIHNpZ25hbCBhYm9ydGVkIGF0IHRoZSBkZWFkbGluZSAob3IsIGZvciBhIGNhbGwsIGF0IGl0cyBhdHRlbXB0J3MgY2FwKSDigJRcbiAgICAgIC8vIGxlYXZlcyBubyB0aW1lLCB3aGF0ZXZlciB0aGUgY2xvY2sgc2F5czogYSBob3N0IHRpbWVyIG1heSBmaXJlIGEgbWlsbGlzZWNvbmQgYmVmb3JlIHRoZSBjbG9jayBnZXRzIHRoZXJlLlxuICAgICAgdGhpcy5sZWZ0ID0gdGltZWRPdXQodGhpcy5vcHRpb25zLnNpZ25hbCkgPyBNYXRoLm1pbihjbG9jaywgMCkgOiBjbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIC8qKiBObyBkZWFkbGluZSBhbmQgbm8gdGltZSBsaW1pdCByZWFjaGVkOiB0aGUgdGltZSBsZWZ0IGlzIGBJbmZpbml0eWAsIGFuZCBubyB3YWl0IG5lZWQgYmUgYXNrZWQgZm9yLiAqL1xuICBwcml2YXRlIHVuYm91bmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWFkbGluZSA9PT0gdW5kZWZpbmVkICYmICF0aW1lZE91dCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJldHJ5T25gIGdhdGUsIGFza2VkIG9uY2UuIEEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuIG9uZSBuZXZlciBsb29wcy4gKi9cbiAgcHJpdmF0ZSByZXRyeU9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnJldHJ5T25WZXJkaWN0ID09PSB1bmRlZmluZWQpIHRoaXMucmV0cnlPblZlcmRpY3QgPSB0aGlzLmFza1JldHJ5T24oKTtcbiAgICByZXR1cm4gdGhpcy5yZXRyeU9uVmVyZGljdDtcbiAgfVxuXG4gIHByaXZhdGUgYXNrUmV0cnlPbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2xpY3kucmV0cnlPbih0aGlzLmZhaWxlZD8uZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHRocm93bikge1xuICAgICAgdGhpcy5yZXRyeU9uVGhyZXcgPSB0cnVlO1xuICAgICAgdGhpcy5vcHRpb25zLm9uUmV0cnlPblRocmV3Py4odGhyb3duKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9saWN5J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWQgKDEtYmFzZWQpIGFuZCBpdHMgZXJyb3IuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlLFxuICogcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYSBuZWdhdGl2ZSB2YWx1ZSwgYSBgTmFOYCBmcm9tIGEgY29uc3VtZXIncyBhcml0aG1ldGljLCBvciBhIHRocm93aW5nXG4gKiBmdW5jdGlvbiDigJQgYmVjb21lcyBgMGAsIGkuZS4gcmV0cnkgaW1tZWRpYXRlbHkuIEEgYmFja29mZiBkaWFsIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjcmFzaCBhIHJ1biBvciBwYXJrIGl0XG4gKiBmb3JldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IFJldHJ5UG9saWN5WydiYWNrb2ZmTXMnXSwgYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQsIGVycm9yKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzXG4gKiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuIG5ldmVyIHNpdHMgb3V0IGEgbG9uZyBiYWNrb2ZmIGFuZCBuZXZlciBsb3NlcyB0aGUgZmFpbHVyZSB0aGF0XG4gKiBjYXVzZWQgaXQuIFRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyIGFyZSBhbHdheXMgY2xlYW5lZCB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhvdyBhIHJlY29yZCBlbmRlZCBpdHMgc2VyaWVzLCBhcyB0aGUgc3VtbWFyeSdzIGBsYXN0YCBzYXlzIGl0LiBPbiBhIHRvdWNoaW5nIHRhcmdldCB0aGUgZWZmZWN0IGlzIHRoZSBTRVJJRVMnXG4gKiAoYHVua25vd25Tb0ZhcmApOiB1bmtub3duIG9uY2UgYW55IGF0dGVtcHQgbGVmdCBpdCB1bmtub3duLCB1bmxlc3MgdGhlIHNlcmllcyBlbmRlZCB3aXRoIGFuIGFuc3dlci5cbiAqL1xuZnVuY3Rpb24gbGFzdE9mKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgdW5rbm93blNvRmFyID0gZmFsc2UpOiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddIHtcbiAgY29uc3QgZWZmZWN0ID0gcmVjb3JkLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHVua25vd25Tb0ZhciAmJiByZWNvcmQub3V0Y29tZSAhPT0gJ29rJyA/ICd1bmtub3duJyA6IHJlY29yZC5lZmZlY3Q7XG4gIHJldHVybiB7XG4gICAgbmV4dDogcmVjb3JkLm5leHQgYXMgQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXVsnbmV4dCddLFxuICAgIHJlYXNvbjogcmVjb3JkLnJlYXNvbixcbiAgICAuLi4ocmVjb3JkLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5IH0pLFxuICAgIC4uLihyZWNvcmQucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgfTtcbn1cblxuLyoqIFBlci1vdXRjb21lIGNvdW50cyBvZiBhIHNlcmllcywgZm9yIGl0cyBzdW1tYXJ5LiAqL1xuY2xhc3MgU2VyaWVzVGFsbHkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvdW50cyA9IHsgY291bnQ6IDAsIG9rOiAwLCBmYWlsZWQ6IDAsIHRpbWVvdXQ6IDAsIGFib3J0ZWQ6IDAsIHBhdXNlZDogMCB9O1xuXG4gIGFkZChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50cy5jb3VudCArPSAxO1xuICAgIHRoaXMuY291bnRzW3JlY29yZC5vdXRjb21lXSArPSAxO1xuICB9XG5cbiAgc3VtbWFyeShsYXN0OiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddKTogQXR0ZW1wdFN1bW1hcnkge1xuICAgIHJldHVybiBmcmVlemVEZWVwPEF0dGVtcHRTdW1tYXJ5Pih7IC4uLnRoaXMuY291bnRzLCBsYXN0IH0pO1xuICB9XG59XG4iXX0=
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFHSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUE2RXhELHNIQUFzSDtBQUN0SCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFP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TyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xILE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQXNDO1FBQ25ELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQWEsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxXQUFXO0lBQ0UsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RixHQUFHLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCO1FBQ2xDLE9BQU8sVUFBVSxDQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/IGRlY2lkZSBhZ2FpbjogcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXMgaGVyZSwgYmVmb3JlIHRoZVxuICogICAgICAgICAgIGRpc2NhcmQgYW5kIGJlZm9yZSBiYWNrb2ZmTXMsIGFzIHRoZSA5LjE1IGFib3J0IGNoZWNrIGRpZFxuICogICAgICAgICDihpIgcmV0cnk6IGJldHdlZW4obikg4oCUIHRoZSBkaXNjYXJkIOKAlCBhbmQgVEhFTiBiYWNrb2ZmTXMobiksIHRoZSB3YWl0J3MgbGVuZ3RoXG4gKiAgICAgICAgIOKGkiB0aGUgZXJyb3IncyBzZXJ2ZWQgZm9ybSBhbmQgY2F0ZWdvcnksIHJlYWQgYWZ0ZXIgcmV0cnlPbiBhbmQgYmFja29mZk1zIHJhbiDihpIgdGhlIHJlY29yZFxuICogICAgICAgICDihpIgb25FbmQoc3VtbWFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc2VyaWVzIGVuZHMgaGVyZVxuICogICAgICAgICDihpIgb25BdHRlbXB0KHJlY29yZCwgc2VydmVkIGVycm9yKVxuICogICAgICAgICDihpIgZG9uZTogcmV0dXJuIHRoZSB2YWx1ZSDCtyBzdG9wOiByZXRocm93IHRoZSBhdHRlbXB0J3MgT1dOIGVycm9yXG4gKiAgICAgICAgIOKGkiByZXRyeTogb25SZXRyeShuLCBvZiwgZGVsYXksIHNlcnZlZCBlcnJvcikg4oaSIHdhaXQgKGN1dCBzaG9ydCBieSB0aGUgc2lnbmFsKSDihpIgYWJvcnRlZD8gc3RvcFxuICpcbiAqIFdIQVQgSVQgUFJFU0VSVkVTICh0aGUgOS4xNSBsb29wJ3MgYmVoYXZpb3VyLCBtb3ZlZCBoZXJlIHVuY2hhbmdlZCk6IHRoZSBmdW5jdGlvbiBydW5zIHRoZSBzYW1lIG51bWJlciBvZlxuICogdGltZXM7IGByZXRyeU9uYCBpcyBhc2tlZCBvbmx5IGZvciBhIGZhaWxlZCwgbm9uLWZpbmFsIGF0dGVtcHQ7IGBiYWNrb2ZmTXNgIG9ubHkgd2hlbiBhIHJldHJ5IGZvbGxvd3MsIGFmdGVyXG4gKiB0aGUgZGlzY2FyZDsgYSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiwgYSB0aHJvd2luZyBvciBub24tZmluaXRlIGJhY2tvZmYgaXMgXCJubyB3YWl0XCI7IGEgcGF1c2UgaXNcbiAqIG5ldmVyIHJldHJpZWQ7IHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIGlzIHJldGhyb3duLCBuZXZlciBhIHdyYXBwZXI7IGFuZCBhIGZhaWxlZCBhdHRlbXB0J3Mgb3JkZXIg4oCUXG4gKiBgcmV0cnlPbmAg4oaSIHRoZSBhYm9ydCBjaGVjayDihpIgdGhlIGRpc2NhcmQgKGBiZXR3ZWVuYCkg4oaSIGBiYWNrb2ZmTXNgIOKGkiB0aGUgc2VydmVkIGVycm9yIOKGkiB0aGUgcmV0cnkgZXZlbnQg4oaSXG4gKiB0aGUgd2FpdCDihpIgdGhlIGFib3J0IGNoZWNrLiBTbyBhbiBhYm9ydCBpbnNpZGUgYHJldHJ5T25gIHN0b3BzIGJlZm9yZSB0aGUgZGlzY2FyZCBhbmQgbmV2ZXIgYXNrcyBgYmFja29mZk1zYDtcbiAqIGFuIGFib3J0IGluc2lkZSBgYmFja29mZk1zYCBjb21lcyBhZnRlciB0aGUgZGlzY2FyZCwgc3RpbGwgZmlyZXMgdGhlIHJldHJ5IGV2ZW50LCB0aGVuIGVuZHMgYXQgdGhlIHdhaXQ7IGFuZFxuICogdGhlIHNlcnZlZCBlcnJvciBzaG93cyB3aGF0IGByZXRyeU9uYCBkaWQgdG8gdGhlIHRocm93biB2YWx1ZS4gVGhlIG9uZSBkaWZmZXJlbmNlOiB3aGVuIHRoZSBydW4ncyBzaWduYWwgaGFzXG4gKiBBTFJFQURZIGFib3J0ZWQgYXMgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBzZXJpZXMgc3RvcHMgd2l0aG91dCBhc2tpbmcgYHJldHJ5T25gICh0aGUgYWJvcnQgZGVjaWRlcyBmaXJzdCDigJRcbiAqIHJ1bGUgMyBiZWZvcmUgcnVsZSA1KS5cbiAqXG4gKiBXSEFUIElUIEFERFM6IHRoZSByZWNvcmQgYW5kIHRoZSBzdW1tYXJ5LiBBIHJlY29yZCBpcyBmcm96ZW4gdG8gaXRzIGxlYXZlcyBhbmQgaG9sZHMgb25seSBjbG9uZS1zYWZlIGRhdGEg4oCUXG4gKiB0aGUgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQgKGBzZXJ2ZWAsIHRoZSByZWRhY3Rpb24gcnVsZSdzIGZvcm0pIHdpdGhvdXQgYHJhd2AuIFRoZSBob29rIGdldHMgdGhlIHNlcnZlZFxuICogYFN0cnVjdHVyZWRFcnJvckluZm9gIHdob2xlLCBgcmF3YCBpbmNsdWRlZCwgYXMgYG9uU3RhZ2VSZXRyeWAgYWx3YXlzIGhhcy4gQSByZWNvcmQgbmV2ZXIgcmV3cml0ZXMgd2hhdCB0aGVcbiAqIGF0dGVtcHQgZGlkOiBhbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIG93biBlcnJvciBpcyBgZmFpbGVkYCwgd2l0aCBpdHMgY2F0ZWdvcnksIGV2ZW4gd2hlbiB0aGUgcnVuIGFib3J0ZWRcbiAqIGFyb3VuZCBpdCDigJQgdGhlIGFib3J0IGlzIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgYSB0aHJvd2luZyBgcmV0cnlPbmAgaXMgYGRlY2xpbmVkYFxuICogd2l0aCBgcmV0cnlPblRocmV3OiB0cnVlYCwgYXBhcnQgZnJvbSBhIHJlYWwgYGZhbHNlYC5cbiAqXG4gKiBUSU1FIChQMWIpLiBFYWNoIGF0dGVtcHQgcnVucyB1bmRlciBgbWluKHBvbGljeS50aW1lb3V0TXMsIHRpbWUgbGVmdCBiZWZvcmUgb3B0aW9ucy5kZWFkbGluZSlgIGFuZCBnZXRzIGFuXG4gKiBgQXR0ZW1wdENvbnRleHRgIOKAlCBpdHMgc2lnbmFsLCBjb21wb3NlZCBmcm9tIHRoZSBydW4ncyBhbmQgaXRzIG93biBjYXAncyB0aW1lciAoYExpdmVBdHRlbXB0YCkuIFRoZSBjYXAncyB0aW1lclxuICogYWJvcnRzIHdpdGggYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgOyB0aGUgcnVuJ3MgZGVhZGxpbmUgYWJvcnRzIHRoZSBydW4ncyBzaWduYWwgd2l0aCBhIGJyYW5kZWQgcmVhc29uXG4gKiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS4gRWl0aGVyIHdheSB0aGUgYXR0ZW1wdCBpcyBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2A6IHRoZSBkZWFkbGluZSBpcyBub3QgYVxuICogY2FuY2VsbGF0aW9uLCBzbyBydWxlIDMgZG9lcyBub3QgbWF0Y2ggYW5kIHJ1bGUgNiAoYHRpbWVMZWZ0QWZ0ZXJXYWl0TXMg4omkIDBgKSBzdG9wcyBhIHNlcmllcyB3aG9zZSBuZXh0IHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgaXQuIFVuZGVyIGEgZGVhZGxpbmUgcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoLCBzbyBgYmFja29mZk1zKG4sIGVycm9yKWAgaXMgYXNrZWQgRFVSSU5HIHRoZVxuICogZGVjaXNpb24g4oCUIGJlZm9yZSB0aGUgZGlzY2FyZDsgd2l0aG91dCBvbmUgdGhlIDkuMTUgb3JkZXIgYWJvdmUgaG9sZHMgdW5jaGFuZ2VkLiBObyBhdHRlbXB0IHN0YXJ0cyBhdCBvciBwYXN0XG4gKiB0aGUgZGVhZGxpbmU6IGEgd2FpdCB0aGUgZGVhZGxpbmUgY3V0IGVuZHMgdGhlIHNlcmllcyBgbm8tdGltZS1sZWZ0YCwgcmVjb3JkaW5nIG5vIGZ1cnRoZXIgYXR0ZW1wdC5cbiAqXG4gKiBUSEUgRkVOQ0UuIFRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2lnbmFsIGFib3J0cyAoc3luY2hyb25vdXNseSwgYmVmb3JlIGFueSBsaXN0ZW5lclxuICogdGhlIGZ1bmN0aW9uIGFkZGVkKSBvciBpdCB0aHJvd3Mg4oCUIGBvbkFiYW5kb24obilgIGZpcmVzIG9uY2UsIGFuZCB0aGUgZW5naW5lIGNsb3NlcyB0aGF0IGF0dGVtcHQncyBzY29wZTogdGhlXG4gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIG5vdGhpbmcgaXQgZG9lcyBhZnRlcndhcmRzIG1heSBsYW5kIGJlc2lkZSBhIGxhdGVyIGF0dGVtcHQuXG4gKlxuICogT05FIGFzeW5jIGZyYW1lIHdpdGggT05FIGF3YWl0IHBlciBhdHRlbXB0OiB0aGUgZW5naW5lIHJlbGllcyBvbiB0aGF0IHRvIGtlZXAgYSByZXRyaWVkIHN0YWdlJ3MgbWljcm90YXNrXG4gKiBzaGFwZSwgc28gcGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlciB0aGV5IGFsd2F5cyBkaWQuIFRoZSBlbmdpbmUgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmLFxuICogYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgcmFjZWQ6IHRydWVgKTsgYW55IG90aGVyIGNhbGxlciBnZXRzIHRoZSByYWNlIGhlcmUsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgd2FpdHMgb24gYW5cbiAqIGF0dGVtcHQgcGFzdCBpdHMgY2FwLlxuICpcbiAqIENBTExTIChQMikuIFRoZSBzYW1lIGxvb3AgcnVucyBhIGNhbGwgYSBzdGFnZSBtYWtlcyAoYGF0dGVtcHQvY2FsbC50cyDCtyBydW5DYWxsYCwga2luZCBgJ2NhbGwnYCwgaXRzIGB0YXJnZXRgIG9uXG4gKiBldmVyeSByZWNvcmQpIGFuZCB0aGUgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYC4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgREVBRExJTkUgb2YgZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCwgc29cbiAqIHRoZSBjYXAncyByZWFzb24gaXMgYnJhbmRlZCBhIHRpbWUgbGltaXQgKGBhdHRlbXB0L2RlYWRsaW5lLnRzIMK3IG1hcmtUaW1lTGltaXRgKTogYSBjYWxsIGN1dCBieSBpdHMgc3RhZ2VcbiAqIGF0dGVtcHQncyBjYXAgdGltZWQgb3V0LCBpdCB3YXMgbm90IGNhbmNlbGxlZC4gYGF0dGVtcHRFbmRzQXRgIHNheXMgd2hlbiBhbiBhdHRlbXB0IG11c3QgZW5kOyBhbiBgaW50ZXJydXB0KClgXG4gKiB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBhIHBhdXNlLCBsaWtlIGEgYFBhdXNlU2lnbmFsYCDigJQgbmV2ZXIgcmV0cmllZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5LCB0ZXJtaW5hbENhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCwgaXNEZWFkbGluZVJlYXNvbiwgbWFya1RpbWVMaW1pdCwgcmVhZERlYWRsaW5lLCBzZXRMb25nVGltZW91dCB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHsgZGVjaWRlQXR0ZW1wdCwgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBlZmZlY3RPZiwgcmVjb3JkZWRLZXlPZiwgcmVmdXNlS2V5bGVzc1JldHJ5LCB1bmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0VGltZW91dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcsIGF0dGVtcHRUaW1lb3V0TXMsIGNhcHBlZFdhaXRNcyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogV2hhdCBhIHNlcmllcyByZXBvcnRzLCBhbmQgdGhlIGVuZ2luZSdzIGJldHdlZW4tYXR0ZW1wdCBzdGVwLiBFdmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSdW5PcHRpb25zIHtcbiAgLyoqIFRoZSBzZXJpZXMgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBmb3IgYSBzdGFnZSBhdHRlbXB0LCBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGAnc3RhZ2UnYC4gKi9cbiAgcmVhZG9ubHkga2luZD86IEF0dGVtcHRLaW5kO1xuICAvKiogVGhlIG91dHNpZGUgdGFyZ2V0IGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgYSBjYWxsJ3MgKGAkY2FsbGAsIGBhdHRlbXB0KClgKTsgYWJzZW50IGZvciBhIHN0YWdlIGF0dGVtcHQuICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBzaWduYWwuIE9uY2UgaXQgaGFzIGFib3J0ZWQgKG90aGVyIHRoYW4gYXQgdGhlIGRlYWRsaW5lKSwgcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXNcbiAgICogKGByZWFzb246ICdhYm9ydGVkJ2ApOyBpdCBjdXRzIGEgd2FpdCBzaG9ydC4gQW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyByZWFzb24gaXMgcmVjb3JkZWQgYCdhYm9ydGVkJ2Ag4oCUIG9yXG4gICAqIGAndGltZW91dCdgIHdoZW4gdGhlIHJlYXNvbiBpcyB0aGUgZGVhZGxpbmUncyAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMuIEV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQ7IHJ1bGUgNiBzdG9wcyBhIHNlcmllcyB3aG9zZVxuICAgKiBuZXh0IHdhaXQgd291bGQgb3V0bGFzdCBpdCAoYG5vLXRpbWUtbGVmdGApLiBBYnNlbnQgKG9yIG5vdCBmaW5pdGUpID0gbm8gZGVhZGxpbmU6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKiogVGhlIGNsb2NrLCBlcG9jaCBtaWxsaXNlY29uZHMuIERlZmF1bHQgYERhdGUubm93YC4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgZmFpbGVkIGF0dGVtcHQncyBlcnJvci4gRGVmYXVsdCBgZXh0cmFjdEVycm9ySW5mb2AgKG5vIHJlZGFjdGlvbiBydWxlKS4gKi9cbiAgcmVhZG9ubHkgc2VydmU/OiAoZXJyb3I6IHVua25vd24pID0+IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIC8qKiBCZXR3ZWVuIGEgZmFpbGVkIGF0dGVtcHQgYW5kIHRoZSBuZXh0LCBiZWZvcmUgYGJhY2tvZmZNc2A6IHRoZSBlbmdpbmUgZGlzY2FyZHMgdGhlIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzLiAqL1xuICByZWFkb25seSBiZXR3ZWVuPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQsIGF0IGl0cyBlbmQsIHdpdGggaXRzIHNlcnZlZCBlcnJvciAoYHVuZGVmaW5lZGAgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYCkuICovXG4gIHJlYWRvbmx5IG9uQXR0ZW1wdD86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgLyoqIEEgZmFpbGVkIGF0dGVtcHQgdGhhdCBXSUxMIGJlIHJldHJpZWQg4oCUIGFmdGVyIGBiZXR3ZWVuYCBhbmQgYG9uQXR0ZW1wdGAsIGJlZm9yZSB0aGUgd2FpdC4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIG9mOiBudW1iZXIsIGRlbGF5TXM6IG51bWJlciwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvKSA9PiB2b2lkO1xuICAvKiogVGhlIHNlcmllcyBlbmRlZDogY2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgbGFzdCBgb25BdHRlbXB0YCAob3IgYWZ0ZXIgYSB3YWl0IHRoZSBydW4ncyBzaWduYWwgY3V0KS4gKi9cbiAgcmVhZG9ubHkgb25FbmQ/OiAoc3VtbWFyeTogQXR0ZW1wdFN1bW1hcnkpID0+IHZvaWQ7XG4gIC8qKiBAaW50ZXJuYWwgTmF0aXZlIG93bmVyIG9ubHk6IHRoZSBleGFjdCBlc2NhcGluZyB2YWx1ZSBhbmQgY2F0ZWdvcnksIGJlZm9yZSBpdHMgc3RhZ2Ugc2VydmVzIHRoZSBlcnJvci4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogKGVycm9yOiB1bmtub3duLCBjYXRlZ29yeTogQXR0ZW1wdENhdGVnb3J5KSA9PiB2b2lkO1xuICAvKiogYHJldHJ5T25gIHRocmV3IOKAlCB0aGUgYXR0ZW1wdCBpcyB0cmVhdGVkIGFzIGRlY2xpbmVkOyB0aGUgZW5naW5lIGxvZ3MgdGhlIHRocm93IGhlcmUuICovXG4gIHJlYWRvbmx5IG9uUmV0cnlPblRocmV3PzogKHRocm93bjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBjYWxsZWQgU1lOQ0hST05PVVNMWSB0aGUgbW9tZW50IGl0cyBzaWduYWwgYWJvcnRzIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsXG4gICAqIGEgY2FuY2VsbGF0aW9uKSwgZWxzZSBhcyBzb29uIGFzIGl0IGZhaWxlZC4gV2hhdGV2ZXIgdGhlIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIGFmdGVyd2FyZHMgaXMgbm90IHRoaXNcbiAgICogc2VyaWVzJzogdGhlIGVuZ2luZSBmZW5jZXMgaXRzIHNjb3BlIGhlcmUuIE9uY2UgcGVyIGF0dGVtcHQ7IG5ldmVyIGZvciBgJ29rJ2Agb3IgYCdwYXVzZWQnYCDigJQgZXhjZXB0IGFuIGF0dGVtcHRcbiAgICogdGhhdCBTVEFSVEVEIHVuZGVyIGFuIGFscmVhZHktYWJvcnRlZCBzaWduYWwsIGZlbmNlZCBvbmNlIGl0cyBzeW5jaHJvbm91cyBwYXJ0IGhhcyBydW4gKG5vYm9keSB3YWl0cyBmb3IgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25BYmFuZG9uPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgcmFjZXMgYHJ1bmAncyBwcm9taXNlIGFnYWluc3QgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmIOKAlCB0aGUgZW5naW5lIGRvZXMsIGF0IHRoZSBzdGFnZSBib3VuZGFyeVxuICAgKiAoYFN0YWdlUnVubmVyYCksIHNvIGEgc3RhZ2Uga2VlcHMgaXRzIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdC4gT3RoZXJ3aXNlIHRoZSBydW5uZXIgcmFjZXMgaXQ6IHRoZSBzZXJpZXMgbmV2ZXJcbiAgICogd2FpdHMgb24gYW4gYXR0ZW1wdCBwYXN0IGl0cyBjYXAuXG4gICAqL1xuICByZWFkb25seSByYWNlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGF0IGFuIGF0dGVtcHQncyBgb2JzZXJ2ZWQocmVwb3J0KWAgZG9lcyAoUDIpIOKAlCB0aGUgb3duZXIgb2YgdGhlIGF0dGVtcHQgcmVjb3JkcyB0aGUgcmVwb3J0OiBgcnVuQ2FsbGAgaGFuZHNcbiAgICogYSBjYWxsJ3MgcmVwb3J0cyB0byB0aGUgc2NvcGUsIGBhdHRlbXB0KClgIGtlZXBzIGl0cyBvd24uIGBlbmRlZGAgc2F5cyB0aGUgYXR0ZW1wdCBoYWQgYWxyZWFkeSBlbmRlZCB3aGVuIHRoZVxuICAgKiByZXBvcnQgY2FtZSAodGhlIG93bmVyIGRyb3BzIGl0KS4gQWJzZW50IOKAlCBhIHN0YWdlIGF0dGVtcHQncyBjb250ZXh0LCB3aG9zZSBgb2JzZXJ2ZWRgIHRoZSBzY29wZSdzXG4gICAqIGAkYXR0ZW1wdCgpYCByZXBsYWNlcyDigJQgYG9ic2VydmVkYCBpcyByZWZ1c2VkIHdpdGggYSBgVHlwZUVycm9yYC5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGF0OiB7IHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjsgcmVhZG9ubHkgZW5kZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgdGFyZ2V0IHRvdWNoZXMgKFAzLCBkZXNpZ24gwqczLjMpLiBFdmVyeSByZWNvcmQgdGhlbiBzYXlzIHdoYXQgaXRzIGF0dGVtcHQgZGlkIHRvIGl0XG4gICAqIChgZWZmZWN0YCkgYW5kIG5hbWVzIHRoZSBzeXN0ZW0gYW5kIHRoZSBSRUNPUkRFRCBrZXk7IGV2ZXJ5IGF0dGVtcHQncyBjb250ZXh0IGNhcnJpZXMgdGhlIFJFQUwga2V5LiBBIHNlcmllc1xuICAgKiB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCAoaXRzIGBjYXVzZWAgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IpIOKAlFxuICAgKiBleGNlcHQgYSBwYXVzZSwgd2hpY2ggc3RheXMgYSBwYXVzZS4gQSB0b3VjaGluZyBzZXJpZXMgdGhhdCBtYXkgcmV0cnkgd2l0aG91dCBhIGtleSBpcyByZWZ1c2VkIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBydW5zOiB0aGUgbGF3J3MgbGFzdCBkb29yLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0PzogRWZmZWN0VGFyZ2V0O1xufVxuXG4vKiogV2hlbiBlYWNoIGxpdmUgYXR0ZW1wdCBtdXN0IGVuZCwgZXBvY2ggbXMg4oCUIGBzdGFydGVkQXQgKyBjYXBgLCBmb3IgYW4gYXR0ZW1wdCB0aGF0IGhhcyBhIGNhcCAoYGF0dGVtcHRFbmRzQXRgKS4gKi9cbmNvbnN0IEFUVEVNUFRfRU5EUyA9IG5ldyBXZWFrTWFwPEF0dGVtcHRDb250ZXh0LCBudW1iZXI+KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgYXR0ZW1wdCBiZWhpbmQgYGNvbnRleHRgIG11c3QgZW5kLCBlcG9jaCBtaWxsaXNlY29uZHMg4oCUIGl0cyBzdGFydCBwbHVzIGl0cyBjYXAgKGBtaW4odGltZW91dE1zLCB0aW1lXG4gKiBsZWZ0KWAsIHNvIG5ldmVyIHBhc3QgdGhlIHJ1bidzIGRlYWRsaW5lKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIHVuY2FwcGVkIGF0dGVtcHQuIEEgY2FsbCBtYWRlIGluc2lkZSB0aGVcbiAqIGF0dGVtcHQgcnVucyB1bmRlciBpdCBhcyBpdHMgZGVhZGxpbmUgKGBhdHRlbXB0L2NhbGwudHNgKS4gT25seSB0aGUgcnVubmVyJ3Mgb3duIGNvbnRleHRzIGFyZSBrbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRFbmRzQXQoY29udGV4dDogQXR0ZW1wdENvbnRleHQgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogQVRURU1QVF9FTkRTLmdldChjb250ZXh0KTtcbn1cblxuLyoqIEEgZmFpbGVkIGF0dGVtcHQncyB0aHJvd24gdmFsdWUsIGJveGVkOiBgdW5kZWZpbmVkYCBpcyBhIHZhbHVlIGEgc3RhZ2UgbWF5IHRocm93LiAqL1xuaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW4gYHJ1bmAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGhlIHBvbGljeSBzdG9wcyBpdDsgcmVzb2x2ZSB3aXRoIGl0cyB2YWx1ZSBvciByZWplY3Qgd2l0aCB0aGUgTEFTVCBhdHRlbXB0J3NcbiAqIG93biBlcnJvci4gYHJ1bihuKWAgaXMgY2FsbGVkIHdpdGggdGhlIGF0dGVtcHQgbnVtYmVyLCAxLWJhc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXR0ZW1wdHM8VD4oXG4gIHJ1bjogKGF0dGVtcHQ6IG51bWJlciwgY29udGV4dDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvZiA9IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cyk7XG4gIGNvbnN0IHJ1bGVzID0gcmV0cnlSdWxlcyh7IGF0dGVtcHRzOiBvZiB9KTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IGRlYWRsaW5lID0gcmVhZERlYWRsaW5lKG9wdGlvbnMuZGVhZGxpbmUpO1xuICBjb25zdCBvd25DYXAgPSBhdHRlbXB0VGltZW91dE1zKHBvbGljeS50aW1lb3V0TXMpO1xuICBjb25zdCB0YWxseSA9IG5ldyBTZXJpZXNUYWxseSgpO1xuICBpZiAob3B0aW9ucy5lZmZlY3QpIHJlZnVzZUtleWxlc3NSZXRyeShvcHRpb25zLmVmZmVjdCwgb2YpO1xuICAvKiogQW4gZWFybGllciBhdHRlbXB0IG9mIHRoaXMgdG91Y2hpbmcgc2VyaWVzIGxlZnQgdGhlIGVmZmVjdCB1bmtub3duIOKAlCBhIGxhdGVyIGFuc3dlciBvZiBgbm9uZWAgY2Fubm90IGNsZWFyIGl0LiAqL1xuICBsZXQgdW5rbm93blNvRmFyID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gICAgY29uc3QgbGl2ZSA9IG5ldyBMaXZlQXR0ZW1wdChvcHRpb25zLCBhdHRlbXB0LCBvZiwgc3RhcnRlZEF0LCBkZWFkbGluZSwgb3duQ2FwLCBub3cpO1xuICAgIGxldCB2YWx1ZTogVCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHJ1bihhdHRlbXB0LCBsaXZlLmNvbnRleHQpO1xuICAgICAgLy8gU3RhcnRlZCB1bmRlciBhIHNpZ25hbCB0aGF0IGhhZCBBTFJFQURZIGFib3J0ZWQgKGEgZGVjaWRlciBlbnRlcmVkIGFmdGVyIGEgY2FuY2VsKTogaXRzIHN5bmNocm9ub3VzIHBhcnRcbiAgICAgIC8vIHJhbiBhcyBpdCBhbHdheXMgZGlkOyBmcm9tIGhlcmUgb24gbm9ib2R5IHdhaXRzIGZvciBpdCwgc28gbm90aGluZyBpdCBkb2VzIGFmdGVyIGl0cyBmaXJzdCBhd2FpdCBsYW5kcy5cbiAgICAgIGlmIChsaXZlLmNvbnRleHQuc2lnbmFsLmFib3J0ZWQpIGxpdmUuYWJhbmRvblN0YXJ0ZWQoKTtcbiAgICAgIHZhbHVlID0gYXdhaXQgKG9wdGlvbnMucmFjZWQgPyBwZW5kaW5nIDogbGl2ZS5yYWNlKHBlbmRpbmcpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgZmFpbHVyZSA9IHsgZXJyb3IgfTtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIG5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZU9mKGZhaWx1cmUsIG9wdGlvbnMuc2lnbmFsLCBsaXZlLnRpbWVvdXRSZWFzb24pO1xuICAgIGxpdmUuZW5kKG91dGNvbWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5ldyBBdHRlbXB0SW5wdXRSZWFkZXIocG9saWN5LCBvcHRpb25zLCBhdHRlbXB0LCBvZiwgb3V0Y29tZSwgZmFpbHVyZSwgZGVhZGxpbmUsIG5vdyk7XG5cbiAgICBsZXQgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG4gICAgLy8gOS4xNSBhc2tlZCByZXRyeU9uLCBUSEVOIGNoZWNrZWQgdGhlIHNpZ25hbC4gRGVjaWRpbmcgYWdhaW4gcmVhZHMgdGhlIHNpZ25hbCBhZnJlc2g6IHJ1bGUgMyBub3cgbWF0Y2hlcyxcbiAgICAvLyBhaGVhZCBvZiBldmVyeSB1c2VyIGZ1bmN0aW9uLCBzbyBub25lIGlzIGFza2VkIHR3aWNlIOKAlCBhbmQgbm90aGluZyBpcyBkaXNjYXJkZWQsIG5vdGhpbmcgd2FpdGVkIGZvci5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5JyAmJiBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbCkpIGRlY2lzaW9uID0gZGVjaWRlQXR0ZW1wdChydWxlcywgaW5wdXRzLnJlYWQpO1xuXG4gICAgLy8gVGhlIGRpc2NhcmQgY29tZXMgQkVGT1JFIHRoZSB3YWl0J3MgbGVuZ3RoIGlzIGFza2VkIGZvciwgYXMgaXQgZGlkIGluIDkuMTUg4oCUIHdpdGhvdXQgYSBkZWFkbGluZS4gVW5kZXIgb25lLFxuICAgIC8vIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCB0byBkZWNpZGUsIHNvIGBiYWNrb2ZmTXNgIHdhcyBhc2tlZCBkdXJpbmcgdGhlIGRlY2lzaW9uLCBiZWZvcmUgdGhlIGRpc2NhcmQuXG4gICAgaWYgKGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScpIG9wdGlvbnMuYmV0d2Vlbj8uKGF0dGVtcHQpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknID8gaW5wdXRzLmRlbGF5TXMoKSA6IGlucHV0cy5kZWxheUlmQXNrZWQoKTtcbiAgICBjb25zdCB0aW1lTGVmdE1zID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGlucHV0cy50aW1lTGVmdCgpO1xuXG4gICAgY29uc3QgY2F0ZWdvcnkgPSBpbnB1dHMuY2F0ZWdvcnkoKTtcbiAgICAvLyBQcml2YXRlIHRlcm1pbmFsIHNlbWFudGljcyBhcmUgZml4ZWQgYmVmb3JlIHNlcnZpbmcgb3Igb2JzZXJ2ZXIgZmFuLW91dC5cbiAgICAvLyBBbiBhbHJlYWR5LXVucmVzb2x2ZWQgY2FsbCB3cmFwcGVyIG11c3Qgbm90IGJlY29tZSBpdHMgcGh5c2ljYWwgY2F1c2VcbiAgICAvLyBpZiBhIGNvbnN1bWVyIGxhdGVyIGNoYW5nZXMgdGhlIHJhdyBlcnJvcidzIHByb3BlcnRpZXMgb3IgcHJvdG90eXBlLlxuICAgIGNvbnN0IHRlcm1pbmFsID0gb3B0aW9ucy5vbkZhaWx1cmUgJiYgZmFpbHVyZSA/IHRlcm1pbmFsQ2F0ZWdvcnkoZmFpbHVyZS5lcnJvciwgY2F0ZWdvcnkpIDogY2F0ZWdvcnkgPz8gJ3Vua25vd24nO1xuICAgIGNvbnN0IHNlcnZlZCA9IGlucHV0cy5mYWlsZWQgPyAob3B0aW9ucy5zZXJ2ZSA/PyBleHRyYWN0RXJyb3JJbmZvKShpbnB1dHMuZmFpbGVkLmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlZmZlY3QgPSBvcHRpb25zLmVmZmVjdCA/IGVmZmVjdE9mKGlucHV0cy5vdXRjb21lLCBmYWlsdXJlPy5lcnJvcikgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSBvcHRpb25zLmVmZmVjdCA/IHJlY29yZGVkS2V5T2Yob3B0aW9ucy5lZmZlY3QpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY29yZCA9IGZyZWV6ZURlZXA8QXR0ZW1wdFJlY29yZD4oe1xuICAgICAgc2VyaWVzOiBvcHRpb25zLnNlcmllcyxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCA/PyAnc3RhZ2UnLFxuICAgICAgLi4uKG9wdGlvbnMudGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgeyB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IH0pLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc3RhcnRlZEF0LFxuICAgICAgZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IGlucHV0cy5vdXRjb21lLFxuICAgICAgLi4uKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeSB9KSxcbiAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5ldmlkZW5jZSxcbiAgICAgIG5leHQ6IGRlY2lzaW9uLm5leHQsXG4gICAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgIC4uLihpbnB1dHMucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgICAgLi4uKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiB7IGRlbGF5TXMgfSksXG4gICAgICAuLi4obGl2ZS5jYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBsaXZlLmNhcE1zIH0pLFxuICAgICAgLi4uKHRpbWVMZWZ0TXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVMZWZ0TXMgfSksXG4gICAgICAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBlcnJvcjogcmVjb3JkZWRFcnJvcihzZXJ2ZWQpIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzeXN0ZW06IG9wdGlvbnMuZWZmZWN0LnN5c3RlbSB9KSxcbiAgICAgIC4uLihyZWNvcmRlZEtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5IH0pLFxuICAgICAgLi4uKGVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0IH0pLFxuICAgIH0pO1xuICAgIHRhbGx5LmFkZChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQuZWZmZWN0ID09PSAndW5rbm93bicpIHVua25vd25Tb0ZhciA9IHRydWU7XG4gICAgaWYgKHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeShsYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpKSk7XG4gICAgb3B0aW9ucy5vbkF0dGVtcHQ/LihyZWNvcmQsIHNlcnZlZCk7XG5cbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdkb25lJykgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gICAgaWYgKHJlY29yZC5uZXh0ID09PSAnc3RvcCcpIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG5cbiAgICBvcHRpb25zLm9uUmV0cnk/LihhdHRlbXB0LCBvZiwgZGVsYXlNcyA/PyAwLCBzZXJ2ZWQgYXMgU3RydWN0dXJlZEVycm9ySW5mbyk7XG4gICAgaWYgKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiBkZWxheU1zID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXlNcywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgJ3Vua25vd24nKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGF0dGVtcHQgZm9sbG93cyBhIGN1dCB3YWl0LCBzbyBub25lIGlzIHJlY29yZGVkOiB0aGUgc3VtbWFyeSBzYXlzIGhvdyB0aGUgc2VyaWVzIGVuZGVkLiBObyBhdHRlbXB0XG4gICAgLy8gU1RBUlRTIGF0IG9yIHBhc3QgdGhlIGRlYWRsaW5lIGVpdGhlciDigJQgcnVsZSA2IGRlY2lkZWQgd2l0aCB0aGUgY2xvY2ssIGFuZCB0aGUgY2xvY2sgbWF5IGhhdmUgbW92ZWQgb24uXG4gICAgY29uc3QgY3V0ID0gaXNDYW5jZWxsZWQob3B0aW9ucy5zaWduYWwpXG4gICAgICA/ICdhYm9ydGVkJ1xuICAgICAgOiBvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCB8fCAoZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiBub3coKSA+PSBkZWFkbGluZSlcbiAgICAgID8gJ25vLXRpbWUtbGVmdCdcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5vbkVuZD8uKHRhbGx5LnN1bW1hcnkoeyAuLi5sYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpLCBuZXh0OiAnc3RvcCcsIHJlYXNvbjogY3V0IH0pKTtcbiAgICAgIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgZmluYWwgcGh5c2ljYWwgYXR0ZW1wdCBvd25zIGl0cyBjYXRlZ29yeTsgYSB3cmFwcGVyIG9yIGN1dCB3YWl0IGhhcyBubyBzdWNoIGNhdGVnb3J5LiAqL1xuZnVuY3Rpb24gc3RvcHBlZEZhaWx1cmUoXG4gIG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbiAgdGVybWluYWw6IEF0dGVtcHRDYXRlZ29yeSxcbik6IHVua25vd24ge1xuICBjb25zdCBlcnJvciA9IHN0b3BFcnJvcihvcHRpb25zLmVmZmVjdCwgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIpO1xuICBpZiAocmVjb3JkLm91dGNvbWUgIT09ICdwYXVzZWQnKSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSByZWNvcmQubmV4dCA9PT0gJ3N0b3AnICYmIE9iamVjdC5pcyhlcnJvciwgZmFpbHVyZT8uZXJyb3IpID8gdGVybWluYWwgOiAndW5rbm93bic7XG4gICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgY2F0ZWdvcnkpO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RvcHBlZCBzZXJpZXMgdGhyb3dzOiB0aGUgbGFzdCBhdHRlbXB0J3Mgb3duIGVycm9yIOKAlCBvciwgb24gYSB0b3VjaGluZyB0YXJnZXQgd2hlcmUgQU5ZIGF0dGVtcHQgbGVmdCB0aGVcbiAqIGVmZmVjdCB1bmtub3duLCBgVW5rbm93bkVmZmVjdEVycm9yYCB3aXRoIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBhcyBpdHMgY2F1c2UuIEFuIGVhcmxpZXIgdGltZW91dCBtYXkgaGF2ZVxuICogYXBwbGllZCB0aGUgZWZmZWN0OyBhIGxhdGVyIGF0dGVtcHQgdGhhdCBzYXlzIFwibm90aGluZyB3YXMgc2VudFwiIHNwZWFrcyBmb3IgaXRzZWxmIG9ubHksIHNvIGl0IGNhbm5vdCB0dXJuIHRoZVxuICogc2VyaWVzIGludG8gYSBwbGFpbiBmYWlsdXJlLiBBIHBhdXNlIGlzIG5ldmVyIGNvbnZlcnRlZDogaXQgaXMgY29udHJvbCBmbG93LlxuICovXG5mdW5jdGlvbiBzdG9wRXJyb3IoXG4gIGVmZmVjdDogRWZmZWN0VGFyZ2V0IHwgdW5kZWZpbmVkLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbik6IHVua25vd24ge1xuICBpZiAoZWZmZWN0ID09PSB1bmRlZmluZWQgfHwgIXVua25vd25Tb0ZhciB8fCByZWNvcmQub3V0Y29tZSA9PT0gJ3BhdXNlZCcpIHJldHVybiBmYWlsdXJlPy5lcnJvcjtcbiAgcmV0dXJuIHVua25vd25FZmZlY3RFcnJvcihlZmZlY3QsIHJlY29yZCwgZmFpbHVyZT8uZXJyb3IpO1xufVxuXG4vKipcbiAqIE9uZSBhdHRlbXB0IGluIGZsaWdodDogaXRzIGNhcCwgaXRzIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIGl0cyBvd24gdGltZXIpLCBhbmQgdGhlIGZlbmNlLiBJdHMgb3duXG4gKiB0aW1lciBpcyBhcm1lZCB3aGVuIHRoZSBwb2xpY3kncyBjYXAgaXMgU0hPUlRFUiB0aGFuIHRoZSB0aW1lIGxlZnQ7IGF0IHRoZSBkZWFkbGluZSB0aGUgcnVuJ3Mgb3duIHNpZ25hbCBhYm9ydHMsXG4gKiB3aXRoIHRoZSBkZWFkbGluZSdzIHJlYXNvbiAoc28gYSBydW4gcmVqZWN0cyB3aXRoIHRoZSByZWFzb24gaXQgYWx3YXlzIGRpZCkuIEV2ZXJ5dGhpbmcgaXQgYXJtcyBpcyByZWxlYXNlZFxuICogd2hlbiB0aGUgYXR0ZW1wdCBlbmRzLlxuICovXG5jbGFzcyBMaXZlQXR0ZW1wdCB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIGNhcCB0aGlzIGF0dGVtcHQgcnVucyB1bmRlciDigJQgYG1pbih0aW1lb3V0TXMsIHRpbWUgbGVmdClgLCBuZXZlciBuZWdhdGl2ZTsgYWJzZW50IHdoZW4gdW5jYXBwZWQuICovXG4gIHJlYWRvbmx5IGNhcE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVhc29uIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGFib3J0ZWQgd2l0aCDigJQgc2V0IG9ubHkgaWYgaXQgZmlyZWQuICovXG4gIHRpbWVvdXRSZWFzb246IEF0dGVtcHRUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsVGltZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wb3NlZDogeyByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsOyBkaXNwb3NlKCk6IHZvaWQgfTtcbiAgcHJpdmF0ZSBhYmFuZG9uZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuIGBvYnNlcnZlZGAgcmVwb3J0IGFmdGVyIHRoaXMgaXMgdGhlIG93bmVyJ3MgdG8gcmVmdXNlLiAqL1xuICBwcml2YXRlIGVuZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BYm9ydCA9ICgpID0+IHRoaXMuYWJhbmRvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgb2Y6IG51bWJlcixcbiAgICBzdGFydGVkQXQ6IG51bWJlcixcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG93bkNhcDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG5vdzogKCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsZWZ0ID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKG93bkNhcCA/PyBJbmZpbml0eSwgbGVmdCk7XG4gICAgdGhpcy5jYXBNcyA9IE51bWJlci5pc0Zpbml0ZShjYXApID8gY2FwIDogdW5kZWZpbmVkO1xuICAgIC8vIEl0cyBvd24gdGltZXIgd2hlbiBpdHMgb3duIGNhcCBpcyB0aGUgc2hvcnRlciwgb3Igd2hlbiBubyBydW4gc2lnbmFsIHdpbGwgYWJvcnQgYXQgdGhlIGRlYWRsaW5lIChhIGNhbGxlclxuICAgIC8vIHdpdGggYSBkZWFkbGluZSBhbmQgbm8gc2lnbmFsKS4gT3RoZXJ3aXNlIHRoZSBydW4ncyBzaWduYWwgZW5kcyBpdCBhdCB0aGUgZGVhZGxpbmUsIHdpdGggdGhlIGRlYWRsaW5lJ3MgcmVhc29uLlxuICAgIGNvbnN0IG93blRpbWVyID0gdGhpcy5jYXBNcyAhPT0gdW5kZWZpbmVkICYmICgob3duQ2FwICE9PSB1bmRlZmluZWQgJiYgb3duQ2FwIDwgbGVmdCkgfHwgIW9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBvd24gPSBvd25UaW1lciA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAob3duKSB7XG4gICAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXMgYXMgbnVtYmVyO1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gQSB0aW1lIGxpbWl0LCBicmFuZGVkIGxpa2UgdGhlIHJ1bidzIGRlYWRsaW5lOiBhIGNhbGwgbWFkZSBpbnNpZGUgdGhpcyBhdHRlbXB0IHRoYXQgaXQgY3V0cyB0aW1lZCBvdXQuXG4gICAgICAgIHRoaXMudGltZW91dFJlYXNvbiA9IG1hcmtUaW1lTGltaXQobmV3IEF0dGVtcHRUaW1lb3V0RXJyb3IoYXR0ZW1wdCwgY2FwTXMpKTtcbiAgICAgICAgb3duLmFib3J0KHRoaXMudGltZW91dFJlYXNvbik7XG4gICAgICB9LCBjYXBNcyk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZWQgPSBhbnlTaWduYWwoW29wdGlvbnMuc2lnbmFsLCBvd24/LnNpZ25hbF0pO1xuICAgIC8vIFJlZ2lzdGVyZWQgQkVGT1JFIHRoZSBmdW5jdGlvbiBydW5zLCBzbyB0aGUgZmVuY2UgY2xvc2VzIGJlZm9yZSBhbnkgbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIGFkZHMuIEEgc2lnbmFsXG4gICAgLy8gQUxSRUFEWSBhYm9ydGVkIChhIGRlY2lkZXIgZW50ZXJlZCBhZnRlciBhIGNhbmNlbCDigJQgbm8gYWJvcnQgY2hlY2sgcHJlY2VkZXMgaXQpIGRvZXMgbm90IGZlbmNlIHRoZSBhdHRlbXB0XG4gICAgLy8gYmVmb3JlIGl0IHJ1bnM6IGl0IHJ1bnMgYXMgaXQgZGlkIGJlZm9yZSB0aGUgZmVuY2UgZXhpc3RlZCwgYW5kIGlzIGZlbmNlZCB3aGVuIGl0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIuXG4gICAgdGhpcy5jb21wb3NlZC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNvbXBvc2VkLnNpZ25hbDtcbiAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXM7XG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBzZXJpZXM6IG9wdGlvbnMuc2VyaWVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc2lnbmFsLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIC4uLihjYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXBNcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3lzdGVtOiBvcHRpb25zLmVmZmVjdC5zeXN0ZW0gfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogb3B0aW9ucy5lZmZlY3QuaWRlbXBvdGVuY3lLZXkgfSksXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogZGVhZGxpbmUgLSBub3coKSksXG4gICAgICBvYnNlcnZlZDogKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5vYnNlcnZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JzZXJ2ZWQoKTogcmVwb3J0IGFuIG91dHNpZGUgYXR0ZW1wdCB0aHJvdWdoIGBzY29wZS4kYXR0ZW1wdCgpLm9ic2VydmVkKC4uLilgJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5vYnNlcnZlKHJlcG9ydCwgeyBhdHRlbXB0LCBlbmRlZDogdGhpcy5lbmRlZCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGNhcE1zICE9PSB1bmRlZmluZWQpIEFUVEVNUFRfRU5EUy5zZXQodGhpcy5jb250ZXh0LCBzdGFydGVkQXQgKyBjYXBNcyk7XG4gIH1cblxuICAvKiogYHZhbHVlYCwgb3IgdGhlIGF0dGVtcHQgc2lnbmFsJ3MgcmVhc29uIHRoZSBtb21lbnQgaXQgYWJvcnRzIGZpcnN0IOKAlCB0aGUgZW5naW5lIHN0b3BzIHdhaXRpbmcgYXQgdGhlIGNhcC4gKi9cbiAgcmFjZTxUPih2YWx1ZTogUHJvbWlzZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHwgVCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY29tcG9zZWQuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBBbHJlYWR5IGFib3J0ZWQgKHRoZSBmdW5jdGlvbiBhYm9ydGVkIGl0IGFzIGl0IHJhbik6IGEgdmFsdWUgdGhhdCBhbHJlYWR5IHNldHRsZWQgc3RpbGwgd2lucyDigJQgaXRzXG4gICAgICAvLyByZWFjdGlvbiB3YXMgcXVldWVkIGFib3ZlLCBmaXJzdCDigJQgYW5kIGEgcGVuZGluZyBvbmUgaXMgY3V0IG9uIHRoZSBuZXh0IG1pY3JvdGFzay5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcXVldWVNaWNyb3Rhc2sob25BYm9ydCk7XG4gICAgICBlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdCBpcyBvdmVyOiByZWxlYXNlIHRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyczsgZmVuY2UgaXQgaWYgaXQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIuICovXG4gIGVuZChvdXRjb21lOiBBdHRlbXB0T3V0Y29tZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FuY2VsVGltZXI/LigpO1xuICAgIHRoaXMuY29tcG9zZWQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLmNvbXBvc2VkLmRpc3Bvc2UoKTtcbiAgICBpZiAob3V0Y29tZSAhPT0gJ29rJyAmJiBvdXRjb21lICE9PSAncGF1c2VkJykgdGhpcy5hYmFuZG9uKCk7XG4gIH1cblxuICAvKiogRmVuY2UgYW4gYXR0ZW1wdCB0aGF0IHN0YXJ0ZWQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgb25jZSBpdHMgc3luY2hyb25vdXMgcGFydCBoYXMgcnVuLiAqL1xuICBhYmFuZG9uU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFiYW5kb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWJhbmRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYmFuZG9uZWQpIHJldHVybjtcbiAgICB0aGlzLmFiYW5kb25lZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLm9uQWJhbmRvbj8uKHRoaXMuYXR0ZW1wdCk7XG4gIH1cbn1cblxuLyoqIFRoZSBzaWduYWwgYWJvcnRlZCBhdCBhIHRpbWUgbGltaXQg4oCUIHRoZSBydW4ncyBkZWFkbGluZSwgb3IgYSBjYWxsJ3MgYXR0ZW1wdCBjYXAg4oCUIG5vdCBieSBhIGNhbmNlbGxhdGlvbi4gKi9cbmZ1bmN0aW9uIHRpbWVkT3V0KHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiBpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgYXR0ZW1wdCBpdHNlbGYgZW5kZWQuIEEgdGhyb3duIHZhbHVlIGlzIHRoZSBhdHRlbXB0J3Mgb3duIGZhaWx1cmUgdW5sZXNzIGl0IElTIHdoYXQgYSBzaWduYWwgYWJvcnRlZFxuICogd2l0aCAoU3RhZ2VSdW5uZXIncyByYWNlIHJlamVjdHMgd2l0aCBpdDsgYSBzdGFnZSBtYXkgcmV0aHJvdyBpdCk6IGl0cyBvd24gY2FwJ3MgYEF0dGVtcHRUaW1lb3V0RXJyb3JgIG9yIHRoZVxuICogcnVuJ3MgZGVhZGxpbmUg4oaSIGAndGltZW91dCdgOyB0aGUgcnVuJ3MgY2FuY2VsbGF0aW9uIOKGkiBgJ2Fib3J0ZWQnYC5cbiAqL1xuZnVuY3Rpb24gb3V0Y29tZU9mKFxuICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0UmVhc29uOiBBdHRlbXB0VGltZW91dEVycm9yIHwgdW5kZWZpbmVkLFxuKTogQXR0ZW1wdE91dGNvbWUge1xuICBpZiAoIWZhaWx1cmUpIHJldHVybiAnb2snO1xuICAvLyBBbiBgaW50ZXJydXB0KClgIHRocm93biBpbnNpZGUgYSBjYWxsIGlzIGNvbnZlcnRlZCB0byBhIHBhdXNlIGF0IHRoZSBzdGFnZSBib3VuZGFyeSwgcGFzdCB0aGlzIHJ1bm5lci5cbiAgaWYgKGlzUGF1c2VTaWduYWwoZmFpbHVyZS5lcnJvcikgfHwgaXNJbnRlcnJ1cHRTaWduYWwoZmFpbHVyZS5lcnJvcikpIHJldHVybiAncGF1c2VkJztcbiAgLy8gSXRzIG93biBjYXAgcmFuIG91dCDigJQgdGhlIGF0dGVtcHQncyB0aW1lciBpcyB0aGUgb25lIHRoYXQgZmlyZWQsIGFuZCB0aGUgYXR0ZW1wdCB0aHJldyB3aGF0IGl0IGFib3J0ZWQgd2l0aC5cbiAgaWYgKHRpbWVvdXRSZWFzb24gIT09IHVuZGVmaW5lZCAmJiBmYWlsdXJlLmVycm9yID09PSB0aW1lb3V0UmVhc29uKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkICE9PSB0cnVlIHx8IGZhaWx1cmUuZXJyb3IgIT09IHNpZ25hbC5yZWFzb24pIHJldHVybiAnZmFpbGVkJztcbiAgLy8gVGhlIHJ1bidzIHNpZ25hbCBlbmRlZCBpdDogYXQgdGhlIGRlYWRsaW5lIHRoZSBhdHRlbXB0IHJhbiBvdXQgb2YgdGltZSAobGF3IDQpOyBvdGhlcndpc2UgaXQgd2FzIGNhbmNlbGxlZC5cbiAgcmV0dXJuIGlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbikgPyAndGltZW91dCcgOiAnYWJvcnRlZCc7XG59XG5cbi8qKlxuICogT25lIGF0dGVtcHQncyBkZWNpc2lvbiBpbnB1dHMsIGVhY2ggcmVhZCBvbmx5IHdoZW4gYSBydWxlIHJlYWNoZXMgaXQgKGBkZWNpZGVBdHRlbXB0YCdzIHJlYWRlcik6IHRoZSB1c2VyJ3NcbiAqIGByZXRyeU9uYCBhbmQgYGJhY2tvZmZNc2AgcnVuIGF0IG1vc3Qgb25jZSBlYWNoLCBhbmQgb25seSB3aGVuIHRoZSA5LjE1IGxvb3Agd291bGQgaGF2ZSBydW4gdGhlbS5cbiAqL1xuY2xhc3MgQXR0ZW1wdElucHV0UmVhZGVyIHtcbiAgLyoqIFRoZSBmYWlsdXJlIGEgY2F0ZWdvcnkgYW5kIGEgc2VydmVkIGVycm9yIGFyZSByZWFkIGZyb20g4oCUIG5vbmUgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYC4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAvKiogYHRydWVgIG9uY2UgYHJldHJ5T25gIHRocmV3IChpdHMgdmVyZGljdCBpcyB0aGVuIGBmYWxzZWApLiAqL1xuICByZXRyeU9uVGhyZXcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeU9uVmVyZGljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB3YWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmFpbHVyZUNhdGVnb3J5OiBBdHRlbXB0Q2F0ZWdvcnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2F0ZWdvcnlSZWFkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsZWZ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLFxuICAgIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZmFpbGVkID0gZmFpbHVyZSAmJiBvdXRjb21lICE9PSAncGF1c2VkJyA/IGZhaWx1cmUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogT25lIGlucHV0IGJ5IGl0cyBgQXR0ZW1wdElucHV0c2Aga2V5LiAqL1xuICByZWFkb25seSByZWFkID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ291dGNvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5vdXRjb21lO1xuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSgpO1xuICAgICAgY2FzZSAnYWJvcnRlZCc6XG4gICAgICAgIC8vIExpdmU6IGEgZGVjaXNpb24gdGFrZW4gYWdhaW4gYWZ0ZXIgYHJldHJ5T25gIHNlZXMgYW4gYWJvcnQgcmFpc2VkIGluc2lkZSBpdC4gVGhlIGRlYWRsaW5lIGlzIG5vdCBhXG4gICAgICAgIC8vIGNhbmNlbGxhdGlvbiDigJQgcnVsZSA2IG93bnMgaXQuXG4gICAgICAgIHJldHVybiBpc0NhbmNlbGxlZCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGNhc2UgJ2F0dGVtcHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0O1xuICAgICAgY2FzZSAnb2YnOlxuICAgICAgICByZXR1cm4gdGhpcy5vZjtcbiAgICAgIGNhc2UgJ3RpbWVMZWZ0TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy50aW1lTGVmdCgpO1xuICAgICAgY2FzZSAndGltZUxlZnRBZnRlcldhaXRNcyc6XG4gICAgICAgIC8vIFdpdGhvdXQgYSBkZWFkbGluZSB0aGUgdGltZSBsZWZ0IGlzIHVuYm91bmRlZCwgYmVmb3JlIGFueSB3YWl0IGFuZCBhZnRlciBpdCDigJQgc28gZGVjaWRpbmcgbmVlZHMgbm9cbiAgICAgICAgLy8gd2FpdCwgYW5kIGBiYWNrb2ZmTXNgIGlzIGFza2VkIGFmdGVyIHRoZSBkaXNjYXJkLCBhcyBpbiA5LjE1LiBVbmRlciBvbmUsIHRoZSB3YWl0J3MgbGVuZ3RoIGRlY2lkZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnVuYm91bmRlZCgpID8gSW5maW5pdHkgOiB0aGlzLnRpbWVMZWZ0KCkgLSB0aGlzLmRlbGF5TXMoKTtcbiAgICAgIGNhc2UgJ2RlbGF5TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWxheU1zKCk7XG4gICAgICBjYXNlICdyZXRyeU9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlPbigpO1xuICAgICAgY2FzZSAna2V5UHJlc2VudCc6XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBmYWlsdXJlJ3MgY2F0ZWdvcnksIHJlYWQgb25jZSDigJQgYXQgdGhlIGZpcnN0IHJ1bGUgdGhhdCBhc2tzLCBvciBhZnRlciB0aGUgZGVjaXNpb24uICovXG4gIGNhdGVnb3J5KCk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmNhdGVnb3J5UmVhZCkge1xuICAgICAgdGhpcy5jYXRlZ29yeVJlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5mYWlsdXJlQ2F0ZWdvcnkgPSB0aGlzLmZhaWxlZCA/IGVycm9yQ2F0ZWdvcnkodGhpcy5mYWlsZWQuZXJyb3IsIHRoaXMub3V0Y29tZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDYXRlZ29yeTtcbiAgfVxuXG4gIC8qKiBUaGUgcG9saWN5J3Mgd2FpdCBhZnRlciB0aGlzIGF0dGVtcHQgKGByZXNvbHZlQmFja29mZk1zYCksIGFza2VkIG9uY2Ug4oCUIGNhcHBlZCBhdCBpdHMgYG1heEJhY2tvZmZNc2AuICovXG4gIGRlbGF5TXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMud2FpdCA/Pz0gY2FwcGVkV2FpdE1zKFxuICAgICAgcmVzb2x2ZUJhY2tvZmZNcyh0aGlzLnBvbGljeS5iYWNrb2ZmTXMsIHRoaXMuYXR0ZW1wdCwgdGhpcy5mYWlsZWQ/LmVycm9yKSxcbiAgICAgIHRoaXMucG9saWN5Lm1heEJhY2tvZmZNcyxcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBUaGUgd2FpdCwgaWYgdGhlIGRlY2lzaW9uIGFscmVhZHkgYXNrZWQgZm9yIGl0IChydWxlIDYgdW5kZXIgYSBkZWFkbGluZSk7IG5ldmVyIGFza3MgYGJhY2tvZmZNc2AgaXRzZWxmLiAqL1xuICBkZWxheUlmQXNrZWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53YWl0O1xuICB9XG5cbiAgLyoqIE1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGRlYWRsaW5lIGF0IHRoZSBkZWNpc2lvbiwgcmVhZCBvbmNlIChgSW5maW5pdHlgIHdpdGhvdXQgb25lKS4gKi9cbiAgdGltZUxlZnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51bmJvdW5kZWQoKSkgcmV0dXJuIEluZmluaXR5O1xuICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2xvY2sgPSB0aGlzLmRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IHRoaXMuZGVhZGxpbmUgLSB0aGlzLm5vdygpO1xuICAgICAgLy8gQSB0aW1lIGxpbWl0IGFscmVhZHkgcmVhY2hlZCDigJQgdGhlIHNpZ25hbCBhYm9ydGVkIGF0IHRoZSBkZWFkbGluZSAob3IsIGZvciBhIGNhbGwsIGF0IGl0cyBhdHRlbXB0J3MgY2FwKSDigJRcbiAgICAgIC8vIGxlYXZlcyBubyB0aW1lLCB3aGF0ZXZlciB0aGUgY2xvY2sgc2F5czogYSBob3N0IHRpbWVyIG1heSBmaXJlIGEgbWlsbGlzZWNvbmQgYmVmb3JlIHRoZSBjbG9jayBnZXRzIHRoZXJlLlxuICAgICAgdGhpcy5sZWZ0ID0gdGltZWRPdXQodGhpcy5vcHRpb25zLnNpZ25hbCkgPyBNYXRoLm1pbihjbG9jaywgMCkgOiBjbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIC8qKiBObyBkZWFkbGluZSBhbmQgbm8gdGltZSBsaW1pdCByZWFjaGVkOiB0aGUgdGltZSBsZWZ0IGlzIGBJbmZpbml0eWAsIGFuZCBubyB3YWl0IG5lZWQgYmUgYXNrZWQgZm9yLiAqL1xuICBwcml2YXRlIHVuYm91bmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWFkbGluZSA9PT0gdW5kZWZpbmVkICYmICF0aW1lZE91dCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJldHJ5T25gIGdhdGUsIGFza2VkIG9uY2UuIEEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuIG9uZSBuZXZlciBsb29wcy4gKi9cbiAgcHJpdmF0ZSByZXRyeU9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnJldHJ5T25WZXJkaWN0ID09PSB1bmRlZmluZWQpIHRoaXMucmV0cnlPblZlcmRpY3QgPSB0aGlzLmFza1JldHJ5T24oKTtcbiAgICByZXR1cm4gdGhpcy5yZXRyeU9uVmVyZGljdDtcbiAgfVxuXG4gIHByaXZhdGUgYXNrUmV0cnlPbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2xpY3kucmV0cnlPbih0aGlzLmZhaWxlZD8uZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHRocm93bikge1xuICAgICAgdGhpcy5yZXRyeU9uVGhyZXcgPSB0cnVlO1xuICAgICAgdGhpcy5vcHRpb25zLm9uUmV0cnlPblRocmV3Py4odGhyb3duKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9saWN5J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWQgKDEtYmFzZWQpIGFuZCBpdHMgZXJyb3IuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlLFxuICogcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYSBuZWdhdGl2ZSB2YWx1ZSwgYSBgTmFOYCBmcm9tIGEgY29uc3VtZXIncyBhcml0aG1ldGljLCBvciBhIHRocm93aW5nXG4gKiBmdW5jdGlvbiDigJQgYmVjb21lcyBgMGAsIGkuZS4gcmV0cnkgaW1tZWRpYXRlbHkuIEEgYmFja29mZiBkaWFsIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjcmFzaCBhIHJ1biBvciBwYXJrIGl0XG4gKiBmb3JldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IFJldHJ5UG9saWN5WydiYWNrb2ZmTXMnXSwgYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQsIGVycm9yKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzXG4gKiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuIG5ldmVyIHNpdHMgb3V0IGEgbG9uZyBiYWNrb2ZmIGFuZCBuZXZlciBsb3NlcyB0aGUgZmFpbHVyZSB0aGF0XG4gKiBjYXVzZWQgaXQuIFRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyIGFyZSBhbHdheXMgY2xlYW5lZCB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhvdyBhIHJlY29yZCBlbmRlZCBpdHMgc2VyaWVzLCBhcyB0aGUgc3VtbWFyeSdzIGBsYXN0YCBzYXlzIGl0LiBPbiBhIHRvdWNoaW5nIHRhcmdldCB0aGUgZWZmZWN0IGlzIHRoZSBTRVJJRVMnXG4gKiAoYHVua25vd25Tb0ZhcmApOiB1bmtub3duIG9uY2UgYW55IGF0dGVtcHQgbGVmdCBpdCB1bmtub3duLCB1bmxlc3MgdGhlIHNlcmllcyBlbmRlZCB3aXRoIGFuIGFuc3dlci5cbiAqL1xuZnVuY3Rpb24gbGFzdE9mKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgdW5rbm93blNvRmFyID0gZmFsc2UpOiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddIHtcbiAgY29uc3QgZWZmZWN0ID0gcmVjb3JkLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHVua25vd25Tb0ZhciAmJiByZWNvcmQub3V0Y29tZSAhPT0gJ29rJyA/ICd1bmtub3duJyA6IHJlY29yZC5lZmZlY3Q7XG4gIHJldHVybiB7XG4gICAgbmV4dDogcmVjb3JkLm5leHQgYXMgQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXVsnbmV4dCddLFxuICAgIHJlYXNvbjogcmVjb3JkLnJlYXNvbixcbiAgICAuLi4ocmVjb3JkLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5IH0pLFxuICAgIC4uLihyZWNvcmQucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgfTtcbn1cblxuLyoqIFBlci1vdXRjb21lIGNvdW50cyBvZiBhIHNlcmllcywgZm9yIGl0cyBzdW1tYXJ5LiAqL1xuY2xhc3MgU2VyaWVzVGFsbHkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvdW50cyA9IHsgY291bnQ6IDAsIG9rOiAwLCBmYWlsZWQ6IDAsIHRpbWVvdXQ6IDAsIGFib3J0ZWQ6IDAsIHBhdXNlZDogMCB9O1xuXG4gIGFkZChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50cy5jb3VudCArPSAxO1xuICAgIHRoaXMuY291bnRzW3JlY29yZC5vdXRjb21lXSArPSAxO1xuICB9XG5cbiAgc3VtbWFyeShsYXN0OiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddKTogQXR0ZW1wdFN1bW1hcnkge1xuICAgIHJldHVybiBmcmVlemVEZWVwPEF0dGVtcHRTdW1tYXJ5Pih7IC4uLnRoaXMuY291bnRzLCBsYXN0IH0pO1xuICB9XG59XG4iXX0=
@@ -8,6 +8,7 @@
8
8
  * - Aggregate results into { childId: { result, isError } }
9
9
  */
10
10
  import { isPauseSignal } from '../../pause/types.js';
11
+ import { commitStageWrites } from './commitStage.js';
11
12
  import { loggableStageError, servedStageError } from './stageError.js';
12
13
  import { isTraversalDepthError } from './TraversalDepthError.js';
13
14
  /**
@@ -56,10 +57,17 @@ export class ChildrenExecutor {
56
57
  // "decision made" semantic (the fork's main work is the decision
57
58
  // to fan out; children are separate stages with their own lifecycles).
58
59
  this.deps.narrativeGenerator.onStageExecuted(node.name, node.description, traversalContext, 'fork');
60
+ const childContexts = [];
59
61
  const childPromises = allChildren.map((child) => {
60
62
  const childBranchPath = branchPath || child.id;
61
63
  const childContext = context.createChild(childBranchPath, child.id, child.name, child.id);
64
+ childContexts.push(childContext);
62
65
  const childBreakFlag = { shouldBreak: false };
66
+ const commitChild = () => {
67
+ // The settled FRAME owns its repeat commit, even when it replaces a
68
+ // previous error. The parent's run is shared, its stage identity is not.
69
+ commitStageWrites(childContext, 'repeat');
70
+ };
63
71
  const updateParentBreakFlag = () => {
64
72
  if (childBreakFlag.shouldBreak)
65
73
  breakCount += 1;
@@ -70,7 +78,7 @@ export class ChildrenExecutor {
70
78
  .then((result) => {
71
79
  // The fan-out's settle commit is a CONTINUATION of the child's
72
80
  // execution — named on the record (9.39.0), never inferred.
73
- childContext.commit('repeat');
81
+ commitChild();
74
82
  updateParentBreakFlag();
75
83
  return { id: child.id, result, isError: false };
76
84
  })
@@ -80,7 +88,7 @@ export class ChildrenExecutor {
80
88
  // result: the child never ran, so there is nothing to record.
81
89
  if (isPauseSignal(error) || isTraversalDepthError(error))
82
90
  throw error;
83
- childContext.commit('repeat');
91
+ commitChild();
84
92
  updateParentBreakFlag();
85
93
  this.deps.logger.info(`TREE PIPELINE: executeNodeChildren - Error for id: ${child?.id}`, {
86
94
  error: loggableStageError(childContext, error),
@@ -102,17 +110,34 @@ export class ChildrenExecutor {
102
110
  // after every child settles, ahead of any pause.
103
111
  let failure;
104
112
  if (node.failFast) {
113
+ // Promise.all selects the first escaping rejection. A late sibling must
114
+ // neither replace its identity nor keep a raw failure in the saved tree.
115
+ let escaped = false;
116
+ const escape = (index, error) => {
117
+ if (!escaped) {
118
+ escaped = true;
119
+ context.failureState.adopt(childContexts[index].failureState, error);
120
+ }
121
+ else
122
+ childContexts[index].failureState.complete();
123
+ };
105
124
  // Fail-fast: first child ERROR rejects immediately (unwrapped). A pause
106
125
  // is not an error: it settles like a result, so the fork waits for its
107
126
  // siblings before it pauses — their writes land before the checkpoint
108
127
  // is taken, and a second pausing sibling is seen, not raced past.
109
128
  const results = await Promise.all(allChildren.map((child, i) => childPromises[i].then((r) => {
110
- if (r.isError)
129
+ if (r.isError) {
130
+ escape(i, r.result);
111
131
  throw r.result;
132
+ }
133
+ childContexts[i].failureState.complete();
112
134
  return r;
113
135
  }, (error) => {
114
- if (!isPauseSignal(error))
136
+ if (!isPauseSignal(error)) {
137
+ escape(i, error);
115
138
  throw error;
139
+ }
140
+ childContexts[i].failureState.complete();
116
141
  pausedAt[i] = error;
117
142
  return undefined;
118
143
  })));
@@ -135,9 +160,14 @@ export class ChildrenExecutor {
135
160
  pausedAt[i] = s.reason;
136
161
  }
137
162
  else {
138
- failure ??= { error: s.reason };
163
+ failure ??= { error: s.reason, index: i };
139
164
  }
140
165
  });
166
+ // Contained errors are results, never the run's terminal cause.
167
+ if (failure)
168
+ context.failureState.adopt(childContexts[failure.index].failureState, failure.error);
169
+ for (const child of childContexts)
170
+ child.failureState.complete();
141
171
  }
142
172
  if (failure)
143
173
  throw failure.error;
@@ -192,4 +222,4 @@ export class ChildrenExecutor {
192
222
  return await this.executeNodeChildren(tempNode, context, undefined, branchPath, traversalContext);
193
223
  }
194
224
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hpbGRyZW5FeGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLakU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsTUFBOEI7SUFDakQsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYTtZQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDUDtJQUF5QztJQUE3RCxZQUFvQixJQUErQixFQUFVLFdBQXdDO1FBQWpGLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO0lBQUcsQ0FBQztJQUV6Rzs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLElBQTZCLEVBQzdCLE9BQXFCLEVBQ3JCLGVBQTBDLEVBQzFDLFVBQW1CLEVBQ25CLGdCQUFtQztRQUVuQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFB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XG4gKiBDaGlsZHJlbkV4ZWN1dG9yIOKAlCBQYXJhbGxlbCBmYW4tb3V0IHZpYSBQcm9taXNlLmFsbFNldHRsZWQuXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gRXhlY3V0ZSBhbGwgY2hpbGRyZW4gaW4gcGFyYWxsZWwgKGZvcmsgcGF0dGVybilcbiAqIC0gRXhlY3V0ZSBzZWxlY3RlZCBjaGlsZHJlbiBiYXNlZCBvbiBzZWxlY3RvciBvdXRwdXQgKG11bHRpLWNob2ljZSlcbiAqIC0gTmFtZSBhIGNoaWxkJ3MgdGhyb3R0bGluZyBlcnJvciBhcyBhbiBgb25UaHJvdHRsZWRgIGZsb3cgZXZlbnQgKDkuMzkuMClcbiAqIC0gQWdncmVnYXRlIHJlc3VsdHMgaW50byB7IGNoaWxkSWQ6IHsgcmVzdWx0LCBpc0Vycm9yIH0gfVxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VsZWN0b3IsIFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgTm9kZVJlc3VsdFR5cGUgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHNlcnZlZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgaXNUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi9UcmF2ZXJzYWxEZXB0aEVycm9yLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGVOb2RlRm4gfTtcblxuLyoqXG4gKiBUaGUgT05FIHBhdXNlIGEgZmFuLW91dCByYWlzZXMgd2hlbiBzZXZlcmFsIG9mIGl0cyBjaGlsZHJlbiBwYXVzZWQgKDkuMjguMCkuXG4gKlxuICogT25seSBvbmUgcXVlc3Rpb24gaXMgYXNrZWQgYXQgYSB0aW1lLCBzbyB0aGUgRklSU1QgY2hpbGQncyBwYXVzZSAoY2hpbGRcbiAqIG9yZGVyKSBpcyB0aGUgb25lIHJhaXNlZDsgZXZlcnkgb3RoZXIgY2hpbGQncyBwYXVzZSDigJQgYW5kIGFueSBwYXVzZSBhbHJlYWR5XG4gKiB3YWl0aW5nIGJlaGluZCBpdCDigJQgaXMgcXVldWVkIG9uIGl0IChgUGF1c2VTaWduYWwucGVuZGluZ1BhdXNlc2ApIGFuZCByaWRlc1xuICogdGhlIGNoZWNrcG9pbnQgYXMgYHBlbmRpbmdQYXVzZXNgLiBCZWZvcmUgOS4yOC4wIHRoZSBvdGhlcnMgd2VyZSBkcm9wcGVkXG4gKiBzaWxlbnRseTogdGhlIGNoZWNrcG9pbnQgYXNrZWQgb25lIGNoaWxkLCBhbmQgdGhlIHJlc3VtZSBuZXZlciBhc2tlZCB0aGVcbiAqIHJlc3QgKG9yLCBvbiA5LjI3LjAsIHJlLXJhbiB0aGUgd2hvbGUgZmFuLW91dCBmb3JldmVyKS5cbiAqXG4gKiBFdmVyeSBxdWV1ZWQgZW50cnkgaXMgcmVsYXRpdmUgdG8gdGhlIGZhbi1vdXQncyBsZXZlbCDigJQgdGhlIHNhbWUgbGV2ZWwgdGhlXG4gKiBmaXJzdCBzaWduYWwgaXMgYXQg4oCUIHNvIHRoZSBidWJibGUtdXAgZ3Jvd3MgdGhlbSB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gcmFpc2VQYXVzZXMocGF1c2VzOiByZWFkb25seSBQYXVzZVNpZ25hbFtdKTogUGF1c2VTaWduYWwge1xuICBjb25zdCBbZmlyc3QsIC4uLm90aGVyc10gPSBwYXVzZXM7XG4gIGZvciAoY29uc3Qgb3RoZXIgb2Ygb3RoZXJzKSB7XG4gICAgZmlyc3QuYWRkUGVuZGluZ1BhdXNlKG90aGVyLnRvUGVuZGluZ1BhdXNlKCkpO1xuICAgIGZvciAoY29uc3Qgd2FpdGluZyBvZiBvdGhlci5wZW5kaW5nUGF1c2VzKSBmaXJzdC5hZGRQZW5kaW5nUGF1c2Uod2FpdGluZyk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbGRyZW5FeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LCBwcml2YXRlIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYWxsIGNoaWxkcmVuIGluIHBhcmFsbGVsLiBFYWNoIGNoaWxkIGNvbW1pdHMgb24gc2V0dGxlLlxuICAgKiBVc2VzIFByb21pc2UuYWxsU2V0dGxlZCB0byBlbnN1cmUgYWxsIGNoaWxkcmVuIGNvbXBsZXRlIGV2ZW4gaWYgc29tZSBmYWlsLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgcGFyZW50QnJlYWtGbGFnPzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+PiB7XG4gICAgbGV0IGJyZWFrQ291bnQgPSAwO1xuICAgIGNvbnN0IHRvdGFsQ2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gPz8gW107XG5cbiAgICAvLyBOYXJyYXRpdmU6IGNhcHR1cmUgdGhlIGZhbi1vdXRcbiAgICBjb25zdCBjaGlsZERpc3BsYXlOYW1lcyA9IGFsbENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRm9yayhub2RlLm5hbWUsIGNoaWxkRGlzcGxheU5hbWVzLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBmb3IgdGhlIGZvcmsgcGFyZW50IEFGVEVSXG4gICAgLy8gdGhlIHNwZWNpYWxpemVkIGV2ZW50IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiXG4gICAgLy8gd29yayB1bmlmb3JtbHkuIEZpcmVzIEJFRk9SRSBjaGlsZHJlbiBleGVjdXRlIOKAlCBtYXRjaGluZyB0aGVcbiAgICAvLyBcImRlY2lzaW9uIG1hZGVcIiBzZW1hbnRpYyAodGhlIGZvcmsncyBtYWluIHdvcmsgaXMgdGhlIGRlY2lzaW9uXG4gICAgLy8gdG8gZmFuIG91dDsgY2hpbGRyZW4gYXJlIHNlcGFyYXRlIHN0YWdlcyB3aXRoIHRoZWlyIG93biBsaWZlY3ljbGVzKS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdmb3JrJyk7XG5cbiAgICBjb25zdCBjaGlsZFByb21pc2VzOiBQcm9taXNlPE5vZGVSZXN1bHRUeXBlPltdID0gYWxsQ2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRCcmFuY2hQYXRoID0gYnJhbmNoUGF0aCB8fCBjaGlsZC5pZDtcbiAgICAgIGNvbnN0IGNoaWxkQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlQ2hpbGQoY2hpbGRCcmFuY2hQYXRoIGFzIHN0cmluZywgY2hpbGQuaWQgYXMgc3RyaW5nLCBjaGlsZC5uYW1lLCBjaGlsZC5pZCk7XG4gICAgICBjb25zdCBjaGlsZEJyZWFrRmxhZyA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVBhcmVudEJyZWFrRmxhZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkQnJlYWtGbGFnLnNob3VsZEJyZWFrKSBicmVha0NvdW50ICs9IDE7XG4gICAgICAgIGlmIChwYXJlbnRCcmVha0ZsYWcgJiYgYnJlYWtDb3VudCA9PT0gdG90YWxDaGlsZHJlbikgcGFyZW50QnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVOb2RlKGNoaWxkLCBjaGlsZENvbnRleHQsIGNoaWxkQnJlYWtGbGFnLCBjaGlsZEJyYW5jaFBhdGgpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAvLyBUaGUgZmFuLW91dCdzIHNldHRsZSBjb21taXQgaXMgYSBDT05USU5VQVRJT04gb2YgdGhlIGNoaWxkJ3NcbiAgICAgICAgICAvLyBleGVjdXRpb24g4oCUIG5hbWVkIG9uIHRoZSByZWNvcmQgKDkuMzkuMCksIG5ldmVyIGluZmVycmVkLlxuICAgICAgICAgIGNoaWxkQ29udGV4dC5jb21taXQoJ3JlcGVhdCcpO1xuICAgICAgICAgIHVwZGF0ZVBhcmVudEJyZWFrRmxhZygpO1xuICAgICAgICAgIHJldHVybiB7IGlkOiBjaGlsZC5pZCEsIHJlc3VsdCwgaXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdyDigJQgcmUtdGhyb3cgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgLy8gQSByZWFjaGVkIGRlcHRoIGNhcCBpcyBhIFJVTiBmYWlsdXJlLCBuZXZlciBhIGNvbnRhaW5lZCBjaGlsZFxuICAgICAgICAgIC8vIHJlc3VsdDogdGhlIGNoaWxkIG5ldmVyIHJhbiwgc28gdGhlcmUgaXMgbm90aGluZyB0byByZWNvcmQuXG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpIHx8IGlzVHJhdmVyc2FsRGVwdGhFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5jb21taXQoJ3JlcGVhdCcpO1xuICAgICAgICAgIHVwZGF0ZVBhcmVudEJyZWFrRmxhZygpO1xuICAgICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuaW5mbyhgVFJFRSBQSVBFTElORTogZXhlY3V0ZU5vZGVDaGlsZHJlbiAtIEVycm9yIGZvciBpZDogJHtjaGlsZD8uaWR9YCwge1xuICAgICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjaGlsZENvbnRleHQsIGVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUaHJvdHRsaW5nIGlzIHRlbGVtZXRyeSAoUjkpOiBhbiBldmVudCwgbm90IGEgc3RhdGUga2V5LiBCZWZvcmVcbiAgICAgICAgICAvLyA5LjM5LjAgdGhpcyB3cm90ZSBgbW9uaXRvci5pc1Rocm90dGxlZGAgQUZURVIgdGhlIGNoaWxkJ3MgbGFzdFxuICAgICAgICAgIC8vIGNvbW1pdCwgc28gaXQgbGFuZGVkIG5vd2hlcmUuXG4gICAgICAgICAgaWYgKHRoaXMuZGVwcy50aHJvdHRsaW5nRXJyb3JDaGVja2VyICYmIHRoaXMuZGVwcy50aHJvdHRsaW5nRXJyb3JDaGVja2VyKGVycm9yKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmVkID0gc2VydmVkU3RhZ2VFcnJvcihjaGlsZENvbnRleHQsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25UaHJvdHRsZWQ/LihjaGlsZC5uYW1lLCBjaGlsZC5pZCBhcyBzdHJpbmcsIHNlcnZlZCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGlkOiBjaGlsZC5pZCEsIHJlc3VsdDogZXJyb3IsIGlzRXJyb3I6IHRydWUgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPiA9IHt9O1xuICAgIC8vIEV2ZXJ5IGNoaWxkIHRoYXQgcGF1c2VkLCBieSBDSElMRCBpbmRleCAobm90IHNldHRsZSBvcmRlcikg4oCUIHNlZSByYWlzZVBhdXNlcy5cbiAgICBjb25zdCBwYXVzZWRBdDogKFBhdXNlU2lnbmFsIHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgLy8gVGhlIGZpcnN0IHJ1biBmYWlsdXJlIGJ5IENISUxEIGluZGV4IChhIHJlYWNoZWQgZGVwdGggY2FwKSDigJQgcmV0aHJvd25cbiAgICAvLyBhZnRlciBldmVyeSBjaGlsZCBzZXR0bGVzLCBhaGVhZCBvZiBhbnkgcGF1c2UuXG4gICAgbGV0IGZhaWx1cmU6IHsgZXJyb3I6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChub2RlLmZhaWxGYXN0KSB7XG4gICAgICAvLyBGYWlsLWZhc3Q6IGZpcnN0IGNoaWxkIEVSUk9SIHJlamVjdHMgaW1tZWRpYXRlbHkgKHVud3JhcHBlZCkuIEEgcGF1c2VcbiAgICAgIC8vIGlzIG5vdCBhbiBlcnJvcjogaXQgc2V0dGxlcyBsaWtlIGEgcmVzdWx0LCBzbyB0aGUgZm9yayB3YWl0cyBmb3IgaXRzXG4gICAgICAvLyBzaWJsaW5ncyBiZWZvcmUgaXQgcGF1c2VzIOKAlCB0aGVpciB3cml0ZXMgbGFuZCBiZWZvcmUgdGhlIGNoZWNrcG9pbnRcbiAgICAgIC8vIGlzIHRha2VuLCBhbmQgYSBzZWNvbmQgcGF1c2luZyBzaWJsaW5nIGlzIHNlZW4sIG5vdCByYWNlZCBwYXN0LlxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBhbGxDaGlsZHJlbi5tYXAoKGNoaWxkLCBpKSA9PlxuICAgICAgICAgIGNoaWxkUHJvbWlzZXNbaV0udGhlbihcbiAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyLmlzRXJyb3IpIHRocm93IHIucmVzdWx0O1xuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIHBhdXNlZEF0W2ldID0gZXJyb3I7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCByIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgY29udGludWU7IC8vIGEgcGF1c2VkIGNoaWxkXG4gICAgICAgIGNoaWxkcmVuUmVzdWx0c1tyLmlkXSA9IHsgaWQ6IHIuaWQsIHJlc3VsdDogci5yZXN1bHQsIGlzRXJyb3I6IHIuaXNFcnJvciA/PyBmYWxzZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBydW4gYWxsIGNoaWxkcmVuIHRvIGNvbXBsZXRpb24gZXZlbiBpZiBzb21lIGZhaWxcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2hpbGRQcm9taXNlcyk7XG4gICAgICBzZXR0bGVkLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgICAgaWYgKHMuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgIGNvbnN0IHsgaWQsIHJlc3VsdCwgaXNFcnJvciB9ID0gcy52YWx1ZTtcbiAgICAgICAgICBjaGlsZHJlblJlc3VsdHNbaWRdID0geyBpZCwgcmVzdWx0LCBpc0Vycm9yOiBpc0Vycm9yID8/IGZhbHNlIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQYXVzZVNpZ25hbChzLnJlYXNvbikpIHtcbiAgICAgICAgICAvLyBQYXVzZVNpZ25hbCBmcm9tIGEgY2hpbGQg4oCUIHJlLXRocm93biBhZnRlciBhbGwgY2hpbGRyZW4gc2V0dGxlLlxuICAgICAgICAgIHBhdXNlZEF0W2ldID0gcy5yZWFzb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFpbHVyZSA/Pz0geyBlcnJvcjogcy5yZWFzb24gfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLmVycm9yO1xuXG4gICAgLy8gUmUtdGhyb3cgYWZ0ZXIgZXZlcnkgY2hpbGQgaGFzIHNldHRsZWQuXG4gICAgY29uc3QgcGF1c2VzID0gcGF1c2VkQXQuZmlsdGVyKChwKTogcCBpcyBQYXVzZVNpZ25hbCA9PiBwICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChwYXVzZXMubGVuZ3RoID4gMCkgdGhyb3cgcmFpc2VQYXVzZXMocGF1c2VzKTtcblxuICAgIHJldHVybiBjaGlsZHJlblJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBzZWxlY3RlZCBjaGlsZHJlbiBiYXNlZCBvbiBzZWxlY3RvciByZXN1bHQuXG4gICAqIFZhbGlkYXRlcyBJRHMsIHJlY29yZHMgc2VsZWN0aW9uIGluZm8sIHRoZW4gZGVsZWdhdGVzIHRvIGV4ZWN1dGVOb2RlQ2hpbGRyZW4uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICBzZWxlY3RvcjogU2VsZWN0b3IsXG4gICAgY2hpbGRyZW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10sXG4gICAgaW5wdXQ6IGFueSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICAgIGZhaWxGYXN0PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT4+IHtcbiAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHNlbGVjdG9yKGlucHV0KTtcbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IEFycmF5LmlzQXJyYXkoc2VsZWN0b3JSZXN1bHQpID8gc2VsZWN0b3JSZXN1bHQgOiBbc2VsZWN0b3JSZXN1bHRdO1xuXG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdGVkQ2hpbGRJZHMnLCBzZWxlY3RlZElkcyk7XG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdG9yUGF0dGVybicsICdtdWx0aS1jaG9pY2UnKTtcblxuICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQWxsQ2hpbGRyZW4nLCB0cnVlKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmlkISkpO1xuXG4gICAgLy8gVmFsaWRhdGUgYWxsIElEcyBleGlzdCAoZmFpbCBmYXN0KVxuICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCAhPT0gc2VsZWN0ZWRJZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaGlsZElkcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCk7XG4gICAgICBjb25zdCBtaXNzaW5nID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpZCkgPT4gIWNoaWxkSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU2VsZWN0b3IgcmV0dXJuZWQgdW5rbm93biBjaGlsZCBJRHM6ICR7bWlzc2luZy5qb2luKCcsICcpfS4gQXZhaWxhYmxlOiAke2NoaWxkSWRzLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSk6YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgY29udGV4dC5hZGRFcnJvcignc2VsZWN0b3JFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBza2lwcGVkSWRzID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5pZCEpKS5tYXAoKGMpID0+IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgLy8gTmFycmF0aXZlOiBjYXB0dXJlIHRoZSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZERpc3BsYXlOYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpO1xuICAgIGNvbnN0IHNlbGVjdG9yTmFtZSA9IGNvbnRleHQuc3RhZ2VOYW1lIHx8ICdzZWxlY3Rvcic7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKHNlbGVjdG9yTmFtZSwgc2VsZWN0ZWREaXNwbGF5TmFtZXMsIGNoaWxkcmVuLmxlbmd0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgQUZURVIgdGhlIHNwZWNpYWxpemVkIGV2ZW50LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKHNlbGVjdG9yTmFtZSwgdW5kZWZpbmVkLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcblxuICAgIGNvbnN0IHRlbXBOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6ICdzZWxlY3Rvci10ZW1wJyxcbiAgICAgIGlkOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBjaGlsZHJlbjogc2VsZWN0ZWRDaGlsZHJlbixcbiAgICAgIC8vIEhvbm9yIHRoZSBzZWxlY3RvciBub2RlJ3MgZmFuLW91dCBlcnJvciBtb2RlIChQcm9taXNlLmFsbCB2cyBhbGxTZXR0bGVkKS5cbiAgICAgIGZhaWxGYXN0LFxuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGVDaGlsZHJlbih0ZW1wTm9kZSwgY29udGV4dCwgdW5kZWZpbmVkLCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgfVxufVxuIl19
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hpbGRyZW5FeGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLakU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsTUFBOEI7SUFDakQsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYTtZQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDUDtJQUF5QztJQUE3RCxZQUFvQixJQUErQixFQUFVLFdBQXdDO1FBQWpGLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO0lBQUcsQ0FBQztJQUV6Rzs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLElBQTZCLEVBQzdCLE9BQXFCLEVBQ3JCLGVBQTBDLEVBQzFDLFVBQW1CLEVBQ25CLGdC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QkFBbUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoaWxkcmVuRXhlY3V0b3Ig4oCUIFBhcmFsbGVsIGZhbi1vdXQgdmlhIFByb21pc2UuYWxsU2V0dGxlZC5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBFeGVjdXRlIGFsbCBjaGlsZHJlbiBpbiBwYXJhbGxlbCAoZm9yayBwYXR0ZXJuKVxuICogLSBFeGVjdXRlIHNlbGVjdGVkIGNoaWxkcmVuIGJhc2VkIG9uIHNlbGVjdG9yIG91dHB1dCAobXVsdGktY2hvaWNlKVxuICogLSBOYW1lIGEgY2hpbGQncyB0aHJvdHRsaW5nIGVycm9yIGFzIGFuIGBvblRocm90dGxlZGAgZmxvdyBldmVudCAoOS4zOS4wKVxuICogLSBBZ2dyZWdhdGUgcmVzdWx0cyBpbnRvIHsgY2hpbGRJZDogeyByZXN1bHQsIGlzRXJyb3IgfSB9XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RvciwgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBOb2RlUmVzdWx0VHlwZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHNlcnZlZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgaXNUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi9UcmF2ZXJzYWxEZXB0aEVycm9yLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGVOb2RlRm4gfTtcblxuLyoqXG4gKiBUaGUgT05FIHBhdXNlIGEgZmFuLW91dCByYWlzZXMgd2hlbiBzZXZlcmFsIG9mIGl0cyBjaGlsZHJlbiBwYXVzZWQgKDkuMjguMCkuXG4gKlxuICogT25seSBvbmUgcXVlc3Rpb24gaXMgYXNrZWQgYXQgYSB0aW1lLCBzbyB0aGUgRklSU1QgY2hpbGQncyBwYXVzZSAoY2hpbGRcbiAqIG9yZGVyKSBpcyB0aGUgb25lIHJhaXNlZDsgZXZlcnkgb3RoZXIgY2hpbGQncyBwYXVzZSDigJQgYW5kIGFueSBwYXVzZSBhbHJlYWR5XG4gKiB3YWl0aW5nIGJlaGluZCBpdCDigJQgaXMgcXVldWVkIG9uIGl0IChgUGF1c2VTaWduYWwucGVuZGluZ1BhdXNlc2ApIGFuZCByaWRlc1xuICogdGhlIGNoZWNrcG9pbnQgYXMgYHBlbmRpbmdQYXVzZXNgLiBCZWZvcmUgOS4yOC4wIHRoZSBvdGhlcnMgd2VyZSBkcm9wcGVkXG4gKiBzaWxlbnRseTogdGhlIGNoZWNrcG9pbnQgYXNrZWQgb25lIGNoaWxkLCBhbmQgdGhlIHJlc3VtZSBuZXZlciBhc2tlZCB0aGVcbiAqIHJlc3QgKG9yLCBvbiA5LjI3LjAsIHJlLXJhbiB0aGUgd2hvbGUgZmFuLW91dCBmb3JldmVyKS5cbiAqXG4gKiBFdmVyeSBxdWV1ZWQgZW50cnkgaXMgcmVsYXRpdmUgdG8gdGhlIGZhbi1vdXQncyBsZXZlbCDigJQgdGhlIHNhbWUgbGV2ZWwgdGhlXG4gKiBmaXJzdCBzaWduYWwgaXMgYXQg4oCUIHNvIHRoZSBidWJibGUtdXAgZ3Jvd3MgdGhlbSB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gcmFpc2VQYXVzZXMocGF1c2VzOiByZWFkb25seSBQYXVzZVNpZ25hbFtdKTogUGF1c2VTaWduYWwge1xuICBjb25zdCBbZmlyc3QsIC4uLm90aGVyc10gPSBwYXVzZXM7XG4gIGZvciAoY29uc3Qgb3RoZXIgb2Ygb3RoZXJzKSB7XG4gICAgZmlyc3QuYWRkUGVuZGluZ1BhdXNlKG90aGVyLnRvUGVuZGluZ1BhdXNlKCkpO1xuICAgIGZvciAoY29uc3Qgd2FpdGluZyBvZiBvdGhlci5wZW5kaW5nUGF1c2VzKSBmaXJzdC5hZGRQZW5kaW5nUGF1c2Uod2FpdGluZyk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5leHBvcnQgY2xhc3MgQ2hpbGRyZW5FeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LCBwcml2YXRlIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYWxsIGNoaWxkcmVuIGluIHBhcmFsbGVsLiBFYWNoIGNoaWxkIGNvbW1pdHMgb24gc2V0dGxlLlxuICAgKiBVc2VzIFByb21pc2UuYWxsU2V0dGxlZCB0byBlbnN1cmUgYWxsIGNoaWxkcmVuIGNvbXBsZXRlIGV2ZW4gaWYgc29tZSBmYWlsLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgcGFyZW50QnJlYWtGbGFnPzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+PiB7XG4gICAgbGV0IGJyZWFrQ291bnQgPSAwO1xuICAgIGNvbnN0IHRvdGFsQ2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gPz8gW107XG5cbiAgICAvLyBOYXJyYXRpdmU6IGNhcHR1cmUgdGhlIGZhbi1vdXRcbiAgICBjb25zdCBjaGlsZERpc3BsYXlOYW1lcyA9IGFsbENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRm9yayhub2RlLm5hbWUsIGNoaWxkRGlzcGxheU5hbWVzLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBmb3IgdGhlIGZvcmsgcGFyZW50IEFGVEVSXG4gICAgLy8gdGhlIHNwZWNpYWxpemVkIGV2ZW50IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiXG4gICAgLy8gd29yayB1bmlmb3JtbHkuIEZpcmVzIEJFRk9SRSBjaGlsZHJlbiBleGVjdXRlIOKAlCBtYXRjaGluZyB0aGVcbiAgICAvLyBcImRlY2lzaW9uIG1hZGVcIiBzZW1hbnRpYyAodGhlIGZvcmsncyBtYWluIHdvcmsgaXMgdGhlIGRlY2lzaW9uXG4gICAgLy8gdG8gZmFuIG91dDsgY2hpbGRyZW4gYXJlIHNlcGFyYXRlIHN0YWdlcyB3aXRoIHRoZWlyIG93biBsaWZlY3ljbGVzKS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdmb3JrJyk7XG5cbiAgICBjb25zdCBjaGlsZENvbnRleHRzOiBTdGFnZUNvbnRleHRbXSA9IFtdO1xuICAgIGNvbnN0IGNoaWxkUHJvbWlzZXM6IFByb21pc2U8Tm9kZVJlc3VsdFR5cGU+W10gPSBhbGxDaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZEJyYW5jaFBhdGggPSBicmFuY2hQYXRoIHx8IGNoaWxkLmlkO1xuICAgICAgY29uc3QgY2hpbGRDb250ZXh0ID0gY29udGV4dC5jcmVhdGVDaGlsZChjaGlsZEJyYW5jaFBhdGggYXMgc3RyaW5nLCBjaGlsZC5pZCBhcyBzdHJpbmcsIGNoaWxkLm5hbWUsIGNoaWxkLmlkKTtcbiAgICAgIGNoaWxkQ29udGV4dHMucHVzaChjaGlsZENvbnRleHQpO1xuICAgICAgY29uc3QgY2hpbGRCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgICAgY29uc3QgY29tbWl0Q2hpbGQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIFRoZSBzZXR0bGVkIEZSQU1FIG93bnMgaXRzIHJlcGVhdCBjb21taXQsIGV2ZW4gd2hlbiBpdCByZXBsYWNlcyBhXG4gICAgICAgIC8vIHByZXZpb3VzIGVycm9yLiBUaGUgcGFyZW50J3MgcnVuIGlzIHNoYXJlZCwgaXRzIHN0YWdlIGlkZW50aXR5IGlzIG5vdC5cbiAgICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY2hpbGRDb250ZXh0LCAncmVwZWF0Jyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVQYXJlbnRCcmVha0ZsYWcgPSAoKSA9PiB7XG4gICAgICAgIGlmIChjaGlsZEJyZWFrRmxhZy5zaG91bGRCcmVhaykgYnJlYWtDb3VudCArPSAxO1xuICAgICAgICBpZiAocGFyZW50QnJlYWtGbGFnICYmIGJyZWFrQ291bnQgPT09IHRvdGFsQ2hpbGRyZW4pIHBhcmVudEJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlTm9kZShjaGlsZCwgY2hpbGRDb250ZXh0LCBjaGlsZEJyZWFrRmxhZywgY2hpbGRCcmFuY2hQYXRoKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgLy8gVGhlIGZhbi1vdXQncyBzZXR0bGUgY29tbWl0IGlzIGEgQ09OVElOVUFUSU9OIG9mIHRoZSBjaGlsZCdzXG4gICAgICAgICAgLy8gZXhlY3V0aW9uIOKAlCBuYW1lZCBvbiB0aGUgcmVjb3JkICg5LjM5LjApLCBuZXZlciBpbmZlcnJlZC5cbiAgICAgICAgICBjb21taXRDaGlsZCgpO1xuICAgICAgICAgIHVwZGF0ZVBhcmVudEJyZWFrRmxhZygpO1xuICAgICAgICAgIHJldHVybiB7IGlkOiBjaGlsZC5pZCEsIHJlc3VsdCwgaXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdyDigJQgcmUtdGhyb3cgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgLy8gQSByZWFjaGVkIGRlcHRoIGNhcCBpcyBhIFJVTiBmYWlsdXJlLCBuZXZlciBhIGNvbnRhaW5lZCBjaGlsZFxuICAgICAgICAgIC8vIHJlc3VsdDogdGhlIGNoaWxkIG5ldmVyIHJhbiwgc28gdGhlcmUgaXMgbm90aGluZyB0byByZWNvcmQuXG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpIHx8IGlzVHJhdmVyc2FsRGVwdGhFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIGNvbW1pdENoaWxkKCk7XG4gICAgICAgICAgdXBkYXRlUGFyZW50QnJlYWtGbGFnKCk7XG4gICAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5pbmZvKGBUUkVFIFBJUEVMSU5FOiBleGVjdXRlTm9kZUNoaWxkcmVuIC0gRXJyb3IgZm9yIGlkOiAke2NoaWxkPy5pZH1gLCB7XG4gICAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKGNoaWxkQ29udGV4dCwgZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFRocm90dGxpbmcgaXMgdGVsZW1ldHJ5IChSOSk6IGFuIGV2ZW50LCBub3QgYSBzdGF0ZSBrZXkuIEJlZm9yZVxuICAgICAgICAgIC8vIDkuMzkuMCB0aGlzIHdyb3RlIGBtb25pdG9yLmlzVGhyb3R0bGVkYCBBRlRFUiB0aGUgY2hpbGQncyBsYXN0XG4gICAgICAgICAgLy8gY29tbWl0LCBzbyBpdCBsYW5kZWQgbm93aGVyZS5cbiAgICAgICAgICBpZiAodGhpcy5kZXBzLnRocm90dGxpbmdFcnJvckNoZWNrZXIgJiYgdGhpcy5kZXBzLnRocm90dGxpbmdFcnJvckNoZWNrZXIoZXJyb3IpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZWQgPSBzZXJ2ZWRTdGFnZUVycm9yKGNoaWxkQ29udGV4dCwgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblRocm90dGxlZD8uKGNoaWxkLm5hbWUsIGNoaWxkLmlkIGFzIHN0cmluZywgc2VydmVkLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IGNoaWxkLmlkISwgcmVzdWx0OiBlcnJvciwgaXNFcnJvcjogdHJ1ZSB9O1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+ID0ge307XG4gICAgLy8gRXZlcnkgY2hpbGQgdGhhdCBwYXVzZWQsIGJ5IENISUxEIGluZGV4IChub3Qgc2V0dGxlIG9yZGVyKSDigJQgc2VlIHJhaXNlUGF1c2VzLlxuICAgIGNvbnN0IHBhdXNlZEF0OiAoUGF1c2VTaWduYWwgfCB1bmRlZmluZWQpW10gPSBbXTtcbiAgICAvLyBUaGUgZmlyc3QgcnVuIGZhaWx1cmUgYnkgQ0hJTEQgaW5kZXggKGEgcmVhY2hlZCBkZXB0aCBjYXApIOKAlCByZXRocm93blxuICAgIC8vIGFmdGVyIGV2ZXJ5IGNoaWxkIHNldHRsZXMsIGFoZWFkIG9mIGFueSBwYXVzZS5cbiAgICBsZXQgZmFpbHVyZTogeyBlcnJvcjogdW5rbm93bjsgaW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5vZGUuZmFpbEZhc3QpIHtcbiAgICAgIC8vIFByb21pc2UuYWxsIHNlbGVjdHMgdGhlIGZpcnN0IGVzY2FwaW5nIHJlamVjdGlvbi4gQSBsYXRlIHNpYmxpbmcgbXVzdFxuICAgICAgLy8gbmVpdGhlciByZXBsYWNlIGl0cyBpZGVudGl0eSBub3Iga2VlcCBhIHJhdyBmYWlsdXJlIGluIHRoZSBzYXZlZCB0cmVlLlxuICAgICAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGVzY2FwZSA9IChpbmRleDogbnVtYmVyLCBlcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICBjb250ZXh0LmZhaWx1cmVTdGF0ZS5hZG9wdChjaGlsZENvbnRleHRzW2luZGV4XS5mYWlsdXJlU3RhdGUsIGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGNoaWxkQ29udGV4dHNbaW5kZXhdLmZhaWx1cmVTdGF0ZS5jb21wbGV0ZSgpO1xuICAgICAgfTtcbiAgICAgIC8vIEZhaWwtZmFzdDogZmlyc3QgY2hpbGQgRVJST1IgcmVqZWN0cyBpbW1lZGlhdGVseSAodW53cmFwcGVkKS4gQSBwYXVzZVxuICAgICAgLy8gaXMgbm90IGFuIGVycm9yOiBpdCBzZXR0bGVzIGxpa2UgYSByZXN1bHQsIHNvIHRoZSBmb3JrIHdhaXRzIGZvciBpdHNcbiAgICAgIC8vIHNpYmxpbmdzIGJlZm9yZSBpdCBwYXVzZXMg4oCUIHRoZWlyIHdyaXRlcyBsYW5kIGJlZm9yZSB0aGUgY2hlY2twb2ludFxuICAgICAgLy8gaXMgdGFrZW4sIGFuZCBhIHNlY29uZCBwYXVzaW5nIHNpYmxpbmcgaXMgc2Vlbiwgbm90IHJhY2VkIHBhc3QuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGFsbENoaWxkcmVuLm1hcCgoY2hpbGQsIGkpID0+XG4gICAgICAgICAgY2hpbGRQcm9taXNlc1tpXS50aGVuKFxuICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHIuaXNFcnJvcikge1xuICAgICAgICAgICAgICAgIGVzY2FwZShpLCByLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgci5yZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGRDb250ZXh0c1tpXS5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICAgICAgICBlc2NhcGUoaSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNoaWxkQ29udGV4dHNbaV0uZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIHBhdXNlZEF0W2ldID0gZXJyb3I7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCByIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgY29udGludWU7IC8vIGEgcGF1c2VkIGNoaWxkXG4gICAgICAgIGNoaWxkcmVuUmVzdWx0c1tyLmlkXSA9IHsgaWQ6IHIuaWQsIHJlc3VsdDogci5yZXN1bHQsIGlzRXJyb3I6IHIuaXNFcnJvciA/PyBmYWxzZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBydW4gYWxsIGNoaWxkcmVuIHRvIGNvbXBsZXRpb24gZXZlbiBpZiBzb21lIGZhaWxcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2hpbGRQcm9taXNlcyk7XG4gICAgICBzZXR0bGVkLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgICAgaWYgKHMuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgIGNvbnN0IHsgaWQsIHJlc3VsdCwgaXNFcnJvciB9ID0gcy52YWx1ZTtcbiAgICAgICAgICBjaGlsZHJlblJlc3VsdHNbaWRdID0geyBpZCwgcmVzdWx0LCBpc0Vycm9yOiBpc0Vycm9yID8/IGZhbHNlIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQYXVzZVNpZ25hbChzLnJlYXNvbikpIHtcbiAgICAgICAgICAvLyBQYXVzZVNpZ25hbCBmcm9tIGEgY2hpbGQg4oCUIHJlLXRocm93biBhZnRlciBhbGwgY2hpbGRyZW4gc2V0dGxlLlxuICAgICAgICAgIHBhdXNlZEF0W2ldID0gcy5yZWFzb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFpbHVyZSA/Pz0geyBlcnJvcjogcy5yZWFzb24sIGluZGV4OiBpIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQ29udGFpbmVkIGVycm9ycyBhcmUgcmVzdWx0cywgbmV2ZXIgdGhlIHJ1bidzIHRlcm1pbmFsIGNhdXNlLlxuICAgICAgaWYgKGZhaWx1cmUpIGNvbnRleHQuZmFpbHVyZVN0YXRlLmFkb3B0KGNoaWxkQ29udGV4dHNbZmFpbHVyZS5pbmRleF0uZmFpbHVyZVN0YXRlLCBmYWlsdXJlLmVycm9yKTtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRDb250ZXh0cykgY2hpbGQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLmVycm9yO1xuXG4gICAgLy8gUmUtdGhyb3cgYWZ0ZXIgZXZlcnkgY2hpbGQgaGFzIHNldHRsZWQuXG4gICAgY29uc3QgcGF1c2VzID0gcGF1c2VkQXQuZmlsdGVyKChwKTogcCBpcyBQYXVzZVNpZ25hbCA9PiBwICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChwYXVzZXMubGVuZ3RoID4gMCkgdGhyb3cgcmFpc2VQYXVzZXMocGF1c2VzKTtcblxuICAgIHJldHVybiBjaGlsZHJlblJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBzZWxlY3RlZCBjaGlsZHJlbiBiYXNlZCBvbiBzZWxlY3RvciByZXN1bHQuXG4gICAqIFZhbGlkYXRlcyBJRHMsIHJlY29yZHMgc2VsZWN0aW9uIGluZm8sIHRoZW4gZGVsZWdhdGVzIHRvIGV4ZWN1dGVOb2RlQ2hpbGRyZW4uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICBzZWxlY3RvcjogU2VsZWN0b3IsXG4gICAgY2hpbGRyZW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10sXG4gICAgaW5wdXQ6IGFueSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICAgIGZhaWxGYXN0PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT4+IHtcbiAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHNlbGVjdG9yKGlucHV0KTtcbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IEFycmF5LmlzQXJyYXkoc2VsZWN0b3JSZXN1bHQpID8gc2VsZWN0b3JSZXN1bHQgOiBbc2VsZWN0b3JSZXN1bHRdO1xuXG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdGVkQ2hpbGRJZHMnLCBzZWxlY3RlZElkcyk7XG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdG9yUGF0dGVybicsICdtdWx0aS1jaG9pY2UnKTtcblxuICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQWxsQ2hpbGRyZW4nLCB0cnVlKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmlkISkpO1xuXG4gICAgLy8gVmFsaWRhdGUgYWxsIElEcyBleGlzdCAoZmFpbCBmYXN0KVxuICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCAhPT0gc2VsZWN0ZWRJZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaGlsZElkcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCk7XG4gICAgICBjb25zdCBtaXNzaW5nID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpZCkgPT4gIWNoaWxkSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU2VsZWN0b3IgcmV0dXJuZWQgdW5rbm93biBjaGlsZCBJRHM6ICR7bWlzc2luZy5qb2luKCcsICcpfS4gQXZhaWxhYmxlOiAke2NoaWxkSWRzLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSk6YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgY29udGV4dC5hZGRFcnJvcignc2VsZWN0b3JFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBza2lwcGVkSWRzID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5pZCEpKS5tYXAoKGMpID0+IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgLy8gTmFycmF0aXZlOiBjYXB0dXJlIHRoZSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZERpc3BsYXlOYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpO1xuICAgIGNvbnN0IHNlbGVjdG9yTmFtZSA9IGNvbnRleHQuc3RhZ2VOYW1lIHx8ICdzZWxlY3Rvcic7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKHNlbGVjdG9yTmFtZSwgc2VsZWN0ZWREaXNwbGF5TmFtZXMsIGNoaWxkcmVuLmxlbmd0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgQUZURVIgdGhlIHNwZWNpYWxpemVkIGV2ZW50LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKHNlbGVjdG9yTmFtZSwgdW5kZWZpbmVkLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcblxuICAgIGNvbnN0IHRlbXBOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6ICdzZWxlY3Rvci10ZW1wJyxcbiAgICAgIGlkOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBjaGlsZHJlbjogc2VsZWN0ZWRDaGlsZHJlbixcbiAgICAgIC8vIEhvbm9yIHRoZSBzZWxlY3RvciBub2RlJ3MgZmFuLW91dCBlcnJvciBtb2RlIChQcm9taXNlLmFsbCB2cyBhbGxTZXR0bGVkKS5cbiAgICAgIGZhaWxGYXN0LFxuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGVDaGlsZHJlbih0ZW1wTm9kZSwgY29udGV4dCwgdW5kZWZpbmVkLCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgfVxufVxuIl19