@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44

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 (220) hide show
  1. package/dist/capabilities.d.ts +4 -4
  2. package/dist/capabilities.js +5 -5
  3. package/dist/capture-stack.d.ts +1 -1
  4. package/dist/capture-stack.js +2 -2
  5. package/dist/class-serialization.d.ts +8 -8
  6. package/dist/class-serialization.js +9 -9
  7. package/dist/classify-error.js +5 -5
  8. package/dist/context-violation-error.d.ts +5 -5
  9. package/dist/context-violation-error.d.ts.map +1 -1
  10. package/dist/context-violation-error.js +5 -5
  11. package/dist/create-hook.d.ts +10 -6
  12. package/dist/create-hook.d.ts.map +1 -1
  13. package/dist/create-hook.js +1 -1
  14. package/dist/define-hook.js +2 -2
  15. package/dist/describe-error.d.ts +7 -7
  16. package/dist/describe-error.js +8 -8
  17. package/dist/encryption.d.ts +5 -5
  18. package/dist/encryption.js +7 -7
  19. package/dist/events-consumer.d.ts +19 -7
  20. package/dist/events-consumer.d.ts.map +1 -1
  21. package/dist/events-consumer.js +33 -12
  22. package/dist/flushable-stream.d.ts +4 -4
  23. package/dist/flushable-stream.js +12 -12
  24. package/dist/global.d.ts +1 -1
  25. package/dist/global.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/log-format.d.ts +2 -2
  29. package/dist/log-format.js +5 -5
  30. package/dist/logger.js +4 -4
  31. package/dist/private.d.ts +39 -64
  32. package/dist/private.d.ts.map +1 -1
  33. package/dist/private.js +294 -48
  34. package/dist/replay-payload-cache.d.ts +1 -1
  35. package/dist/replay-payload-cache.js +4 -4
  36. package/dist/runtime/compute-instance.d.ts +4 -3
  37. package/dist/runtime/compute-instance.d.ts.map +1 -1
  38. package/dist/runtime/compute-instance.js +5 -4
  39. package/dist/runtime/constants.d.ts +46 -19
  40. package/dist/runtime/constants.d.ts.map +1 -1
  41. package/dist/runtime/constants.js +76 -38
  42. package/dist/runtime/count-step-started-events.d.ts +7 -7
  43. package/dist/runtime/count-step-started-events.js +4 -4
  44. package/dist/runtime/deployment-guard.d.ts +7 -7
  45. package/dist/runtime/deployment-guard.js +8 -8
  46. package/dist/runtime/get-port-lazy.d.ts +2 -2
  47. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  48. package/dist/runtime/get-port-lazy.js +37 -30
  49. package/dist/runtime/get-world-lazy.d.ts +2 -2
  50. package/dist/runtime/get-world-lazy.js +3 -3
  51. package/dist/runtime/helpers.d.ts +18 -18
  52. package/dist/runtime/helpers.js +27 -27
  53. package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
  54. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  55. package/dist/runtime/quickjs-entrypoint.js +200 -81
  56. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  57. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  58. package/dist/runtime/quickjs-runtime.js +126 -77
  59. package/dist/runtime/quickjs-serde.d.ts +10 -10
  60. package/dist/runtime/quickjs-serde.js +20 -20
  61. package/dist/runtime/replay-budget.d.ts +4 -4
  62. package/dist/runtime/replay-budget.js +5 -5
  63. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  64. package/dist/runtime/replay-recovery-reporter.js +2 -2
  65. package/dist/runtime/resume-hook.d.ts +2 -2
  66. package/dist/runtime/resume-hook.js +27 -27
  67. package/dist/runtime/resume-latency.d.ts +25 -25
  68. package/dist/runtime/resume-latency.d.ts.map +1 -1
  69. package/dist/runtime/resume-latency.js +4 -4
  70. package/dist/runtime/run-id-time.d.ts +2 -2
  71. package/dist/runtime/run-id-time.js +5 -5
  72. package/dist/runtime/run.d.ts +21 -4
  73. package/dist/runtime/run.d.ts.map +1 -1
  74. package/dist/runtime/run.js +154 -35
  75. package/dist/runtime/runs.d.ts +4 -4
  76. package/dist/runtime/runs.js +2 -2
  77. package/dist/runtime/start.d.ts +3 -3
  78. package/dist/runtime/start.d.ts.map +1 -1
  79. package/dist/runtime/start.js +27 -23
  80. package/dist/runtime/step-executor.d.ts +59 -11
  81. package/dist/runtime/step-executor.d.ts.map +1 -1
  82. package/dist/runtime/step-executor.js +116 -42
  83. package/dist/runtime/step-latency.d.ts +20 -14
  84. package/dist/runtime/step-latency.d.ts.map +1 -1
  85. package/dist/runtime/step-latency.js +13 -11
  86. package/dist/runtime/step-ownership.d.ts +6 -6
  87. package/dist/runtime/step-ownership.js +8 -8
  88. package/dist/runtime/step-single-flight.d.ts +1 -1
  89. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  90. package/dist/runtime/step-single-flight.js +17 -11
  91. package/dist/runtime/suspension-handler.d.ts +99 -7
  92. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  93. package/dist/runtime/suspension-handler.js +678 -57
  94. package/dist/runtime/unserializable-step.d.ts +34 -0
  95. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  96. package/dist/runtime/unserializable-step.js +52 -0
  97. package/dist/runtime/vm-mode.d.ts +1 -1
  98. package/dist/runtime/vm-mode.js +2 -2
  99. package/dist/runtime/wait-continuation.d.ts +31 -9
  100. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  101. package/dist/runtime/wait-continuation.js +44 -13
  102. package/dist/runtime/wait-until.d.ts +1 -1
  103. package/dist/runtime/wait-until.js +2 -2
  104. package/dist/runtime/world-compatibility.d.ts +20 -9
  105. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  106. package/dist/runtime/world-compatibility.js +24 -13
  107. package/dist/runtime/world-init.d.ts +5 -5
  108. package/dist/runtime/world-init.js +6 -6
  109. package/dist/runtime/world.d.ts.map +1 -1
  110. package/dist/runtime/world.js +13 -3
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +417 -213
  113. package/dist/sealed-box.d.ts +7 -7
  114. package/dist/sealed-box.js +15 -15
  115. package/dist/serialization/client.js +2 -2
  116. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  117. package/dist/serialization/codec-devalue-vm.js +4 -4
  118. package/dist/serialization/codec-devalue.d.ts +1 -1
  119. package/dist/serialization/codec-devalue.js +2 -2
  120. package/dist/serialization/codec.d.ts +4 -4
  121. package/dist/serialization/codec.js +2 -2
  122. package/dist/serialization/compression.d.ts +12 -11
  123. package/dist/serialization/compression.d.ts.map +1 -1
  124. package/dist/serialization/compression.js +16 -15
  125. package/dist/serialization/encryption.d.ts +7 -7
  126. package/dist/serialization/encryption.d.ts.map +1 -1
  127. package/dist/serialization/encryption.js +8 -8
  128. package/dist/serialization/errors.js +2 -2
  129. package/dist/serialization/format.d.ts +6 -6
  130. package/dist/serialization/format.js +7 -7
  131. package/dist/serialization/hardened.d.ts +18 -18
  132. package/dist/serialization/hardened.d.ts.map +1 -1
  133. package/dist/serialization/hardened.js +41 -32
  134. package/dist/serialization/index.d.ts +1 -1
  135. package/dist/serialization/index.js +2 -2
  136. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  137. package/dist/serialization/reducers/class-vm.js +2 -2
  138. package/dist/serialization/reducers/class.js +2 -2
  139. package/dist/serialization/reducers/common-vm.js +12 -12
  140. package/dist/serialization/reducers/common.js +12 -12
  141. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  142. package/dist/serialization/reducers/step-function-vm.js +2 -2
  143. package/dist/serialization/reducers/step-function.js +2 -2
  144. package/dist/serialization/step.js +2 -2
  145. package/dist/serialization/types.d.ts +5 -5
  146. package/dist/serialization/types.js +2 -2
  147. package/dist/serialization/workflow-vm.d.ts +1 -1
  148. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  149. package/dist/serialization/workflow-vm.js +13 -10
  150. package/dist/serialization-format.d.ts +11 -11
  151. package/dist/serialization-format.d.ts.map +1 -1
  152. package/dist/serialization-format.js +29 -23
  153. package/dist/serialization.d.ts +20 -12
  154. package/dist/serialization.d.ts.map +1 -1
  155. package/dist/serialization.js +141 -99
  156. package/dist/set-attributes.js +2 -2
  157. package/dist/source-map.d.ts +1 -1
  158. package/dist/source-map.d.ts.map +1 -1
  159. package/dist/source-map.js +18 -12
  160. package/dist/step/context-storage.d.ts +5 -5
  161. package/dist/step/context-storage.js +1 -1
  162. package/dist/step/writable-stream.d.ts +3 -3
  163. package/dist/step/writable-stream.js +7 -7
  164. package/dist/step.js +12 -12
  165. package/dist/symbols.d.ts +2 -2
  166. package/dist/symbols.js +3 -3
  167. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  168. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  169. package/dist/telemetry/semantic-conventions.js +21 -15
  170. package/dist/telemetry.d.ts +9 -3
  171. package/dist/telemetry.d.ts.map +1 -1
  172. package/dist/telemetry.js +40 -10
  173. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  174. package/dist/test-support/orchestrator-context.js +12 -2
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +2 -2
  177. package/dist/vm/index.js +4 -4
  178. package/dist/vm/script-cache.d.ts.map +1 -1
  179. package/dist/vm/script-cache.js +23 -17
  180. package/dist/vm/uint8array-base64.js +1 -1
  181. package/dist/workflow/abort-controller.d.ts +1 -1
  182. package/dist/workflow/abort-controller.js +12 -12
  183. package/dist/workflow/create-hook.js +3 -3
  184. package/dist/workflow/get-workflow-metadata.js +2 -2
  185. package/dist/workflow/hook.js +18 -18
  186. package/dist/workflow/set-attributes.d.ts +1 -1
  187. package/dist/workflow/set-attributes.js +2 -2
  188. package/dist/workflow/sleep.js +2 -2
  189. package/dist/workflow/world-init-stub.d.ts +1 -1
  190. package/dist/workflow/world-init-stub.js +2 -2
  191. package/dist/workflow.d.ts +2 -2
  192. package/dist/workflow.js +36 -14
  193. package/docs/api-reference/create-hook.mdx +15 -15
  194. package/docs/api-reference/create-webhook.mdx +15 -15
  195. package/docs/api-reference/define-hook.mdx +10 -10
  196. package/docs/api-reference/fatal-error.mdx +2 -2
  197. package/docs/api-reference/fetch.mdx +7 -7
  198. package/docs/api-reference/get-step-metadata.mdx +2 -2
  199. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  200. package/docs/api-reference/get-writable.mdx +7 -7
  201. package/docs/api-reference/index.mdx +1 -1
  202. package/docs/api-reference/retryable-error.mdx +1 -1
  203. package/docs/api-reference/set-attributes.mdx +2 -2
  204. package/docs/api-reference/sleep.mdx +3 -3
  205. package/docs/foundations/cancellation.mdx +31 -31
  206. package/docs/foundations/errors-and-retries.mdx +42 -11
  207. package/docs/foundations/hooks.mdx +37 -37
  208. package/docs/foundations/idempotency.mdx +9 -9
  209. package/docs/foundations/serialization.mdx +21 -22
  210. package/docs/foundations/starting-workflows.mdx +36 -37
  211. package/docs/foundations/streaming.mdx +68 -39
  212. package/docs/foundations/versioning.mdx +3 -3
  213. package/docs/foundations/workflows-and-steps.mdx +9 -9
  214. package/docs/how-it-works/cancellation.mdx +62 -62
  215. package/docs/how-it-works/code-transform.mdx +66 -54
  216. package/docs/how-it-works/encryption.mdx +25 -21
  217. package/docs/how-it-works/event-sourcing.mdx +84 -28
  218. package/docs/how-it-works/framework-integrations.mdx +12 -12
  219. package/docs/how-it-works/understanding-directives.mdx +21 -21
  220. package/package.json +7 -7
@@ -1,4 +1,5 @@
1
1
  import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
2
+ import { globalSingleton } from '@workflow/utils';
2
3
  import { workflowDisplayName } from '@workflow/utils/parse-name';
