@workflow/core 5.0.0-beta.47 → 5.0.0-beta.49

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 (47) hide show
  1. package/dist/classify-error.d.ts.map +1 -1
  2. package/dist/classify-error.js +13 -3
  3. package/dist/describe-error.d.ts.map +1 -1
  4. package/dist/describe-error.js +16 -1
  5. package/dist/private.d.ts +2 -4
  6. package/dist/private.d.ts.map +1 -1
  7. package/dist/private.js +1 -1
  8. package/dist/runtime/constants.d.ts +9 -7
  9. package/dist/runtime/constants.d.ts.map +1 -1
  10. package/dist/runtime/constants.js +10 -8
  11. package/dist/runtime/helpers.d.ts +13 -0
  12. package/dist/runtime/helpers.d.ts.map +1 -1
  13. package/dist/runtime/helpers.js +14 -1
  14. package/dist/runtime/quickjs-serde.d.ts.map +1 -1
  15. package/dist/runtime/quickjs-serde.js +62 -1
  16. package/dist/runtime/run.d.ts +42 -0
  17. package/dist/runtime/run.d.ts.map +1 -1
  18. package/dist/runtime/run.js +102 -17
  19. package/dist/runtime/runs.d.ts.map +1 -1
  20. package/dist/runtime/runs.js +8 -4
  21. package/dist/runtime/start.d.ts +31 -1
  22. package/dist/runtime/start.d.ts.map +1 -1
  23. package/dist/runtime/start.js +38 -6
  24. package/dist/runtime/suspension-handler.d.ts +54 -1
  25. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  26. package/dist/runtime/suspension-handler.js +83 -20
  27. package/dist/runtime.d.ts +1 -1
  28. package/dist/runtime.d.ts.map +1 -1
  29. package/dist/runtime.js +174 -61
  30. package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
  31. package/dist/serialization/reducers/common-vm.js +38 -1
  32. package/dist/serialization/reducers/common.d.ts.map +1 -1
  33. package/dist/serialization/reducers/common.js +26 -2
  34. package/dist/serialization/types.d.ts +7 -0
  35. package/dist/serialization/types.d.ts.map +1 -1
  36. package/dist/serialization/types.js +1 -1
  37. package/dist/serialization.d.ts +46 -2
  38. package/dist/serialization.d.ts.map +1 -1
  39. package/dist/serialization.js +249 -75
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +2 -2
  42. package/dist/workflow/sleep.d.ts.map +1 -1
  43. package/dist/workflow/sleep.js +3 -6
  44. package/dist/workflow.js +6 -6
  45. package/docs/foundations/streaming.mdx +28 -0
  46. package/docs/how-it-works/understanding-directives.mdx +1 -1
  47. package/package.json +10 -10
@@ -1,4 +1,4 @@
1
- import type { World } from '@workflow/world';
1
+ import type { RunRetention, World } from '@workflow/world';
2
2
  import { Run } from './run.js';
3
3
  /**
4
4
  * Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only,
@@ -48,6 +48,36 @@ export interface StartOptionsBase {
48
48
  * the `setAttributes` option of the same name.
49
49
  */
50
50
  allowReservedAttributes?: boolean;
51
+ /**
52
+ * Set a preference for data retention after run completion.
53
+ *
54
+ * **Experimental.** Both the unit and the set of accepted values are expected
55
+ * to change.
56
+ *
57
+ * Worlds control the retention of user data (event payloads and stream
58
+ * chunks), the event log, and any analytics data. Options are:
59
+ * - `'default'`: same as omission, the World will decide. On Vercel, this
60
+ * is based on your team's plan.
61
+ * - `0`: data is deleted as soon as your run completes or fails. On
62
+ * Vercel, user data is deleted, but metadata may persist for your plan's
63
+ * default retention period.
64
+ *
65
+ * The value is a duration, with zero being the only valid option currently.
66
+ *
67
+ * **Known limitation at `0`.** The purge races your own read of the run's
68
+ * result and generally wins, so `await run.returnValue` on a
69
+ * `experimental_retention: 0` run usually throws `RunExpiredError` rather
70
+ * than resolving. If you need the result, return it through a channel you
71
+ * control, e.g. a step that writes it to external storage.
72
+ *
73
+ * Recorded on the run as the reserved `$retention` attribute, so it
74
+ * requires a World implementing spec version 4 or later. `'default'` is
75
+ * not written at all, keeping it exactly equivalent to omitting the
76
+ * option. Retention is enforced by the World: the first-party Worlds
77
+ * (Vercel, Local, Postgres) implement it, and a World that does not
78
+ * recognize the value keeps the data.
79
+ */
80
+ experimental_retention?: RunRetention;
51
81
  /**
52
82
  * The ID of an existing run this run is being replayed from, if any.
53
83
  *
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAmCpE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAqD/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EAEZ,KAAK,EACN,MAAM,iBAAiB,CAAC;AAoCzB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA4D/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,sBAAsB,CAAC,EAAE,YAAY,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
2
2
  import { globalSingleton } from '@workflow/utils';
3
3
  import { workflowDisplayName } from '@workflow/utils/parse-name';
4
- import { HOOK_RESUME_INPUT_VERSION, isLegacySpecVersion, PARENT_RUN_ID_ATTRIBUTE, ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
4
+ import { HOOK_RESUME_INPUT_VERSION, isLegacySpecVersion, PARENT_RUN_ID_ATTRIBUTE, RETENTION_ATTRIBUTE, ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
5
5
  import { monotonicFactory } from 'ulid';
6
6
  import { normalizeAttributeChanges } from '../attribute-changes.js';
7
7
  import { getRunCapabilities } from '../capabilities.js';
@@ -30,6 +30,12 @@ import { assertWorldSupportsRuntimeProtocol } from './world-compatibility.js';
30
30
  * deployments don't recognize the health check at all.
31
31
  */
32
32
  const CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS = 2_000;
33
+ /**
34
+ * Wire encoding of `retention: 0`. Attribute values are strings, and the
35
+ * `$retention` value is a duration written as a decimal integer — so zero
36
+ * travels as `'0'`, not as the name of a mode.
37
+ */
38
+ const RETENTION_ZERO_ATTRIBUTE_VALUE = '0';
33
39
  /** ULID generator for client-side runId generation */
34
40
  const ulid = monotonicFactory();
