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

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 (49) hide show
  1. package/dist/capabilities.d.ts +6 -5
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +14 -12
  4. package/dist/events-consumer.d.ts +29 -6
  5. package/dist/events-consumer.d.ts.map +1 -1
  6. package/dist/events-consumer.js +66 -11
  7. package/dist/private.d.ts +11 -7
  8. package/dist/private.d.ts.map +1 -1
  9. package/dist/private.js +57 -29
  10. package/dist/replay-payload-cache.d.ts +13 -17
  11. package/dist/replay-payload-cache.d.ts.map +1 -1
  12. package/dist/replay-payload-cache.js +55 -57
  13. package/dist/runtime/constants.d.ts +3 -3
  14. package/dist/runtime/constants.d.ts.map +1 -1
  15. package/dist/runtime/constants.js +4 -4
  16. package/dist/runtime/helpers.d.ts +14 -33
  17. package/dist/runtime/helpers.d.ts.map +1 -1
  18. package/dist/runtime/helpers.js +18 -43
  19. package/dist/runtime/resume-hook.d.ts +19 -26
  20. package/dist/runtime/resume-hook.d.ts.map +1 -1
  21. package/dist/runtime/resume-hook.js +201 -255
  22. package/dist/runtime/resume-latency.d.ts +8 -11
  23. package/dist/runtime/resume-latency.d.ts.map +1 -1
  24. package/dist/runtime/resume-latency.js +1 -1
  25. package/dist/runtime/start.js +12 -10
  26. package/dist/runtime/vm-mode.d.ts +1 -1
  27. package/dist/runtime/vm-mode.d.ts.map +1 -1
  28. package/dist/runtime/vm-mode.js +1 -1
  29. package/dist/runtime.d.ts.map +1 -1
  30. package/dist/runtime.js +146 -60
  31. package/dist/serialization.d.ts +3 -3
  32. package/dist/serialization.d.ts.map +1 -1
  33. package/dist/serialization.js +22 -22
  34. package/dist/telemetry/semantic-conventions.d.ts +41 -7
  35. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  36. package/dist/telemetry/semantic-conventions.js +30 -6
  37. package/dist/telemetry.d.ts +12 -0
  38. package/dist/telemetry.d.ts.map +1 -1
  39. package/dist/telemetry.js +62 -2
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +2 -2
  42. package/dist/vm/script-cache.d.ts +9 -11
  43. package/dist/vm/script-cache.d.ts.map +1 -1
  44. package/dist/vm/script-cache.js +25 -40
  45. package/dist/workflow.d.ts +16 -0
  46. package/dist/workflow.d.ts.map +1 -1
  47. package/dist/workflow.js +67 -22
  48. package/docs/foundations/errors-and-retries.mdx +1 -1
  49. package/package.json +6 -6
@@ -1,17 +1,10 @@
1
1
  import { prepareReplayPayload, } from './serialization.js';
2
- const MAX_MEMOIZED_PRIMITIVE_LENGTH = 4096;
3
2
  function isMemoizablePrimitive(value) {
4
3
  if (value === null)
5
4
  return true;
6
5
  const type = typeof value;
7
6
  if (type === 'object' || type === 'function')
8
7
  return false;
9
- if (type === 'string') {
10
- return value.length <= MAX_MEMOIZED_PRIMITIVE_LENGTH;
11
- }
12
- if (type === 'bigint') {
13
- return value.toString().length <= MAX_MEMOIZED_PRIMITIVE_LENGTH;
14
- }
15
8
  return true;
16
9
  }
17
10
  /**
@@ -22,19 +15,26 @@ function isMemoizablePrimitive(value) {
22
15
  * those replays. Deserialization still runs against each VM's globals so every
23
16
  * replay receives fresh object graphs and correctly revived Workflow objects.
24
17
  *
25
- * Successful prepared plaintext remains resident for the invocation lifetime.
26
- * Its memory cost is the sum of decrypted and decompressed payload sizes, but
27
- * it never crosses workflow runs or queue deliveries.
18
+ * Successful prepared plaintext and memoized primitive step results remain
19
+ * resident for the invocation lifetime. Their memory never crosses workflow
20
+ * runs or queue deliveries.
28
21
  */
