@workflow/core 5.0.0-beta.5 → 5.0.0-beta.50
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/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- 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 +8 -6
- package/dist/create-hook.d.ts +72 -7
- 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.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +271 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +646 -42
- package/dist/flushable-stream.d.ts +56 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +123 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +7 -7
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +341 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +559 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +136 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1686 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +205 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +760 -127
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +75 -0
- package/dist/runtime/suspension-handler.d.ts +269 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1253 -125
- 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 +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3741 -490
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1879 -274
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +72 -9
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +397 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +297 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +101 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +895 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- 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 +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +107 -59
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +98 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -776
|
@@ -1,4 +1,51 @@
|
|
|
1
1
|
import { type PromiseWithResolvers } from '@workflow/utils';
|
|
2
|
+
/**
|
|
3
|
+
* A durability barrier a sink may expose under {@link STREAM_DRAIN_SYMBOL}:
|
|
4
|
+
* resolves once every chunk the sink has accepted is durably written, rejects
|
|
5
|
+
* if any server write failed. See `WorkflowServerWritableStream`.
|
|
6
|
+
*/
|
|
7
|
+
type DrainBarrier = () => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
|
|
10
|
+
* while coalescing. Once this many chunks are outstanding the producer stops
|
|
11
|
+
* reading until the consumer drains a batch, so a fast producer paired with a
|
|
12
|
+
* slow server can't grow the in-memory queue without bound. Override:
|
|
13
|
+
* `WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS`.
|
|
14
|
+
*
|
|
15
|
+
* This is deliberately distinct from the per-request batch caps below: this
|
|
16
|
+
* bounds how much is *buffered*, those bound how much goes out in one
|
|
17
|
+
* `writeMulti`. Raising this must never let a single request exceed a wire
|
|
18
|
+
* limit, since batch sizing enforces that independently.
|
|
19
|
+
*/
|
|
20
|
+
export declare const MAX_INFLIGHT_CHUNKS = 1000;
|
|
21
|
+
export declare const getMaxInflightChunks: () => number;
|
|
22
|
+
/**
|
|
23
|
+
* Wire limit: maximum number of chunks in a single coalesced `writeMulti`.
|
|
24
|
+
* The server enforces a per-multi-write chunk cap (1,000 today); a batch is
|
|
25
|
+
* split at this bound so it can never be rejected wholesale, independently of
|
|
26
|
+
* the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
|
|
27
|
+
*/
|
|
28
|
+
export declare const MAX_CHUNKS_PER_BATCH = 1000;
|
|
29
|
+
export declare const getMaxChunksPerBatch: () => number;
|
|
30
|
+
/**
|
|
31
|
+
* Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
|
|
32
|
+
* Chunk *count* alone is not enough: 1,000 small chunks are ~100KB but 1,000
|
|
33
|
+
* file-sized chunks can be hundreds of MB, which platform request-body limits
|
|
34
|
+
* reject long before the count cap matters. A batch is split once adding the
|
|
35
|
+
* next chunk would exceed this (a single chunk larger than the cap still goes
|
|
36
|
+
* out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MAX_BYTES_PER_BATCH: number;
|
|
39
|
+
export declare const getMaxBytesPerBatch: () => number;
|
|
40
|
+
/**
|
|
41
|
+
* Buffer bound (bytes) for the server writable's group-commit buffer, the
|
|
42
|
+
* byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
|
|
43
|
+
* blocks once this much data is buffered-but-not-durable, so a fast producer
|
|
44
|
+
* of large chunks can't grow client memory without bound. Default 8 MiB
|
|
45
|
+
* (eight request-sized groups). Override: `WORKFLOW_STREAM_MAX_BUFFERED_BYTES`.
|
|
46
|
+
*/
|
|
47
|
+
export declare const MAX_BUFFERED_BYTES: number;
|
|
48
|
+
export declare const getMaxBufferedBytes: () => number;
|
|
2
49
|
/**
|
|
3
50
|
* Polling interval (in ms) for lock release detection.
|
|
4
51
|
*
|
|
@@ -12,7 +59,7 @@ import { type PromiseWithResolvers } from '@workflow/utils';
|
|
|
12
59
|
* after each step body returns, so a coarser interval (the previous 100ms)
|
|
13
60
|
* adds visible per-step latency to streaming workflows. With a uniformly
|
|
14
61
|
* distributed offset between step return and the next tick, the expected
|
|
15
|
-
* wait is half the interval
|
|
62
|
+
* wait is half the interval, so 10ms means ~5ms average wait per step
|
|
16
63
|
* instead of ~50ms. The per-tick work is `writable.locked` plus a
|
|
17
64
|
* `getWriter()`/`releaseLock()` probe, both microsecond-scale; 10× more
|
|
18
65
|
* ticks during a stream's lifetime is not measurable in practice.
|
|
@@ -43,6 +90,13 @@ export interface FlushableStreamState extends PromiseWithResolvers<void> {
|
|
|
43
90
|
writablePollingInterval?: ReturnType<typeof setInterval>;
|
|
44
91
|
/** Interval ID for readable lock polling (if active) */
|
|
45
92
|
readablePollingInterval?: ReturnType<typeof setInterval>;
|
|
93
|
+
/**
|
|
94
|
+
* Durability barrier of the pipe's sink, when it acks writes on buffer
|
|
95
|
+
* entry (see {@link STREAM_DRAIN_SYMBOL}). Lock-release completion awaits
|
|
96
|
+
* this before resolving so `pendingOps === 0` (fast, buffered acks) can't
|
|
97
|
+
* complete a step while data is still client-side.
|
|
98
|
+
*/
|
|
99
|
+
drainBarrier?: DrainBarrier;
|
|
46
100
|
}
|
|
47
101
|
export declare function createFlushableState(): FlushableStreamState;
|
|
48
102
|
/**
|
|
@@ -79,4 +133,5 @@ export declare function pollReadableLock(readable: ReadableStream, state: Flusha
|
|
|
79
133
|
* @returns Promise that resolves when stream ends (not when done promise resolves)
|
|
80
134
|
*/
|
|
81
135
|
export declare function flushablePipe(source: ReadableStream, sink: WritableStream, state: FlushableStreamState): Promise<void>;
|
|
136
|
+
export {};
|
|
82
137
|
//# sourceMappingURL=flushable-stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"flushable-stream.d.ts","sourceRoot":"","sources":["../src/flushable-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,iBAAiB,CAAC;AAI3E;;;;GAIG;AACH,KAAK,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,eAAO,MAAM,oBAAoB,QAAO,MAIpC,CAAC;AAEL;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAElD,eAAO,MAAM,mBAAmB,QAAO,MAInC,CAAC;AAEL;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AASxC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB,CAAC,IAAI,CAAC;IACtE,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD,wDAAwD;IACxD,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACzD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AAgFD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAwBN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
package/dist/flushable-stream.js
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
2
2
|
import { withResolvers } from '@workflow/utils';
|
|
3
|
+
import { envNumber } from '@workflow/world/env-config';
|
|
4
|
+
import { STREAM_DRAIN_SYMBOL } from './symbols.js';
|
|
5
|
+
/**
|
|
6
|
+
* Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
|
|
7
|
+
* while coalescing. Once this many chunks are outstanding the producer stops
|
|
8
|
+
* reading until the consumer drains a batch, so a fast producer paired with a
|
|
9
|
+
* slow server can't grow the in-memory queue without bound. Override:
|
|
10
|
+
* `WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS`.
|
|
11
|
+
*
|
|
12
|
+
* This is deliberately distinct from the per-request batch caps below: this
|
|
13
|
+
* bounds how much is *buffered*, those bound how much goes out in one
|
|
14
|
+
* `writeMulti`. Raising this must never let a single request exceed a wire
|
|
15
|
+
* limit, since batch sizing enforces that independently.
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_INFLIGHT_CHUNKS = 1000;
|
|
18
|
+
export const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS', MAX_INFLIGHT_CHUNKS, {
|
|
19
|
+
integer: true,
|
|
20
|
+
min: 1,
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Wire limit: maximum number of chunks in a single coalesced `writeMulti`.
|
|
24
|
+
* The server enforces a per-multi-write chunk cap (1,000 today); a batch is
|
|
25
|
+
* split at this bound so it can never be rejected wholesale, independently of
|
|
26
|
+
* the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
|
|
27
|
+
*/
|
|
28
|
+
export const MAX_CHUNKS_PER_BATCH = 1000;
|
|
29
|
+
export const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH', MAX_CHUNKS_PER_BATCH, {
|
|
30
|
+
integer: true,
|
|
31
|
+
min: 1,
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
|
|
35
|
+
* Chunk *count* alone is not enough: 1,000 small chunks are ~100KB but 1,000
|
|
36
|
+
* file-sized chunks can be hundreds of MB, which platform request-body limits
|
|
37
|
+
* reject long before the count cap matters. A batch is split once adding the
|
|
38
|
+
* next chunk would exceed this (a single chunk larger than the cap still goes
|
|
39
|
+
* out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
|
|
40
|
+
*/
|
|
41
|
+
export const MAX_BYTES_PER_BATCH = 1024 * 1024;
|
|
42
|
+
export const getMaxBytesPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_BYTES_PER_BATCH', MAX_BYTES_PER_BATCH, {
|
|
43
|
+
integer: true,
|
|
44
|
+
min: 1,
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Buffer bound (bytes) for the server writable's group-commit buffer, the
|
|
48
|
+
* byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
|
|
49
|
+
* blocks once this much data is buffered-but-not-durable, so a fast producer
|
|
50
|
+
* of large chunks can't grow client memory without bound. Default 8 MiB
|
|
51
|
+
* (eight request-sized groups). Override: `WORKFLOW_STREAM_MAX_BUFFERED_BYTES`.
|
|
52
|
+
*/
|
|
53
|
+
export const MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
|
|
54
|
+
export const getMaxBufferedBytes = () => envNumber('WORKFLOW_STREAM_MAX_BUFFERED_BYTES', MAX_BUFFERED_BYTES, {
|
|
55
|
+
integer: true,
|
|
56
|
+
min: 1,
|
|
57
|
+
});
|
|
3
58
|
/**
|
|
4
59
|
* Polling interval (in ms) for lock release detection.
|
|
5
60
|
*
|
|
@@ -13,19 +68,28 @@ import { withResolvers } from '@workflow/utils';
|
|
|
13
68
|
* after each step body returns, so a coarser interval (the previous 100ms)
|
|
14
69
|
* adds visible per-step latency to streaming workflows. With a uniformly
|
|
15
70
|
* distributed offset between step return and the next tick, the expected
|
|
16
|
-
* wait is half the interval
|
|
71
|
+
* wait is half the interval, so 10ms means ~5ms average wait per step
|
|
17
72
|
* instead of ~50ms. The per-tick work is `writable.locked` plus a
|
|
18
73
|
* `getWriter()`/`releaseLock()` probe, both microsecond-scale; 10× more
|
|
19
74
|
* ticks during a stream's lifetime is not measurable in practice.
|
|
20
75
|
*/
|
|
21
76
|
export const LOCK_POLL_INTERVAL_MS = 10;
|
|
77
|
+
/** Effective lock-poll interval. Override: `WORKFLOW_LOCK_POLL_INTERVAL_MS`. */
|
|
78
|
+
const getLockPollIntervalMs = () => envNumber('WORKFLOW_LOCK_POLL_INTERVAL_MS', LOCK_POLL_INTERVAL_MS, {
|
|
79
|
+
integer: true,
|
|
80
|
+
min: 1,
|
|
81
|
+
});
|
|
22
82
|
export function createFlushableState() {
|
|
23
|
-
|
|
83
|
+
const state = {
|
|
24
84
|
...withResolvers(),
|
|
25
85
|
pendingOps: 0,
|
|
26
86
|
doneResolved: false,
|
|
27
87
|
streamEnded: false,
|
|
28
88
|
};
|
|
89
|
+
// The runtime awaits this promise after user code returns. Observe early
|
|
90
|
+
// stream failures now so they do not become unhandled rejections first.
|
|
91
|
+
state.promise.catch(() => { });
|
|
92
|
+
return state;
|
|
29
93
|
}
|
|
30
94
|
/**
|
|
31
95
|
* Checks if a WritableStream is unlocked (user released lock) vs closed.
|
|
@@ -82,6 +146,23 @@ function isReadableUnlockedNotClosed(readable) {
|
|
|
82
146
|
}
|
|
83
147
|
return true;
|
|
84
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Settle the flushable completion after the sink's durability barrier.
|
|
151
|
+
*
|
|
152
|
+
* Lock release means the producer is done *writing*; with a group-commit
|
|
153
|
+
* sink, accepted chunks may still be client-buffered or in a request that is
|
|
154
|
+
* in flight. Awaiting the barrier here keeps the completion's meaning
|
|
155
|
+
* ("everything written so far is durable") identical to the pre-batching
|
|
156
|
+
* behavior where each write() was individually durable.
|
|
157
|
+
*/
|
|
158
|
+
function resolveAfterDrain(state) {
|
|
159
|
+
const barrier = state.drainBarrier;
|
|
160
|
+
if (!barrier) {
|
|
161
|
+
state.resolve();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
barrier().then(() => state.resolve(), (err) => state.reject(err));
|
|
165
|
+
}
|
|
85
166
|
/**
|
|
86
167
|
* Polls a WritableStream to check if the user has released their lock.
|
|
87
168
|
* Resolves the done promise when lock is released and no pending ops remain.
|
|
@@ -107,11 +188,11 @@ export function pollWritableLock(writable, state) {
|
|
|
107
188
|
// Check if lock is released (not closed) and no pending ops
|
|
108
189
|
if (isWritableUnlockedNotClosed(writable) && state.pendingOps === 0) {
|
|
109
190
|
state.doneResolved = true;
|
|
110
|
-
state.resolve();
|
|
111
191
|
clearInterval(intervalId);
|
|
112
192
|
state.writablePollingInterval = undefined;
|
|
193
|
+
resolveAfterDrain(state);
|
|
113
194
|
}
|
|
114
|
-
},
|
|
195
|
+
}, getLockPollIntervalMs());
|
|
115
196
|
state.writablePollingInterval = intervalId;
|
|
116
197
|
}
|
|
117
198
|
/**
|
|
@@ -139,11 +220,11 @@ export function pollReadableLock(readable, state) {
|
|
|
139
220
|
// Check if lock is released (not closed) and no pending ops
|
|
140
221
|
if (isReadableUnlockedNotClosed(readable) && state.pendingOps === 0) {
|
|
141
222
|
state.doneResolved = true;
|
|
142
|
-
state.resolve();
|
|
143
223
|
clearInterval(intervalId);
|
|
144
224
|
state.readablePollingInterval = undefined;
|
|
225
|
+
resolveAfterDrain(state);
|
|
145
226
|
}
|
|
146
|
-
},
|
|
227
|
+
}, getLockPollIntervalMs());
|
|
147
228
|
state.readablePollingInterval = intervalId;
|
|
148
229
|
}
|
|
149
230
|
/**
|
|
@@ -157,7 +238,29 @@ export function pollReadableLock(readable, state) {
|
|
|
157
238
|
* @param state - The flushable state tracker
|
|
158
239
|
* @returns Promise that resolves when stream ends (not when done promise resolves)
|
|
159
240
|
*/
|
|
160
|
-
export
|
|
241
|
+
export function flushablePipe(source, sink, state) {
|
|
242
|
+
// Batching lives in the sink (`WorkflowServerWritableStream` group-commits
|
|
243
|
+
// its buffer), so this pipe is a plain per-chunk pump regardless of path:
|
|
244
|
+
// its only responsibilities are lock-release completion and durability
|
|
245
|
+
// tracking. Group-commit sinks ack write() on buffer entry; adopt their
|
|
246
|
+
// durability barrier so the lock-release completion still means
|
|
247
|
+
// "everything written is durable" (see resolveAfterDrain).
|
|
248
|
+
const drain = sink[STREAM_DRAIN_SYMBOL];
|
|
249
|
+
if (typeof drain === 'function') {
|
|
250
|
+
state.drainBarrier = drain;
|
|
251
|
+
}
|
|
252
|
+
return flushablePipePerChunk(source, sink, state);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* The pump behind {@link flushablePipe}: awaits each `writer.write()` before
|
|
256
|
+
* reading the next chunk. Against a group-commit sink, write() acks on buffer
|
|
257
|
+
* entry, so this loop feeds the sink as fast as the producer emits (bounded
|
|
258
|
+
* by the sink's buffer bound) and batching happens inside the sink; against a
|
|
259
|
+
* plain sink each write is individually durable, as before. The source-done
|
|
260
|
+
* path closes the sink, which drains it, so completion always implies
|
|
261
|
+
* durability.
|
|
262
|
+
*/
|
|
263
|
+
async function flushablePipePerChunk(source, sink, state) {
|
|
161
264
|
const reader = source.getReader();
|
|
162
265
|
const writer = sink.getWriter();
|
|
163
266
|
let cancelReason;
|
|
@@ -167,8 +270,8 @@ export async function flushablePipe(source, sink, state) {
|
|
|
167
270
|
if (state.streamEnded) {
|
|
168
271
|
return;
|
|
169
272
|
}
|
|
170
|
-
// Read from source
|
|
171
|
-
// The important
|
|
273
|
+
// Read from the source. Don't count this as a pending operation because
|
|
274
|
+
// reads wait for data. The important operations are writes to the sink.
|
|
172
275
|
const readResult = await Promise.race([
|
|
173
276
|
reader.read(),
|
|
174
277
|
writer.closed.then(() => {
|
|
@@ -203,6 +306,15 @@ export async function flushablePipe(source, sink, state) {
|
|
|
203
306
|
catch (err) {
|
|
204
307
|
state.streamEnded = true;
|
|
205
308
|
cancelReason = err;
|
|
309
|
+
// Against an early-ack sink, chunks can still be buffered or in flight
|
|
310
|
+
// when the pipe fails (pendingOps only counts un-acked writes). Deliver
|
|
311
|
+
// that accepted prefix before settling the failure: once the state
|
|
312
|
+
// rejects, the step may persist its failure and the invocation finish,
|
|
313
|
+
// and anything still client-side would be lost. The original pipe error
|
|
314
|
+
// stays primary, since a drain failure is already sticky on the sink.
|
|
315
|
+
if (state.drainBarrier) {
|
|
316
|
+
await state.drainBarrier().catch(() => { });
|
|
317
|
+
}
|
|
206
318
|
if (!state.doneResolved) {
|
|
207
319
|
state.doneResolved = true;
|
|
208
320
|
state.reject(err);
|
|
@@ -217,11 +329,11 @@ export async function flushablePipe(source, sink, state) {
|
|
|
217
329
|
finally {
|
|
218
330
|
// Cancel the upstream reader so the source knows to stop generating data.
|
|
219
331
|
// Uses cancelReason (set in the catch block) so the source receives context
|
|
220
|
-
// about why it was
|
|
332
|
+
// about why it was canceled. On normal completion cancelReason is undefined,
|
|
221
333
|
// which is a harmless no-op on an already-done reader.
|
|
222
334
|
reader.cancel(cancelReason).catch(() => { });
|
|
223
335
|
reader.releaseLock();
|
|
224
336
|
writer.releaseLock();
|
|
225
337
|
}
|
|
226
338
|
}
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBNkJ4QyxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU87UUFDTCxHQUFHLGFBQWEsRUFBUTtRQUN4QixVQUFVLEVBQUUsQ0FBQztRQUNiLFlBQVksRUFBRSxLQUFLO1FBQ25CLFdBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQXdCO0lBQzNELElBQUksUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsQyxJQUFJLE1BQStDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNFQUFzRTtRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsZ0VBQWdFO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxRQUF3QjtJQUMzRCxJQUFJLFFBQVEsQ0FBQyxNQUFN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QUMsVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUMxQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRCwrREFBK0Q7UUFDL0QsNEVBQTRFO1FBQzVFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsNkNBQTZDO1FBQzdDLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztZQUFTLENBQUM7UUFDVCwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLDhFQUE4RTtRQUM5RSx1REFBdUQ7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLCB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwg4oCUIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqXG4gKiBTdGF0ZSB0cmFja2VyIGZvciBmbHVzaGFibGUgc3RyZWFtIG9wZXJhdGlvbnMuXG4gKiBSZXNvbHZlcyB3aGVuIGVpdGhlcjpcbiAqIDEuIFN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIExvY2sgaXMgcmVsZWFzZWQgQU5EIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGZsdXNoZWRcbiAqXG4gKiBOb3RlOiBgZG9uZVJlc29sdmVkYCBhbmQgYHN0cmVhbUVuZGVkYCBhcmUgc2VwYXJhdGU6XG4gKiAtIGBkb25lUmVzb2x2ZWRgOiBUaGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKHN0ZXAgY2FuIGNvbXBsZXRlKVxuICogLSBgc3RyZWFtRW5kZWRgOiBUaGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkXG4gKlxuICogT25jZSBgZG9uZVJlc29sdmVkYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBkb25lYCBwcm9taXNlIHdpbGwgbm90IHJlc29sdmVcbiAqIGFnYWluLiBSZS1hY3F1aXJpbmcgbG9ja3MgYWZ0ZXIgcmVsZWFzZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgd2F5IHRvXG4gKiB0cmlnZ2VyIGFkZGl0aW9uYWwgY29tcGxldGlvbiBzaWduYWxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1c2hhYmxlU3RyZWFtU3RhdGUgZXh0ZW5kcyBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiB7XG4gIC8qKiBOdW1iZXIgb2Ygd3JpdGUgb3BlcmF0aW9ucyBjdXJyZW50bHkgaW4gZmxpZ2h0IHRvIHRoZSBzZXJ2ZXIgKi9cbiAgcGVuZGluZ09wczogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKi9cbiAgZG9uZVJlc29sdmVkOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkICovXG4gIHN0cmVhbUVuZGVkOiBib29sZWFuO1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHdyaXRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICB3cml0YWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgLyoqIEludGVydmFsIElEIGZvciByZWFkYWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgcmVhZGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4ud2l0aFJlc29sdmVyczx2b2lkPigpLFxuICAgIHBlbmRpbmdPcHM6IDAsXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgV3JpdGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICogV2hlbiBhIHN0cmVhbSBpcyBjbG9zZWQsIC5sb2NrZWQgaXMgZmFsc2UgYnV0IGdldFdyaXRlcigpIHRocm93cy5cbiAqIFdlIG9ubHkgd2FudCB0byByZXNvbHZlIHZpYSBwb2xsaW5nIHdoZW4gdGhlIHN0cmVhbSBpcyB1bmxvY2tlZCwgbm90IGNsb3NlZC5cbiAqIElmIGNsb3NlZCwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICovXG5mdW5jdGlvbiBpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmICh3cml0YWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd3JpdGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgd3JpdGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRXcml0ZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBSZWFkYWJsZVN0cmVhbSBpcyB1bmxvY2tlZCAodXNlciByZWxlYXNlZCBsb2NrKSB2cyBjbG9zZWQuXG4gKi9cbmZ1bmN0aW9uIGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZTogUmVhZGFibGVTdHJlYW0pOiBib29sZWFuIHtcbiAgaWYgKHJlYWRhYmxlLmxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gYWNxdWlyZSByZWFkZXIgLSBpZiBzdWNjZXNzZnVsLCBzdHJlYW0gaXMgdW5sb2NrZWQgKG5vdCBjbG9zZWQpXG4gICAgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGdldFJlYWRlcigpIHRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkL2Vycm9yZWQgLSBsZXQgcHVtcCBoYW5kbGUgaXRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiByZWxlYXNlTG9jaygpIHRocm93cyBmb3IgYW55IHJlYXNvbiwgY29uc2VydmF0aXZlbHkgdHJlYXQgdGhlXG4gICAgLy8gc3RyZWFtIGFzIGNsb3NlZC9lcnJvcmVkIHNvIGNhbGxlcnMgZG9uJ3QgYXNzdW1lIGl0J3Mgc2FmZSB0byB1c2UuXG4gICAgLy8gVGhlIHB1bXAgd2lsbCBvYnNlcnZlIHRoZSBmYWlsdXJlIHZpYSB0aGUgc3RyZWFtJ3MgZW5kIHN0YXRlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgV3JpdGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFdyaXRhYmxlTG9jayhcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzV3JpdGFibGVVbmxvY2tlZE5vdENsb3NlZCh3cml0YWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIExPQ0tfUE9MTF9JTlRFUlZBTF9NUyk7XG5cbiAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgUmVhZGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFJlYWRhYmxlTG9jayhcbiAgcmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIExPQ0tfUE9MTF9JTlRFUlZBTF9NUyk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHNvdXJjZSAtIGRvbid0IGNvdW50IGFzIHBlbmRpbmcgb3Agc2luY2Ugd2UncmUganVzdCB3YWl0aW5nIGZvciBkYXRhXG4gICAgICAvLyBUaGUgaW1wb3J0YW50IG9wcyBhcmUgd3JpdGVzIHRvIHRoZSBzaW5rIChzZXJ2ZXIpXG4gICAgICBjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgd3JpdGVyLmNsb3NlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZCAoZS5nLiwgZHVlIHRvIGVycm9yIGluIGFub3RoZXIgcGF0aCkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICAgIGlmIChzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWFkUmVzdWx0LmRvbmUpIHtcbiAgICAgICAgLy8gU291cmNlIHN0cmVhbSBjb21wbGV0ZWQgLSBjbG9zZSBzaW5rIGFuZCByZXNvbHZlXG4gICAgICAgIHN0YXRlLnN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgIC8vIFJlc29sdmUgZG9uZSBwcm9taXNlIGlmIG5vdCBhbHJlYWR5IHJlc29sdmVkXG4gICAgICAgIGlmICghc3RhdGUuZG9uZVJlc29sdmVkKSB7XG4gICAgICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB3cml0ZSBhcyBhIHBlbmRpbmcgb3AgLSB0aGlzIGlzIHdoYXQgd2UgbmVlZCB0byBmbHVzaFxuICAgICAgc3RhdGUucGVuZGluZ09wcysrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHJlYWRSZXN1bHQudmFsdWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUucGVuZGluZ09wcy0tO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgIGNhbmNlbFJlYXNvbiA9IGVycjtcbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgZXJyb3IgdGhyb3VnaCBmbHVzaGFibGVQaXBlJ3Mgb3duIHByb21pc2UgYXMgd2VsbC5cbiAgICAvLyBDYWxsZXJzIHRoYXQgcmVseSBvbiB0aGUgRmx1c2hhYmxlU3RyZWFtU3RhdGUgc2hvdWxkIHVzZSBgc3RhdGUucHJvbWlzZWAsXG4gICAgLy8gd2hpbGUgb3RoZXIgY2FsbGVycyBtYXkgZGVwZW5kIG9uIHRoaXMgcmVqZWN0aW9uLiBTb21lIGtub3duIGNhbGxlcnNcbiAgICAvLyBleHBsaWNpdGx5IGlnbm9yZSB0aGlzIHJlamVjdGlvbiAoYC5jYXRjaCgoKSA9PiB7fSlgKSBhbmQgcmVseSBzb2xlbHlcbiAgICAvLyBvbiBgc3RhdGUucmVqZWN0KGVycilgIGZvciBlcnJvciBoYW5kbGluZy5cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2FuY2VsIHRoZSB1cHN0cmVhbSByZWFkZXIgc28gdGhlIHNvdXJjZSBrbm93cyB0byBzdG9wIGdlbmVyYXRpbmcgZGF0YS5cbiAgICAvLyBVc2VzIGNhbmNlbFJlYXNvbiAoc2V0IGluIHRoZSBjYXRjaCBibG9jaykgc28gdGhlIHNvdXJjZSByZWNlaXZlcyBjb250ZXh0XG4gICAgLy8gYWJvdXQgd2h5IGl0IHdhcyBjYW5jZWxsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVNuRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHNDQUFzQyxFQUFFLG9CQUFvQixFQUFFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7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ZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHsgU1RSRUFNX0RSQUlOX1NZTUJPTCB9IGZyb20gJy4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogQSBkdXJhYmlsaXR5IGJhcnJpZXIgYSBzaW5rIG1heSBleHBvc2UgdW5kZXIge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9OlxuICogcmVzb2x2ZXMgb25jZSBldmVyeSBjaHVuayB0aGUgc2luayBoYXMgYWNjZXB0ZWQgaXMgZHVyYWJseSB3cml0dGVuLCByZWplY3RzXG4gKiBpZiBhbnkgc2VydmVyIHdyaXRlIGZhaWxlZC4gU2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYC5cbiAqL1xudHlwZSBEcmFpbkJhcnJpZXIgPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEZsb3ctY29udHJvbCBrbm9iOiB1cHBlciBib3VuZCBvbiBjaHVua3MgcmVhZC1idXQtbm90LXlldC1kdXJhYmx5LXdyaXR0ZW5cbiAqIHdoaWxlIGNvYWxlc2NpbmcuIE9uY2UgdGhpcyBtYW55IGNodW5rcyBhcmUgb3V0c3RhbmRpbmcgdGhlIHByb2R1Y2VyIHN0b3BzXG4gKiByZWFkaW5nIHVudGlsIHRoZSBjb25zdW1lciBkcmFpbnMgYSBiYXRjaCwgc28gYSBmYXN0IHByb2R1Y2VyIHBhaXJlZCB3aXRoIGFcbiAqIHNsb3cgc2VydmVyIGNhbid0IGdyb3cgdGhlIGluLW1lbW9yeSBxdWV1ZSB3aXRob3V0IGJvdW5kLiBPdmVycmlkZTpcbiAqIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2AuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgZGlzdGluY3QgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYmF0Y2ggY2FwcyBiZWxvdzogdGhpc1xuICogYm91bmRzIGhvdyBtdWNoIGlzICpidWZmZXJlZCosIHRob3NlIGJvdW5kIGhvdyBtdWNoIGdvZXMgb3V0IGluIG9uZVxuICogYHdyaXRlTXVsdGlgLiBSYWlzaW5nIHRoaXMgbXVzdCBuZXZlciBsZXQgYSBzaW5nbGUgcmVxdWVzdCBleGNlZWQgYSB3aXJlXG4gKiBsaW1pdCwgc2luY2UgYmF0Y2ggc2l6aW5nIGVuZm9yY2VzIHRoYXQgaW5kZXBlbmRlbnRseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkZMSUdIVF9DSFVOS1MgPSAxMDAwO1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4SW5mbGlnaHRDaHVua3MgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9JTkZMSUdIVF9DSFVOS1MnLCBNQVhfSU5GTElHSFRfQ0hVTktTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFdpcmUgbGltaXQ6IG1heGltdW0gbnVtYmVyIG9mIGNodW5rcyBpbiBhIHNpbmdsZSBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLlxuICogVGhlIHNlcnZlciBlbmZvcmNlcyBhIHBlci1tdWx0aS13cml0ZSBjaHVuayBjYXAgKDEsMDAwIHRvZGF5KTsgYSBiYXRjaCBpc1xuICogc3BsaXQgYXQgdGhpcyBib3VuZCBzbyBpdCBjYW4gbmV2ZXIgYmUgcmVqZWN0ZWQgd2hvbGVzYWxlLCBpbmRlcGVuZGVudGx5IG9mXG4gKiB0aGUgYmFja3ByZXNzdXJlIGtub2IgYWJvdmUuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9DSFVOS1NfUEVSX0JBVENIYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DSFVOS1NfUEVSX0JBVENIID0gMTAwMDtcblxuZXhwb3J0IGNvbnN0IGdldE1heENodW5rc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQ0hVTktTX1BFUl9CQVRDSCcsIE1BWF9DSFVOS1NfUEVSX0JBVENILCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFdpcmUgbGltaXQ6IG1heGltdW0gY3VtdWxhdGl2ZSBieXRlcyBpbiBhIHNpbmdsZSBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLlxuICogQ2h1bmsgKmNvdW50KiBhbG9uZSBpcyBub3QgZW5vdWdoOiAxLDAwMCBzbWFsbCBjaHVua3MgYXJlIH4xMDBLQiBidXQgMSwwMDBcbiAqIGZpbGUtc2l6ZWQgY2h1bmtzIGNhbiBiZSBodW5kcmVkcyBvZiBNQiwgd2hpY2ggcGxhdGZvcm0gcmVxdWVzdC1ib2R5IGxpbWl0c1xuICogcmVqZWN0IGxvbmcgYmVmb3JlIHRoZSBjb3VudCBjYXAgbWF0dGVycy4gQSBiYXRjaCBpcyBzcGxpdCBvbmNlIGFkZGluZyB0aGVcbiAqIG5leHQgY2h1bmsgd291bGQgZXhjZWVkIHRoaXMgKGEgc2luZ2xlIGNodW5rIGxhcmdlciB0aGFuIHRoZSBjYXAgc3RpbGwgZ29lc1xuICogb3V0IGFsb25lKS4gRGVmYXVsdCAxIE1pQi4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0JZVEVTX1BFUl9CQVRDSGAuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQllURVNfUEVSX0JBVENIID0gMTAyNCAqIDEwMjQ7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhCeXRlc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIJywgTUFYX0JZVEVTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBCdWZmZXIgYm91bmQgKGJ5dGVzKSBmb3IgdGhlIHNlcnZlciB3cml0YWJsZSdzIGdyb3VwLWNvbW1pdCBidWZmZXIsIHRoZVxuICogYnl0ZS1kZW5vbWluYXRlZCBjb3VudGVycGFydCBvZiB7QGxpbmsgTUFYX0lORkxJR0hUX0NIVU5LU30uIGB3cml0ZSgpYFxuICogYmxvY2tzIG9uY2UgdGhpcyBtdWNoIGRhdGEgaXMgYnVmZmVyZWQtYnV0LW5vdC1kdXJhYmxlLCBzbyBhIGZhc3QgcHJvZHVjZXJcbiAqIG9mIGxhcmdlIGNodW5rcyBjYW4ndCBncm93IGNsaWVudCBtZW1vcnkgd2l0aG91dCBib3VuZC4gRGVmYXVsdCA4IE1pQlxuICogKGVpZ2h0IHJlcXVlc3Qtc2l6ZWQgZ3JvdXBzKS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0JVRkZFUkVEX0JZVEVTYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CVUZGRVJFRF9CWVRFUyA9IDggKiAxMDI0ICogMTAyNDtcblxuZXhwb3J0IGNvbnN0IGdldE1heEJ1ZmZlcmVkQnl0ZXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9CVUZGRVJFRF9CWVRFUycsIE1BWF9CVUZGRVJFRF9CWVRFUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwsIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqIEVmZmVjdGl2ZSBsb2NrLXBvbGwgaW50ZXJ2YWwuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TYC4gKi9cbmNvbnN0IGdldExvY2tQb2xsSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVMnLCBMT0NLX1BPTExfSU5URVJWQUxfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogU3RhdGUgdHJhY2tlciBmb3IgZmx1c2hhYmxlIHN0cmVhbSBvcGVyYXRpb25zLlxuICogUmVzb2x2ZXMgd2hlbiBlaXRoZXI6XG4gKiAxLiBTdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBMb2NrIGlzIHJlbGVhc2VkIEFORCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBmbHVzaGVkXG4gKlxuICogTm90ZTogYGRvbmVSZXNvbHZlZGAgYW5kIGBzdHJlYW1FbmRlZGAgYXJlIHNlcGFyYXRlOlxuICogLSBgZG9uZVJlc29sdmVkYDogVGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkIChzdGVwIGNhbiBjb21wbGV0ZSlcbiAqIC0gYHN0cmVhbUVuZGVkYDogVGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZFxuICpcbiAqIE9uY2UgYGRvbmVSZXNvbHZlZGAgaXMgc2V0IHRvIHRydWUsIHRoZSBgZG9uZWAgcHJvbWlzZSB3aWxsIG5vdCByZXNvbHZlXG4gKiBhZ2Fpbi4gUmUtYWNxdWlyaW5nIGxvY2tzIGFmdGVyIHJlbGVhc2UgaXMgbm90IHN1cHBvcnRlZCBhcyBhIHdheSB0b1xuICogdHJpZ2dlciBhZGRpdGlvbmFsIGNvbXBsZXRpb24gc2lnbmFsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIGV4dGVuZHMgUHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4ge1xuICAvKiogTnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgY3VycmVudGx5IGluIGZsaWdodCB0byB0aGUgc2VydmVyICovXG4gIHBlbmRpbmdPcHM6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkICovXG4gIGRvbmVSZXNvbHZlZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZCAqL1xuICBzdHJlYW1FbmRlZDogYm9vbGVhbjtcbiAgLyoqIEludGVydmFsIElEIGZvciB3cml0YWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgd3JpdGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3IgcmVhZGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHJlYWRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICAvKipcbiAgICogRHVyYWJpbGl0eSBiYXJyaWVyIG9mIHRoZSBwaXBlJ3Mgc2luaywgd2hlbiBpdCBhY2tzIHdyaXRlcyBvbiBidWZmZXJcbiAgICogZW50cnkgKHNlZSB7QGxpbmsgU1RSRUFNX0RSQUlOX1NZTUJPTH0pLiBMb2NrLXJlbGVhc2UgY29tcGxldGlvbiBhd2FpdHNcbiAgICogdGhpcyBiZWZvcmUgcmVzb2x2aW5nIHNvIGBwZW5kaW5nT3BzID09PSAwYCAoZmFzdCwgYnVmZmVyZWQgYWNrcykgY2FuJ3RcbiAgICogY29tcGxldGUgYSBzdGVwIHdoaWxlIGRhdGEgaXMgc3RpbGwgY2xpZW50LXNpZGUuXG4gICAqL1xuICBkcmFpbkJhcnJpZXI/OiBEcmFpbkJhcnJpZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSB7XG4gIGNvbnN0IHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSA9IHtcbiAgICAuLi53aXRoUmVzb2x2ZXJzPHZvaWQ+KCksXG4gICAgcGVuZGluZ09wczogMCxcbiAgICBkb25lUmVzb2x2ZWQ6IGZhbHNlLFxuICAgIHN0cmVhbUVuZGVkOiBmYWxzZSxcbiAgfTtcblxuICAvLyBUaGUgcnVudGltZSBhd2FpdHMgdGhpcyBwcm9taXNlIGFmdGVyIHVzZXIgY29kZSByZXR1cm5zLiBPYnNlcnZlIGVhcmx5XG4gIC8vIHN0cmVhbSBmYWlsdXJlcyBub3cgc28gdGhleSBkbyBub3QgYmVjb21lIHVuaGFuZGxlZCByZWplY3Rpb25zIGZpcnN0LlxuICBzdGF0ZS5wcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgV3JpdGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICogV2hlbiBhIHN0cmVhbSBpcyBjbG9zZWQsIC5sb2NrZWQgaXMgZmFsc2UgYnV0IGdldFdyaXRlcigpIHRocm93cy5cbiAqIFdlIG9ubHkgd2FudCB0byByZXNvbHZlIHZpYSBwb2xsaW5nIHdoZW4gdGhlIHN0cmVhbSBpcyB1bmxvY2tlZCwgbm90IGNsb3NlZC5cbiAqIElmIGNsb3NlZCwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICovXG5mdW5jdGlvbiBpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmICh3cml0YWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd3JpdGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgd3JpdGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRXcml0ZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBSZWFkYWJsZVN0cmVhbSBpcyB1bmxvY2tlZCAodXNlciByZWxlYXNlZCBsb2NrKSB2cyBjbG9zZWQuXG4gKi9cbmZ1bmN0aW9uIGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZTogUmVhZGFibGVTdHJlYW0pOiBib29sZWFuIHtcbiAgaWYgKHJlYWRhYmxlLmxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gYWNxdWlyZSByZWFkZXIgLSBpZiBzdWNjZXNzZnVsLCBzdHJlYW0gaXMgdW5sb2NrZWQgKG5vdCBjbG9zZWQpXG4gICAgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGdldFJlYWRlcigpIHRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkL2Vycm9yZWQgLSBsZXQgcHVtcCBoYW5kbGUgaXRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiByZWxlYXNlTG9jaygpIHRocm93cyBmb3IgYW55IHJlYXNvbiwgY29uc2VydmF0aXZlbHkgdHJlYXQgdGhlXG4gICAgLy8gc3RyZWFtIGFzIGNsb3NlZC9lcnJvcmVkIHNvIGNhbGxlcnMgZG9uJ3QgYXNzdW1lIGl0J3Mgc2FmZSB0byB1c2UuXG4gICAgLy8gVGhlIHB1bXAgd2lsbCBvYnNlcnZlIHRoZSBmYWlsdXJlIHZpYSB0aGUgc3RyZWFtJ3MgZW5kIHN0YXRlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNldHRsZSB0aGUgZmx1c2hhYmxlIGNvbXBsZXRpb24gYWZ0ZXIgdGhlIHNpbmsncyBkdXJhYmlsaXR5IGJhcnJpZXIuXG4gKlxuICogTG9jayByZWxlYXNlIG1lYW5zIHRoZSBwcm9kdWNlciBpcyBkb25lICp3cml0aW5nKjsgd2l0aCBhIGdyb3VwLWNvbW1pdFxuICogc2luaywgYWNjZXB0ZWQgY2h1bmtzIG1heSBzdGlsbCBiZSBjbGllbnQtYnVmZmVyZWQgb3IgaW4gYSByZXF1ZXN0IHRoYXQgaXNcbiAqIGluIGZsaWdodC4gQXdhaXRpbmcgdGhlIGJhcnJpZXIgaGVyZSBrZWVwcyB0aGUgY29tcGxldGlvbidzIG1lYW5pbmdcbiAqIChcImV2ZXJ5dGhpbmcgd3JpdHRlbiBzbyBmYXIgaXMgZHVyYWJsZVwiKSBpZGVudGljYWwgdG8gdGhlIHByZS1iYXRjaGluZ1xuICogYmVoYXZpb3Igd2hlcmUgZWFjaCB3cml0ZSgpIHdhcyBpbmRpdmlkdWFsbHkgZHVyYWJsZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlKTogdm9pZCB7XG4gIGNvbnN0IGJhcnJpZXIgPSBzdGF0ZS5kcmFpbkJhcnJpZXI7XG4gIGlmICghYmFycmllcikge1xuICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFycmllcigpLnRoZW4oXG4gICAgKCkgPT4gc3RhdGUucmVzb2x2ZSgpLFxuICAgIChlcnIpID0+IHN0YXRlLnJlamVjdChlcnIpXG4gICk7XG59XG5cbi8qKlxuICogUG9sbHMgYSBXcml0YWJsZVN0cmVhbSB0byBjaGVjayBpZiB0aGUgdXNlciBoYXMgcmVsZWFzZWQgdGhlaXIgbG9jay5cbiAqIFJlc29sdmVzIHRoZSBkb25lIHByb21pc2Ugd2hlbiBsb2NrIGlzIHJlbGVhc2VkIGFuZCBubyBwZW5kaW5nIG9wcyByZW1haW4uXG4gKlxuICogTm90ZTogT25seSByZXNvbHZlcyBpZiBzdHJlYW0gaXMgdW5sb2NrZWQgYnV0IE5PVCBjbG9zZWQuIElmIHRoZSB1c2VyIGNsb3Nlc1xuICogdGhlIHN0cmVhbSwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICpcbiAqIFByb3RlY3Rpb246IElmIHBvbGxpbmcgaXMgYWxyZWFkeSBhY3RpdmUgb24gdGhpcyBzdGF0ZSwgdGhlIGV4aXN0aW5nIGludGVydmFsXG4gKiBpcyB1c2VkIHRvIGF2b2lkIGNyZWF0aW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsV3JpdGFibGVMb2NrKFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogdm9pZCB7XG4gIC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb24gdGhlIHNhbWUgc3RhdGVcbiAgaWYgKHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vIFN0b3AgcG9sbGluZyBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIHN0cmVhbSBlbmRlZFxuICAgIGlmIChzdGF0ZS5kb25lUmVzb2x2ZWQgfHwgc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGUpO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFJlYWRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxSZWFkYWJsZUxvY2soXG4gIHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlQWZ0ZXJEcmFpbihzdGF0ZSk7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCYXRjaGluZyBsaXZlcyBpbiB0aGUgc2luayAoYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gIGdyb3VwLWNvbW1pdHNcbiAgLy8gaXRzIGJ1ZmZlciksIHNvIHRoaXMgcGlwZSBpcyBhIHBsYWluIHBlci1jaHVuayBwdW1wIHJlZ2FyZGxlc3Mgb2YgcGF0aDpcbiAgLy8gaXRzIG9ubHkgcmVzcG9uc2liaWxpdGllcyBhcmUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYW5kIGR1cmFiaWxpdHlcbiAgLy8gdHJhY2tpbmcuIEdyb3VwLWNvbW1pdCBzaW5rcyBhY2sgd3JpdGUoKSBvbiBidWZmZXIgZW50cnk7IGFkb3B0IHRoZWlyXG4gIC8vIGR1cmFiaWxpdHkgYmFycmllciBzbyB0aGUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gc3RpbGwgbWVhbnNcbiAgLy8gXCJldmVyeXRoaW5nIHdyaXR0ZW4gaXMgZHVyYWJsZVwiIChzZWUgcmVzb2x2ZUFmdGVyRHJhaW4pLlxuICBjb25zdCBkcmFpbiA9IChzaW5rIGFzIHsgW1NUUkVBTV9EUkFJTl9TWU1CT0xdPzogRHJhaW5CYXJyaWVyIH0pW1xuICAgIFNUUkVBTV9EUkFJTl9TWU1CT0xcbiAgXTtcbiAgaWYgKHR5cGVvZiBkcmFpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlLmRyYWluQmFycmllciA9IGRyYWluO1xuICB9XG4gIHJldHVybiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoc291cmNlLCBzaW5rLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogVGhlIHB1bXAgYmVoaW5kIHtAbGluayBmbHVzaGFibGVQaXBlfTogYXdhaXRzIGVhY2ggYHdyaXRlci53cml0ZSgpYCBiZWZvcmVcbiAqIHJlYWRpbmcgdGhlIG5leHQgY2h1bmsuIEFnYWluc3QgYSBncm91cC1jb21taXQgc2luaywgd3JpdGUoKSBhY2tzIG9uIGJ1ZmZlclxuICogZW50cnksIHNvIHRoaXMgbG9vcCBmZWVkcyB0aGUgc2luayBhcyBmYXN0IGFzIHRoZSBwcm9kdWNlciBlbWl0cyAoYm91bmRlZFxuICogYnkgdGhlIHNpbmsncyBidWZmZXIgYm91bmQpIGFuZCBiYXRjaGluZyBoYXBwZW5zIGluc2lkZSB0aGUgc2luazsgYWdhaW5zdCBhXG4gKiBwbGFpbiBzaW5rIGVhY2ggd3JpdGUgaXMgaW5kaXZpZHVhbGx5IGR1cmFibGUsIGFzIGJlZm9yZS4gVGhlIHNvdXJjZS1kb25lXG4gKiBwYXRoIGNsb3NlcyB0aGUgc2luaywgd2hpY2ggZHJhaW5zIGl0LCBzbyBjb21wbGV0aW9uIGFsd2F5cyBpbXBsaWVzXG4gKiBkdXJhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb3VyY2UuIERvbid0IGNvdW50IHRoaXMgYXMgYSBwZW5kaW5nIG9wZXJhdGlvbiBiZWNhdXNlXG4gICAgICAvLyByZWFkcyB3YWl0IGZvciBkYXRhLiBUaGUgaW1wb3J0YW50IG9wZXJhdGlvbnMgYXJlIHdyaXRlcyB0byB0aGUgc2luay5cbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nT3BzLS07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIC8vIEFnYWluc3QgYW4gZWFybHktYWNrIHNpbmssIGNodW5rcyBjYW4gc3RpbGwgYmUgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0XG4gICAgLy8gd2hlbiB0aGUgcGlwZSBmYWlscyAocGVuZGluZ09wcyBvbmx5IGNvdW50cyB1bi1hY2tlZCB3cml0ZXMpLiBEZWxpdmVyXG4gICAgLy8gdGhhdCBhY2NlcHRlZCBwcmVmaXggYmVmb3JlIHNldHRsaW5nIHRoZSBmYWlsdXJlOiBvbmNlIHRoZSBzdGF0ZVxuICAgIC8vIHJlamVjdHMsIHRoZSBzdGVwIG1heSBwZXJzaXN0IGl0cyBmYWlsdXJlIGFuZCB0aGUgaW52b2NhdGlvbiBmaW5pc2gsXG4gICAgLy8gYW5kIGFueXRoaW5nIHN0aWxsIGNsaWVudC1zaWRlIHdvdWxkIGJlIGxvc3QuIFRoZSBvcmlnaW5hbCBwaXBlIGVycm9yXG4gICAgLy8gc3RheXMgcHJpbWFyeSwgc2luY2UgYSBkcmFpbiBmYWlsdXJlIGlzIGFscmVhZHkgc3RpY2t5IG9uIHRoZSBzaW5rLlxuICAgIGlmIChzdGF0ZS5kcmFpbkJhcnJpZXIpIHtcbiAgICAgIGF3YWl0IHN0YXRlLmRyYWluQmFycmllcigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIGVycm9yIHRocm91Z2ggZmx1c2hhYmxlUGlwZSdzIG93biBwcm9taXNlIGFzIHdlbGwuXG4gICAgLy8gQ2FsbGVycyB0aGF0IHJlbHkgb24gdGhlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIHNob3VsZCB1c2UgYHN0YXRlLnByb21pc2VgLFxuICAgIC8vIHdoaWxlIG90aGVyIGNhbGxlcnMgbWF5IGRlcGVuZCBvbiB0aGlzIHJlamVjdGlvbi4gU29tZSBrbm93biBjYWxsZXJzXG4gICAgLy8gZXhwbGljaXRseSBpZ25vcmUgdGhpcyByZWplY3Rpb24gKGAuY2F0Y2goKCkgPT4ge30pYCkgYW5kIHJlbHkgc29sZWx5XG4gICAgLy8gb24gYHN0YXRlLnJlamVjdChlcnIpYCBmb3IgZXJyb3IgaGFuZGxpbmcuXG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENhbmNlbCB0aGUgdXBzdHJlYW0gcmVhZGVyIHNvIHRoZSBzb3VyY2Uga25vd3MgdG8gc3RvcCBnZW5lcmF0aW5nIGRhdGEuXG4gICAgLy8gVXNlcyBjYW5jZWxSZWFzb24gKHNldCBpbiB0aGUgY2F0Y2ggYmxvY2spIHNvIHRoZSBzb3VyY2UgcmVjZWl2ZXMgY29udGV4dFxuICAgIC8vIGFib3V0IHdoeSBpdCB3YXMgY2FuY2VsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/global.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AttributeChange } from '@workflow/world';
|
|
1
2
|
import type { Serializable } from './schemas.js';
|
|
2
3
|
export interface StepInvocationQueueItem {
|
|
3
4
|
type: 'step';
|
|
@@ -7,13 +8,37 @@ export interface StepInvocationQueueItem {
|
|
|
7
8
|
closureVars?: Record<string, Serializable>;
|
|
8
9
|
thisVal?: Serializable;
|
|
9
10
|
hasCreatedEvent?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Inline step ownership, derived from the step's LATEST `step_started`
|
|
13
|
+
* during replay: the queue message ID stamped by the invocation running
|
|
14
|
+
* the step inline, or undefined when the latest start was unstamped (a
|
|
15
|
+
* retry attempt driven by a queued step message, or an older runtime).
|
|
16
|
+
* Latest start wins: an unstamped bare start clears a previous stamp; an
|
|
17
|
+
* owner-recovery re-stamped start restores it.
|
|
18
|
+
*/
|
|
19
|
+
ownerMessageId?: string;
|
|
20
|
+
/**
|
|
21
|
+
* `createdAt` (ms) of the step's latest observed `step_started`. Anchors
|
|
22
|
+
* the ownership lease: `leaseRemaining = lastStartedAt + lease − now`.
|
|
23
|
+
*/
|
|
24
|
+
lastStartedAt?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Whether a `step_retrying` was observed for this step. From that point
|
|
27
|
+
* the step is queue-owned (the delayed retry handoff or replay requeue),
|
|
28
|
+
* so inline ownership is permanently lapsed for this correlation ID.
|
|
29
|
+
*/
|
|
30
|
+
sawRetrying?: boolean;
|
|
10
31
|
}
|
|
11
32
|
export interface HookInvocationQueueItem {
|
|
12
33
|
type: 'hook';
|
|
13
34
|
correlationId: string;
|
|
14
35
|
token: string;
|
|
36
|
+
/** Earliest time the token can be reused after the run ends. */
|
|
37
|
+
tokenRetentionUntil?: Date;
|
|
15
38
|
metadata?: Serializable;
|
|
16
39
|
hasCreatedEvent?: boolean;
|
|
40
|
+
/** Whether the workflow is awaiting `hook.getConflict()` for this hook */
|
|
41
|
+
hasConflictAwaiter?: boolean;
|
|
17
42
|
disposed?: boolean;
|
|
18
43
|
isWebhook?: boolean;
|
|
19
44
|
isSystem?: boolean;
|
|
@@ -26,7 +51,13 @@ export interface WaitInvocationQueueItem {
|
|
|
26
51
|
resumeAt: Date;
|
|
27
52
|
hasCreatedEvent?: boolean;
|
|
28
53
|
}
|
|
29
|
-
export
|
|
54
|
+
export interface AttributeInvocationQueueItem {
|
|
55
|
+
type: 'attribute';
|
|
56
|
+
correlationId: string;
|
|
57
|
+
changes: AttributeChange[];
|
|
58
|
+
allowReservedAttributes?: true;
|
|
59
|
+
}
|
|
60
|
+
export type QueueItem = StepInvocationQueueItem | HookInvocationQueueItem | WaitInvocationQueueItem | AttributeInvocationQueueItem;
|
|
30
61
|
/**
|
|
31
62
|
* An error that is thrown when one or more operations (steps/hooks/etc.) are called but do
|
|
32
63
|
* not yet have corresponding entries in the event log. The workflow
|
|
@@ -34,14 +65,17 @@ export type QueueItem = StepInvocationQueueItem | HookInvocationQueueItem | Wait
|
|
|
34
65
|
* onto the queue.
|
|
35
66
|
*/
|
|
36
67
|
export declare class WorkflowSuspension extends Error {
|
|
68
|
+
items: QueueItem[];
|
|
69
|
+
/** @deprecated Use `items` instead. */
|
|
37
70
|
steps: QueueItem[];
|
|
38
71
|
globalThis: typeof globalThis;
|
|
39
72
|
stepCount: number;
|
|
40
73
|
hookCount: number;
|
|
41
74
|
waitCount: number;
|
|
75
|
+
attributeCount: number;
|
|
42
76
|
hookDisposedCount: number;
|
|
43
77
|
abortCount: number;
|
|
44
|
-
constructor(
|
|
78
|
+
constructor(itemsInput: Map<string, QueueItem>, global: typeof globalThis);
|
|
45
79
|
static is(value: unknown): value is WorkflowSuspension;
|
|
46
80
|
}
|
|
47
81
|
export declare function ENOTSUP(): never;
|
package/dist/global.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,SAAS,GACjB,uBAAuB,GACvB,uBAAuB,GACvB,uBAAuB,GACvB,4BAA4B,CAAC;AAEjC;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,uCAAuC;IACvC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;gBAEP,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,UAAU;IAwFzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAGvD;AAED,wBAAgB,OAAO,IAAI,KAAK,CAI/B"}
|
package/dist/global.js
CHANGED
|
@@ -7,23 +7,27 @@ import { pluralize } from '@workflow/utils';
|
|
|
7
7
|
* onto the queue.
|
|
8
8
|
*/
|
|
9
9
|
export class WorkflowSuspension extends Error {
|
|
10
|
+
items;
|
|
11
|
+
/** @deprecated Use `items` instead. */
|
|
10
12
|
steps;
|
|
11
13
|
globalThis;
|
|
12
14
|
stepCount;
|
|
13
15
|
hookCount;
|
|
14
16
|
waitCount;
|
|
17
|
+
attributeCount;
|
|
15
18
|
hookDisposedCount;
|
|
16
19
|
abortCount;
|
|
17
|
-
constructor(
|
|
20
|
+
constructor(itemsInput, global) {
|
|
18
21
|
// Convert Map to array for iteration and storage
|
|
19
|
-
const
|
|
22
|
+
const items = [...itemsInput.values()];
|
|
20
23
|
// Single-pass counting for efficiency
|
|
21
24
|
let stepCount = 0;
|
|
22
25
|
let hookCount = 0;
|
|
23
26
|
let waitCount = 0;
|
|
27
|
+
let attributeCount = 0;
|
|
24
28
|
let hookDisposedCount = 0;
|
|
25
29
|
let abortCount = 0;
|
|
26
|
-
for (const item of
|
|
30
|
+
for (const item of items) {
|
|
27
31
|
if (item.type === 'step')
|
|
28
32
|
stepCount++;
|
|
29
33
|
else if (item.type === 'hook') {
|
|
@@ -36,6 +40,8 @@ export class WorkflowSuspension extends Error {
|
|
|
36
40
|
}
|
|
37
41
|
else if (item.type === 'wait')
|
|
38
42
|
waitCount++;
|
|
43
|
+
else if (item.type === 'attribute')
|
|
44
|
+
attributeCount++;
|
|
39
45
|
}
|
|
40
46
|
// Build description parts
|
|
41
47
|
const parts = [];
|
|
@@ -48,16 +54,20 @@ export class WorkflowSuspension extends Error {
|
|
|
48
54
|
if (waitCount > 0) {
|
|
49
55
|
parts.push(`${waitCount} ${pluralize('wait', 'waits', waitCount)}`);
|
|
50
56
|
}
|
|
57
|
+
if (attributeCount > 0) {
|
|
58
|
+
parts.push(`${attributeCount} ${pluralize('attribute write', 'attribute writes', attributeCount)}`);
|
|
59
|
+
}
|
|
51
60
|
if (hookDisposedCount > 0) {
|
|
52
61
|
parts.push(`${hookDisposedCount} hook ${pluralize('disposal', 'disposals', hookDisposedCount)}`);
|
|
53
62
|
}
|
|
54
63
|
// Determine verb (has/have) and action (run/created/received)
|
|
55
|
-
const totalCount = stepCount + hookCount + waitCount + hookDisposedCount;
|
|
64
|
+
const totalCount = stepCount + hookCount + waitCount + attributeCount + hookDisposedCount;
|
|
56
65
|
const hasOrHave = pluralize('has', 'have', totalCount);
|
|
57
66
|
// Pick action verb: use "processed" when mixed types are present
|
|
58
67
|
const typeCount = (stepCount > 0 ? 1 : 0) +
|
|
59
68
|
(hookCount > 0 ? 1 : 0) +
|
|
60
69
|
(waitCount > 0 ? 1 : 0) +
|
|
70
|
+
(attributeCount > 0 ? 1 : 0) +
|
|
61
71
|
(hookDisposedCount > 0 ? 1 : 0);
|
|
62
72
|
let action;
|
|
63
73
|
if (typeCount > 1) {
|
|
@@ -72,6 +82,9 @@ export class WorkflowSuspension extends Error {
|
|
|
72
82
|
else if (waitCount > 0) {
|
|
73
83
|
action = 'created';
|
|
74
84
|
}
|
|
85
|
+
else if (attributeCount > 0) {
|
|
86
|
+
action = 'written';
|
|
87
|
+
}
|
|
75
88
|
else if (hookDisposedCount > 0) {
|
|
76
89
|
action = 'processed';
|
|
77
90
|
}
|
|
@@ -83,11 +96,13 @@ export class WorkflowSuspension extends Error {
|
|
|
83
96
|
: '0 steps have not been run yet'; // Default case for empty array
|
|
84
97
|
super(description);
|
|
85
98
|
this.name = 'WorkflowSuspension';
|
|
86
|
-
this.
|
|
99
|
+
this.items = items;
|
|
100
|
+
this.steps = items;
|
|
87
101
|
this.globalThis = global;
|
|
88
102
|
this.stepCount = stepCount;
|
|
89
103
|
this.hookCount = hookCount;
|
|
90
104
|
this.waitCount = waitCount;
|
|
105
|
+
this.attributeCount = attributeCount;
|
|
91
106
|
this.hookDisposedCount = hookDisposedCount;
|
|
92
107
|
this.abortCount = abortCount;
|
|
93
108
|
}
|
|
@@ -98,4 +113,4 @@ export class WorkflowSuspension extends Error {
|
|
|
98
113
|
export function ENOTSUP() {
|
|
99
114
|
throw new WorkflowRuntimeError('This API is not available inside a workflow function. Workflow functions run in a deterministic VM; move the call to a step function for full Node.js access.');
|
|
100
115
|
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFzQzVDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsS0FBSyxDQUFjO0lBQ25CLFVBQVUsQ0FBb0I7SUFDOUIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixTQUFTLENBQVM7SUFDbEIsaUJBQWlCLENBQVM7SUFDMUIsVUFBVSxDQUFTO0lBRW5CLFlBQVksVUFBa0MsRUFBRSxNQUF5QjtRQUN2RSxpREFBaUQ7UUFDakQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXZDLHNDQUFzQztRQUN0QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFBRSxTQUFTLEVBQUUsQ0FBQztpQkFDakMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLGlCQUFpQixFQUFFLENBQUM7cUJBQ2xDLElBQUksSUFBSSxDQUFDLGNBQWM7b0JBQUUsVUFBVSxFQUFFLENBQUM7O29CQUN0QyxTQUFTLEVBQUUsQ0FBQztZQUNuQixDQUFD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LENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWM7UUFDdEIsT0FBTyxLQUFLLFlBQVksa0JBQWtCLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLE9BQU87SUFDckIsTUFBTSxJQUFJLG9CQUFvQixDQUM1QiwrSkFBK0osQ0FDaEssQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zY2hlbWFzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSB7XG4gIHR5cGU6ICdzdGVwJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBhcmdzOiBTZXJpYWxpemFibGVbXTtcbiAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemFibGU+O1xuICB0aGlzVmFsPzogU2VyaWFsaXphYmxlO1xuICBoYXNDcmVhdGVkRXZlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ2hvb2snO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogU2VyaWFsaXphYmxlO1xuICBoYXNDcmVhdGVkRXZlbnQ/OiBib29sZWFuO1xuICBkaXNwb3NlZD86IGJvb2xlYW47XG4gIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgYWJvcnRSZXF1ZXN0ZWQ/OiBib29sZWFuO1xuICBhYm9ydFJlYXNvbj86IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0ge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgcmVzdW1lQXQ6IERhdGU7XG4gIGhhc0NyZWF0ZWRFdmVudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXVlSXRlbSA9XG4gIHwgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1cbiAgfCBIb29rSW52b2NhdGlvblF1ZXVlSXRlbVxuICB8IFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtO1xuXG4vKipcbiAqIEFuIGVycm9yIHRoYXQgaXMgdGhyb3duIHdoZW4gb25lIG9yIG1vcmUgb3BlcmF0aW9ucyAoc3RlcHMvaG9va3MvZXRjLikgYXJlIGNhbGxlZCBidXQgZG9cbiAqIG5vdCB5ZXQgaGF2ZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGV2ZW50IGxvZy4gVGhlIHdvcmtmbG93XG4gKiBkaXNwYXRjaGVyIHdpbGwgY2F0Y2ggdGhpcyBlcnJvciBhbmQgcHVzaCB0aGUgb3BlcmF0aW9uc1xuICogb250byB0aGUgcXVldWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1N1c3BlbnNpb24gZXh0ZW5kcyBFcnJvciB7XG4gIHN0ZXBzOiBRdWV1ZUl0ZW1bXTtcbiAgZ2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXM7XG4gIHN0ZXBDb3VudDogbnVtYmVyO1xuICBob29rQ291bnQ6IG51bWJlcjtcbiAgd2FpdENvdW50OiBudW1iZXI7XG4gIGhvb2tEaXNwb3NlZENvdW50OiBudW1iZXI7XG4gIGFib3J0Q291bnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzdGVwc0lucHV0OiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+LCBnbG9iYWw6IHR5cGVvZiBnbG9iYWxUaGlzKSB7XG4gICAgLy8gQ29udmVydCBNYXAgdG8gYXJyYXkgZm9yIGl0ZXJhdGlvbiBhbmQgc3RvcmFnZVxuICAgIGNvbnN0IHN0ZXBzID0gWy4uLnN0ZXBzSW5wdXQudmFsdWVzKCldO1xuXG4gICAgLy8gU2luZ2xlLXBhc3MgY291bnRpbmcgZm9yIGVmZmljaWVuY3lcbiAgICBsZXQgc3RlcENvdW50ID0gMDtcbiAgICBsZXQgaG9va0NvdW50ID0gMDtcbiAgICBsZXQgd2FpdENvdW50ID0gMDtcbiAgICBsZXQgaG9va0Rpc3Bvc2VkQ291bnQgPSAwO1xuICAgIGxldCBhYm9ydENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3RlcHMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdzdGVwJykgc3RlcENvdW50Kys7XG4gICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICBpZiAoaXRlbS5kaXNwb3NlZCkgaG9va0Rpc3Bvc2VkQ291bnQrKztcbiAgICAgICAgZWxzZSBpZiAoaXRlbS5hYm9ydFJlcXVlc3RlZCkgYWJvcnRDb3VudCsrO1xuICAgICAgICBlbHNlIGhvb2tDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICd3YWl0Jykgd2FpdENvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZGVzY3JpcHRpb24gcGFydHNcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoc3RlcENvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHtzdGVwQ291bnR9ICR7cGx1cmFsaXplKCdzdGVwJywgJ3N0ZXBzJywgc3RlcENvdW50KX1gKTtcbiAgICB9XG4gICAgaWYgKGhvb2tDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7aG9va0NvdW50fSAke3BsdXJhbGl6ZSgnaG9vaycsICdob29rcycsIGhvb2tDb3VudCl9YCk7XG4gICAgfVxuICAgIGlmICh3YWl0Q291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3dhaXRDb3VudH0gJHtwbHVyYWxpemUoJ3dhaXQnLCAnd2FpdHMnLCB3YWl0Q291bnQpfWApO1xuICAgIH1cbiAgICBpZiAoaG9va0Rpc3Bvc2VkQ291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKFxuICAgICAgICBgJHtob29rRGlzcG9zZWRDb3VudH0gaG9vayAke3BsdXJhbGl6ZSgnZGlzcG9zYWwnLCAnZGlzcG9zYWxzJywgaG9va0Rpc3Bvc2VkQ291bnQpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHZlcmIgKGhhcy9oYXZlKSBhbmQgYWN0aW9uIChydW4vY3JlYXRlZC9yZWNlaXZlZClcbiAgICBjb25zdCB0b3RhbENvdW50ID0gc3RlcENvdW50ICsgaG9va0NvdW50ICsgd2FpdENvdW50ICsgaG9va0Rpc3Bvc2VkQ291bnQ7XG4gICAgY29uc3QgaGFzT3JIYXZlID0gcGx1cmFsaXplKCdoYXMnLCAnaGF2ZScsIHRvdGFsQ291bnQpO1xuICAgIC8vIFBpY2sgYWN0aW9uIHZlcmI6IHVzZSBcInByb2Nlc3NlZFwiIHdoZW4gbWl4ZWQgdHlwZXMgYXJlIHByZXNlbnRcbiAgICBjb25zdCB0eXBlQ291bnQgPVxuICAgICAgKHN0ZXBDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGhvb2tDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKHdhaXRDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGhvb2tEaXNwb3NlZENvdW50ID4gMCA/IDEgOiAwKTtcbiAgICBsZXQgYWN0aW9uOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVDb3VudCA+IDEpIHtcbiAgICAgIGFjdGlvbiA9ICdwcm9jZXNzZWQnO1xuICAgIH0gZWxzZSBpZiAoc3RlcENvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3J1bic7XG4gICAgfSBlbHNlIGlmIChob29rQ291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmICh3YWl0Q291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmIChob29rRGlzcG9zZWRDb3VudCA+IDApIHtcbiAgICAgIGFjdGlvbiA9ICdwcm9jZXNzZWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3Rpb24gPSAncmVjZWl2ZWQnO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID1cbiAgICAgIHBhcnRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgJHtwYXJ0cy5qb2luKCcgYW5kICcpfSAke2hhc09ySGF2ZX0gbm90IGJlZW4gJHthY3Rpb259IHlldGBcbiAgICAgICAgOiAnMCBzdGVwcyBoYXZlIG5vdCBiZWVuIHJ1biB5ZXQnOyAvLyBEZWZhdWx0IGNhc2UgZm9yIGVtcHR5IGFycmF5XG4gICAgc3VwZXIoZGVzY3JpcHRpb24pO1xuICAgIHRoaXMubmFtZSA9ICdXb3JrZmxvd1N1c3BlbnNpb24nO1xuICAgIHRoaXMuc3RlcHMgPSBzdGVwcztcbiAgICB0aGlzLmdsb2JhbFRoaXMgPSBnbG9iYWw7XG4gICAgdGhpcy5zdGVwQ291bnQgPSBzdGVwQ291bnQ7XG4gICAgdGhpcy5ob29rQ291bnQgPSBob29rQ291bnQ7XG4gICAgdGhpcy53YWl0Q291bnQgPSB3YWl0Q291bnQ7XG4gICAgdGhpcy5ob29rRGlzcG9zZWRDb3VudCA9IGhvb2tEaXNwb3NlZENvdW50O1xuICAgIHRoaXMuYWJvcnRDb3VudCA9IGFib3J0Q291bnQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1N1c3BlbnNpb24ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRU5PVFNVUCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAnVGhpcyBBUEkgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbi4gV29ya2Zsb3cgZnVuY3Rpb25zIHJ1biBpbiBhIGRldGVybWluaXN0aWMgVk07IG1vdmUgdGhlIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIGZvciBmdWxsIE5vZGUuanMgYWNjZXNzLidcbiAgKTtcbn1cbiJdfQ==
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1RTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsS0FBSyxDQUFjO0lBQ25CLHVDQUF1QztJQUN2QyxLQUFLLENBQWM7SUFDbkIsVUFBVSxDQUFvQjtJQUM5QixTQUFTLENBQVM7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixjQUFjLENBQVM7SUFDdkIsaUJBQWlCLENBQVM7SUFDMUIsVUFBVSxDQUFTO0lBRW5CLFlBQVksVUFBa0MsRUFBRSxNQUF5QjtRQUN2RSxpREFBaUQ7UUFDakQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXZDLHNDQUFzQztRQUN0QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQUUsU0FBUyxFQUFFLENBQUM7aUJBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxpQkFBaUIsRUFBRSxDQUFDO3FCQUNs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Q0FDNUIsK0pBQStKLENBQ2hLLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBsdXJhbGl6ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0ZUNoYW5nZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0ge1xuICB0eXBlOiAnc3RlcCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgYXJnczogU2VyaWFsaXphYmxlW107XG4gIGNsb3N1cmVWYXJzPzogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlPjtcbiAgdGhpc1ZhbD86IFNlcmlhbGl6YWJsZTtcbiAgaGFzQ3JlYXRlZEV2ZW50PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcCwgZGVyaXZlZCBmcm9tIHRoZSBzdGVwJ3MgTEFURVNUIGBzdGVwX3N0YXJ0ZWRgXG4gICAqIGR1cmluZyByZXBsYXk6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIHN0YW1wZWQgYnkgdGhlIGludm9jYXRpb24gcnVubmluZ1xuICAgKiB0aGUgc3RlcCBpbmxpbmUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBsYXRlc3Qgc3RhcnQgd2FzIHVuc3RhbXBlZCAoYVxuICAgKiByZXRyeSBhdHRlbXB0IGRyaXZlbiBieSBhIHF1ZXVlZCBzdGVwIG1lc3NhZ2UsIG9yIGFuIG9sZGVyIHJ1bnRpbWUpLlxuICAgKiBMYXRlc3Qgc3RhcnQgd2luczogYW4gdW5zdGFtcGVkIGJhcmUgc3RhcnQgY2xlYXJzIGEgcHJldmlvdXMgc3RhbXA7IGFuXG4gICAqIG93bmVyLXJlY292ZXJ5IHJlLXN0YW1wZWQgc3RhcnQgcmVzdG9yZXMgaXQuXG4gICAqL1xuICBvd25lck1lc3NhZ2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIGBjcmVhdGVkQXRgIChtcykgb2YgdGhlIHN0ZXAncyBsYXRlc3Qgb2JzZXJ2ZWQgYHN0ZXBfc3RhcnRlZGAuIEFuY2hvcnNcbiAgICogdGhlIG93bmVyc2hpcCBsZWFzZTogYGxlYXNlUmVtYWluaW5nID0gbGFzdFN0YXJ0ZWRBdCArIGxlYXNlIOKIkiBub3dgLlxuICAgKi9cbiAgbGFzdFN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBgc3RlcF9yZXRyeWluZ2Agd2FzIG9ic2VydmVkIGZvciB0aGlzIHN0ZXAuIEZyb20gdGhhdCBwb2ludFxuICAgKiB0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCAodGhlIGRlbGF5ZWQgcmV0cnkgaGFuZG9mZiBvciByZXBsYXkgcmVxdWV1ZSksXG4gICAqIHNvIGlubGluZSBvd25lcnNoaXAgaXMgcGVybWFuZW50bHkgbGFwc2VkIGZvciB0aGlzIGNvcnJlbGF0aW9uIElELlxuICAgKi9cbiAgc2F3UmV0cnlpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ2hvb2snO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIC8qKiBFYXJsaWVzdCB0aW1lIHRoZSB0b2tlbiBjYW4gYmUgcmV1c2VkIGFmdGVyIHRoZSBydW4gZW5kcy4gKi9cbiAgdG9rZW5SZXRlbnRpb25VbnRpbD86IERhdGU7XG4gIG1ldGFkYXRhPzogU2VyaWFsaXphYmxlO1xuICBoYXNDcmVhdGVkRXZlbnQ/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgd29ya2Zsb3cgaXMgYXdhaXRpbmcgYGhvb2suZ2V0Q29uZmxpY3QoKWAgZm9yIHRoaXMgaG9vayAqL1xuICBoYXNDb25mbGljdEF3YWl0ZXI/OiBib29sZWFuO1xuICBkaXNwb3NlZD86IGJvb2xlYW47XG4gIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgYWJvcnRSZXF1ZXN0ZWQ/OiBib29sZWFuO1xuICBhYm9ydFJlYXNvbj86IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0ge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgcmVzdW1lQXQ6IERhdGU7XG4gIGhhc0NyZWF0ZWRFdmVudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSB7XG4gIHR5cGU6ICdhdHRyaWJ1dGUnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIGNoYW5nZXM6IEF0dHJpYnV0ZUNoYW5nZVtdO1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXVlSXRlbSA9XG4gIHwgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1cbiAgfCBIb29rSW52b2NhdGlvblF1ZXVlSXRlbVxuICB8IFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtXG4gIHwgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbTtcblxuLyoqXG4gKiBBbiBlcnJvciB0aGF0IGlzIHRocm93biB3aGVuIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgKHN0ZXBzL2hvb2tzL2V0Yy4pIGFyZSBjYWxsZWQgYnV0IGRvXG4gKiBub3QgeWV0IGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBldmVudCBsb2cuIFRoZSB3b3JrZmxvd1xuICogZGlzcGF0Y2hlciB3aWxsIGNhdGNoIHRoaXMgZXJyb3IgYW5kIHB1c2ggdGhlIG9wZXJhdGlvbnNcbiAqIG9udG8gdGhlIHF1ZXVlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTdXNwZW5zaW9uIGV4dGVuZHMgRXJyb3Ige1xuICBpdGVtczogUXVldWVJdGVtW107XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGl0ZW1zYCBpbnN0ZWFkLiAqL1xuICBzdGVwczogUXVldWVJdGVtW107XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBzdGVwQ291bnQ6IG51bWJlcjtcbiAgaG9va0NvdW50OiBudW1iZXI7XG4gIHdhaXRDb3VudDogbnVtYmVyO1xuICBhdHRyaWJ1dGVDb3VudDogbnVtYmVyO1xuICBob29rRGlzcG9zZWRDb3VudDogbnVtYmVyO1xuICBhYm9ydENvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaXRlbXNJbnB1dDogTWFwPHN0cmluZywgUXVldWVJdGVtPiwgZ2xvYmFsOiB0eXBlb2YgZ2xvYmFsVGhpcykge1xuICAgIC8vIENvbnZlcnQgTWFwIHRvIGFycmF5IGZvciBpdGVyYXRpb24gYW5kIHN0b3JhZ2VcbiAgICBjb25zdCBpdGVtcyA9IFsuLi5pdGVtc0lucHV0LnZhbHVlcygpXTtcblxuICAgIC8vIFNpbmdsZS1wYXNzIGNvdW50aW5nIGZvciBlZmZpY2llbmN5XG4gICAgbGV0IHN0ZXBDb3VudCA9IDA7XG4gICAgbGV0IGhvb2tDb3VudCA9IDA7XG4gICAgbGV0IHdhaXRDb3VudCA9IDA7XG4gICAgbGV0IGF0dHJpYnV0ZUNvdW50ID0gMDtcbiAgICBsZXQgaG9va0Rpc3Bvc2VkQ291bnQgPSAwO1xuICAgIGxldCBhYm9ydENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdzdGVwJykgc3RlcENvdW50Kys7XG4gICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICBpZiAoaXRlbS5kaXNwb3NlZCkgaG9va0Rpc3Bvc2VkQ291bnQrKztcbiAgICAgICAgZWxzZSBpZiAoaXRlbS5hYm9ydFJlcXVlc3RlZCkgYWJvcnRDb3VudCsrO1xuICAgICAgICBlbHNlIGhvb2tDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICd3YWl0Jykgd2FpdENvdW50Kys7XG4gICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICdhdHRyaWJ1dGUnKSBhdHRyaWJ1dGVDb3VudCsrO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGRlc2NyaXB0aW9uIHBhcnRzXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHN0ZXBDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7c3RlcENvdW50fSAke3BsdXJhbGl6ZSgnc3RlcCcsICdzdGVwcycsIHN0ZXBDb3VudCl9YCk7XG4gICAgfVxuICAgIGlmIChob29rQ291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2hvb2tDb3VudH0gJHtwbHVyYWxpemUoJ2hvb2snLCAnaG9va3MnLCBob29rQ291bnQpfWApO1xuICAgIH1cbiAgICBpZiAod2FpdENvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHt3YWl0Q291bnR9ICR7cGx1cmFsaXplKCd3YWl0JywgJ3dhaXRzJywgd2FpdENvdW50KX1gKTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZUNvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChcbiAgICAgICAgYCR7YXR0cmlidXRlQ291bnR9ICR7cGx1cmFsaXplKCdhdHRyaWJ1dGUgd3JpdGUnLCAnYXR0cmlidXRlIHdyaXRlcycsIGF0dHJpYnV0ZUNvdW50KX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaG9va0Rpc3Bvc2VkQ291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKFxuICAgICAgICBgJHtob29rRGlzcG9zZWRDb3VudH0gaG9vayAke3BsdXJhbGl6ZSgnZGlzcG9zYWwnLCAnZGlzcG9zYWxzJywgaG9va0Rpc3Bvc2VkQ291bnQpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHZlcmIgKGhhcy9oYXZlKSBhbmQgYWN0aW9uIChydW4vY3JlYXRlZC9yZWNlaXZlZClcbiAgICBjb25zdCB0b3RhbENvdW50ID1cbiAgICAgIHN0ZXBDb3VudCArIGhvb2tDb3VudCArIHdhaXRDb3VudCArIGF0dHJpYnV0ZUNvdW50ICsgaG9va0Rpc3Bvc2VkQ291bnQ7XG4gICAgY29uc3QgaGFzT3JIYXZlID0gcGx1cmFsaXplKCdoYXMnLCAnaGF2ZScsIHRvdGFsQ291bnQpO1xuICAgIC8vIFBpY2sgYWN0aW9uIHZlcmI6IHVzZSBcInByb2Nlc3NlZFwiIHdoZW4gbWl4ZWQgdHlwZXMgYXJlIHByZXNlbnRcbiAgICBjb25zdCB0eXBlQ291bnQgPVxuICAgICAgKHN0ZXBDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGhvb2tDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKHdhaXRDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGF0dHJpYnV0ZUNvdW50ID4gMCA/IDEgOiAwKSArXG4gICAgICAoaG9va0Rpc3Bvc2VkQ291bnQgPiAwID8gMSA6IDApO1xuICAgIGxldCBhY3Rpb246IHN0cmluZztcbiAgICBpZiAodHlwZUNvdW50ID4gMSkge1xuICAgICAgYWN0aW9uID0gJ3Byb2Nlc3NlZCc7XG4gICAgfSBlbHNlIGlmIChzdGVwQ291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAncnVuJztcbiAgICB9IGVsc2UgaWYgKGhvb2tDb3VudCA+IDApIHtcbiAgICAgIGFjdGlvbiA9ICdjcmVhdGVkJztcbiAgICB9IGVsc2UgaWYgKHdhaXRDb3VudCA+IDApIHtcbiAgICAgIGFjdGlvbiA9ICdjcmVhdGVkJztcbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZUNvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3dyaXR0ZW4nO1xuICAgIH0gZWxzZSBpZiAoaG9va0Rpc3Bvc2VkQ291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAncHJvY2Vzc2VkJztcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aW9uID0gJ3JlY2VpdmVkJztcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9XG4gICAgICBwYXJ0cy5sZW5ndGggPiAwXG4gICAgICAgID8gYCR7cGFydHMuam9pbignIGFuZCAnKX0gJHtoYXNPckhhdmV9IG5vdCBiZWVuICR7YWN0aW9ufSB5ZXRgXG4gICAgICAgIDogJzAgc3RlcHMgaGF2ZSBub3QgYmVlbiBydW4geWV0JzsgLy8gRGVmYXVsdCBjYXNlIGZvciBlbXB0eSBhcnJheVxuICAgIHN1cGVyKGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2Zsb3dTdXNwZW5zaW9uJztcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5zdGVwcyA9IGl0ZW1zO1xuICAgIHRoaXMuZ2xvYmFsVGhpcyA9IGdsb2JhbDtcbiAgICB0aGlzLnN0ZXBDb3VudCA9IHN0ZXBDb3VudDtcbiAgICB0aGlzLmhvb2tDb3VudCA9IGhvb2tDb3VudDtcbiAgICB0aGlzLndhaXRDb3VudCA9IHdhaXRDb3VudDtcbiAgICB0aGlzLmF0dHJpYnV0ZUNvdW50ID0gYXR0cmlidXRlQ291bnQ7XG4gICAgdGhpcy5ob29rRGlzcG9zZWRDb3VudCA9IGhvb2tEaXNwb3NlZENvdW50O1xuICAgIHRoaXMuYWJvcnRDb3VudCA9IGFib3J0Q291bnQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1N1c3BlbnNpb24ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRU5PVFNVUCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAnVGhpcyBBUEkgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbi4gV29ya2Zsb3cgZnVuY3Rpb25zIHJ1biBpbiBhIGRldGVybWluaXN0aWMgVk07IG1vdmUgdGhlIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIGZvciBmdWxsIE5vZGUuanMgYWNjZXNzLidcbiAgKTtcbn1cbiJdfQ==
|