@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.
- package/dist/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +10 -6
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +39 -64
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +294 -48
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +46 -19
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +76 -38
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +200 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +154 -35
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +59 -11
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +116 -42
- package/dist/runtime/step-latency.d.ts +20 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +13 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +99 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +678 -57
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +417 -213
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +20 -12
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +141 -99
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +9 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +40 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +3 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +18 -18
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +36 -14
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +37 -37
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +68 -39
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +84 -28
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* VM/step-bundle stub for `@workflow/core/runtime/world-init`.
|
|
3
3
|
*
|
|
4
|
-
* Resolved via the `workflow` export condition. Empty by design
|
|
4
|
+
* Resolved via the `workflow` export condition. Empty by design: the host
|
|
5
5
|
* is responsible for loading `world.ts` and populating the globalThis
|
|
6
6
|
* world cache before any VM or step code executes. Including this module
|
|
7
7
|
* (rather than letting the resolver fall through to the host file) keeps
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
* full rationale.
|
|
13
13
|
*/
|
|
14
14
|
export {};
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtaW5pdC1zdHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtmbG93L3dvcmxkLWluaXQtc3R1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNL3N0ZXAtYnVuZGxlIHN0dWIgZm9yIGBAd29ya2Zsb3cvY29yZS9ydW50aW1lL3dvcmxkLWluaXRgLlxuICpcbiAqIFJlc29sdmVkIHZpYSB0aGUgYHdvcmtmbG93YCBleHBvcnQgY29uZGl0aW9uLiBFbXB0eSBieSBkZXNpZ246IHRoZSBob3N0XG4gKiBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyBgd29ybGQudHNgIGFuZCBwb3B1bGF0aW5nIHRoZSBnbG9iYWxUaGlzXG4gKiB3b3JsZCBjYWNoZSBiZWZvcmUgYW55IFZNIG9yIHN0ZXAgY29kZSBleGVjdXRlcy4gSW5jbHVkaW5nIHRoaXMgbW9kdWxlXG4gKiAocmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgcmVzb2x2ZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBob3N0IGZpbGUpIGtlZXBzXG4gKiBgd29ybGQudHNgIGFuZCB0aGUgY29uZmlndXJlZCBzZXJ2ZXItb25seSB3b3JsZCBwYWNrYWdlIG91dCBvZiB0aGVcbiAqIHdvcmtmbG93IHNhbmRib3guXG4gKlxuICogU2VlIGAuLi9ydW50aW1lL3dvcmxkLWluaXQudHNgIGZvciB0aGUgaG9zdC1zaWRlIGltcGxlbWVudGF0aW9uIGFuZCB0aGVcbiAqIGZ1bGwgcmF0aW9uYWxlLlxuICovXG5cbmV4cG9ydCB7fTtcbiJdfQ==
|
package/dist/workflow.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ export type WorkflowResult = {
|
|
|
43
43
|
};
|
|
44
44
|
};
|
|
45
45
|
/**
|
|
46
|
-
* `resume` can additionally decline
|
|
46
|
+
* `resume` can additionally decline: `{ type: 'replay' }` means "this
|
|
47
47
|
* session is unusable, cold-replay instead". A fresh replay never declines.
|
|
48
48
|
*/
|
|
49
49
|
export type WorkflowResumeResult = WorkflowResult | {
|
|
@@ -56,7 +56,7 @@ export declare function resumeWorkflow(session: WorkflowSession, events: Event[]
|
|
|
56
56
|
/**
|
|
57
57
|
* Single-shot replay: execute the workflow over `events` and either return
|
|
58
58
|
* its output or throw its suspension. Kept for the extensive existing test
|
|
59
|
-
* suites
|
|
59
|
+
* suites; production code goes through `replayWorkflow`/`resumeWorkflow`.
|
|
60
60
|
*/
|
|
61
61
|
export declare function runWorkflow(workflowCode: string, workflowRun: WorkflowRun, events: Event[], encryptionKey: PayloadKey | undefined,
|
|
62
62
|
/**
|
package/dist/workflow.js
CHANGED
|
@@ -49,7 +49,7 @@ runReadyBarrier) {
|
|
|
49
49
|
return;
|
|
50
50
|
// Implicitly dispose any abort hooks (system hooks) that are still alive at
|
|
51
51
|
// workflow completion so they don't leak rows in the hooks table for the
|
|
52
|
-
// run's lifetime. Skip hooks that already have an abort in flight
|
|
52
|
+
// run's lifetime. Skip hooks that already have an abort in flight; those
|
|
53
53
|
// will emit hook_received via the abort processing path. User hooks
|
|
54
54
|
// (isSystem !== true) are intentionally left alone: their lifetime is
|
|
55
55
|
// managed by the user's code, not the runtime.
|
|
@@ -122,7 +122,7 @@ function recordResult(result, span) {
|
|
|
122
122
|
// a suspension: an out-of-band delivery that landed ahead of the code that
|
|
123
123
|
// reads it waits for the pass that reaches that code, and failing here
|
|
124
124
|
// would fail exactly the runs that tolerance exists for. The case that is
|
|
125
|
-
// not ordinary
|
|
125
|
+
// not ordinary (the same event still held pass after pass) is a shape
|
|
126
126
|
// across these spans, which is why the eventId is on each one and no pass
|
|
127
127
|
// tries to rule on it alone.
|
|
128
128
|
if (result.parked) {
|
|
@@ -138,7 +138,7 @@ function recordResult(result, span) {
|
|
|
138
138
|
/**
|
|
139
139
|
* Single-shot replay: execute the workflow over `events` and either return
|
|
140
140
|
* its output or throw its suspension. Kept for the extensive existing test
|
|
141
|
-
* suites
|
|
141
|
+
* suites; production code goes through `replayWorkflow`/`resumeWorkflow`.
|
|
142
142
|
*/
|
|
143
143
|
export async function runWorkflow(workflowCode, workflowRun, events, encryptionKey,
|
|
144
144
|
/**
|
|
@@ -217,7 +217,7 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
217
217
|
}
|
|
218
218
|
case 'suspended':
|
|
219
219
|
// Same-boundary duplicates were staled by the generation bump above,
|
|
220
|
-
// so anything landing here is out-of-band
|
|
220
|
+
// so anything landing here is out-of-band: an unguarded sleep/hook/
|
|
221
221
|
// attribute signal or a divergence. Those boundaries are unretainable
|
|
222
222
|
// (the runtime demotes them too), so fall back to replay.
|
|
223
223
|
state = { type: 'replay' };
|
|
@@ -231,7 +231,18 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
231
231
|
const ulid = monotonicFactory(() => vmGlobalThis.Math.random());
|
|
232
232
|
// Correlation IDs must be replay-stable. `startedAt` differs between a turbo
|
|
233
233
|
// delivery and a later server-backed replay, so use fixedTimestamp.
|
|
234
|
-
|
|
234
|
+
// The draw counter is the progress metric for `quiesceEarlierCascades`
|
|
235
|
+
// (WORKFLOW_LOG_ORDER_DRAWS): a quiet turn is one that drew nothing. It
|
|
236
|
+
// counts EVERY draw from this sequence. This same function is installed as
|
|
237
|
+
// the `STABLE_ULID` global below, which serialization draws stream ids
|
|
238
|
+
// from during dehydration. This is deliberate because quiescence must also
|
|
239
|
+
// wait out serialization-driven draws, and counting extra draws only extends
|
|
240
|
+
// the wait (see the termination note on `quiesceEarlierCascades`).
|
|
241
|
+
let mintCount = 0;
|
|
242
|
+
const generateUlid = () => {
|
|
243
|
+
mintCount += 1;
|
|
244
|
+
return ulid(fixedTimestamp);
|
|
245
|
+
};
|
|
235
246
|
const generateNanoid = nanoid.customRandom(nanoid.urlAlphabet, 21, (size) => new Uint8Array(size).map(() => 256 * vmGlobalThis.Math.random()));
|
|
236
247
|
// Create a mutable holder for the promise queue so the EventsConsumer
|
|
237
248
|
// can access the current queue state via a getter. The queue is mutated
|
|
@@ -258,6 +269,14 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
258
269
|
onUnconsumedEvent: (event) => {
|
|
259
270
|
onWorkflowError(new ReplayDivergenceError(`Replay could not consume event: eventType=${event.eventType}, correlationId=${event.correlationId}, eventId=${event.eventId}.`, { eventId: event.eventId }));
|
|
260
271
|
},
|
|
272
|
+
// Both branches log at `debug`, so neither reaches the console unless
|
|
273
|
+
// `DEBUG` matches. A duplicate is a permanent feature of the log: every
|
|
274
|
+
// later replay re-reads it and lands here again, so anything the logger
|
|
275
|
+
// prints unconditionally would print once per replay for the life of the
|
|
276
|
+
// run. There is also nothing to act on. Ignoring the event is the correct
|
|
277
|
+
// outcome, not a degraded one, and no user change makes the straggler go
|
|
278
|
+
// away. What the levels are for is diagnosis after the fact, which is
|
|
279
|
+
// exactly what `DEBUG=workflow:runtime:debug` is for.
|
|
261
280
|
onDuplicateEvent: (event, firstEventType) => {
|
|
262
281
|
const details = {
|
|
263
282
|
workflowRunId: workflowRun.runId,
|
|
@@ -272,15 +291,15 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
272
291
|
// is still correct and still deterministic (replay reads the first one
|
|
273
292
|
// at the same position every time), but unlike a re-commit of the same
|
|
274
293
|
// outcome there is no reading of this where both writers were right,
|
|
275
|
-
// so the discarded outcome
|
|
276
|
-
runtimeLogger.
|
|
294
|
+
// so the discarded outcome gets its own message.
|
|
295
|
+
runtimeLogger.debug('Ignoring inert event that decides an already-decided outcome differently', details);
|
|
277
296
|
return;
|
|
278
297
|
}
|
|
279
|
-
//
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
runtimeLogger.
|
|
298
|
+
// The first event of this class decided the outcome at a lower log
|
|
299
|
+
// position and replay reads that one. Recorded because a straggler is
|
|
300
|
+
// still evidence of two replays writing for the same entity, which is
|
|
301
|
+
// worth seeing when diagnosing a run.
|
|
302
|
+
runtimeLogger.debug('Ignoring inert event that repeats a class already in the event log', details);
|
|
284
303
|
},
|
|
285
304
|
getPromiseQueue: () => promiseQueueHolder.current,
|
|
286
305
|
isDeliveryIdle: () => deliveryIdleHolder.current(),
|
|
@@ -294,6 +313,9 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
294
313
|
eventsConsumer,
|
|
295
314
|
generateUlid,
|
|
296
315
|
generateNanoid,
|
|
316
|
+
get mintCount() {
|
|
317
|
+
return mintCount;
|
|
318
|
+
},
|
|
297
319
|
invocationsQueue: new Map(),
|
|
298
320
|
// Use getter/setter so the EventsConsumer's getPromiseQueue() always
|
|
299
321
|
// sees the latest queue state as it's mutated by step/hook/sleep callbacks.
|
|
@@ -829,7 +851,7 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
829
851
|
// Control-flow signals are handled by the runtime and do not mean the
|
|
830
852
|
// workflow has terminally failed. `onWorkflowError` usually already moved
|
|
831
853
|
// the state machine, but a divergence can also arrive via a step
|
|
832
|
-
// promise's direct rejection (bypassing `onWorkflowError`)
|
|
854
|
+
// promise's direct rejection (bypassing `onWorkflowError`); demote so
|
|
833
855
|
// every control-flow path converges on `replay` and a later resume falls
|
|
834
856
|
// back instead of throwing.
|
|
835
857
|
if (WorkflowSuspension.is(error) || ReplayDivergenceError.is(error)) {
|
|
@@ -920,4 +942,4 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
|
|
|
920
942
|
execution: waitForExecution(initialInterruption),
|
|
921
943
|
};
|
|
922
944
|
}
|
|
923
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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ZixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FDOUQsQ0FBQztvQkFDSixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDdkIsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO29CQUM1QixDQUFDO29CQUNELE1BQU0sWUFBWSxHQUFHLGFBQWEsRUFBUyxDQUFDO29CQUM1QyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDO29CQUMxQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDdkMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUM1RCxPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUNELEtBQUssUUFBUTtvQkFDWCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLFdBQVcsQ0FBQztnQkFDakIsS0FBSyxTQUFTO29CQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGNBQWMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUM5RCxDQUFDO1lBQ04sQ0FBQztZQUNELEtBQXFCLENBQUM7UUFDeEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPO1FBQ0wsT0FBTztRQUNQLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztLQUNqRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFUlJPUl9TTFVHUyxcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya2Zsb3dCYXNlVXJsLFxuICB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLFxuICB3aXRoUmVzb2x2ZXJzLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biwgV29ybGRDYXBhYmlsaXRpZXMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCAqIGFzIG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCwgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IEVOT1RTVVAsIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBpc0RlbGl2ZXJ5SWRsZSB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlVXNlU3RlcCB9IGZyb20gJy4vc3RlcC5qcyc7XG5pbXBvcnQge1xuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgV09SS0ZMT1dfQ1JFQVRFX0hPT0ssXG4gIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQsXG4gIFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTLFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4sIHRyYWNlIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi92bS9pbmRleC5qcyc7XG5pbXBvcnQgeyBydW5DYWNoZWRXb3JrZmxvd1NjcmlwdCB9IGZyb20gJy4vdm0vc2NyaXB0LWNhY2hlLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcyxcbiAgY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyLFxufSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2V0QXR0cmlidXRlcyB9IGZyb20gJy4vd29ya2Zsb3cvYXR0cmlidXRlLWRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0wgfSBmcm9tICcuL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDcmVhdGVIb29rIH0gZnJvbSAnLi93b3JrZmxvdy9ob29rLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdy9zbGVlcC5qcyc7XG5cbi8qKlxuICogRHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBhdCB3b3JrZmxvdyBjb21wbGV0aW9uIChzdWNjZXNzIG9yIGZhaWx1cmUpLlxuICpcbiAqIFRyZWF0cyBjb21wbGV0aW9uIGFzIGEgZmluYWwgc3VzcGVuc2lvbiBzbyB1bmF3YWl0ZWQgaG9vaywgd2FpdCwgYW5kXG4gKiBhdHRyaWJ1dGUgb3BlcmF0aW9ucyBhcmUgcmVjb3JkZWQgYmVmb3JlIHRoZSBydW4gYmVjb21lcyB0ZXJtaW5hbC4gVGhpc1xuICogYWxzbyBsZXRzIGEgZmluYWwgYGNvbnRyb2xsZXIuYWJvcnQoKWAgcmVhY2ggaW4tZmxpZ2h0IHN0ZXBzLlxuICpcbiAqIEl0IHJlY29yZHMgYCpfY3JlYXRlZGAgYW5kIG5hdGl2ZSBhdHRyaWJ1dGUgZXZlbnRzLCBidXQgbmV2ZXIgZXhlY3V0ZXMgc3RlcFxuICogYm9kaWVzOiBgc3RlcF9zdGFydGVkYCBpcyByZWplY3RlZCBhZnRlciB0aGUgcnVuIGJlY29tZXMgdGVybWluYWwuIEFcbiAqIGZpcmUtYW5kLWZvcmdldCBzdGVwIHRoZXJlZm9yZSBuZWVkcyBhIGxhdGVyIHN1c3BlbnNpb24gdG8gYmUgc2NoZWR1bGVkLlxuICpcbiAqIERyYWluIGZhaWx1cmVzIGRvIG5vdCBjaGFuZ2UgdGhlIHdvcmtmbG93J3MgdGVybWluYWwgb3V0Y29tZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgcGVuZGluZ1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+LFxuICB2bUdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIG91dGNvbWU6ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcsXG4gIC8qKlxuICAgKiBJbiB0dXJibyBtb2RlLCBnYXRlcyBmaW5hbCBgKl9jcmVhdGVkYCB3cml0ZXMgb24gYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAuIFVuZGVmaW5lZCB3aGVuIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGVuZGluZ1F1ZXVlLnNpemUgPT09IDApIHJldHVybjtcbiAgLy8gSW1wbGljaXRseSBkaXNwb3NlIGFueSBhYm9ydCBob29rcyAoc3lzdGVtIGhvb2tzKSB0aGF0IGFyZSBzdGlsbCBhbGl2ZSBhdFxuICAvLyB3b3JrZmxvdyBjb21wbGV0aW9uIHNvIHRoZXkgZG9uJ3QgbGVhayByb3dzIGluIHRoZSBob29rcyB0YWJsZSBmb3IgdGhlXG4gIC8vIHJ1bidzIGxpZmV0aW1lLiBTa2lwIGhvb2tzIHRoYXQgYWxyZWFkeSBoYXZlIGFuIGFib3J0IGluIGZsaWdodCDigJQgdGhvc2VcbiAgLy8gd2lsbCBlbWl0IGhvb2tfcmVjZWl2ZWQgdmlhIHRoZSBhYm9ydCBwcm9jZXNzaW5nIHBhdGguIFVzZXIgaG9va3NcbiAgLy8gKGlzU3lzdGVtICE9PSB0cnVlKSBhcmUgaW50ZW50aW9uYWxseSBsZWZ0IGFsb25lOiB0aGVpciBsaWZldGltZSBpc1xuICAvLyBtYW5hZ2VkIGJ5IHRoZSB1c2VyJ3MgY29kZSwgbm90IHRoZSBydW50aW1lLlxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGVuZGluZ1F1ZXVlLnZhbHVlcygpKSB7XG4gICAgaWYgKFxuICAgICAgaXRlbS50eXBlID09PSAnaG9vaycgJiZcbiAgICAgIGl0ZW0uaXNTeXN0ZW0gJiZcbiAgICAgICFpdGVtLmRpc3Bvc2VkICYmXG4gICAgICAhaXRlbS5hYm9ydFJlcXVlc3RlZFxuICAgICkge1xuICAgICAgaXRlbS5kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgIGNvbnN0IHN5bnRoZXNpemVkID0gbmV3IFdvcmtmbG93U3VzcGVuc2lvbihwZW5kaW5nUXVldWUsIHZtR2xvYmFsVGhpcyk7XG4gICAgYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICBzdXNwZW5zaW9uOiBzeW50aGVzaXplZCxcbiAgICAgIHdvcmxkLFxuICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgYEZhaWxlZCB0byBkcmFpbiBwZW5kaW5nIHF1ZXVlIGl0ZW1zIGZvciAke291dGNvbWV9IHdvcmtmbG93IHJ1bmAsXG4gICAgICB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKiogRXZlcnl0aGluZyBuZWVkZWQgdG8gY29sZC1zdGFydCBhIHdvcmtmbG93IFZNIG92ZXIgYW4gZXZlbnQgbG9nLiAqL1xuaW50ZXJmYWNlIFdvcmtmbG93U2Vzc2lvbk9wdGlvbnMge1xuICByZWFkb25seSB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBldmVudHM6IEV2ZW50W107XG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlO1xuICByZWFkb25seSBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICByZWFkb25seSB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzO1xufVxuXG4vKipcbiAqIEEgbGl2ZSB3b3JrZmxvdyBWTSwgcGFya2VkIGF0IGEgc3VzcGVuc2lvbiBib3VuZGFyeS4gYHJlc3VtZWAgYWR2YW5jZXMgaXRcbiAqIGJ5IGFwcGVuZGluZyBldmVudHMgaW5zdGVhZCBvZiByZXBsYXlpbmcgZnJvbSBzY3JhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93U2Vzc2lvbiB7XG4gIHJlYWRvbmx5IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgcmVhZG9ubHkgYXJndW1lbnRDb3VudDogbnVtYmVyO1xuICByZXN1bWUoZXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD47XG59XG5cbi8qKiBBIGZpbmlzaGVkIGV4ZWN1dGlvbiBhdHRlbXB0OiB0aGUgd29ya2Zsb3cncyBvdXRwdXQgb3IgYSBsaXZlIGJvdW5kYXJ5LiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXN1bHQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnO1xuICAgICAgcmVhZG9ubHkgb3V0cHV0OiB1bmtub3duO1xuICAgICAgLyoqIGB0eXBlb2ZgIHRoZSByYXcgcmV0dXJuIHZhbHVlLCBmb3IgdGVsZW1ldHJ5LiAqL1xuICAgICAgcmVhZG9ubHkgcmVzdWx0VHlwZTogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJztcbiAgICAgIHJlYWRvbmx5IHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgICAgIHJlYWRvbmx5IHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbjtcbiAgICAgIC8qKlxuICAgICAgICogRXZlbnRzIHRoZSByZXBsYXkgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLCBpZiBhbnkuXG4gICAgICAgKiBPcmRpbmFyeSBvbiBhIHN1c3BlbnNpb24sIGFuZCBvbmx5IGFjdGlvbmFibGUgYWNyb3NzIGEgcnVuJ3NcbiAgICAgICAqIHN1c3BlbnNpb25zLCBzbyBpdCBpcyByZXBvcnRlZCBmb3IgdGVsZW1ldHJ5IHJhdGhlciB0aGFuIGFjdGVkIG9uIGhlcmUuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHBhcmtlZD86IHtcbiAgICAgICAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBldmVudFR5cGU6IHN0cmluZztcbiAgICAgIH07XG4gICAgfTtcblxuLyoqXG4gKiBgcmVzdW1lYCBjYW4gYWRkaXRpb25hbGx5IGRlY2xpbmUg4oCUIGB7IHR5cGU6ICdyZXBsYXknIH1gIG1lYW5zIFwidGhpc1xuICogc2Vzc2lvbiBpcyB1bnVzYWJsZSwgY29sZC1yZXBsYXkgaW5zdGVhZFwiLiBBIGZyZXNoIHJlcGxheSBuZXZlciBkZWNsaW5lcy5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSBXb3JrZmxvd1Jlc3VsdCB8IHsgcmVhZG9ubHkgdHlwZTogJ3JlcGxheScgfTtcblxuLyoqIFRoZSBzZXNzaW9uJ3MgcHJpdmF0ZSBzdGF0ZSBtYWNoaW5lLiAqL1xudHlwZSBXb3JrZmxvd1Nlc3Npb25TdGF0ZSA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3J1bm5pbmcnO1xuICAgICAgcmVhZG9ubHkgaW50ZXJydXB0aW9uOiBQcm9taXNlV2l0aFJlc29sdmVyczxuZXZlcj47XG4gICAgfVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ3N1c3BlbmRlZCc7IHJlYWRvbmx5IHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbiB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnY29tcGxldGVkJyB9O1xuXG4vKiogQ29sZC1zdGFydDogYnVpbGQgYSBmcmVzaCBWTSBzZXNzaW9uIGFuZCByZXBsYXkgaXQgb3ZlciBgZXZlbnRzYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlXb3JrZmxvdyhcbiAgb3B0aW9uczogV29ya2Zsb3dTZXNzaW9uT3B0aW9uc1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JlcGxheScsXG4gICAgb3B0aW9ucy53b3JrZmxvd1J1bixcbiAgICBvcHRpb25zLmV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uLCBleGVjdXRpb24gfSA9IGF3YWl0IGNyZWF0ZVdvcmtmbG93U2Vzc2lvbihvcHRpb25zKTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChzZXNzaW9uLmFyZ3VtZW50Q291bnQpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVjb3JkUmVzdWx0KGF3YWl0IGV4ZWN1dGlvbiwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG4vKiogV2FybS1zdGFydDogYWR2YW5jZSBhIHJldGFpbmVkIHNlc3Npb24gYnkgYXBwZW5kaW5nIGV2ZW50cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVXb3JrZmxvdyhcbiAgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uLFxuICBldmVudHM6IEV2ZW50W11cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bWVSZXN1bHQ+IHtcbiAgcmV0dXJuIHRyYWNlRXhlY3V0aW9uKFxuICAgICdyZXRhaW5lZCcsXG4gICAgc2Vzc2lvbi53b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChzZXNzaW9uLmFyZ3VtZW50Q291bnQpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLnJlc3VtZShldmVudHMpO1xuICAgICAgcmV0dXJuIHJlc3VsdC50eXBlID09PSAncmVwbGF5JyA/IHJlc3VsdCA6IHJlY29yZFJlc3VsdChyZXN1bHQsIHNwYW4pO1xuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gdHJhY2VFeGVjdXRpb248VD4oXG4gIG1vZGU6ICdyZXBsYXknIHwgJ3JldGFpbmVkJyxcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZuOiAoc3BhbjogU3BhbiB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0cmFjZShgd29ya2Zsb3cucnVuICR7d29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lfWAsIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZCh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXhlY3V0aW9uTW9kZShtb2RlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZm4oc3Bhbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXN1bHQoXG4gIHJlc3VsdDogV29ya2Zsb3dSZXN1bHQsXG4gIHNwYW46IFNwYW4gfCB1bmRlZmluZWRcbik6IFdvcmtmbG93UmVzdWx0IHtcbiAgaWYgKHJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVzdWx0VHlwZShyZXN1bHQucmVzdWx0VHlwZSksXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3Bhbikge1xuICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKHJlc3VsdC5zdXNwZW5zaW9uLCBzcGFuKTtcbiAgICAvLyBFdmVudHMgdGhpcyBwYXNzIHdhbGtlZCBwYXN0IHVuY2xhaW1lZCBhbmQgaXMgc3RpbGwgaG9sZGluZy4gT3JkaW5hcnkgb25cbiAgICAvLyBhIHN1c3BlbnNpb246IGFuIG91dC1vZi1iYW5kIGRlbGl2ZXJ5IHRoYXQgbGFuZGVkIGFoZWFkIG9mIHRoZSBjb2RlIHRoYXRcbiAgICAvLyByZWFkcyBpdCB3YWl0cyBmb3IgdGhlIHBhc3MgdGhhdCByZWFjaGVzIHRoYXQgY29kZSwgYW5kIGZhaWxpbmcgaGVyZVxuICAgIC8vIHdvdWxkIGZhaWwgZXhhY3RseSB0aGUgcnVucyB0aGF0IHRvbGVyYW5jZSBleGlzdHMgZm9yLiBUaGUgY2FzZSB0aGF0IGlzXG4gICAgLy8gbm90IG9yZGluYXJ5IOKAlCB0aGUgc2FtZSBldmVudCBzdGlsbCBoZWxkIHBhc3MgYWZ0ZXIgcGFzcyDigJQgaXMgYSBzaGFwZVxuICAgIC8vIGFjcm9zcyB0aGVzZSBzcGFucywgd2hpY2ggaXMgd2h5IHRoZSBldmVudElkIGlzIG9uIGVhY2ggb25lIGFuZCBubyBwYXNzXG4gICAgLy8gdHJpZXMgdG8gcnVsZSBvbiBpdCBhbG9uZS5cbiAgICBpZiAocmVzdWx0LnBhcmtlZCkge1xuICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRzQ291bnQocmVzdWx0LnBhcmtlZC5jb3VudCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1BhcmtlZEV2ZW50SWQocmVzdWx0LnBhcmtlZC5ldmVudElkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRUeXBlKHJlc3VsdC5wYXJrZWQuZXZlbnRUeXBlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNpbmdsZS1zaG90IHJlcGxheTogZXhlY3V0ZSB0aGUgd29ya2Zsb3cgb3ZlciBgZXZlbnRzYCBhbmQgZWl0aGVyIHJldHVyblxuICogaXRzIG91dHB1dCBvciB0aHJvdyBpdHMgc3VzcGVuc2lvbi4gS2VwdCBmb3IgdGhlIGV4dGVuc2l2ZSBleGlzdGluZyB0ZXN0XG4gKiBzdWl0ZXMg4oCUIHByb2R1Y3Rpb24gY29kZSBnb2VzIHRocm91Z2ggYHJlcGxheVdvcmtmbG93YC9gcmVzdW1lV29ya2Zsb3dgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3coXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBlci1ydW4gY2FjaGUgZm9yIHJlcGxheSBwYXlsb2FkIHByZXBhcmF0aW9uIGFuZCBpbW11dGFibGUgZmluYWxcbiAgICogdmFsdWVzLiBPd25lZCBieSB0aGUgaW5saW5lIGV4ZWN1dGlvbiBsb29wIGZvciB0aGlzIGludm9jYXRpb24uXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZSA9IG5ldyBSZXBsYXlQYXlsb2FkQ2FjaGUoXG4gICAgZW5jcnlwdGlvbktleVxuICApLFxuICAvKipcbiAgICogVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWQgYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkLlxuICAgKiBUaHJlYWRlZCBpbnRvIHRoZSBlbmQtb2YtcnVuIGRyYWluIHNvIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYCB3cml0ZXNcbiAgICogY29tbWl0dGVkIGF0IHdvcmtmbG93IGNvbXBsZXRpb24gb3JkZXIgYWZ0ZXIgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWRcbiAgICogb3V0c2lkZSB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgLyoqXG4gICAqIEZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgV29ybGQgZXhlY3V0aW5nIHRoaXMgd29ya2Zsb3cuIE1pc3NpbmdcbiAgICogY2FwYWJpbGl0aWVzIGFyZSB0cmVhdGVkIGFzIHVuc3VwcG9ydGVkLlxuICAgKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllc1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgd29ya2Zsb3dDb2RlLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgd29ybGRDYXBhYmlsaXRpZXMsXG4gIH0pO1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdzdXNwZW5kZWQnKSB0aHJvdyByZXN1bHQuc3VzcGVuc2lvbjtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdvcmtmbG93U2Vzc2lvbih7XG4gIHdvcmtmbG93Q29kZSxcbiAgd29ya2Zsb3dSdW4sXG4gIGV2ZW50cyxcbiAgZW5jcnlwdGlvbktleSxcbiAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICBydW5SZWFkeUJhcnJpZXIsXG4gIHdvcmxkQ2FwYWJpbGl0aWVzLFxufTogV29ya2Zsb3dTZXNzaW9uT3B0aW9ucyk6IFByb21pc2U8e1xuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb247XG4gIGV4ZWN1dGlvbjogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD47XG59PiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdDtcbiAgaWYgKCFzdGFydGVkQXQpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgV29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXAgKHNob3VsZCBub3QgaGFwcGVuKWBcbiAgICApO1xuICB9XG5cbiAgLy8gU2VlZCBhbmQgaW5pdGlhbCBjbG9jayBtdXN0IGJlIGF2YWlsYWJsZSBiZWZvcmUgSS9PIGFuZCByZW1haW4gc3RhYmxlIG9uXG4gIC8vIHJlcGxheS4gQWZ0ZXIgdGhlIGZpcnN0IGV2ZW50LCBFdmVudHNDb25zdW1lciBhZHZhbmNlcyB0aGUgVk0gY2xvY2sgZnJvbVxuICAvLyBlYWNoIGV2ZW50J3MgYGNyZWF0ZWRBdGAuXG4gIGNvbnN0IGZpeGVkVGltZXN0YW1wID1cbiAgICBydW5JZENyZWF0ZWRBdCh3b3JrZmxvd1J1bi5ydW5JZCkgPz8gK3dvcmtmbG93UnVuLmNyZWF0ZWRBdDtcblxuICAvLyBUcnV0aGluZXNzLCBub3QgcHJlc2VuY2U6IGB2ZXJjZWwgZW52IHB1bGxgIHdyaXRlcyBgVkVSQ0VMX1VSTD1cIlwiYCBpbnRvXG4gIC8vIGAuZW52LmxvY2FsYCwgYW5kIGEgZnJhbWV3b3JrIHRoYXQgbG9hZHMgdGhhdCBmaWxlIGxvY2FsbHkgd291bGQgb3RoZXJ3aXNlXG4gIC8vIHB1dCB1cyBvbiB0aGUgVmVyY2VsIGJyYW5jaCB3aXRoIG5vdGhpbmcgdG8gYnVpbGQgYSBob3N0IGZyb20sIG1ha2luZ1xuICAvLyBgaHR0cHM6Ly9gIHRoZSBiYXNlIFVSTCBvZiBldmVyeSBydW4uXG4gIGNvbnN0IGlzVmVyY2VsID0gQm9vbGVhbihwcm9jZXNzLmVudi5WRVJDRUxfVVJMKTtcbiAgLy8gTG9hZCBnZXRQb3J0IGxhemlseSB0byBwcmV2ZW50IFR1cmJvcGFjayBmcm9tIHRyYWNpbmcgZ2V0LXBvcnQnc1xuICAvLyBmcyBvcHMgKHJlYWRkaXIsIHJlYWRGaWxlKSBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS4gVGhlIHJlc29sdmVkXG4gIC8vIHBvcnQgaXMgY2FjaGVkIHBlciBwcm9jZXNzIChzZWUgZ2V0LXBvcnQtbGF6eS50cyksIHNvIHRoaXMgaXMgY2hlYXBcbiAgLy8gb24gcmVwbGF5cyBhZnRlciB0aGUgZmlyc3QuXG4gIGNvbnN0IHdvcmtmbG93QmFzZVVybCA9IGNyZWF0ZVdvcmtmbG93QmFzZVVybChcbiAgICBpc1ZlcmNlbFxuICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDokeyhhd2FpdCBnZXRQb3J0TGF6eSgpKSA/PyAzMDAwfWBcbiAgKTtcblxuICBjb25zdCB7XG4gICAgY29udGV4dCxcbiAgICBnbG9iYWxUaGlzOiB2bUdsb2JhbFRoaXMsXG4gICAgdXBkYXRlVGltZXN0YW1wLFxuICB9ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgc2VlZDogYCR7d29ya2Zsb3dSdW4ucnVuSWR9OiR7d29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lfToke3dvcmtmbG93UnVuLmRlcGxveW1lbnRJZH1gLFxuICAgIGZpeGVkVGltZXN0YW1wLFxuICB9KTtcblxuICBjb25zdCBpbml0aWFsSW50ZXJydXB0aW9uID0gd2l0aFJlc29sdmVyczxuZXZlcj4oKTtcbiAgbGV0IHN0YXRlOiBXb3JrZmxvd1Nlc3Npb25TdGF0ZSA9IHtcbiAgICB0eXBlOiAncnVubmluZycsXG4gICAgaW50ZXJydXB0aW9uOiBpbml0aWFsSW50ZXJydXB0aW9uLFxuICB9O1xuXG4gIGNvbnN0IG9uV29ya2Zsb3dFcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3J1bm5pbmcnOiB7XG4gICAgICAgIGNvbnN0IHsgaW50ZXJydXB0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSBXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpXG4gICAgICAgICAgPyB7IHR5cGU6ICdzdXNwZW5kZWQnLCBzdXNwZW5zaW9uOiBlcnJvciB9XG4gICAgICAgICAgOiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIC8vIEVhY2ggcGFya2VkIHN0ZXAgY29uc3VtZXIgc2NoZWR1bGVzIGl0cyBvd24gKGlkZW50aWNhbCkgc3VzcGVuc2lvblxuICAgICAgICAvLyBzaWduYWw7IHRoZSBmaXJzdCBvbmUgbGFuZHMgaGVyZSwgYW5kIGJ1bXBpbmcgdGhlIGdlbmVyYXRpb24gbWFrZXNcbiAgICAgICAgLy8gdGhlIHN0ZXAtY29uc3VtZXIgZ3VhcmQgZHJvcCB0aGUgcmVzdCBhdCBmaXJlIHRpbWUuXG4gICAgICAgIHdvcmtmbG93Q29udGV4dC5zdXNwZW5zaW9uR2VuZXJhdGlvbisrO1xuICAgICAgICBpbnRlcnJ1cHRpb24ucmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3VzcGVuZGVkJzpcbiAgICAgICAgLy8gU2FtZS1ib3VuZGFyeSBkdXBsaWNhdGVzIHdlcmUgc3RhbGVkIGJ5IHRoZSBnZW5lcmF0aW9uIGJ1bXAgYWJvdmUsXG4gICAgICAgIC8vIHNvIGFueXRoaW5nIGxhbmRpbmcgaGVyZSBpcyBvdXQtb2YtYmFuZCDigJQgYW4gdW5ndWFyZGVkIHNsZWVwL2hvb2svXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBzaWduYWwgb3IgYSBkaXZlcmdlbmNlLiBUaG9zZSBib3VuZGFyaWVzIGFyZSB1bnJldGFpbmFibGVcbiAgICAgICAgLy8gKHRoZSBydW50aW1lIGRlbW90ZXMgdGhlbSB0b28pLCBzbyBmYWxsIGJhY2sgdG8gcmVwbGF5LlxuICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAncmVwbGF5JzpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUgc2F0aXNmaWVzIG5ldmVyO1xuICB9O1xuXG4gIGNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IHZtR2xvYmFsVGhpcy5NYXRoLnJhbmRvbSgpKTtcbiAgLy8gQ29ycmVsYXRpb24gSURzIG11c3QgYmUgcmVwbGF5LXN0YWJsZS4gYHN0YXJ0ZWRBdGAgZGlmZmVycyBiZXR3ZWVuIGEgdHVyYm9cbiAgLy8gZGVsaXZlcnkgYW5kIGEgbGF0ZXIgc2VydmVyLWJhY2tlZCByZXBsYXksIHNvIHVzZSBmaXhlZFRpbWVzdGFtcC5cbiAgY29uc3QgZ2VuZXJhdGVVbGlkID0gKCkgPT4gdWxpZChmaXhlZFRpbWVzdGFtcCk7XG4gIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpXG4gICk7XG5cbiAgLy8gQ3JlYXRlIGEgbXV0YWJsZSBob2xkZXIgZm9yIHRoZSBwcm9taXNlIHF1ZXVlIHNvIHRoZSBFdmVudHNDb25zdW1lclxuICAvLyBjYW4gYWNjZXNzIHRoZSBjdXJyZW50IHF1ZXVlIHN0YXRlIHZpYSBhIGdldHRlci4gVGhlIHF1ZXVlIGlzIG11dGF0ZWRcbiAgLy8gYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcyBhcyBldmVudHMgYXJlIHByb2Nlc3NlZC5cbiAgY29uc3QgcHJvbWlzZVF1ZXVlSG9sZGVyID0geyBjdXJyZW50OiBQcm9taXNlLnJlc29sdmUoKSB9O1xuXG4gIC8vIFNhbWUgcmVhc29uIGFzIHRoZSBxdWV1ZSBob2xkZXI6IHRoZSBjb25zdW1lciBpcyBidWlsdCBiZWZvcmUgdGhlIGNvbnRleHRcbiAgLy8gd2hvc2UgZGVsaXZlcnkgc3RhdGUgaXQgaGFzIHRvIHJlYWQuIElkbGUgdW50aWwgdGhlIGNvbnRleHQgZXhpc3RzLCB3aGljaFxuICAvLyBpcyBiZWZvcmUgYW55IGRlbGl2ZXJ5IGNhbiBiZSByZWdpc3RlcmVkIGFnYWluc3QgaXQuXG4gIGNvbnN0IGRlbGl2ZXJ5SWRsZUhvbGRlciA9IHsgY3VycmVudDogKCk6IGJvb2xlYW4gPT4gdHJ1ZSB9O1xuXG4gIC8vIFRoZSBWTSBjbG9jayBvbmx5IGV2ZXIgbW92ZXMgZm9yd2FyZC4gQ29uc3VtcHRpb24gb3JkZXIgaXMgbG9nIG9yZGVyIGZvclxuICAvLyBldmVyeXRoaW5nIHdob3NlIG9yZGVyIHRoZSByZXBsYXkgZGVjaWRlcywgYnV0IGFuIGV2ZW50IHRoZSBjb25zdW1lclxuICAvLyBwYXJrZWQgaXMgZGVsaXZlcmVkIGFmdGVyIHRoZSB3YWxrIGhhcyBhbHJlYWR5IHBhc3NlZCBldmVudHMgd3JpdHRlbiBhZnRlclxuICAvLyBpdCwgYW5kIGxldHRpbmcgaXRzIGBjcmVhdGVkQXRgIHNldCB0aGUgY2xvY2sgd291bGQgbWFrZSBgRGF0ZS5ub3coKWAgZ29cbiAgLy8gYmFja3dhcmRzIGluc2lkZSBhIHNpbmdsZSByZXBsYXkuXG4gIGxldCBjbG9jayA9IGZpeGVkVGltZXN0YW1wO1xuXG4gIGNvbnN0IGV2ZW50c0NvbnN1bWVyID0gbmV3IEV2ZW50c0NvbnN1bWVyKGV2ZW50cywge1xuICAgIG9uQ29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhdCA9ICtldmVudC5jcmVhdGVkQXQ7XG4gICAgICBpZiAoYXQgPiBjbG9jaykge1xuICAgICAgICBjbG9jayA9IGF0O1xuICAgICAgICB1cGRhdGVUaW1lc3RhbXAoYXQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudCkgPT4ge1xuICAgICAgb25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgIGBSZXBsYXkgY291bGQgbm90IGNvbnN1bWUgZXZlbnQ6IGV2ZW50VHlwZT0ke2V2ZW50LmV2ZW50VHlwZX0sIGNvcnJlbGF0aW9uSWQ9JHtldmVudC5jb3JyZWxhdGlvbklkfSwgZXZlbnRJZD0ke2V2ZW50LmV2ZW50SWR9LmAsXG4gICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuICAgIG9uRHVwbGljYXRlRXZlbnQ6IChldmVudCwgZmlyc3RFdmVudFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgZmlyc3RFdmVudFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9O1xuICAgICAgaWYgKGZpcnN0RXZlbnRUeXBlICE9PSBldmVudC5ldmVudFR5cGUpIHtcbiAgICAgICAgLy8gVHdvIHdyaXRlcnMgcmVhY2hlZCBvcHBvc2l0ZSBjb25jbHVzaW9ucyBhYm91dCBvbmUgZW50aXR5OiBhXG4gICAgICAgIC8vIGBzdGVwX2ZhaWxlZGAgYmVoaW5kIGEgYHN0ZXBfY29tcGxldGVkYCwgb3IgdGhlIHJldmVyc2UuIElnbm9yaW5nIGl0XG4gICAgICAgIC8vIGlzIHN0aWxsIGNvcnJlY3QgYW5kIHN0aWxsIGRldGVybWluaXN0aWMgKHJlcGxheSByZWFkcyB0aGUgZmlyc3Qgb25lXG4gICAgICAgIC8vIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGV2ZXJ5IHRpbWUpLCBidXQgdW5saWtlIGEgcmUtY29tbWl0IG9mIHRoZSBzYW1lXG4gICAgICAgIC8vIG91dGNvbWUgdGhlcmUgaXMgbm8gcmVhZGluZyBvZiB0aGlzIHdoZXJlIGJvdGggd3JpdGVycyB3ZXJlIHJpZ2h0LFxuICAgICAgICAvLyBzbyB0aGUgZGlzY2FyZGVkIG91dGNvbWUgaXMgd29ydGggYW4gZXJyb3IgaW4gdGhlIHJ1bidzIGxvZ3MuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ0lnbm9yaW5nIGV2ZW50IHRoYXQgZGVjaWRlcyBhbiBhbHJlYWR5LWRlY2lkZWQgb3V0Y29tZSBkaWZmZXJlbnRseScsXG4gICAgICAgICAgZGV0YWlsc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBOb3QgYW4gZXJyb3I6IHRoZSBmaXJzdCBldmVudCBvZiB0aGlzIGNsYXNzIGRlY2lkZWQgdGhlIG91dGNvbWUgYXQgYVxuICAgICAgLy8gbG93ZXIgbG9nIHBvc2l0aW9uIGFuZCByZXBsYXkgcmVhZHMgdGhhdCBvbmUuIExvZ2dlZCBiZWNhdXNlIGFcbiAgICAgIC8vIHN0cmFnZ2xlciBpcyBzdGlsbCBldmlkZW5jZSBvZiB0d28gcmVwbGF5cyB3cml0aW5nIGZvciB0aGUgc2FtZVxuICAgICAgLy8gZW50aXR5LCB3aGljaCBpcyB3b3J0aCBzZWVpbmcgd2hlbiBkaWFnbm9zaW5nIGEgcnVuLlxuICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAnSWdub3JpbmcgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nJyxcbiAgICAgICAgZGV0YWlsc1xuICAgICAgKTtcbiAgICB9LFxuICAgIGdldFByb21pc2VRdWV1ZTogKCkgPT4gcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQsXG4gICAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50KCksXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtmbG93Q29udGV4dDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0ID0ge1xuICAgIHJ1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICBvbldvcmtmbG93RXJyb3IsXG4gICAgZXZlbnRzQ29uc3VtZXIsXG4gICAgZ2VuZXJhdGVVbGlkLFxuICAgIGdlbmVyYXRlTmFub2lkLFxuICAgIGludm9jYXRpb25zUXVldWU6IG5ldyBNYXAoKSxcbiAgICAvLyBVc2UgZ2V0dGVyL3NldHRlciBzbyB0aGUgRXZlbnRzQ29uc3VtZXIncyBnZXRQcm9taXNlUXVldWUoKSBhbHdheXNcbiAgICAvLyBzZWVzIHRoZSBsYXRlc3QgcXVldWUgc3RhdGUgYXMgaXQncyBtdXRhdGVkIGJ5IHN0ZXAvaG9vay9zbGVlcCBjYWxsYmFja3MuXG4gICAgZ2V0IHByb21pc2VRdWV1ZSgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudDtcbiAgICB9LFxuICAgIHNldCBwcm9taXNlUXVldWUodmFsdWU6IFByb21pc2U8dm9pZD4pIHtcbiAgICAgIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50ID0gdmFsdWU7XG4gICAgfSxcbiAgICBwZW5kaW5nRGVsaXZlcmllczogMCxcbiAgICBzdXNwZW5zaW9uR2VuZXJhdGlvbjogMCxcbiAgICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyczogbmV3IE1hcCgpLFxuICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgfTtcblxuICBkZWxpdmVyeUlkbGVIb2xkZXIuY3VycmVudCA9ICgpID0+IGlzRGVsaXZlcnlJZGxlKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQ29uc3VtZSBydW4gbGlmZWN5Y2xlIGV2ZW50cyAtIHRoZXNlIGFyZSBzdHJ1Y3R1cmFsIGV2ZW50cyB0aGF0IGRvbid0XG4gIC8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgd29ya2Zsb3csIGJ1dCBtdXN0IGJlIGNvbnN1bWVkIHRvIGFkdmFuY2VcbiAgLy8gcGFzdCB0aGVtIGluIHRoZSBldmVudCBsb2dcbiAgbGV0IGNvbnN1bWVkUnVuU3RhcnRlZCA9IGZhbHNlO1xuICB3b3JrZmxvd0NvbnRleHQuZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgcnVuX2NyZWF0ZWQgLSBldmVyeSBydW4gaGFzIGV4YWN0bHkgb25lXG4gICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJykge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSB0aGUgZmlyc3QgcnVuX3N0YXJ0ZWQuIFR3byByZXBsYXlzIGNhbiBlYWNoIHdyaXRlIG9uZSAodGhlXG4gICAgLy8gY3JlYXRlIGlzIGlkZW1wb3RlbnQgZm9yIGEgcnVuIGFscmVhZHkgcnVubmluZywgd2hpY2ggbWFrZXMgdGhlIHdyaXRlXG4gICAgLy8gc2FmZSwgbm90IHNpbmdsZS1zaG90KTsgdGhlIGZpcnN0IGlzIHRoZSBvbmUgdGhlIHJlcGxheSBvYnNlcnZlcywgYW5kXG4gICAgLy8gdGhlIGNvbnN1bWVyIHNraXBzIHRoZSByZXN0IHJhdGhlciB0aGFuIGFkdmFuY2luZyB0aGUgd29ya2Zsb3cgY2xvY2tcbiAgICAvLyB0d2ljZS5cbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICBpZiAoY29uc3VtZWRSdW5TdGFydGVkKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuICAgICAgY29uc3VtZWRSdW5TdGFydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIEF0dHJpYnV0ZSB3cml0ZXMgcGVyZm9ybWVkIGZyb20gYSBzdGVwIGhhdmUgbm8gd29ya2Zsb3ctYm9keSBjYWxsIHRvXG4gICAgLy8gY29uc3VtZSB0aGVtIGR1cmluZyByZXBsYXk7IHRoZXkgYXJlIGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBydW5cbiAgICAvLyBzbmFwc2hvdCBhbmQgcmVtYWluIHN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkLlxuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJlxuICAgICAgZXZlbnQuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnc3RlcCdcbiAgICApIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICB9KTtcblxuICBjb25zdCB1c2VTdGVwID0gY3JlYXRlVXNlU3RlcCh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBjcmVhdGVIb29rID0gY3JlYXRlQ3JlYXRlSG9vayh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBzbGVlcCA9IGNyZWF0ZVNsZWVwKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSBjcmVhdGVTZXRBdHRyaWJ1dGVzKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19VU0VfU1RFUF0gPSB1c2VTdGVwO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1NFVF9BVFRSSUJVVEVTXSA9IHNldEF0dHJpYnV0ZXM7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ1JFQVRFX0hPT0tdID0gY3JlYXRlSG9vaztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19TTEVFUF0gPSBzbGVlcDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19HRVRfU1RSRUFNX0lEXSA9IChuYW1lc3BhY2U/OiBzdHJpbmcpID0+XG4gICAgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCh3b3JrZmxvd1J1bi5ydW5JZCwgbmFtZXNwYWNlKTtcblxuICAvLyBGb3IgdGhlIHdvcmtmbG93IFZNLCB3ZSBzdG9yZSB0aGUgY29udGV4dCBpbiBhIHN5bWJvbCBvbiB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdFxuICBjb25zdCBjdHg6IFdvcmtmbG93TWV0YWRhdGEgPSB7XG4gICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyB2bUdsb2JhbFRoaXMuRGF0ZSgrc3RhcnRlZEF0KSxcbiAgICB1cmw6IHdvcmtmbG93QmFzZVVybCxcbiAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgfTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSA9IGN0eDtcbiAgLy8gU2VyaWFsaXphdGlvbiBtaW50cyBzdHJlYW0gaWRzIHRocm91Z2ggdGhpcyBzeW1ib2wsIGFuZCBjYWxscyBpdCB3aXRoIG5vXG4gIC8vIHNlZWQgdGltZS4gYG1vbm90b25pY0ZhY3RvcnlgIHJldHVybnMgYGVuY29kZVRpbWUobGFzdFRpbWUpYCBvbiBpdHNcbiAgLy8gaW5jcmVtZW50IGJyYW5jaCwgc28gb25lIHN1Y2ggY2FsbCBsYXRjaGVzIHRoZSAqaG9zdCogd2FsbCBjbG9jayBpbnRvXG4gIC8vIGBsYXN0VGltZWAsIGFuZCBldmVyeSBpZCB0aGUgcnVuIG1pbnRzIGFmdGVyd2FyZHMgY2FycmllcyB0aGF0IHRpbWVzdGFtcFxuICAvLyBpbnN0ZWFkIG9mIGBmaXhlZFRpbWVzdGFtcGAsIGEgdmFsdWUgdGhhdCBkaWZmZXJzIG9uIGV2ZXJ5IHJlcGxheS4gQmluZGluZ1xuICAvLyB0aGUgc2VlZCB0aW1lIGhlcmUga2VlcHMgdGhlIHdob2xlIHJ1biBvbiBvbmUgcmVwbGF5LXN0YWJsZSBjbG9jay5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tTVEFCTEVfVUxJRF0gPSBnZW5lcmF0ZVVsaWQ7XG5cbiAgLy8gV29ya2Zsb3cgY29kZSBtdXN0IGltcG9ydCB0aGUgZGV0ZXJtaW5pc3RpYyBgZmV0Y2hgIHN0ZXAgZnJvbSBgd29ya2Zsb3dgLlxuICB2bUdsb2JhbFRoaXMuZmV0Y2ggPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IHZtR2xvYmFsVGhpcy5FcnJvcihcbiAgICAgIGBHbG9iYWwgXCJmZXRjaFwiIGlzIHVuYXZhaWxhYmxlIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcImZldGNoXCIgc3RlcCBmdW5jdGlvbiBmcm9tIFwid29ya2Zsb3dcIiB0byBtYWtlIEhUVFAgcmVxdWVzdHMuXFxuXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2Vyci8ke0VSUk9SX1NMVUdTLkZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OfWBcbiAgICApO1xuICB9O1xuXG4gIC8vIE92ZXJyaWRlIHRpbWVvdXQvaW50ZXJ2YWwgZnVuY3Rpb25zIHRvIHRocm93IGhlbHBmdWwgZXJyb3JzXG4gIC8vIFRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgcmVseSBvblxuICAvLyBhc3luY2hyb25vdXMgc2NoZWR1bGluZyB3aGljaCBicmVha3MgZGV0ZXJtaW5pc3RpYyByZXBsYXlcbiAgY29uc3QgdGltZW91dEVycm9yTWVzc2FnZSA9XG4gICAgJ1RpbWVvdXQgZnVuY3Rpb25zIGxpa2UgXCJzZXRUaW1lb3V0XCIgYW5kIFwic2V0SW50ZXJ2YWxcIiBhcmUgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJzbGVlcFwiIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIGZvciB0aW1lLWJhc2VkIGRlbGF5cy4nO1xuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5zZXRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFyVGltZW91dCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gYEFib3J0Q29udHJvbGxlcmAgYW5kIGBBYm9ydFNpZ25hbGAgaW4gdGhlIHdvcmtmbG93IFZNIGFyZSBob29rLWJhY2tlZFxuICAvLyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuIFRoZSBjb250cm9sbGVyJ3MgYWJvcnQoKSBxdWV1ZXMgYSBob29rIHJlc3VtcHRpb24sXG4gIC8vIGFuZCBzaWduYWwuYWJvcnRlZCBpcyB1cGRhdGVkIHdoZW4gdGhlIGhvb2sgZXZlbnQgaXMgcHJvY2Vzc2VkIGR1cmluZyByZXBsYXkuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5BYm9ydENvbnRyb2xsZXIgPVxuICAgIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcih3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBhYm9ydFNpZ25hbFN0YXRpY3MgPSBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MoKTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0U2lnbmFsID0ge1xuICAgIGFib3J0OiBhYm9ydFNpZ25hbFN0YXRpY3MuYWJvcnQsXG4gICAgYW55OiBhYm9ydFNpZ25hbFN0YXRpY3MuYW55LFxuICAgIHRpbWVvdXQ6IGFib3J0U2lnbmFsU3RhdGljcy50aW1lb3V0LFxuICB9O1xuXG4gIC8vIGBSZXF1ZXN0YCBhbmQgYFJlc3BvbnNlYCBhcmUgc3BlY2lhbCBidWlsdC1pbiBjbGFzc2VzIHRoYXQgaW52b2tlIHN0ZXBzXG4gIC8vIGZvciB0aGUgYGpzb24oKWAsIGB0ZXh0KClgIGFuZCBgYXJyYXlCdWZmZXIoKWAgaW5zdGFuY2UgbWV0aG9kc1xuICBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXF1ZXN0IHtcbiAgICBjYWNoZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY2FjaGUnXTtcbiAgICBjcmVkZW50aWFscyE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY3JlZGVudGlhbHMnXTtcbiAgICBkZXN0aW5hdGlvbiE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnZGVzdGluYXRpb24nXTtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICBpbnRlZ3JpdHkhOiBzdHJpbmc7XG4gICAgbWV0aG9kITogc3RyaW5nO1xuICAgIG1vZGUhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ21vZGUnXTtcbiAgICByZWRpcmVjdCE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVkaXJlY3QnXTtcbiAgICByZWZlcnJlciE6IHN0cmluZztcbiAgICByZWZlcnJlclBvbGljeSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVmZXJyZXJQb2xpY3knXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAga2VlcGFsaXZlITogYm9vbGVhbjtcbiAgICBzaWduYWwhOiBBYm9ydFNpZ25hbDtcbiAgICBkdXBsZXghOiAnaGFsZic7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPGFueT4gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IGFueSwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgICAvLyBIYW5kbGUgVVJMIGlucHV0XG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIHZtR2xvYmFsVGhpcy5VUkwpIHtcbiAgICAgICAgY29uc3QgdXJsU3RyaW5nID0gU3RyaW5nKGlucHV0KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgVVJMIGZvcm1hdFxuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ldyB2bUdsb2JhbFRoaXMuVVJMKHVybFN0cmluZyk7XG4gICAgICAgICAgdGhpcy51cmwgPSB1cmxTdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICR7dXJsU3RyaW5nfWAsIHtcbiAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0IC0gY2xvbmUgaXRzIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICAgIGlmICghaW5pdCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGluaXQgaXMgcHJvdmlkZWQsIG1lcmdlOiB1c2Ugc291cmNlIHByb3BlcnRpZXMsIHRoZW4gb3ZlcnJpZGUgd2l0aCBpbml0XG4gICAgICAgIC8vIENvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIFJlcXVlc3QgZmlyc3RcbiAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgdGhpcy5ib2R5ID0gaW5wdXQuYm9keTtcbiAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICB0aGlzLmNhY2hlID0gaW5wdXQuY2FjaGU7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5wdXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIE92ZXJyaWRlIHdpdGggaW5pdCBvcHRpb25zIGlmIHByb3ZpZGVkXG4gICAgICAvLyBTZXQgbWV0aG9kXG4gICAgICBpZiAoaW5pdD8ubWV0aG9kKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGZvciBzdHJpbmcgaW5wdXQgY2FzZVxuICAgICAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaGVhZGVyc1xuICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTFxuICAgICAgKSB7XG4gICAgICAgIC8vIEZvciBzdHJpbmcvVVJMIGlucHV0LCBjcmVhdGUgZW1wdHkgaGVhZGVyc1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG90aGVyIHByb3BlcnRpZXMgd2l0aCBpbml0IHZhbHVlcyBvciBkZWZhdWx0c1xuICAgICAgaWYgKGluaXQ/Lm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1vZGUgPSBpbml0Lm1vZGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1vZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMubW9kZSA9ICdjb3JzJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHM7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNyZWRlbnRpYWxzICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJztcbiAgICAgIH1cblxuICAgICAgLy8gYGFueWAgY2FzdCBoZXJlIGJlY2F1c2UgQHR5cGVzL25vZGUgdjIyIGRvZXMgbm90IHlldCBoYXZlIGBjYWNoZWBcbiAgICAgIGlmICgoaW5pdCBhcyBhbnkpPy5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSAoaW5pdCBhcyBhbnkpLmNhY2hlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jYWNoZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9ICdkZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZGlyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3Q7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZGlyZWN0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gJ2ZvbGxvdyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWZlcnJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXIgPSBpbml0LnJlZmVycmVyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9ICdhYm91dDpjbGllbnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVmZXJyZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVmZXJyZXJQb2xpY3kgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmludGVncml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5pdC5pbnRlZ3JpdHk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmludGVncml0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5pdC5rZWVwYWxpdmU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmtlZXBhbGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5zaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICB0aGlzLnNpZ25hbCA9IGluaXQuc2lnbmFsO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFib3J0U2lnbmFsIHN0dWJcbiAgICAgICAgdGhpcy5zaWduYWwgPSB7IGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kdXBsZXgpIHtcbiAgICAgICAgdGhpcy5kdXBsZXggPSAnaGFsZic7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gJ2RvY3VtZW50JztcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGluaXQ/LmJvZHk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgR0VUL0hFQUQgbWV0aG9kcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZSh2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKTogUmVxdWVzdCB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPEJsb2I+O1xuICAgIGZvcm1EYXRhITogKCkgPT4gUHJvbWlzZTxGb3JtRGF0YT47XG5cbiAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlc3BvbnNlIGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXNwb25zZSB7XG4gICAgdHlwZSE6IGdsb2JhbFRoaXMuUmVzcG9uc2VbJ3R5cGUnXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAgc3RhdHVzITogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQhOiBzdHJpbmc7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgbnVsbDtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICByZWRpcmVjdGVkITogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGJvZHk/OiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gaW5pdD8uc3RhdHVzID8/IDIwMDtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dCA9IGluaXQ/LnN0YXR1c1RleHQgPz8gJyc7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICB0aGlzLnVybCA9ICcnO1xuICAgICAgdGhpcy5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgbnVsbC1ib2R5IHN0YXR1cyBjb2RlcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgLy8gUGVyIEhUVFAgc3BlYzogMjA0IChObyBDb250ZW50KSwgMjA1IChSZXNldCBDb250ZW50KSwgYW5kIDMwNCAoTm90IE1vZGlmaWVkKVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5zdGF0dXMgPT09IDIwNCB8fCB0aGlzLnN0YXR1cyA9PT0gMjA1IHx8IHRoaXMuc3RhdHVzID09PSAzMDQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgUmVzcG9uc2UgY29uc3RydWN0b3I6IEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHt0aGlzLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIFwiZmFrZVwiIFJlYWRhYmxlU3RyZWFtIHRoYXQgc3RvcmVzIHRoZSBvcmlnaW5hbCBib2R5XG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlc2VcbiAgICBjbG9uZSE6ICgpID0+IFJlc3BvbnNlO1xuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuQmxvYj47XG4gICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuRm9ybURhdGE+O1xuXG4gICAgZ2V0IG9rKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICB9XG5cbiAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBqc29uITogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHRleHQhOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgICBhc3luYyBieXRlcygpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBqc29uKGRhdGE6IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCk6IFJlc3BvbnNlIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnJvcigpOiBSZXNwb25zZSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZGlyZWN0KHVybDogc3RyaW5nIHwgVVJMLCBzdGF0dXM6IG51bWJlciA9IDMwMik6IFJlc3BvbnNlIHtcbiAgICAgIC8vIFZhbGlkYXRlIHN0YXR1cyBjb2RlIC0gb25seSBzcGVjaWZpYyByZWRpcmVjdCBjb2RlcyBhcmUgYWxsb3dlZFxuICAgICAgaWYgKCFbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdLmluY2x1ZGVzKHN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcmVkaXJlY3Qgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfS4gTXVzdCBiZSBvbmUgb2Y6IDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcmVzcG9uc2Ugd2l0aCBMb2NhdGlvbiBoZWFkZXJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIFN0cmluZyh1cmwpKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICByZXNwb25zZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICByZXNwb25zZS5zdGF0dXNUZXh0ID0gJyc7XG4gICAgICByZXNwb25zZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIHJlc3BvbnNlLmJvZHkgPSBudWxsO1xuICAgICAgcmVzcG9uc2UudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgIHJlc3BvbnNlLnVybCA9ICcnO1xuICAgICAgcmVzcG9uc2UucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlYWRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxUPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXRSZWFkZXIoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBwaXBlVGhyb3VnaCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHBpcGVUbygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHRlZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHZhbHVlcygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSBSZWFkYWJsZVN0cmVhbTtcblxuICBjbGFzcyBXcml0YWJsZVN0cmVhbTxUPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08VD4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYWJvcnQoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldFdyaXRlcigpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICBjbGFzcyBUcmFuc2Zvcm1TdHJlYW08SSwgTz4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbTxJLCBPPiB7XG4gICAgcmVhZGFibGU6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08Tz47XG4gICAgd3JpdGFibGU6IGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08ST47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IFRyYW5zZm9ybVN0cmVhbTtcblxuICB2bUdsb2JhbFRoaXMuY29uc29sZSA9IGdsb2JhbFRoaXMuY29uc29sZTtcblxuICAvLyBFeHBvc2UgdGhlIHJlcXVlc3QtY29udGV4dCBzeW1ib2wgcmVxdWlyZWQgYnkgQUkgR2F0ZXdheS5cbiAgY29uc3QgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ0B2ZXJjZWwvcmVxdWVzdC1jb250ZXh0Jyk7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVF0gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgIFNZTUJPTF9GT1JfUkVRX0NPTlRFWFRcbiAgXTtcblxuICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHVzZXItZGVmaW5lZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAgLy8gVGhlIGZpbGVuYW1lIHBhcmFtZXRlciBlbnN1cmVzIHN0YWNrIHRyYWNlcyBzaG93IGEgbWVhbmluZ2Z1bCBuYW1lXG4gIC8vIChlLmcuLCBcImV4YW1wbGUvd29ya2Zsb3dzLzk5X2UyZS50c1wiKSBpbnN0ZWFkIG9mIFwiZXZhbG1hY2hpbmUuPGFub255bW91cz5cIi5cbiAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZTtcblxuICAvLyBSZXVzZSBjb21waWxlZCBzY3JpcHRzIGJ5IGAoY29kZSwgZmlsZW5hbWUpYDogY29tcGlsYXRpb24gaXMgZGV0ZXJtaW5pc3RpY1xuICAvLyBhbmQgdGhlIGZpbGVuYW1lIHByZXNlcnZlcyB3b3JrZmxvdyBzb3VyY2UgYXR0cmlidXRpb24gaW4gc3RhY2sgdHJhY2VzLlxuICAvLyBUaGUgYnVuZGxlIHJlZ2lzdGVycyB3b3JrZmxvd3Mgb24gYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93c2AuXG4gIHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0KHdvcmtmbG93Q29kZSwgZmlsZW5hbWUsIGNvbnRleHQpO1xuICBjb25zdCB3b3JrZmxvd0ZuID0gcnVuQ2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gICAgYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cz8uZ2V0KCR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKX0pYCxcbiAgICBmaWxlbmFtZSxcbiAgICBjb250ZXh0XG4gICk7XG5cbiAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gIH1cblxuICAvLyBDaGFpbiB3b3JrZmxvdyBhcmd1bWVudCBoeWRyYXRpb24gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgdGhlXG4gIC8vIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgKHdoaWNoIHdhaXRzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4pIGRvZXNuJ3RcbiAgLy8gZmlyZSBkdXJpbmcgdGhlIGFzeW5jIGdhcCBiZXR3ZWVuIHJ1bl9zdGFydGVkIGNvbnN1bXB0aW9uIGFuZCB0aGVcbiAgLy8gd29ya2Zsb3cgZnVuY3Rpb24gc3Vic2NyaWJpbmcgaXRzIGZpcnN0IHN0ZXAgY2FsbGJhY2tzLlxuICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gIHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUgPSB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgcmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVXb3JrZmxvd0lucHV0KHdvcmtmbG93UnVuKTtcbiAgICBhcmdzID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgd29ya2Zsb3dSdW4uaW5wdXQsXG4gICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICB7fSxcbiAgICAgIHByZXBhcmVkXG4gICAgKTtcbiAgfSk7XG4gIGF3YWl0IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWU7XG5cbiAgLy8gVGhlIHVzZXIgZnVuY3Rpb24ncyBwcm9taXNlLiBJdCBtYXkgc3RheSBwZW5kaW5nIGFjcm9zcyBtYW55IHJlc3VtZXNcbiAgLy8gKGVhY2ggcGFya2VkIHN0ZXAgcHJvbWlzZSBob2xkcyBpdCB1cCkgYW5kIGlzIHJhY2VkIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAgLy8gYXR0ZW1wdCdzIGludGVycnVwdGlvbiBpbiB3YWl0Rm9yRXhlY3V0aW9uLlxuICBjb25zdCB3b3JrZmxvd0JvZHkgPSAoYXN5bmMgKCk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB3b3JrZmxvd0ZuKC4uLmFyZ3MpO1xuICB9KSgpO1xuXG4gIGNvbnN0IGZhaWxXb3JrZmxvdyA9IGFzeW5jIChlcnJvcjogdW5rbm93bik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICAvLyBDb250cm9sLWZsb3cgc2lnbmFscyBhcmUgaGFuZGxlZCBieSB0aGUgcnVudGltZSBhbmQgZG8gbm90IG1lYW4gdGhlXG4gICAgLy8gd29ya2Zsb3cgaGFzIHRlcm1pbmFsbHkgZmFpbGVkLiBgb25Xb3JrZmxvd0Vycm9yYCB1c3VhbGx5IGFscmVhZHkgbW92ZWRcbiAgICAvLyB0aGUgc3RhdGUgbWFjaGluZSwgYnV0IGEgZGl2ZXJnZW5jZSBjYW4gYWxzbyBhcnJpdmUgdmlhIGEgc3RlcFxuICAgIC8vIHByb21pc2UncyBkaXJlY3QgcmVqZWN0aW9uIChieXBhc3NpbmcgYG9uV29ya2Zsb3dFcnJvcmApIOKAlCBkZW1vdGUgc29cbiAgICAvLyBldmVyeSBjb250cm9sLWZsb3cgcGF0aCBjb252ZXJnZXMgb24gYHJlcGxheWAgYW5kIGEgbGF0ZXIgcmVzdW1lIGZhbGxzXG4gICAgLy8gYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpIHx8IFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgIGlmIChzdGF0ZS50eXBlID09PSAncnVubmluZycpIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHN0YXRlID0geyB0eXBlOiAnY29tcGxldGVkJyB9O1xuXG4gICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICB3b3JrZmxvd1J1bixcbiAgICAgICdmYWlsZWQnLFxuICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgKTtcblxuICAgIHRocm93IGVycm9yO1xuICB9O1xuXG4gIGNvbnN0IHdhaXRGb3JFeGVjdXRpb24gPSBhc3luYyAoXG4gICAgaW50ZXJydXB0aW9uOiBQcm9taXNlV2l0aFJlc29sdmVyczxuZXZlcj5cbiAgKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD4gPT4ge1xuICAgIGxldCByZXN1bHQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbd29ya2Zsb3dCb2R5LCBpbnRlcnJ1cHRpb24ucHJvbWlzZV0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoc3RhdGUudHlwZSA9PT0gJ3N1c3BlbmRlZCcgJiYgZXJyb3IgPT09IHN0YXRlLnN1c3BlbnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3VzcGVuZGVkJyxcbiAgICAgICAgICBzdXNwZW5zaW9uOiBzdGF0ZS5zdXNwZW5zaW9uLFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGlzIG5vdCBhIHNldHRsaW5nIHBvaW50OiB0aGUgY29uc3VtZXIgZm9yIHNvbWV0aGluZ1xuICAgICAgICAgIC8vIGhlbGQgbWF5IHdlbGwgYmUgcmVnaXN0ZXJlZCBieSB0aGUgcmVwbGF5IHRoYXQgZm9sbG93cyB0aGlzIG9uZS5cbiAgICAgICAgICAvLyBTbyBpdCBpcyBjYXJyaWVkIG91dCBmb3IgdGhlIHNwYW4gaW5zdGVhZCBvZiBiZWluZyBqdWRnZWQgaGVyZS5cbiAgICAgICAgICBwYXJrZWQ6IGV2ZW50c0NvbnN1bWVyLnBhcmtlZFN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KGVycm9yKTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHsgdHlwZTogJ2NvbXBsZXRlZCcgfTtcbiAgICAvLyBUaGUgY29uc3VtZXIgd2Fsa3MgcGFzdCBldmVudHMgd2hvc2UgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltIGFuZFxuICAgIC8vIGhvbGRzIHRoZW0gZm9yIGEgY29uc3VtZXIgaXQgZXhwZWN0cyBhIGxhdGVyIGBzdWJzY3JpYmUoKWAgdG8gcmVnaXN0ZXIuXG4gICAgLy8gVGhlIHdvcmtmbG93IGZ1bmN0aW9uIHJldHVybmluZyBpcyB0aGUgcG9pbnQgd2hlcmUgdGhhdCBleHBlY3RhdGlvbiBpc1xuICAgIC8vIHNldHRsZWQ6IG5vdGhpbmcgbW9yZSB3aWxsIHN1YnNjcmliZSwgc28gYW55dGhpbmcgc3RpbGwgaGVsZCB3YXMgbmV2ZXJcbiAgICAvLyBhbnlvbmUncywgYW5kIGNvbXBsZXRpbmcgaGVyZSB3b3VsZCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIGNvbnN0IHN0cmFuZGVkID0gZXZlbnRzQ29uc3VtZXIuc3RyYW5kZWRFdmVudDtcbiAgICBpZiAoc3RyYW5kZWQpIHtcbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBmaW5pc2hlZCB3aXRob3V0IGNvbnN1bWluZyBldmVudDogZXZlbnRUeXBlPSR7c3RyYW5kZWQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke3N0cmFuZGVkLmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7c3RyYW5kZWQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IHN0cmFuZGVkLmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLy8gT25seSBjb21wcmVzc2lvbi1jYXBhYmxlIHJ1bnMgKHNwZWMgPj0gNSkgbWF5IHdyaXRlIGNvbXByZXNzZWRcbiAgICAgICAgLy8gcGF5bG9hZHMuIFRoZSBzZXJpYWxpemVyIHVzZXMgenN0ZCB3aGVuIHN1cHBvcnRlZCBhbmQgbWF5IHVzZSBnemlwLlxuICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdjb21wbGV0ZWQnLCBvdXRwdXQsIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICB3b3JrZmxvd1J1bixcbiAgICBhcmd1bWVudENvdW50OiBhcmdzLmxlbmd0aCxcbiAgICBhc3luYyByZXN1bWUobmV4dEV2ZW50cykge1xuICAgICAgc3dpdGNoIChzdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1c3BlbmRlZCc6IHtcbiAgICAgICAgICAvLyBUaGUgZnVsbCBPKGtub3duIGV2ZW50cykgcHJlZml4IGNvbXBhcmUgaXMgcmVxdWlyZWQ6IHRoZSBydW50aW1lXG4gICAgICAgICAgLy8gdXN1YWxseSBncm93cyBvbmUgYXJyYXkgaW4gcGxhY2UsIGJ1dCBpdHMgd2FpdC1jb21wbGV0aW9uIGFuZFxuICAgICAgICAgIC8vIHN0YWxlLXJlbG9hZCBwYXRocyBSRVBMQUNFIHRoZSBhcnJheSB3aXRoIGEgZnJlc2ggZnVsbCBmZXRjaCwgc29cbiAgICAgICAgICAvLyBhIHJld3JpdHRlbiBwcmVmaXggaXMgYSByZWFsIGlucHV0LCBub3QgcGFyYW5vaWEuIFRoZSBjb21wYXJlc1xuICAgICAgICAgIC8vIGFyZSBjaGVhcCBzdHJpbmcgZXF1YWxpdHkgYW5kIGR3YXJmZWQgYnkgdGhlIHJlcGxheSB0aGV5IGF2b2lkLlxuICAgICAgICAgIGNvbnN0IGtub3duRXZlbnRzID0gZXZlbnRzQ29uc3VtZXIuZXZlbnRzO1xuICAgICAgICAgIGNvbnN0IGlzU3RyaWN0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIG5leHRFdmVudHMubGVuZ3RoID4ga25vd25FdmVudHMubGVuZ3RoICYmXG4gICAgICAgICAgICBrbm93bkV2ZW50cy5ldmVyeShcbiAgICAgICAgICAgICAgKGV2ZW50LCBpbmRleCkgPT4gZXZlbnQuZXZlbnRJZCA9PT0gbmV4dEV2ZW50c1tpbmRleF0uZXZlbnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWlzU3RyaWN0RXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGludGVycnVwdGlvbiA9IHdpdGhSZXNvbHZlcnM8bmV2ZXI+KCk7XG4gICAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdydW5uaW5nJywgaW50ZXJydXB0aW9uIH07XG4gICAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgICAgZXZlbnRzQ29uc3VtZXIuYXBwZW5kKG5leHRFdmVudHMuc2xpY2Uoa25vd25FdmVudHMubGVuZ3RoKSk7XG4gICAgICAgICAgcmV0dXJuIHdhaXRGb3JFeGVjdXRpb24oaW50ZXJydXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyZXBsYXknOlxuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVzdW1lICR7c3RhdGUudHlwZX0gd29ya2Zsb3cgXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0ZSBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb24sXG4gICAgZXhlY3V0aW9uOiB3YWl0Rm9yRXhlY3V0aW9uKGluaXRpYWxJbnRlcnJ1cHRpb24pLFxuICB9O1xufVxuIl19
|
|
945
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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O29CQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGNBQWMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUM5RCxDQUFDO1lBQ04sQ0FBQztZQUNELEtBQXFCLENBQUM7UUFDeEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPO1FBQ0wsT0FBTztRQUNQLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztLQUNqRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFUlJPUl9TTFVHUyxcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya2Zsb3dCYXNlVXJsLFxuICB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLFxuICB3aXRoUmVzb2x2ZXJzLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biwgV29ybGRDYXBhYmlsaXRpZXMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCAqIGFzIG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCwgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IEVOT1RTVVAsIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBpc0RlbGl2ZXJ5SWRsZSB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlVXNlU3RlcCB9IGZyb20gJy4vc3RlcC5qcyc7XG5pbXBvcnQge1xuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgV09SS0ZMT1dfQ1JFQVRFX0hPT0ssXG4gIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQsXG4gIFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTLFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4sIHRyYWNlIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi92bS9pbmRleC5qcyc7XG5pbXBvcnQgeyBydW5DYWNoZWRXb3JrZmxvd1NjcmlwdCB9IGZyb20gJy4vdm0vc2NyaXB0LWNhY2hlLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcyxcbiAgY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyLFxufSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2V0QXR0cmlidXRlcyB9IGZyb20gJy4vd29ya2Zsb3cvYXR0cmlidXRlLWRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0wgfSBmcm9tICcuL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDcmVhdGVIb29rIH0gZnJvbSAnLi93b3JrZmxvdy9ob29rLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdy9zbGVlcC5qcyc7XG5cbi8qKlxuICogRHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBhdCB3b3JrZmxvdyBjb21wbGV0aW9uIChzdWNjZXNzIG9yIGZhaWx1cmUpLlxuICpcbiAqIFRyZWF0cyBjb21wbGV0aW9uIGFzIGEgZmluYWwgc3VzcGVuc2lvbiBzbyB1bmF3YWl0ZWQgaG9vaywgd2FpdCwgYW5kXG4gKiBhdHRyaWJ1dGUgb3BlcmF0aW9ucyBhcmUgcmVjb3JkZWQgYmVmb3JlIHRoZSBydW4gYmVjb21lcyB0ZXJtaW5hbC4gVGhpc1xuICogYWxzbyBsZXRzIGEgZmluYWwgYGNvbnRyb2xsZXIuYWJvcnQoKWAgcmVhY2ggaW4tZmxpZ2h0IHN0ZXBzLlxuICpcbiAqIEl0IHJlY29yZHMgYCpfY3JlYXRlZGAgYW5kIG5hdGl2ZSBhdHRyaWJ1dGUgZXZlbnRzLCBidXQgbmV2ZXIgZXhlY3V0ZXMgc3RlcFxuICogYm9kaWVzOiBgc3RlcF9zdGFydGVkYCBpcyByZWplY3RlZCBhZnRlciB0aGUgcnVuIGJlY29tZXMgdGVybWluYWwuIEFcbiAqIGZpcmUtYW5kLWZvcmdldCBzdGVwIHRoZXJlZm9yZSBuZWVkcyBhIGxhdGVyIHN1c3BlbnNpb24gdG8gYmUgc2NoZWR1bGVkLlxuICpcbiAqIERyYWluIGZhaWx1cmVzIGRvIG5vdCBjaGFuZ2UgdGhlIHdvcmtmbG93J3MgdGVybWluYWwgb3V0Y29tZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgcGVuZGluZ1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+LFxuICB2bUdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIG91dGNvbWU6ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcsXG4gIC8qKlxuICAgKiBJbiB0dXJibyBtb2RlLCBnYXRlcyBmaW5hbCBgKl9jcmVhdGVkYCB3cml0ZXMgb24gYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAuIFVuZGVmaW5lZCB3aGVuIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGVuZGluZ1F1ZXVlLnNpemUgPT09IDApIHJldHVybjtcbiAgLy8gSW1wbGljaXRseSBkaXNwb3NlIGFueSBhYm9ydCBob29rcyAoc3lzdGVtIGhvb2tzKSB0aGF0IGFyZSBzdGlsbCBhbGl2ZSBhdFxuICAvLyB3b3JrZmxvdyBjb21wbGV0aW9uIHNvIHRoZXkgZG9uJ3QgbGVhayByb3dzIGluIHRoZSBob29rcyB0YWJsZSBmb3IgdGhlXG4gIC8vIHJ1bidzIGxpZmV0aW1lLiBTa2lwIGhvb2tzIHRoYXQgYWxyZWFkeSBoYXZlIGFuIGFib3J0IGluIGZsaWdodDsgdGhvc2VcbiAgLy8gd2lsbCBlbWl0IGhvb2tfcmVjZWl2ZWQgdmlhIHRoZSBhYm9ydCBwcm9jZXNzaW5nIHBhdGguIFVzZXIgaG9va3NcbiAgLy8gKGlzU3lzdGVtICE9PSB0cnVlKSBhcmUgaW50ZW50aW9uYWxseSBsZWZ0IGFsb25lOiB0aGVpciBsaWZldGltZSBpc1xuICAvLyBtYW5hZ2VkIGJ5IHRoZSB1c2VyJ3MgY29kZSwgbm90IHRoZSBydW50aW1lLlxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGVuZGluZ1F1ZXVlLnZhbHVlcygpKSB7XG4gICAgaWYgKFxuICAgICAgaXRlbS50eXBlID09PSAnaG9vaycgJiZcbiAgICAgIGl0ZW0uaXNTeXN0ZW0gJiZcbiAgICAgICFpdGVtLmRpc3Bvc2VkICYmXG4gICAgICAhaXRlbS5hYm9ydFJlcXVlc3RlZFxuICAgICkge1xuICAgICAgaXRlbS5kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgIGNvbnN0IHN5bnRoZXNpemVkID0gbmV3IFdvcmtmbG93U3VzcGVuc2lvbihwZW5kaW5nUXVldWUsIHZtR2xvYmFsVGhpcyk7XG4gICAgYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICBzdXNwZW5zaW9uOiBzeW50aGVzaXplZCxcbiAgICAgIHdvcmxkLFxuICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgYEZhaWxlZCB0byBkcmFpbiBwZW5kaW5nIHF1ZXVlIGl0ZW1zIGZvciAke291dGNvbWV9IHdvcmtmbG93IHJ1bmAsXG4gICAgICB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKiogRXZlcnl0aGluZyBuZWVkZWQgdG8gY29sZC1zdGFydCBhIHdvcmtmbG93IFZNIG92ZXIgYW4gZXZlbnQgbG9nLiAqL1xuaW50ZXJmYWNlIFdvcmtmbG93U2Vzc2lvbk9wdGlvbnMge1xuICByZWFkb25seSB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBldmVudHM6IEV2ZW50W107XG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlO1xuICByZWFkb25seSBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICByZWFkb25seSB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzO1xufVxuXG4vKipcbiAqIEEgbGl2ZSB3b3JrZmxvdyBWTSwgcGFya2VkIGF0IGEgc3VzcGVuc2lvbiBib3VuZGFyeS4gYHJlc3VtZWAgYWR2YW5jZXMgaXRcbiAqIGJ5IGFwcGVuZGluZyBldmVudHMgaW5zdGVhZCBvZiByZXBsYXlpbmcgZnJvbSBzY3JhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93U2Vzc2lvbiB7XG4gIHJlYWRvbmx5IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgcmVhZG9ubHkgYXJndW1lbnRDb3VudDogbnVtYmVyO1xuICByZXN1bWUoZXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD47XG59XG5cbi8qKiBBIGZpbmlzaGVkIGV4ZWN1dGlvbiBhdHRlbXB0OiB0aGUgd29ya2Zsb3cncyBvdXRwdXQgb3IgYSBsaXZlIGJvdW5kYXJ5LiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXN1bHQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnO1xuICAgICAgcmVhZG9ubHkgb3V0cHV0OiB1bmtub3duO1xuICAgICAgLyoqIGB0eXBlb2ZgIHRoZSByYXcgcmV0dXJuIHZhbHVlLCBmb3IgdGVsZW1ldHJ5LiAqL1xuICAgICAgcmVhZG9ubHkgcmVzdWx0VHlwZTogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJztcbiAgICAgIHJlYWRvbmx5IHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgICAgIHJlYWRvbmx5IHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbjtcbiAgICAgIC8qKlxuICAgICAgICogRXZlbnRzIHRoZSByZXBsYXkgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLCBpZiBhbnkuXG4gICAgICAgKiBPcmRpbmFyeSBvbiBhIHN1c3BlbnNpb24sIGFuZCBvbmx5IGFjdGlvbmFibGUgYWNyb3NzIGEgcnVuJ3NcbiAgICAgICAqIHN1c3BlbnNpb25zLCBzbyBpdCBpcyByZXBvcnRlZCBmb3IgdGVsZW1ldHJ5IHJhdGhlciB0aGFuIGFjdGVkIG9uIGhlcmUuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHBhcmtlZD86IHtcbiAgICAgICAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBldmVudFR5cGU6IHN0cmluZztcbiAgICAgIH07XG4gICAgfTtcblxuLyoqXG4gKiBgcmVzdW1lYCBjYW4gYWRkaXRpb25hbGx5IGRlY2xpbmU6IGB7IHR5cGU6ICdyZXBsYXknIH1gIG1lYW5zIFwidGhpc1xuICogc2Vzc2lvbiBpcyB1bnVzYWJsZSwgY29sZC1yZXBsYXkgaW5zdGVhZFwiLiBBIGZyZXNoIHJlcGxheSBuZXZlciBkZWNsaW5lcy5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSBXb3JrZmxvd1Jlc3VsdCB8IHsgcmVhZG9ubHkgdHlwZTogJ3JlcGxheScgfTtcblxuLyoqIFRoZSBzZXNzaW9uJ3MgcHJpdmF0ZSBzdGF0ZSBtYWNoaW5lLiAqL1xudHlwZSBXb3JrZmxvd1Nlc3Npb25TdGF0ZSA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3J1bm5pbmcnO1xuICAgICAgcmVhZG9ubHkgaW50ZXJydXB0aW9uOiBQcm9taXNlV2l0aFJlc29sdmVyczxuZXZlcj47XG4gICAgfVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ3N1c3BlbmRlZCc7IHJlYWRvbmx5IHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbiB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnY29tcGxldGVkJyB9O1xuXG4vKiogQ29sZC1zdGFydDogYnVpbGQgYSBmcmVzaCBWTSBzZXNzaW9uIGFuZCByZXBsYXkgaXQgb3ZlciBgZXZlbnRzYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlXb3JrZmxvdyhcbiAgb3B0aW9uczogV29ya2Zsb3dTZXNzaW9uT3B0aW9uc1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JlcGxheScsXG4gICAgb3B0aW9ucy53b3JrZmxvd1J1bixcbiAgICBvcHRpb25zLmV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uLCBleGVjdXRpb24gfSA9IGF3YWl0IGNyZWF0ZVdvcmtmbG93U2Vzc2lvbihvcHRpb25zKTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChzZXNzaW9uLmFyZ3VtZW50Q291bnQpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVjb3JkUmVzdWx0KGF3YWl0IGV4ZWN1dGlvbiwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG4vKiogV2FybS1zdGFydDogYWR2YW5jZSBhIHJldGFpbmVkIHNlc3Npb24gYnkgYXBwZW5kaW5nIGV2ZW50cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVXb3JrZmxvdyhcbiAgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uLFxuICBldmVudHM6IEV2ZW50W11cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bWVSZXN1bHQ+IHtcbiAgcmV0dXJuIHRyYWNlRXhlY3V0aW9uKFxuICAgICdyZXRhaW5lZCcsXG4gICAgc2Vzc2lvbi53b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChzZXNzaW9uLmFyZ3VtZW50Q291bnQpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLnJlc3VtZShldmVudHMpO1xuICAgICAgcmV0dXJuIHJlc3VsdC50eXBlID09PSAncmVwbGF5JyA/IHJlc3VsdCA6IHJlY29yZFJlc3VsdChyZXN1bHQsIHNwYW4pO1xuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gdHJhY2VFeGVjdXRpb248VD4oXG4gIG1vZGU6ICdyZXBsYXknIHwgJ3JldGFpbmVkJyxcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZuOiAoc3BhbjogU3BhbiB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0cmFjZShgd29ya2Zsb3cucnVuICR7d29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lfWAsIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZCh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXhlY3V0aW9uTW9kZShtb2RlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZm4oc3Bhbik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWNvcmRSZXN1bHQoXG4gIHJlc3VsdDogV29ya2Zsb3dSZXN1bHQsXG4gIHNwYW46IFNwYW4gfCB1bmRlZmluZWRcbik6IFdvcmtmbG93UmVzdWx0IHtcbiAgaWYgKHJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVzdWx0VHlwZShyZXN1bHQucmVzdWx0VHlwZSksXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3Bhbikge1xuICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKHJlc3VsdC5zdXNwZW5zaW9uLCBzcGFuKTtcbiAgICAvLyBFdmVudHMgdGhpcyBwYXNzIHdhbGtlZCBwYXN0IHVuY2xhaW1lZCBhbmQgaXMgc3RpbGwgaG9sZGluZy4gT3JkaW5hcnkgb25cbiAgICAvLyBhIHN1c3BlbnNpb246IGFuIG91dC1vZi1iYW5kIGRlbGl2ZXJ5IHRoYXQgbGFuZGVkIGFoZWFkIG9mIHRoZSBjb2RlIHRoYXRcbiAgICAvLyByZWFkcyBpdCB3YWl0cyBmb3IgdGhlIHBhc3MgdGhhdCByZWFjaGVzIHRoYXQgY29kZSwgYW5kIGZhaWxpbmcgaGVyZVxuICAgIC8vIHdvdWxkIGZhaWwgZXhhY3RseSB0aGUgcnVucyB0aGF0IHRvbGVyYW5jZSBleGlzdHMgZm9yLiBUaGUgY2FzZSB0aGF0IGlzXG4gICAgLy8gbm90IG9yZGluYXJ5ICh0aGUgc2FtZSBldmVudCBzdGlsbCBoZWxkIHBhc3MgYWZ0ZXIgcGFzcykgaXMgYSBzaGFwZVxuICAgIC8vIGFjcm9zcyB0aGVzZSBzcGFucywgd2hpY2ggaXMgd2h5IHRoZSBldmVudElkIGlzIG9uIGVhY2ggb25lIGFuZCBubyBwYXNzXG4gICAgLy8gdHJpZXMgdG8gcnVsZSBvbiBpdCBhbG9uZS5cbiAgICBpZiAocmVzdWx0LnBhcmtlZCkge1xuICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRzQ291bnQocmVzdWx0LnBhcmtlZC5jb3VudCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1BhcmtlZEV2ZW50SWQocmVzdWx0LnBhcmtlZC5ldmVudElkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRUeXBlKHJlc3VsdC5wYXJrZWQuZXZlbnRUeXBlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNpbmdsZS1zaG90IHJlcGxheTogZXhlY3V0ZSB0aGUgd29ya2Zsb3cgb3ZlciBgZXZlbnRzYCBhbmQgZWl0aGVyIHJldHVyblxuICogaXRzIG91dHB1dCBvciB0aHJvdyBpdHMgc3VzcGVuc2lvbi4gS2VwdCBmb3IgdGhlIGV4dGVuc2l2ZSBleGlzdGluZyB0ZXN0XG4gKiBzdWl0ZXM7IHByb2R1Y3Rpb24gY29kZSBnb2VzIHRocm91Z2ggYHJlcGxheVdvcmtmbG93YC9gcmVzdW1lV29ya2Zsb3dgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3coXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBlci1ydW4gY2FjaGUgZm9yIHJlcGxheSBwYXlsb2FkIHByZXBhcmF0aW9uIGFuZCBpbW11dGFibGUgZmluYWxcbiAgICogdmFsdWVzLiBPd25lZCBieSB0aGUgaW5saW5lIGV4ZWN1dGlvbiBsb29wIGZvciB0aGlzIGludm9jYXRpb24uXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZSA9IG5ldyBSZXBsYXlQYXlsb2FkQ2FjaGUoXG4gICAgZW5jcnlwdGlvbktleVxuICApLFxuICAvKipcbiAgICogVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWQgYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkLlxuICAgKiBUaHJlYWRlZCBpbnRvIHRoZSBlbmQtb2YtcnVuIGRyYWluIHNvIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYCB3cml0ZXNcbiAgICogY29tbWl0dGVkIGF0IHdvcmtmbG93IGNvbXBsZXRpb24gb3JkZXIgYWZ0ZXIgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWRcbiAgICogb3V0c2lkZSB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgLyoqXG4gICAqIEZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgV29ybGQgZXhlY3V0aW5nIHRoaXMgd29ya2Zsb3cuIE1pc3NpbmdcbiAgICogY2FwYWJpbGl0aWVzIGFyZSB0cmVhdGVkIGFzIHVuc3VwcG9ydGVkLlxuICAgKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllc1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgd29ya2Zsb3dDb2RlLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgd29ybGRDYXBhYmlsaXRpZXMsXG4gIH0pO1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdzdXNwZW5kZWQnKSB0aHJvdyByZXN1bHQuc3VzcGVuc2lvbjtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdvcmtmbG93U2Vzc2lvbih7XG4gIHdvcmtmbG93Q29kZSxcbiAgd29ya2Zsb3dSdW4sXG4gIGV2ZW50cyxcbiAgZW5jcnlwdGlvbktleSxcbiAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICBydW5SZWFkeUJhcnJpZXIsXG4gIHdvcmxkQ2FwYWJpbGl0aWVzLFxufTogV29ya2Zsb3dTZXNzaW9uT3B0aW9ucyk6IFByb21pc2U8e1xuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb247XG4gIGV4ZWN1dGlvbjogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD47XG59PiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdDtcbiAgaWYgKCFzdGFydGVkQXQpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgV29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXAgKHNob3VsZCBub3QgaGFwcGVuKWBcbiAgICApO1xuICB9XG5cbiAgLy8gU2VlZCBhbmQgaW5pdGlhbCBjbG9jayBtdXN0IGJlIGF2YWlsYWJsZSBiZWZvcmUgSS9PIGFuZCByZW1haW4gc3RhYmxlIG9uXG4gIC8vIHJlcGxheS4gQWZ0ZXIgdGhlIGZpcnN0IGV2ZW50LCBFdmVudHNDb25zdW1lciBhZHZhbmNlcyB0aGUgVk0gY2xvY2sgZnJvbVxuICAvLyBlYWNoIGV2ZW50J3MgYGNyZWF0ZWRBdGAuXG4gIGNvbnN0IGZpeGVkVGltZXN0YW1wID1cbiAgICBydW5JZENyZWF0ZWRBdCh3b3JrZmxvd1J1bi5ydW5JZCkgPz8gK3dvcmtmbG93UnVuLmNyZWF0ZWRBdDtcblxuICAvLyBUcnV0aGluZXNzLCBub3QgcHJlc2VuY2U6IGB2ZXJjZWwgZW52IHB1bGxgIHdyaXRlcyBgVkVSQ0VMX1VSTD1cIlwiYCBpbnRvXG4gIC8vIGAuZW52LmxvY2FsYCwgYW5kIGEgZnJhbWV3b3JrIHRoYXQgbG9hZHMgdGhhdCBmaWxlIGxvY2FsbHkgd291bGQgb3RoZXJ3aXNlXG4gIC8vIHB1dCB1cyBvbiB0aGUgVmVyY2VsIGJyYW5jaCB3aXRoIG5vdGhpbmcgdG8gYnVpbGQgYSBob3N0IGZyb20sIG1ha2luZ1xuICAvLyBgaHR0cHM6Ly9gIHRoZSBiYXNlIFVSTCBvZiBldmVyeSBydW4uXG4gIGNvbnN0IGlzVmVyY2VsID0gQm9vbGVhbihwcm9jZXNzLmVudi5WRVJDRUxfVVJMKTtcbiAgLy8gTG9hZCBnZXRQb3J0IGxhemlseSB0byBwcmV2ZW50IFR1cmJvcGFjayBmcm9tIHRyYWNpbmcgZ2V0LXBvcnQnc1xuICAvLyBmcyBvcHMgKHJlYWRkaXIsIHJlYWRGaWxlKSBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS4gVGhlIHJlc29sdmVkXG4gIC8vIHBvcnQgaXMgY2FjaGVkIHBlciBwcm9jZXNzIChzZWUgZ2V0LXBvcnQtbGF6eS50cyksIHNvIHRoaXMgaXMgY2hlYXBcbiAgLy8gb24gcmVwbGF5cyBhZnRlciB0aGUgZmlyc3QuXG4gIGNvbnN0IHdvcmtmbG93QmFzZVVybCA9IGNyZWF0ZVdvcmtmbG93QmFzZVVybChcbiAgICBpc1ZlcmNlbFxuICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDokeyhhd2FpdCBnZXRQb3J0TGF6eSgpKSA/PyAzMDAwfWBcbiAgKTtcblxuICBjb25zdCB7XG4gICAgY29udGV4dCxcbiAgICBnbG9iYWxUaGlzOiB2bUdsb2JhbFRoaXMsXG4gICAgdXBkYXRlVGltZXN0YW1wLFxuICB9ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgc2VlZDogYCR7d29ya2Zsb3dSdW4ucnVuSWR9OiR7d29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lfToke3dvcmtmbG93UnVuLmRlcGxveW1lbnRJZH1gLFxuICAgIGZpeGVkVGltZXN0YW1wLFxuICB9KTtcblxuICBjb25zdCBpbml0aWFsSW50ZXJydXB0aW9uID0gd2l0aFJlc29sdmVyczxuZXZlcj4oKTtcbiAgbGV0IHN0YXRlOiBXb3JrZmxvd1Nlc3Npb25TdGF0ZSA9IHtcbiAgICB0eXBlOiAncnVubmluZycsXG4gICAgaW50ZXJydXB0aW9uOiBpbml0aWFsSW50ZXJydXB0aW9uLFxuICB9O1xuXG4gIGNvbnN0IG9uV29ya2Zsb3dFcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3J1bm5pbmcnOiB7XG4gICAgICAgIGNvbnN0IHsgaW50ZXJydXB0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSBXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpXG4gICAgICAgICAgPyB7IHR5cGU6ICdzdXNwZW5kZWQnLCBzdXNwZW5zaW9uOiBlcnJvciB9XG4gICAgICAgICAgOiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIC8vIEVhY2ggcGFya2VkIHN0ZXAgY29uc3VtZXIgc2NoZWR1bGVzIGl0cyBvd24gKGlkZW50aWNhbCkgc3VzcGVuc2lvblxuICAgICAgICAvLyBzaWduYWw7IHRoZSBmaXJzdCBvbmUgbGFuZHMgaGVyZSwgYW5kIGJ1bXBpbmcgdGhlIGdlbmVyYXRpb24gbWFrZXNcbiAgICAgICAgLy8gdGhlIHN0ZXAtY29uc3VtZXIgZ3VhcmQgZHJvcCB0aGUgcmVzdCBhdCBmaXJlIHRpbWUuXG4gICAgICAgIHdvcmtmbG93Q29udGV4dC5zdXNwZW5zaW9uR2VuZXJhdGlvbisrO1xuICAgICAgICBpbnRlcnJ1cHRpb24ucmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3VzcGVuZGVkJzpcbiAgICAgICAgLy8gU2FtZS1ib3VuZGFyeSBkdXBsaWNhdGVzIHdlcmUgc3RhbGVkIGJ5IHRoZSBnZW5lcmF0aW9uIGJ1bXAgYWJvdmUsXG4gICAgICAgIC8vIHNvIGFueXRoaW5nIGxhbmRpbmcgaGVyZSBpcyBvdXQtb2YtYmFuZDogYW4gdW5ndWFyZGVkIHNsZWVwL2hvb2svXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBzaWduYWwgb3IgYSBkaXZlcmdlbmNlLiBUaG9zZSBib3VuZGFyaWVzIGFyZSB1bnJldGFpbmFibGVcbiAgICAgICAgLy8gKHRoZSBydW50aW1lIGRlbW90ZXMgdGhlbSB0b28pLCBzbyBmYWxsIGJhY2sgdG8gcmVwbGF5LlxuICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAncmVwbGF5JzpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUgc2F0aXNmaWVzIG5ldmVyO1xuICB9O1xuXG4gIGNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IHZtR2xvYmFsVGhpcy5NYXRoLnJhbmRvbSgpKTtcbiAgLy8gQ29ycmVsYXRpb24gSURzIG11c3QgYmUgcmVwbGF5LXN0YWJsZS4gYHN0YXJ0ZWRBdGAgZGlmZmVycyBiZXR3ZWVuIGEgdHVyYm9cbiAgLy8gZGVsaXZlcnkgYW5kIGEgbGF0ZXIgc2VydmVyLWJhY2tlZCByZXBsYXksIHNvIHVzZSBmaXhlZFRpbWVzdGFtcC5cbiAgLy8gVGhlIGRyYXcgY291bnRlciBpcyB0aGUgcHJvZ3Jlc3MgbWV0cmljIGZvciBgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc2BcbiAgLy8gKFdPUktGTE9XX0xPR19PUkRFUl9EUkFXUyk6IGEgcXVpZXQgdHVybiBpcyBvbmUgdGhhdCBkcmV3IG5vdGhpbmcuIEl0XG4gIC8vIGNvdW50cyBFVkVSWSBkcmF3IGZyb20gdGhpcyBzZXF1ZW5jZS4gVGhpcyBzYW1lIGZ1bmN0aW9uIGlzIGluc3RhbGxlZCBhc1xuICAvLyB0aGUgYFNUQUJMRV9VTElEYCBnbG9iYWwgYmVsb3csIHdoaWNoIHNlcmlhbGl6YXRpb24gZHJhd3Mgc3RyZWFtIGlkc1xuICAvLyBmcm9tIGR1cmluZyBkZWh5ZHJhdGlvbi4gVGhpcyBpcyBkZWxpYmVyYXRlIGJlY2F1c2UgcXVpZXNjZW5jZSBtdXN0IGFsc29cbiAgLy8gd2FpdCBvdXQgc2VyaWFsaXphdGlvbi1kcml2ZW4gZHJhd3MsIGFuZCBjb3VudGluZyBleHRyYSBkcmF3cyBvbmx5IGV4dGVuZHNcbiAgLy8gdGhlIHdhaXQgKHNlZSB0aGUgdGVybWluYXRpb24gbm90ZSBvbiBgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc2ApLlxuICBsZXQgbWludENvdW50ID0gMDtcbiAgY29uc3QgZ2VuZXJhdGVVbGlkID0gKCkgPT4ge1xuICAgIG1pbnRDb3VudCArPSAxO1xuICAgIHJldHVybiB1bGlkKGZpeGVkVGltZXN0YW1wKTtcbiAgfTtcbiAgY29uc3QgZ2VuZXJhdGVOYW5vaWQgPSBuYW5vaWQuY3VzdG9tUmFuZG9tKG5hbm9pZC51cmxBbHBoYWJldCwgMjEsIChzaXplKSA9PlxuICAgIG5ldyBVaW50OEFycmF5KHNpemUpLm1hcCgoKSA9PiAyNTYgKiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSlcbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtdXRhYmxlIGhvbGRlciBmb3IgdGhlIHByb21pc2UgcXVldWUgc28gdGhlIEV2ZW50c0NvbnN1bWVyXG4gIC8vIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgcXVldWUgc3RhdGUgdmlhIGEgZ2V0dGVyLiBUaGUgcXVldWUgaXMgbXV0YXRlZFxuICAvLyBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzIGFzIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxuICBjb25zdCBwcm9taXNlUXVldWVIb2xkZXIgPSB7IGN1cnJlbnQ6IFByb21pc2UucmVzb2x2ZSgpIH07XG5cbiAgLy8gU2FtZSByZWFzb24gYXMgdGhlIHF1ZXVlIGhvbGRlcjogdGhlIGNvbnN1bWVyIGlzIGJ1aWx0IGJlZm9yZSB0aGUgY29udGV4dFxuICAvLyB3aG9zZSBkZWxpdmVyeSBzdGF0ZSBpdCBoYXMgdG8gcmVhZC4gSWRsZSB1bnRpbCB0aGUgY29udGV4dCBleGlzdHMsIHdoaWNoXG4gIC8vIGlzIGJlZm9yZSBhbnkgZGVsaXZlcnkgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCBpdC5cbiAgY29uc3QgZGVsaXZlcnlJZGxlSG9sZGVyID0geyBjdXJyZW50OiAoKTogYm9vbGVhbiA9PiB0cnVlIH07XG5cbiAgLy8gVGhlIFZNIGNsb2NrIG9ubHkgZXZlciBtb3ZlcyBmb3J3YXJkLiBDb25zdW1wdGlvbiBvcmRlciBpcyBsb2cgb3JkZXIgZm9yXG4gIC8vIGV2ZXJ5dGhpbmcgd2hvc2Ugb3JkZXIgdGhlIHJlcGxheSBkZWNpZGVzLCBidXQgYW4gZXZlbnQgdGhlIGNvbnN1bWVyXG4gIC8vIHBhcmtlZCBpcyBkZWxpdmVyZWQgYWZ0ZXIgdGhlIHdhbGsgaGFzIGFscmVhZHkgcGFzc2VkIGV2ZW50cyB3cml0dGVuIGFmdGVyXG4gIC8vIGl0LCBhbmQgbGV0dGluZyBpdHMgYGNyZWF0ZWRBdGAgc2V0IHRoZSBjbG9jayB3b3VsZCBtYWtlIGBEYXRlLm5vdygpYCBnb1xuICAvLyBiYWNrd2FyZHMgaW5zaWRlIGEgc2luZ2xlIHJlcGxheS5cbiAgbGV0IGNsb2NrID0gZml4ZWRUaW1lc3RhbXA7XG5cbiAgY29uc3QgZXZlbnRzQ29uc3VtZXIgPSBuZXcgRXZlbnRzQ29uc3VtZXIoZXZlbnRzLCB7XG4gICAgb25Db25zdW1lZEV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGF0ID0gK2V2ZW50LmNyZWF0ZWRBdDtcbiAgICAgIGlmIChhdCA+IGNsb2NrKSB7XG4gICAgICAgIGNsb2NrID0gYXQ7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcChhdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBvbldvcmtmbG93RXJyb3IoXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBjb3VsZCBub3QgY29uc3VtZSBldmVudDogZXZlbnRUeXBlPSR7ZXZlbnQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke2V2ZW50LmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7ZXZlbnQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gICAgLy8gQm90aCBicmFuY2hlcyBsb2cgYXQgYGRlYnVnYCwgc28gbmVpdGhlciByZWFjaGVzIHRoZSBjb25zb2xlIHVubGVzc1xuICAgIC8vIGBERUJVR2AgbWF0Y2hlcy4gQSBkdXBsaWNhdGUgaXMgYSBwZXJtYW5lbnQgZmVhdHVyZSBvZiB0aGUgbG9nOiBldmVyeVxuICAgIC8vIGxhdGVyIHJlcGxheSByZS1yZWFkcyBpdCBhbmQgbGFuZHMgaGVyZSBhZ2Fpbiwgc28gYW55dGhpbmcgdGhlIGxvZ2dlclxuICAgIC8vIHByaW50cyB1bmNvbmRpdGlvbmFsbHkgd291bGQgcHJpbnQgb25jZSBwZXIgcmVwbGF5IGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICAvLyBydW4uIFRoZXJlIGlzIGFsc28gbm90aGluZyB0byBhY3Qgb24uIElnbm9yaW5nIHRoZSBldmVudCBpcyB0aGUgY29ycmVjdFxuICAgIC8vIG91dGNvbWUsIG5vdCBhIGRlZ3JhZGVkIG9uZSwgYW5kIG5vIHVzZXIgY2hhbmdlIG1ha2VzIHRoZSBzdHJhZ2dsZXIgZ29cbiAgICAvLyBhd2F5LiBXaGF0IHRoZSBsZXZlbHMgYXJlIGZvciBpcyBkaWFnbm9zaXMgYWZ0ZXIgdGhlIGZhY3QsIHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB3aGF0IGBERUJVRz13b3JrZmxvdzpydW50aW1lOmRlYnVnYCBpcyBmb3IuXG4gICAgb25EdXBsaWNhdGVFdmVudDogKGV2ZW50LCBmaXJzdEV2ZW50VHlwZSkgPT4ge1xuICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgIH07XG4gICAgICBpZiAoZmlyc3RFdmVudFR5cGUgIT09IGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgICAvLyBUd28gd3JpdGVycyByZWFjaGVkIG9wcG9zaXRlIGNvbmNsdXNpb25zIGFib3V0IG9uZSBlbnRpdHk6IGFcbiAgICAgICAgLy8gYHN0ZXBfZmFpbGVkYCBiZWhpbmQgYSBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgcmV2ZXJzZS4gSWdub3JpbmcgaXRcbiAgICAgICAgLy8gaXMgc3RpbGwgY29ycmVjdCBhbmQgc3RpbGwgZGV0ZXJtaW5pc3RpYyAocmVwbGF5IHJlYWRzIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgLy8gYXQgdGhlIHNhbWUgcG9zaXRpb24gZXZlcnkgdGltZSksIGJ1dCB1bmxpa2UgYSByZS1jb21taXQgb2YgdGhlIHNhbWVcbiAgICAgICAgLy8gb3V0Y29tZSB0aGVyZSBpcyBubyByZWFkaW5nIG9mIHRoaXMgd2hlcmUgYm90aCB3cml0ZXJzIHdlcmUgcmlnaHQsXG4gICAgICAgIC8vIHNvIHRoZSBkaXNjYXJkZWQgb3V0Y29tZSBnZXRzIGl0cyBvd24gbWVzc2FnZS5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCBkZWNpZGVzIGFuIGFscmVhZHktZGVjaWRlZCBvdXRjb21lIGRpZmZlcmVudGx5JyxcbiAgICAgICAgICBkZXRhaWxzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBmaXJzdCBldmVudCBvZiB0aGlzIGNsYXNzIGRlY2lkZWQgdGhlIG91dGNvbWUgYXQgYSBsb3dlciBsb2dcbiAgICAgIC8vIHBvc2l0aW9uIGFuZCByZXBsYXkgcmVhZHMgdGhhdCBvbmUuIFJlY29yZGVkIGJlY2F1c2UgYSBzdHJhZ2dsZXIgaXNcbiAgICAgIC8vIHN0aWxsIGV2aWRlbmNlIG9mIHR3byByZXBsYXlzIHdyaXRpbmcgZm9yIHRoZSBzYW1lIGVudGl0eSwgd2hpY2ggaXNcbiAgICAgIC8vIHdvcnRoIHNlZWluZyB3aGVuIGRpYWdub3NpbmcgYSBydW4uXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nJyxcbiAgICAgICAgZGV0YWlsc1xuICAgICAgKTtcbiAgICB9LFxuICAgIGdldFByb21pc2VRdWV1ZTogKCkgPT4gcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQsXG4gICAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50KCksXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtmbG93Q29udGV4dDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0ID0ge1xuICAgIHJ1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICBvbldvcmtmbG93RXJyb3IsXG4gICAgZXZlbnRzQ29uc3VtZXIsXG4gICAgZ2VuZXJhdGVVbGlkLFxuICAgIGdlbmVyYXRlTmFub2lkLFxuICAgIGdldCBtaW50Q291bnQoKSB7XG4gICAgICByZXR1cm4gbWludENvdW50O1xuICAgIH0sXG4gICAgaW52b2NhdGlvbnNRdWV1ZTogbmV3IE1hcCgpLFxuICAgIC8vIFVzZSBnZXR0ZXIvc2V0dGVyIHNvIHRoZSBFdmVudHNDb25zdW1lcidzIGdldFByb21pc2VRdWV1ZSgpIGFsd2F5c1xuICAgIC8vIHNlZXMgdGhlIGxhdGVzdCBxdWV1ZSBzdGF0ZSBhcyBpdCdzIG11dGF0ZWQgYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcy5cbiAgICBnZXQgcHJvbWlzZVF1ZXVlKCkge1xuICAgICAgcmV0dXJuIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50O1xuICAgIH0sXG4gICAgc2V0IHByb21pc2VRdWV1ZSh2YWx1ZTogUHJvbWlzZTx2b2lkPikge1xuICAgICAgcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIHBlbmRpbmdEZWxpdmVyaWVzOiAwLFxuICAgIHN1c3BlbnNpb25HZW5lcmF0aW9uOiAwLFxuICAgIHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzOiBuZXcgTWFwKCksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICB9O1xuXG4gIGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50ID0gKCkgPT4gaXNEZWxpdmVyeUlkbGUod29ya2Zsb3dDb250ZXh0KTtcblxuICAvLyBDb25zdW1lIHJ1biBsaWZlY3ljbGUgZXZlbnRzIC0gdGhlc2UgYXJlIHN0cnVjdHVyYWwgZXZlbnRzIHRoYXQgZG9uJ3RcbiAgLy8gbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIHRoZSB3b3JrZmxvdywgYnV0IG11c3QgYmUgY29uc3VtZWQgdG8gYWR2YW5jZVxuICAvLyBwYXN0IHRoZW0gaW4gdGhlIGV2ZW50IGxvZ1xuICBsZXQgY29uc3VtZWRSdW5TdGFydGVkID0gZmFsc2U7XG4gIHdvcmtmbG93Q29udGV4dC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSBydW5fY3JlYXRlZCAtIGV2ZXJ5IHJ1biBoYXMgZXhhY3RseSBvbmVcbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnKSB7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lIHRoZSBmaXJzdCBydW5fc3RhcnRlZC4gVHdvIHJlcGxheXMgY2FuIGVhY2ggd3JpdGUgb25lICh0aGVcbiAgICAvLyBjcmVhdGUgaXMgaWRlbXBvdGVudCBmb3IgYSBydW4gYWxyZWFkeSBydW5uaW5nLCB3aGljaCBtYWtlcyB0aGUgd3JpdGVcbiAgICAvLyBzYWZlLCBub3Qgc2luZ2xlLXNob3QpOyB0aGUgZmlyc3QgaXMgdGhlIG9uZSB0aGUgcmVwbGF5IG9ic2VydmVzLCBhbmRcbiAgICAvLyB0aGUgY29uc3VtZXIgc2tpcHMgdGhlIHJlc3QgcmF0aGVyIHRoYW4gYWR2YW5jaW5nIHRoZSB3b3JrZmxvdyBjbG9ja1xuICAgIC8vIHR3aWNlLlxuICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgIGlmIChjb25zdW1lZFJ1blN0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG4gICAgICBjb25zdW1lZFJ1blN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQXR0cmlidXRlIHdyaXRlcyBwZXJmb3JtZWQgZnJvbSBhIHN0ZXAgaGF2ZSBubyB3b3JrZmxvdy1ib2R5IGNhbGwgdG9cbiAgICAvLyBjb25zdW1lIHRoZW0gZHVyaW5nIHJlcGxheTsgdGhleSBhcmUgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHJ1blxuICAgIC8vIHNuYXBzaG90IGFuZCByZW1haW4gc3RydWN0dXJhbCB1bnRpbCBhIHJlYWQgQVBJIGlzIGludHJvZHVjZWQuXG4gICAgaWYgKFxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmXG4gICAgICBldmVudC5ldmVudERhdGEud3JpdGVyLnR5cGUgPT09ICdzdGVwJ1xuICAgICkge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gIH0pO1xuXG4gIGNvbnN0IHVzZVN0ZXAgPSBjcmVhdGVVc2VTdGVwKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IGNyZWF0ZUhvb2sgPSBjcmVhdGVDcmVhdGVIb29rKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IHNsZWVwID0gY3JlYXRlU2xlZXAod29ya2Zsb3dDb250ZXh0KTtcbiAgY29uc3Qgc2V0QXR0cmlidXRlcyA9IGNyZWF0ZVNldEF0dHJpYnV0ZXMod29ya2Zsb3dDb250ZXh0KTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1VTRV9TVEVQXSA9IHVzZVN0ZXA7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfU0VUX0FUVFJJQlVURVNdID0gc2V0QXR0cmlidXRlcztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19DUkVBVEVfSE9PS10gPSBjcmVhdGVIb29rO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1NMRUVQXSA9IHNsZWVwO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0dFVF9TVFJFQU1fSURdID0gKG5hbWVzcGFjZT86IHN0cmluZykgPT5cbiAgICBnZXRXb3JrZmxvd1J1blN0cmVhbUlkKHdvcmtmbG93UnVuLnJ1bklkLCBuYW1lc3BhY2UpO1xuXG4gIC8vIEZvciB0aGUgd29ya2Zsb3cgVk0sIHdlIHN0b3JlIHRoZSBjb250ZXh0IGluIGEgc3ltYm9sIG9uIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4gIGNvbnN0IGN0eDogV29ya2Zsb3dNZXRhZGF0YSA9IHtcbiAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogbmV3IHZtR2xvYmFsVGhpcy5EYXRlKCtzdGFydGVkQXQpLFxuICAgIHVybDogd29ya2Zsb3dCYXNlVXJsLFxuICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICB9O1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0xdID0gY3R4O1xuICAvLyBTZXJpYWxpemF0aW9uIG1pbnRzIHN0cmVhbSBpZHMgdGhyb3VnaCB0aGlzIHN5bWJvbCwgYW5kIGNhbGxzIGl0IHdpdGggbm9cbiAgLy8gc2VlZCB0aW1lLiBgbW9ub3RvbmljRmFjdG9yeWAgcmV0dXJucyBgZW5jb2RlVGltZShsYXN0VGltZSlgIG9uIGl0c1xuICAvLyBpbmNyZW1lbnQgYnJhbmNoLCBzbyBvbmUgc3VjaCBjYWxsIGxhdGNoZXMgdGhlICpob3N0KiB3YWxsIGNsb2NrIGludG9cbiAgLy8gYGxhc3RUaW1lYCwgYW5kIGV2ZXJ5IGlkIHRoZSBydW4gbWludHMgYWZ0ZXJ3YXJkcyBjYXJyaWVzIHRoYXQgdGltZXN0YW1wXG4gIC8vIGluc3RlYWQgb2YgYGZpeGVkVGltZXN0YW1wYCwgYSB2YWx1ZSB0aGF0IGRpZmZlcnMgb24gZXZlcnkgcmVwbGF5LiBCaW5kaW5nXG4gIC8vIHRoZSBzZWVkIHRpbWUgaGVyZSBrZWVwcyB0aGUgd2hvbGUgcnVuIG9uIG9uZSByZXBsYXktc3RhYmxlIGNsb2NrLlxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1NUQUJMRV9VTElEXSA9IGdlbmVyYXRlVWxpZDtcblxuICAvLyBXb3JrZmxvdyBjb2RlIG11c3QgaW1wb3J0IHRoZSBkZXRlcm1pbmlzdGljIGBmZXRjaGAgc3RlcCBmcm9tIGB3b3JrZmxvd2AuXG4gIHZtR2xvYmFsVGhpcy5mZXRjaCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgdm1HbG9iYWxUaGlzLkVycm9yKFxuICAgICAgYEdsb2JhbCBcImZldGNoXCIgaXMgdW5hdmFpbGFibGUgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBVc2UgdGhlIFwiZmV0Y2hcIiBzdGVwIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIHRvIG1ha2UgSFRUUCByZXF1ZXN0cy5cXG5cXG5MZWFybiBtb3JlOiBodHRwczovL3dvcmtmbG93LXNkay5kZXYvZXJyLyR7RVJST1JfU0xVR1MuRkVUQ0hfSU5fV09SS0ZMT1dfRlVOQ1RJT059YFxuICAgICk7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGUgdGltZW91dC9pbnRlcnZhbCBmdW5jdGlvbnMgdG8gdGhyb3cgaGVscGZ1bCBlcnJvcnNcbiAgLy8gVGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSByZWx5IG9uXG4gIC8vIGFzeW5jaHJvbm91cyBzY2hlZHVsaW5nIHdoaWNoIGJyZWFrcyBkZXRlcm1pbmlzdGljIHJlcGxheVxuICBjb25zdCB0aW1lb3V0RXJyb3JNZXNzYWdlID1cbiAgICAnVGltZW91dCBmdW5jdGlvbnMgbGlrZSBcInNldFRpbWVvdXRcIiBhbmQgXCJzZXRJbnRlcnZhbFwiIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcInNsZWVwXCIgZnVuY3Rpb24gZnJvbSBcIndvcmtmbG93XCIgZm9yIHRpbWUtYmFzZWQgZGVsYXlzLic7XG5cbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldFRpbWVvdXQgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFySW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW1tZWRpYXRlID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFySW1tZWRpYXRlID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyBgQWJvcnRDb250cm9sbGVyYCBhbmQgYEFib3J0U2lnbmFsYCBpbiB0aGUgd29ya2Zsb3cgVk0gYXJlIGhvb2stYmFja2VkXG4gIC8vIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gVGhlIGNvbnRyb2xsZXIncyBhYm9ydCgpIHF1ZXVlcyBhIGhvb2sgcmVzdW1wdGlvbixcbiAgLy8gYW5kIHNpZ25hbC5hYm9ydGVkIGlzIHVwZGF0ZWQgd2hlbiB0aGUgaG9vayBldmVudCBpcyBwcm9jZXNzZWQgZHVyaW5nIHJlcGxheS5cbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0Q29udHJvbGxlciA9XG4gICAgY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IGFib3J0U2lnbmFsU3RhdGljcyA9IGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcygpO1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuQWJvcnRTaWduYWwgPSB7XG4gICAgYWJvcnQ6IGFib3J0U2lnbmFsU3RhdGljcy5hYm9ydCxcbiAgICBhbnk6IGFib3J0U2lnbmFsU3RhdGljcy5hbnksXG4gICAgdGltZW91dDogYWJvcnRTaWduYWxTdGF0aWNzLnRpbWVvdXQsXG4gIH07XG5cbiAgLy8gYFJlcXVlc3RgIGFuZCBgUmVzcG9uc2VgIGFyZSBzcGVjaWFsIGJ1aWx0LWluIGNsYXNzZXMgdGhhdCBpbnZva2Ugc3RlcHNcbiAgLy8gZm9yIHRoZSBganNvbigpYCwgYHRleHQoKWAgYW5kIGBhcnJheUJ1ZmZlcigpYCBpbnN0YW5jZSBtZXRob2RzXG4gIGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlcXVlc3Qge1xuICAgIGNhY2hlITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjYWNoZSddO1xuICAgIGNyZWRlbnRpYWxzITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjcmVkZW50aWFscyddO1xuICAgIGRlc3RpbmF0aW9uITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydkZXN0aW5hdGlvbiddO1xuICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgIGludGVncml0eSE6IHN0cmluZztcbiAgICBtZXRob2QhOiBzdHJpbmc7XG4gICAgbW9kZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnbW9kZSddO1xuICAgIHJlZGlyZWN0ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWRpcmVjdCddO1xuICAgIHJlZmVycmVyITogc3RyaW5nO1xuICAgIHJlZmVycmVyUG9saWN5ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWZlcnJlclBvbGljeSddO1xuICAgIHVybCE6IHN0cmluZztcbiAgICBrZWVwYWxpdmUhOiBib29sZWFuO1xuICAgIHNpZ25hbCE6IEFib3J0U2lnbmFsO1xuICAgIGR1cGxleCE6ICdoYWxmJztcbiAgICBib2R5ITogUmVhZGFibGVTdHJlYW08YW55PiB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogYW55LCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICAgIC8vIEhhbmRsZSBVUkwgaW5wdXRcbiAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTCkge1xuICAgICAgICBjb25zdCB1cmxTdHJpbmcgPSBTdHJpbmcoaW5wdXQpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBVUkwgZm9ybWF0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV3IHZtR2xvYmFsVGhpcy5VUkwodXJsU3RyaW5nKTtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybFN0cmluZztcbiAgICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJHt1cmxTdHJpbmd9YCwge1xuICAgICAgICAgICAgY2F1c2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElucHV0IGlzIGEgUmVxdWVzdCBvYmplY3QgLSBjbG9uZSBpdHMgcHJvcGVydGllc1xuICAgICAgICB0aGlzLnVybCA9IGlucHV0LnVybDtcbiAgICAgICAgaWYgKCFpbml0KSB7XG4gICAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICAgIHRoaXMuYm9keSA9IGlucHV0LmJvZHk7XG4gICAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IGlucHV0LmNhY2hlO1xuICAgICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGlucHV0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgaW5pdCBpcyBwcm92aWRlZCwgbWVyZ2U6IHVzZSBzb3VyY2UgcHJvcGVydGllcywgdGhlbiBvdmVycmlkZSB3aXRoIGluaXRcbiAgICAgICAgLy8gQ29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgUmVxdWVzdCBmaXJzdFxuICAgICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlO1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGlucHV0LnJlZGlyZWN0O1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbnB1dC5pbnRlZ3JpdHk7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgdGhpcy5kdXBsZXggPSBpbnB1dC5kdXBsZXg7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcnJpZGUgd2l0aCBpbml0IG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgICAgIC8vIFNldCBtZXRob2RcbiAgICAgIGlmIChpbml0Py5tZXRob2QpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBpbml0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5tZXRob2QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgZm9yIHN0cmluZyBpbnB1dCBjYXNlXG4gICAgICAgIHRoaXMubWV0aG9kID0gJ0dFVCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBoZWFkZXJzXG4gICAgICBpZiAoaW5pdD8uaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdC5oZWFkZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiB2bUdsb2JhbFRoaXMuVVJMXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9yIHN0cmluZy9VUkwgaW5wdXQsIGNyZWF0ZSBlbXB0eSBoZWFkZXJzXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgb3RoZXIgcHJvcGVydGllcyB3aXRoIGluaXQgdmFsdWVzIG9yIGRlZmF1bHRzXG4gICAgICBpZiAoaW5pdD8ubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IGluaXQubW9kZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubW9kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gJ2NvcnMnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8uY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5pdC5jcmVkZW50aWFscztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY3JlZGVudGlhbHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSAnc2FtZS1vcmlnaW4nO1xuICAgICAgfVxuXG4gICAgICAvLyBgYW55YCBjYXN0IGhlcmUgYmVjYXVzZSBAdHlwZXMvbm9kZSB2MjIgZG9lcyBub3QgeWV0IGhhdmUgYGNhY2hlYFxuICAgICAgaWYgKChpbml0IGFzIGFueSk/LmNhY2hlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IChpbml0IGFzIGFueSkuY2FjaGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNhY2hlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNhY2hlID0gJ2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVkaXJlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5pdC5yZWRpcmVjdDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVkaXJlY3QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSAnZm9sbG93JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZmVycmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IGluaXQucmVmZXJyZXI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZmVycmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gJ2Fib3V0OmNsaWVudCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWZlcnJlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlclBvbGljeSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8uaW50ZWdyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbml0LmludGVncml0eTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuaW50ZWdyaXR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmludGVncml0eSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBpbml0LmtlZXBhbGl2ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMua2VlcGFsaXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBBYm9ydFNpZ25hbCBzdHViXG4gICAgICAgIHRoaXMuc2lnbmFsID0gaW5pdC5zaWduYWw7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNpZ25hbCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICB0aGlzLnNpZ25hbCA9IHsgYWJvcnRlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmR1cGxleCkge1xuICAgICAgICB0aGlzLmR1cGxleCA9ICdoYWxmJztcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSAnZG9jdW1lbnQnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5ID0gaW5pdD8uYm9keTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBHRVQvSEVBRCBtZXRob2RzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICBpZiAoXG4gICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJylcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZXF1ZXN0IHdpdGggR0VUL0hFQUQgbWV0aG9kIGNhbm5vdCBoYXZlIGJvZHkuYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIFwiZmFrZVwiIFJlYWRhYmxlU3RyZWFtIHRoYXQgc3RvcmVzIHRoZSBvcmlnaW5hbCBib2R5XG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9uZSgpOiBSZXF1ZXN0IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZXNlXG4gICAgYmxvYiE6ICgpID0+IFByb21pc2U8QmxvYj47XG4gICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPEZvcm1EYXRhPjtcblxuICAgIGFycmF5QnVmZmVyITogKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAganNvbiE6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICB0ZXh0ITogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gICAgYXJyYXlCdWZmZXI6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAganNvbjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIGFueT4oJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBzdHJpbmc+KCdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgfSk7XG5cbiAgY2xhc3MgUmVzcG9uc2UgaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlc3BvbnNlIHtcbiAgICB0eXBlITogZ2xvYmFsVGhpcy5SZXNwb25zZVsndHlwZSddO1xuICAgIHVybCE6IHN0cmluZztcbiAgICBzdGF0dXMhOiBudW1iZXI7XG4gICAgc3RhdHVzVGV4dCE6IHN0cmluZztcbiAgICBib2R5ITogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBudWxsO1xuICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgIHJlZGlyZWN0ZWQhOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoYm9keT86IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBpbml0Py5zdGF0dXMgPz8gMjAwO1xuICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gaW5pdD8uc3RhdHVzVGV4dCA/PyAnJztcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0Py5oZWFkZXJzKTtcbiAgICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgIHRoaXMudXJsID0gJyc7XG4gICAgICB0aGlzLnJlZGlyZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBudWxsLWJvZHkgc3RhdHVzIGNvZGVzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICAvLyBQZXIgSFRUUCBzcGVjOiAyMDQgKE5vIENvbnRlbnQpLCAyMDUgKFJlc2V0IENvbnRlbnQpLCBhbmQgMzA0IChOb3QgTW9kaWZpZWQpXG4gICAgICBpZiAoXG4gICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0aGlzLnN0YXR1cyA9PT0gMjA0IHx8IHRoaXMuc3RhdHVzID09PSAyMDUgfHwgdGhpcy5zdGF0dXMgPT09IDMwNClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBSZXNwb25zZSBjb25zdHJ1Y3RvcjogSW52YWxpZCByZXNwb25zZSBzdGF0dXMgY29kZSAke3RoaXMuc3RhdHVzfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIEJvZHlJbml0IGZvciBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAoYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgXCJmYWtlXCIgUmVhZGFibGVTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIG9yaWdpbmFsIGJvZHlcbiAgICAgICAgLy8gVGhpcyBhdm9pZHMgZG9pbmcgYXN5bmMgd29yayBkdXJpbmcgd29ya2Zsb3cgcmVwbGF5XG4gICAgICAgIHRoaXMuYm9keSA9IE9iamVjdC5jcmVhdGUodm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgdmFsdWU6IGJvZHksXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgIGNsb25lITogKCkgPT4gUmVzcG9uc2U7XG4gICAgYmxvYiE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5CbG9iPjtcbiAgICBmb3JtRGF0YSE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5Gb3JtRGF0YT47XG5cbiAgICBnZXQgb2soKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIH1cblxuICAgIGdldCBib2R5VXNlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb24oZGF0YTogYW55LCBpbml0PzogUmVzcG9uc2VJbml0KTogUmVzcG9uc2Uge1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0Py5oZWFkZXJzKTtcbiAgICAgIGlmICghaGVhZGVycy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVycm9yKCk6IFJlc3BvbnNlIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVkaXJlY3QodXJsOiBzdHJpbmcgfCBVUkwsIHN0YXR1czogbnVtYmVyID0gMzAyKTogUmVzcG9uc2Uge1xuICAgICAgLy8gVmFsaWRhdGUgc3RhdHVzIGNvZGUgLSBvbmx5IHNwZWNpZmljIHJlZGlyZWN0IGNvZGVzIGFyZSBhbGxvd2VkXG4gICAgICBpZiAoIVszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0uaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCByZWRpcmVjdCBzdGF0dXMgY29kZTogJHtzdGF0dXN9LiBNdXN0IGJlIG9uZSBvZjogMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSByZXNwb25zZSB3aXRoIExvY2F0aW9uIGhlYWRlclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgaGVhZGVycy5zZXQoJ0xvY2F0aW9uJywgU3RyaW5nKHVybCkpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IE9iamVjdC5jcmVhdGUoUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSAnJztcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgcmVzcG9uc2UuYm9keSA9IG51bGw7XG4gICAgICByZXNwb25zZS50eXBlID0gJ2RlZmF1bHQnO1xuICAgICAgcmVzcG9uc2UudXJsID0gJyc7XG4gICAgICByZXNwb25zZS5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gICAgYXJyYXlCdWZmZXI6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAganNvbjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIGFueT4oJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBzdHJpbmc+KCdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgfSk7XG5cbiAgY2xhc3MgUmVhZGFibGVTdHJlYW08VD4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhbmNlbCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldFJlYWRlcigpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHBpcGVUaHJvdWdoKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgcGlwZVRvKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgdGVlKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgdmFsdWVzKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb20oKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtO1xuXG4gIGNsYXNzIFdyaXRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxUPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhYm9ydCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGNsb3NlKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0V3JpdGVyKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbSA9IFdyaXRhYmxlU3RyZWFtO1xuXG4gIGNsYXNzIFRyYW5zZm9ybVN0cmVhbTxJLCBPPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtPEksIE8+IHtcbiAgICByZWFkYWJsZTogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxPPjtcbiAgICB3cml0YWJsZTogZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxJPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtO1xuXG4gIHZtR2xvYmFsVGhpcy5jb25zb2xlID0gZ2xvYmFsVGhpcy5jb25zb2xlO1xuXG4gIC8vIEV4cG9zZSB0aGUgcmVxdWVzdC1jb250ZXh0IHN5bWJvbCByZXF1aXJlZCBieSBBSSBHYXRld2F5LlxuICBjb25zdCBTWU1CT0xfRk9SX1JFUV9DT05URVhUID0gU3ltYm9sLmZvcignQHZlcmNlbC9yZXF1ZXN0LWNvbnRleHQnKTtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tTWU1CT0xfRk9SX1JFUV9DT05URVhUXSA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVFxuICBdO1xuXG4gIC8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgdXNlci1kZWZpbmVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICAvLyBUaGUgZmlsZW5hbWUgcGFyYW1ldGVyIGVuc3VyZXMgc3RhY2sgdHJhY2VzIHNob3cgYSBtZWFuaW5nZnVsIG5hbWVcbiAgLy8gKGUuZy4sIFwiZXhhbXBsZS93b3JrZmxvd3MvOTlfZTJlLnRzXCIpIGluc3RlYWQgb2YgXCJldmFsbWFjaGluZS48YW5vbnltb3VzPlwiLlxuICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKTtcbiAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lO1xuXG4gIC8vIFJldXNlIGNvbXBpbGVkIHNjcmlwdHMgYnkgYChjb2RlLCBmaWxlbmFtZSlgOiBjb21waWxhdGlvbiBpcyBkZXRlcm1pbmlzdGljXG4gIC8vIGFuZCB0aGUgZmlsZW5hbWUgcHJlc2VydmVzIHdvcmtmbG93IHNvdXJjZSBhdHRyaWJ1dGlvbiBpbiBzdGFjayB0cmFjZXMuXG4gIC8vIFRoZSBidW5kbGUgcmVnaXN0ZXJzIHdvcmtmbG93cyBvbiBgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzYC5cbiAgcnVuQ2FjaGVkV29ya2Zsb3dTY3JpcHQod29ya2Zsb3dDb2RlLCBmaWxlbmFtZSwgY29udGV4dCk7XG4gIGNvbnN0IHdvcmtmbG93Rm4gPSBydW5DYWNoZWRXb3JrZmxvd1NjcmlwdChcbiAgICBgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzPy5nZXQoJHtKU09OLnN0cmluZ2lmeSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpfSlgLFxuICAgIGZpbGVuYW1lLFxuICAgIGNvbnRleHRcbiAgKTtcblxuICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3Iod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKTtcbiAgfVxuXG4gIC8vIENoYWluIHdvcmtmbG93IGFyZ3VtZW50IGh5ZHJhdGlvbiBvbnRvIHRoZSBwcm9taXNlUXVldWUgc28gdGhhdCB0aGVcbiAgLy8gdW5jb25zdW1lZCBldmVudCBjaGVjayAod2hpY2ggd2FpdHMgZm9yIHRoZSBxdWV1ZSB0byBkcmFpbikgZG9lc24ndFxuICAvLyBmaXJlIGR1cmluZyB0aGUgYXN5bmMgZ2FwIGJldHdlZW4gcnVuX3N0YXJ0ZWQgY29uc3VtcHRpb24gYW5kIHRoZVxuICAvLyB3b3JrZmxvdyBmdW5jdGlvbiBzdWJzY3JpYmluZyBpdHMgZmlyc3Qgc3RlcCBjYWxsYmFja3MuXG4gIGxldCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZSA9IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCByZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZVdvcmtmbG93SW5wdXQod29ya2Zsb3dSdW4pO1xuICAgIGFyZ3MgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dCxcbiAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgIHt9LFxuICAgICAgcHJlcGFyZWRcbiAgICApO1xuICB9KTtcbiAgYXdhaXQgd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZTtcblxuICAvLyBUaGUgdXNlciBmdW5jdGlvbidzIHByb21pc2UuIEl0IG1heSBzdGF5IHBlbmRpbmcgYWNyb3NzIG1hbnkgcmVzdW1lc1xuICAvLyAoZWFjaCBwYXJrZWQgc3RlcCBwcm9taXNlIGhvbGRzIGl0IHVwKSBhbmQgaXMgcmFjZWQgYWdhaW5zdCB0aGUgY3VycmVudFxuICAvLyBhdHRlbXB0J3MgaW50ZXJydXB0aW9uIGluIHdhaXRGb3JFeGVjdXRpb24uXG4gIGNvbnN0IHdvcmtmbG93Qm9keSA9IChhc3luYyAoKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93Rm4oLi4uYXJncyk7XG4gIH0pKCk7XG5cbiAgY29uc3QgZmFpbFdvcmtmbG93ID0gYXN5bmMgKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxuZXZlcj4gPT4ge1xuICAgIC8vIENvbnRyb2wtZmxvdyBzaWduYWxzIGFyZSBoYW5kbGVkIGJ5IHRoZSBydW50aW1lIGFuZCBkbyBub3QgbWVhbiB0aGVcbiAgICAvLyB3b3JrZmxvdyBoYXMgdGVybWluYWxseSBmYWlsZWQuIGBvbldvcmtmbG93RXJyb3JgIHVzdWFsbHkgYWxyZWFkeSBtb3ZlZFxuICAgIC8vIHRoZSBzdGF0ZSBtYWNoaW5lLCBidXQgYSBkaXZlcmdlbmNlIGNhbiBhbHNvIGFycml2ZSB2aWEgYSBzdGVwXG4gICAgLy8gcHJvbWlzZSdzIGRpcmVjdCByZWplY3Rpb24gKGJ5cGFzc2luZyBgb25Xb3JrZmxvd0Vycm9yYCk7IGRlbW90ZSBzb1xuICAgIC8vIGV2ZXJ5IGNvbnRyb2wtZmxvdyBwYXRoIGNvbnZlcmdlcyBvbiBgcmVwbGF5YCBhbmQgYSBsYXRlciByZXN1bWUgZmFsbHNcbiAgICAvLyBiYWNrIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnJvcikgfHwgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycm9yKSkge1xuICAgICAgaWYgKHN0YXRlLnR5cGUgPT09ICdydW5uaW5nJykgc3RhdGUgPSB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgc3RhdGUgPSB7IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbiAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd0NvbnRleHQuaW52b2NhdGlvbnNRdWV1ZSxcbiAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgJ2ZhaWxlZCcsXG4gICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICApO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH07XG5cbiAgY29uc3Qgd2FpdEZvckV4ZWN1dGlvbiA9IGFzeW5jIChcbiAgICBpbnRlcnJ1cHRpb246IFByb21pc2VXaXRoUmVzb2x2ZXJzPG5ldmVyPlxuICApOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0PiA9PiB7XG4gICAgbGV0IHJlc3VsdDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFt3b3JrZmxvd0JvZHksIGludGVycnVwdGlvbi5wcm9taXNlXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChzdGF0ZS50eXBlID09PSAnc3VzcGVuZGVkJyAmJiBlcnJvciA9PT0gc3RhdGUuc3VzcGVuc2lvbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIHN1c3BlbnNpb246IHN0YXRlLnN1c3BlbnNpb24sXG4gICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICAvLyBBIHN1c3BlbnNpb24gaXMgbm90IGEgc2V0dGxpbmcgcG9pbnQ6IHRoZSBjb25zdW1lciBmb3Igc29tZXRoaW5nXG4gICAgICAgICAgLy8gaGVsZCBtYXkgd2VsbCBiZSByZWdpc3RlcmVkIGJ5IHRoZSByZXBsYXkgdGhhdCBmb2xsb3dzIHRoaXMgb25lLlxuICAgICAgICAgIC8vIFNvIGl0IGlzIGNhcnJpZWQgb3V0IGZvciB0aGUgc3BhbiBpbnN0ZWFkIG9mIGJlaW5nIGp1ZGdlZCBoZXJlLlxuICAgICAgICAgIHBhcmtlZDogZXZlbnRzQ29uc3VtZXIucGFya2VkU3VtbWFyeSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coZXJyb3IpO1xuICAgIH1cblxuICAgIHN0YXRlID0geyB0eXBlOiAnY29tcGxldGVkJyB9O1xuICAgIC8vIFRoZSBjb25zdW1lciB3YWxrcyBwYXN0IGV2ZW50cyB3aG9zZSB0eXBlIGNhcnJpZXMgbm8gb3JkZXJpbmcgY2xhaW0gYW5kXG4gICAgLy8gaG9sZHMgdGhlbSBmb3IgYSBjb25zdW1lciBpdCBleHBlY3RzIGEgbGF0ZXIgYHN1YnNjcmliZSgpYCB0byByZWdpc3Rlci5cbiAgICAvLyBUaGUgd29ya2Zsb3cgZnVuY3Rpb24gcmV0dXJuaW5nIGlzIHRoZSBwb2ludCB3aGVyZSB0aGF0IGV4cGVjdGF0aW9uIGlzXG4gICAgLy8gc2V0dGxlZDogbm90aGluZyBtb3JlIHdpbGwgc3Vic2NyaWJlLCBzbyBhbnl0aGluZyBzdGlsbCBoZWxkIHdhcyBuZXZlclxuICAgIC8vIGFueW9uZSdzLCBhbmQgY29tcGxldGluZyBoZXJlIHdvdWxkIGRyb3AgaXQgc2lsZW50bHkuXG4gICAgY29uc3Qgc3RyYW5kZWQgPSBldmVudHNDb25zdW1lci5zdHJhbmRlZEV2ZW50O1xuICAgIGlmIChzdHJhbmRlZCkge1xuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhcbiAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICBgUmVwbGF5IGZpbmlzaGVkIHdpdGhvdXQgY29uc3VtaW5nIGV2ZW50OiBldmVudFR5cGU9JHtzdHJhbmRlZC5ldmVudFR5cGV9LCBjb3JyZWxhdGlvbklkPSR7c3RyYW5kZWQuY29ycmVsYXRpb25JZH0sIGV2ZW50SWQ9JHtzdHJhbmRlZC5ldmVudElkfS5gLFxuICAgICAgICAgIHsgZXZlbnRJZDogc3RyYW5kZWQuZXZlbnRJZCB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvLyBPbmx5IGNvbXByZXNzaW9uLWNhcGFibGUgcnVucyAoc3BlYyA+PSA1KSBtYXkgd3JpdGUgY29tcHJlc3NlZFxuICAgICAgICAvLyBwYXlsb2Fkcy4gVGhlIHNlcmlhbGl6ZXIgdXNlcyB6c3RkIHdoZW4gc3VwcG9ydGVkIGFuZCBtYXkgdXNlIGd6aXAuXG4gICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMoXG4gICAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0NvbnRleHQuaW52b2NhdGlvbnNRdWV1ZSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ2NvbXBsZXRlZCcsIG91dHB1dCwgcmVzdWx0VHlwZTogdHlwZW9mIHJlc3VsdCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uID0ge1xuICAgIHdvcmtmbG93UnVuLFxuICAgIGFyZ3VtZW50Q291bnQ6IGFyZ3MubGVuZ3RoLFxuICAgIGFzeW5jIHJlc3VtZShuZXh0RXZlbnRzKSB7XG4gICAgICBzd2l0Y2ggKHN0YXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3VzcGVuZGVkJzoge1xuICAgICAgICAgIC8vIFRoZSBmdWxsIE8oa25vd24gZXZlbnRzKSBwcmVmaXggY29tcGFyZSBpcyByZXF1aXJlZDogdGhlIHJ1bnRpbWVcbiAgICAgICAgICAvLyB1c3VhbGx5IGdyb3dzIG9uZSBhcnJheSBpbiBwbGFjZSwgYnV0IGl0cyB3YWl0LWNvbXBsZXRpb24gYW5kXG4gICAgICAgICAgLy8gc3RhbGUtcmVsb2FkIHBhdGhzIFJFUExBQ0UgdGhlIGFycmF5IHdpdGggYSBmcmVzaCBmdWxsIGZldGNoLCBzb1xuICAgICAgICAgIC8vIGEgcmV3cml0dGVuIHByZWZpeCBpcyBhIHJlYWwgaW5wdXQsIG5vdCBwYXJhbm9pYS4gVGhlIGNvbXBhcmVzXG4gICAgICAgICAgLy8gYXJlIGNoZWFwIHN0cmluZyBlcXVhbGl0eSBhbmQgZHdhcmZlZCBieSB0aGUgcmVwbGF5IHRoZXkgYXZvaWQuXG4gICAgICAgICAgY29uc3Qga25vd25FdmVudHMgPSBldmVudHNDb25zdW1lci5ldmVudHM7XG4gICAgICAgICAgY29uc3QgaXNTdHJpY3RFeHRlbnNpb24gPVxuICAgICAgICAgICAgbmV4dEV2ZW50cy5sZW5ndGggPiBrbm93bkV2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgICAgIGtub3duRXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAoZXZlbnQsIGluZGV4KSA9PiBldmVudC5ldmVudElkID09PSBuZXh0RXZlbnRzW2luZGV4XS5ldmVudElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmICghaXNTdHJpY3RFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW50ZXJydXB0aW9uID0gd2l0aFJlc29sdmVyczxuZXZlcj4oKTtcbiAgICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3J1bm5pbmcnLCBpbnRlcnJ1cHRpb24gfTtcbiAgICAgICAgICB3b3JrZmxvd0NvbnRleHQuc3VzcGVuc2lvbkdlbmVyYXRpb24rKztcbiAgICAgICAgICBldmVudHNDb25zdW1lci5hcHBlbmQobmV4dEV2ZW50cy5zbGljZShrbm93bkV2ZW50cy5sZW5ndGgpKTtcbiAgICAgICAgICByZXR1cm4gd2FpdEZvckV4ZWN1dGlvbihpbnRlcnJ1cHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlcGxheSc6XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZXN1bWUgJHtzdGF0ZS50eXBlfSB3b3JrZmxvdyBcIiR7d29ya2Zsb3dSdW4ucnVuSWR9XCJgXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlIHNhdGlzZmllcyBuZXZlcjtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbixcbiAgICBleGVjdXRpb246IHdhaXRGb3JFeGVjdXRpb24oaW5pdGlhbEludGVycnVwdGlvbiksXG4gIH07XG59XG4iXX0=
|