3
4
  import { HOOK_RESUME_INPUT_VERSION, isLegacySpecVersion, PARENT_RUN_ID_ATTRIBUTE, ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
4
5
  import { monotonicFactory } from 'ulid';
@@ -24,7 +25,7 @@ import { assertWorldSupportsRuntimeProtocol } from './world-compatibility.js';
24
25
  * dehydrating workflow arguments. Kept tight on purpose: the probe is
25
26
  * an optimization (it lets the caller emit the framed byte-stream wire
26
27
  * format when the target supports it), and the fallback on timeout is
27
- * the legacy raw format which always works. Long delays here would just
28
+ * the legacy raw format which always works. Long delays here would
28
29
  * make `start({ deploymentId: ... })` slower for users whose target
29
30
  * deployments don't recognize the health check at all.
30
31
  */
@@ -56,15 +57,17 @@ function resolveLineageAttributes() {
56
57
  // The warning that explains this only needs to fire once per process: a
57
58
  // workflow that hardcodes 'latest' for its Vercel deployment would otherwise
58
59
  // log it on every local/Postgres run, flooding tight dev loops.
59
- let hasWarnedLatestNoOp = false;
60
+ // On `globalThis` (see `globalSingleton`) so "once per process" is not once
61
+ // per bundler layer.
62
+ const latestNoOpWarning = globalSingleton('@workflow/core//latestNoOpWarning', 1, () => ({ warned: false }));
60
63
  /**
61
- * Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only
64
+ * Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only,
62
65
  * exported so unit tests can exercise the warn path across `start()` calls.
63
66
  *
64
67
  * @internal
65
68
  */
66
69
  export function _resetLatestNoOpWarnForTests() {
67
- hasWarnedLatestNoOp = false;
70
+ latestNoOpWarning.warned = false;
68
71
  }
69
72
  export async function start(workflow, argsOrOptions, options) {
70
73
  'use step';
@@ -104,15 +107,15 @@ export async function start(workflow, argsOrOptions, options) {
104
107
  // resolveLatestDeploymentId(). Worlds without that concept (local dev,
105
108
  // self-hosted Postgres) have nothing to resolve between, so rather than
106
109
  // fail a run that works fine on Vercel, we warn and fall back to the
107
- // current deployment making 'latest' an effective no-op there.
110
+ // current deployment, making 'latest' an effective no-op there.
108
111
  if (deploymentId === 'latest') {
109
112
  if (world.resolveLatestDeploymentId) {
110
113
  deploymentId = await world.resolveLatestDeploymentId();
111
114
  }
112
115
  else {
113
- // Warn once per process see hasWarnedLatestNoOp above.
114
- if (!hasWarnedLatestNoOp) {
115
- hasWarnedLatestNoOp = true;
116
+ // Warn once per process; see latestNoOpWarning.warned above.
117
+ if (!latestNoOpWarning.warned) {
118
+ latestNoOpWarning.warned = true;
116
119
  runtimeLogger.warn("deploymentId: 'latest' has no effect in this world and was ignored. " +
117
120
  'It is only supported by worlds with atomic deployments, such as Vercel. ' +
118
121
  'The run will target the current deployment.', { currentDeploymentId });
@@ -126,7 +129,7 @@ export async function start(workflow, argsOrOptions, options) {
126
129
  // deployment starts (explicit deploymentId or 'latest' that resolves
127
130
  // to a different deployment) we probe the target via healthCheck to
128
131
  // learn its workflow-core version, then derive the capability. The
129
- // probe has a tight timeout on miss/failure we fall back to the
132
+ // probe has a tight timeout: on miss/failure we fall back to the
130
133
  // legacy raw byte format, which is universally readable.
131
134
  //
132
135
  // Worlds that don't expose the `streams` API (e.g. minimal test
@@ -161,15 +164,16 @@ export async function start(workflow, argsOrOptions, options) {
161
164
  else if (typeof world.streams?.get !== 'function') {
162
165
  framedByteStreams = false;
163
166
  targetSupportsCompression = false;
164
- // No probe channel to the target cannot attest the consumer honors
165
- // `hookInput`, so leave the marker off (fail closed to sequential).
167
+ // No probe channel to the target, so we cannot attest the consumer
168
+ // honors `hookInput`; leave the marker off (fail closed to
169
+ // sequential).
166
170
  targetHookResumeInputVersion = undefined;
167
171
  }
168
172
  else {
169
173
  // Ask for this run's public key while we're here. The probe already
170
174
  // blocks `start()` on every cross-deployment call, and the responder
171
175
  // executes inside the target deployment where the key material is
172
- // local so the key comes back for free on a response we are
176
+ // local, so the key comes back for free on a response we are
173
177
  // already awaiting, and we can skip the key-lookup API request
174
178
  // entirely. Best-effort: on timeout or an older target, no key comes
175
179
  // back and we fall through to the regular lookup below.
@@ -185,7 +189,7 @@ export async function start(workflow, argsOrOptions, options) {
185
189
  targetSupportsCompression = capabilities.supportedFormats.has(SerializationFormat.GZIP);
186
190
  // The responder runs inside the target deployment, so its
187
191
  // `hookResumeInputVersion` reflects the consumer. Undefined on an
188
- // older target or a probe timeout leaving the marker off.
192
+ // older target or a probe timeout, leaving the marker off.
189
193
  targetHookResumeInputVersion = probe?.hookResumeInputVersion;
190
194
  }
191
195
  const ops = [];
@@ -202,7 +206,7 @@ export async function start(workflow, argsOrOptions, options) {
202
206
  throw new WorkflowRuntimeError('Initial workflow attributes require a World that supports spec version 4 or later.');
203
207
  }
204
208
  // `normalizeAttributeChanges` treats `undefined` as "remove this
205
- // key", which is meaningless at creation time reject it up front
209
+ // key", which is meaningless at creation time. Reject it up front
206
210
  // so JS callers get a clear error instead of a downstream schema
207
211
  // failure (the types already forbid non-string values).
208
212
  for (const [key, value] of Object.entries(opts.attributes)) {
@@ -251,7 +255,7 @@ export async function start(workflow, argsOrOptions, options) {
251
255
  //
252
256
  // Preferred: the capability probe already told us this run's public
253
257
  // key, so seal to it. That skips `getEncryptionKeyForRun`, which for a
254
- // cross-deployment start is a `run-key` API request the last one left
258
+ // cross-deployment start is a `run-key` API request, the last one left
255
259
  // on this path. It is also a privilege reduction: the caller ends up
256
260
  // able to write the arguments but not read them back, whereas fetching
257
261
  // the symmetric key grants full read access to a run it merely
@@ -302,18 +306,18 @@ export async function start(workflow, argsOrOptions, options) {
302
306
  //
303
307
  // The two writes below go to different places by different routes:
304
308
  // `events.create` is attributed to THIS client's tenant, while the queue
305
- // message is pinned to a deploymentId. When those disagree a
306
- // production-credentialed client pinning a preview deployment the
309
+ // message is pinned to a deploymentId. When those disagree (a
310
+ // production-credentialed client pinning a preview deployment) the
307
311
  // preview consumer can't find the run in its own tenant, falls back to
308
312
  // resilient start, and re-creates it: one client-minted run id, two
309
313
  // environments, the production copy pending forever and the preview copy
310
314
  // executing. Worlds with a single tenant return undefined and the field
311
- // is simply absent.
315
+ // is absent.
312
316
  const creatorEnvironment = world.getEnvironment?.();
313
317
  // If WORKFLOW_VM is set on the client starting the run, stamp the
314
318
  // engine choice into the run's executionContext so the run keeps
315
319
  // executing on the engine it started on (the same deployment can
316
- // serve both VM engines). Unknown values throw see
320
+ // serve both VM engines). Unknown values throw; see
317
321
  // getWorkflowVmFromEnv().
318
322
  const workflowVm = getWorkflowVmFromEnv();
319
323
  const executionContext = {
@@ -326,7 +330,7 @@ export async function start(workflow, argsOrOptions, options) {
326
330
  // resumeContext by the server) to decide whether the parallel fast
327
331
  // path is safe. For a cross-deployment start the consumer is the
328
332
  // target deployment, so we stamp the *target's* value carried back on
329
- // the health-check probe never the caller's. Omitted when we could
333
+ // the health-check probe, never the caller's. Omitted when we could
330
334
  // not attest the target (older target, timeout, or no probe channel),
331
335
  // which fails the resume gate closed to the sequential path.
332
336
  ...(targetHookResumeInputVersion !== undefined
@@ -382,7 +386,7 @@ export async function start(workflow, argsOrOptions, options) {
382
386
  ...(opts.region !== undefined ? { region: opts.region } : {}),
383
387
  }),
384
388
  ]);
385
- // Queue failure is always fatal the run was not enqueued
389
+ // Queue failure is always fatal: the run was not enqueued
386
390
  if (queueResult.status === 'rejected') {
387
391
  throw queueResult.reason;
388
392
  }
@@ -398,7 +402,7 @@ export async function start(workflow, argsOrOptions, options) {
398
402
  }
399
403
  else if (isRetryableWorldError(err)) {
400
404
  // 429 (ThrottleError), 5xx, and transient transport failures
401
- // (TRANSPORT/TIMEOUT) are retryable the run was accepted via the
405
+ // (TRANSPORT/TIMEOUT) are retryable: the run was accepted via the
402
406
  // queue and creation will be re-tried by the runtime when it calls
403
407
  // run_started.
404
408
  resilientStart = true;
@@ -437,4 +441,4 @@ export async function start(workflow, argsOrOptions, options) {
437
441
  });
438
442
  });
439
443
  }
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGdDQUFnQyxFQUNoQywwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FDakIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsMEJBQTBCLEVBRTFCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFF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QixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzREFBc0QsRUFDdEQ7b0JBQ0UsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssV0FBVztvQkFDekMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxHQUFHLENBQVUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFBBUkVOVF9SVU5fSURfQVRUUklCVVRFLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBkZWNvZGVSdW5QdWJsaWNLZXksXG4gIGRlcml2ZVJ1bktleVBhaXIsXG59IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgc2VhbFRvLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dWbUZyb21FbnYgfSBmcm9tICcuL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGQganVzdFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIENyb3NzLXJ1biBsaW5lYWdlIGZvciBhIHJ1biBiZWluZyBzdGFydGVkIGZyb20gaW5zaWRlIGFub3RoZXIgcnVuLlxuICpcbiAqIFRoZSBhbWJpZW50IHN0ZXAgY29udGV4dCBjYXJyaWVzIHRoZSBwYXJlbnQgcnVuIGlkIGFuZCB0aGUgcm9vdCBvZiBpdHNcbiAqIGxpbmVhZ2U7IHRoZSBydW50aW1lIGZpbGxzIGJvdGggZnJvbSB0aGUgcnVuIGl0IGFscmVhZHkgaGFzIGxvYWRlZCwgc28gdGhpc1xuICogaXMgYSBwdXJlIGNvbnRleHQgcmVhZCB3aXRoIG5vIEkvTy4gVGhlIG5ldyBydW4gcmVjb3JkcyBgJHBhcmVudFJ1bklkYCAodGhlXG4gKiBlZGdlKSBhbmQgaW5oZXJpdHMgdGhlIHBhcmVudCdzIGAkcm9vdFJ1bklkYCAodGhlIHBhcmVudCBpdHNlbGYgd2hlbiBpdCBpcyBhXG4gKiByb290KSwgc28gYSBkYWlzeSBjaGFpbiBvciBmYW4tb3V0IG9mIGFueSBkZXB0aCBncm91cHMgdW5kZXIgb25lIHJvb3QgaWQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHRvcC1sZXZlbCBgc3RhcnQoKWAsIHdoaWNoIGhhcyBubyBjb250ZXh0LCBzb1xuICogc3RhbmRhbG9uZSBydW5zIGNhcnJ5IG5vIGxpbmVhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMaW5lYWdlQXR0cmlidXRlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RvcmUgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBjb25zdCBwYXJlbnRSdW5JZCA9IHN0b3JlPy53b3JrZmxvd01ldGFkYXRhPy53b3JrZmxvd1J1bklkO1xuICBpZiAoIXBhcmVudFJ1bklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgW1JPT1RfUlVOX0lEX0FUVFJJQlVURV06IHN0b3JlLnJvb3RSdW5JZCA/PyBwYXJlbnRSdW5JZCxcbiAgICBbUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEVdOiBwYXJlbnRSdW5JZCxcbiAgfTtcbn1cblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxubGV0IGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5IOKAlFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdpb24gaWRlbnRpZmllciBmb3IgdGhlIG5ldyBydW4uIEN1cnJlbnRseSBjb25zdW1lZCBvbmx5XG4gICAqIGJ5IGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCwgd2hpY2ggZW1iZWRzIHRoZSByZWdpb24gaW50byB0aGUgdGFnZ2VkXG4gICAqIHJ1biBJRCBhbmQgcm91dGVzIHRoZSBpbml0aWFsIHdvcmtmbG93IG1lc3NhZ2UgdG8gdGhlIG1hdGNoaW5nXG4gICAqIHJlZ2lvbmFsIHF1ZXVlLiBXaGVuIG9taXR0ZWQsIHRoZSB3b3JsZCBmYWxscyBiYWNrIHRvIGl0cyBvd25cbiAgICogZGVmYXVsdCAoZm9yIGB3b3JsZC12ZXJjZWxgOiB0aGUgYFZFUkNFTF9SRUdJT05gIGVudmlyb25tZW50XG4gICAqIHZhcmlhYmxlLCB0aGVuIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IHJlZ2lvbiBgaWFkMWAg4oCUIGEgY29uY3JldGUsXG4gICAqIHJvdXRhYmxlIHJlZ2lvbiBpcyBhbHdheXMgY2hvc2VuKS5cbiAgICpcbiAgICogV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlIHRoaXMgZmllbGQuXG4gICAqL1xuICByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBzZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIGV4aXN0aW5nIHJ1biB0aGlzIHJ1biBpcyBiZWluZyByZXBsYXllZCBmcm9tLCBpZiBhbnkuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBuZXcgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHRgIGFzIGByZXBsYXllZEZyb21SdW5JZGAgc29cbiAgICogdG9vbGluZyAoZS5nLiB0aGUgZGFzaGJvYXJkIHJ1bnMgbGlzdCkgY2FuIHNob3cgdGhhdCBhIHJ1biBvcmlnaW5hdGVkIGFzXG4gICAqIGEgcmVwbGF5IGFuZCBsaW5rIGJhY2sgdG8gaXRzIHNvdXJjZS4gU2V0IGF1dG9tYXRpY2FsbHkgYnlcbiAgICoge0BsaW5rIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nfTsgdGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbiB0byBwYXNzIGl0XG4gICAqIGRpcmVjdGx5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcnVuIElEOiBgd3J1bl9gIGZvbGxvd2VkIGJ5IGEgMjYtY2hhciBVTElELiBJdCdzIGEgZm9yZWlnbiBrZXlcbiAgICogdG8gdGhlIHNvdXJjZSBydW4sIHNvIGBzdGFydCgpYCB2YWxpZGF0ZXMgdGhlIGV4YWN0IHNoYXBlIGFuZCByZWplY3RzXG4gICAqIGFueXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gcGVyc2lzdCBhIGxpbmVhZ2UgbGluayB0aGF0IHBvaW50cyBhdCBnYXJiYWdlLlxuICAgKi9cbiAgcmVwbGF5ZWRGcm9tUnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50LiBTY29wZXMgdGhlIHdvcmtmbG93IHF1ZXVlXG4gICAqIHRvcGljIHRvIGBfX3tuYW1lc3BhY2V9X3drZl93b3JrZmxvd18qYCAoZS5nLiBgJ2V2ZSdgKSBpbnN0ZWFkIG9mIHRoZVxuICAgKiBkZWZhdWx0IGBfX3drZl93b3JrZmxvd18qYCwgYW5kIGlzIGFsc28gdXNlZCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnRcbiAgICogY2FwYWJpbGl0eSBwcm9iZS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBXaXRoaW4gYSBkZXBsb3ltZW50IHRoZSBlbnYgZmFsbGJhY2sgaXMgY29ycmVjdC4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzXG4gICAqIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCByZXBsYXlpbmcgYSBydW4pIG11c3QgcGFzcyB0aGVcbiAgICogVEFSR0VUIGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpblxuICAgKiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgcnVuIGVucXVldWVkIHRvIGEgdG9waWMgdGhlIHRhcmdldCBoYXMgbm9cbiAgICogY29uc3VtZXIgZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBJRCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiB3aGVuIGRlcGxveWluZyB0byBWZXJjZWwuXG4gICAqXG4gICAqIFNldCB0byBgJ2xhdGVzdCdgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgbW9zdCByZWNlbnQgZGVwbG95bWVudFxuICAgKiBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3IgZ2l0IGJyYW5jaCkuXG4gICAqIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aXRoIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzXG4gICAqIChjdXJyZW50bHkgVmVyY2VsKS4gSW4gb3RoZXIgd29ybGRzIChsb2NhbCBkZXYsIFBvc3RncmVzKSB0aGVyZSBpcyBub1xuICAgKiBub3Rpb24gb2YgbXVsdGlwbGUgZGVwbG95bWVudHMgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyBgJ2xhdGVzdCdgIGhhcyBub1xuICAgKiBlZmZlY3Qg4oCUIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBydW4gdGFyZ2V0cyB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW5OYW1lID0gYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWA7XG4gICAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpO1xuICAgICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgICBjb25zdCBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gY3VycmVudERlcGxveW1lbnRJZDtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBSZXNvbHZpbmcgJ2xhdGVzdCcgb25seSBtZWFucyBzb21ldGhpbmcgaW4gd29ybGRzIHdpdGggYXRvbWljLFxuICAgICAgLy8gaW1tdXRhYmxlIGRlcGxveW1lbnRzIChlLmcuIFZlcmNlbCksIHdoaWNoIGltcGxlbWVudFxuICAgICAgLy8gcmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpLiBXb3JsZHMgd2l0aG91dCB0aGF0IGNvbmNlcHQgKGxvY2FsIGRldixcbiAgICAgIC8vIHNlbGYtaG9zdGVkIFBvc3RncmVzKSBoYXZlIG5vdGhpbmcgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyByYXRoZXIgdGhhblxuICAgICAgLy8gZmFpbCBhIHJ1biB0aGF0IHdvcmtzIGZpbmUgb24gVmVyY2VsLCB3ZSB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBjdXJyZW50IGRlcGxveW1lbnQg4oCUIG1ha2luZyAnbGF0ZXN0JyBhbiBlZmZlY3RpdmUgbm8tb3AgdGhlcmUuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAod29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXYXJuIG9uY2UgcGVyIHByb2Nlc3Mg4oCUIHNlZSBoYXNXYXJuZWRMYXRlc3ROb09wIGFib3ZlLlxuICAgICAgICAgIGlmICghaGFzV2FybmVkTGF0ZXN0Tm9PcCkge1xuICAgICAgICAgICAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IHRydWU7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIFwiZGVwbG95bWVudElkOiAnbGF0ZXN0JyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgd29ybGQgYW5kIHdhcyBpZ25vcmVkLiBcIiArXG4gICAgICAgICAgICAgICAgJ0l0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHdvcmxkcyB3aXRoIGF0b21pYyBkZXBsb3ltZW50cywgc3VjaCBhcyBWZXJjZWwuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgcnVuIHdpbGwgdGFyZ2V0IHRoZSBjdXJyZW50IGRlcGxveW1lbnQuJyxcbiAgICAgICAgICAgICAgeyBjdXJyZW50RGVwbG95bWVudElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGN1cnJlbnREZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgYnl0ZSBzdHJlYW1zIGluIHRoZSBmcmFtZWQgd2lyZSBmb3JtYXQuXG4gICAgICAvLyBGb3Igc2FtZS1kZXBsb3ltZW50IHN0YXJ0cyAodGhlIGNvbW1vbiBjYXNlKSB3ZSBrbm93IHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIHJ1bm5pbmcgdGhpcyBzYW1lIFNESyB2ZXJzaW9uLCBzbyBmcmFtaW5nIGlzIHNhZmUuIEZvciBjcm9zcy1cbiAgICAgIC8vIGRlcGxveW1lbnQgc3RhcnRzIChleHBsaWNpdCBkZXBsb3ltZW50SWQgb3IgJ2xhdGVzdCcgdGhhdCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgZGVwbG95bWVudCkgd2UgcHJvYmUgdGhlIHRhcmdldCB2aWEgaGVhbHRoQ2hlY2sgdG9cbiAgICAgIC8vIGxlYXJuIGl0cyB3b3JrZmxvdy1jb3JlIHZlcnNpb24sIHRoZW4gZGVyaXZlIHRoZSBjYXBhYmlsaXR5LiBUaGVcbiAgICAgIC8vIHByb2JlIGhhcyBhIHRpZ2h0IHRpbWVvdXQg4oCUIG9uIG1pc3MvZmFpbHVyZSB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBsZWdhY3kgcmF3IGJ5dGUgZm9ybWF0LCB3aGljaCBpcyB1bml2ZXJzYWxseSByZWFkYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBXb3JsZHMgdGhhdCBkb24ndCBleHBvc2UgdGhlIGBzdHJlYW1zYCBBUEkgKGUuZy4gbWluaW1hbCB0ZXN0XG4gICAgICAvLyBtb2NrcykgY2FuJ3Qgc2VydmljZSBoZWFsdGggY2hlY2tzLCBzbyB3ZSBza2lwIHRoZSBwcm9iZSBmb3IgdGhlbS5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlXG4gICAgICAvLyBlbmNyeXB0aW9uIGNvbnRleHQpLiBXaGVuIHRoZSBXb3JsZCBwcm92aWRlcyBhIGBjcmVhdGVSdW5JZCgpYFxuICAgICAgLy8gaW1wbGVtZW50YXRpb24sIHVzZSBpdCBzbyB3b3JsZHMgY2FuIGVtYmVkIGltcGxlbWVudGF0aW9uLXNwZWNpZmljXG4gICAgICAvLyBtZXRhZGF0YSAoZS5nLiwgcmVnaW9uKSBpbnRvIHRoZSBJRCwgZm9yd2FyZGluZyB0aGUgZnVsbCBvcHRpb25zXG4gICAgICAvLyBiYWcgc28gd29ybGRzIGNhbiByZWFkIHdoaWNoZXZlciBmaWVsZHMgdGhleSByZWNvZ25pc2U7IG90aGVyd2lzZVxuICAgICAgLy8gZmFsbCBiYWNrIHRvIGEgc3RhbmRhcmQgbW9ub3RvbmljIFVMSUQuXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7XG4gICAgICAgIHdvcmxkLmNyZWF0ZVJ1bklkXG4gICAgICAgICAgPyB3b3JsZC5jcmVhdGVSdW5JZChvcHRzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgICAgICA6IHVsaWQoKVxuICAgICAgfWA7XG5cbiAgICAgIGxldCBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbiAgICAgIGxldCB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uOiBib29sZWFuO1xuICAgICAgLy8gVGhlIGNvbnN1bWVyJ3MgaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgc3RhbXBlZCBvbnRvIHRoZSBuZXcgcnVuXG4gICAgICAvLyBzbyBhIGxhdGVyIGByZXN1bWVIb29rKClgIGdhdGVzIGl0cyBwYXJhbGxlbCBwYXRoIG9uIHRoZSBkZXBsb3ltZW50XG4gICAgICAvLyB0aGF0IHdpbGwgYWN0dWFsbHkgY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJjb3VsZFxuICAgICAgLy8gbm90IGF0dGVzdFwiIGFuZCBmYWlscyB0aGUgZ2F0ZSBjbG9zZWQuXG4gICAgICBsZXQgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gUHVibGljIGtleSBvZiB0aGUgdGFyZ2V0IHJ1biwgd2hlbiB0aGUgY2FwYWJpbGl0eSBwcm9iZSB3YXMgYWJsZSB0b1xuICAgICAgLy8gc3VwcGx5IG9uZSAoY3Jvc3MtZGVwbG95bWVudCBvbmx5KS5cbiAgICAgIGxldCBwcm9iZWRSdW5QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgLy8gU2FtZSBkZXBsb3ltZW50OiB0aGlzIHByb2Nlc3MgaXMgdGhlIGNvbnN1bWVyLCBzbyBpdHMgb3duIGNvbnN0YW50XG4gICAgICAgIC8vIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgLy8gTm8gcHJvYmUgY2hhbm5lbCB0byB0aGUgdGFyZ2V0IOKAlCBjYW5ub3QgYXR0ZXN0IHRoZSBjb25zdW1lciBob25vcnNcbiAgICAgICAgLy8gYGhvb2tJbnB1dGAsIHNvIGxlYXZlIHRoZSBtYXJrZXIgb2ZmIChmYWlsIGNsb3NlZCB0byBzZXF1ZW50aWFsKS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzayBmb3IgdGhpcyBydW4ncyBwdWJsaWMga2V5IHdoaWxlIHdlJ3JlIGhlcmUuIFRoZSBwcm9iZSBhbHJlYWR5XG4gICAgICAgIC8vIGJsb2NrcyBgc3RhcnQoKWAgb24gZXZlcnkgY3Jvc3MtZGVwbG95bWVudCBjYWxsLCBhbmQgdGhlIHJlc3BvbmRlclxuICAgICAgICAvLyBleGVjdXRlcyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50IHdoZXJlIHRoZSBrZXkgbWF0ZXJpYWwgaXNcbiAgICAgICAgLy8gbG9jYWwg4oCUIHNvIHRoZSBrZXkgY29tZXMgYmFjayBmb3IgZnJlZSBvbiBhIHJlc3BvbnNlIHdlIGFyZVxuICAgICAgICAvLyBhbHJlYWR5IGF3YWl0aW5nLCBhbmQgd2UgY2FuIHNraXAgdGhlIGtleS1sb29rdXAgQVBJIHJlcXVlc3RcbiAgICAgICAgLy8gZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBvbiB0aW1lb3V0IG9yIGFuIG9sZGVyIHRhcmdldCwgbm8ga2V5IGNvbWVzXG4gICAgICAgIC8vIGJhY2sgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBsb29rdXAgYmVsb3cuXG4gICAgICAgIGNvbnN0IHByb2JlID0gYXdhaXQgaGVhbHRoQ2hlY2sod29ybGQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdGltZW91dDogQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMsXG4gICAgICAgICAgbmFtZXNwYWNlOiBvcHRzLm5hbWVzcGFjZSxcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgcHJvYmVkUnVuUHVibGljS2V5ID0gcHJvYmU/LmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvbik7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGUgcmVzcG9uZGVyIHJ1bnMgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gICAgICAgIC8vIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCByZWZsZWN0cyB0aGUgY29uc3VtZXIuIFVuZGVmaW5lZCBvbiBhblxuICAgICAgICAvLyBvbGRlciB0YXJnZXQgb3IgYSBwcm9iZSB0aW1lb3V0IOKAlCBsZWF2aW5nIHRoZSBtYXJrZXIgb2ZmLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcHJvYmU/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIERlZmF1bHQgbmV3IHJ1bnMgdG8gdGhlIGNvbmZpZ3VyZWQgd29ybGQncyBzcGVjIHZlcnNpb24uIFRoZSB3b3JsZFxuICAgICAgLy8gaXRzZWxmIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBhZ2FpbnN0IHRoaXMgcnVudGltZSdzIHNwZWMgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gb3B0cy5zcGVjVmVyc2lvbiA/PyB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG4gICAgICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdHMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gICAgICBsZXQgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRzLmF0dHJpYnV0ZXMgJiYgT2JqZWN0LmtleXMob3B0cy5hdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzcGVjVmVyc2lvbiA8IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgJ0luaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlcyByZXF1aXJlIGEgV29ybGQgdGhhdCBzdXBwb3J0cyBzcGVjIHZlcnNpb24gNCBvciBsYXRlci4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlc2AgdHJlYXRzIGB1bmRlZmluZWRgIGFzIFwicmVtb3ZlIHRoaXNcbiAgICAgICAgLy8ga2V5XCIsIHdoaWNoIGlzIG1lYW5pbmdsZXNzIGF0IGNyZWF0aW9uIHRpbWUg4oCUIHJlamVjdCBpdCB1cCBmcm9udFxuICAgICAgICAvLyBzbyBKUyBjYWxsZXJzIGdldCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2YgYSBkb3duc3RyZWFtIHNjaGVtYVxuICAgICAgICAvLyBmYWlsdXJlICh0aGUgdHlwZXMgYWxyZWFkeSBmb3JiaWQgbm9uLXN0cmluZyB2YWx1ZXMpLlxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLmF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEluaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gbXVzdCBiZSBhIHN0cmluZyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhvcHRzLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgY2hhbmdlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBba2V5LCB2YWx1ZSBhcyBzdHJpbmddKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcm9zcy1ydW4gbGluZWFnZTogdGhlIHJlc2VydmVkIGtleXMgcmlkZSBvbiB0aGUgcnVuJ3MgZXhpc3RpbmdcbiAgICAgIC8vIGF0dHJpYnV0ZXMsIHNvIHRoZXkgYWRkIG5vIGV4dHJhIHdyaXRlLiBDYWxsZXIgYXR0cmlidXRlcyBhcmUgc3ByZWFkXG4gICAgICAvLyBsYXN0LCBzbyBhIGNhbGxlciB3aXRoIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIGNhbiBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIHJlLXBhcmVudC5cbiAgICAgIGNvbnN0IGxpbmVhZ2UgPVxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFU1xuICAgICAgICAgID8gcmVzb2x2ZUxpbmVhZ2VBdHRyaWJ1dGVzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJ1bkF0dHJpYnV0ZXMgPSBsaW5lYWdlXG4gICAgICAgID8geyAuLi5saW5lYWdlLCAuLi5hdHRyaWJ1dGVzIH1cbiAgICAgICAgOiBhdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBTaGFyZWQgYnkgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50IGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlIGlucHV0LlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IHJ1bkF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIHx8IGxpbmVhZ2UgIT0gbnVsbFxuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzLlxuICAgICAgLy9cbiAgICAgIC8vIFByZWZlcnJlZDogdGhlIGNhcGFiaWxpdHkgcHJvYmUgYWxyZWFkeSB0b2xkIHVzIHRoaXMgcnVuJ3MgcHVibGljXG4gICAgICAvLyBrZXksIHNvIHNlYWwgdG8gaXQuIFRoYXQgc2tpcHMgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aGljaCBmb3IgYVxuICAgICAgLy8gY3Jvc3MtZGVwbG95bWVudCBzdGFydCBpcyBhIGBydW4ta2V5YCBBUEkgcmVxdWVzdCDigJQgdGhlIGxhc3Qgb25lIGxlZnRcbiAgICAgIC8vIG9uIHRoaXMgcGF0aC4gSXQgaXMgYWxzbyBhIHByaXZpbGVnZSByZWR1Y3Rpb246IHRoZSBjYWxsZXIgZW5kcyB1cFxuICAgICAgLy8gYWJsZSB0byB3cml0ZSB0aGUgYXJndW1lbnRzIGJ1dCBub3QgcmVhZCB0aGVtIGJhY2ssIHdoZXJlYXMgZmV0Y2hpbmdcbiAgICAgIC8vIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBmdWxsIHJlYWQgYWNjZXNzIHRvIGEgcnVuIGl0IG1lcmVseVxuICAgICAgLy8gbGF1bmNoZWQuXG4gICAgICBjb25zdCBwcm9iZWRQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkocHJvYmVkUnVuUHVibGljS2V5KTtcblxuICAgICAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAocHJvYmVkUHVibGljS2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBzZWFsVG8ocHJvYmVkUHVibGljS2V5KTtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHByb2JlZFJ1blB1YmxpY0tleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5JZCwge1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IHNvIHRoYXQgY3Jvc3MtcnVuIHdyaXRlcnMgKGFcbiAgICAgICAgLy8gaG9vayByZXN1bXB0aW9uIGZyb20gYW5vdGhlciBkZXBsb3ltZW50LCBhIHNpYmxpbmcgd3JpdGluZyBpbnRvIGFcbiAgICAgICAgLy8gZm9yd2FyZGVkIHN0cmVhbSkgY2FuIHNlYWwgcGF5bG9hZHMgKnRvKiB0aGlzIHJ1biB3aXRob3V0IGhvbGRpbmdcbiAgICAgICAgLy8gaXRzIHN5bW1ldHJpYyBrZXkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZXNlbmNlIG9mIHRoaXMgZmllbGQgaXMgdGhlIHdyaXRlci1zaWRlIGdhdGUgZm9yIHNlYWxlZFxuICAgICAgICAvLyBlbnZlbG9wZXMsIHNvIGl0IG11c3Qgb25seSBiZSBzdGFtcGVkIHdoZW4gdGhpcyBydW50aW1lIGNvdWxkXG4gICAgICAgIC8vIGl0c2VsZiBvcGVuIG9uZS4gVGhhdCBob2xkcyBieSBjb25zdHJ1Y3Rpb24gaGVyZTogZGVyaXZhdGlvbiBhbmRcbiAgICAgICAgLy8gYGVuY3BgIGRpc3BhdGNoIGxpdmUgaW4gdGhlIHNhbWUgcGFja2FnZSwgc28gYW55IGNvcmUgdGhhdCBjYW5cbiAgICAgICAgLy8gc3RhbXAgY2FuIGFsc28gb3Blbi4gUnVucyBhcmUgcGlubmVkIHRvIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsXG4gICAgICAgIC8vIHNvIHRoZSBjYXBhYmlsaXR5IHRoaXMgYXR0ZXN0cyB0byBpcyBzdGlsbCBhY2N1cmF0ZSBhdCByZXN1bWUgdGltZS5cbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHJhd0tleVxuICAgICAgICAgID8gYnl0ZXNUb0Jhc2U2NCgoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICAvLyBDb21wcmVzcyB3b3JrZmxvdyBhcmd1bWVudHMgb25seSB3aGVuIHRoZSBydW4gaXRzZWxmIGlzIG1hcmtlZCBhc1xuICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkQgdGhlXG4gICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCBjYW4gZGVjb2RlIHRoZW0gKHNhbWUtZGVwbG95bWVudCwgb3IgcHJvYmVkXG4gICAgICAvLyBjYXBhYmlsaXR5IGZvciBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0cykuXG4gICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gJiZcbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBjb21wcmVzc2lvblxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGVudmlyb25tZW50IHRoaXMgY2FsbGVyJ3Mgb3duIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgYXR0cmlidXRlZFxuICAgICAgLy8gdG8uIFN0YW1wZWQgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBydW5JbnB1dGAgKE5PVCBpbnRvXG4gICAgICAvLyBgcnVuX2NyZWF0ZWRgLCB3aG9zZSB0ZW5hbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBrbm93cykgc28gdGhlXG4gICAgICAvLyBkZXBsb3ltZW50IHRoYXQgY29uc3VtZXMgdGhlIG1lc3NhZ2UgY2FuIHRlbGwgd2hldGhlciB0aGUgcnVuIGl0IGlzXG4gICAgICAvLyBiZWluZyBhc2tlZCB0byByZXNpbGllbnRseSBjcmVhdGUgd2FzIGNyZWF0ZWQgYWdhaW5zdCBhIGRpZmZlcmVudFxuICAgICAgLy8gZW52aXJvbm1lbnQgdGhhbiBpdHMgb3duLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB0d28gd3JpdGVzIGJlbG93IGdvIHRvIGRpZmZlcmVudCBwbGFjZXMgYnkgZGlmZmVyZW50IHJvdXRlczpcbiAgICAgIC8vIGBldmVudHMuY3JlYXRlYCBpcyBhdHRyaWJ1dGVkIHRvIFRISVMgY2xpZW50J3MgdGVuYW50LCB3aGlsZSB0aGUgcXVldWVcbiAgICAgIC8vIG1lc3NhZ2UgaXMgcGlubmVkIHRvIGEgZGVwbG95bWVudElkLiBXaGVuIHRob3NlIGRpc2FncmVlIOKAlCBhXG4gICAgICAvLyBwcm9kdWN0aW9uLWNyZWRlbnRpYWxlZCBjbGllbnQgcGlubmluZyBhIHByZXZpZXcgZGVwbG95bWVudCDigJQgdGhlXG4gICAgICAvLyBwcmV2aWV3IGNvbnN1bWVyIGNhbid0IGZpbmQgdGhlIHJ1biBpbiBpdHMgb3duIHRlbmFudCwgZmFsbHMgYmFjayB0b1xuICAgICAgLy8gcmVzaWxpZW50IHN0YXJ0LCBhbmQgcmUtY3JlYXRlcyBpdDogb25lIGNsaWVudC1taW50ZWQgcnVuIGlkLCB0d29cbiAgICAgIC8vIGVudmlyb25tZW50cywgdGhlIHByb2R1Y3Rpb24gY29weSBwZW5kaW5nIGZvcmV2ZXIgYW5kIHRoZSBwcmV2aWV3IGNvcHlcbiAgICAgIC8vIGV4ZWN1dGluZy4gV29ybGRzIHdpdGggYSBzaW5nbGUgdGVuYW50IHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBmaWVsZFxuICAgICAgLy8gaXMgc2ltcGx5IGFic2VudC5cbiAgICAgIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHdvcmxkLmdldEVudmlyb25tZW50Py4oKTtcblxuICAgICAgLy8gSWYgV09SS0ZMT1dfVk0gaXMgc2V0IG9uIHRoZSBjbGllbnQgc3RhcnRpbmcgdGhlIHJ1biwgc3RhbXAgdGhlXG4gICAgICAvLyBlbmdpbmUgY2hvaWNlIGludG8gdGhlIHJ1bidzIGV4ZWN1dGlvbkNvbnRleHQgc28gdGhlIHJ1biBrZWVwc1xuICAgICAgLy8gZXhlY3V0aW5nIG9uIHRoZSBlbmdpbmUgaXQgc3RhcnRlZCBvbiAodGhlIHNhbWUgZGVwbG95bWVudCBjYW5cbiAgICAgIC8vIHNlcnZlIGJvdGggVk0gZW5naW5lcykuIFVua25vd24gdmFsdWVzIHRocm93IOKAlCBzZWVcbiAgICAgIC8vIGdldFdvcmtmbG93Vm1Gcm9tRW52KCkuXG4gICAgICBjb25zdCB3b3JrZmxvd1ZtID0gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgICAgLy8gQXR0ZXN0IHRoYXQgdGhlICpjb25zdW1lciogZGVwbG95bWVudCdzIHJ1bnRpbWUgcmUtZW5zdXJlcyBhXG4gICAgICAgIC8vIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGEgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgIG9uIHJlcGxheS5cbiAgICAgICAgLy8gQSByZXN1bWUgb2YgdGhpcyBydW4gcmVhZHMgdGhlIG1hcmtlciAobWlycm9yZWQgb250byB0aGUgaG9vaydzXG4gICAgICAgIC8vIHJlc3VtZUNvbnRleHQgYnkgdGhlIHNlcnZlcikgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBhcmFsbGVsIGZhc3RcbiAgICAgICAgLy8gcGF0aCBpcyBzYWZlLiBGb3IgYSBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IHRoZSBjb25zdW1lciBpcyB0aGVcbiAgICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHdlIHN0YW1wIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIGNhcnJpZWQgYmFjayBvblxuICAgICAgICAvLyB0aGUgaGVhbHRoLWNoZWNrIHByb2JlIOKAlCBuZXZlciB0aGUgY2FsbGVyJ3MuIE9taXR0ZWQgd2hlbiB3ZSBjb3VsZFxuICAgICAgICAvLyBub3QgYXR0ZXN0IHRoZSB0YXJnZXQgKG9sZGVyIHRhcmdldCwgdGltZW91dCwgb3Igbm8gcHJvYmUgY2hhbm5lbCksXG4gICAgICAgIC8vIHdoaWNoIGZhaWxzIHRoZSByZXN1bWUgZ2F0ZSBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgLi4uKHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtmbG93Vm0gPyB7IHdvcmtmbG93Vm0gfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWRcbiAgICAgICAgICA/IHsgcmVwbGF5ZWRGcm9tUnVuSWQ6IG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgb3B0cy5uYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oY3JlYXRvckVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHsgZW52aXJvbm1lbnQ6IGNyZWF0b3JFbnZpcm9ubWVudCB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIOKAlCB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixnQ0FBZ0MsRUFDaEMsMENBQTBDLEVBQzFDLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixtQkFBbUIsRUFDbkIsTUFBTSxHQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFF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dW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGdsb2JhbFNpbmdsZXRvbiB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFBBUkVOVF9SVU5fSURfQVRUUklCVVRFLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBkZWNvZGVSdW5QdWJsaWNLZXksXG4gIGRlcml2ZVJ1bktleVBhaXIsXG59IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgc2VhbFRvLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dWbUZyb21FbnYgfSBmcm9tICcuL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGRcbiAqIG1ha2UgYHN0YXJ0KHsgZGVwbG95bWVudElkOiAuLi4gfSlgIHNsb3dlciBmb3IgdXNlcnMgd2hvc2UgdGFyZ2V0XG4gKiBkZXBsb3ltZW50cyBkb24ndCByZWNvZ25pemUgdGhlIGhlYWx0aCBjaGVjayBhdCBhbGwuXG4gKi9cbmNvbnN0IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBDcm9zcy1ydW4gbGluZWFnZSBmb3IgYSBydW4gYmVpbmcgc3RhcnRlZCBmcm9tIGluc2lkZSBhbm90aGVyIHJ1bi5cbiAqXG4gKiBUaGUgYW1iaWVudCBzdGVwIGNvbnRleHQgY2FycmllcyB0aGUgcGFyZW50IHJ1biBpZCBhbmQgdGhlIHJvb3Qgb2YgaXRzXG4gKiBsaW5lYWdlOyB0aGUgcnVudGltZSBmaWxscyBib3RoIGZyb20gdGhlIHJ1biBpdCBhbHJlYWR5IGhhcyBsb2FkZWQsIHNvIHRoaXNcbiAqIGlzIGEgcHVyZSBjb250ZXh0IHJlYWQgd2l0aCBubyBJL08uIFRoZSBuZXcgcnVuIHJlY29yZHMgYCRwYXJlbnRSdW5JZGAgKHRoZVxuICogZWRnZSkgYW5kIGluaGVyaXRzIHRoZSBwYXJlbnQncyBgJHJvb3RSdW5JZGAgKHRoZSBwYXJlbnQgaXRzZWxmIHdoZW4gaXQgaXMgYVxuICogcm9vdCksIHNvIGEgZGFpc3kgY2hhaW4gb3IgZmFuLW91dCBvZiBhbnkgZGVwdGggZ3JvdXBzIHVuZGVyIG9uZSByb290IGlkLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYSB0b3AtbGV2ZWwgYHN0YXJ0KClgLCB3aGljaCBoYXMgbm8gY29udGV4dCwgc29cbiAqIHN0YW5kYWxvbmUgcnVucyBjYXJyeSBubyBsaW5lYWdlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0b3JlID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgY29uc3QgcGFyZW50UnVuSWQgPSBzdG9yZT8ud29ya2Zsb3dNZXRhZGF0YT8ud29ya2Zsb3dSdW5JZDtcbiAgaWYgKCFwYXJlbnRSdW5JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIFtST09UX1JVTl9JRF9BVFRSSUJVVEVdOiBzdG9yZS5yb290UnVuSWQgPz8gcGFyZW50UnVuSWQsXG4gICAgW1BBUkVOVF9SVU5fSURfQVRUUklCVVRFXTogcGFyZW50UnVuSWQsXG4gIH07XG59XG5cbi8vIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBpcyBhIG5vLW9wIGluIFdvcmxkcyB3aXRob3V0IGF0b21pYyBkZXBsb3ltZW50cy5cbi8vIFRoZSB3YXJuaW5nIHRoYXQgZXhwbGFpbnMgdGhpcyBvbmx5IG5lZWRzIHRvIGZpcmUgb25jZSBwZXIgcHJvY2VzczogYVxuLy8gd29ya2Zsb3cgdGhhdCBoYXJkY29kZXMgJ2xhdGVzdCcgZm9yIGl0cyBWZXJjZWwgZGVwbG95bWVudCB3b3VsZCBvdGhlcndpc2Vcbi8vIGxvZyBpdCBvbiBldmVyeSBsb2NhbC9Qb3N0Z3JlcyBydW4sIGZsb29kaW5nIHRpZ2h0IGRldiBsb29wcy5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKSBzbyBcIm9uY2UgcGVyIHByb2Nlc3NcIiBpcyBub3Qgb25jZVxuLy8gcGVyIGJ1bmRsZXIgbGF5ZXIuXG5jb25zdCBsYXRlc3ROb09wV2FybmluZyA9IGdsb2JhbFNpbmdsZXRvbihcbiAgJ0B3b3JrZmxvdy9jb3JlLy9sYXRlc3ROb09wV2FybmluZycsXG4gIDEsXG4gICgpID0+ICh7IHdhcm5lZDogZmFsc2UgfSlcbik7XG5cbi8qKlxuICogUmVzZXQgdGhlIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBuby1vcCB3YXJuLW9uY2UgZ3VhcmQuIFRlc3Qtb25seSxcbiAqIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggYWNyb3NzIGBzdGFydCgpYCBjYWxscy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldExhdGVzdE5vT3BXYXJuRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdpb24gaWRlbnRpZmllciBmb3IgdGhlIG5ldyBydW4uIEN1cnJlbnRseSBjb25zdW1lZCBvbmx5XG4gICAqIGJ5IGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCwgd2hpY2ggZW1iZWRzIHRoZSByZWdpb24gaW50byB0aGUgdGFnZ2VkXG4gICAqIHJ1biBJRCBhbmQgcm91dGVzIHRoZSBpbml0aWFsIHdvcmtmbG93IG1lc3NhZ2UgdG8gdGhlIG1hdGNoaW5nXG4gICAqIHJlZ2lvbmFsIHF1ZXVlLiBXaGVuIG9taXR0ZWQsIHRoZSB3b3JsZCBmYWxscyBiYWNrIHRvIGl0cyBvd25cbiAgICogZGVmYXVsdCAoZm9yIGB3b3JsZC12ZXJjZWxgOiB0aGUgYFZFUkNFTF9SRUdJT05gIGVudmlyb25tZW50XG4gICAqIHZhcmlhYmxlLCB0aGVuIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IHJlZ2lvbiBgaWFkMWA7IGEgY29uY3JldGUsXG4gICAqIHJvdXRhYmxlIHJlZ2lvbiBpcyBhbHdheXMgY2hvc2VuKS5cbiAgICpcbiAgICogV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlIHRoaXMgZmllbGQuXG4gICAqL1xuICByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBzZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIGV4aXN0aW5nIHJ1biB0aGlzIHJ1biBpcyBiZWluZyByZXBsYXllZCBmcm9tLCBpZiBhbnkuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBuZXcgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHRgIGFzIGByZXBsYXllZEZyb21SdW5JZGAgc29cbiAgICogdG9vbGluZyAoZS5nLiB0aGUgZGFzaGJvYXJkIHJ1bnMgbGlzdCkgY2FuIHNob3cgdGhhdCBhIHJ1biBvcmlnaW5hdGVkIGFzXG4gICAqIGEgcmVwbGF5IGFuZCBsaW5rIGJhY2sgdG8gaXRzIHNvdXJjZS4gU2V0IGF1dG9tYXRpY2FsbHkgYnlcbiAgICoge0BsaW5rIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nfTsgdGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbiB0byBwYXNzIGl0XG4gICAqIGRpcmVjdGx5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcnVuIElEOiBgd3J1bl9gIGZvbGxvd2VkIGJ5IGEgMjYtY2hhciBVTElELiBJdCdzIGEgZm9yZWlnbiBrZXlcbiAgICogdG8gdGhlIHNvdXJjZSBydW4sIHNvIGBzdGFydCgpYCB2YWxpZGF0ZXMgdGhlIGV4YWN0IHNoYXBlIGFuZCByZWplY3RzXG4gICAqIGFueXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gcGVyc2lzdCBhIGxpbmVhZ2UgbGluayB0aGF0IHBvaW50cyBhdCBnYXJiYWdlLlxuICAgKi9cbiAgcmVwbGF5ZWRGcm9tUnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50LiBTY29wZXMgdGhlIHdvcmtmbG93IHF1ZXVlXG4gICAqIHRvcGljIHRvIGBfX3tuYW1lc3BhY2V9X3drZl93b3JrZmxvd18qYCAoZS5nLiBgJ2V2ZSdgKSBpbnN0ZWFkIG9mIHRoZVxuICAgKiBkZWZhdWx0IGBfX3drZl93b3JrZmxvd18qYCwgYW5kIGlzIGFsc28gdXNlZCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnRcbiAgICogY2FwYWJpbGl0eSBwcm9iZS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBXaXRoaW4gYSBkZXBsb3ltZW50IHRoZSBlbnYgZmFsbGJhY2sgaXMgY29ycmVjdC4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzXG4gICAqIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCByZXBsYXlpbmcgYSBydW4pIG11c3QgcGFzcyB0aGVcbiAgICogVEFSR0VUIGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpblxuICAgKiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgcnVuIGVucXVldWVkIHRvIGEgdG9waWMgdGhlIHRhcmdldCBoYXMgbm9cbiAgICogY29uc3VtZXIgZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBJRCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiB3aGVuIGRlcGxveWluZyB0byBWZXJjZWwuXG4gICAqXG4gICAqIFNldCB0byBgJ2xhdGVzdCdgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgbW9zdCByZWNlbnQgZGVwbG95bWVudFxuICAgKiBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3IgZ2l0IGJyYW5jaCkuXG4gICAqIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aXRoIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzXG4gICAqIChjdXJyZW50bHkgVmVyY2VsKS4gSW4gb3RoZXIgd29ybGRzIChsb2NhbCBkZXYsIFBvc3RncmVzKSB0aGVyZSBpcyBub1xuICAgKiBub3Rpb24gb2YgbXVsdGlwbGUgZGVwbG95bWVudHMgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyBgJ2xhdGVzdCdgIGhhcyBub1xuICAgKiBlZmZlY3Q6IGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBydW4gdGFyZ2V0cyB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW5OYW1lID0gYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWA7XG4gICAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpO1xuICAgICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgICBjb25zdCBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gY3VycmVudERlcGxveW1lbnRJZDtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBSZXNvbHZpbmcgJ2xhdGVzdCcgb25seSBtZWFucyBzb21ldGhpbmcgaW4gd29ybGRzIHdpdGggYXRvbWljLFxuICAgICAgLy8gaW1tdXRhYmxlIGRlcGxveW1lbnRzIChlLmcuIFZlcmNlbCksIHdoaWNoIGltcGxlbWVudFxuICAgICAgLy8gcmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpLiBXb3JsZHMgd2l0aG91dCB0aGF0IGNvbmNlcHQgKGxvY2FsIGRldixcbiAgICAgIC8vIHNlbGYtaG9zdGVkIFBvc3RncmVzKSBoYXZlIG5vdGhpbmcgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyByYXRoZXIgdGhhblxuICAgICAgLy8gZmFpbCBhIHJ1biB0aGF0IHdvcmtzIGZpbmUgb24gVmVyY2VsLCB3ZSB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBjdXJyZW50IGRlcGxveW1lbnQsIG1ha2luZyAnbGF0ZXN0JyBhbiBlZmZlY3RpdmUgbm8tb3AgdGhlcmUuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAod29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXYXJuIG9uY2UgcGVyIHByb2Nlc3M7IHNlZSBsYXRlc3ROb09wV2FybmluZy53YXJuZWQgYWJvdmUuXG4gICAgICAgICAgaWYgKCFsYXRlc3ROb09wV2FybmluZy53YXJuZWQpIHtcbiAgICAgICAgICAgIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIFwiZGVwbG95bWVudElkOiAnbGF0ZXN0JyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgd29ybGQgYW5kIHdhcyBpZ25vcmVkLiBcIiArXG4gICAgICAgICAgICAgICAgJ0l0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHdvcmxkcyB3aXRoIGF0b21pYyBkZXBsb3ltZW50cywgc3VjaCBhcyBWZXJjZWwuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgcnVuIHdpbGwgdGFyZ2V0IHRoZSBjdXJyZW50IGRlcGxveW1lbnQuJyxcbiAgICAgICAgICAgICAgeyBjdXJyZW50RGVwbG95bWVudElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGN1cnJlbnREZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgYnl0ZSBzdHJlYW1zIGluIHRoZSBmcmFtZWQgd2lyZSBmb3JtYXQuXG4gICAgICAvLyBGb3Igc2FtZS1kZXBsb3ltZW50IHN0YXJ0cyAodGhlIGNvbW1vbiBjYXNlKSB3ZSBrbm93IHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIHJ1bm5pbmcgdGhpcyBzYW1lIFNESyB2ZXJzaW9uLCBzbyBmcmFtaW5nIGlzIHNhZmUuIEZvciBjcm9zcy1cbiAgICAgIC8vIGRlcGxveW1lbnQgc3RhcnRzIChleHBsaWNpdCBkZXBsb3ltZW50SWQgb3IgJ2xhdGVzdCcgdGhhdCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgZGVwbG95bWVudCkgd2UgcHJvYmUgdGhlIHRhcmdldCB2aWEgaGVhbHRoQ2hlY2sgdG9cbiAgICAgIC8vIGxlYXJuIGl0cyB3b3JrZmxvdy1jb3JlIHZlcnNpb24sIHRoZW4gZGVyaXZlIHRoZSBjYXBhYmlsaXR5LiBUaGVcbiAgICAgIC8vIHByb2JlIGhhcyBhIHRpZ2h0IHRpbWVvdXQ6IG9uIG1pc3MvZmFpbHVyZSB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBsZWdhY3kgcmF3IGJ5dGUgZm9ybWF0LCB3aGljaCBpcyB1bml2ZXJzYWxseSByZWFkYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBXb3JsZHMgdGhhdCBkb24ndCBleHBvc2UgdGhlIGBzdHJlYW1zYCBBUEkgKGUuZy4gbWluaW1hbCB0ZXN0XG4gICAgICAvLyBtb2NrcykgY2FuJ3Qgc2VydmljZSBoZWFsdGggY2hlY2tzLCBzbyB3ZSBza2lwIHRoZSBwcm9iZSBmb3IgdGhlbS5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlXG4gICAgICAvLyBlbmNyeXB0aW9uIGNvbnRleHQpLiBXaGVuIHRoZSBXb3JsZCBwcm92aWRlcyBhIGBjcmVhdGVSdW5JZCgpYFxuICAgICAgLy8gaW1wbGVtZW50YXRpb24sIHVzZSBpdCBzbyB3b3JsZHMgY2FuIGVtYmVkIGltcGxlbWVudGF0aW9uLXNwZWNpZmljXG4gICAgICAvLyBtZXRhZGF0YSAoZS5nLiwgcmVnaW9uKSBpbnRvIHRoZSBJRCwgZm9yd2FyZGluZyB0aGUgZnVsbCBvcHRpb25zXG4gICAgICAvLyBiYWcgc28gd29ybGRzIGNhbiByZWFkIHdoaWNoZXZlciBmaWVsZHMgdGhleSByZWNvZ25pc2U7IG90aGVyd2lzZVxuICAgICAgLy8gZmFsbCBiYWNrIHRvIGEgc3RhbmRhcmQgbW9ub3RvbmljIFVMSUQuXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7XG4gICAgICAgIHdvcmxkLmNyZWF0ZVJ1bklkXG4gICAgICAgICAgPyB3b3JsZC5jcmVhdGVSdW5JZChvcHRzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgICAgICA6IHVsaWQoKVxuICAgICAgfWA7XG5cbiAgICAgIGxldCBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbiAgICAgIGxldCB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uOiBib29sZWFuO1xuICAgICAgLy8gVGhlIGNvbnN1bWVyJ3MgaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgc3RhbXBlZCBvbnRvIHRoZSBuZXcgcnVuXG4gICAgICAvLyBzbyBhIGxhdGVyIGByZXN1bWVIb29rKClgIGdhdGVzIGl0cyBwYXJhbGxlbCBwYXRoIG9uIHRoZSBkZXBsb3ltZW50XG4gICAgICAvLyB0aGF0IHdpbGwgYWN0dWFsbHkgY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJjb3VsZFxuICAgICAgLy8gbm90IGF0dGVzdFwiIGFuZCBmYWlscyB0aGUgZ2F0ZSBjbG9zZWQuXG4gICAgICBsZXQgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gUHVibGljIGtleSBvZiB0aGUgdGFyZ2V0IHJ1biwgd2hlbiB0aGUgY2FwYWJpbGl0eSBwcm9iZSB3YXMgYWJsZSB0b1xuICAgICAgLy8gc3VwcGx5IG9uZSAoY3Jvc3MtZGVwbG95bWVudCBvbmx5KS5cbiAgICAgIGxldCBwcm9iZWRSdW5QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgLy8gU2FtZSBkZXBsb3ltZW50OiB0aGlzIHByb2Nlc3MgaXMgdGhlIGNvbnN1bWVyLCBzbyBpdHMgb3duIGNvbnN0YW50XG4gICAgICAgIC8vIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgLy8gTm8gcHJvYmUgY2hhbm5lbCB0byB0aGUgdGFyZ2V0LCBzbyB3ZSBjYW5ub3QgYXR0ZXN0IHRoZSBjb25zdW1lclxuICAgICAgICAvLyBob25vcnMgYGhvb2tJbnB1dGA7IGxlYXZlIHRoZSBtYXJrZXIgb2ZmIChmYWlsIGNsb3NlZCB0b1xuICAgICAgICAvLyBzZXF1ZW50aWFsKS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzayBmb3IgdGhpcyBydW4ncyBwdWJsaWMga2V5IHdoaWxlIHdlJ3JlIGhlcmUuIFRoZSBwcm9iZSBhbHJlYWR5XG4gICAgICAgIC8vIGJsb2NrcyBgc3RhcnQoKWAgb24gZXZlcnkgY3Jvc3MtZGVwbG95bWVudCBjYWxsLCBhbmQgdGhlIHJlc3BvbmRlclxuICAgICAgICAvLyBleGVjdXRlcyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50IHdoZXJlIHRoZSBrZXkgbWF0ZXJpYWwgaXNcbiAgICAgICAgLy8gbG9jYWwsIHNvIHRoZSBrZXkgY29tZXMgYmFjayBmb3IgZnJlZSBvbiBhIHJlc3BvbnNlIHdlIGFyZVxuICAgICAgICAvLyBhbHJlYWR5IGF3YWl0aW5nLCBhbmQgd2UgY2FuIHNraXAgdGhlIGtleS1sb29rdXAgQVBJIHJlcXVlc3RcbiAgICAgICAgLy8gZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBvbiB0aW1lb3V0IG9yIGFuIG9sZGVyIHRhcmdldCwgbm8ga2V5IGNvbWVzXG4gICAgICAgIC8vIGJhY2sgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBsb29rdXAgYmVsb3cuXG4gICAgICAgIGNvbnN0IHByb2JlID0gYXdhaXQgaGVhbHRoQ2hlY2sod29ybGQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdGltZW91dDogQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMsXG4gICAgICAgICAgbmFtZXNwYWNlOiBvcHRzLm5hbWVzcGFjZSxcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgcHJvYmVkUnVuUHVibGljS2V5ID0gcHJvYmU/LmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvbik7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGUgcmVzcG9uZGVyIHJ1bnMgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gICAgICAgIC8vIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCByZWZsZWN0cyB0aGUgY29uc3VtZXIuIFVuZGVmaW5lZCBvbiBhblxuICAgICAgICAvLyBvbGRlciB0YXJnZXQgb3IgYSBwcm9iZSB0aW1lb3V0LCBsZWF2aW5nIHRoZSBtYXJrZXIgb2ZmLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcHJvYmU/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIERlZmF1bHQgbmV3IHJ1bnMgdG8gdGhlIGNvbmZpZ3VyZWQgd29ybGQncyBzcGVjIHZlcnNpb24uIFRoZSB3b3JsZFxuICAgICAgLy8gaXRzZWxmIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBhZ2FpbnN0IHRoaXMgcnVudGltZSdzIHNwZWMgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gb3B0cy5zcGVjVmVyc2lvbiA/PyB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG4gICAgICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdHMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gICAgICBsZXQgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRzLmF0dHJpYnV0ZXMgJiYgT2JqZWN0LmtleXMob3B0cy5hdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzcGVjVmVyc2lvbiA8IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgJ0luaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlcyByZXF1aXJlIGEgV29ybGQgdGhhdCBzdXBwb3J0cyBzcGVjIHZlcnNpb24gNCBvciBsYXRlci4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlc2AgdHJlYXRzIGB1bmRlZmluZWRgIGFzIFwicmVtb3ZlIHRoaXNcbiAgICAgICAgLy8ga2V5XCIsIHdoaWNoIGlzIG1lYW5pbmdsZXNzIGF0IGNyZWF0aW9uIHRpbWUuIFJlamVjdCBpdCB1cCBmcm9udFxuICAgICAgICAvLyBzbyBKUyBjYWxsZXJzIGdldCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2YgYSBkb3duc3RyZWFtIHNjaGVtYVxuICAgICAgICAvLyBmYWlsdXJlICh0aGUgdHlwZXMgYWxyZWFkeSBmb3JiaWQgbm9uLXN0cmluZyB2YWx1ZXMpLlxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLmF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEluaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gbXVzdCBiZSBhIHN0cmluZyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhvcHRzLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgY2hhbmdlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBba2V5LCB2YWx1ZSBhcyBzdHJpbmddKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcm9zcy1ydW4gbGluZWFnZTogdGhlIHJlc2VydmVkIGtleXMgcmlkZSBvbiB0aGUgcnVuJ3MgZXhpc3RpbmdcbiAgICAgIC8vIGF0dHJpYnV0ZXMsIHNvIHRoZXkgYWRkIG5vIGV4dHJhIHdyaXRlLiBDYWxsZXIgYXR0cmlidXRlcyBhcmUgc3ByZWFkXG4gICAgICAvLyBsYXN0LCBzbyBhIGNhbGxlciB3aXRoIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIGNhbiBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIHJlLXBhcmVudC5cbiAgICAgIGNvbnN0IGxpbmVhZ2UgPVxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFU1xuICAgICAgICAgID8gcmVzb2x2ZUxpbmVhZ2VBdHRyaWJ1dGVzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJ1bkF0dHJpYnV0ZXMgPSBsaW5lYWdlXG4gICAgICAgID8geyAuLi5saW5lYWdlLCAuLi5hdHRyaWJ1dGVzIH1cbiAgICAgICAgOiBhdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBTaGFyZWQgYnkgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50IGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlIGlucHV0LlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IHJ1bkF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIHx8IGxpbmVhZ2UgIT0gbnVsbFxuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzLlxuICAgICAgLy9cbiAgICAgIC8vIFByZWZlcnJlZDogdGhlIGNhcGFiaWxpdHkgcHJvYmUgYWxyZWFkeSB0b2xkIHVzIHRoaXMgcnVuJ3MgcHVibGljXG4gICAgICAvLyBrZXksIHNvIHNlYWwgdG8gaXQuIFRoYXQgc2tpcHMgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aGljaCBmb3IgYVxuICAgICAgLy8gY3Jvc3MtZGVwbG95bWVudCBzdGFydCBpcyBhIGBydW4ta2V5YCBBUEkgcmVxdWVzdCwgdGhlIGxhc3Qgb25lIGxlZnRcbiAgICAgIC8vIG9uIHRoaXMgcGF0aC4gSXQgaXMgYWxzbyBhIHByaXZpbGVnZSByZWR1Y3Rpb246IHRoZSBjYWxsZXIgZW5kcyB1cFxuICAgICAgLy8gYWJsZSB0byB3cml0ZSB0aGUgYXJndW1lbnRzIGJ1dCBub3QgcmVhZCB0aGVtIGJhY2ssIHdoZXJlYXMgZmV0Y2hpbmdcbiAgICAgIC8vIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBmdWxsIHJlYWQgYWNjZXNzIHRvIGEgcnVuIGl0IG1lcmVseVxuICAgICAgLy8gbGF1bmNoZWQuXG4gICAgICBjb25zdCBwcm9iZWRQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkocHJvYmVkUnVuUHVibGljS2V5KTtcblxuICAgICAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAocHJvYmVkUHVibGljS2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBzZWFsVG8ocHJvYmVkUHVibGljS2V5KTtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHByb2JlZFJ1blB1YmxpY0tleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5JZCwge1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IHNvIHRoYXQgY3Jvc3MtcnVuIHdyaXRlcnMgKGFcbiAgICAgICAgLy8gaG9vayByZXN1bXB0aW9uIGZyb20gYW5vdGhlciBkZXBsb3ltZW50LCBhIHNpYmxpbmcgd3JpdGluZyBpbnRvIGFcbiAgICAgICAgLy8gZm9yd2FyZGVkIHN0cmVhbSkgY2FuIHNlYWwgcGF5bG9hZHMgKnRvKiB0aGlzIHJ1biB3aXRob3V0IGhvbGRpbmdcbiAgICAgICAgLy8gaXRzIHN5bW1ldHJpYyBrZXkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZXNlbmNlIG9mIHRoaXMgZmllbGQgaXMgdGhlIHdyaXRlci1zaWRlIGdhdGUgZm9yIHNlYWxlZFxuICAgICAgICAvLyBlbnZlbG9wZXMsIHNvIGl0IG11c3Qgb25seSBiZSBzdGFtcGVkIHdoZW4gdGhpcyBydW50aW1lIGNvdWxkXG4gICAgICAgIC8vIGl0c2VsZiBvcGVuIG9uZS4gVGhhdCBob2xkcyBieSBjb25zdHJ1Y3Rpb24gaGVyZTogZGVyaXZhdGlvbiBhbmRcbiAgICAgICAgLy8gYGVuY3BgIGRpc3BhdGNoIGxpdmUgaW4gdGhlIHNhbWUgcGFja2FnZSwgc28gYW55IGNvcmUgdGhhdCBjYW5cbiAgICAgICAgLy8gc3RhbXAgY2FuIGFsc28gb3Blbi4gUnVucyBhcmUgcGlubmVkIHRvIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsXG4gICAgICAgIC8vIHNvIHRoZSBjYXBhYmlsaXR5IHRoaXMgYXR0ZXN0cyB0byBpcyBzdGlsbCBhY2N1cmF0ZSBhdCByZXN1bWUgdGltZS5cbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHJhd0tleVxuICAgICAgICAgID8gYnl0ZXNUb0Jhc2U2NCgoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICAvLyBDb21wcmVzcyB3b3JrZmxvdyBhcmd1bWVudHMgb25seSB3aGVuIHRoZSBydW4gaXRzZWxmIGlzIG1hcmtlZCBhc1xuICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkQgdGhlXG4gICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCBjYW4gZGVjb2RlIHRoZW0gKHNhbWUtZGVwbG95bWVudCwgb3IgcHJvYmVkXG4gICAgICAvLyBjYXBhYmlsaXR5IGZvciBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0cykuXG4gICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gJiZcbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBjb21wcmVzc2lvblxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGVudmlyb25tZW50IHRoaXMgY2FsbGVyJ3Mgb3duIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgYXR0cmlidXRlZFxuICAgICAgLy8gdG8uIFN0YW1wZWQgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBydW5JbnB1dGAgKE5PVCBpbnRvXG4gICAgICAvLyBgcnVuX2NyZWF0ZWRgLCB3aG9zZSB0ZW5hbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBrbm93cykgc28gdGhlXG4gICAgICAvLyBkZXBsb3ltZW50IHRoYXQgY29uc3VtZXMgdGhlIG1lc3NhZ2UgY2FuIHRlbGwgd2hldGhlciB0aGUgcnVuIGl0IGlzXG4gICAgICAvLyBiZWluZyBhc2tlZCB0byByZXNpbGllbnRseSBjcmVhdGUgd2FzIGNyZWF0ZWQgYWdhaW5zdCBhIGRpZmZlcmVudFxuICAgICAgLy8gZW52aXJvbm1lbnQgdGhhbiBpdHMgb3duLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB0d28gd3JpdGVzIGJlbG93IGdvIHRvIGRpZmZlcmVudCBwbGFjZXMgYnkgZGlmZmVyZW50IHJvdXRlczpcbiAgICAgIC8vIGBldmVudHMuY3JlYXRlYCBpcyBhdHRyaWJ1dGVkIHRvIFRISVMgY2xpZW50J3MgdGVuYW50LCB3aGlsZSB0aGUgcXVldWVcbiAgICAgIC8vIG1lc3NhZ2UgaXMgcGlubmVkIHRvIGEgZGVwbG95bWVudElkLiBXaGVuIHRob3NlIGRpc2FncmVlIChhXG4gICAgICAvLyBwcm9kdWN0aW9uLWNyZWRlbnRpYWxlZCBjbGllbnQgcGlubmluZyBhIHByZXZpZXcgZGVwbG95bWVudCkgdGhlXG4gICAgICAvLyBwcmV2aWV3IGNvbnN1bWVyIGNhbid0IGZpbmQgdGhlIHJ1biBpbiBpdHMgb3duIHRlbmFudCwgZmFsbHMgYmFjayB0b1xuICAgICAgLy8gcmVzaWxpZW50IHN0YXJ0LCBhbmQgcmUtY3JlYXRlcyBpdDogb25lIGNsaWVudC1taW50ZWQgcnVuIGlkLCB0d29cbiAgICAgIC8vIGVudmlyb25tZW50cywgdGhlIHByb2R1Y3Rpb24gY29weSBwZW5kaW5nIGZvcmV2ZXIgYW5kIHRoZSBwcmV2aWV3IGNvcHlcbiAgICAgIC8vIGV4ZWN1dGluZy4gV29ybGRzIHdpdGggYSBzaW5nbGUgdGVuYW50IHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBmaWVsZFxuICAgICAgLy8gaXMgYWJzZW50LlxuICAgICAgY29uc3QgY3JlYXRvckVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuXG4gICAgICAvLyBJZiBXT1JLRkxPV19WTSBpcyBzZXQgb24gdGhlIGNsaWVudCBzdGFydGluZyB0aGUgcnVuLCBzdGFtcCB0aGVcbiAgICAgIC8vIGVuZ2luZSBjaG9pY2UgaW50byB0aGUgcnVuJ3MgZXhlY3V0aW9uQ29udGV4dCBzbyB0aGUgcnVuIGtlZXBzXG4gICAgICAvLyBleGVjdXRpbmcgb24gdGhlIGVuZ2luZSBpdCBzdGFydGVkIG9uICh0aGUgc2FtZSBkZXBsb3ltZW50IGNhblxuICAgICAgLy8gc2VydmUgYm90aCBWTSBlbmdpbmVzKS4gVW5rbm93biB2YWx1ZXMgdGhyb3c7IHNlZVxuICAgICAgLy8gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKS5cbiAgICAgIGNvbnN0IHdvcmtmbG93Vm0gPSBnZXRXb3JrZmxvd1ZtRnJvbUVudigpO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAvLyBBdHRlc3QgdGhhdCB0aGUgKmNvbnN1bWVyKiBkZXBsb3ltZW50J3MgcnVudGltZSByZS1lbnN1cmVzIGFcbiAgICAgICAgLy8gYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IGZyb20gYSBxdWV1ZSBtZXNzYWdlJ3MgYGhvb2tJbnB1dGAgb24gcmVwbGF5LlxuICAgICAgICAvLyBBIHJlc3VtZSBvZiB0aGlzIHJ1biByZWFkcyB0aGUgbWFya2VyIChtaXJyb3JlZCBvbnRvIHRoZSBob29rJ3NcbiAgICAgICAgLy8gcmVzdW1lQ29udGV4dCBieSB0aGUgc2VydmVyKSB0byBkZWNpZGUgd2hldGhlciB0aGUgcGFyYWxsZWwgZmFzdFxuICAgICAgICAvLyBwYXRoIGlzIHNhZmUuIEZvciBhIGNyb3NzLWRlcGxveW1lbnQgc3RhcnQgdGhlIGNvbnN1bWVyIGlzIHRoZVxuICAgICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCwgc28gd2Ugc3RhbXAgdGhlICp0YXJnZXQncyogdmFsdWUgY2FycmllZCBiYWNrIG9uXG4gICAgICAgIC8vIHRoZSBoZWFsdGgtY2hlY2sgcHJvYmUsIG5ldmVyIHRoZSBjYWxsZXIncy4gT21pdHRlZCB3aGVuIHdlIGNvdWxkXG4gICAgICAgIC8vIG5vdCBhdHRlc3QgdGhlIHRhcmdldCAob2xkZXIgdGFyZ2V0LCB0aW1lb3V0LCBvciBubyBwcm9iZSBjaGFubmVsKSxcbiAgICAgICAgLy8gd2hpY2ggZmFpbHMgdGhlIHJlc3VtZSBnYXRlIGNsb3NlZCB0byB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAuLi4odGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGhvb2tSZXN1bWVJbnB1dFZlcnNpb246IHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4od29ya2Zsb3dWbSA/IHsgd29ya2Zsb3dWbSB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5yZXBsYXllZEZyb21SdW5JZFxuICAgICAgICAgID8geyByZXBsYXllZEZyb21SdW5JZDogb3B0cy5yZXBsYXllZEZyb21SdW5JZCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBhbmQgcXVldWUgaW4gcGFyYWxsZWwuXG4gICAgICAvLyBJZiBldmVudHMuY3JlYXRlIGZhaWxzIHdpdGggNDI5LzV4eCwgdGhlIHJ1biB3YXMgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIHZpYSB0aGUgcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICBjb25zdCBbcnVuQ3JlYXRlZFJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgLi4uKGVuY3J5cHRpb25QdWJsaWNLZXkgPyB7IGVuY3J5cHRpb25QdWJsaWNLZXkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHYxQ29tcGF0IH1cbiAgICAgICAgKSxcbiAgICAgICAgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBvcHRzLm5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAuLi4oc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihjcmVhdG9yRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgID8geyBlbnZpcm9ubWVudDogY3JlYXRvckVudmlyb25tZW50IH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAvLyBGb3J3YXJkIGFueSBjYWxsZXItc3VwcGxpZWQgcmVnaW9uIGhpbnQgc28gd29ybGRzIHdpdGhcbiAgICAgICAgICAgIC8vIHBlci1yZWdpb24gcXVldWUgcm91dGluZyAoZS5nLiB3b3JsZC12ZXJjZWwpIGNhbiB0YXJnZXQgdGhlXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBxdWV1ZS4gV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlXG4gICAgICAgICAgICAvLyB0aGlzIGZpZWxkLlxuICAgICAgICAgICAgLi4uKG9wdHMucmVnaW9uICE9PSB1bmRlZmluZWQgPyB7IHJlZ2lvbjogb3B0cy5yZWdpb24gfSA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWw6IHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvciksIDV4eCwgYW5kIHRyYW5zaWVudCB0cmFuc3BvcnQgZmFpbHVyZXNcbiAgICAgICAgICAvLyAoVFJBTlNQT1JUL1RJTUVPVVQpIGFyZSByZXRyeWFibGU6IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGVcbiAgICAgICAgICAvLyBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBieSB0aGUgcnVudGltZSB3aGVuIGl0IGNhbGxzXG4gICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQuXG4gICAgICAgICAgcmVzaWxpZW50U3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdSdW4gY3JlYXRpb24gZXZlbnQgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZS4gJyArXG4gICAgICAgICAgICAgICdUaGUgcnVuX2NyZWF0ZWQgZXZlbnQgd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS4nLFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgZXJyb3I6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZTtcbiAgICAgICAgLy8gVmVyaWZ5IHNlcnZlciBhY2NlcHRlZCBvdXIgcnVuSWRcbiAgICAgICAgaWYgKCF2MUNvbXBhdCAmJiByZXN1bHQucnVuLnJ1bklkICE9PSBydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IHJ1bklkIHRoYW4gcmVxdWVzdGVkOiBleHBlY3RlZCAke3J1bklkfSwgZ290ICR7cmVzdWx0LnJ1bi5ydW5JZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVzZSBhcmd1bWVudC1zdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvIHVuZXhwZWN0ZWRcbiAgICAgIC8vIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ0JhY2tncm91bmQgZmx1c2ggb2Ygd29ya2Zsb3cgYXJndW1lbnQgc3RyZWFtcyBmYWlsZWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQpLFxuICAgICAgICAuLi4ocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW4uc3RhdHVzKVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgUnVuPFRSZXN1bHQ+KHJ1bklkLCB7IHJlc2lsaWVudFN0YXJ0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import type { Event, SerializedData, World } from '@workflow/world';
1
+ import type { Event, SerializedData, StartedStep, World } from '@workflow/world';
2
2
  import type { PayloadKey } from '../serialization/encryption.js';
3
3
  import { type SlotSnapshotParams } from './helpers.js';
4
4
  import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
@@ -12,6 +12,8 @@ export interface StepExecutorParams {
12
12
  workflowDeploymentId?: string;
13
13
  workflowName: string;
14
14
  workflowStartedAt: number;
15
+ /** Request ID of the invocation executing this step, when provided by its queue. */
16
+ requestId?: string;
15
17
  /** Root run id of this run's lineage, carried into the step context. */
16
18
  rootRunId?: string;
17
19
  stepId: string;
@@ -35,14 +37,25 @@ export interface StepExecutorParams {
35
37
  * carries no payload (the legacy contract).
36
38
  */
37
39
  lazyStepInput?: SerializedData;
40
+ /**
41
+ * Pre-claimed inline start: the suspension handler committed (or lost) this
42
+ * step's `step_created` + `step_started` pair inside its batched fan-out
43
+ * write, so the start this executor would otherwise send has already been
44
+ * decided. `owned: false` returns `{ type: 'skipped' }` before any write,
45
+ * the same outcome as losing the lazy claim's atomic create. `owned: true`
46
+ * skips both start paths (no start write at all) and runs the body against
47
+ * the claimed step. Mutually exclusive with `lazyStepInput`: the input
48
+ * already rode the pair's `step_created`, and the claimed step carries it.
49
+ */
50
+ preclaimedStart?: PreclaimedInlineStart;
38
51
  /**
39
52
  * Inline step ownership: the queue message ID of the invocation this
40
53
  * executeStep call runs in (from the queue handler's meta). When set, the
41
- * `step_started` this call sends is stamped with it on the lazy paths
54
+ * `step_started` this call sends is stamped with it: on the lazy paths
42
55
  * (where `lazyStepInput` is present) and on the owned-recovery
43
56
  * payload-less start (where it is not; the re-stamp keeps a recovered
44
57
  * step readable as owned by this message, since ownership derives from
45
- * the LATEST start so a recovery start is never bare). Wake
58
+ * the LATEST start, so a recovery start is never bare). Wake
46
59
  * replays that observe an actively-owned step suppress the immediate
47
60
  * requeue and enqueue a delayed backstop instead. Omitted on the
48
61
  * background-step path, whose bare start intentionally clears ownership
@@ -69,7 +82,7 @@ export interface StepExecutorParams {
69
82
  * It matters most on the lazy inline path, where the `step_started` claim is
70
83
  * the step's FIRST durable write (its `step_created` is deferred): without a
71
84
  * seed the claim would name no position at all, and a replay working from a
72
- * stale view could claim and then commit a step scheduled without
85
+ * stale view could claim (and then commit) a step scheduled without
73
86
  * observing an event it never loaded.
74
87
  *
75
88
  * A World that fences rejects a stale claim with `PreconditionFailedError`
@@ -87,7 +100,7 @@ export interface StepExecutorParams {
87
100
  * stale-sensitive (an open hook means an out-of-band event can make the
88
101
  * scheduling view stale): the guard's 412 fence can reject a stale claim's
89
102
  * durable writes, but it cannot un-run a body that optimistic start began
90
- * before the claim settled awaiting the claim extends the fence to user
103
+ * before the claim settled; awaiting the claim extends the fence to user
91
104
  * code. Wins over `forceOptimisticStart` and the env flag.
92
105
  */
93
106
  suppressOptimisticStart?: boolean;
@@ -103,8 +116,8 @@ export interface StepExecutorParams {
103
116
  * Turbo mode only: a promise that resolves once the backgrounded
104
117
  * `run_started` has landed. When set, the lazy/optimistic `step_started` is
105
118
  * chained on it so the step is never created before its run exists. The body
106
- * still runs immediately against locally-synthesized state only the network
107
- * write waits so the `run_started` round-trip overlaps the body. `undefined`
119
+ * still runs immediately against locally-synthesized state (only the network
120
+ * write waits), so the `run_started` round-trip overlaps the body. `undefined`
108
121
  * outside turbo, where `run_started` was already awaited up front.
109
122
  */
110
123
  runReadyBarrier?: Promise<unknown>;
@@ -113,7 +126,7 @@ export interface StepExecutorParams {
113
126
  * by the orchestrator. When set, this executor computes the final values
114
127
  * against the wall clock taken immediately before user code runs and
115
128
  * attaches them to the step's terminal event. Set only for the first step of
116
- * an inline batch, and only on first-attempt executions that qualify see
129
+ * an inline batch, and only on first-attempt executions that qualify; see
117
130
  * runtime/step-latency.ts.
118
131
  */
119
132
  latencyTracking?: StepLatencyTracking;
@@ -123,12 +136,12 @@ export interface StepExecutorParams {
123
136
  * executor closes the measurement against the `step_started` claim and the
124
137
  * wall clock taken immediately before user code, and attaches the total plus
125
138
  * its phase breakdown to this step's `step.execute` span. Set by the runtime
126
- * for exactly one step per resumption see runtime/resume-latency.ts.
139
+ * for exactly one step per resumption; see runtime/resume-latency.ts.
127
140
  */
128
141
  resumeTracking?: ResumeTtrTracking;
129
142
  /**
130
143
  * Authoritative attempt number for this execution, used to bound retries
131
- * against `maxRetries` BEFORE the body runs. In order to also catch
144
+ * against `maxRetries` BEFORE the body runs. To also catch
132
145
  * step timeouts (which we can't have catch handlers for), we determine
133
146
  * the attempt count based as follows:
134
147
  * - Inline (combined handler): the number of `step_started` events already
@@ -140,6 +153,41 @@ export interface StepExecutorParams {
140
153
  /** One-shot recovery telemetry activated by the orchestrator replay. */
141
154
  replayRecoveryReporter?: ReplayRecoveryReporter;
142
155
  }
156
+ /**
157
+ * The settled outcome of a `step_created` + `step_started` pair the
158
+ * suspension handler folded into its batched fan-out write (see
159
+ * `SuspensionHandlerResult.inlineClaims`). Handed to executeStep as
160
+ * {@link StepExecutorParams.preclaimedStart} so the executor runs (or skips)
161
+ * the body off the batch's verdict instead of sending a start of its own.
162
+ */
163
+ export type PreclaimedInlineStart = {
164
+ /** The pair committed: this execution owns the step and runs the body. */
165
+ owned: true;
166
+ /**
167
+ * The started step entity from the batch result, with the locally
168
+ * dehydrated input attached by the suspension handler (batch responses
169
+ * return refs lazily; the body's hydration wants the same bytes the
170
+ * pair's `step_created` carried).
171
+ */
172
+ step: StartedStep;
173
+ /**
174
+ * `Date.now()` taken right before the batch POST that carried the pair:
175
+ * the claim's "start POST sent" instant, anchoring RSFS exactly like
176
+ * the lazy claim's own POST would.
177
+ */
178
+ batchPostSentAtMs?: number;
179
+ /**
180
+ * `Date.now()` taken right after that batch POST returned: the
181
+ * claim's completion instant (T6 of the hook-resume TTR window).
182
+ */
183
+ claimCompletedAtMs?: number;
184
+ } | {
185
+ /**
186
+ * The pair lost its atomic create-claim (per-event 409): a concurrent
187
+ * writer owns the step, so the body must not run here.
188
+ */
189
+ owned: false;
190
+ };
143
191
  /**
144
192
  * Inline-delta returned by a step-terminal write when the caller passed
145
193
  * {@link StepExecutorParams.inlineDeltaSinceCursor} and the World supports
@@ -185,7 +233,7 @@ export type StepExecutionResult = {
185
233
  * Executes a single step: creates step_started event, hydrates input,
186
234
  * runs the step function, creates step_completed/step_failed/step_retrying events.
187
235
  *
188
- * Does NOT queue workflow continuation messages the caller decides what to do next.
236
+ * Does NOT queue workflow continuation messages; the caller decides what to do next.
189
237
  * Used by the combined workflow handler for step execution.
190
238
  */
191
239
  export declare function executeStep(params: StepExecutorParams): Promise<StepExecutionResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGV,KAAK,EAEL,cAAc,EAEd,KAAK,EACN,MAAM,iBAAiB,CAAC;AAQzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAuBjE,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAuB1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC;;;;;;;;;;OAUG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAypC9B"}
1
+ {"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"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"}