29
22
  export class ReplayPayloadCache {
30
- encryptionKey;
31
23
  preparer;
32
24
  preparedPayloads = new Map();
33
25
  primitiveStepResults = new Map();
26
+ encryptionKey;
34
27
  nextUnscannedEventIndex = 0;
35
28
  constructor(encryptionKey, preparer = prepareReplayPayload) {
36
- this.encryptionKey = encryptionKey;
37
29
  this.preparer = preparer;
30
+ this.encryptionKey = Promise.resolve(encryptionKey);
31
+ }
32
+ /** Start preparing an event payload as soon as its frame is decoded. */
33
+ prepareEvent(event) {
34
+ const preparation = this.prepareEventIfMissing(event);
35
+ // Streaming preparation is speculative. Its ordered consumer observes the
36
+ // original rejection and makes that cache entry retryable.
37
+ void preparation?.catch(() => { });
38
38
  }
39
39
  /**
40
40
  * Start every missing binary preparation before workflow execution. Failures
@@ -43,55 +43,21 @@ export class ReplayPayloadCache {
43
43
  */
44
44
  async prewarm(workflowRun, events) {
45
45
  const preparations = [];
46
- const start = (cacheKey, value) => {
47
- // Legacy flattened values may be mutated by devalue's unflatten and are
48
- // therefore prepared only by their eventual consumer, never cached.
49
- if (!(value instanceof Uint8Array))
50
- return;
51
- // Each replay scans the full event log, so awaiting cached promises here
52
- // would add O(N^2) promise reactions over an N-step invocation. Only wait
53
- // for preparations first discovered by this prewarm pass.
54
- if (this.preparedPayloads.has(cacheKey))
55
- return;
56
- preparations.push(this.ensurePreparation(cacheKey, value));
57
- };
58
- start(this.workflowInputKey(workflowRun.runId), workflowRun.input);
59
- // This cache is scoped to one invocation. Incremental loads and write
60
- // response deltas only ever append, so the scanned length locates the
61
- // events added since the previous replay. A reload that can insert events
62
- // BELOW that length (a stale-snapshot restart replacing the log with a
63
- // corrected one) must call `resetScan()` first, or the inserted events are
64
- // never scanned. Prepared entries stay valid across that: they are keyed by
65
- // event id, not by position.
46
+ const workflowInput = this.startPreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
47
+ if (workflowInput)
48
+ preparations.push(workflowInput);
66
49
  for (let index = this.nextUnscannedEventIndex; index < events.length; index++) {
67
50
  const event = events[index];
68
- switch (event.eventType) {
69
- case 'step_completed':
70
- start(this.eventPayloadKey(event.eventId, 'result'), event.eventData?.result);
71
- break;
72
- case 'step_failed':
73
- start(this.eventPayloadKey(event.eventId, 'error'), event.eventData?.error);
74
- break;
75
- case 'hook_received':
76
- start(this.eventPayloadKey(event.eventId, 'payload'), event.eventData?.payload);
77
- break;
78
- }
51
+ const preparation = this.prepareEventIfMissing(event);
52
+ if (preparation)
53
+ preparations.push(preparation);
79
54
  }
80
55
  this.nextUnscannedEventIndex = events.length;
81
56
  // Prewarming is speculative and must not fail replay before the matching
82
57
  // event is consumed. allSettled also attaches rejection handlers eagerly.
83
58
  await Promise.allSettled(preparations);
84
59
  }
85
- /**
86
- * Forget how much of the event log has been scanned, so the next
87
- * {@link prewarm} walks it from the start again.
88
- *
89
- * Required before a replay whose event log was reloaded rather than extended:
90
- * a corrected log inserts the events the previous load was missing, which
91
- * shifts every later position, so a positional resume would skip exactly the
92
- * events the reload was for. Already-prepared payloads are kept: they are
93
- * keyed by event id, so re-scanning re-observes them for free.
94
- */
60
+ /** Rescan the next event log after an authoritative replacement. */
95
61
  resetScan() {
96
62
  this.nextUnscannedEventIndex = 0;
97
63
  }
@@ -109,8 +75,8 @@ export class ReplayPayloadCache {
109
75
  }
110
76
  /**
111
77
  * Reuse final step values only when sharing them across VMs is unobservable.
112
- * Objects and large strings/bigints always run `hydrate` again, producing a
113
- * fresh VM-specific value from the separately cached prepared payload.
78
+ * Objects always run `hydrate` again to produce a fresh VM-specific value;
79
+ * every primitive is safe to reuse directly.
114
80
  */
115
81
  async getStepResult(eventId, hydrate) {
116
82
  if (this.primitiveStepResults.has(eventId)) {
@@ -148,7 +114,39 @@ export class ReplayPayloadCache {
148
114
  }
149
115
  /** Normalize synchronous and asynchronous preparers to one promise contract. */
150
116
  async runPreparation(value) {
151
- return this.preparer(value, this.encryptionKey);
117
+ return this.preparer(value, await this.encryptionKey);
118
+ }
119
+ /** Start one event's binary payload unless another path already did. */
120
+ prepareEventIfMissing(event) {
121
+ let field;
122
+ let value;
123
+ switch (event.eventType) {
124
+ case 'run_created':
125
+ return this.startPreparation(this.workflowInputKey(event.runId), event.eventData.input);
126
+ case 'run_started':
127
+ return this.startPreparation(this.workflowInputKey(event.runId), event.eventData?.input);
128
+ case 'step_completed':
129
+ field = 'result';
130
+ value = event.eventData?.result;
131
+ break;
132
+ case 'step_failed':
133
+ field = 'error';
134
+ value = event.eventData?.error;
135
+ break;
136
+ case 'hook_received':
137
+ field = 'payload';
138
+ value = event.eventData?.payload;
139
+ break;
140
+ default:
141
+ return undefined;
142
+ }
143
+ return this.startPreparation(this.eventPayloadKey(event.eventId, field), value);
144
+ }
145
+ startPreparation(cacheKey, value) {
146
+ if (!(value instanceof Uint8Array) || this.preparedPayloads.has(cacheKey)) {
147
+ return undefined;
148
+ }
149
+ return this.ensurePreparation(cacheKey, value);
152
150
  }
153
151
  workflowInputKey(runId) {
154
152
  return `run:${runId}:input`;
@@ -157,4 +155,4 @@ export class ReplayPayloadCache {
157
155
  return `event:${eventId}:${field}`;
158
156
  }
159
157
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LXBheWxvYWQtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LXBheWxvYWQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0FBRzNDLFNBQVMscUJBQXFCLENBQUMsS0FBYztJQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUM7SUFDMUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEIsT0FBUSxLQUFnQixDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEIsT0FBUSxLQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBU1Y7SUFDQTtJQVRGLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUd4QyxDQUFDO0lBQ2Esb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDM0QsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLFlBQ21CLGFBQXFDLEVBQ3JDLFdBQWtDLG9CQUFvQjtRQUR0RCxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBOEM7SUFDdEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FB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QyxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxnRkFBZ0Y7SUFDeEUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFjO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQWUsRUFBRSxLQUF5QjtRQUNoRSxPQUFPLFNBQVMsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBwcmVwYXJlUmVwbGF5UGF5bG9hZCxcbiAgdHlwZSBSZXBsYXlQYXlsb2FkUHJlcGFyZXIsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbmNvbnN0IE1BWF9NRU1PSVpFRF9QUklNSVRJVkVfTEVOR1RIID0gNDA5NjtcbnR5cGUgUmVwbGF5UGF5bG9hZEZpZWxkID0gJ3Jlc3VsdCcgfCAnZXJyb3InIHwgJ3BheWxvYWQnO1xuXG5mdW5jdGlvbiBpc01lbW9pemFibGVQcmltaXRpdmUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA8PSBNQVhfTUVNT0laRURfUFJJTUlUSVZFX0xFTkdUSDtcbiAgfVxuICBpZiAodHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIGJpZ2ludCkudG9TdHJpbmcoKS5sZW5ndGggPD0gTUFYX01FTU9JWkVEX1BSSU1JVElWRV9MRU5HVEg7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgZm9yIHJlcGxheSBwYXlsb2FkIGh5ZHJhdGlvbi5cbiAqXG4gKiBBIHdvcmtmbG93IGludm9jYXRpb24gbWF5IHJlcGxheSB0aGUgc2FtZSBldmVudCBsb2cgdGhyb3VnaCBzZXZlcmFsIGZyZXNoXG4gKiBWTXMuIFRoaXMgY2FjaGUga2VlcHMgdGhlIFZNLWluZGVwZW5kZW50IGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHQgYWNyb3NzXG4gKiB0aG9zZSByZXBsYXlzLiBEZXNlcmlhbGl6YXRpb24gc3RpbGwgcnVucyBhZ2FpbnN0IGVhY2ggVk0ncyBnbG9iYWxzIHNvIGV2ZXJ5XG4gKiByZXBsYXkgcmVjZWl2ZXMgZnJlc2ggb2JqZWN0IGdyYXBocyBhbmQgY29ycmVjdGx5IHJldml2ZWQgV29ya2Zsb3cgb2JqZWN0cy5cbiAqXG4gKiBTdWNjZXNzZnVsIHByZXBhcmVkIHBsYWludGV4dCByZW1haW5zIHJlc2lkZW50IGZvciB0aGUgaW52b2NhdGlvbiBsaWZldGltZS5cbiAqIEl0cyBtZW1vcnkgY29zdCBpcyB0aGUgc3VtIG9mIGRlY3J5cHRlZCBhbmQgZGVjb21wcmVzc2VkIHBheWxvYWQgc2l6ZXMsIGJ1dFxuICogaXQgbmV2ZXIgY3Jvc3NlcyB3b3JrZmxvdyBydW5zIG9yIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBsYXlQYXlsb2FkQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXBhcmVkUGF5bG9hZHMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD5cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW1pdGl2ZVN0ZXBSZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIHByaXZhdGUgbmV4dFVuc2Nhbm5lZEV2ZW50SW5kZXggPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByZXBhcmVyOiBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSBwcmVwYXJlUmVwbGF5UGF5bG9hZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGV2ZXJ5IG1pc3NpbmcgYmluYXJ5IHByZXBhcmF0aW9uIGJlZm9yZSB3b3JrZmxvdyBleGVjdXRpb24uIEZhaWx1cmVzXG4gICAqIGFyZSBpbnRlbnRpb25hbGx5IHJldGFpbmVkOiB0aGUgb3JkZXJlZCBldmVudCBjb25zdW1lciBtdXN0IG9ic2VydmUgdGhlXG4gICAqIG9yaWdpbmFsIHJlamVjdGlvbiBiZWZvcmUgdGhhdCBlbnRyeSBiZWNvbWVzIHJldHJ5YWJsZS5cbiAgICovXG4gIGFzeW5jIHByZXdhcm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLCBldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbnM6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPltdID0gW107XG4gICAgY29uc3Qgc3RhcnQgPSAoY2FjaGVLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgIC8vIExlZ2FjeSBmbGF0dGVuZWQgdmFsdWVzIG1heSBiZSBtdXRhdGVkIGJ5IGRldmFsdWUncyB1bmZsYXR0ZW4gYW5kIGFyZVxuICAgICAgLy8gdGhlcmVmb3JlIHByZXBhcmVkIG9ubHkgYnkgdGhlaXIgZXZlbnR1YWwgY29uc3VtZXIsIG5ldmVyIGNhY2hlZC5cbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybjtcblxuICAgICAgLy8gRWFjaCByZXBsYXkgc2NhbnMgdGhlIGZ1bGwgZXZlbnQgbG9nLCBzbyBhd2FpdGluZyBjYWNoZWQgcHJvbWlzZXMgaGVyZVxuICAgICAgLy8gd291bGQgYWRkIE8oTl4yKSBwcm9taXNlIHJlYWN0aW9ucyBvdmVyIGFuIE4tc3RlcCBpbnZvY2F0aW9uLiBPbmx5IHdhaXRcbiAgICAgIC8vIGZvciBwcmVwYXJhdGlvbnMgZmlyc3QgZGlzY292ZXJlZCBieSB0aGlzIHByZXdhcm0gcGFzcy5cbiAgICAgIGlmICh0aGlzLnByZXBhcmVkUGF5bG9hZHMuaGFzKGNhY2hlS2V5KSkgcmV0dXJuO1xuICAgICAgcHJlcGFyYXRpb25zLnB1c2godGhpcy5lbnN1cmVQcmVwYXJhdGlvbihjYWNoZUtleSwgdmFsdWUpKTtcbiAgICB9O1xuXG4gICAgc3RhcnQodGhpcy53b3JrZmxvd0lucHV0S2V5KHdvcmtmbG93UnVuLnJ1bklkKSwgd29ya2Zsb3dSdW4uaW5wdXQpO1xuICAgIC8vIFRoaXMgY2FjaGUgaXMgc2NvcGVkIHRvIG9uZSBpbnZvY2F0aW9uLiBJbmNyZW1lbnRhbCBsb2FkcyBhbmQgd3JpdGVcbiAgICAvLyByZXNwb25zZSBkZWx0YXMgb25seSBldmVyIGFwcGVuZCwgc28gdGhlIHNjYW5uZWQgbGVuZ3RoIGxvY2F0ZXMgdGhlXG4gICAgLy8gZXZlbnRzIGFkZGVkIHNpbmNlIHRoZSBwcmV2aW91cyByZXBsYXkuIEEgcmVsb2FkIHRoYXQgY2FuIGluc2VydCBldmVudHNcbiAgICAvLyBCRUxPVyB0aGF0IGxlbmd0aCAoYSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0IHJlcGxhY2luZyB0aGUgbG9nIHdpdGggYVxuICAgIC8vIGNvcnJlY3RlZCBvbmUpIG11c3QgY2FsbCBgcmVzZXRTY2FuKClgIGZpcnN0LCBvciB0aGUgaW5zZXJ0ZWQgZXZlbnRzIGFyZVxuICAgIC8vIG5ldmVyIHNjYW5uZWQuIFByZXBhcmVkIGVudHJpZXMgc3RheSB2YWxpZCBhY3Jvc3MgdGhhdDogdGhleSBhcmUga2V5ZWQgYnlcbiAgICAvLyBldmVudCBpZCwgbm90IGJ5IHBvc2l0aW9uLlxuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4O1xuICAgICAgaW5kZXggPCBldmVudHMubGVuZ3RoO1xuICAgICAgaW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXhdO1xuICAgICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICAgIHN0YXJ0KFxuICAgICAgICAgICAgdGhpcy5ldmVudFBheWxvYWRLZXkoZXZlbnQuZXZlbnRJZCwgJ3Jlc3VsdCcpLFxuICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhPy5yZXN1bHRcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgICAgc3RhcnQoXG4gICAgICAgICAgICB0aGlzLmV2ZW50UGF5bG9hZEtleShldmVudC5ldmVudElkLCAnZXJyb3InKSxcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YT8uZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdob29rX3JlY2VpdmVkJzpcbiAgICAgICAgICBzdGFydChcbiAgICAgICAgICAgIHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50LmV2ZW50SWQsICdwYXlsb2FkJyksXG4gICAgICAgICAgICBldmVudC5ldmVudERhdGE/LnBheWxvYWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gZXZlbnRzLmxlbmd0aDtcblxuICAgIC8vIFByZXdhcm1pbmcgaXMgc3BlY3VsYXRpdmUgYW5kIG11c3Qgbm90IGZhaWwgcmVwbGF5IGJlZm9yZSB0aGUgbWF0Y2hpbmdcbiAgICAvLyBldmVudCBpcyBjb25zdW1lZC4gYWxsU2V0dGxlZCBhbHNvIGF0dGFjaGVzIHJlamVjdGlvbiBoYW5kbGVycyBlYWdlcmx5LlxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcmVwYXJhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmdldCBob3cgbXVjaCBvZiB0aGUgZXZlbnQgbG9nIGhhcyBiZWVuIHNjYW5uZWQsIHNvIHRoZSBuZXh0XG4gICAqIHtAbGluayBwcmV3YXJtfSB3YWxrcyBpdCBmcm9tIHRoZSBzdGFydCBhZ2Fpbi5cbiAgICpcbiAgICogUmVxdWlyZWQgYmVmb3JlIGEgcmVwbGF5IHdob3NlIGV2ZW50IGxvZyB3YXMgcmVsb2FkZWQgcmF0aGVyIHRoYW4gZXh0ZW5kZWQ6XG4gICAqIGEgY29ycmVjdGVkIGxvZyBpbnNlcnRzIHRoZSBldmVudHMgdGhlIHByZXZpb3VzIGxvYWQgd2FzIG1pc3NpbmcsIHdoaWNoXG4gICAqIHNoaWZ0cyBldmVyeSBsYXRlciBwb3NpdGlvbiwgc28gYSBwb3NpdGlvbmFsIHJlc3VtZSB3b3VsZCBza2lwIGV4YWN0bHkgdGhlXG4gICAqIGV2ZW50cyB0aGUgcmVsb2FkIHdhcyBmb3IuIEFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIGtlcHQ6IHRoZXkgYXJlXG4gICAqIGtleWVkIGJ5IGV2ZW50IGlkLCBzbyByZS1zY2FubmluZyByZS1vYnNlcnZlcyB0aGVtIGZvciBmcmVlLlxuICAgKi9cbiAgcmVzZXRTY2FuKCk6IHZvaWQge1xuICAgIHRoaXMubmV4dFVuc2Nhbm5lZEV2ZW50SW5kZXggPSAwO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgd29ya2Zsb3cgaW5wdXQgYWZ0ZXIgc2hhcmVkIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbi4gKi9cbiAgcHJlcGFyZVdvcmtmbG93SW5wdXQoXG4gICAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVByZXBhcmF0aW9uKFxuICAgICAgdGhpcy53b3JrZmxvd0lucHV0S2V5KHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIHdvcmtmbG93UnVuLmlucHV0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gZXZlbnQgcGF5bG9hZCBhZnRlciBzaGFyZWQgaG9zdC1zaWRlIHByZXBhcmF0aW9uLiBBIHJlamVjdGVkXG4gICAqIHByZXBhcmF0aW9uIGlzIGV2aWN0ZWQgb25seSBhZnRlciB0aGlzIG9yZGVyZWQgY29uc3VtZXIgcmVxdWVzdHMgaXQsIHNvIGFcbiAgICogbGF0ZXIgcmVwbGF5IGNhbiByZXRyeSB3aXRob3V0IGhpZGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZS5cbiAgICovXG4gIHByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lUHJlcGFyYXRpb24odGhpcy5ldmVudFBheWxvYWRLZXkoZXZlbnRJZCwgZmllbGQpLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgZmluYWwgc3RlcCB2YWx1ZXMgb25seSB3aGVuIHNoYXJpbmcgdGhlbSBhY3Jvc3MgVk1zIGlzIHVub2JzZXJ2YWJsZS5cbiAgICogT2JqZWN0cyBhbmQgbGFyZ2Ugc3RyaW5ncy9iaWdpbnRzIGFsd2F5cyBydW4gYGh5ZHJhdGVgIGFnYWluLCBwcm9kdWNpbmcgYVxuICAgKiBmcmVzaCBWTS1zcGVjaWZpYyB2YWx1ZSBmcm9tIHRoZSBzZXBhcmF0ZWx5IGNhY2hlZCBwcmVwYXJlZCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZ2V0U3RlcFJlc3VsdChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgaHlkcmF0ZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAodGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5oYXMoZXZlbnRJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZVN0ZXBSZXN1bHRzLmdldChldmVudElkKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGh5ZHJhdGUoKTtcbiAgICBpZiAoaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgdGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5zZXQoZXZlbnRJZCwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXItZmFjaW5nIGxvb2t1cC4gQmluYXJ5IHBheWxvYWRzIHNoYXJlIHByZXBhcmF0aW9uOyBsZWdhY3kgdmFsdWVzXG4gICAqIGJ5cGFzcyB0aGUgY2FjaGUgYmVjYXVzZSB0aGVpciBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gbWF5IGJlIG11dGF0ZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbnN1bWVQcmVwYXJhdGlvbihcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuIHRoaXMucnVuUHJlcGFyYXRpb24odmFsdWUpO1xuXG4gICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLmVuc3VyZVByZXBhcmF0aW9uKGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgdm9pZCBwcmVwYXJhdGlvbi5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcmVwYXJlZFBheWxvYWRzLmdldChjYWNoZUtleSkgPT09IHByZXBhcmF0aW9uKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcmVwYXJhdGlvbjtcbiAgfVxuXG4gIC8qKiBTdGFydCBwcmVwYXJhdGlvbiBvbmNlIGFuZCBzaGFyZSB0aGUgZXhhY3QgaW4tZmxpZ2h0IHByb21pc2UuICovXG4gIHByaXZhdGUgZW5zdXJlUHJlcGFyYXRpb24oXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogVWludDhBcnJheVxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBwcmVwYXJhdGlvbiA9IHRoaXMucnVuUHJlcGFyYXRpb24odmFsdWUpO1xuICAgIHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5zZXQoY2FjaGVLZXksIHByZXBhcmF0aW9uKTtcbiAgICByZXR1cm4gcHJlcGFyYXRpb247XG4gIH1cblxuICAvKiogTm9ybWFsaXplIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcHJlcGFyZXJzIHRvIG9uZSBwcm9taXNlIGNvbnRyYWN0LiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blByZXBhcmF0aW9uKHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlcih2YWx1ZSwgdGhpcy5lbmNyeXB0aW9uS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dJbnB1dEtleShydW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJ1bjoke3J1bklkfTppbnB1dGA7XG4gIH1cblxuICBwcml2YXRlIGV2ZW50UGF5bG9hZEtleShldmVudElkOiBzdHJpbmcsIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXZlbnQ6JHtldmVudElkfToke2ZpZWxkfWA7XG4gIH1cbn1cbiJdfQ==
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LXBheWxvYWQtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LXBheWxvYWQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBSTVCLFNBQVMscUJBQXFCLENBQUMsS0FBYztJQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUM7SUFDMUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBV1Y7SUFWRixnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFHeEMsQ0FBQztJQUNhLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ2xELGFBQWEsQ0FBa0M7SUFDeEQsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLFlBQ0UsYUFBdUUsRUFDdEQsV0FBa0Msb0JBQW9CO1FBQXRELGFBQVEsR0FBUixRQUFRLENBQThDO1FBRXZFLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCwwRUFBMEU7UUFDMUUsMkRBQTJEO1FBQzNELEtBQUssV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FB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QUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLGVBQWU7Z0JBQ2xCLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztnQkFDakMsTUFBTTtZQUNSO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsUUFBZ0IsRUFDaEIsS0FBYztRQUVkLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDMUUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsS0FBeUI7UUFDaEUsT0FBTyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgcHJlcGFyZVJlcGxheVBheWxvYWQsXG4gIHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuXG50eXBlIFJlcGxheVBheWxvYWRGaWVsZCA9ICdyZXN1bHQnIHwgJ2Vycm9yJyB8ICdwYXlsb2FkJztcblxuZnVuY3Rpb24gaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIGZvciByZXBsYXkgcGF5bG9hZCBoeWRyYXRpb24uXG4gKlxuICogQSB3b3JrZmxvdyBpbnZvY2F0aW9uIG1heSByZXBsYXkgdGhlIHNhbWUgZXZlbnQgbG9nIHRocm91Z2ggc2V2ZXJhbCBmcmVzaFxuICogVk1zLiBUaGlzIGNhY2hlIGtlZXBzIHRoZSBWTS1pbmRlcGVuZGVudCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0IGFjcm9zc1xuICogdGhvc2UgcmVwbGF5cy4gRGVzZXJpYWxpemF0aW9uIHN0aWxsIHJ1bnMgYWdhaW5zdCBlYWNoIFZNJ3MgZ2xvYmFscyBzbyBldmVyeVxuICogcmVwbGF5IHJlY2VpdmVzIGZyZXNoIG9iamVjdCBncmFwaHMgYW5kIGNvcnJlY3RseSByZXZpdmVkIFdvcmtmbG93IG9iamVjdHMuXG4gKlxuICogU3VjY2Vzc2Z1bCBwcmVwYXJlZCBwbGFpbnRleHQgYW5kIG1lbW9pemVkIHByaW1pdGl2ZSBzdGVwIHJlc3VsdHMgcmVtYWluXG4gKiByZXNpZGVudCBmb3IgdGhlIGludm9jYXRpb24gbGlmZXRpbWUuIFRoZWlyIG1lbW9yeSBuZXZlciBjcm9zc2VzIHdvcmtmbG93XG4gKiBydW5zIG9yIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBsYXlQYXlsb2FkQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXBhcmVkUGF5bG9hZHMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD5cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW1pdGl2ZVN0ZXBSZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSBuZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCB8IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVwYXJlcjogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gcHJlcGFyZVJlcGxheVBheWxvYWRcbiAgKSB7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gUHJvbWlzZS5yZXNvbHZlKGVuY3J5cHRpb25LZXkpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IHByZXBhcmluZyBhbiBldmVudCBwYXlsb2FkIGFzIHNvb24gYXMgaXRzIGZyYW1lIGlzIGRlY29kZWQuICovXG4gIHByZXBhcmVFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbiA9IHRoaXMucHJlcGFyZUV2ZW50SWZNaXNzaW5nKGV2ZW50KTtcbiAgICAvLyBTdHJlYW1pbmcgcHJlcGFyYXRpb24gaXMgc3BlY3VsYXRpdmUuIEl0cyBvcmRlcmVkIGNvbnN1bWVyIG9ic2VydmVzIHRoZVxuICAgIC8vIG9yaWdpbmFsIHJlamVjdGlvbiBhbmQgbWFrZXMgdGhhdCBjYWNoZSBlbnRyeSByZXRyeWFibGUuXG4gICAgdm9pZCBwcmVwYXJhdGlvbj8uY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGV2ZXJ5IG1pc3NpbmcgYmluYXJ5IHByZXBhcmF0aW9uIGJlZm9yZSB3b3JrZmxvdyBleGVjdXRpb24uIEZhaWx1cmVzXG4gICAqIGFyZSBpbnRlbnRpb25hbGx5IHJldGFpbmVkOiB0aGUgb3JkZXJlZCBldmVudCBjb25zdW1lciBtdXN0IG9ic2VydmUgdGhlXG4gICAqIG9yaWdpbmFsIHJlamVjdGlvbiBiZWZvcmUgdGhhdCBlbnRyeSBiZWNvbWVzIHJldHJ5YWJsZS5cbiAgICovXG4gIGFzeW5jIHByZXdhcm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLCBldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbnM6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPltdID0gW107XG4gICAgY29uc3Qgd29ya2Zsb3dJbnB1dCA9IHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gICAgaWYgKHdvcmtmbG93SW5wdXQpIHByZXBhcmF0aW9ucy5wdXNoKHdvcmtmbG93SW5wdXQpO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4O1xuICAgICAgaW5kZXggPCBldmVudHMubGVuZ3RoO1xuICAgICAgaW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXhdO1xuICAgICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnByZXBhcmVFdmVudElmTWlzc2luZyhldmVudCk7XG4gICAgICBpZiAocHJlcGFyYXRpb24pIHByZXBhcmF0aW9ucy5wdXNoKHByZXBhcmF0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5uZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IGV2ZW50cy5sZW5ndGg7XG5cbiAgICAvLyBQcmV3YXJtaW5nIGlzIHNwZWN1bGF0aXZlIGFuZCBtdXN0IG5vdCBmYWlsIHJlcGxheSBiZWZvcmUgdGhlIG1hdGNoaW5nXG4gICAgLy8gZXZlbnQgaXMgY29uc3VtZWQuIGFsbFNldHRsZWQgYWxzbyBhdHRhY2hlcyByZWplY3Rpb24gaGFuZGxlcnMgZWFnZXJseS5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJlcGFyYXRpb25zKTtcbiAgfVxuXG4gIC8qKiBSZXNjYW4gdGhlIG5leHQgZXZlbnQgbG9nIGFmdGVyIGFuIGF1dGhvcml0YXRpdmUgcmVwbGFjZW1lbnQuICovXG4gIHJlc2V0U2NhbigpOiB2b2lkIHtcbiAgICB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gMDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIHdvcmtmbG93IGlucHV0IGFmdGVyIHNoYXJlZCBob3N0LXNpZGUgcHJlcGFyYXRpb24uICovXG4gIHByZXBhcmVXb3JrZmxvd0lucHV0KFxuICAgIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGV2ZW50IHBheWxvYWQgYWZ0ZXIgc2hhcmVkIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbi4gQSByZWplY3RlZFxuICAgKiBwcmVwYXJhdGlvbiBpcyBldmljdGVkIG9ubHkgYWZ0ZXIgdGhpcyBvcmRlcmVkIGNvbnN1bWVyIHJlcXVlc3RzIGl0LCBzbyBhXG4gICAqIGxhdGVyIHJlcGxheSBjYW4gcmV0cnkgd2l0aG91dCBoaWRpbmcgdGhlIG9yaWdpbmFsIGZhaWx1cmUuXG4gICAqL1xuICBwcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgIGV2ZW50SWQ6IHN0cmluZyxcbiAgICBmaWVsZDogUmVwbGF5UGF5bG9hZEZpZWxkLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVByZXBhcmF0aW9uKHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50SWQsIGZpZWxkKSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldXNlIGZpbmFsIHN0ZXAgdmFsdWVzIG9ubHkgd2hlbiBzaGFyaW5nIHRoZW0gYWNyb3NzIFZNcyBpcyB1bm9ic2VydmFibGUuXG4gICAqIE9iamVjdHMgYWx3YXlzIHJ1biBgaHlkcmF0ZWAgYWdhaW4gdG8gcHJvZHVjZSBhIGZyZXNoIFZNLXNwZWNpZmljIHZhbHVlO1xuICAgKiBldmVyeSBwcmltaXRpdmUgaXMgc2FmZSB0byByZXVzZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIGdldFN0ZXBSZXN1bHQoXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGh5ZHJhdGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuaGFzKGV2ZW50SWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5nZXQoZXZlbnRJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBoeWRyYXRlKCk7XG4gICAgaWYgKGlzTWVtb2l6YWJsZVByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuc2V0KGV2ZW50SWQsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVyLWZhY2luZyBsb29rdXAuIEJpbmFyeSBwYXlsb2FkcyBzaGFyZSBwcmVwYXJhdGlvbjsgbGVnYWN5IHZhbHVlc1xuICAgKiBieXBhc3MgdGhlIGNhY2hlIGJlY2F1c2UgdGhlaXIgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG1heSBiZSBtdXRhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUHJlcGFyYXRpb24oXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybiB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcblxuICAgIGNvbnN0IHByZXBhcmF0aW9uID0gdGhpcy5lbnN1cmVQcmVwYXJhdGlvbihjYWNoZUtleSwgdmFsdWUpO1xuICAgIHZvaWQgcHJlcGFyYXRpb24uY2F0Y2goKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5nZXQoY2FjaGVLZXkpID09PSBwcmVwYXJhdGlvbikge1xuICAgICAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyYXRpb247XG4gIH1cblxuICAvKiogU3RhcnQgcHJlcGFyYXRpb24gb25jZSBhbmQgc2hhcmUgdGhlIGV4YWN0IGluLWZsaWdodCBwcm9taXNlLiAqL1xuICBwcml2YXRlIGVuc3VyZVByZXBhcmF0aW9uKFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFVpbnQ4QXJyYXlcbiAgKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcbiAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuc2V0KGNhY2hlS2V5LCBwcmVwYXJhdGlvbik7XG4gICAgcmV0dXJuIHByZXBhcmF0aW9uO1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHByZXBhcmVycyB0byBvbmUgcHJvbWlzZSBjb250cmFjdC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5QcmVwYXJhdGlvbih2YWx1ZTogdW5rbm93bik6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZXIodmFsdWUsIGF3YWl0IHRoaXMuZW5jcnlwdGlvbktleSk7XG4gIH1cblxuICAvKiogU3RhcnQgb25lIGV2ZW50J3MgYmluYXJ5IHBheWxvYWQgdW5sZXNzIGFub3RoZXIgcGF0aCBhbHJlYWR5IGRpZC4gKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnRJZk1pc3NpbmcoXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQ7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdydW5fY3JlYXRlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0UHJlcGFyYXRpb24oXG4gICAgICAgICAgdGhpcy53b3JrZmxvd0lucHV0S2V5KGV2ZW50LnJ1bklkKSxcbiAgICAgICAgICBldmVudC5ldmVudERhdGEuaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3J1bl9zdGFydGVkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgICAgICB0aGlzLndvcmtmbG93SW5wdXRLZXkoZXZlbnQucnVuSWQpLFxuICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YT8uaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzpcbiAgICAgICAgZmllbGQgPSAncmVzdWx0JztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIGZpZWxkID0gJ2Vycm9yJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfcmVjZWl2ZWQnOlxuICAgICAgICBmaWVsZCA9ICdwYXlsb2FkJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50LmV2ZW50SWQsIGZpZWxkKSxcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQcmVwYXJhdGlvbihcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCB0aGlzLnByZXBhcmVkUGF5bG9hZHMuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlUHJlcGFyYXRpb24oY2FjaGVLZXksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dJbnB1dEtleShydW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJ1bjoke3J1bklkfTppbnB1dGA7XG4gIH1cblxuICBwcml2YXRlIGV2ZW50UGF5bG9hZEtleShldmVudElkOiBzdHJpbmcsIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXZlbnQ6JHtldmVudElkfToke2ZpZWxkfWA7XG4gIH1cbn1cbiJdfQ==
@@ -97,8 +97,7 @@ export declare function getMaxInlineSteps(): number;
97
97
  * messages on its fast inline path instead of paying an S3 store+fetch
98
98
  * double-hop for bytes that already live in the event log. Above this size
99
99
  * the dispatch falls back to the sequential path (`step_created` write, then
100
- * a payload-less queue message). Matches `MAX_INLINE_RESUME_PAYLOAD_BYTES`
101
- * on the resilient hook resume path.
100
+ * a payload-less queue message).
102
101
  */
103
102
  export declare const MAX_RESILIENT_STEP_INPUT_BYTES: number;
104
103
  /**
@@ -107,7 +106,8 @@ export declare const MAX_RESILIENT_STEP_INPUT_BYTES: number;
107
106
  * step-execution queue publish, carrying the serialized step input in the
108
107
  * queue message (`stepInput`) so the consumer can idempotently re-ensure the
109
108
  * event if the direct write failed transiently. Mirrors the resilient start
110
- * (`runInput`) and resilient hook resume (`hookInput`) patterns.
109
+ * (`runInput`) pattern (and the legacy lazy hook resume's `hookInput`, which
110
+ * current producers no longer send).
111
111
  *
112
112
  * **Off by default.** Enable via `WORKFLOW_RESILIENT_STEP_DISPATCH=1`.
113
113
  *
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAwB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAQD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AASD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD;AAMD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AAKD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAwB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAQD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AASD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD;AAMD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AAKD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD"}
@@ -206,8 +206,7 @@ export function getMaxInlineSteps() {
206
206
  * messages on its fast inline path instead of paying an S3 store+fetch
207
207
  * double-hop for bytes that already live in the event log. Above this size
208
208
  * the dispatch falls back to the sequential path (`step_created` write, then
209
- * a payload-less queue message). Matches `MAX_INLINE_RESUME_PAYLOAD_BYTES`
210
- * on the resilient hook resume path.
209
+ * a payload-less queue message).
211
210
  */
212
211
  export const MAX_RESILIENT_STEP_INPUT_BYTES = 128 * 1024;
213
212
  /**
@@ -216,7 +215,8 @@ export const MAX_RESILIENT_STEP_INPUT_BYTES = 128 * 1024;
216
215
  * step-execution queue publish, carrying the serialized step input in the
217
216
  * queue message (`stepInput`) so the consumer can idempotently re-ensure the
218
217
  * event if the direct write failed transiently. Mirrors the resilient start
219
- * (`runInput`) and resilient hook resume (`hookInput`) patterns.
218
+ * (`runInput`) pattern (and the legacy lazy hook resume's `hookInput`, which
219
+ * current producers no longer send).
220
220
  *
221
221
  * **Off by default.** Enable via `WORKFLOW_RESILIENT_STEP_DISPATCH=1`.
222
222
  *
@@ -508,4 +508,4 @@ export const DEPLOYMENT_MISMATCH_MAX_RETRIES = 3;
508
508
  export function getDeploymentMismatchMaxRetries() {
509
509
  return envNumber('WORKFLOW_DEPLOYMENT_MISMATCH_MAX_RETRIES', DEPLOYMENT_MISMATCH_MAX_RETRIES, { integer: true, min: 0 });
510
510
  }
511
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3Qyw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxvREFBb0Q7QUFDcEQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSxzREFBc0Q7QUFDdEQsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UseUVBQXlFO0FBQ3pFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFdkM7O0dBRUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsT0FBTyxTQUFTLENBQUMsK0JBQStCLEVBQUUsb0JBQW9CLEVBQUU7UUFDdEUsT0FBTyxFQUFFLElBQUk7UUFDYixHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxvQkFBb0I7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUM7QUFFekMsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gs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QUMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUNBQW1DO0lBQ2pELE9BQU8sU0FBUyxDQUNkLDhDQUE4QyxFQUM5QyxtQ0FBbUMsRUFDbkMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDO0FBRWpEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsK0JBQStCO0lBQzdDLE9BQU8sU0FBUyxDQUNkLDBDQUEwQyxFQUMxQywrQkFBK0IsRUFDL0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vLyBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZSBkZWxpdmVyeSBhdHRlbXB0cyBiZWZvcmUgdGhlIGhhbmRsZXIgZ2l2ZXMgdXAgYW5kXG4vLyBncmFjZWZ1bGx5IGZhaWxzIHRoZSBydW4vc3RlcC4gVGhpcyBtdXN0IGJlIGJvdW5kZWQgdW5kZXIgdGhlIFZRUyBtZXNzYWdlXG4vLyBtYXggdmlzaWJpbGl0eSB3aW5kb3cgKDI0IGhvdXJzKSBzbyB0aGF0IG91ciBoYW5kbGVyLXNpZGUgZmFpbHVyZSBwYXRoXG4vLyByZWxpYWJseSBleGVjdXRlcyBiZWZvcmUgVlFTIGV4cGlyZXMgdGhlIG1lc3NhZ2UuXG4vL1xuLy8gVGhlIGVmZmVjdGl2ZSB3YWxsLWNsb2NrIHN1cnZpdmFsIGRlcGVuZHMgb24gdGhlIHBlci1yZWRlbGl2ZXJ5IGJhY2tvZmY6IHRoZVxuLy8gYHJldHJ5LWFmdGVyYCB0aGUgaGFuZGxlciByZXR1cm5zIChzZWUgd29ybGQtdmVyY2VsXG4vLyBgZ2V0SGFuZGxlckVycm9yUmV0cnlBZnRlclNlY29uZHNgKSBmZWQgdGhyb3VnaCBWUVMgYGNhbGN1bGF0ZUJhY2tvZmZEZWxheWAuXG4vLyBWUVMgdXNlcyBvdXIgdmFsdWUgZm9yIHRoZSBmaXJzdCAzMiBhdHRlbXB0cyAoY2xhbXBlZCB0byBbNXMsIDkwMHNdKSB0aGVuXG4vLyBhcHBsaWVzIGl0cyBvd24gZXhwb25lbnRpYWwgZ3Jvd3RoLCBldmVyeSBob3AgaGFyZC1jYXBwZWQgYXQgdGhlIFNRUyBsaW1pdFxuLy8gb2YgOTAwcy4gV2l0aCB0aGUgYmFja29mZiByYW1waW5nIHRvd2FyZCB0aGF0IDkwMHMgY2VpbGluZyAocmVhY2hlZCBieVxuLy8gfmRlbGl2ZXJ5IDExKSwgNDggYXR0ZW1wdHMgc3BhbiByb3VnaGx5IDnigJMxMCBob3VycyBvZiB3YWxsLWNsb2NrICh+MzUsMDAwcyksXG4vLyBjb21mb3J0YWJseSB1bmRlciB0aGUgMjQtaG91ciBtZXNzYWdlLXZpc2liaWxpdHkgbGltaXQgc28gdGhlIGZhaWx1cmUgcGF0aFxuLy8gcnVucyBiZWZvcmUgdGhlIG1lc3NhZ2UgZXhwaXJlcy4gKEEgZmxhdHRlciwgbG93LWNhcHBlZCBiYWNrb2ZmIGV4aGF1c3RzIHRoZVxuLy8gYnVkZ2V0IGluIG9ubHkgYSBmZXcgaG91cnMsIGZhaWxpbmcgb3RoZXJ3aXNlLWhlYWx0aHkgcnVucyBkdXJpbmcgYSB0cmFuc2llbnRcbi8vIGJhY2tlbmQgb3V0YWdlOyBjb252ZXJzZWx5LCBzcGFubmluZyB0aGUgZnVsbCAyNGggd2luZG93IHdvdWxkIHJlcXVpcmUgYVxuLy8gc3Vic3RhbnRpYWxseSBoaWdoZXIgY2FwIGhlcmUsIG5vdCBhIGhpZ2hlciBwZXItaG9wIGNlaWxpbmcsIHNpbmNlIFZRU1xuLy8gY2xhbXBzIGV2ZXJ5IGhvcCBhdCA5MDBzLilcbmV4cG9ydCBjb25zdCBNQVhfUVVFVUVfREVMSVZFUklFUyA9IDQ4O1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBtYXggcXVldWUgZGVsaXZlcmllcy4gT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMoKTogbnVtYmVyIHtcbiAgLy8gT25seSBldmVyIGxvd2VyIHRoZSBkZWxpdmVyeSBidWRnZXQuIFRoZSBkZWZhdWx0IGlzIGNhbGlicmF0ZWQgc28gdGhlXG4gIC8vIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGggcnVucyBiZWZvcmUgVlFTIG1lc3NhZ2UtcmV0ZW50aW9uIGV4cGlyeSAoc2VlXG4gIC8vIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFib3ZlKTsgYSBoaWdoZXIgdmFsdWUgd291bGQgYnlwYXNzIHRoYXQgaW52YXJpYW50IGFuZFxuICAvLyBsZXQgYSBiYWQgZGVwbG95bWVudCByZWRlbGl2ZXIgdW50aWwgcXVldWUgZXhwaXJ5IGluc3RlYWQgb2YgcmVjb3JkaW5nXG4gIC8vIHJ1bl9mYWlsLiBgbWF4YCBjbGFtcHMgYSB0b28taGlnaCBvdmVycmlkZSBiYWNrIGRvd24gdG8gdGhlIHNhZmUgZGVmYXVsdC5cbiAgcmV0dXJuIGVudk51bWJlcignV09SS0ZMT1dfTUFYX1FVRVVFX0RFTElWRVJJRVMnLCBNQVhfUVVFVUVfREVMSVZFUklFUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICAgIG1heDogTUFYX1FVRVVFX0RFTElWRVJJRVMsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSB0aW1lIGFsbG93ZWQgZm9yIHRoZSAqcmVwbGF5KiBwb3J0aW9uIG9mIGEgc2luZ2xlIHdvcmtmbG93XG4gKiBoYW5kbGVyIGludm9jYXRpb24gKGluIG1zKS4gVGhpcyBidWRnZXQgb25seSBjb3ZlcnMgZGV0ZXJtaW5pc3RpYy1yZXBsYXlcbiAqIGFuZCB3b3JrZmxvdy1WTSBleGVjdXRpb24gYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMuIElubGluZSBzdGVwIGJvZGllc1xuICogKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9ucyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBkbyBOT1QgY291bnQgYWdhaW5zdFxuICogaXQuIFN0ZXAgYm9kaWVzIGFyZSBib3VuZGVkIHNlcGFyYXRlbHkgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAqIGBtYXhEdXJhdGlvbmAgKGUuZy4gODAwcyBvbiBWZXJjZWwgUHJvIEZsdWlkKSBhbmQgYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgLlxuICpcbiAqIElmIHRoZSBub24tc3RlcCAoXCJyZXBsYXlcIikgdGltZSB3aXRoaW4gYSBzaW5nbGUgaW52b2NhdGlvbiBleGNlZWRzIHRoaXNcbiAqIGJ1ZGdldCwgdGhlIGhhbmRsZXIgcmVqZWN0cyBzbyB0aGUgcXVldWUgY2FuIHJldHJ5LiBBZnRlclxuICogYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGhhdXN0ZWQgYXR0ZW1wdHMgdGhlIHJ1biBpcyBmYWlsZWQgd2l0aFxuICogYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAuXG4gKlxuICogTm90ZSB0aGF0IG9uIFZlcmNlbCBIb2JieSAoc3RhbmRhcmQgZnVuY3Rpb25zKSwgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAqIGlzIDYwcywgd2VsbCBiZWxvdyB0aGlzIGJ1ZGdldCwgc28gdGhlIHBsYXRmb3JtIFNJR1RFUk0gd2lsbCBmaXJlIGZpcnN0XG4gKiBhbmQgdGhlIHF1ZXVlIHdpbGwgcmUtZGVsaXZlciB1bnRpbCB0aGUgdmlzaWJpbGl0eSB3aW5kb3cgZXhwaXJlcy4gV2l0aFxuICogRmx1aWQgQ29tcHV0ZSBvbiBIb2JieSB0aGUgcGVyLWZ1bmN0aW9uIGNlaWxpbmcgcmlzZXMgdG8gMzAwcywgc3RpbGxcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGJ1ZGdldC5cbiAqXG4gKiBPdmVycmlkZSB2aWEgdGhlIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgZW52IHZhciAoY2xhbXBlZCB0b1xuICogYE1JTl9SRVBMQVlfVElNRU9VVF9NU2AuLmBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01TID0gMjQwXzAwMDtcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiA3ODBzIGxlYXZlcyDiiaUyMHMgb2ZcbiAqIGhlYWRyb29tIHVuZGVyIFZlcmNlbCBQcm8gRmx1aWQncyA4MDBzIGZ1bmN0aW9uIGNlaWxpbmcgc28gdGhlIGhhbmRsZXJcbiAqIGNhbiB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVmb3JlIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVQTEFZX1RJTUVPVVRfTVMgPSA3ODBfMDAwO1xuXG4vLyBUcmFjayB3aGljaCByYXcgZW52IHZhciB2YWx1ZXMgd2UndmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQgc28gdGhlIHdhcm5pbmdcbi8vIGxvZyBvbmx5IGZpcmVzIG9uY2UgcGVyIHByb2Nlc3MgKHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1hbnkgdGltZXMpLlxuLy9cbi8vIE9uIGBnbG9iYWxUaGlzYCByYXRoZXIgdGhhbiBhdCBtb2R1bGUgc2NvcGUgc28gXCJvbmNlIHBlciBwcm9jZXNzXCIgc3Vydml2ZXNcbi8vIGJ1bmRsaW5nOiB0aGlzIHBhY2thZ2UgaXMgY29tcGlsZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIHNlcnZlciBidWlsZFxuLy8gb25jZSBwZXIgYnVuZGxlciBsYXllciwgYW5kIHBlci1jb3B5IHNldHMgd2FybiBvbmNlIHBlciBsYXllciBpbnN0ZWFkLlxuY29uc3Qgd2FybmVkID0gZ2xvYmFsU2luZ2xldG9uKCdAd29ya2Zsb3cvY29yZS8vZW52V2FybmluZ3MnLCAxLCAoKSA9PiAoe1xuICByZXBsYXlUaW1lb3V0VmFsdWVzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgbWF4SW5saW5lU3RlcHNWYWx1ZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICBtYXhFdmVudHNWYWx1ZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxufSkpO1xuXG5mdW5jdGlvbiB3YXJuT25jZShcbiAgcmF3OiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQge1xuICBpZiAod2FybmVkLnJlcGxheVRpbWVvdXRWYWx1ZXMuaGFzKHJhdykpIHJldHVybjtcbiAgd2FybmVkLnJlcGxheVRpbWVvdXRWYWx1ZXMuYWRkKHJhdyk7XG4gIHJ1bnRpbWVMb2dnZXIud2FybihtZXNzYWdlLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcmVwbGF5LXRpbWVvdXQgYnVkZ2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIC8gb3V0LW9mLXJhbmdlIHZhbHVlc1xuICogZmFsbCBiYWNrIHRvIGEgc2FmZSB2YWx1ZSAobm8gdGhyb3c6IHRoZSBlbnYgdmFyIGlzIGFuIGVzY2FwZSBoYXRjaCxcbiAqIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQpIGFuZCBlbWl0IGEgb25lLXRpbWUgd2FybmluZyBzbyBtaXNjb25maWd1cmF0aW9uXG4gKiBpcyBvYnNlcnZhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1zKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1JFUExBWV9USU1FT1VUX01TO1xuICBpZiAoIXJhdykgcmV0dXJuIFJFUExBWV9USU1FT1VUX01TO1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPD0gMCkge1xuICAgIHdhcm5PbmNlKFxuICAgICAgcmF3LFxuICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX1JFUExBWV9USU1FT1VUX01TOiBub3QgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgIHsgcmF3LCBkZWZhdWx0TXM6IFJFUExBWV9USU1FT1VUX01TIH1cbiAgICApO1xuICAgIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYmVsb3cgbWluaW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUlOX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWluTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUlOX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIGlmIChwYXJzZWQgPiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMpIHtcbiAgICB3YXJuT25jZShyYXcsICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBhYm92ZSBtYXhpbXVtOyBjbGFtcGVkJywge1xuICAgICAgcmF3LFxuICAgICAgY2xhbXBlZE1zOiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgICBtYXhNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICAgIHJldHVybiBNQVhfUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgd2Fybi1vbmNlIGNhY2hlLiBUZXN0LW9ubHk6IGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuXG4gKiBleGVyY2lzZSB0aGUgd2FybiBwYXRoIHJlcGVhdGVkbHkgd2l0aG91dCBzaGFyaW5nIHN0YXRlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0UmVwbGF5VGltZW91dFdhcm5DYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICB3YXJuZWQucmVwbGF5VGltZW91dFZhbHVlcy5jbGVhcigpO1xufVxuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgcmVqZWN0cyB3aXRob3V0IHdyaXRpbmcgcnVuX2ZhaWxlZCBzbyB0aGUgcXVldWUgcmV0cmllcyB0aGUgbWVzc2FnZS5cbi8vIE9uIHRoZSBuZXh0IGF0dGVtcHQgdGhlIHJ1biBpcyBtYXJrZWQgYXMgZmFpbGVkLlxuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgcmVwbGF5LXRpbWVvdXQgcmV0cnkgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlUaW1lb3V0TWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUycsXG4gICAgUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIHRoZSBvd25lZC1pbmxpbmUgcGF0aCBydW5zIGlubGluZSAoaW5cbiAqIHBhcmFsbGVsKSBwZXIgc3VzcGVuc2lvbi4gVGhlIHJlc3QgYXJlIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLiBFYWNoXG4gKiBpbmxpbmUgc3RlcCBpcyBjcmVhdGVkIGxhemlseSAoaXRzIGBzdGVwX2NyZWF0ZWRgIGlzIGZvbGRlZCBpbnRvIHRoZVxuICogYHN0ZXBfc3RhcnRlZGAgdGhhdCBgZXhlY3V0ZVN0ZXBgIHNlbmRzKSwgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdzogdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWQubWF4SW5saW5lU3RlcHNWYWx1ZXMuaGFzKHJhdykpIHtcbiAgICAgIHdhcm5lZC5tYXhJbmxpbmVTdGVwc1ZhbHVlcy5hZGQocmF3KTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM6IG5vdCBhIHBvc2l0aXZlIGludGVnZXI7IHVzaW5nIGRlZmF1bHQnLFxuICAgICAgICB7IHJhdywgZGVmYXVsdFZhbHVlOiBNQVhfSU5MSU5FX1NURVBTIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIGlmIChwYXJzZWQgPCBNSU5fTUFYX0lOTElORV9TVEVQUykgcmV0dXJuIE1JTl9NQVhfSU5MSU5FX1NURVBTO1xuICBpZiAocGFyc2VkID4gTUFYX01BWF9JTkxJTkVfU1RFUFMpIHtcbiAgICBpZiAoIXdhcm5lZC5tYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkLm1heElubGluZVN0ZXBzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTIGFib3ZlIG1heGltdW07IGNsYW1wZWQnLCB7XG4gICAgICAgIHJhdyxcbiAgICAgICAgY2xhbXBlZFZhbHVlOiBNQVhfTUFYX0lOTElORV9TVEVQUyxcbiAgICAgICAgbWF4VmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIHRoZSBzZXJpYWxpemVkIHN0ZXAgaW5wdXQgdGhhdCByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCB3aWxsXG4gKiBpbmxpbmUgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBzdGVwSW5wdXRgLlxuICpcbiAqIFZlcmNlbCBRdWV1ZXMgaGFzIG5vIGhhcmQgbWVzc2FnZS1zaXplIGNhcCAoYm9kaWVzIGFib3ZlIGl0cyB+MjU2IEtCXG4gKiBpbmxpbmUgdGhyZXNob2xkIHRyYW5zcGFyZW50bHkgc3BpbGwgdG8gUzMtYmFja2VkIHN0b3JhZ2UpLCBzbyB0aGlzIGJvdW5kXG4gKiBpcyBhIGNvc3QvbGF0ZW5jeSBjaG9pY2UsIG5vdCBhIHJlamVjdGlvbiBndWFyZDogdGhlIG1lc3NhZ2UgYWxzbyBjYXJyaWVzXG4gKiB0aGUgcnVuSWQsIHN0ZXBJZCwgc3RlcE5hbWUsIGFuZCB0cmFjZSBjYXJyaWVyIGFsb25nc2lkZSBDQk9SIGZyYW1pbmdcbiAqIG92ZXJoZWFkLCBhbmQgc3RheWluZyB1bmRlciB0aGUgcXVldWUncyBpbmxpbmUgdGhyZXNob2xkIGtlZXBzIHN0ZXBcbiAqIG1lc3NhZ2VzIG9uIGl0cyBmYXN0IGlubGluZSBwYXRoIGluc3RlYWQgb2YgcGF5aW5nIGFuIFMzIHN0b3JlK2ZldGNoXG4gKiBkb3VibGUtaG9wIGZvciBieXRlcyB0aGF0IGFscmVhZHkgbGl2ZSBpbiB0aGUgZXZlbnQgbG9nLiBBYm92ZSB0aGlzIHNpemVcbiAqIHRoZSBkaXNwYXRjaCBmYWxscyBiYWNrIHRvIHRoZSBzZXF1ZW50aWFsIHBhdGggKGBzdGVwX2NyZWF0ZWRgIHdyaXRlLCB0aGVuXG4gKiBhIHBheWxvYWQtbGVzcyBxdWV1ZSBtZXNzYWdlKS4gTWF0Y2hlcyBgTUFYX0lOTElORV9SRVNVTUVfUEFZTE9BRF9CWVRFU2BcbiAqIG9uIHRoZSByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyA9IDEyOCAqIDEwMjQ7XG5cbi8qKlxuICogV2hldGhlciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCBpcyBlbmFibGVkOiB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gKiBwYXJhbGxlbGl6ZXMgZWFjaCBuZXdseSBjcmVhdGVkIHN0ZXAncyBgc3RlcF9jcmVhdGVkYCBldmVudCB3cml0ZSB3aXRoIGl0c1xuICogc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCwgY2FycnlpbmcgdGhlIHNlcmlhbGl6ZWQgc3RlcCBpbnB1dCBpbiB0aGVcbiAqIHF1ZXVlIG1lc3NhZ2UgKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlXG4gKiBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bklucHV0YCkgYW5kIHJlc2lsaWVudCBob29rIHJlc3VtZSAoYGhvb2tJbnB1dGApIHBhdHRlcm5zLlxuICpcbiAqICoqT2ZmIGJ5IGRlZmF1bHQuKiogRW5hYmxlIHZpYSBgV09SS0ZMT1dfUkVTSUxJRU5UX1NURVBfRElTUEFUQ0g9MWAuXG4gKlxuICogVGhlIHF1ZXVlIHB1Ymxpc2ggcmFjZXMgdGhlIGNyZWF0ZSdzIHZlcmRpY3QsIGFuZCBhIGNyZWF0ZSBjYW4gY29tZSBiYWNrXG4gKiByZWZ1c2VkOiBhcyBhIGR1cGxpY2F0ZSB0aGlzIHJlcGxheSBzaG91bGQgc3RvcCBwdXJzdWluZywgb3IgYXMgYSBzdGFsZVxuICogd3JpdGUgb24gYSBXb3JsZCB0aGF0IHJlZnVzZXMgcmF0aGVyIHRoYW4gcmVwb3J0cy4gRWl0aGVyIHdheSB0aGUgbWVzc2FnZVxuICogY2FycnlpbmcgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBvdXQsIHNvIHRoZSBjb25zdW1lciBjYW4gbWF0ZXJpYWxpemUgYSBzdGVwXG4gKiB3aG9zZSBjcmVhdGUgd2FzIHJlZnVzZWQsIGFuZCBub3RoaW5nIG9yZGVycyB0aGUgdmVyZGljdCBiZWZvcmUgdGhlXG4gKiBjb25zdW1lcidzIHJlZGVsaXZlcnkgcmUtZW5zdXJlLiBFbmFibGluZyB0aGlzIHRyYWRlcyB0aGF0IHdpbmRvdyBmb3IgdGhlXG4gKiBsYXRlbmN5IHRoZSBwYXJhbGxlbCBwdWJsaXNoIHNhdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVTSUxJRU5UX1NURVBfRElTUEFUQ0ggPT09ICcxJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGJhdGNoZWQgZXZlbnQgdHJhbnNpdGlvbnMgYXJlIGVuYWJsZWQ6IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZm9sZHNcbiAqIGEgY2xlYW4gZmFuLW91dCdzIGBzdGVwX2NyZWF0ZWRgICsgYHdhaXRfY3JlYXRlZGAgd3JpdGVzIGludG8gb25lXG4gKiBgd29ybGQuZXZlbnRzLmNyZWF0ZUJhdGNoYCBjYWxsIChvbmUgZHVyYWJsZSB3cml0ZSwgcGVyLWV2ZW50IG91dGNvbWVzKVxuICogaW5zdGVhZCBvZiBvbmUgd3JpdGUgcGVyIGV2ZW50LiBPbmx5IGVuZ2FnZXMgd2hlbiB0aGUgV29ybGQgaW1wbGVtZW50cyB0aGVcbiAqIG9wdGlvbmFsIGBldmVudHMuY3JlYXRlQmF0Y2hgIEFORCB0aGUgcnVuIGlzIG9uIHNsb3QgaWRlbnRpdHlcbiAqIChzcGVjVmVyc2lvbiA+PSA2KSBBTkQgdGhlIHN1c3BlbnNpb24gY2FycmllcyBubyBhdHRyaWJ1dGUvaG9vayB3cml0ZXMgYW5kXG4gKiBubyByZXNpbGllbnQgc3RlcCBkaXNwYXRjaC4gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoZSBzaW5nbGUtZXZlbnQgcGF0aFxuICogYnl0ZS1mb3ItYnl0ZS5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfQkFUQ0hfVFJBTlNJVElPTlNgIGxhemlseS4gRGVmYXVsdCAqKk9OKio7XG4gKiBkaXNhYmxlZCBvbmx5IGJ5IGFuIGV4cGxpY2l0IGAnMCdgIC8gYCdmYWxzZSdgIChjYXNlLWluc2Vuc2l0aXZlKSwgdGhlXG4gKiBvcGVyYXRvciBlc2NhcGUgaGF0Y2ggdGhhdCByZXN0b3JlcyB0aGUgZXhhY3QgcHJpb3Igb25lLXdyaXRlLXBlci1ldmVudFxuICogcGF0aCwgbWlycm9yaW5nIGBXT1JLRkxPV19UVVJCT2AncyBraWxsLXN3aXRjaCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX0JBVENIX1RSQU5TSVRJT05TO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBDZWlsaW5nIG9uIGV2ZW50cyBwZXIgYGNyZWF0ZUJhdGNoYCBjYWxsIGZyb20gdGhlIGJhdGNoZWQgZmFuLW91dCBmb2xkLlxuICogTWlycm9ycyB0aGUgc2VydmVyJ3MgdHJhbnNhY3Rpb24gYnVkZ2V0cyB3aXRoIGEgY29tZm9ydGFibGUgbWFyZ2luOiBlYWNoXG4gKiBmYW4tb3V0IGV2ZW50IGNvc3RzIDIgdHJhbnNhY3Rpb24gaXRlbXMgc2VydmVyLXNpZGUgKGVudGl0eSArIGV2ZW50IHJvdylcbiAqIGFnYWluc3QgdGhlIDEwMC1pdGVtIER5bmFtb0RCIGNhcCwgYW5kIGlubGluZSBwYXlsb2FkcyBjb3VudCBhZ2FpbnN0IGFcbiAqIDc2OCBLQiBieXRlIGJ1ZGdldCwgc28gMzIgZXZlbnRzIHN0YXlzIHdlbGwgdW5kZXIgYm90aCwgYW5kIGEgZmFuLW91dCBsYXJnZXJcbiAqIHRoYW4gdGhpcyBjb21taXRzIGluIHN1Y2Nlc3NpdmUgYmF0Y2hlcyAoc3BsaXQgYmF0Y2hlcyBsb3NlXG4gKiBjcm9zcy1iYXRjaCBhdG9taWNpdHksIHdoaWNoIGlzIGV4YWN0bHkgdG9kYXkncyBwZXItZXZlbnQtd3JpdGUgY3Jhc2hcbiAqIHN1cmZhY2UsIGFuZCBldmVyeSBiYXRjaCBzdGlsbCBjb252ZXJnZXMgb24gcmV0cnkgdmlhIHBlci1ldmVudCA0MDlzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTID0gMzI7XG5cbi8qKlxuICogT3B0aW9uYWwgY2xpZW50LXNpZGUgb3ZlcnJpZGUgZm9yIHRoZSBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nLlxuICogV2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgcnVudGltZSBjbGFtcHMgdGhlIHNlcnZlcidzIGxpbWl0ICpkb3duKlxuICogdG8gdGhpcyB2YWx1ZSAobmV2ZXIgcmFpc2VzIGl0KSBzbyBlbmZvcmNlbWVudCBjYW4gYmUgZXhlcmNpc2VkIHdpdGhvdXQgYVxuICogc2VydmVyLXNpZGUgY2hhbmdlLiBgdW5kZWZpbmVkYCAodW5zZXQpIOKHkiB1c2UgdGhlIHNlcnZlciB2YWx1ZSBhcy1pcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERWAgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIHZhbHVlcyBmYWxsIGJhY2sgdG8gdW5zZXRcbiAqIChubyB0aHJvdzogdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhFdmVudHNPdmVycmlkZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWQubWF4RXZlbnRzVmFsdWVzLmhhcyhyYXcpKSB7XG4gICAgICB3YXJuZWQubWF4RXZlbnRzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSWdub3JpbmcgV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERTogbm90IGEgcG9zaXRpdmUgaW50ZWdlcjsgdXNpbmcgc2VydmVyIGxpbWl0JyxcbiAgICAgICAgeyByYXcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBpcyBlbmFibGVkLiBXaGVuIG9uLCB0aGUgb3duZWQtaW5saW5lXG4gKiBwYXRoIGJlZ2lucyBydW5uaW5nIGEgYnJhbmQtbmV3IHN0ZXAncyBib2R5ICpiZWZvcmUqIGl0cyBsYXp5IGBzdGVwX3N0YXJ0ZWRgXG4gKiBuZXR3b3JrIGNhbGwgcmVzb2x2ZXMgKHRoZSBpbnB1dCBpcyBhbHJlYWR5IGtub3duIGxvY2FsbHkpLCBhd2FpdGluZyB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIG9ubHkgYmVmb3JlIHRoZSB0ZXJtaW5hbCB3cml0ZS5cbiAqXG4gKiBUaGlzIGNhbiBydW4gYSBzdGVwIGJvZHkgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlIGZvciB0aGUgc2FtZVxuICogc3RlcCdzIGNyZWF0ZS1jbGFpbTogYm90aCBydW4gdGhlIGJvZHkgYmVmb3JlIG9uZSB3aW5zLiBUaGF0IGlzIHVuc2FmZSBmb3JcbiAqIHN0ZXBzIHdpdGggbm9uLWlkZW1wb3RlbnQgc2lkZSBlZmZlY3RzOyBpbiBwYXJ0aWN1bGFyLCB0d28gY29uY3VycmVudCBydW5zXG4gKiBvZiBhIHN0ZXAgdGhhdCB3cml0ZXMgdG8gdGhlIHdvcmtmbG93IHN0cmVhbSAoZS5nLiBhbiBBSSBhZ2VudCBzdHJlYW1pbmdcbiAqIHRva2VucykgY2FuIGludGVybGVhdmUgYW5kIGNvcnJ1cHQgdGhlIHN0cmVhbSBkYXRhLiBTbyB0aGUgb3B0aW1pemF0aW9uIGlzXG4gKiAqKm9mZiBieSBkZWZhdWx0KiogYW5kIG11c3QgYmUgZXhwbGljaXRseSBvcHRlZCBpbnRvIHBlciBkZXBsb3ltZW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAgbGF6aWx5LiBEZWZhdWx0IE9GRjtcbiAqIGVuYWJsZWQgb25seSBieSBhbiBleHBsaWNpdCBgJzEnYCAvIGAndHJ1ZSdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJhdyA9PT0gJzEnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBvcGVyYXRvciBoYXMgKipleHBsaWNpdGx5IGRpc2FibGVkKiogb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgdmlhXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MGAgLyBgPWZhbHNlYC4gRGlzdGluY3QgZnJvbSBcInVuc2V0XCI6IHVuc2V0XG4gKiBsZWF2ZXMgdGhlIG9wdGltaXphdGlvbiBvZmYgYnkgZGVmYXVsdCBidXQgbGV0cyB0dXJibyBmb3JjZSBpdCBvbjsgYW4gZXhwbGljaXRcbiAqIGAwYC9gZmFsc2VgIGlzIGFuIG9wZXJhdG9yIG9wdC1vdXQgdGhhdCB0dXJibyBtdXN0IGhvbm9yICh0dXJibydzIGZvcmNlZFxuICogb3B0aW1pc3RpYyBzdGFydCBzdGlsbCBydW5zIGEgc3RlcCBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gKiBjb25maXJtZWQsIHRoZSBwcm9wZXJ0eSBzdWNoIGFuIG9wZXJhdG9yIGlzIG9wdGluZyBvdXQgb2YpLCBzb1xuICogYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCBkZWZlcnMgdG8gdGhpcy4gUmVhZHMgdGhlIGVudiB2YXIgbGF6aWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBcInR1cmJvIG1vZGVcIiBpcyBlbmFibGVkLiBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlICpmaXJzdCBkZWxpdmVyeSBvZlxuICogdGhlIGZpcnN0IGludm9jYXRpb24qIG9mIGEgcnVuIChkZXRlY3RlZCBieSB0aGUgZW50cnlwb2ludCB2aWEgYHJ1bklucHV0YFxuICogcHJlc2VuY2UgKyBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWApOiBpdCBiYWNrZ3JvdW5kcyB0aGUgYHJ1bl9zdGFydGVkYCBldmVudFxuICogY3JlYXRpb24sIHNraXBzIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0KSxcbiAqIGFuZCBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBmb3IgdGhhdCBpbnZvY2F0aW9uLCBpbmRlcGVuZGVudCBvZlxuICogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYC5cbiAqXG4gKiBGb3JjaW5nIG9wdGltaXN0aWMgc3RhcnQgaXMgc2FmZSBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IGRlbGl2ZXJ5IGhhcyBub1xuICogY29uY3VycmVudCBwZWVyIGhhbmRsZXIgdG8gcmFjZSB0aGUgc3RlcCBjcmVhdGUtY2xhaW0sIHNvIGEgc3RlcCBib2R5IHJ1bnNcbiAqIGV4YWN0bHkgb25jZS4gVGhhdCBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZW5kcyBhcyBzb29uIGFzIHRoZSBydW4gY3JlYXRlcyBhXG4gKiBob29rIG9yIHdhaXQgKHdoaWNoIGludHJvZHVjZSByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMpLCBzbyB0aGUgcnVudGltZVxuICogZXhpdHMgdHVyYm8gYXQgdGhhdCBwb2ludC5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFVSQk9gIGxhemlseS4gRGVmYXVsdCAqKk9OKio7IGRpc2FibGVkIG9ubHkgYnkgYW5cbiAqIGV4cGxpY2l0IGAnMCdgIC8gYCdmYWxzZSdgIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHVyYm9FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCTztcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgUXVpY2tKUyBlbmdpbmUncyBiYXNlbGluZS1zbmFwc2hvdCBzdGFydHVwIG9wdGltaXphdGlvbiBpc1xuICogZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBlbmdpbmUgaHlkcmF0ZXMgYSBWTSB3aXRoIHRoZVxuICogd29ya2Zsb3cgYnVuZGxlIG9uY2UgcGVyIGZ1bmN0aW9uIGluc3RhbmNlLCBzbmFwc2hvdHMgaXQsIGFuZCBzdGFydHNcbiAqIGV2ZXJ5IGludm9jYXRpb24gYnkgcmVzdG9yaW5nIHRoZSBzbmFwc2hvdCBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRpbmdcbiAqIHRoZSBidW5kbGUsIHNraXBwaW5nIHRoZSBkb21pbmFudCBzaGFyZSBvZiBWTSBzdGFydHVwIChtZWFzdXJlZFxuICogfjc3bXMg4oaSIH4zbXMgdG8gZmlyc3Qgc3VzcGVuc2lvbiBmb3IgYSAxLjNNQiBidW5kbGUpLiBCdW5kbGVzIHdob3NlXG4gKiBtb2R1bGUgc2NvcGUgY29uc3VtZXMgcmFuZG9tbmVzcywgcmVhZHMgdGhlIGNsb2NrLCBvciByZXBsYWNlcyBhXG4gKiBzZXJpYWxpemF0aW9uIGludHJpbnNpYyBhcmUgZGV0ZWN0ZWQgYXQgaHlkcmF0ZSB0aW1lIGFuZFxuICogYXV0b21hdGljYWxseSBmYWxsIGJhY2sgdG8gcGVyLWludm9jYXRpb24gZnJlc2ggZXZhbHVhdGlvbiAoc2VlXG4gKiBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCkuIFNldCBXT1JLRkxPV19RVUlDS0pTX0JBU0VMSU5FX1NOQVBTSE9UPTAgdG9cbiAqIGRpc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUVVJQ0tKU19CQVNFTElORV9TTkFQU0hPVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5saW5lIGxvb3AgcmV0YWlucyBhIHN1c3BlbmRlZCB3b3JrZmxvdyBWTSBhY3Jvc3MgaW5saW5lIHN0ZXBzXG4gKiB3aXRoaW4gb25lIGludm9jYXRpb24gKGRlZmF1bHQgT04pLiBXaGVuIG9uLCBhIHN0ZXAtb25seSBzdXNwZW5zaW9uIGtlZXBzXG4gKiB0aGUgbGl2ZSBWTSwgZXZlbnQgY29uc3VtZXIsIGFuZCBoeWRyYXRlZCBzdGF0ZSBhbGl2ZSwgYW5kIHRoZSBuZXh0IGxvb3BcbiAqIGl0ZXJhdGlvbiBhcHBlbmRzIG9ubHkgdGhlIG5ld2x5IGR1cmFibGUgZXZlbnRzIGluc3RlYWQgb2YgcmVidWlsZGluZyB0aGVcbiAqIGB2bS5Db250ZXh0YCBhbmQgcmVwbGF5aW5nIHRoZSB3aG9sZSBldmVudCBsb2cuIE5vbi1zdGVwIHN1c3BlbnNpb25zIGFuZFxuICogcmVwbGF5IGRpdmVyZ2VuY2UgYWx3YXlzIGZhbGwgYmFjayB0byB0aGUgb3JkaW5hcnkgZHVyYWJsZSByZXBsYXkgcGF0aC5cbiAqXG4gKiBgV09SS0ZMT1dfUkVUQUlORURfVk09MGAgKG9yIGBmYWxzZWApIGlzIHRoZSBraWxsIHN3aXRjaDogZXZlcnkgaXRlcmF0aW9uXG4gKiByZXBsYXlzIGZyb20gc2NyYXRjaCBpbiBhIGZyZXNoIFZNLCBtYXRjaGluZyB0aGUgcHJlLXJldGVudGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm1SZXRlbnRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVRBSU5FRF9WTTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciBpbmxpbmUgc3RlcCBvd25lcnNoaXAgaXMgZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBsYXp5XG4gKiBgc3RlcF9zdGFydGVkYCB0aGF0IGNyZWF0ZXMgYW4gaW5saW5lIHN0ZXAgcmVjb3JkcyB0aGUgb3duaW5nIHF1ZXVlXG4gKiBtZXNzYWdlIElELCBhbmQgd2FrZSByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIGVucXVldWUgYVxuICogKmRlbGF5ZWQgYmFja3N0b3AqIG1lc3NhZ2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIGl0LCBmaXhpbmdcbiAqIGR1cGxpY2F0ZSBpbmxpbmUgc3RlcCBleGVjdXRpb24gd2hlbiBhIGhvb2svd2FpdCB3YWtlcyBhIHJ1biBtaWQtc3RlcFxuICogKHZlcmNlbC93b3JrZmxvdyMyNzgwKS5cbiAqXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUD0wYCAob3IgYGZhbHNlYCkgaXMgdGhlIGtpbGwgc3dpdGNoOiBkaXNwYXRjaFxuICogcmV2ZXJ0cyB0byB0aGUgdW5jb25kaXRpb25hbCBpbW1lZGlhdGUgcmVxdWV1ZS4gU3RhbXBpbmcgaXMgdW5hZmZlY3RlZDpcbiAqIHRoZSByZWNvcmRlZCBvd25lck1lc3NhZ2VJZCBpcyBpbmVydCBkYXRhIHdoZW4gdGhlIHN3aXRjaCBpcyBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX0lOTElORV9PV05FUlNISVA7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgaW5saW5lLW93bmVyc2hpcCBsZWFzZSwgaW4gc2Vjb25kczogaG93IGxvbmcgYWZ0ZXIgYSBzdGVwJ3MgbGF0ZXN0XG4gKiAoc3RhbXBlZCkgYHN0ZXBfc3RhcnRlZGAgYSBub24tb3duZXIgaW52b2NhdGlvbiBhc3N1bWVzIHRoZSBvd25pbmdcbiAqIGludm9jYXRpb24gbWF5IHN0aWxsIGJlIGFsaXZlLiBXaXRoaW4gdGhlIGxlYXNlLCB3YWtlIHJlcGxheXMgZW5xdWV1ZSB0aGVcbiAqIHN0ZXAncyBiYWNrc3RvcCBtZXNzYWdlIHdpdGggYGRlbGF5U2Vjb25kcyA9IGxlYXNlIHJlbWFpbmluZ2AgaW5zdGVhZCBvZlxuICogaW1tZWRpYXRlbHk7IHBhc3QgaXQsIHRoZXkgZW5xdWV1ZSBpbW1lZGlhdGVseSAodG9kYXkncyBiZWhhdmlvcikuXG4gKlxuICogV2h5IGEgZml4ZWQgODYwIGFuZCBub3QgYSB2YWx1ZSBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uJ3MgYG1heER1cmF0aW9uYDpcbiAqIG5laXRoZXIgcnVudGltZSBub3IgYnVpbGQgdGltZSBjYW4gc2VlIHRoZSByZXNvbHZlZCB2YWx1ZTogYnVpbGRlcnMgZW1pdFxuICogYG1heER1cmF0aW9uOiAnbWF4J2AsIHdoaWNoIHRoZSBwbGF0Zm9ybSByZXNvbHZlcyBwZXItcGxhbiBhdCBkZXBsb3ksIGFuZFxuICogbm8gZW52IHZhciBvciByZXF1ZXN0LWNvbnRleHQgZGVhZGxpbmUgQVBJIGV4cG9zZXMgdGhlIHJlc3VsdC4gVGhlIGJvdW5kXG4gKiBjb21lcyBmcm9tIGEgcGxhdGZvcm0gcnVsZSBpbnN0ZWFkOiBkdXJhdGlvbnMgYWJvdmUgODAwcyByZXF1aXJlIGV4cGxpY2l0XG4gKiBwZXItZnVuY3Rpb24gbnVtZXJpYyBjb25maWcsIHNvIGEgYnVpbGRlci1lbWl0dGVkIGAnbWF4J2AgcmVzb2x2ZXMgdG8gYXRcbiAqIG1vc3QgODAwcywgYW5kIDg2MHMgdGhlcmVmb3JlIGRvbWluYXRlcyBhbnkgd29ya2Zsb3cgcm91dGUncyBpbnZvY2F0aW9uXG4gKiBsaWZldGltZSBwbHVzIHNjaGVkdWxpbmcgc2xhY2suIFJldmlzaXQgd2hlbiB0aGF0IGNlaWxpbmcgbW92ZXMgKHRoZVxuICogMzAtbWludXRlIGR1cmF0aW9uIGJldGEgYmVjb21pbmcgcmVhY2hhYmxlIHZpYSBgJ21heCdgIHdvdWxkIGludmFsaWRhdGVcbiAqIHRoZSBib3VuZCkuIFdvcmxkcyB3aXRob3V0IGFuIGludm9jYXRpb24ga2lsbCBib3VuZCAod29ybGQtbG9jYWwsXG4gKiBzZWxmLWhvc3RlZCkgZ2V0IG5vIGRlYXRoIHByb29mIGZyb20gYW55IGNvbnN0YW50LiBUaGVyZSB0aGUgaW4tcHJvY2Vzc1xuICogc2luZ2xlLWZsaWdodCBsYXllciAoc3RlcC1zaW5nbGUtZmxpZ2h0LnRzKSBpcyB3aGF0IG1ha2VzIGEgYmFja3N0b3BcbiAqIGZpcmluZyBtaWQtc3RlcCBoYXJtbGVzcy5cbiAqXG4gKiA4NjAgYWxzbyBzdGF5cyB1bmRlciB0aGUgcXVldWUncyA5MDBzIG1heGltdW0gZGVsYXkgKFNRUyBjYXApLCBzbyBhXG4gKiBiYWNrc3RvcCdzIGZ1bGwgbGVhc2UgcmVtYWluZGVyIGFsd2F5cyBmaXRzIGluIGEgc2luZ2xlIGRlbGF5ZWQgbWVzc2FnZS5cbiAqXG4gKiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2AgKGNsYW1wZWQgdG9cbiAqIDEuLmBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA4NjA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSBsZWFzZSBlbnYgb3ZlcnJpZGUuIDkwMHMgaXMgdGhlIHF1ZXVlJ3MgbWF4aW11bVxuICogcGVyLW1lc3NhZ2UgZGVsYXkgKFNRUyBjYXApLiBBIGxvbmdlciBsZWFzZSB3b3VsZCBuZWVkIGRlbGF5IGNoYWluaW5nXG4gKiBsaWtlIGxvbmcgd2FpdHMgdXNlOyBjbGFtcCBpbnN0ZWFkIHNvIG9uZSBkZWxheWVkIG1lc3NhZ2UgYWx3YXlzIHN1ZmZpY2VzLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyA9IDkwMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgaW5saW5lLW93bmVyc2hpcCBsZWFzZS4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCwgZS5nLiByYWlzZSBpdCBvbiBzZWxmLWhvc3RlZFxuICogbXVsdGktaW5zdGFuY2Ugd29ybGRzIHdpdGggbG9uZy1ydW5uaW5nIHN0ZXBzIHRvIHdpZGVuIHRoZSB3aW5kb3cgaW4gd2hpY2hcbiAqIGEgbGl2ZSBvd25lciBpcyBwcm90ZWN0ZWQgZnJvbSBhIGNvbmN1cnJlbnQgYmFja3N0b3AgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUycsXG4gICAgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxLCBtYXg6IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgfVxuICApO1xufVxuXG4vLyBBIHJlcGxheS1jb25zdW1lciBtaXNtYXRjaCBjYW4gYmUgY2F1c2VkIGJ5IGEgdHJhbnNpZW50IGRpdmVyZ2VudCByZXBsYXlcbi8vIHJhdGhlciB0aGFuIGFuIGludmFsaWQgcGVyc2lzdGVkIGhpc3RvcnkuIFF1ZXVlIGJvdW5kZWQgcmVjb3ZlcnkgcmVwbGF5c1xuLy8gYmVmb3JlIHJlY29yZGluZyB0ZXJtaW5hbCBjb3JydXB0aW9uIGZvciBhIHJ1biB0aGF0IGNhbm5vdCByZXBsYXkuXG5leHBvcnQgY29uc3QgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSByZXBsYXktZGl2ZXJnZW5jZSByZWNvdmVyeSBidWRnZXQuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTJyxcbiAgICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBBIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiAoNDEyKSBtZWFucyB0aGUgcmVwbGF5J3MgZXZlbnQgbG9nIHdhcyBtaXNzaW5nIGFuXG4vLyBldmVudCB0aGUgV29ybGQgaGFkIGFscmVhZHkgcmVjb3JkZWQsIHNvIHRoZSByZXBsYXkgaXMgcmUtZGVyaXZlZCBmcm9tIGFcbi8vIGNvcnJlY3RlZCBsb2cgaW5zaWRlIHRoZSBzYW1lIGludm9jYXRpb24uIEJvdW5kZWQgYmVjYXVzZSBhIHBlcnNpc3RlbnRseVxuLy8gcmVqZWN0ZWQgd3JpdGUgc2hvdWxkIGVzY2FsYXRlIHJhdGhlciB0aGFuIHNwaW46IGFmdGVyIHRoaXMgbWFueSByZXN0YXJ0cyB0aGVcbi8vIHJ1biBpcyByZS1pbnZva2VkIChhIG5ldyBpbnZvY2F0aW9uLCBwb3NzaWJseSBpbiBhIGRpZmZlcmVudCByZWdpb24pLCBhbmQgdGhlXG4vLyBydW4tbGV2ZWwgYnVkZ2V0IGJlbG93IHRoZW4gYXBwbGllcy5cbmV4cG9ydCBjb25zdCBQUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIGluLXByb2Nlc3MgcmVwbGF5LXJlc3RhcnQgYnVkZ2V0IGZvciBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb25zLlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUycsXG4gICAgUFJFQ09ORElUSU9OX01BWF9JTlBST0NFU1NfUkVTVEFSVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLy8gVGhlIGluLXByb2Nlc3MgYnVkZ2V0IGFib3ZlIGlzIHBlci1pbnZvY2F0aW9uLCBhbmQgYSByZS1pbnZvY2F0aW9uIHRoYXRcbi8vIGVucXVldWVzIGEgZnJlc2ggbWVzc2FnZSBhbHNvIHJlc3RhcnRzIHRoZSBxdWV1ZSdzIGRlbGl2ZXJ5IGNvdW50LCBzbyB3aXRob3V0XG4vLyBhIGNvdW50ZXIgY2FycmllZCBvbiB0aGUgbWVzc2FnZSBhIHBlcm1hbmVudGx5IGZlbmNlZCBydW4gaGFzIG5vIHJ1bi1sZXZlbFxuLy8gYm91bmQgYXQgYWxsLiBJdCBjYW4gc3RheSBmZW5jZWQgd2l0aG91dCBhbnkgcGVybWFuZW50IGZhdWx0IChhIGZ1bGwgcmVsb2FkXG4vLyBpcyBub3QgYXRvbWljIGFjcm9zcyBwYWdlcywgc28gYSBidXN5IHJ1biBjYW4gYWNxdWlyZSBhIG5ldyBob2xlIG9uIGV2ZXJ5XG4vLyByZWxvYWQpLCBzbyB0aGUgY2hhaW4gaXMgY291bnRlZCBhbmQgdGhlIHJ1biBmYWlscyBvbmNlIHRoaXMgbWFueVxuLy8gcmUtaW52b2NhdGlvbnMgaGF2ZSBiZWVuIHNwZW50IG9uIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbnMuXG5leHBvcnQgY29uc3QgUFJFQ09ORElUSU9OX01BWF9SRUlOVk9DQVRJT05TID0gNTtcblxuLyoqXG4gKiBFZmZlY3RpdmUgcGVyLXJ1biBidWRnZXQgZm9yIHJlLWludm9jYXRpb25zIGNhdXNlZCBieSBzdGFsZS1zbmFwc2hvdFxuICogcmVqZWN0aW9ucy4gT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlMnLFxuICAgIFBSRUNPTkRJVElPTl9NQVhfUkVJTlZPQ0FUSU9OUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBCYWNrb2ZmIGJlZm9yZSBhIHByZWNvbmRpdGlvbiByZS1pbnZvY2F0aW9uLiBVbmxpa2UgdGhlIGluLXByb2Nlc3MgcmVzdGFydFxuLy8gKHdoZXJlIHRoZSBwb2ludCBpcyB0byByZS1yZWFkIGltbWVkaWF0ZWx5KSwgYSByZS1pbnZvY2F0aW9uIG9ubHkgaGFwcGVuc1xuLy8gYWZ0ZXIgdGhlIGluLXByb2Nlc3MgYnVkZ2V0IGZhaWxlZCB0byBjYXRjaCB1cCwgc28gdGhlIGxvZyBpcyBiZWluZyBleHRlbmRlZFxuLy8gZmFzdGVyIHRoYW4gdGhpcyByZXBsYXkgY2FuIGZvbGxvdyBpdC4gV2FpdGluZyBsZXRzIHRoZSB3cml0ZXJzIHF1aWVzY2UuXG5leHBvcnQgY29uc3QgUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFMgPSAyO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWxheSBiZWZvcmUgYSBwcmVjb25kaXRpb24gcmUtaW52b2NhdGlvbi4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFMnLFxuICAgIFBSRUNPTkRJVElPTl9SRUlOVk9LRV9ERUxBWV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8vIEEgZGVsaXZlcnkgcmVhY2hpbmcgYSBkZXBsb3ltZW50IHRoZSBydW4gaXMgbm90IHBpbm5lZCB0byBpcyBub3QgdHJlYXRlZCBhc1xuLy8gcGVybWFuZW50LiBSZS1yb3V0ZSB0aGUgbWVzc2FnZSBhdCB0aGUgcnVuJ3Mgb3duIGRlcGxveW1lbnQgYSBib3VuZGVkIG51bWJlclxuLy8gb2YgdGltZXMgYmVmb3JlIGZhaWxpbmcgdGhlIHJ1biB3aXRoIERFUExPWU1FTlRfTUlTTUFUQ0guXG5leHBvcnQgY29uc3QgREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlcGxveW1lbnQtbWlzbWF0Y2ggcmUtcm91dGUgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19ERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTYDsgYDBgIGZhaWxzIHRoZSBydW4gb24gdGhlIGZpcnN0XG4gKiBtaXNyb3V0ZWQgZGVsaXZlcnkgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHJlY292ZXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwbG95bWVudE1pc21hdGNoTWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19ERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTJyxcbiAgICBERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAwIH1cbiAgKTtcbn1cbiJdfQ==
511
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3Qyw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxvREFBb0Q7QUFDcEQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSxzREFBc0Q7QUFDdEQsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UseUVBQXlFO0FBQ3pFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFdkM7O0dBRUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsT0FBTyxTQUFTLENBQUMsK0JBQStCLEVBQUUsb0JBQW9CLEVBQUU7UUFDdEUsT0FBTyxFQUFFLElBQUk7UUFDYixHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxvQkFBb0I7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUM7QUFFekMsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gs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QUMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUNBQW1DO0lBQ2pELE9BQU8sU0FBUyxDQUNkLDhDQUE4QyxFQUM5QyxtQ0FBbUMsRUFDbkMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDO0FBRWpEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsK0JBQStCO0lBQzdDLE9BQU8sU0FBUyxDQUNkLDBDQUEwQyxFQUMxQywrQkFBK0IsRUFDL0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vLyBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZSBkZWxpdmVyeSBhdHRlbXB0cyBiZWZvcmUgdGhlIGhhbmRsZXIgZ2l2ZXMgdXAgYW5kXG4vLyBncmFjZWZ1bGx5IGZhaWxzIHRoZSBydW4vc3RlcC4gVGhpcyBtdXN0IGJlIGJvdW5kZWQgdW5kZXIgdGhlIFZRUyBtZXNzYWdlXG4vLyBtYXggdmlzaWJpbGl0eSB3aW5kb3cgKDI0IGhvdXJzKSBzbyB0aGF0IG91ciBoYW5kbGVyLXNpZGUgZmFpbHVyZSBwYXRoXG4vLyByZWxpYWJseSBleGVjdXRlcyBiZWZvcmUgVlFTIGV4cGlyZXMgdGhlIG1lc3NhZ2UuXG4vL1xuLy8gVGhlIGVmZmVjdGl2ZSB3YWxsLWNsb2NrIHN1cnZpdmFsIGRlcGVuZHMgb24gdGhlIHBlci1yZWRlbGl2ZXJ5IGJhY2tvZmY6IHRoZVxuLy8gYHJldHJ5LWFmdGVyYCB0aGUgaGFuZGxlciByZXR1cm5zIChzZWUgd29ybGQtdmVyY2VsXG4vLyBgZ2V0SGFuZGxlckVycm9yUmV0cnlBZnRlclNlY29uZHNgKSBmZWQgdGhyb3VnaCBWUVMgYGNhbGN1bGF0ZUJhY2tvZmZEZWxheWAuXG4vLyBWUVMgdXNlcyBvdXIgdmFsdWUgZm9yIHRoZSBmaXJzdCAzMiBhdHRlbXB0cyAoY2xhbXBlZCB0byBbNXMsIDkwMHNdKSB0aGVuXG4vLyBhcHBsaWVzIGl0cyBvd24gZXhwb25lbnRpYWwgZ3Jvd3RoLCBldmVyeSBob3AgaGFyZC1jYXBwZWQgYXQgdGhlIFNRUyBsaW1pdFxuLy8gb2YgOTAwcy4gV2l0aCB0aGUgYmFja29mZiByYW1waW5nIHRvd2FyZCB0aGF0IDkwMHMgY2VpbGluZyAocmVhY2hlZCBieVxuLy8gfmRlbGl2ZXJ5IDExKSwgNDggYXR0ZW1wdHMgc3BhbiByb3VnaGx5IDnigJMxMCBob3VycyBvZiB3YWxsLWNsb2NrICh+MzUsMDAwcyksXG4vLyBjb21mb3J0YWJseSB1bmRlciB0aGUgMjQtaG91ciBtZXNzYWdlLXZpc2liaWxpdHkgbGltaXQgc28gdGhlIGZhaWx1cmUgcGF0aFxuLy8gcnVucyBiZWZvcmUgdGhlIG1lc3NhZ2UgZXhwaXJlcy4gKEEgZmxhdHRlciwgbG93LWNhcHBlZCBiYWNrb2ZmIGV4aGF1c3RzIHRoZVxuLy8gYnVkZ2V0IGluIG9ubHkgYSBmZXcgaG91cnMsIGZhaWxpbmcgb3RoZXJ3aXNlLWhlYWx0aHkgcnVucyBkdXJpbmcgYSB0cmFuc2llbnRcbi8vIGJhY2tlbmQgb3V0YWdlOyBjb252ZXJzZWx5LCBzcGFubmluZyB0aGUgZnVsbCAyNGggd2luZG93IHdvdWxkIHJlcXVpcmUgYVxuLy8gc3Vic3RhbnRpYWxseSBoaWdoZXIgY2FwIGhlcmUsIG5vdCBhIGhpZ2hlciBwZXItaG9wIGNlaWxpbmcsIHNpbmNlIFZRU1xuLy8gY2xhbXBzIGV2ZXJ5IGhvcCBhdCA5MDBzLilcbmV4cG9ydCBjb25zdCBNQVhfUVVFVUVfREVMSVZFUklFUyA9IDQ4O1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBtYXggcXVldWUgZGVsaXZlcmllcy4gT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMoKTogbnVtYmVyIHtcbiAgLy8gT25seSBldmVyIGxvd2VyIHRoZSBkZWxpdmVyeSBidWRnZXQuIFRoZSBkZWZhdWx0IGlzIGNhbGlicmF0ZWQgc28gdGhlXG4gIC8vIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGggcnVucyBiZWZvcmUgVlFTIG1lc3NhZ2UtcmV0ZW50aW9uIGV4cGlyeSAoc2VlXG4gIC8vIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFib3ZlKTsgYSBoaWdoZXIgdmFsdWUgd291bGQgYnlwYXNzIHRoYXQgaW52YXJpYW50IGFuZFxuICAvLyBsZXQgYSBiYWQgZGVwbG95bWVudCByZWRlbGl2ZXIgdW50aWwgcXVldWUgZXhwaXJ5IGluc3RlYWQgb2YgcmVjb3JkaW5nXG4gIC8vIHJ1bl9mYWlsLiBgbWF4YCBjbGFtcHMgYSB0b28taGlnaCBvdmVycmlkZSBiYWNrIGRvd24gdG8gdGhlIHNhZmUgZGVmYXVsdC5cbiAgcmV0dXJuIGVudk51bWJlcignV09SS0ZMT1dfTUFYX1FVRVVFX0RFTElWRVJJRVMnLCBNQVhfUVVFVUVfREVMSVZFUklFUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICAgIG1heDogTUFYX1FVRVVFX0RFTElWRVJJRVMsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSB0aW1lIGFsbG93ZWQgZm9yIHRoZSAqcmVwbGF5KiBwb3J0aW9uIG9mIGEgc2luZ2xlIHdvcmtmbG93XG4gKiBoYW5kbGVyIGludm9jYXRpb24gKGluIG1zKS4gVGhpcyBidWRnZXQgb25seSBjb3ZlcnMgZGV0ZXJtaW5pc3RpYy1yZXBsYXlcbiAqIGFuZCB3b3JrZmxvdy1WTSBleGVjdXRpb24gYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMuIElubGluZSBzdGVwIGJvZGllc1xuICogKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9ucyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBkbyBOT1QgY291bnQgYWdhaW5zdFxuICogaXQuIFN0ZXAgYm9kaWVzIGFyZSBib3VuZGVkIHNlcGFyYXRlbHkgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAqIGBtYXhEdXJhdGlvbmAgKGUuZy4gODAwcyBvbiBWZXJjZWwgUHJvIEZsdWlkKSBhbmQgYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgLlxuICpcbiAqIElmIHRoZSBub24tc3RlcCAoXCJyZXBsYXlcIikgdGltZSB3aXRoaW4gYSBzaW5nbGUgaW52b2NhdGlvbiBleGNlZWRzIHRoaXNcbiAqIGJ1ZGdldCwgdGhlIGhhbmRsZXIgcmVqZWN0cyBzbyB0aGUgcXVldWUgY2FuIHJldHJ5LiBBZnRlclxuICogYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGhhdXN0ZWQgYXR0ZW1wdHMgdGhlIHJ1biBpcyBmYWlsZWQgd2l0aFxuICogYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAuXG4gKlxuICogTm90ZSB0aGF0IG9uIFZlcmNlbCBIb2JieSAoc3RhbmRhcmQgZnVuY3Rpb25zKSwgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAqIGlzIDYwcywgd2VsbCBiZWxvdyB0aGlzIGJ1ZGdldCwgc28gdGhlIHBsYXRmb3JtIFNJR1RFUk0gd2lsbCBmaXJlIGZpcnN0XG4gKiBhbmQgdGhlIHF1ZXVlIHdpbGwgcmUtZGVsaXZlciB1bnRpbCB0aGUgdmlzaWJpbGl0eSB3aW5kb3cgZXhwaXJlcy4gV2l0aFxuICogRmx1aWQgQ29tcHV0ZSBvbiBIb2JieSB0aGUgcGVyLWZ1bmN0aW9uIGNlaWxpbmcgcmlzZXMgdG8gMzAwcywgc3RpbGxcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGJ1ZGdldC5cbiAqXG4gKiBPdmVycmlkZSB2aWEgdGhlIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgZW52IHZhciAoY2xhbXBlZCB0b1xuICogYE1JTl9SRVBMQVlfVElNRU9VVF9NU2AuLmBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01TID0gMjQwXzAwMDtcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiA3ODBzIGxlYXZlcyDiiaUyMHMgb2ZcbiAqIGhlYWRyb29tIHVuZGVyIFZlcmNlbCBQcm8gRmx1aWQncyA4MDBzIGZ1bmN0aW9uIGNlaWxpbmcgc28gdGhlIGhhbmRsZXJcbiAqIGNhbiB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVmb3JlIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVQTEFZX1RJTUVPVVRfTVMgPSA3ODBfMDAwO1xuXG4vLyBUcmFjayB3aGljaCByYXcgZW52IHZhciB2YWx1ZXMgd2UndmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQgc28gdGhlIHdhcm5pbmdcbi8vIGxvZyBvbmx5IGZpcmVzIG9uY2UgcGVyIHByb2Nlc3MgKHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1hbnkgdGltZXMpLlxuLy9cbi8vIE9uIGBnbG9iYWxUaGlzYCByYXRoZXIgdGhhbiBhdCBtb2R1bGUgc2NvcGUgc28gXCJvbmNlIHBlciBwcm9jZXNzXCIgc3Vydml2ZXNcbi8vIGJ1bmRsaW5nOiB0aGlzIHBhY2thZ2UgaXMgY29tcGlsZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIHNlcnZlciBidWlsZFxuLy8gb25jZSBwZXIgYnVuZGxlciBsYXllciwgYW5kIHBlci1jb3B5IHNldHMgd2FybiBvbmNlIHBlciBsYXllciBpbnN0ZWFkLlxuY29uc3Qgd2FybmVkID0gZ2xvYmFsU2luZ2xldG9uKCdAd29ya2Zsb3cvY29yZS8vZW52V2FybmluZ3MnLCAxLCAoKSA9PiAoe1xuICByZXBsYXlUaW1lb3V0VmFsdWVzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgbWF4SW5saW5lU3RlcHNWYWx1ZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICBtYXhFdmVudHNWYWx1ZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxufSkpO1xuXG5mdW5jdGlvbiB3YXJuT25jZShcbiAgcmF3OiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQge1xuICBpZiAod2FybmVkLnJlcGxheVRpbWVvdXRWYWx1ZXMuaGFzKHJhdykpIHJldHVybjtcbiAgd2FybmVkLnJlcGxheVRpbWVvdXRWYWx1ZXMuYWRkKHJhdyk7XG4gIHJ1bnRpbWVMb2dnZXIud2FybihtZXNzYWdlLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcmVwbGF5LXRpbWVvdXQgYnVkZ2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIC8gb3V0LW9mLXJhbmdlIHZhbHVlc1xuICogZmFsbCBiYWNrIHRvIGEgc2FmZSB2YWx1ZSAobm8gdGhyb3c6IHRoZSBlbnYgdmFyIGlzIGFuIGVzY2FwZSBoYXRjaCxcbiAqIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQpIGFuZCBlbWl0IGEgb25lLXRpbWUgd2FybmluZyBzbyBtaXNjb25maWd1cmF0aW9uXG4gKiBpcyBvYnNlcnZhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1zKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1JFUExBWV9USU1FT1VUX01TO1xuICBpZiAoIXJhdykgcmV0dXJuIFJFUExBWV9USU1FT1VUX01TO1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPD0gMCkge1xuICAgIHdhcm5PbmNlKFxuICAgICAgcmF3LFxuICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX1JFUExBWV9USU1FT1VUX01TOiBub3QgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgIHsgcmF3LCBkZWZhdWx0TXM6IFJFUExBWV9USU1FT1VUX01TIH1cbiAgICApO1xuICAgIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYmVsb3cgbWluaW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUlOX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWluTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUlOX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIGlmIChwYXJzZWQgPiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMpIHtcbiAgICB3YXJuT25jZShyYXcsICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBhYm92ZSBtYXhpbXVtOyBjbGFtcGVkJywge1xuICAgICAgcmF3LFxuICAgICAgY2xhbXBlZE1zOiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgICBtYXhNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICAgIHJldHVybiBNQVhfUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgd2Fybi1vbmNlIGNhY2hlLiBUZXN0LW9ubHk6IGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuXG4gKiBleGVyY2lzZSB0aGUgd2FybiBwYXRoIHJlcGVhdGVkbHkgd2l0aG91dCBzaGFyaW5nIHN0YXRlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0UmVwbGF5VGltZW91dFdhcm5DYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICB3YXJuZWQucmVwbGF5VGltZW91dFZhbHVlcy5jbGVhcigpO1xufVxuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgcmVqZWN0cyB3aXRob3V0IHdyaXRpbmcgcnVuX2ZhaWxlZCBzbyB0aGUgcXVldWUgcmV0cmllcyB0aGUgbWVzc2FnZS5cbi8vIE9uIHRoZSBuZXh0IGF0dGVtcHQgdGhlIHJ1biBpcyBtYXJrZWQgYXMgZmFpbGVkLlxuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgcmVwbGF5LXRpbWVvdXQgcmV0cnkgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlUaW1lb3V0TWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUycsXG4gICAgUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIHRoZSBvd25lZC1pbmxpbmUgcGF0aCBydW5zIGlubGluZSAoaW5cbiAqIHBhcmFsbGVsKSBwZXIgc3VzcGVuc2lvbi4gVGhlIHJlc3QgYXJlIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLiBFYWNoXG4gKiBpbmxpbmUgc3RlcCBpcyBjcmVhdGVkIGxhemlseSAoaXRzIGBzdGVwX2NyZWF0ZWRgIGlzIGZvbGRlZCBpbnRvIHRoZVxuICogYHN0ZXBfc3RhcnRlZGAgdGhhdCBgZXhlY3V0ZVN0ZXBgIHNlbmRzKSwgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdzogdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWQubWF4SW5saW5lU3RlcHNWYWx1ZXMuaGFzKHJhdykpIHtcbiAgICAgIHdhcm5lZC5tYXhJbmxpbmVTdGVwc1ZhbHVlcy5hZGQocmF3KTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM6IG5vdCBhIHBvc2l0aXZlIGludGVnZXI7IHVzaW5nIGRlZmF1bHQnLFxuICAgICAgICB7IHJhdywgZGVmYXVsdFZhbHVlOiBNQVhfSU5MSU5FX1NURVBTIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIGlmIChwYXJzZWQgPCBNSU5fTUFYX0lOTElORV9TVEVQUykgcmV0dXJuIE1JTl9NQVhfSU5MSU5FX1NURVBTO1xuICBpZiAocGFyc2VkID4gTUFYX01BWF9JTkxJTkVfU1RFUFMpIHtcbiAgICBpZiAoIXdhcm5lZC5tYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkLm1heElubGluZVN0ZXBzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTIGFib3ZlIG1heGltdW07IGNsYW1wZWQnLCB7XG4gICAgICAgIHJhdyxcbiAgICAgICAgY2xhbXBlZFZhbHVlOiBNQVhfTUFYX0lOTElORV9TVEVQUyxcbiAgICAgICAgbWF4VmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIHRoZSBzZXJpYWxpemVkIHN0ZXAgaW5wdXQgdGhhdCByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCB3aWxsXG4gKiBpbmxpbmUgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBzdGVwSW5wdXRgLlxuICpcbiAqIFZlcmNlbCBRdWV1ZXMgaGFzIG5vIGhhcmQgbWVzc2FnZS1zaXplIGNhcCAoYm9kaWVzIGFib3ZlIGl0cyB+MjU2IEtCXG4gKiBpbmxpbmUgdGhyZXNob2xkIHRyYW5zcGFyZW50bHkgc3BpbGwgdG8gUzMtYmFja2VkIHN0b3JhZ2UpLCBzbyB0aGlzIGJvdW5kXG4gKiBpcyBhIGNvc3QvbGF0ZW5jeSBjaG9pY2UsIG5vdCBhIHJlamVjdGlvbiBndWFyZDogdGhlIG1lc3NhZ2UgYWxzbyBjYXJyaWVzXG4gKiB0aGUgcnVuSWQsIHN0ZXBJZCwgc3RlcE5hbWUsIGFuZCB0cmFjZSBjYXJyaWVyIGFsb25nc2lkZSBDQk9SIGZyYW1pbmdcbiAqIG92ZXJoZWFkLCBhbmQgc3RheWluZyB1bmRlciB0aGUgcXVldWUncyBpbmxpbmUgdGhyZXNob2xkIGtlZXBzIHN0ZXBcbiAqIG1lc3NhZ2VzIG9uIGl0cyBmYXN0IGlubGluZSBwYXRoIGluc3RlYWQgb2YgcGF5aW5nIGFuIFMzIHN0b3JlK2ZldGNoXG4gKiBkb3VibGUtaG9wIGZvciBieXRlcyB0aGF0IGFscmVhZHkgbGl2ZSBpbiB0aGUgZXZlbnQgbG9nLiBBYm92ZSB0aGlzIHNpemVcbiAqIHRoZSBkaXNwYXRjaCBmYWxscyBiYWNrIHRvIHRoZSBzZXF1ZW50aWFsIHBhdGggKGBzdGVwX2NyZWF0ZWRgIHdyaXRlLCB0aGVuXG4gKiBhIHBheWxvYWQtbGVzcyBxdWV1ZSBtZXNzYWdlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyA9IDEyOCAqIDEwMjQ7XG5cbi8qKlxuICogV2hldGhlciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCBpcyBlbmFibGVkOiB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gKiBwYXJhbGxlbGl6ZXMgZWFjaCBuZXdseSBjcmVhdGVkIHN0ZXAncyBgc3RlcF9jcmVhdGVkYCBldmVudCB3cml0ZSB3aXRoIGl0c1xuICogc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCwgY2FycnlpbmcgdGhlIHNlcmlhbGl6ZWQgc3RlcCBpbnB1dCBpbiB0aGVcbiAqIHF1ZXVlIG1lc3NhZ2UgKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlXG4gKiBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bklucHV0YCkgcGF0dGVybiAoYW5kIHRoZSBsZWdhY3kgbGF6eSBob29rIHJlc3VtZSdzIGBob29rSW5wdXRgLCB3aGljaFxuICogY3VycmVudCBwcm9kdWNlcnMgbm8gbG9uZ2VyIHNlbmQpLlxuICpcbiAqICoqT2ZmIGJ5IGRlZmF1bHQuKiogRW5hYmxlIHZpYSBgV09SS0ZMT1dfUkVTSUxJRU5UX1NURVBfRElTUEFUQ0g9MWAuXG4gKlxuICogVGhlIHF1ZXVlIHB1Ymxpc2ggcmFjZXMgdGhlIGNyZWF0ZSdzIHZlcmRpY3QsIGFuZCBhIGNyZWF0ZSBjYW4gY29tZSBiYWNrXG4gKiByZWZ1c2VkOiBhcyBhIGR1cGxpY2F0ZSB0aGlzIHJlcGxheSBzaG91bGQgc3RvcCBwdXJzdWluZywgb3IgYXMgYSBzdGFsZVxuICogd3JpdGUgb24gYSBXb3JsZCB0aGF0IHJlZnVzZXMgcmF0aGVyIHRoYW4gcmVwb3J0cy4gRWl0aGVyIHdheSB0aGUgbWVzc2FnZVxuICogY2FycnlpbmcgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBvdXQsIHNvIHRoZSBjb25zdW1lciBjYW4gbWF0ZXJpYWxpemUgYSBzdGVwXG4gKiB3aG9zZSBjcmVhdGUgd2FzIHJlZnVzZWQsIGFuZCBub3RoaW5nIG9yZGVycyB0aGUgdmVyZGljdCBiZWZvcmUgdGhlXG4gKiBjb25zdW1lcidzIHJlZGVsaXZlcnkgcmUtZW5zdXJlLiBFbmFibGluZyB0aGlzIHRyYWRlcyB0aGF0IHdpbmRvdyBmb3IgdGhlXG4gKiBsYXRlbmN5IHRoZSBwYXJhbGxlbCBwdWJsaXNoIHNhdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVTSUxJRU5UX1NURVBfRElTUEFUQ0ggPT09ICcxJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGJhdGNoZWQgZXZlbnQgdHJhbnNpdGlvbnMgYXJlIGVuYWJsZWQ6IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZm9sZHNcbiAqIGEgY2xlYW4gZmFuLW91dCdzIGBzdGVwX2NyZWF0ZWRgICsgYHdhaXRfY3JlYXRlZGAgd3JpdGVzIGludG8gb25lXG4gKiBgd29ybGQuZXZlbnRzLmNyZWF0ZUJhdGNoYCBjYWxsIChvbmUgZHVyYWJsZSB3cml0ZSwgcGVyLWV2ZW50IG91dGNvbWVzKVxuICogaW5zdGVhZCBvZiBvbmUgd3JpdGUgcGVyIGV2ZW50LiBPbmx5IGVuZ2FnZXMgd2hlbiB0aGUgV29ybGQgaW1wbGVtZW50cyB0aGVcbiAqIG9wdGlvbmFsIGBldmVudHMuY3JlYXRlQmF0Y2hgIEFORCB0aGUgcnVuIGlzIG9uIHNsb3QgaWRlbnRpdHlcbiAqIChzcGVjVmVyc2lvbiA+PSA2KSBBTkQgdGhlIHN1c3BlbnNpb24gY2FycmllcyBubyBhdHRyaWJ1dGUvaG9vayB3cml0ZXMgYW5kXG4gKiBubyByZXNpbGllbnQgc3RlcCBkaXNwYXRjaC4gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoZSBzaW5nbGUtZXZlbnQgcGF0aFxuICogYnl0ZS1mb3ItYnl0ZS5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfQkFUQ0hfVFJBTlNJVElPTlNgIGxhemlseS4gRGVmYXVsdCAqKk9OKio7XG4gKiBkaXNhYmxlZCBvbmx5IGJ5IGFuIGV4cGxpY2l0IGAnMCdgIC8gYCdmYWxzZSdgIChjYXNlLWluc2Vuc2l0aXZlKSwgdGhlXG4gKiBvcGVyYXRvciBlc2NhcGUgaGF0Y2ggdGhhdCByZXN0b3JlcyB0aGUgZXhhY3QgcHJpb3Igb25lLXdyaXRlLXBlci1ldmVudFxuICogcGF0aCwgbWlycm9yaW5nIGBXT1JLRkxPV19UVVJCT2AncyBraWxsLXN3aXRjaCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX0JBVENIX1RSQU5TSVRJT05TO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBDZWlsaW5nIG9uIGV2ZW50cyBwZXIgYGNyZWF0ZUJhdGNoYCBjYWxsIGZyb20gdGhlIGJhdGNoZWQgZmFuLW91dCBmb2xkLlxuICogTWlycm9ycyB0aGUgc2VydmVyJ3MgdHJhbnNhY3Rpb24gYnVkZ2V0cyB3aXRoIGEgY29tZm9ydGFibGUgbWFyZ2luOiBlYWNoXG4gKiBmYW4tb3V0IGV2ZW50IGNvc3RzIDIgdHJhbnNhY3Rpb24gaXRlbXMgc2VydmVyLXNpZGUgKGVudGl0eSArIGV2ZW50IHJvdylcbiAqIGFnYWluc3QgdGhlIDEwMC1pdGVtIER5bmFtb0RCIGNhcCwgYW5kIGlubGluZSBwYXlsb2FkcyBjb3VudCBhZ2FpbnN0IGFcbiAqIDc2OCBLQiBieXRlIGJ1ZGdldCwgc28gMzIgZXZlbnRzIHN0YXlzIHdlbGwgdW5kZXIgYm90aCwgYW5kIGEgZmFuLW91dCBsYXJnZXJcbiAqIHRoYW4gdGhpcyBjb21taXRzIGluIHN1Y2Nlc3NpdmUgYmF0Y2hlcyAoc3BsaXQgYmF0Y2hlcyBsb3NlXG4gKiBjcm9zcy1iYXRjaCBhdG9taWNpdHksIHdoaWNoIGlzIGV4YWN0bHkgdG9kYXkncyBwZXItZXZlbnQtd3JpdGUgY3Jhc2hcbiAqIHN1cmZhY2UsIGFuZCBldmVyeSBiYXRjaCBzdGlsbCBjb252ZXJnZXMgb24gcmV0cnkgdmlhIHBlci1ldmVudCA0MDlzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTID0gMzI7XG5cbi8qKlxuICogT3B0aW9uYWwgY2xpZW50LXNpZGUgb3ZlcnJpZGUgZm9yIHRoZSBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nLlxuICogV2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgcnVudGltZSBjbGFtcHMgdGhlIHNlcnZlcidzIGxpbWl0ICpkb3duKlxuICogdG8gdGhpcyB2YWx1ZSAobmV2ZXIgcmFpc2VzIGl0KSBzbyBlbmZvcmNlbWVudCBjYW4gYmUgZXhlcmNpc2VkIHdpdGhvdXQgYVxuICogc2VydmVyLXNpZGUgY2hhbmdlLiBgdW5kZWZpbmVkYCAodW5zZXQpIOKHkiB1c2UgdGhlIHNlcnZlciB2YWx1ZSBhcy1pcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERWAgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIHZhbHVlcyBmYWxsIGJhY2sgdG8gdW5zZXRcbiAqIChubyB0aHJvdzogdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhFdmVudHNPdmVycmlkZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWQubWF4RXZlbnRzVmFsdWVzLmhhcyhyYXcpKSB7XG4gICAgICB3YXJuZWQubWF4RXZlbnRzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSWdub3JpbmcgV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERTogbm90IGEgcG9zaXRpdmUgaW50ZWdlcjsgdXNpbmcgc2VydmVyIGxpbWl0JyxcbiAgICAgICAgeyByYXcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBpcyBlbmFibGVkLiBXaGVuIG9uLCB0aGUgb3duZWQtaW5saW5lXG4gKiBwYXRoIGJlZ2lucyBydW5uaW5nIGEgYnJhbmQtbmV3IHN0ZXAncyBib2R5ICpiZWZvcmUqIGl0cyBsYXp5IGBzdGVwX3N0YXJ0ZWRgXG4gKiBuZXR3b3JrIGNhbGwgcmVzb2x2ZXMgKHRoZSBpbnB1dCBpcyBhbHJlYWR5IGtub3duIGxvY2FsbHkpLCBhd2FpdGluZyB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIG9ubHkgYmVmb3JlIHRoZSB0ZXJtaW5hbCB3cml0ZS5cbiAqXG4gKiBUaGlzIGNhbiBydW4gYSBzdGVwIGJvZHkgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlIGZvciB0aGUgc2FtZVxuICogc3RlcCdzIGNyZWF0ZS1jbGFpbTogYm90aCBydW4gdGhlIGJvZHkgYmVmb3JlIG9uZSB3aW5zLiBUaGF0IGlzIHVuc2FmZSBmb3JcbiAqIHN0ZXBzIHdpdGggbm9uLWlkZW1wb3RlbnQgc2lkZSBlZmZlY3RzOyBpbiBwYXJ0aWN1bGFyLCB0d28gY29uY3VycmVudCBydW5zXG4gKiBvZiBhIHN0ZXAgdGhhdCB3cml0ZXMgdG8gdGhlIHdvcmtmbG93IHN0cmVhbSAoZS5nLiBhbiBBSSBhZ2VudCBzdHJlYW1pbmdcbiAqIHRva2VucykgY2FuIGludGVybGVhdmUgYW5kIGNvcnJ1cHQgdGhlIHN0cmVhbSBkYXRhLiBTbyB0aGUgb3B0aW1pemF0aW9uIGlzXG4gKiAqKm9mZiBieSBkZWZhdWx0KiogYW5kIG11c3QgYmUgZXhwbGljaXRseSBvcHRlZCBpbnRvIHBlciBkZXBsb3ltZW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAgbGF6aWx5LiBEZWZhdWx0IE9GRjtcbiAqIGVuYWJsZWQgb25seSBieSBhbiBleHBsaWNpdCBgJzEnYCAvIGAndHJ1ZSdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJhdyA9PT0gJzEnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBvcGVyYXRvciBoYXMgKipleHBsaWNpdGx5IGRpc2FibGVkKiogb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgdmlhXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MGAgLyBgPWZhbHNlYC4gRGlzdGluY3QgZnJvbSBcInVuc2V0XCI6IHVuc2V0XG4gKiBsZWF2ZXMgdGhlIG9wdGltaXphdGlvbiBvZmYgYnkgZGVmYXVsdCBidXQgbGV0cyB0dXJibyBmb3JjZSBpdCBvbjsgYW4gZXhwbGljaXRcbiAqIGAwYC9gZmFsc2VgIGlzIGFuIG9wZXJhdG9yIG9wdC1vdXQgdGhhdCB0dXJibyBtdXN0IGhvbm9yICh0dXJibydzIGZvcmNlZFxuICogb3B0aW1pc3RpYyBzdGFydCBzdGlsbCBydW5zIGEgc3RlcCBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gKiBjb25maXJtZWQsIHRoZSBwcm9wZXJ0eSBzdWNoIGFuIG9wZXJhdG9yIGlzIG9wdGluZyBvdXQgb2YpLCBzb1xuICogYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCBkZWZlcnMgdG8gdGhpcy4gUmVhZHMgdGhlIGVudiB2YXIgbGF6aWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBcInR1cmJvIG1vZGVcIiBpcyBlbmFibGVkLiBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlICpmaXJzdCBkZWxpdmVyeSBvZlxuICogdGhlIGZpcnN0IGludm9jYXRpb24qIG9mIGEgcnVuIChkZXRlY3RlZCBieSB0aGUgZW50cnlwb2ludCB2aWEgYHJ1bklucHV0YFxuICogcHJlc2VuY2UgKyBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWApOiBpdCBiYWNrZ3JvdW5kcyB0aGUgYHJ1bl9zdGFydGVkYCBldmVudFxuICogY3JlYXRpb24sIHNraXBzIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0KSxcbiAqIGFuZCBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBmb3IgdGhhdCBpbnZvY2F0aW9uLCBpbmRlcGVuZGVudCBvZlxuICogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYC5cbiAqXG4gKiBGb3JjaW5nIG9wdGltaXN0aWMgc3RhcnQgaXMgc2FmZSBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IGRlbGl2ZXJ5IGhhcyBub1xuICogY29uY3VycmVudCBwZWVyIGhhbmRsZXIgdG8gcmFjZSB0aGUgc3RlcCBjcmVhdGUtY2xhaW0sIHNvIGEgc3RlcCBib2R5IHJ1bnNcbiAqIGV4YWN0bHkgb25jZS4gVGhhdCBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZW5kcyBhcyBzb29uIGFzIHRoZSBydW4gY3JlYXRlcyBhXG4gKiBob29rIG9yIHdhaXQgKHdoaWNoIGludHJvZHVjZSByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMpLCBzbyB0aGUgcnVudGltZVxuICogZXhpdHMgdHVyYm8gYXQgdGhhdCBwb2ludC5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFVSQk9gIGxhemlseS4gRGVmYXVsdCAqKk9OKio7IGRpc2FibGVkIG9ubHkgYnkgYW5cbiAqIGV4cGxpY2l0IGAnMCdgIC8gYCdmYWxzZSdgIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHVyYm9FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCTztcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgUXVpY2tKUyBlbmdpbmUncyBiYXNlbGluZS1zbmFwc2hvdCBzdGFydHVwIG9wdGltaXphdGlvbiBpc1xuICogZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBlbmdpbmUgaHlkcmF0ZXMgYSBWTSB3aXRoIHRoZVxuICogd29ya2Zsb3cgYnVuZGxlIG9uY2UgcGVyIGZ1bmN0aW9uIGluc3RhbmNlLCBzbmFwc2hvdHMgaXQsIGFuZCBzdGFydHNcbiAqIGV2ZXJ5IGludm9jYXRpb24gYnkgcmVzdG9yaW5nIHRoZSBzbmFwc2hvdCBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRpbmdcbiAqIHRoZSBidW5kbGUsIHNraXBwaW5nIHRoZSBkb21pbmFudCBzaGFyZSBvZiBWTSBzdGFydHVwIChtZWFzdXJlZFxuICogfjc3bXMg4oaSIH4zbXMgdG8gZmlyc3Qgc3VzcGVuc2lvbiBmb3IgYSAxLjNNQiBidW5kbGUpLiBCdW5kbGVzIHdob3NlXG4gKiBtb2R1bGUgc2NvcGUgY29uc3VtZXMgcmFuZG9tbmVzcywgcmVhZHMgdGhlIGNsb2NrLCBvciByZXBsYWNlcyBhXG4gKiBzZXJpYWxpemF0aW9uIGludHJpbnNpYyBhcmUgZGV0ZWN0ZWQgYXQgaHlkcmF0ZSB0aW1lIGFuZFxuICogYXV0b21hdGljYWxseSBmYWxsIGJhY2sgdG8gcGVyLWludm9jYXRpb24gZnJlc2ggZXZhbHVhdGlvbiAoc2VlXG4gKiBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCkuIFNldCBXT1JLRkxPV19RVUlDS0pTX0JBU0VMSU5FX1NOQVBTSE9UPTAgdG9cbiAqIGRpc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUVVJQ0tKU19CQVNFTElORV9TTkFQU0hPVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5saW5lIGxvb3AgcmV0YWlucyBhIHN1c3BlbmRlZCB3b3JrZmxvdyBWTSBhY3Jvc3MgaW5saW5lIHN0ZXBzXG4gKiB3aXRoaW4gb25lIGludm9jYXRpb24gKGRlZmF1bHQgT04pLiBXaGVuIG9uLCBhIHN0ZXAtb25seSBzdXNwZW5zaW9uIGtlZXBzXG4gKiB0aGUgbGl2ZSBWTSwgZXZlbnQgY29uc3VtZXIsIGFuZCBoeWRyYXRlZCBzdGF0ZSBhbGl2ZSwgYW5kIHRoZSBuZXh0IGxvb3BcbiAqIGl0ZXJhdGlvbiBhcHBlbmRzIG9ubHkgdGhlIG5ld2x5IGR1cmFibGUgZXZlbnRzIGluc3RlYWQgb2YgcmVidWlsZGluZyB0aGVcbiAqIGB2bS5Db250ZXh0YCBhbmQgcmVwbGF5aW5nIHRoZSB3aG9sZSBldmVudCBsb2cuIE5vbi1zdGVwIHN1c3BlbnNpb25zIGFuZFxuICogcmVwbGF5IGRpdmVyZ2VuY2UgYWx3YXlzIGZhbGwgYmFjayB0byB0aGUgb3JkaW5hcnkgZHVyYWJsZSByZXBsYXkgcGF0aC5cbiAqXG4gKiBgV09SS0ZMT1dfUkVUQUlORURfVk09MGAgKG9yIGBmYWxzZWApIGlzIHRoZSBraWxsIHN3aXRjaDogZXZlcnkgaXRlcmF0aW9uXG4gKiByZXBsYXlzIGZyb20gc2NyYXRjaCBpbiBhIGZyZXNoIFZNLCBtYXRjaGluZyB0aGUgcHJlLXJldGVudGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm1SZXRlbnRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVRBSU5FRF9WTTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciBpbmxpbmUgc3RlcCBvd25lcnNoaXAgaXMgZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBsYXp5XG4gKiBgc3RlcF9zdGFydGVkYCB0aGF0IGNyZWF0ZXMgYW4gaW5saW5lIHN0ZXAgcmVjb3JkcyB0aGUgb3duaW5nIHF1ZXVlXG4gKiBtZXNzYWdlIElELCBhbmQgd2FrZSByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIGVucXVldWUgYVxuICogKmRlbGF5ZWQgYmFja3N0b3AqIG1lc3NhZ2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIGl0LCBmaXhpbmdcbiAqIGR1cGxpY2F0ZSBpbmxpbmUgc3RlcCBleGVjdXRpb24gd2hlbiBhIGhvb2svd2FpdCB3YWtlcyBhIHJ1biBtaWQtc3RlcFxuICogKHZlcmNlbC93b3JrZmxvdyMyNzgwKS5cbiAqXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUD0wYCAob3IgYGZhbHNlYCkgaXMgdGhlIGtpbGwgc3dpdGNoOiBkaXNwYXRjaFxuICogcmV2ZXJ0cyB0byB0aGUgdW5jb25kaXRpb25hbCBpbW1lZGlhdGUgcmVxdWV1ZS4gU3RhbXBpbmcgaXMgdW5hZmZlY3RlZDpcbiAqIHRoZSByZWNvcmRlZCBvd25lck1lc3NhZ2VJZCBpcyBpbmVydCBkYXRhIHdoZW4gdGhlIHN3aXRjaCBpcyBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX0lOTElORV9PV05FUlNISVA7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgaW5saW5lLW93bmVyc2hpcCBsZWFzZSwgaW4gc2Vjb25kczogaG93IGxvbmcgYWZ0ZXIgYSBzdGVwJ3MgbGF0ZXN0XG4gKiAoc3RhbXBlZCkgYHN0ZXBfc3RhcnRlZGAgYSBub24tb3duZXIgaW52b2NhdGlvbiBhc3N1bWVzIHRoZSBvd25pbmdcbiAqIGludm9jYXRpb24gbWF5IHN0aWxsIGJlIGFsaXZlLiBXaXRoaW4gdGhlIGxlYXNlLCB3YWtlIHJlcGxheXMgZW5xdWV1ZSB0aGVcbiAqIHN0ZXAncyBiYWNrc3RvcCBtZXNzYWdlIHdpdGggYGRlbGF5U2Vjb25kcyA9IGxlYXNlIHJlbWFpbmluZ2AgaW5zdGVhZCBvZlxuICogaW1tZWRpYXRlbHk7IHBhc3QgaXQsIHRoZXkgZW5xdWV1ZSBpbW1lZGlhdGVseSAodG9kYXkncyBiZWhhdmlvcikuXG4gKlxuICogV2h5IGEgZml4ZWQgODYwIGFuZCBub3QgYSB2YWx1ZSBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uJ3MgYG1heER1cmF0aW9uYDpcbiAqIG5laXRoZXIgcnVudGltZSBub3IgYnVpbGQgdGltZSBjYW4gc2VlIHRoZSByZXNvbHZlZCB2YWx1ZTogYnVpbGRlcnMgZW1pdFxuICogYG1heER1cmF0aW9uOiAnbWF4J2AsIHdoaWNoIHRoZSBwbGF0Zm9ybSByZXNvbHZlcyBwZXItcGxhbiBhdCBkZXBsb3ksIGFuZFxuICogbm8gZW52IHZhciBvciByZXF1ZXN0LWNvbnRleHQgZGVhZGxpbmUgQVBJIGV4cG9zZXMgdGhlIHJlc3VsdC4gVGhlIGJvdW5kXG4gKiBjb21lcyBmcm9tIGEgcGxhdGZvcm0gcnVsZSBpbnN0ZWFkOiBkdXJhdGlvbnMgYWJvdmUgODAwcyByZXF1aXJlIGV4cGxpY2l0XG4gKiBwZXItZnVuY3Rpb24gbnVtZXJpYyBjb25maWcsIHNvIGEgYnVpbGRlci1lbWl0dGVkIGAnbWF4J2AgcmVzb2x2ZXMgdG8gYXRcbiAqIG1vc3QgODAwcywgYW5kIDg2MHMgdGhlcmVmb3JlIGRvbWluYXRlcyBhbnkgd29ya2Zsb3cgcm91dGUncyBpbnZvY2F0aW9uXG4gKiBsaWZldGltZSBwbHVzIHNjaGVkdWxpbmcgc2xhY2suIFJldmlzaXQgd2hlbiB0aGF0IGNlaWxpbmcgbW92ZXMgKHRoZVxuICogMzAtbWludXRlIGR1cmF0aW9uIGJldGEgYmVjb21pbmcgcmVhY2hhYmxlIHZpYSBgJ21heCdgIHdvdWxkIGludmFsaWRhdGVcbiAqIHRoZSBib3VuZCkuIFdvcmxkcyB3aXRob3V0IGFuIGludm9jYXRpb24ga2lsbCBib3VuZCAod29ybGQtbG9jYWwsXG4gKiBzZWxmLWhvc3RlZCkgZ2V0IG5vIGRlYXRoIHByb29mIGZyb20gYW55IGNvbnN0YW50LiBUaGVyZSB0aGUgaW4tcHJvY2Vzc1xuICogc2luZ2xlLWZsaWdodCBsYXllciAoc3RlcC1zaW5nbGUtZmxpZ2h0LnRzKSBpcyB3aGF0IG1ha2VzIGEgYmFja3N0b3BcbiAqIGZpcmluZyBtaWQtc3RlcCBoYXJtbGVzcy5cbiAqXG4gKiA4NjAgYWxzbyBzdGF5cyB1bmRlciB0aGUgcXVldWUncyA5MDBzIG1heGltdW0gZGVsYXkgKFNRUyBjYXApLCBzbyBhXG4gKiBiYWNrc3RvcCdzIGZ1bGwgbGVhc2UgcmVtYWluZGVyIGFsd2F5cyBmaXRzIGluIGEgc2luZ2xlIGRlbGF5ZWQgbWVzc2FnZS5cbiAqXG4gKiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2AgKGNsYW1wZWQgdG9cbiAqIDEuLmBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA4NjA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSBsZWFzZSBlbnYgb3ZlcnJpZGUuIDkwMHMgaXMgdGhlIHF1ZXVlJ3MgbWF4aW11bVxuICogcGVyLW1lc3NhZ2UgZGVsYXkgKFNRUyBjYXApLiBBIGxvbmdlciBsZWFzZSB3b3VsZCBuZWVkIGRlbGF5IGNoYWluaW5nXG4gKiBsaWtlIGxvbmcgd2FpdHMgdXNlOyBjbGFtcCBpbnN0ZWFkIHNvIG9uZSBkZWxheWVkIG1lc3NhZ2UgYWx3YXlzIHN1ZmZpY2VzLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyA9IDkwMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgaW5saW5lLW93bmVyc2hpcCBsZWFzZS4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCwgZS5nLiByYWlzZSBpdCBvbiBzZWxmLWhvc3RlZFxuICogbXVsdGktaW5zdGFuY2Ugd29ybGRzIHdpdGggbG9uZy1ydW5uaW5nIHN0ZXBzIHRvIHdpZGVuIHRoZSB3aW5kb3cgaW4gd2hpY2hcbiAqIGEgbGl2ZSBvd25lciBpcyBwcm90ZWN0ZWQgZnJvbSBhIGNvbmN1cnJlbnQgYmFja3N0b3AgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUycsXG4gICAgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxLCBtYXg6IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgfVxuICApO1xufVxuXG4vLyBBIHJlcGxheS1jb25zdW1lciBtaXNtYXRjaCBjYW4gYmUgY2F1c2VkIGJ5IGEgdHJhbnNpZW50IGRpdmVyZ2VudCByZXBsYXlcbi8vIHJhdGhlciB0aGFuIGFuIGludmFsaWQgcGVyc2lzdGVkIGhpc3RvcnkuIFF1ZXVlIGJvdW5kZWQgcmVjb3ZlcnkgcmVwbGF5c1xuLy8gYmVmb3JlIHJlY29yZGluZyB0ZXJtaW5hbCBjb3JydXB0aW9uIGZvciBhIHJ1biB0aGF0IGNhbm5vdCByZXBsYXkuXG5leHBvcnQgY29uc3QgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSByZXBsYXktZGl2ZXJnZW5jZSByZWNvdmVyeSBidWRnZXQuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTJyxcbiAgICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBBIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiAoNDEyKSBtZWFucyB0aGUgcmVwbGF5J3MgZXZlbnQgbG9nIHdhcyBtaXNzaW5nIGFuXG4vLyBldmVudCB0aGUgV29ybGQgaGFkIGFscmVhZHkgcmVjb3JkZWQsIHNvIHRoZSByZXBsYXkgaXMgcmUtZGVyaXZlZCBmcm9tIGFcbi8vIGNvcnJlY3RlZCBsb2cgaW5zaWRlIHRoZSBzYW1lIGludm9jYXRpb24uIEJvdW5kZWQgYmVjYXVzZSBhIHBlcnNpc3RlbnRseVxuLy8gcmVqZWN0ZWQgd3JpdGUgc2hvdWxkIGVzY2FsYXRlIHJhdGhlciB0aGFuIHNwaW46IGFmdGVyIHRoaXMgbWFueSByZXN0YXJ0cyB0aGVcbi8vIHJ1biBpcyByZS1pbnZva2VkIChhIG5ldyBpbnZvY2F0aW9uLCBwb3NzaWJseSBpbiBhIGRpZmZlcmVudCByZWdpb24pLCBhbmQgdGhlXG4vLyBydW4tbGV2ZWwgYnVkZ2V0IGJlbG93IHRoZW4gYXBwbGllcy5cbmV4cG9ydCBjb25zdCBQUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIGluLXByb2Nlc3MgcmVwbGF5LXJlc3RhcnQgYnVkZ2V0IGZvciBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb25zLlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUycsXG4gICAgUFJFQ09ORElUSU9OX01BWF9JTlBST0NFU1NfUkVTVEFSVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLy8gVGhlIGluLXByb2Nlc3MgYnVkZ2V0IGFib3ZlIGlzIHBlci1pbnZvY2F0aW9uLCBhbmQgYSByZS1pbnZvY2F0aW9uIHRoYXRcbi8vIGVucXVldWVzIGEgZnJlc2ggbWVzc2FnZSBhbHNvIHJlc3RhcnRzIHRoZSBxdWV1ZSdzIGRlbGl2ZXJ5IGNvdW50LCBzbyB3aXRob3V0XG4vLyBhIGNvdW50ZXIgY2FycmllZCBvbiB0aGUgbWVzc2FnZSBhIHBlcm1hbmVudGx5IGZlbmNlZCBydW4gaGFzIG5vIHJ1bi1sZXZlbFxuLy8gYm91bmQgYXQgYWxsLiBJdCBjYW4gc3RheSBmZW5jZWQgd2l0aG91dCBhbnkgcGVybWFuZW50IGZhdWx0IChhIGZ1bGwgcmVsb2FkXG4vLyBpcyBub3QgYXRvbWljIGFjcm9zcyBwYWdlcywgc28gYSBidXN5IHJ1biBjYW4gYWNxdWlyZSBhIG5ldyBob2xlIG9uIGV2ZXJ5XG4vLyByZWxvYWQpLCBzbyB0aGUgY2hhaW4gaXMgY291bnRlZCBhbmQgdGhlIHJ1biBmYWlscyBvbmNlIHRoaXMgbWFueVxuLy8gcmUtaW52b2NhdGlvbnMgaGF2ZSBiZWVuIHNwZW50IG9uIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbnMuXG5leHBvcnQgY29uc3QgUFJFQ09ORElUSU9OX01BWF9SRUlOVk9DQVRJT05TID0gNTtcblxuLyoqXG4gKiBFZmZlY3RpdmUgcGVyLXJ1biBidWRnZXQgZm9yIHJlLWludm9jYXRpb25zIGNhdXNlZCBieSBzdGFsZS1zbmFwc2hvdFxuICogcmVqZWN0aW9ucy4gT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlMnLFxuICAgIFBSRUNPTkRJVElPTl9NQVhfUkVJTlZPQ0FUSU9OUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBCYWNrb2ZmIGJlZm9yZSBhIHByZWNvbmRpdGlvbiByZS1pbnZvY2F0aW9uLiBVbmxpa2UgdGhlIGluLXByb2Nlc3MgcmVzdGFydFxuLy8gKHdoZXJlIHRoZSBwb2ludCBpcyB0byByZS1yZWFkIGltbWVkaWF0ZWx5KSwgYSByZS1pbnZvY2F0aW9uIG9ubHkgaGFwcGVuc1xuLy8gYWZ0ZXIgdGhlIGluLXByb2Nlc3MgYnVkZ2V0IGZhaWxlZCB0byBjYXRjaCB1cCwgc28gdGhlIGxvZyBpcyBiZWluZyBleHRlbmRlZFxuLy8gZmFzdGVyIHRoYW4gdGhpcyByZXBsYXkgY2FuIGZvbGxvdyBpdC4gV2FpdGluZyBsZXRzIHRoZSB3cml0ZXJzIHF1aWVzY2UuXG5leHBvcnQgY29uc3QgUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFMgPSAyO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWxheSBiZWZvcmUgYSBwcmVjb25kaXRpb24gcmUtaW52b2NhdGlvbi4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFMnLFxuICAgIFBSRUNPTkRJVElPTl9SRUlOVk9LRV9ERUxBWV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8vIEEgZGVsaXZlcnkgcmVhY2hpbmcgYSBkZXBsb3ltZW50IHRoZSBydW4gaXMgbm90IHBpbm5lZCB0byBpcyBub3QgdHJlYXRlZCBhc1xuLy8gcGVybWFuZW50LiBSZS1yb3V0ZSB0aGUgbWVzc2FnZSBhdCB0aGUgcnVuJ3Mgb3duIGRlcGxveW1lbnQgYSBib3VuZGVkIG51bWJlclxuLy8gb2YgdGltZXMgYmVmb3JlIGZhaWxpbmcgdGhlIHJ1biB3aXRoIERFUExPWU1FTlRfTUlTTUFUQ0guXG5leHBvcnQgY29uc3QgREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlcGxveW1lbnQtbWlzbWF0Y2ggcmUtcm91dGUgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19ERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTYDsgYDBgIGZhaWxzIHRoZSBydW4gb24gdGhlIGZpcnN0XG4gKiBtaXNyb3V0ZWQgZGVsaXZlcnkgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHJlY292ZXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwbG95bWVudE1pc21hdGNoTWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19ERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTJyxcbiAgICBERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAwIH1cbiAgKTtcbn1cbiJdfQ==
@@ -39,11 +39,11 @@ export interface HealthCheckResult {
39
39
  * version at which the *consumer* (queue-message target) materializes the
40
40
  * `hook_received` event from `hookInput` on replay. A cross-deployment
41
41
  * `start()` stamps the *target's* value (not the caller's) into the new
42
- * run's `executionContext.hookResumeInputVersion` so that `resumeHook()`
43
- * only takes the lazy path when the deployment that will actually consume
44
- * the queue message is known to honor `hookInput`. Omitted when the
45
- * responding deployment predates this field (an older consumer that ignores
46
- * `hookInput`), which fails the gate closed.
42
+ * run's `executionContext.hookResumeInputVersion`. Current producers write
43
+ * the event durably before publishing the wake and do not read the marker;
44
+ * OLDER producers still gate their lazy path on it, so it keeps being
45
+ * stamped. Omitted when the responding deployment predates this field,
46
+ * which fails that gate closed.
47
47
  */
48
48
  hookResumeInputVersion?: number;
49
49
  }
@@ -382,34 +382,15 @@ export declare function getQueueOverhead(message: {
382
382
  [k: string]: number;
383
383
  } | undefined;
384
384
  /**
385
- * Returns a memoized accessor for a run's full encryption capability.
386
- *
387
- * The first call resolves the run's key material via
388
- * `world.getEncryptionKeyForRun` (which may do HKDF derivation locally on
389
- * Vercel, or a network fetch from external contexts) and derives a
390
- * {@link PayloadKey} from it; subsequent calls await the same cached promise.
391
- * If the world doesn't support encryption or the run has no key configured,
392
- * the cached value is `undefined`.
393
- *
394
- * The resolved value is deliberately the *full* capability (the symmetric AES
395
- * key plus the run's X25519 keypair), not just a `CryptoKey`. A run reading
396
- * its own event log can encounter sealed (`encp`) payloads that another run
397
- * wrote to it (a cross-deployment hook resumption, say), and opening those
398
- * needs the keypair. Resolving only the symmetric key would leave those
399
- * payloads unopenable and wedge the run.
400
- *
401
- * Used by step / workflow handlers to defer the (potentially expensive)
402
- * key fetch until the first code path that actually needs it: typically
403
- * input hydration on the success path, or error dehydration on a failure
404
- * path. Both paths can race-call the accessor without triggering duplicate
405
- * fetches.
406
- *
407
- * Errors thrown by `getEncryptionKeyForRun` propagate to every caller
408
- * (the cached promise rejects). This is intentional: when encryption is
409
- * configured, we never want to silently fall back to plaintext
410
- * serialization. A propagated error in an event-emission path leaves the
411
- * outer try/catch to log and surface the issue; the queue's redelivery
412
- * semantics will retry the key fetch on the next attempt.
385
+ * Resolve the run's full payload-encryption capability. This includes the
386
+ * symmetric key and X25519 keypair needed to open cross-run sealed payloads.
387
+ * Missing world support or key material resolves to `undefined`; lookup and
388
+ * derivation failures propagate rather than silently falling back to plaintext.
389
+ */
390
+ export declare function resolveRunEncryptionKey(world: World, runOrId: WorkflowRun | string, context?: Record<string, unknown>): Promise<PayloadKey | undefined>;
391
+ /**
392
+ * Return a lazy, memoized accessor around {@link resolveRunEncryptionKey}.
393
+ * Concurrent callers share the same promise, including its rejection.
413
394
  */
414
395
  export declare function memoizeEncryptionKey(world: World, runOrId: WorkflowRun | string): () => Promise<PayloadKey | undefined>;
415
396
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}