35
41
  /**
@@ -221,21 +227,47 @@ export async function start(workflow, argsOrOptions, options) {
221
227
  });
222
228
  attributes = Object.fromEntries(changes.map(({ key, value }) => [key, value]));
223
229
  }
230
+ // `retention` is the typed spelling of the reserved `$retention`
231
+ // attribute, whose value is a duration written as a decimal integer.
232
+ // `'default'` means "let the World decide", which is already what an
233
+ // absent attribute means, so it is not written: that keeps
234
+ // `'default'` exactly equivalent to omitting the option and spends
235
+ // none of the per-run attribute budget.
236
+ let retentionAttribute;
237
+ if (opts.experimental_retention !== undefined &&
238
+ opts.experimental_retention !== 'default') {
239
+ // The types allow only `0`, but an untyped JS caller can still get
240
+ // here with some other duration — and there is no unit to interpret
241
+ // it in yet, so no World can honor it. Reject it rather than seed a
242
+ // value that would silently resolve to the World's default.
243
+ if (opts.experimental_retention !== 0) {
244
+ throw new WorkflowRuntimeError(`start({ experimental_retention }) must be 0 or 'default'; received ${JSON.stringify(opts.experimental_retention)}.`);
245
+ }
246
+ if (specVersion < SPEC_VERSION_SUPPORTS_ATTRIBUTES) {
247
+ throw new WorkflowRuntimeError('start({ experimental_retention }) requires a World that supports spec version 4 or later.');
248
+ }
249
+ retentionAttribute = {
250
+ [RETENTION_ATTRIBUTE]: RETENTION_ZERO_ATTRIBUTE_VALUE,
251
+ };
252
+ }
224
253
  // Cross-run lineage: the reserved keys ride on the run's existing
225
254
  // attributes, so they add no extra write. Caller attributes are spread
226
255
  // last, so a caller with allowReservedAttributes can deliberately
227
- // re-parent.
256
+ // re-parent. `retention` is spread after those: it is the supported
257
+ // spelling, so it wins over a hand-written `$retention` attribute.
228
258
  const lineage = specVersion >= SPEC_VERSION_SUPPORTS_ATTRIBUTES
229
259
  ? resolveLineageAttributes()
230
260
  : undefined;
231
- const runAttributes = lineage
232
- ? { ...lineage, ...attributes }
261
+ const runAttributes = lineage || retentionAttribute
262
+ ? { ...lineage, ...attributes, ...retentionAttribute }
233
263
  : attributes;
234
264
  // Shared by the run_created event and the resilient-start queue input.
235
265
  const attributeSeed = runAttributes
236
266
  ? {
237
267
  attributes: runAttributes,
238
- ...(allowReservedAttributes || lineage != null
268
+ ...(allowReservedAttributes ||
269
+ lineage != null ||
270
+ retentionAttribute != null
239
271
  ? { allowReservedAttributes: true }
240
272
  : {}),
241
273
  }
@@ -443,4 +475,4 @@ export async function start(workflow, argsOrOptions, options) {
443
475
  });
444
476
  });
445
477
  }
446
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixnQ0FBZ0MsRUFDaEMsMENBQTBDLEVBQzFDLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixtQkFBbUIsRUFDbkIsTUFBTSxHQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFF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bnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZ2xvYmFsU2luZ2xldG9uIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IHdvcmtmbG93RGlzcGxheU5hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW52b2tlUGF5bG9hZCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB3b3JrZmxvd1J1bklkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IGdldFJ1bkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL2NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGRlY29kZVJ1blB1YmxpY0tleSxcbiAgZGVyaXZlUnVuS2V5UGFpcixcbn0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1ZtRnJvbUVudiB9IGZyb20gJy4vdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sIH0gZnJvbSAnLi93b3JsZC1jb21wYXRpYmlsaXR5LmpzJztcblxuLyoqXG4gKiBUaW1lb3V0IGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudCBjYXBhYmlsaXR5IHByb2JlIGRvbmUgYmVmb3JlXG4gKiBkZWh5ZHJhdGluZyB3b3JrZmxvdyBhcmd1bWVudHMuIEtlcHQgdGlnaHQgb24gcHVycG9zZTogdGhlIHByb2JlIGlzXG4gKiBhbiBvcHRpbWl6YXRpb24gKGl0IGxldHMgdGhlIGNhbGxlciBlbWl0IHRoZSBmcmFtZWQgYnl0ZS1zdHJlYW0gd2lyZVxuICogZm9ybWF0IHdoZW4gdGhlIHRhcmdldCBzdXBwb3J0cyBpdCksIGFuZCB0aGUgZmFsbGJhY2sgb24gdGltZW91dCBpc1xuICogdGhlIGxlZ2FjeSByYXcgZm9ybWF0IHdoaWNoIGFsd2F5cyB3b3Jrcy4gTG9uZyBkZWxheXMgaGVyZSB3b3VsZFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIENyb3NzLXJ1biBsaW5lYWdlIGZvciBhIHJ1biBiZWluZyBzdGFydGVkIGZyb20gaW5zaWRlIGFub3RoZXIgcnVuLlxuICpcbiAqIFRoZSBhbWJpZW50IHN0ZXAgY29udGV4dCBjYXJyaWVzIHRoZSBwYXJlbnQgcnVuIGlkIGFuZCB0aGUgcm9vdCBvZiBpdHNcbiAqIGxpbmVhZ2U7IHRoZSBydW50aW1lIGZpbGxzIGJvdGggZnJvbSB0aGUgcnVuIGl0IGFscmVhZHkgaGFzIGxvYWRlZCwgc28gdGhpc1xuICogaXMgYSBwdXJlIGNvbnRleHQgcmVhZCB3aXRoIG5vIEkvTy4gVGhlIG5ldyBydW4gcmVjb3JkcyBgJHBhcmVudFJ1bklkYCAodGhlXG4gKiBlZGdlKSBhbmQgaW5oZXJpdHMgdGhlIHBhcmVudCdzIGAkcm9vdFJ1bklkYCAodGhlIHBhcmVudCBpdHNlbGYgd2hlbiBpdCBpcyBhXG4gKiByb290KSwgc28gYSBkYWlzeSBjaGFpbiBvciBmYW4tb3V0IG9mIGFueSBkZXB0aCBncm91cHMgdW5kZXIgb25lIHJvb3QgaWQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHRvcC1sZXZlbCBgc3RhcnQoKWAsIHdoaWNoIGhhcyBubyBjb250ZXh0LCBzb1xuICogc3RhbmRhbG9uZSBydW5zIGNhcnJ5IG5vIGxpbmVhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMaW5lYWdlQXR0cmlidXRlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RvcmUgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBjb25zdCBwYXJlbnRSdW5JZCA9IHN0b3JlPy53b3JrZmxvd01ldGFkYXRhPy53b3JrZmxvd1J1bklkO1xuICBpZiAoIXBhcmVudFJ1bklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgW1JPT1RfUlVOX0lEX0FUVFJJQlVURV06IHN0b3JlLnJvb3RSdW5JZCA/PyBwYXJlbnRSdW5JZCxcbiAgICBbUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEVdOiBwYXJlbnRSdW5JZCxcbiAgfTtcbn1cblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxuLy8gT24gYGdsb2JhbFRoaXNgIChzZWUgYGdsb2JhbFNpbmdsZXRvbmApIHNvIFwib25jZSBwZXIgcHJvY2Vzc1wiIGlzIG5vdCBvbmNlXG4vLyBwZXIgYnVuZGxlciBsYXllci5cbmNvbnN0IGxhdGVzdE5vT3BXYXJuaW5nID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL2xhdGVzdE5vT3BXYXJuaW5nJyxcbiAgMSxcbiAgKCkgPT4gKHsgd2FybmVkOiBmYWxzZSB9KVxuKTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5LFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkID0gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuIGNyZWF0aW9uLFxuICAgKiBieSBkZWZhdWx0IHRoZSB3b3JsZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICB3b3JsZD86IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlYyB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlZ2lvbiBpZGVudGlmaWVyIGZvciB0aGUgbmV3IHJ1bi4gQ3VycmVudGx5IGNvbnN1bWVkIG9ubHlcbiAgICogYnkgYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgLCB3aGljaCBlbWJlZHMgdGhlIHJlZ2lvbiBpbnRvIHRoZSB0YWdnZWRcbiAgICogcnVuIElEIGFuZCByb3V0ZXMgdGhlIGluaXRpYWwgd29ya2Zsb3cgbWVzc2FnZSB0byB0aGUgbWF0Y2hpbmdcbiAgICogcmVnaW9uYWwgcXVldWUuIFdoZW4gb21pdHRlZCwgdGhlIHdvcmxkIGZhbGxzIGJhY2sgdG8gaXRzIG93blxuICAgKiBkZWZhdWx0IChmb3IgYHdvcmxkLXZlcmNlbGA6IHRoZSBgVkVSQ0VMX1JFR0lPTmAgZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGUsIHRoZW4gdGhlIHNlcnZlci1zaWRlIGRlZmF1bHQgcmVnaW9uIGBpYWQxYDsgYSBjb25jcmV0ZSxcbiAgICogcm91dGFibGUgcmVnaW9uIGlzIGFsd2F5cyBjaG9zZW4pLlxuICAgKlxuICAgKiBXb3JsZHMgd2l0aG91dCBhIHJlZ2lvbmFsIGRpbWVuc2lvbiBpZ25vcmUgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGxhaW50ZXh0IGF0dHJpYnV0ZXMgdG8gc2VlZCBvbiB0aGUgcnVuIGFzIGl0IGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbmF0aXZlLWF0dHJpYnV0ZXMgcnVucyAoc3BlYyB2ZXJzaW9uIDQgYW5kIGxhdGVyKS5cbiAgICovXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQZXJtaXQgcmVzZXJ2ZWQgYCRgLXByZWZpeGVkIGtleXMgaW4gYGF0dHJpYnV0ZXNgLiBUaGUgYCRgIG5hbWVzcGFjZVxuICAgKiBpcyByZXNlcnZlZCBmb3IgZnJhbWV3b3JrL2xpYnJhcnkgY29kZSBidWlsdCBvbiB0b3Agb2YgdGhlIHdvcmtmbG93XG4gICAqIFNESyAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgcGxhdGZvcm0tZW1pdHRlZCB0YWdzLCBldGMuKTsgdXNlclxuICAgKiBjb2RlIE1VU1QgTk9UIHdyaXRlIGtleXMgaW4gaXQsIGFuZCB2YWxpZGF0aW9uIHJlamVjdHMgdGhlbSBzb1xuICAgKiBhY2NpZGVudGFsIGNvbGxpc2lvbnMgd2l0aCB0b29saW5nLW93bmVkIGtleXMgY2FuJ3Qgc2xpcCB0aHJvdWdoLlxuICAgKlxuICAgKiBPbmx5IGZsaXAgdGhpcyB0byBgdHJ1ZWAgaWYgeW91ciBjYWxsZXIgaXMgaXRzZWxmIGEgZnJhbWV3b3JrIG9yXG4gICAqIGxpYnJhcnkgdGhhdCBvd25zIGEgYCRgLXByZWZpeGVkIHN1Yi1uYW1lc3BhY2UgYW5kIGtub3dzIHRoZVxuICAgKiBjb252ZW50aW9ucyBvZiBhbnkgb3RoZXIgdG9vbHMgd3JpdGluZyBpbnRvIGl0LiBTYW1lIHNlbWFudGljcyBhc1xuICAgKiB0aGUgYHNldEF0dHJpYnV0ZXNgIG9wdGlvbiBvZiB0aGUgc2FtZSBuYW1lLlxuICAgKi9cbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgcnVuIHRoaXMgcnVuIGlzIGJlaW5nIHJlcGxheWVkIGZyb20sIGlmIGFueS5cbiAgICpcbiAgICogUmVjb3JkZWQgb24gdGhlIG5ldyBydW4ncyBgZXhlY3V0aW9uQ29udGV4dGAgYXMgYHJlcGxheWVkRnJvbVJ1bklkYCBzb1xuICAgKiB0b29saW5nIChlLmcuIHRoZSBkYXNoYm9hcmQgcnVucyBsaXN0KSBjYW4gc2hvdyB0aGF0IGEgcnVuIG9yaWdpbmF0ZWQgYXNcbiAgICogYSByZXBsYXkgYW5kIGxpbmsgYmFjayB0byBpdHMgc291cmNlLiBTZXQgYXV0b21hdGljYWxseSBieVxuICAgKiB7QGxpbmsgcmVjcmVhdGVSdW5Gcm9tRXhpc3Rpbmd9OyB0aGVyZSdzIHVzdWFsbHkgbm8gcmVhc29uIHRvIHBhc3MgaXRcbiAgICogZGlyZWN0bHkuXG4gICAqXG4gICAqIE11c3QgYmUgYSBydW4gSUQ6IGB3cnVuX2AgZm9sbG93ZWQgYnkgYSAyNi1jaGFyIFVMSUQuIEl0J3MgYSBmb3JlaWduIGtleVxuICAgKiB0byB0aGUgc291cmNlIHJ1biwgc28gYHN0YXJ0KClgIHZhbGlkYXRlcyB0aGUgZXhhY3Qgc2hhcGUgYW5kIHJlamVjdHNcbiAgICogYW55dGhpbmcgZWxzZSByYXRoZXIgdGhhbiBwZXJzaXN0IGEgbGluZWFnZSBsaW5rIHRoYXQgcG9pbnRzIGF0IGdhcmJhZ2UuXG4gICAqL1xuICByZXBsYXllZEZyb21SdW5JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQuIFNjb3BlcyB0aGUgd29ya2Zsb3cgcXVldWVcbiAgICogdG9waWMgdG8gYF9fe25hbWVzcGFjZX1fd2tmX3dvcmtmbG93XypgIChlLmcuIGAnZXZlJ2ApIGluc3RlYWQgb2YgdGhlXG4gICAqIGRlZmF1bHQgYF9fd2tmX3dvcmtmbG93XypgLCBhbmQgaXMgYWxzbyB1c2VkIGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBjYXBhYmlsaXR5IHByb2JlLiBGYWxscyBiYWNrIHRvIGBXT1JLRkxPV19RVUVVRV9OQU1FU1BBQ0VgIGluIHRoZVxuICAgKiBjYWxsaW5nIHByb2Nlc3MuXG4gICAqXG4gICAqIFdpdGhpbiBhIGRlcGxveW1lbnQgdGhlIGVudiBmYWxsYmFjayBpcyBjb3JyZWN0LiBDcm9zcy1jb250ZXh0IGNhbGxlcnNcbiAgICogKGUuZy4gdGhlIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkIHJlcGxheWluZyBhIHJ1bikgbXVzdCBwYXNzIHRoZVxuICAgKiBUQVJHRVQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5OiB0aGUgZW52IGZhbGxiYWNrIHJlc29sdmVzIGluXG4gICAqIHRoZSBjYWxsZXIncyBwcm9jZXNzLCBhbmQgYSBydW4gZW5xdWV1ZWQgdG8gYSB0b3BpYyB0aGUgdGFyZ2V0IGhhcyBub1xuICAgKiBjb25zdW1lciBmb3IgaXMgbmV2ZXIgcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gd29ybGRzIHdpdGggYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHNcbiAgICogKGN1cnJlbnRseSBWZXJjZWwpLiBJbiBvdGhlciB3b3JsZHMgKGxvY2FsIGRldiwgUG9zdGdyZXMpIHRoZXJlIGlzIG5vXG4gICAqIG5vdGlvbiBvZiBtdWx0aXBsZSBkZXBsb3ltZW50cyB0byByZXNvbHZlIGJldHdlZW4sIHNvIGAnbGF0ZXN0J2AgaGFzIG5vXG4gICAqIGVmZmVjdDogYSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhlIHJ1biB0YXJnZXRzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqTm90ZToqKiBXaGVuIGBkZXBsb3ltZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBiZWNvbWUgYHVua25vd25gXG4gICAqIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgdHlwZXMgd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBkZXBsb3ltZW50cy5cbiAgICovXG4gIGRlcGxveW1lbnRJZDogJ2xhdGVzdCcgfCAoc3RyaW5nICYge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgZGVwbG95bWVudElkPzogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgdHlwZSBTdGFydE9wdGlvbnMgPVxuICB8IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbiAgfCBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+ID0gKFxuICAuLi5hcmdzOiBUQXJnc1xuKSA9PiBQcm9taXNlPFRSZXN1bHQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBvZiBhIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd01ldGFkYXRhID0geyB3b3JrZmxvd0lkOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTdGFydHMgYSB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uIHRvIHN0YXJ0LlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdvcmtmbG93IChvcHRpb25hbCkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgcnVuIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJ1biBJRCBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgd29ya2Zsb3cgaW52b2NhdGlvbi5cbiAqL1xuLy8gT3ZlcmxvYWRzIHdpdGggZGVwbG95bWVudElkIC0gYXJncyBhbmQgcmV0dXJuIHR5cGUgYmVjb21lIHVua25vd25cbi8vIFVzZXMgZ2VuZXJpY3Mgc28gdHlwZWQgd29ya2Zsb3dzIGFyZSBhc3NpZ25hYmxlIChhdm9pZHMgY29udHJhdmFyaWFuY2UgaXNzdWVzKSxcbi8vIGJ1dCB0aGUgcmV0dXJuIHR5cGUgYW5kIGFyZ3MgYXJlIHN0aWxsIHVua25vd24gc2luY2UgdGhlIGRlcGxveWVkIHZlcnNpb24gbWF5IGRpZmZlci5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuLy8gT3ZlcmxvYWRzIHdpdGhvdXQgZGVwbG95bWVudElkIC0gcHJlc2VydmUgdHlwZSBpbmZlcmVuY2VcbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IFRBcmdzLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3NPck9wdGlvbnM/OiBUQXJncyB8IFN0YXJ0T3B0aW9ucyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1xuKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGZpZWxkIGlzIGFkZGVkIGJ5IG91ciBjbGllbnQgdHJhbnNmb3JtXG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3c/LndvcmtmbG93SWQ7XG5cbiAgICBpZiAoIXdvcmtmbG93TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgJ3N0YXJ0JyByZWNlaXZlZCBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLiBFbnN1cmUgdGhlIFdvcmtmbG93IFNESyBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBhbmQgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGEgJ3VzZSB3b3JrZmxvdycgZGlyZWN0aXZlLmAsXG4gICAgICAgIHsgc2x1ZzogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Bhbk5hbWUgPSBgd29ya2Zsb3cuc3RhcnQgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YDtcbiAgICByZXR1cm4gdHJhY2Uoc3Bhbk5hbWUsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFyZ3M6IFNlcmlhbGl6YWJsZVtdID0gW107XG4gICAgICBsZXQgb3B0czogU3RhcnRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NPck9wdGlvbnMpKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzT3JPcHRpb25zIGFzIFNlcmlhbGl6YWJsZVtdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnc09yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NPck9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChhcmdzLmxlbmd0aCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBvcHRzLndvcmxkID8/IChhd2FpdCBnZXRXb3JsZExhenkoKSk7XG4gICAgICBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKHdvcmxkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgIGxldCBkZXBsb3ltZW50SWQgPSBvcHRzLmRlcGxveW1lbnRJZCA/PyBjdXJyZW50RGVwbG95bWVudElkO1xuXG4gICAgICAvLyBXaGVuICdsYXRlc3QnIGlzIHJlcXVlc3RlZCwgcmVzb2x2ZSB0aGUgYWN0dWFsIGxhdGVzdCBkZXBsb3ltZW50IElEXG4gICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCdzIGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yXG4gICAgICAvLyBzYW1lIGdpdCBicmFuY2ggZm9yIHByZXZpZXcgZGVwbG95bWVudHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFJlc29sdmluZyAnbGF0ZXN0JyBvbmx5IG1lYW5zIHNvbWV0aGluZyBpbiB3b3JsZHMgd2l0aCBhdG9taWMsXG4gICAgICAvLyBpbW11dGFibGUgZGVwbG95bWVudHMgKGUuZy4gVmVyY2VsKSwgd2hpY2ggaW1wbGVtZW50XG4gICAgICAvLyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCkuIFdvcmxkcyB3aXRob3V0IHRoYXQgY29uY2VwdCAobG9jYWwgZGV2LFxuICAgICAgLy8gc2VsZi1ob3N0ZWQgUG9zdGdyZXMpIGhhdmUgbm90aGluZyB0byByZXNvbHZlIGJldHdlZW4sIHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBmYWlsIGEgcnVuIHRoYXQgd29ya3MgZmluZSBvbiBWZXJjZWwsIHdlIHdhcm4gYW5kIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGN1cnJlbnQgZGVwbG95bWVudCwgbWFraW5nICdsYXRlc3QnIGFuIGVmZmVjdGl2ZSBuby1vcCB0aGVyZS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICh3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKSB7XG4gICAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdhcm4gb25jZSBwZXIgcHJvY2Vzczsgc2VlIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCBhYm92ZS5cbiAgICAgICAgICBpZiAoIWxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCkge1xuICAgICAgICAgICAgbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgXCJkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIGhhcyBubyBlZmZlY3QgaW4gdGhpcyB3b3JsZCBhbmQgd2FzIGlnbm9yZWQuIFwiICtcbiAgICAgICAgICAgICAgICAnSXQgaXMgb25seSBzdXBwb3J0ZWQgYnkgd29ybGRzIHdpdGggYXRvbWljIGRlcGxveW1lbnRzLCBzdWNoIGFzIFZlcmNlbC4gJyArXG4gICAgICAgICAgICAgICAgJ1RoZSBydW4gd2lsbCB0YXJnZXQgdGhlIGN1cnJlbnQgZGVwbG95bWVudC4nLFxuICAgICAgICAgICAgICB7IGN1cnJlbnREZXBsb3ltZW50SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVwbG95bWVudElkID0gY3VycmVudERlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byB3cml0ZSBieXRlIHN0cmVhbXMgaW4gdGhlIGZyYW1lZCB3aXJlIGZvcm1hdC5cbiAgICAgIC8vIEZvciBzYW1lLWRlcGxveW1lbnQgc3RhcnRzICh0aGUgY29tbW9uIGNhc2UpIHdlIGtub3cgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gcnVubmluZyB0aGlzIHNhbWUgU0RLIHZlcnNpb24sIHNvIGZyYW1pbmcgaXMgc2FmZS4gRm9yIGNyb3NzLVxuICAgICAgLy8gZGVwbG95bWVudCBzdGFydHMgKGV4cGxpY2l0IGRlcGxveW1lbnRJZCBvciAnbGF0ZXN0JyB0aGF0IHJlc29sdmVzXG4gICAgICAvLyB0byBhIGRpZmZlcmVudCBkZXBsb3ltZW50KSB3ZSBwcm9iZSB0aGUgdGFyZ2V0IHZpYSBoZWFsdGhDaGVjayB0b1xuICAgICAgLy8gbGVhcm4gaXRzIHdvcmtmbG93LWNvcmUgdmVyc2lvbiwgdGhlbiBkZXJpdmUgdGhlIGNhcGFiaWxpdHkuIFRoZVxuICAgICAgLy8gcHJvYmUgaGFzIGEgdGlnaHQgdGltZW91dDogb24gbWlzcy9mYWlsdXJlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGxlZ2FjeSByYXcgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIHVuaXZlcnNhbGx5IHJlYWRhYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIFdvcmxkcyB0aGF0IGRvbid0IGV4cG9zZSB0aGUgYHN0cmVhbXNgIEFQSSAoZS5nLiBtaW5pbWFsIHRlc3RcbiAgICAgIC8vIG1vY2tzKSBjYW4ndCBzZXJ2aWNlIGhlYWx0aCBjaGVja3MsIHNvIHdlIHNraXAgdGhlIHByb2JlIGZvciB0aGVtLlxuICAgICAgLy8gR2VuZXJhdGUgcnVuSWQgY2xpZW50LXNpZGUgc28gd2UgaGF2ZSBpdCBiZWZvcmUgc2VyaWFsaXphdGlvblxuICAgICAgLy8gKHJlcXVpcmVkIGZvciBmdXR1cmUgRTJFIGVuY3J5cHRpb24gd2hlcmUgcnVuSWQgaXMgcGFydCBvZiB0aGVcbiAgICAgIC8vIGVuY3J5cHRpb24gY29udGV4dCkuIFdoZW4gdGhlIFdvcmxkIHByb3ZpZGVzIGEgYGNyZWF0ZVJ1bklkKClgXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgdXNlIGl0IHNvIHdvcmxkcyBjYW4gZW1iZWQgaW1wbGVtZW50YXRpb24tc3BlY2lmaWNcbiAgICAgIC8vIG1ldGFkYXRhIChlLmcuLCByZWdpb24pIGludG8gdGhlIElELCBmb3J3YXJkaW5nIHRoZSBmdWxsIG9wdGlvbnNcbiAgICAgIC8vIGJhZyBzbyB3b3JsZHMgY2FuIHJlYWQgd2hpY2hldmVyIGZpZWxkcyB0aGV5IHJlY29nbmlzZTsgb3RoZXJ3aXNlXG4gICAgICAvLyBmYWxsIGJhY2sgdG8gYSBzdGFuZGFyZCBtb25vdG9uaWMgVUxJRC5cbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHtcbiAgICAgICAgd29ybGQuY3JlYXRlUnVuSWRcbiAgICAgICAgICA/IHdvcmxkLmNyZWF0ZVJ1bklkKG9wdHMgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuICAgICAgICAgIDogdWxpZCgpXG4gICAgICB9YDtcblxuICAgICAgbGV0IGZyYW1lZEJ5dGVTdHJlYW1zOiBib29sZWFuO1xuICAgICAgbGV0IHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb246IGJvb2xlYW47XG4gICAgICAvLyBUaGUgY29uc3VtZXIncyBob29rLXJlc3VtZSBwcm90b2NvbCB2ZXJzaW9uLCBzdGFtcGVkIG9udG8gdGhlIG5ld1xuICAgICAgLy8gcnVuLiBDdXJyZW50IHByb2R1Y2VycyB3cml0ZSB0aGUgaG9va19yZWNlaXZlZCBldmVudCBkdXJhYmx5IGJlZm9yZVxuICAgICAgLy8gcHVibGlzaGluZyB0aGUgd2FrZSBhbmQgbmV2ZXIgcmVhZCBpdDsgT0xERVIgcHJvZHVjZXJzIGdhdGUgdGhlaXJcbiAgICAgIC8vIGxhenkgKGhvb2tJbnB1dC1jYXJyeWluZykgcGF0aCBvbiB0aGUgZGVwbG95bWVudCB0aGF0IHdpbGwgYWN0dWFsbHlcbiAgICAgIC8vIGNvbnN1bWUgdGhlIHF1ZXVlIG1lc3NhZ2UuIGB1bmRlZmluZWRgIG1lYW5zIFwiY291bGQgbm90IGF0dGVzdFwiIGFuZFxuICAgICAgLy8gZmFpbHMgdGhhdCBnYXRlIGNsb3NlZC5cbiAgICAgIGxldCB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBQdWJsaWMga2V5IG9mIHRoZSB0YXJnZXQgcnVuLCB3aGVuIHRoZSBjYXBhYmlsaXR5IHByb2JlIHdhcyBhYmxlIHRvXG4gICAgICAvLyBzdXBwbHkgb25lIChjcm9zcy1kZXBsb3ltZW50IG9ubHkpLlxuICAgICAgbGV0IHByb2JlZFJ1blB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gY3VycmVudERlcGxveW1lbnRJZCkge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IHRydWU7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgICAvLyBTYW1lIGRlcGxveW1lbnQ6IHRoaXMgcHJvY2VzcyBpcyB0aGUgY29uc3VtZXIsIHNvIGl0cyBvd24gY29uc3RhbnRcbiAgICAgICAgLy8gaXMgYXV0aG9yaXRhdGl2ZS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT047XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3b3JsZC5zdHJlYW1zPy5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZTtcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgICAvLyBObyBwcm9iZSBjaGFubmVsIHRvIHRoZSB0YXJnZXQsIHNvIHdlIGNhbm5vdCBhdHRlc3QgdGhlIGNvbnN1bWVyXG4gICAgICAgIC8vIGhvbm9ycyBgaG9va0lucHV0YDsgbGVhdmUgdGhlIG1hcmtlciBvZmYgKG9sZGVyIHByb2R1Y2VycyBmYWlsXG4gICAgICAgIC8vIGNsb3NlZCB0byB0aGVpciBzZXF1ZW50aWFsIHBhdGgpLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXNrIGZvciB0aGlzIHJ1bidzIHB1YmxpYyBrZXkgd2hpbGUgd2UncmUgaGVyZS4gVGhlIHByb2JlIGFscmVhZHlcbiAgICAgICAgLy8gYmxvY2tzIGBzdGFydCgpYCBvbiBldmVyeSBjcm9zcy1kZXBsb3ltZW50IGNhbGwsIGFuZCB0aGUgcmVzcG9uZGVyXG4gICAgICAgIC8vIGV4ZWN1dGVzIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQgd2hlcmUgdGhlIGtleSBtYXRlcmlhbCBpc1xuICAgICAgICAvLyBsb2NhbCwgc28gdGhlIGtleSBjb21lcyBiYWNrIGZvciBmcmVlIG9uIGEgcmVzcG9uc2Ugd2UgYXJlXG4gICAgICAgIC8vIGFscmVhZHkgYXdhaXRpbmcsIGFuZCB3ZSBjYW4gc2tpcCB0aGUga2V5LWxvb2t1cCBBUEkgcmVxdWVzdFxuICAgICAgICAvLyBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IG9uIHRpbWVvdXQgb3IgYW4gb2xkZXIgdGFyZ2V0LCBubyBrZXkgY29tZXNcbiAgICAgICAgLy8gYmFjayBhbmQgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGxvb2t1cCBiZWxvdy5cbiAgICAgICAgY29uc3QgcHJvYmUgPSBhd2FpdCBoZWFsdGhDaGVjayh3b3JsZCwge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0aW1lb3V0OiBDUk9TU19ERVBMT1lNRU5UX0NBUEFCSUxJVFlfUFJPQkVfVElNRU9VVF9NUyxcbiAgICAgICAgICBuYW1lc3BhY2U6IG9wdHMubmFtZXNwYWNlLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBwcm9iZWRSdW5QdWJsaWNLZXkgPSBwcm9iZT8uZW5jcnlwdGlvblB1YmxpY0tleTtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKHByb2JlPy53b3JrZmxvd0NvcmVWZXJzaW9uKTtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXM7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZSByZXNwb25kZXIgcnVucyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyBpdHNcbiAgICAgICAgLy8gYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gIHJlZmxlY3RzIHRoZSBjb25zdW1lci4gVW5kZWZpbmVkIG9uIGFuXG4gICAgICAgIC8vIG9sZGVyIHRhcmdldCBvciBhIHByb2JlIHRpbWVvdXQsIGxlYXZpbmcgdGhlIG1hcmtlciBvZmYuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBwcm9iZT8uaG9va1Jlc3VtZUlucHV0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gRGVmYXVsdCBuZXcgcnVucyB0byB0aGUgY29uZmlndXJlZCB3b3JsZCdzIHNwZWMgdmVyc2lvbi4gVGhlIHdvcmxkXG4gICAgICAvLyBpdHNlbGYgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhpcyBydW50aW1lJ3Mgc3BlYyB2ZXJzaW9uLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPSBvcHRzLnNwZWNWZXJzaW9uID8/IHdvcmxkLnNwZWNWZXJzaW9uO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0cy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgICAgIGxldCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdHMuYXR0cmlidXRlcyAmJiBPYmplY3Qua2V5cyhvcHRzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNwZWNWZXJzaW9uIDwgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAnSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBXb3JsZCB0aGF0IHN1cHBvcnRzIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzYCB0cmVhdHMgYHVuZGVmaW5lZGAgYXMgXCJyZW1vdmUgdGhpc1xuICAgICAgICAvLyBrZXlcIiwgd2hpY2ggaXMgbWVhbmluZ2xlc3MgYXQgY3JlYXRpb24gdGltZS4gUmVqZWN0IGl0IHVwIGZyb250XG4gICAgICAgIC8vIHNvIEpTIGNhbGxlcnMgZ2V0IGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiBhIGRvd25zdHJlYW0gc2NoZW1hXG4gICAgICAgIC8vIGZhaWx1cmUgKHRoZSB0eXBlcyBhbHJlYWR5IGZvcmJpZCBub24tc3RyaW5nIHZhbHVlcykuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMuYXR0cmlidXRlcykpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzKG9wdHMuYXR0cmlidXRlcywge1xuICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYXR0cmlidXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBjaGFuZ2VzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IFtrZXksIHZhbHVlIGFzIHN0cmluZ10pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyb3NzLXJ1biBsaW5lYWdlOiB0aGUgcmVzZXJ2ZWQga2V5cyByaWRlIG9uIHRoZSBydW4ncyBleGlzdGluZ1xuICAgICAgLy8gYXR0cmlidXRlcywgc28gdGhleSBhZGQgbm8gZXh0cmEgd3JpdGUuIENhbGxlciBhdHRyaWJ1dGVzIGFyZSBzcHJlYWRcbiAgICAgIC8vIGxhc3QsIHNvIGEgY2FsbGVyIHdpdGggYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgY2FuIGRlbGliZXJhdGVseVxuICAgICAgLy8gcmUtcGFyZW50LlxuICAgICAgY29uc3QgbGluZWFnZSA9XG4gICAgICAgIHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTXG4gICAgICAgICAgPyByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcnVuQXR0cmlidXRlcyA9IGxpbmVhZ2VcbiAgICAgICAgPyB7IC4uLmxpbmVhZ2UsIC4uLmF0dHJpYnV0ZXMgfVxuICAgICAgICA6IGF0dHJpYnV0ZXM7XG5cbiAgICAgIC8vIFNoYXJlZCBieSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQgYW5kIHRoZSByZXNpbGllbnQtc3RhcnQgcXVldWUgaW5wdXQuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVTZWVkID0gcnVuQXR0cmlidXRlc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bkF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAuLi4oYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgfHwgbGluZWFnZSAhPSBudWxsXG4gICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSBhcyBjb25zdCB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcblxuICAgICAgLy8gYHJlcGxheWVkRnJvbVJ1bklkYCBpcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBzb3VyY2UgcnVuOyByZWplY3QgYW55dGhpbmdcbiAgICAgIC8vIHRoYXQgaXNuJ3QgYSByZWFsIHJ1biBJRCBzbyB0aGUgbGluZWFnZSBsaW5rIGNhbid0IHBvaW50IGF0IGdhcmJhZ2UuXG4gICAgICBpZiAoXG4gICAgICAgIG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhd29ya2Zsb3dSdW5JZFNjaGVtYS5zYWZlUGFyc2Uob3B0cy5yZXBsYXllZEZyb21SdW5JZCkuc3VjY2Vzc1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICBgcmVwbGF5ZWRGcm9tUnVuSWQgbXVzdCBiZSBhIHJ1biBJRCAod3J1bl88dWxpZD4pOyByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgU3RyaW5nKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnNsaWNlKDAsIDY0KVxuICAgICAgICAgICl9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICAvLyBSZXNvbHZlIGhvdyB0byBlbmNyeXB0IHRoZSB3b3JrZmxvdyBhcmd1bWVudHMuXG4gICAgICAvL1xuICAgICAgLy8gUHJlZmVycmVkOiB0aGUgY2FwYWJpbGl0eSBwcm9iZSBhbHJlYWR5IHRvbGQgdXMgdGhpcyBydW4ncyBwdWJsaWNcbiAgICAgIC8vIGtleSwgc28gc2VhbCB0byBpdC4gVGhhdCBza2lwcyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdoaWNoIGZvciBhXG4gICAgICAvLyBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IGlzIGEgYHJ1bi1rZXlgIEFQSSByZXF1ZXN0LCB0aGUgbGFzdCBvbmUgbGVmdFxuICAgICAgLy8gb24gdGhpcyBwYXRoLiBJdCBpcyBhbHNvIGEgcHJpdmlsZWdlIHJlZHVjdGlvbjogdGhlIGNhbGxlciBlbmRzIHVwXG4gICAgICAvLyBhYmxlIHRvIHdyaXRlIHRoZSBhcmd1bWVudHMgYnV0IG5vdCByZWFkIHRoZW0gYmFjaywgd2hlcmVhcyBmZXRjaGluZ1xuICAgICAgLy8gdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGZ1bGwgcmVhZCBhY2Nlc3MgdG8gYSBydW4gaXQgbWVyZWx5XG4gICAgICAvLyBsYXVuY2hlZC5cbiAgICAgIGNvbnN0IHByb2JlZFB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShwcm9iZWRSdW5QdWJsaWNLZXkpO1xuXG4gICAgICBsZXQgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChwcm9iZWRQdWJsaWNLZXkpIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHNlYWxUbyhwcm9iZWRQdWJsaWNLZXkpO1xuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcHJvYmVkUnVuUHVibGljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgc28gdGhhdCBjcm9zcy1ydW4gd3JpdGVycyAoYVxuICAgICAgICAvLyBob29rIHJlc3VtcHRpb24gZnJvbSBhbm90aGVyIGRlcGxveW1lbnQsIGEgc2libGluZyB3cml0aW5nIGludG8gYVxuICAgICAgICAvLyBmb3J3YXJkZWQgc3RyZWFtKSBjYW4gc2VhbCBwYXlsb2FkcyAqdG8qIHRoaXMgcnVuIHdpdGhvdXQgaG9sZGluZ1xuICAgICAgICAvLyBpdHMgc3ltbWV0cmljIGtleS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUHJlc2VuY2Ugb2YgdGhpcyBmaWVsZCBpcyB0aGUgd3JpdGVyLXNpZGUgZ2F0ZSBmb3Igc2VhbGVkXG4gICAgICAgIC8vIGVudmVsb3Blcywgc28gaXQgbXVzdCBvbmx5IGJlIHN0YW1wZWQgd2hlbiB0aGlzIHJ1bnRpbWUgY291bGRcbiAgICAgICAgLy8gaXRzZWxmIG9wZW4gb25lLiBUaGF0IGhvbGRzIGJ5IGNvbnN0cnVjdGlvbiBoZXJlOiBkZXJpdmF0aW9uIGFuZFxuICAgICAgICAvLyBgZW5jcGAgZGlzcGF0Y2ggbGl2ZSBpbiB0aGUgc2FtZSBwYWNrYWdlLCBzbyBhbnkgY29yZSB0aGF0IGNhblxuICAgICAgICAvLyBzdGFtcCBjYW4gYWxzbyBvcGVuLiBSdW5zIGFyZSBwaW5uZWQgdG8gdGhlaXIgY3JlYXRpbmcgZGVwbG95bWVudCxcbiAgICAgICAgLy8gc28gdGhlIGNhcGFiaWxpdHkgdGhpcyBhdHRlc3RzIHRvIGlzIHN0aWxsIGFjY3VyYXRlIGF0IHJlc3VtZSB0aW1lLlxuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcmF3S2V5XG4gICAgICAgICAgPyBieXRlc1RvQmFzZTY0KChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHJ1biB2aWEgcnVuX2NyZWF0ZWQgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgLy8gUGFzcyBjbGllbnQtZ2VuZXJhdGVkIHJ1bklkIC0gc2VydmVyIHdpbGwgYWNjZXB0IGFuZCB1c2UgaXRcbiAgICAgIC8vIENvbXByZXNzIHdvcmtmbG93IGFyZ3VtZW50cyBvbmx5IHdoZW4gdGhlIHJ1biBpdHNlbGYgaXMgbWFya2VkIGFzXG4gICAgICAvLyBwb3NzaWJseSBjb250YWluaW5nIGNvbXByZXNzZWQgcGF5bG9hZHMgKHNwZWNWZXJzaW9uID49IDUpIEFORCB0aGVcbiAgICAgIC8vIHRhcmdldCBkZXBsb3ltZW50IGNhbiBkZWNvZGUgdGhlbSAoc2FtZS1kZXBsb3ltZW50LCBvciBwcm9iZWRcbiAgICAgIC8vIGNhcGFiaWxpdHkgZm9yIGNyb3NzLWRlcGxveW1lbnQgc3RhcnRzKS5cbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiAmJlxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIGNvbXByZXNzaW9uXG4gICAgICApO1xuXG4gICAgICAvLyBUaGUgZW52aXJvbm1lbnQgdGhpcyBjYWxsZXIncyBvd24gYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBhdHRyaWJ1dGVkXG4gICAgICAvLyB0by4gU3RhbXBlZCBpbnRvIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYHJ1bklucHV0YCAoTk9UIGludG9cbiAgICAgIC8vIGBydW5fY3JlYXRlZGAsIHdob3NlIHRlbmFudCB0aGUgYmFja2VuZCBhbHJlYWR5IGtub3dzKSBzbyB0aGVcbiAgICAgIC8vIGRlcGxveW1lbnQgdGhhdCBjb25zdW1lcyB0aGUgbWVzc2FnZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBydW4gaXQgaXNcbiAgICAgIC8vIGJlaW5nIGFza2VkIHRvIHJlc2lsaWVudGx5IGNyZWF0ZSB3YXMgY3JlYXRlZCBhZ2FpbnN0IGEgZGlmZmVyZW50XG4gICAgICAvLyBlbnZpcm9ubWVudCB0aGFuIGl0cyBvd24uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHR3byB3cml0ZXMgYmVsb3cgZ28gdG8gZGlmZmVyZW50IHBsYWNlcyBieSBkaWZmZXJlbnQgcm91dGVzOlxuICAgICAgLy8gYGV2ZW50cy5jcmVhdGVgIGlzIGF0dHJpYnV0ZWQgdG8gVEhJUyBjbGllbnQncyB0ZW5hbnQsIHdoaWxlIHRoZSBxdWV1ZVxuICAgICAgLy8gbWVzc2FnZSBpcyBwaW5uZWQgdG8gYSBkZXBsb3ltZW50SWQuIFdoZW4gdGhvc2UgZGlzYWdyZWUgKGFcbiAgICAgIC8vIHByb2R1Y3Rpb24tY3JlZGVudGlhbGVkIGNsaWVudCBwaW5uaW5nIGEgcHJldmlldyBkZXBsb3ltZW50KSB0aGVcbiAgICAgIC8vIHByZXZpZXcgY29uc3VtZXIgY2FuJ3QgZmluZCB0aGUgcnVuIGluIGl0cyBvd24gdGVuYW50LCBmYWxscyBiYWNrIHRvXG4gICAgICAvLyByZXNpbGllbnQgc3RhcnQsIGFuZCByZS1jcmVhdGVzIGl0OiBvbmUgY2xpZW50LW1pbnRlZCBydW4gaWQsIHR3b1xuICAgICAgLy8gZW52aXJvbm1lbnRzLCB0aGUgcHJvZHVjdGlvbiBjb3B5IHBlbmRpbmcgZm9yZXZlciBhbmQgdGhlIHByZXZpZXcgY29weVxuICAgICAgLy8gZXhlY3V0aW5nLiBXb3JsZHMgd2l0aCBhIHNpbmdsZSB0ZW5hbnQgcmV0dXJuIHVuZGVmaW5lZCBhbmQgdGhlIGZpZWxkXG4gICAgICAvLyBpcyBhYnNlbnQuXG4gICAgICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG5cbiAgICAgIC8vIElmIFdPUktGTE9XX1ZNIGlzIHNldCBvbiB0aGUgY2xpZW50IHN0YXJ0aW5nIHRoZSBydW4sIHN0YW1wIHRoZVxuICAgICAgLy8gZW5naW5lIGNob2ljZSBpbnRvIHRoZSBydW4ncyBleGVjdXRpb25Db250ZXh0IHNvIHRoZSBydW4ga2VlcHNcbiAgICAgIC8vIGV4ZWN1dGluZyBvbiB0aGUgZW5naW5lIGl0IHN0YXJ0ZWQgb24gKHRoZSBzYW1lIGRlcGxveW1lbnQgY2FuXG4gICAgICAvLyBzZXJ2ZSBib3RoIFZNIGVuZ2luZXMpLiBVbmtub3duIHZhbHVlcyB0aHJvdzsgc2VlXG4gICAgICAvLyBnZXRXb3JrZmxvd1ZtRnJvbUVudigpLlxuICAgICAgY29uc3Qgd29ya2Zsb3dWbSA9IGdldFdvcmtmbG93Vm1Gcm9tRW52KCk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgIC8vIEF0dGVzdCB0aGF0IHRoZSAqY29uc3VtZXIqIGRlcGxveW1lbnQncyBydW50aW1lIHJlLWVuc3VyZXMgYVxuICAgICAgICAvLyBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBhIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YCBvbiByZXBsYXkuXG4gICAgICAgIC8vIEFuIE9MREVSIHByb2R1Y2VyIHJlc3VtaW5nIHRoaXMgcnVuIHJlYWRzIHRoZSBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gdGhlIGhvb2sncyByZXN1bWVDb250ZXh0IGJ5IHRoZSBzZXJ2ZXIpIHRvIGRlY2lkZSB3aGV0aGVyIGl0cyBsYXp5XG4gICAgICAgIC8vIGZhc3QgcGF0aCBpcyBzYWZlLiBGb3IgYSBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IHRoZSBjb25zdW1lciBpcyB0aGVcbiAgICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHdlIHN0YW1wIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIGNhcnJpZWQgYmFjayBvblxuICAgICAgICAvLyB0aGUgaGVhbHRoLWNoZWNrIHByb2JlLCBuZXZlciB0aGUgY2FsbGVyJ3MuIE9taXR0ZWQgd2hlbiB3ZSBjb3VsZFxuICAgICAgICAvLyBub3QgYXR0ZXN0IHRoZSB0YXJnZXQgKG9sZGVyIHRhcmdldCwgdGltZW91dCwgb3Igbm8gcHJvYmUgY2hhbm5lbCksXG4gICAgICAgIC8vIHdoaWNoIGZhaWxzIHRoZSByZXN1bWUgZ2F0ZSBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgLi4uKHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtmbG93Vm0gPyB7IHdvcmtmbG93Vm0gfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWRcbiAgICAgICAgICA/IHsgcmVwbGF5ZWRGcm9tUnVuSWQ6IG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgb3B0cy5uYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oY3JlYXRvckVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHsgZW52aXJvbm1lbnQ6IGNyZWF0b3JFbnZpcm9ubWVudCB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsOiB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlOiB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsZ0NBQWdDLEVBQ2hDLDBDQUEwQyxFQUMxQyxpQ0FBaUMsRUFDakMsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFDTCxhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGdCQUFnQixHQUNqQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCwwQkFBMEIsRUFFMUIsbUJBQW1CLEVBQ25CLE1BQU0sR0FDUCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFB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O1lBQ3RFLCtCQUErQjtZQUMvQixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzREFBc0QsRUFDdEQ7b0JBQ0UsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssV0FBVztvQkFDekMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxHQUFHLENBQVUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgd29ya2Zsb3dEaXNwbGF5TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHtcbiAgUnVuUmV0ZW50aW9uLFxuICBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFJFVEVOVElPTl9BVFRSSUJVVEUsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB3b3JrZmxvd1J1bklkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IGdldFJ1bkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL2NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGRlY29kZVJ1blB1YmxpY0tleSxcbiAgZGVyaXZlUnVuS2V5UGFpcixcbn0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1ZtRnJvbUVudiB9IGZyb20gJy4vdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sIH0gZnJvbSAnLi93b3JsZC1jb21wYXRpYmlsaXR5LmpzJztcblxuLyoqXG4gKiBUaW1lb3V0IGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudCBjYXBhYmlsaXR5IHByb2JlIGRvbmUgYmVmb3JlXG4gKiBkZWh5ZHJhdGluZyB3b3JrZmxvdyBhcmd1bWVudHMuIEtlcHQgdGlnaHQgb24gcHVycG9zZTogdGhlIHByb2JlIGlzXG4gKiBhbiBvcHRpbWl6YXRpb24gKGl0IGxldHMgdGhlIGNhbGxlciBlbWl0IHRoZSBmcmFtZWQgYnl0ZS1zdHJlYW0gd2lyZVxuICogZm9ybWF0IHdoZW4gdGhlIHRhcmdldCBzdXBwb3J0cyBpdCksIGFuZCB0aGUgZmFsbGJhY2sgb24gdGltZW91dCBpc1xuICogdGhlIGxlZ2FjeSByYXcgZm9ybWF0IHdoaWNoIGFsd2F5cyB3b3Jrcy4gTG9uZyBkZWxheXMgaGVyZSB3b3VsZFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqXG4gKiBXaXJlIGVuY29kaW5nIG9mIGByZXRlbnRpb246IDBgLiBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBzdHJpbmdzLCBhbmQgdGhlXG4gKiBgJHJldGVudGlvbmAgdmFsdWUgaXMgYSBkdXJhdGlvbiB3cml0dGVuIGFzIGEgZGVjaW1hbCBpbnRlZ2VyIOKAlCBzbyB6ZXJvXG4gKiB0cmF2ZWxzIGFzIGAnMCdgLCBub3QgYXMgdGhlIG5hbWUgb2YgYSBtb2RlLlxuICovXG5jb25zdCBSRVRFTlRJT05fWkVST19BVFRSSUJVVEVfVkFMVUUgPSAnMCc7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBDcm9zcy1ydW4gbGluZWFnZSBmb3IgYSBydW4gYmVpbmcgc3RhcnRlZCBmcm9tIGluc2lkZSBhbm90aGVyIHJ1bi5cbiAqXG4gKiBUaGUgYW1iaWVudCBzdGVwIGNvbnRleHQgY2FycmllcyB0aGUgcGFyZW50IHJ1biBpZCBhbmQgdGhlIHJvb3Qgb2YgaXRzXG4gKiBsaW5lYWdlOyB0aGUgcnVudGltZSBmaWxscyBib3RoIGZyb20gdGhlIHJ1biBpdCBhbHJlYWR5IGhhcyBsb2FkZWQsIHNvIHRoaXNcbiAqIGlzIGEgcHVyZSBjb250ZXh0IHJlYWQgd2l0aCBubyBJL08uIFRoZSBuZXcgcnVuIHJlY29yZHMgYCRwYXJlbnRSdW5JZGAgKHRoZVxuICogZWRnZSkgYW5kIGluaGVyaXRzIHRoZSBwYXJlbnQncyBgJHJvb3RSdW5JZGAgKHRoZSBwYXJlbnQgaXRzZWxmIHdoZW4gaXQgaXMgYVxuICogcm9vdCksIHNvIGEgZGFpc3kgY2hhaW4gb3IgZmFuLW91dCBvZiBhbnkgZGVwdGggZ3JvdXBzIHVuZGVyIG9uZSByb290IGlkLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYSB0b3AtbGV2ZWwgYHN0YXJ0KClgLCB3aGljaCBoYXMgbm8gY29udGV4dCwgc29cbiAqIHN0YW5kYWxvbmUgcnVucyBjYXJyeSBubyBsaW5lYWdlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0b3JlID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgY29uc3QgcGFyZW50UnVuSWQgPSBzdG9yZT8ud29ya2Zsb3dNZXRhZGF0YT8ud29ya2Zsb3dSdW5JZDtcbiAgaWYgKCFwYXJlbnRSdW5JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIFtST09UX1JVTl9JRF9BVFRSSUJVVEVdOiBzdG9yZS5yb290UnVuSWQgPz8gcGFyZW50UnVuSWQsXG4gICAgW1BBUkVOVF9SVU5fSURfQVRUUklCVVRFXTogcGFyZW50UnVuSWQsXG4gIH07XG59XG5cbi8vIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBpcyBhIG5vLW9wIGluIFdvcmxkcyB3aXRob3V0IGF0b21pYyBkZXBsb3ltZW50cy5cbi8vIFRoZSB3YXJuaW5nIHRoYXQgZXhwbGFpbnMgdGhpcyBvbmx5IG5lZWRzIHRvIGZpcmUgb25jZSBwZXIgcHJvY2VzczogYVxuLy8gd29ya2Zsb3cgdGhhdCBoYXJkY29kZXMgJ2xhdGVzdCcgZm9yIGl0cyBWZXJjZWwgZGVwbG95bWVudCB3b3VsZCBvdGhlcndpc2Vcbi8vIGxvZyBpdCBvbiBldmVyeSBsb2NhbC9Qb3N0Z3JlcyBydW4sIGZsb29kaW5nIHRpZ2h0IGRldiBsb29wcy5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKSBzbyBcIm9uY2UgcGVyIHByb2Nlc3NcIiBpcyBub3Qgb25jZVxuLy8gcGVyIGJ1bmRsZXIgbGF5ZXIuXG5jb25zdCBsYXRlc3ROb09wV2FybmluZyA9IGdsb2JhbFNpbmdsZXRvbihcbiAgJ0B3b3JrZmxvdy9jb3JlLy9sYXRlc3ROb09wV2FybmluZycsXG4gIDEsXG4gICgpID0+ICh7IHdhcm5lZDogZmFsc2UgfSlcbik7XG5cbi8qKlxuICogUmVzZXQgdGhlIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBuby1vcCB3YXJuLW9uY2UgZ3VhcmQuIFRlc3Qtb25seSxcbiAqIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggYWNyb3NzIGBzdGFydCgpYCBjYWxscy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldExhdGVzdE5vT3BXYXJuRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdpb24gaWRlbnRpZmllciBmb3IgdGhlIG5ldyBydW4uIEN1cnJlbnRseSBjb25zdW1lZCBvbmx5XG4gICAqIGJ5IGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCwgd2hpY2ggZW1iZWRzIHRoZSByZWdpb24gaW50byB0aGUgdGFnZ2VkXG4gICAqIHJ1biBJRCBhbmQgcm91dGVzIHRoZSBpbml0aWFsIHdvcmtmbG93IG1lc3NhZ2UgdG8gdGhlIG1hdGNoaW5nXG4gICAqIHJlZ2lvbmFsIHF1ZXVlLiBXaGVuIG9taXR0ZWQsIHRoZSB3b3JsZCBmYWxscyBiYWNrIHRvIGl0cyBvd25cbiAgICogZGVmYXVsdCAoZm9yIGB3b3JsZC12ZXJjZWxgOiB0aGUgYFZFUkNFTF9SRUdJT05gIGVudmlyb25tZW50XG4gICAqIHZhcmlhYmxlLCB0aGVuIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IHJlZ2lvbiBgaWFkMWA7IGEgY29uY3JldGUsXG4gICAqIHJvdXRhYmxlIHJlZ2lvbiBpcyBhbHdheXMgY2hvc2VuKS5cbiAgICpcbiAgICogV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlIHRoaXMgZmllbGQuXG4gICAqL1xuICByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBzZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IGEgcHJlZmVyZW5jZSBmb3IgZGF0YSByZXRlbnRpb24gYWZ0ZXIgcnVuIGNvbXBsZXRpb24uXG4gICAqXG4gICAqICoqRXhwZXJpbWVudGFsLioqIEJvdGggdGhlIHVuaXQgYW5kIHRoZSBzZXQgb2YgYWNjZXB0ZWQgdmFsdWVzIGFyZSBleHBlY3RlZFxuICAgKiB0byBjaGFuZ2UuXG4gICAqXG4gICAqIFdvcmxkcyBjb250cm9sIHRoZSByZXRlbnRpb24gb2YgdXNlciBkYXRhIChldmVudCBwYXlsb2FkcyBhbmQgc3RyZWFtXG4gICAqIGNodW5rcyksIHRoZSBldmVudCBsb2csIGFuZCBhbnkgYW5hbHl0aWNzIGRhdGEuIE9wdGlvbnMgYXJlOlxuICAgKiAtIGAnZGVmYXVsdCdgOiBzYW1lIGFzIG9taXNzaW9uLCB0aGUgV29ybGQgd2lsbCBkZWNpZGUuIE9uIFZlcmNlbCwgdGhpc1xuICAgKiAgIGlzIGJhc2VkIG9uIHlvdXIgdGVhbSdzIHBsYW4uXG4gICAqIC0gYDBgOiBkYXRhIGlzIGRlbGV0ZWQgYXMgc29vbiBhcyB5b3VyIHJ1biBjb21wbGV0ZXMgb3IgZmFpbHMuIE9uXG4gICAqICAgVmVyY2VsLCB1c2VyIGRhdGEgaXMgZGVsZXRlZCwgYnV0IG1ldGFkYXRhIG1heSBwZXJzaXN0IGZvciB5b3VyIHBsYW4nc1xuICAgKiAgIGRlZmF1bHQgcmV0ZW50aW9uIHBlcmlvZC5cbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIGEgZHVyYXRpb24sIHdpdGggemVybyBiZWluZyB0aGUgb25seSB2YWxpZCBvcHRpb24gY3VycmVudGx5LlxuICAgKlxuICAgKiAqKktub3duIGxpbWl0YXRpb24gYXQgYDBgLioqIFRoZSBwdXJnZSByYWNlcyB5b3VyIG93biByZWFkIG9mIHRoZSBydW4nc1xuICAgKiByZXN1bHQgYW5kIGdlbmVyYWxseSB3aW5zLCBzbyBgYXdhaXQgcnVuLnJldHVyblZhbHVlYCBvbiBhXG4gICAqIGBleHBlcmltZW50YWxfcmV0ZW50aW9uOiAwYCBydW4gdXN1YWxseSB0aHJvd3MgYFJ1bkV4cGlyZWRFcnJvcmAgcmF0aGVyXG4gICAqIHRoYW4gcmVzb2x2aW5nLiBJZiB5b3UgbmVlZCB0aGUgcmVzdWx0LCByZXR1cm4gaXQgdGhyb3VnaCBhIGNoYW5uZWwgeW91XG4gICAqIGNvbnRyb2wsIGUuZy4gYSBzdGVwIHRoYXQgd3JpdGVzIGl0IHRvIGV4dGVybmFsIHN0b3JhZ2UuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBydW4gYXMgdGhlIHJlc2VydmVkIGAkcmV0ZW50aW9uYCBhdHRyaWJ1dGUsIHNvIGl0XG4gICAqIHJlcXVpcmVzIGEgV29ybGQgaW1wbGVtZW50aW5nIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLiBgJ2RlZmF1bHQnYCBpc1xuICAgKiBub3Qgd3JpdHRlbiBhdCBhbGwsIGtlZXBpbmcgaXQgZXhhY3RseSBlcXVpdmFsZW50IHRvIG9taXR0aW5nIHRoZVxuICAgKiBvcHRpb24uIFJldGVudGlvbiBpcyBlbmZvcmNlZCBieSB0aGUgV29ybGQ6IHRoZSBmaXJzdC1wYXJ0eSBXb3JsZHNcbiAgICogKFZlcmNlbCwgTG9jYWwsIFBvc3RncmVzKSBpbXBsZW1lbnQgaXQsIGFuZCBhIFdvcmxkIHRoYXQgZG9lcyBub3RcbiAgICogcmVjb2duaXplIHRoZSB2YWx1ZSBrZWVwcyB0aGUgZGF0YS5cbiAgICovXG4gIGV4cGVyaW1lbnRhbF9yZXRlbnRpb24/OiBSdW5SZXRlbnRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiBleGlzdGluZyBydW4gdGhpcyBydW4gaXMgYmVpbmcgcmVwbGF5ZWQgZnJvbSwgaWYgYW55LlxuICAgKlxuICAgKiBSZWNvcmRlZCBvbiB0aGUgbmV3IHJ1bidzIGBleGVjdXRpb25Db250ZXh0YCBhcyBgcmVwbGF5ZWRGcm9tUnVuSWRgIHNvXG4gICAqIHRvb2xpbmcgKGUuZy4gdGhlIGRhc2hib2FyZCBydW5zIGxpc3QpIGNhbiBzaG93IHRoYXQgYSBydW4gb3JpZ2luYXRlZCBhc1xuICAgKiBhIHJlcGxheSBhbmQgbGluayBiYWNrIHRvIGl0cyBzb3VyY2UuIFNldCBhdXRvbWF0aWNhbGx5IGJ5XG4gICAqIHtAbGluayByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZ307IHRoZXJlJ3MgdXN1YWxseSBubyByZWFzb24gdG8gcGFzcyBpdFxuICAgKiBkaXJlY3RseS5cbiAgICpcbiAgICogTXVzdCBiZSBhIHJ1biBJRDogYHdydW5fYCBmb2xsb3dlZCBieSBhIDI2LWNoYXIgVUxJRC4gSXQncyBhIGZvcmVpZ24ga2V5XG4gICAqIHRvIHRoZSBzb3VyY2UgcnVuLCBzbyBgc3RhcnQoKWAgdmFsaWRhdGVzIHRoZSBleGFjdCBzaGFwZSBhbmQgcmVqZWN0c1xuICAgKiBhbnl0aGluZyBlbHNlIHJhdGhlciB0aGFuIHBlcnNpc3QgYSBsaW5lYWdlIGxpbmsgdGhhdCBwb2ludHMgYXQgZ2FyYmFnZS5cbiAgICovXG4gIHJlcGxheWVkRnJvbVJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudC4gU2NvcGVzIHRoZSB3b3JrZmxvdyBxdWV1ZVxuICAgKiB0b3BpYyB0byBgX197bmFtZXNwYWNlfV93a2Zfd29ya2Zsb3dfKmAgKGUuZy4gYCdldmUnYCkgaW5zdGVhZCBvZiB0aGVcbiAgICogZGVmYXVsdCBgX193a2Zfd29ya2Zsb3dfKmAsIGFuZCBpcyBhbHNvIHVzZWQgZm9yIHRoZSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGNhcGFiaWxpdHkgcHJvYmUuIEZhbGxzIGJhY2sgdG8gYFdPUktGTE9XX1FVRVVFX05BTUVTUEFDRWAgaW4gdGhlXG4gICAqIGNhbGxpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogV2l0aGluIGEgZGVwbG95bWVudCB0aGUgZW52IGZhbGxiYWNrIGlzIGNvcnJlY3QuIENyb3NzLWNvbnRleHQgY2FsbGVyc1xuICAgKiAoZS5nLiB0aGUgb2JzZXJ2YWJpbGl0eSBkYXNoYm9hcmQgcmVwbGF5aW5nIGEgcnVuKSBtdXN0IHBhc3MgdGhlXG4gICAqIFRBUkdFVCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHk6IHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW5cbiAgICogdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIHJ1biBlbnF1ZXVlZCB0byBhIHRvcGljIHRoZSB0YXJnZXQgaGFzIG5vXG4gICAqIGNvbnN1bWVyIGZvciBpcyBuZXZlciBwaWNrZWQgdXAuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQgSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogd2hlbiBkZXBsb3lpbmcgdG8gVmVyY2VsLlxuICAgKlxuICAgKiBTZXQgdG8gYCdsYXRlc3QnYCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIG1vc3QgcmVjZW50IGRlcGxveW1lbnRcbiAgICogZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yIGdpdCBicmFuY2gpLlxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiB3b3JsZHMgd2l0aCBhdG9taWMsIGltbXV0YWJsZSBkZXBsb3ltZW50c1xuICAgKiAoY3VycmVudGx5IFZlcmNlbCkuIEluIG90aGVyIHdvcmxkcyAobG9jYWwgZGV2LCBQb3N0Z3JlcykgdGhlcmUgaXMgbm9cbiAgICogbm90aW9uIG9mIG11bHRpcGxlIGRlcGxveW1lbnRzIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gYCdsYXRlc3QnYCBoYXMgbm9cbiAgICogZWZmZWN0OiBhIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGUgcnVuIHRhcmdldHMgdGhlIGN1cnJlbnQgZGVwbG95bWVudC5cbiAgICpcbiAgICogKipOb3RlOioqIFdoZW4gYGRlcGxveW1lbnRJZGAgaXMgcHJvdmlkZWQsIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGJlY29tZSBgdW5rbm93bmBcbiAgICogc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB0eXBlcyB3aWxsIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgZGVwbG95bWVudElkOiAnbGF0ZXN0JyB8IChzdHJpbmcgJiB7fSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICBkZXBsb3ltZW50SWQ/OiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXJ0T3B0aW9ucyA9XG4gIHwgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuICB8IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSAoXG4gIC4uLmFyZ3M6IFRBcmdzXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1ldGFkYXRhIG9mIGEgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93TWV0YWRhdGEgPSB7IHdvcmtmbG93SWQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24gdG8gc3RhcnQuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3cgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3b3JrZmxvdyBydW4gKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcnVuIElEIGZvciB0aGUgbmV3bHkgc3RhcnRlZCB3b3JrZmxvdyBpbnZvY2F0aW9uLlxuICovXG4vLyBPdmVybG9hZHMgd2l0aCBkZXBsb3ltZW50SWQgLSBhcmdzIGFuZCByZXR1cm4gdHlwZSBiZWNvbWUgdW5rbm93blxuLy8gVXNlcyBnZW5lcmljcyBzbyB0eXBlZCB3b3JrZmxvd3MgYXJlIGFzc2lnbmFibGUgKGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMpLFxuLy8gYnV0IHRoZSByZXR1cm4gdHlwZSBhbmQgYXJncyBhcmUgc3RpbGwgdW5rbm93biBzaW5jZSB0aGUgZGVwbG95ZWQgdmVyc2lvbiBtYXkgZGlmZmVyLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogdW5rbm93bltdLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG4vLyBPdmVybG9hZHMgd2l0aG91dCBkZXBsb3ltZW50SWQgLSBwcmVzZXJ2ZSB0eXBlIGluZmVyZW5jZVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogVEFyZ3MsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnc09yT3B0aW9ucz86IFRBcmdzIHwgU3RhcnRPcHRpb25zLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zXG4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgZmllbGQgaXMgYWRkZWQgYnkgb3VyIGNsaWVudCB0cmFuc2Zvcm1cbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSB3b3JrZmxvdz8ud29ya2Zsb3dJZDtcblxuICAgIGlmICghd29ya2Zsb3dOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGAnc3RhcnQnIHJlY2VpdmVkIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24uIEVuc3VyZSB0aGUgV29ya2Zsb3cgU0RLIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYSAndXNlIHdvcmtmbG93JyBkaXJlY3RpdmUuYCxcbiAgICAgICAgeyBzbHVnOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuTmFtZSA9IGB3b3JrZmxvdy5zdGFydCAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gO1xuICAgIHJldHVybiB0cmFjZShzcGFuTmFtZSwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignc3RhcnQnKSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXJnczogU2VyaWFsaXphYmxlW10gPSBbXTtcbiAgICAgIGxldCBvcHRzOiBTdGFydE9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc09yT3B0aW9ucykpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NPck9wdGlvbnMgYXMgU2VyaWFsaXphYmxlW107XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzT3JPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0gYXJnc09yT3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KGFyZ3MubGVuZ3RoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IG9wdHMud29ybGQgPz8gKGF3YWl0IGdldFdvcmxkTGF6eSgpKTtcbiAgICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2wod29ybGQpO1xuICAgICAgY29uc3QgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgbGV0IGRlcGxveW1lbnRJZCA9IG9wdHMuZGVwbG95bWVudElkID8/IGN1cnJlbnREZXBsb3ltZW50SWQ7XG5cbiAgICAgIC8vIFdoZW4gJ2xhdGVzdCcgaXMgcmVxdWVzdGVkLCByZXNvbHZlIHRoZSBhY3R1YWwgbGF0ZXN0IGRlcGxveW1lbnQgSURcbiAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50J3MgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3JcbiAgICAgIC8vIHNhbWUgZ2l0IGJyYW5jaCBmb3IgcHJldmlldyBkZXBsb3ltZW50cykuXG4gICAgICAvL1xuICAgICAgLy8gUmVzb2x2aW5nICdsYXRlc3QnIG9ubHkgbWVhbnMgc29tZXRoaW5nIGluIHdvcmxkcyB3aXRoIGF0b21pYyxcbiAgICAgIC8vIGltbXV0YWJsZSBkZXBsb3ltZW50cyAoZS5nLiBWZXJjZWwpLCB3aGljaCBpbXBsZW1lbnRcbiAgICAgIC8vIHJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKS4gV29ybGRzIHdpdGhvdXQgdGhhdCBjb25jZXB0IChsb2NhbCBkZXYsXG4gICAgICAvLyBzZWxmLWhvc3RlZCBQb3N0Z3JlcykgaGF2ZSBub3RoaW5nIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gcmF0aGVyIHRoYW5cbiAgICAgIC8vIGZhaWwgYSBydW4gdGhhdCB3b3JrcyBmaW5lIG9uIFZlcmNlbCwgd2Ugd2FybiBhbmQgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gY3VycmVudCBkZXBsb3ltZW50LCBtYWtpbmcgJ2xhdGVzdCcgYW4gZWZmZWN0aXZlIG5vLW9wIHRoZXJlLlxuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgaWYgKHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQpIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2FybiBvbmNlIHBlciBwcm9jZXNzOyBzZWUgbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkIGFib3ZlLlxuICAgICAgICAgIGlmICghbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkKSB7XG4gICAgICAgICAgICBsYXRlc3ROb09wV2FybmluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBcImRlcGxveW1lbnRJZDogJ2xhdGVzdCcgaGFzIG5vIGVmZmVjdCBpbiB0aGlzIHdvcmxkIGFuZCB3YXMgaWdub3JlZC4gXCIgK1xuICAgICAgICAgICAgICAgICdJdCBpcyBvbmx5IHN1cHBvcnRlZCBieSB3b3JsZHMgd2l0aCBhdG9taWMgZGVwbG95bWVudHMsIHN1Y2ggYXMgVmVyY2VsLiAnICtcbiAgICAgICAgICAgICAgICAnVGhlIHJ1biB3aWxsIHRhcmdldCB0aGUgY3VycmVudCBkZXBsb3ltZW50LicsXG4gICAgICAgICAgICAgIHsgY3VycmVudERlcGxveW1lbnRJZCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBjdXJyZW50RGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIGJ5dGUgc3RyZWFtcyBpbiB0aGUgZnJhbWVkIHdpcmUgZm9ybWF0LlxuICAgICAgLy8gRm9yIHNhbWUtZGVwbG95bWVudCBzdGFydHMgKHRoZSBjb21tb24gY2FzZSkgd2Uga25vdyB0aGUgdGFyZ2V0IGlzXG4gICAgICAvLyBydW5uaW5nIHRoaXMgc2FtZSBTREsgdmVyc2lvbiwgc28gZnJhbWluZyBpcyBzYWZlLiBGb3IgY3Jvc3MtXG4gICAgICAvLyBkZXBsb3ltZW50IHN0YXJ0cyAoZXhwbGljaXQgZGVwbG95bWVudElkIG9yICdsYXRlc3QnIHRoYXQgcmVzb2x2ZXNcbiAgICAgIC8vIHRvIGEgZGlmZmVyZW50IGRlcGxveW1lbnQpIHdlIHByb2JlIHRoZSB0YXJnZXQgdmlhIGhlYWx0aENoZWNrIHRvXG4gICAgICAvLyBsZWFybiBpdHMgd29ya2Zsb3ctY29yZSB2ZXJzaW9uLCB0aGVuIGRlcml2ZSB0aGUgY2FwYWJpbGl0eS4gVGhlXG4gICAgICAvLyBwcm9iZSBoYXMgYSB0aWdodCB0aW1lb3V0OiBvbiBtaXNzL2ZhaWx1cmUgd2UgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gbGVnYWN5IHJhdyBieXRlIGZvcm1hdCwgd2hpY2ggaXMgdW5pdmVyc2FsbHkgcmVhZGFibGUuXG4gICAgICAvL1xuICAgICAgLy8gV29ybGRzIHRoYXQgZG9uJ3QgZXhwb3NlIHRoZSBgc3RyZWFtc2AgQVBJIChlLmcuIG1pbmltYWwgdGVzdFxuICAgICAgLy8gbW9ja3MpIGNhbid0IHNlcnZpY2UgaGVhbHRoIGNoZWNrcywgc28gd2Ugc2tpcCB0aGUgcHJvYmUgZm9yIHRoZW0uXG4gICAgICAvLyBHZW5lcmF0ZSBydW5JZCBjbGllbnQtc2lkZSBzbyB3ZSBoYXZlIGl0IGJlZm9yZSBzZXJpYWxpemF0aW9uXG4gICAgICAvLyAocmVxdWlyZWQgZm9yIGZ1dHVyZSBFMkUgZW5jcnlwdGlvbiB3aGVyZSBydW5JZCBpcyBwYXJ0IG9mIHRoZVxuICAgICAgLy8gZW5jcnlwdGlvbiBjb250ZXh0KS4gV2hlbiB0aGUgV29ybGQgcHJvdmlkZXMgYSBgY3JlYXRlUnVuSWQoKWBcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uLCB1c2UgaXQgc28gd29ybGRzIGNhbiBlbWJlZCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpY1xuICAgICAgLy8gbWV0YWRhdGEgKGUuZy4sIHJlZ2lvbikgaW50byB0aGUgSUQsIGZvcndhcmRpbmcgdGhlIGZ1bGwgb3B0aW9uc1xuICAgICAgLy8gYmFnIHNvIHdvcmxkcyBjYW4gcmVhZCB3aGljaGV2ZXIgZmllbGRzIHRoZXkgcmVjb2duaXNlOyBvdGhlcndpc2VcbiAgICAgIC8vIGZhbGwgYmFjayB0byBhIHN0YW5kYXJkIG1vbm90b25pYyBVTElELlxuICAgICAgY29uc3QgcnVuSWQgPSBgd3J1bl8ke1xuICAgICAgICB3b3JsZC5jcmVhdGVSdW5JZFxuICAgICAgICAgID8gd29ybGQuY3JlYXRlUnVuSWQob3B0cyBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pXG4gICAgICAgICAgOiB1bGlkKClcbiAgICAgIH1gO1xuXG4gICAgICBsZXQgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG4gICAgICBsZXQgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbjogYm9vbGVhbjtcbiAgICAgIC8vIFRoZSBjb25zdW1lcidzIGhvb2stcmVzdW1lIHByb3RvY29sIHZlcnNpb24sIHN0YW1wZWQgb250byB0aGUgbmV3XG4gICAgICAvLyBydW4uIEN1cnJlbnQgcHJvZHVjZXJzIHdyaXRlIHRoZSBob29rX3JlY2VpdmVkIGV2ZW50IGR1cmFibHkgYmVmb3JlXG4gICAgICAvLyBwdWJsaXNoaW5nIHRoZSB3YWtlIGFuZCBuZXZlciByZWFkIGl0OyBPTERFUiBwcm9kdWNlcnMgZ2F0ZSB0aGVpclxuICAgICAgLy8gbGF6eSAoaG9va0lucHV0LWNhcnJ5aW5nKSBwYXRoIG9uIHRoZSBkZXBsb3ltZW50IHRoYXQgd2lsbCBhY3R1YWxseVxuICAgICAgLy8gY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJjb3VsZCBub3QgYXR0ZXN0XCIgYW5kXG4gICAgICAvLyBmYWlscyB0aGF0IGdhdGUgY2xvc2VkLlxuICAgICAgbGV0IHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIC8vIFB1YmxpYyBrZXkgb2YgdGhlIHRhcmdldCBydW4sIHdoZW4gdGhlIGNhcGFiaWxpdHkgcHJvYmUgd2FzIGFibGUgdG9cbiAgICAgIC8vIHN1cHBseSBvbmUgKGNyb3NzLWRlcGxveW1lbnQgb25seSkuXG4gICAgICBsZXQgcHJvYmVkUnVuUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSBjdXJyZW50RGVwbG95bWVudElkKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gdHJ1ZTtcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICAgIC8vIFNhbWUgZGVwbG95bWVudDogdGhpcyBwcm9jZXNzIGlzIHRoZSBjb25zdW1lciwgc28gaXRzIG93biBjb25zdGFudFxuICAgICAgICAvLyBpcyBhdXRob3JpdGF0aXZlLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXM/LmdldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gZmFsc2U7XG4gICAgICAgIC8vIE5vIHByb2JlIGNoYW5uZWwgdG8gdGhlIHRhcmdldCwgc28gd2UgY2Fubm90IGF0dGVzdCB0aGUgY29uc3VtZXJcbiAgICAgICAgLy8gaG9ub3JzIGBob29rSW5wdXRgOyBsZWF2ZSB0aGUgbWFya2VyIG9mZiAob2xkZXIgcHJvZHVjZXJzIGZhaWxcbiAgICAgICAgLy8gY2xvc2VkIHRvIHRoZWlyIHNlcXVlbnRpYWwgcGF0aCkuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBc2sgZm9yIHRoaXMgcnVuJ3MgcHVibGljIGtleSB3aGlsZSB3ZSdyZSBoZXJlLiBUaGUgcHJvYmUgYWxyZWFkeVxuICAgICAgICAvLyBibG9ja3MgYHN0YXJ0KClgIG9uIGV2ZXJ5IGNyb3NzLWRlcGxveW1lbnQgY2FsbCwgYW5kIHRoZSByZXNwb25kZXJcbiAgICAgICAgLy8gZXhlY3V0ZXMgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCB3aGVyZSB0aGUga2V5IG1hdGVyaWFsIGlzXG4gICAgICAgIC8vIGxvY2FsLCBzbyB0aGUga2V5IGNvbWVzIGJhY2sgZm9yIGZyZWUgb24gYSByZXNwb25zZSB3ZSBhcmVcbiAgICAgICAgLy8gYWxyZWFkeSBhd2FpdGluZywgYW5kIHdlIGNhbiBza2lwIHRoZSBrZXktbG9va3VwIEFQSSByZXF1ZXN0XG4gICAgICAgIC8vIGVudGlyZWx5LiBCZXN0LWVmZm9ydDogb24gdGltZW91dCBvciBhbiBvbGRlciB0YXJnZXQsIG5vIGtleSBjb21lc1xuICAgICAgICAvLyBiYWNrIGFuZCB3ZSBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgbG9va3VwIGJlbG93LlxuICAgICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGhlYWx0aENoZWNrKHdvcmxkLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRpbWVvdXQ6IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TLFxuICAgICAgICAgIG5hbWVzcGFjZTogb3B0cy5uYW1lc3BhY2UsXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHByb2JlZFJ1blB1YmxpY0tleSA9IHByb2JlPy5lbmNyeXB0aW9uUHVibGljS2V5O1xuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMocHJvYmU/LndvcmtmbG93Q29yZVZlcnNpb24pO1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcztcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVBcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVGhlIHJlc3BvbmRlciBydW5zIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIGl0c1xuICAgICAgICAvLyBgaG9va1Jlc3VtZUlucHV0VmVyc2lvbmAgcmVmbGVjdHMgdGhlIGNvbnN1bWVyLiBVbmRlZmluZWQgb24gYW5cbiAgICAgICAgLy8gb2xkZXIgdGFyZ2V0IG9yIGEgcHJvYmUgdGltZW91dCwgbGVhdmluZyB0aGUgbWFya2VyIG9mZi5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHByb2JlPy5ob29rUmVzdW1lSW5wdXRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgICAvLyBTZXJpYWxpemUgY3VycmVudCB0cmFjZSBjb250ZXh0IHRvIHByb3BhZ2F0ZSBhY3Jvc3MgcXVldWUgYm91bmRhcnlcbiAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpO1xuXG4gICAgICAvLyBEZWZhdWx0IG5ldyBydW5zIHRvIHRoZSBjb25maWd1cmVkIHdvcmxkJ3Mgc3BlYyB2ZXJzaW9uLiBUaGUgd29ybGRcbiAgICAgIC8vIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYWdhaW5zdCB0aGlzIHJ1bnRpbWUncyBzcGVjIHZlcnNpb24uXG4gICAgICBjb25zdCBzcGVjVmVyc2lvbiA9IG9wdHMuc3BlY1ZlcnNpb24gPz8gd29ybGQuc3BlY1ZlcnNpb247XG4gICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oc3BlY1ZlcnNpb24pO1xuICAgICAgY29uc3QgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPSBvcHRzLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlO1xuICAgICAgbGV0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob3B0cy5hdHRyaWJ1dGVzICYmIE9iamVjdC5rZXlzKG9wdHMuYXR0cmlidXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3BlY1ZlcnNpb24gPCBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICdJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZXMgcmVxdWlyZSBhIFdvcmxkIHRoYXQgc3VwcG9ydHMgc3BlYyB2ZXJzaW9uIDQgb3IgbGF0ZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXNgIHRyZWF0cyBgdW5kZWZpbmVkYCBhcyBcInJlbW92ZSB0aGlzXG4gICAgICAgIC8vIGtleVwiLCB3aGljaCBpcyBtZWFuaW5nbGVzcyBhdCBjcmVhdGlvbiB0aW1lLiBSZWplY3QgaXQgdXAgZnJvbnRcbiAgICAgICAgLy8gc28gSlMgY2FsbGVycyBnZXQgYSBjbGVhciBlcnJvciBpbnN0ZWFkIG9mIGEgZG93bnN0cmVhbSBzY2hlbWFcbiAgICAgICAgLy8gZmFpbHVyZSAodGhlIHR5cGVzIGFscmVhZHkgZm9yYmlkIG5vbi1zdHJpbmcgdmFsdWVzKS5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy5hdHRyaWJ1dGVzKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IG11c3QgYmUgYSBzdHJpbmcgdmFsdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMob3B0cy5hdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBhdHRyaWJ1dGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIGNoYW5nZXMubWFwKCh7IGtleSwgdmFsdWUgfSkgPT4gW2tleSwgdmFsdWUgYXMgc3RyaW5nXSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gYHJldGVudGlvbmAgaXMgdGhlIHR5cGVkIHNwZWxsaW5nIG9mIHRoZSByZXNlcnZlZCBgJHJldGVudGlvbmBcbiAgICAgIC8vIGF0dHJpYnV0ZSwgd2hvc2UgdmFsdWUgaXMgYSBkdXJhdGlvbiB3cml0dGVuIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLlxuICAgICAgLy8gYCdkZWZhdWx0J2AgbWVhbnMgXCJsZXQgdGhlIFdvcmxkIGRlY2lkZVwiLCB3aGljaCBpcyBhbHJlYWR5IHdoYXQgYW5cbiAgICAgIC8vIGFic2VudCBhdHRyaWJ1dGUgbWVhbnMsIHNvIGl0IGlzIG5vdCB3cml0dGVuOiB0aGF0IGtlZXBzXG4gICAgICAvLyBgJ2RlZmF1bHQnYCBleGFjdGx5IGVxdWl2YWxlbnQgdG8gb21pdHRpbmcgdGhlIG9wdGlvbiBhbmQgc3BlbmRzXG4gICAgICAvLyBub25lIG9mIHRoZSBwZXItcnVuIGF0dHJpYnV0ZSBidWRnZXQuXG4gICAgICBsZXQgcmV0ZW50aW9uQXR0cmlidXRlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBvcHRzLmV4cGVyaW1lbnRhbF9yZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBvcHRzLmV4cGVyaW1lbnRhbF9yZXRlbnRpb24gIT09ICdkZWZhdWx0J1xuICAgICAgKSB7XG4gICAgICAgIC8vIFRoZSB0eXBlcyBhbGxvdyBvbmx5IGAwYCwgYnV0IGFuIHVudHlwZWQgSlMgY2FsbGVyIGNhbiBzdGlsbCBnZXRcbiAgICAgICAgLy8gaGVyZSB3aXRoIHNvbWUgb3RoZXIgZHVyYXRpb24g4oCUIGFuZCB0aGVyZSBpcyBubyB1bml0IHRvIGludGVycHJldFxuICAgICAgICAvLyBpdCBpbiB5ZXQsIHNvIG5vIFdvcmxkIGNhbiBob25vciBpdC4gUmVqZWN0IGl0IHJhdGhlciB0aGFuIHNlZWQgYVxuICAgICAgICAvLyB2YWx1ZSB0aGF0IHdvdWxkIHNpbGVudGx5IHJlc29sdmUgdG8gdGhlIFdvcmxkJ3MgZGVmYXVsdC5cbiAgICAgICAgaWYgKG9wdHMuZXhwZXJpbWVudGFsX3JldGVudGlvbiAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBzdGFydCh7IGV4cGVyaW1lbnRhbF9yZXRlbnRpb24gfSkgbXVzdCBiZSAwIG9yICdkZWZhdWx0JzsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgb3B0cy5leHBlcmltZW50YWxfcmV0ZW50aW9uXG4gICAgICAgICAgICApfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY1ZlcnNpb24gPCBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICdzdGFydCh7IGV4cGVyaW1lbnRhbF9yZXRlbnRpb24gfSkgcmVxdWlyZXMgYSBXb3JsZCB0aGF0IHN1cHBvcnRzIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldGVudGlvbkF0dHJpYnV0ZSA9IHtcbiAgICAgICAgICBbUkVURU5USU9OX0FUVFJJQlVURV06IFJFVEVOVElPTl9aRVJPX0FUVFJJQlVURV9WQUxVRSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3Jvc3MtcnVuIGxpbmVhZ2U6IHRoZSByZXNlcnZlZCBrZXlzIHJpZGUgb24gdGhlIHJ1bidzIGV4aXN0aW5nXG4gICAgICAvLyBhdHRyaWJ1dGVzLCBzbyB0aGV5IGFkZCBubyBleHRyYSB3cml0ZS4gQ2FsbGVyIGF0dHJpYnV0ZXMgYXJlIHNwcmVhZFxuICAgICAgLy8gbGFzdCwgc28gYSBjYWxsZXIgd2l0aCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyBjYW4gZGVsaWJlcmF0ZWx5XG4gICAgICAvLyByZS1wYXJlbnQuIGByZXRlbnRpb25gIGlzIHNwcmVhZCBhZnRlciB0aG9zZTogaXQgaXMgdGhlIHN1cHBvcnRlZFxuICAgICAgLy8gc3BlbGxpbmcsIHNvIGl0IHdpbnMgb3ZlciBhIGhhbmQtd3JpdHRlbiBgJHJldGVudGlvbmAgYXR0cmlidXRlLlxuICAgICAgY29uc3QgbGluZWFnZSA9XG4gICAgICAgIHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTXG4gICAgICAgICAgPyByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcnVuQXR0cmlidXRlcyA9XG4gICAgICAgIGxpbmVhZ2UgfHwgcmV0ZW50aW9uQXR0cmlidXRlXG4gICAgICAgICAgPyB7IC4uLmxpbmVhZ2UsIC4uLmF0dHJpYnV0ZXMsIC4uLnJldGVudGlvbkF0dHJpYnV0ZSB9XG4gICAgICAgICAgOiBhdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBTaGFyZWQgYnkgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50IGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlIGlucHV0LlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IHJ1bkF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIHx8XG4gICAgICAgICAgICBsaW5lYWdlICE9IG51bGwgfHxcbiAgICAgICAgICAgIHJldGVudGlvbkF0dHJpYnV0ZSAhPSBudWxsXG4gICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSBhcyBjb25zdCB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcblxuICAgICAgLy8gYHJlcGxheWVkRnJvbVJ1bklkYCBpcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBzb3VyY2UgcnVuOyByZWplY3QgYW55dGhpbmdcbiAgICAgIC8vIHRoYXQgaXNuJ3QgYSByZWFsIHJ1biBJRCBzbyB0aGUgbGluZWFnZSBsaW5rIGNhbid0IHBvaW50IGF0IGdhcmJhZ2UuXG4gICAgICBpZiAoXG4gICAgICAgIG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhd29ya2Zsb3dSdW5JZFNjaGVtYS5zYWZlUGFyc2Uob3B0cy5yZXBsYXllZEZyb21SdW5JZCkuc3VjY2Vzc1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICBgcmVwbGF5ZWRGcm9tUnVuSWQgbXVzdCBiZSBhIHJ1biBJRCAod3J1bl88dWxpZD4pOyByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgU3RyaW5nKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnNsaWNlKDAsIDY0KVxuICAgICAgICAgICl9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICAvLyBSZXNvbHZlIGhvdyB0byBlbmNyeXB0IHRoZSB3b3JrZmxvdyBhcmd1bWVudHMuXG4gICAgICAvL1xuICAgICAgLy8gUHJlZmVycmVkOiB0aGUgY2FwYWJpbGl0eSBwcm9iZSBhbHJlYWR5IHRvbGQgdXMgdGhpcyBydW4ncyBwdWJsaWNcbiAgICAgIC8vIGtleSwgc28gc2VhbCB0byBpdC4gVGhhdCBza2lwcyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdoaWNoIGZvciBhXG4gICAgICAvLyBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IGlzIGEgYHJ1bi1rZXlgIEFQSSByZXF1ZXN0LCB0aGUgbGFzdCBvbmUgbGVmdFxuICAgICAgLy8gb24gdGhpcyBwYXRoLiBJdCBpcyBhbHNvIGEgcHJpdmlsZWdlIHJlZHVjdGlvbjogdGhlIGNhbGxlciBlbmRzIHVwXG4gICAgICAvLyBhYmxlIHRvIHdyaXRlIHRoZSBhcmd1bWVudHMgYnV0IG5vdCByZWFkIHRoZW0gYmFjaywgd2hlcmVhcyBmZXRjaGluZ1xuICAgICAgLy8gdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGZ1bGwgcmVhZCBhY2Nlc3MgdG8gYSBydW4gaXQgbWVyZWx5XG4gICAgICAvLyBsYXVuY2hlZC5cbiAgICAgIGNvbnN0IHByb2JlZFB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShwcm9iZWRSdW5QdWJsaWNLZXkpO1xuXG4gICAgICBsZXQgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChwcm9iZWRQdWJsaWNLZXkpIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHNlYWxUbyhwcm9iZWRQdWJsaWNLZXkpO1xuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcHJvYmVkUnVuUHVibGljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgc28gdGhhdCBjcm9zcy1ydW4gd3JpdGVycyAoYVxuICAgICAgICAvLyBob29rIHJlc3VtcHRpb24gZnJvbSBhbm90aGVyIGRlcGxveW1lbnQsIGEgc2libGluZyB3cml0aW5nIGludG8gYVxuICAgICAgICAvLyBmb3J3YXJkZWQgc3RyZWFtKSBjYW4gc2VhbCBwYXlsb2FkcyAqdG8qIHRoaXMgcnVuIHdpdGhvdXQgaG9sZGluZ1xuICAgICAgICAvLyBpdHMgc3ltbWV0cmljIGtleS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUHJlc2VuY2Ugb2YgdGhpcyBmaWVsZCBpcyB0aGUgd3JpdGVyLXNpZGUgZ2F0ZSBmb3Igc2VhbGVkXG4gICAgICAgIC8vIGVudmVsb3Blcywgc28gaXQgbXVzdCBvbmx5IGJlIHN0YW1wZWQgd2hlbiB0aGlzIHJ1bnRpbWUgY291bGRcbiAgICAgICAgLy8gaXRzZWxmIG9wZW4gb25lLiBUaGF0IGhvbGRzIGJ5IGNvbnN0cnVjdGlvbiBoZXJlOiBkZXJpdmF0aW9uIGFuZFxuICAgICAgICAvLyBgZW5jcGAgZGlzcGF0Y2ggbGl2ZSBpbiB0aGUgc2FtZSBwYWNrYWdlLCBzbyBhbnkgY29yZSB0aGF0IGNhblxuICAgICAgICAvLyBzdGFtcCBjYW4gYWxzbyBvcGVuLiBSdW5zIGFyZSBwaW5uZWQgdG8gdGhlaXIgY3JlYXRpbmcgZGVwbG95bWVudCxcbiAgICAgICAgLy8gc28gdGhlIGNhcGFiaWxpdHkgdGhpcyBhdHRlc3RzIHRvIGlzIHN0aWxsIGFjY3VyYXRlIGF0IHJlc3VtZSB0aW1lLlxuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcmF3S2V5XG4gICAgICAgICAgPyBieXRlc1RvQmFzZTY0KChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHJ1biB2aWEgcnVuX2NyZWF0ZWQgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgLy8gUGFzcyBjbGllbnQtZ2VuZXJhdGVkIHJ1bklkIC0gc2VydmVyIHdpbGwgYWNjZXB0IGFuZCB1c2UgaXRcbiAgICAgIC8vIENvbXByZXNzIHdvcmtmbG93IGFyZ3VtZW50cyBvbmx5IHdoZW4gdGhlIHJ1biBpdHNlbGYgaXMgbWFya2VkIGFzXG4gICAgICAvLyBwb3NzaWJseSBjb250YWluaW5nIGNvbXByZXNzZWQgcGF5bG9hZHMgKHNwZWNWZXJzaW9uID49IDUpIEFORCB0aGVcbiAgICAgIC8vIHRhcmdldCBkZXBsb3ltZW50IGNhbiBkZWNvZGUgdGhlbSAoc2FtZS1kZXBsb3ltZW50LCBvciBwcm9iZWRcbiAgICAgIC8vIGNhcGFiaWxpdHkgZm9yIGNyb3NzLWRlcGxveW1lbnQgc3RhcnRzKS5cbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiAmJlxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIGNvbXByZXNzaW9uXG4gICAgICApO1xuXG4gICAgICAvLyBUaGUgZW52aXJvbm1lbnQgdGhpcyBjYWxsZXIncyBvd24gYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBhdHRyaWJ1dGVkXG4gICAgICAvLyB0by4gU3RhbXBlZCBpbnRvIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYHJ1bklucHV0YCAoTk9UIGludG9cbiAgICAgIC8vIGBydW5fY3JlYXRlZGAsIHdob3NlIHRlbmFudCB0aGUgYmFja2VuZCBhbHJlYWR5IGtub3dzKSBzbyB0aGVcbiAgICAgIC8vIGRlcGxveW1lbnQgdGhhdCBjb25zdW1lcyB0aGUgbWVzc2FnZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBydW4gaXQgaXNcbiAgICAgIC8vIGJlaW5nIGFza2VkIHRvIHJlc2lsaWVudGx5IGNyZWF0ZSB3YXMgY3JlYXRlZCBhZ2FpbnN0IGEgZGlmZmVyZW50XG4gICAgICAvLyBlbnZpcm9ubWVudCB0aGFuIGl0cyBvd24uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHR3byB3cml0ZXMgYmVsb3cgZ28gdG8gZGlmZmVyZW50IHBsYWNlcyBieSBkaWZmZXJlbnQgcm91dGVzOlxuICAgICAgLy8gYGV2ZW50cy5jcmVhdGVgIGlzIGF0dHJpYnV0ZWQgdG8gVEhJUyBjbGllbnQncyB0ZW5hbnQsIHdoaWxlIHRoZSBxdWV1ZVxuICAgICAgLy8gbWVzc2FnZSBpcyBwaW5uZWQgdG8gYSBkZXBsb3ltZW50SWQuIFdoZW4gdGhvc2UgZGlzYWdyZWUgKGFcbiAgICAgIC8vIHByb2R1Y3Rpb24tY3JlZGVudGlhbGVkIGNsaWVudCBwaW5uaW5nIGEgcHJldmlldyBkZXBsb3ltZW50KSB0aGVcbiAgICAgIC8vIHByZXZpZXcgY29uc3VtZXIgY2FuJ3QgZmluZCB0aGUgcnVuIGluIGl0cyBvd24gdGVuYW50LCBmYWxscyBiYWNrIHRvXG4gICAgICAvLyByZXNpbGllbnQgc3RhcnQsIGFuZCByZS1jcmVhdGVzIGl0OiBvbmUgY2xpZW50LW1pbnRlZCBydW4gaWQsIHR3b1xuICAgICAgLy8gZW52aXJvbm1lbnRzLCB0aGUgcHJvZHVjdGlvbiBjb3B5IHBlbmRpbmcgZm9yZXZlciBhbmQgdGhlIHByZXZpZXcgY29weVxuICAgICAgLy8gZXhlY3V0aW5nLiBXb3JsZHMgd2l0aCBhIHNpbmdsZSB0ZW5hbnQgcmV0dXJuIHVuZGVmaW5lZCBhbmQgdGhlIGZpZWxkXG4gICAgICAvLyBpcyBhYnNlbnQuXG4gICAgICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG5cbiAgICAgIC8vIElmIFdPUktGTE9XX1ZNIGlzIHNldCBvbiB0aGUgY2xpZW50IHN0YXJ0aW5nIHRoZSBydW4sIHN0YW1wIHRoZVxuICAgICAgLy8gZW5naW5lIGNob2ljZSBpbnRvIHRoZSBydW4ncyBleGVjdXRpb25Db250ZXh0IHNvIHRoZSBydW4ga2VlcHNcbiAgICAgIC8vIGV4ZWN1dGluZyBvbiB0aGUgZW5naW5lIGl0IHN0YXJ0ZWQgb24gKHRoZSBzYW1lIGRlcGxveW1lbnQgY2FuXG4gICAgICAvLyBzZXJ2ZSBib3RoIFZNIGVuZ2luZXMpLiBVbmtub3duIHZhbHVlcyB0aHJvdzsgc2VlXG4gICAgICAvLyBnZXRXb3JrZmxvd1ZtRnJvbUVudigpLlxuICAgICAgY29uc3Qgd29ya2Zsb3dWbSA9IGdldFdvcmtmbG93Vm1Gcm9tRW52KCk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgIC8vIEF0dGVzdCB0aGF0IHRoZSAqY29uc3VtZXIqIGRlcGxveW1lbnQncyBydW50aW1lIHJlLWVuc3VyZXMgYVxuICAgICAgICAvLyBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBhIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YCBvbiByZXBsYXkuXG4gICAgICAgIC8vIEFuIE9MREVSIHByb2R1Y2VyIHJlc3VtaW5nIHRoaXMgcnVuIHJlYWRzIHRoZSBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gdGhlIGhvb2sncyByZXN1bWVDb250ZXh0IGJ5IHRoZSBzZXJ2ZXIpIHRvIGRlY2lkZSB3aGV0aGVyIGl0cyBsYXp5XG4gICAgICAgIC8vIGZhc3QgcGF0aCBpcyBzYWZlLiBGb3IgYSBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IHRoZSBjb25zdW1lciBpcyB0aGVcbiAgICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHdlIHN0YW1wIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIGNhcnJpZWQgYmFjayBvblxuICAgICAgICAvLyB0aGUgaGVhbHRoLWNoZWNrIHByb2JlLCBuZXZlciB0aGUgY2FsbGVyJ3MuIE9taXR0ZWQgd2hlbiB3ZSBjb3VsZFxuICAgICAgICAvLyBub3QgYXR0ZXN0IHRoZSB0YXJnZXQgKG9sZGVyIHRhcmdldCwgdGltZW91dCwgb3Igbm8gcHJvYmUgY2hhbm5lbCksXG4gICAgICAgIC8vIHdoaWNoIGZhaWxzIHRoZSByZXN1bWUgZ2F0ZSBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgLi4uKHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtmbG93Vm0gPyB7IHdvcmtmbG93Vm0gfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWRcbiAgICAgICAgICA/IHsgcmVwbGF5ZWRGcm9tUnVuSWQ6IG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgb3B0cy5uYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oY3JlYXRvckVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHsgZW52aXJvbm1lbnQ6IGNyZWF0b3JFbnZpcm9ubWVudCB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsOiB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlOiB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
@@ -20,6 +20,11 @@ export interface SuspensionHandlerParams {
20
20
  * seeded sequence, so re-committing it against a corrected log would persist
21
21
  * an event no correct replay produces. The caller restarts the replay
22
22
  * instead.
23
+ *
24
+ * Extended in place by what those writes report back — the events on slots
25
+ * they skipped over, and (on the hook create) the inline delta since its
26
+ * cursor. Whether the log is complete afterwards is answered by
27
+ * {@link SuspensionHandlerResult.eventLogCarriedForward}.
23
28
  */
24
29
  eventLog?: LoadedEventLog;
25
30
  /**
@@ -208,10 +213,58 @@ export interface SuspensionHandlerResult {
208
213
  seconds: number;
209
214
  correlationId: string;
210
215
  };
211
- /** Whether a hook conflict was detected (should re-invoke immediately) */
216
+ /**
217
+ * Whether a hook create committed a `hook_conflict` — the token was already
218
+ * claimed, so this run's hook was never created and the workflow must
219
+ * observe the conflict before anything else this suspension scheduled runs.
220
+ * The caller answers it by advancing the workflow over the committed event.
221
+ */
212
222
  hasHookConflict: boolean;
213
223
  /** Whether a `hook.getConflict()` awaiter needs the workflow to continue immediately */
214
224
  hasAwaitedHookCreation: boolean;
225
+ /**
226
+ * Correlation ids of the hooks this suspension committed a `hook_created`
227
+ * for while a `hook.getConflict()` awaiter was waiting on it — the events
228
+ * that resolve those awaiters on the next pass. Empty exactly when
229
+ * {@link hasAwaitedHookCreation} is false.
230
+ *
231
+ * Reported by id, not just counted, so a caller that continues in this
232
+ * process can tell a continuation that got somewhere from one that is
233
+ * repeating: a workflow may create one awaited hook after another, and each
234
+ * new id is a pass that made progress, while the same id coming back means
235
+ * the pass ran over a log that still did not hold its event and continuing
236
+ * again cannot change that.
237
+ */
238
+ awaitedHookCorrelationIds: string[];
239
+ /**
240
+ * Correlation ids of the hooks whose create committed a `hook_conflict`.
241
+ * Empty exactly when {@link hasHookConflict} is false.
242
+ *
243
+ * By id for the same reason as {@link awaitedHookCorrelationIds}, and
244
+ * against the same hazard: a conflict is resolved by the `hook_conflict`
245
+ * this suspension committed, and until the workflow observes it the hook
246
+ * stays in the invocations queue and the next pass writes the create again.
247
+ * A fresh id is progress; the same id coming back is a pass that ran over a
248
+ * log which still did not hold the event, so continuing again cannot change
249
+ * that.
250
+ */
251
+ hookConflictCorrelationIds: string[];
252
+ /**
253
+ * Whether the caller's `eventLog` now holds every event this suspension
254
+ * committed, so a caller that continues in this process can replay — or
255
+ * resume a retained VM — straight off it with no read.
256
+ *
257
+ * True only when the hook create's inline delta came back complete and was
258
+ * folded in (see `hookDeltaCursor` below), and nothing else in this
259
+ * suspension wrote an event. False whenever a read is needed first: no
260
+ * delta was asked for or returned, it was truncated, or a step / wait /
261
+ * attribute / abort write landed above it and is therefore not in it.
262
+ *
263
+ * Indifferent to which event the create committed: the delta is the slice
264
+ * of the log after the caller's cursor either way, so it carries a
265
+ * `hook_conflict` exactly as it carries a `hook_created`.
266
+ */
267
+ eventLogCarriedForward: boolean;
215
268
  /** Whether native workflow attribute events were written for replay. */
216
269
  hasAttributeEvents: boolean;
217
270
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"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"}