@workflow/core 5.0.0-beta.43 → 5.0.0-beta.46
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 +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +6 -6
- package/dist/capabilities.js +8 -8
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +2 -2
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +20 -8
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +34 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +13 -13
- package/dist/global.d.ts +4 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +29 -71
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +170 -38
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +24 -24
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +49 -43
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +21 -21
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +206 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +132 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +200 -200
- package/dist/runtime/resume-latency.d.ts +40 -30
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +7 -5
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +22 -5
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +106 -11
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +29 -25
- package/dist/runtime/step-executor.d.ts +14 -14
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +54 -39
- package/dist/runtime/step-latency.d.ts +42 -25
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +29 -23
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +38 -24
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +238 -103
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +427 -266
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +23 -22
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +47 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +30 -24
- package/dist/serialization.d.ts +15 -16
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +116 -109
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +14 -22
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +34 -17
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +32 -17
- package/dist/telemetry.d.ts +3 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +19 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +21 -30
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +26 -13
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +35 -35
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +46 -41
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +53 -35
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -7,11 +7,11 @@ import type { Event } from '@workflow/world';
|
|
|
7
7
|
* beginning to execute. STSO (step-to-step overhead) measures the previous
|
|
8
8
|
* step's terminal event → the next step's body beginning to execute. RSFS
|
|
9
9
|
* (run-started-to-first-step) measures the `run_started` response landing →
|
|
10
|
-
* the first step's start POST being issued
|
|
10
|
+
* the first step's start POST being issued, a sub-window of TTFS that
|
|
11
11
|
* isolates replay overhead from the run-creation queue hop; `finalSchedulingReplay`
|
|
12
12
|
* is the synchronous workflow-function-execution duration of only the FINAL
|
|
13
13
|
* replay pass within that window (the pass that reached and scheduled the
|
|
14
|
-
* first step)
|
|
14
|
+
* first step); it is NOT accumulated across earlier pre-first-step passes
|
|
15
15
|
* (see {@link StepLatencyTracking.replayMs}), so it must not be read as "the
|
|
16
16
|
* replay portion of RSFS". All are attached to the step's terminal
|
|
17
17
|
* event so a backend can emit latency metrics from the event write alone,
|
|
@@ -42,7 +42,7 @@ export interface StepLatencyTracking {
|
|
|
42
42
|
* workflow-body `setAttributes` before the first step
|
|
43
43
|
* resolves through an extra replay (see the `hasAttributeEvents` branch in
|
|
44
44
|
* runtime.ts), so everything from this write until the step body runs is
|
|
45
|
-
* the duration of the setAttributes call
|
|
45
|
+
* the duration of the setAttributes call, which is subtracted by ending
|
|
46
46
|
* the measurement at the point where the step would otherwise have been
|
|
47
47
|
* scheduled.
|
|
48
48
|
*/
|
|
@@ -59,7 +59,7 @@ export interface StepLatencyTracking {
|
|
|
59
59
|
eventCount?: number;
|
|
60
60
|
/**
|
|
61
61
|
* Epoch ms the `run_started` response was received/parsed by the SDK.
|
|
62
|
-
* Present only when the step qualifies for RSFS
|
|
62
|
+
* Present only when the step qualifies for RSFS: the same eligibility as
|
|
63
63
|
* TTFS (see {@link computeStepLatencyTracking}), plus a recoverable
|
|
64
64
|
* anchor. In turbo mode, `run_started` is backgrounded rather than
|
|
65
65
|
* awaited, so this is stamped at the point the runtime synthesizes the
|
|
@@ -74,21 +74,30 @@ export interface StepLatencyTracking {
|
|
|
74
74
|
* Wall-clock ms this invocation's synchronous workflow-function replay
|
|
75
75
|
* took: from calling `runWorkflow` to it throwing the suspension that
|
|
76
76
|
* scheduled this batch. Excludes awaited network I/O (the suspension's
|
|
77
|
-
* event commits, the step's own start POST).
|
|
78
|
-
*
|
|
77
|
+
* event commits, the step's own start POST). Reported for every batch that
|
|
78
|
+
* qualifies for TTFS or STSO, not just the first step.
|
|
79
79
|
*
|
|
80
|
-
* This is the FINAL
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
80
|
+
* This is the FINAL pass only: the one that reached and scheduled this
|
|
81
|
+
* batch. Valid RSFS paths can replay more than once before the first step
|
|
82
|
+
* (e.g. a workflow-body `setAttributes()` detour replays twice), and a
|
|
83
|
+
* redelivery omits earlier invocations' replay work entirely; this value is
|
|
84
|
+
* not accumulated across those earlier passes. Do not read it as "the
|
|
85
|
+
* replay portion of RSFS": RSFS ({@link rsfsAnchorMs}) covers the whole
|
|
86
|
+
* run_started-to-first-step window, this covers only the last pass.
|
|
87
|
+
*
|
|
88
|
+
* On a retained resume this measures the resume, not a replay, which is
|
|
89
|
+
* why the distribution is bimodal and why {@link retained} is reported
|
|
90
|
+
* alongside it as the dimension that separates the two modes.
|
|
88
91
|
*/
|
|
89
92
|
replayMs?: number;
|
|
90
93
|
/** Whether turbo mode is active for this invocation. */
|
|
91
94
|
turbo: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Whether a retained VM session served this batch, as opposed to a full
|
|
97
|
+
* replay from the event log. Reported as a `retained` entry in
|
|
98
|
+
* {@link StepLatencyEventData.optimizations}, alongside `turbo`.
|
|
99
|
+
*/
|
|
100
|
+
retained: boolean;
|
|
92
101
|
}
|
|
93
102
|
/** Latency telemetry attached to a step's terminal event's `eventData`. */
|
|
94
103
|
export interface StepLatencyEventData {
|
|
@@ -99,12 +108,18 @@ export interface StepLatencyEventData {
|
|
|
99
108
|
/** Client-measured run_started → first step's start POST, ms. */
|
|
100
109
|
rsfs?: number;
|
|
101
110
|
/**
|
|
102
|
-
* Client-measured wall-clock ms of the FINAL
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
111
|
+
* Client-measured wall-clock ms of the FINAL pass that scheduled this
|
|
112
|
+
* batch (see {@link StepLatencyTracking.replayMs}); not accumulated
|
|
113
|
+
* across earlier passes, so it must not be read as "the replay portion of
|
|
114
|
+
* `rsfs`". Present whenever `ttfs` or `stso` is.
|
|
106
115
|
*/
|
|
107
116
|
finalSchedulingReplay?: number;
|
|
117
|
+
/**
|
|
118
|
+
* Active runtime modes for this measurement: `turbo`, `lazyStepStart`,
|
|
119
|
+
* `optimisticStart`, and `retained` (a retained VM served the batch; its
|
|
120
|
+
* absence means a full replay). The server turns each known entry into a
|
|
121
|
+
* bounded boolean tag on every latency metric.
|
|
122
|
+
*/
|
|
108
123
|
optimizations?: string[];
|
|
109
124
|
}
|
|
110
125
|
/**
|
|
@@ -131,13 +146,13 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
131
146
|
runCreatedAtMs: number | undefined;
|
|
132
147
|
/**
|
|
133
148
|
* Epoch ms the `run_started` response was received/parsed by the SDK (or,
|
|
134
|
-
* under turbo, the instant the run was synthesized locally
|
|
149
|
+
* under turbo, the instant the run was synthesized locally; see
|
|
135
150
|
* {@link StepLatencyTracking.rsfsAnchorMs}). Absent disqualifies RSFS.
|
|
136
151
|
*/
|
|
137
152
|
runStartedReceivedAtMs: number | undefined;
|
|
138
153
|
/**
|
|
139
154
|
* Wall-clock ms this suspension's `runWorkflow` call spent executing
|
|
140
|
-
* synchronously before throwing
|
|
155
|
+
* synchronously before throwing: the FINAL replay pass only, not
|
|
141
156
|
* accumulated across earlier passes. See
|
|
142
157
|
* {@link StepLatencyTracking.replayMs}.
|
|
143
158
|
*/
|
|
@@ -148,7 +163,7 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
148
163
|
* The accumulator's value as of the suspension that wrote the run's first
|
|
149
164
|
* attr_set (its hook phase runs before its attr writes). When the
|
|
150
165
|
* measurement ends at the attr write, only hook time from before that
|
|
151
|
-
* point may be subtracted
|
|
166
|
+
* point may be subtracted; later hook writes fall outside the measured
|
|
152
167
|
* window. Undefined when no attr suspension happened in this invocation
|
|
153
168
|
* (e.g. the attr_set was loaded from a redelivery's snapshot, where no
|
|
154
169
|
* same-invocation hook time precedes it).
|
|
@@ -157,25 +172,27 @@ export declare function computeStepLatencyTracking(params: {
|
|
|
157
172
|
/**
|
|
158
173
|
* Whether the suspension that scheduled this batch also created waits.
|
|
159
174
|
* Those `wait_created` writes are not in `events` yet (they were committed
|
|
160
|
-
* by this
|
|
175
|
+
* by this suspension pass), so they must be reported separately. A
|
|
161
176
|
* wait disqualifies both measurements.
|
|
162
177
|
*/
|
|
163
178
|
suspensionHasWaits: boolean;
|
|
164
179
|
/**
|
|
165
180
|
* Whether the suspension that scheduled this batch also created hooks
|
|
166
|
-
* (also not in `events` yet). Hooks keep TTFS eligible
|
|
167
|
-
* write time is subtracted via `preStepBlockingMs`
|
|
181
|
+
* (also not in `events` yet). Hooks keep TTFS eligible (their measured
|
|
182
|
+
* write time is subtracted via `preStepBlockingMs`) but disqualify STSO,
|
|
168
183
|
* which is only meaningful for a pure back-to-back step gap.
|
|
169
184
|
*/
|
|
170
185
|
suspensionCreatedHooks: boolean;
|
|
171
186
|
/** Whether turbo mode is active for this invocation. */
|
|
172
187
|
turbo: boolean;
|
|
188
|
+
/** See {@link StepLatencyTracking.retained}. */
|
|
189
|
+
retained: boolean;
|
|
173
190
|
}): StepLatencyTracking | undefined;
|
|
174
191
|
/**
|
|
175
192
|
* Compute the latency telemetry to attach to the step's terminal event.
|
|
176
193
|
* Called by `executeStep` with the wall-clock timestamp taken immediately
|
|
177
194
|
* before user step code runs. Returns undefined when there is nothing to
|
|
178
|
-
* report (no tracking, or a retry attempt
|
|
195
|
+
* report (no tracking, or a retry attempt; retries measure neither TTFS nor
|
|
179
196
|
* STSO).
|
|
180
197
|
*/
|
|
181
198
|
export declare function computeStepLatencyEventData(params: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB
|
|
1
|
+
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,mBAAmB,GAAG,SAAS,CAwFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,oBAAoB,GAAG,SAAS,CAyFnC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Most negative raw duration still attributed to cross-machine clock skew
|
|
3
|
-
* (and clamped to 0). Anything more negative means a corrupt anchor
|
|
4
|
-
* mis-decoded run-ID timestamp
|
|
3
|
+
* (and clamped to 0). Anything more negative means a corrupt anchor (e.g. a
|
|
4
|
+
* mis-decoded run-ID timestamp) and the sample is dropped instead: a
|
|
5
5
|
* systematically corrupt anchor would otherwise report an exact-zero latency
|
|
6
6
|
* on every sample, silently dragging entire percentile distributions to 0
|
|
7
7
|
* rather than surfacing as missing data.
|
|
@@ -23,7 +23,7 @@ const MAX_CLOCK_SKEW_MS = 60_000;
|
|
|
23
23
|
* {@link StepLatencyTracking.preStepBlockingMs}.
|
|
24
24
|
* - `attr_set` (workflow-body `setAttributes`): resolves through
|
|
25
25
|
* an extra replay before steps run. Subtracted by ending the measurement at
|
|
26
|
-
* the first attr write's timestamp instead
|
|
26
|
+
* the first attr write's timestamp instead; see
|
|
27
27
|
* {@link StepLatencyTracking.preStepAttrStartMs}.
|
|
28
28
|
*/
|
|
29
29
|
const TTFS_DISQUALIFYING_EVENT_TYPES = new Set([
|
|
@@ -64,7 +64,7 @@ export function computeStepLatencyTracking(params) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
// STSO: the two steps ran back-to-back
|
|
67
|
+
// STSO: the two steps ran back-to-back, so the newest known event is the
|
|
68
68
|
// previous step's terminal event, with nothing (hook_received, waits,
|
|
69
69
|
// attr_set, ...) in between and this suspension scheduling nothing but
|
|
70
70
|
// steps.
|
|
@@ -107,23 +107,24 @@ export function computeStepLatencyTracking(params) {
|
|
|
107
107
|
...(preStepAttrStartMs !== undefined ? { preStepAttrStartMs } : {}),
|
|
108
108
|
}
|
|
109
109
|
: {}),
|
|
110
|
-
...(rsfsEligible
|
|
111
|
-
? {
|
|
112
|
-
rsfsAnchorMs: params.runStartedReceivedAtMs,
|
|
113
|
-
replayMs: params.replayMs,
|
|
114
|
-
}
|
|
115
|
-
: {}),
|
|
110
|
+
...(rsfsEligible ? { rsfsAnchorMs: params.runStartedReceivedAtMs } : {}),
|
|
116
111
|
...(prevStepEndMs !== undefined
|
|
117
112
|
? { prevStepEndMs, stepCount, eventCount }
|
|
118
113
|
: {}),
|
|
114
|
+
// Not gated on rsfsEligible: replay cost is meaningful for every batch
|
|
115
|
+
// this function returns tracking for. Gating it on RSFS left the STSO
|
|
116
|
+
// population — ordinary step-to-step transitions, the bulk of step
|
|
117
|
+
// scheduling — with no replay-cost telemetry at all.
|
|
118
|
+
replayMs: params.replayMs,
|
|
119
119
|
turbo: params.turbo,
|
|
120
|
+
retained: params.retained,
|
|
120
121
|
};
|
|
121
122
|
}
|
|
122
123
|
/**
|
|
123
124
|
* Compute the latency telemetry to attach to the step's terminal event.
|
|
124
125
|
* Called by `executeStep` with the wall-clock timestamp taken immediately
|
|
125
126
|
* before user step code runs. Returns undefined when there is nothing to
|
|
126
|
-
* report (no tracking, or a retry attempt
|
|
127
|
+
* report (no tracking, or a retry attempt; retries measure neither TTFS nor
|
|
127
128
|
* STSO).
|
|
128
129
|
*/
|
|
129
130
|
export function computeStepLatencyEventData(params) {
|
|
@@ -138,11 +139,11 @@ export function computeStepLatencyEventData(params) {
|
|
|
138
139
|
// doc comment).
|
|
139
140
|
//
|
|
140
141
|
// A pre-step setAttributes detour ends the measurement at the first attr
|
|
141
|
-
// write instead of the step's code start
|
|
142
|
+
// write instead of the step's code start: the remainder is the duration
|
|
142
143
|
// of the setAttributes call (resolved via an extra replay), which is
|
|
143
144
|
// subtracted rather than disqualifying the sample. In that case
|
|
144
145
|
// `tracking.preStepBlockingMs` already holds only the hook time from
|
|
145
|
-
// BEFORE the attr write
|
|
146
|
+
// BEFORE the attr write; hook writes after the window closed are excluded
|
|
146
147
|
// by computeStepLatencyTracking (see preStepBlockingBeforeAttrMs).
|
|
147
148
|
const ttfsEndMs = tracking.preStepAttrStartMs ?? params.stepCodeStartedAtMs;
|
|
148
149
|
const rawTtfs = tracking.ttfsAnchorMs !== undefined
|
|
@@ -157,22 +158,21 @@ export function computeStepLatencyEventData(params) {
|
|
|
157
158
|
const stso = rawStso !== undefined && rawStso >= -MAX_CLOCK_SKEW_MS
|
|
158
159
|
? Math.max(0, rawStso)
|
|
159
160
|
: undefined;
|
|
160
|
-
// RSFS ends at the actual start-POST instant, not at ttfsEndMs
|
|
161
|
+
// RSFS ends at the actual start-POST instant, not at ttfsEndMs: unlike
|
|
161
162
|
// TTFS it is not subject to the pre-step attr-write shortcut, so a
|
|
162
163
|
// pre-step setAttributes detour (rare) makes RSFS include the detour
|
|
163
164
|
// while TTFS excludes it. `finalSchedulingReplay` is a direct passthrough
|
|
164
|
-
// of `tracking.replayMs
|
|
165
|
-
// StepLatencyTracking.replayMs)
|
|
165
|
+
// of `tracking.replayMs`, the FINAL replay pass only (see
|
|
166
|
+
// StepLatencyTracking.replayMs), so no further subtraction applies, but
|
|
166
167
|
// it also means it is NOT accumulated across any earlier pre-first-step
|
|
167
168
|
// passes (e.g. a setAttributes detour) and must not be read as "the
|
|
168
169
|
// replay portion of rsfs"; rsfs covers the whole window.
|
|
169
170
|
//
|
|
170
|
-
// finalSchedulingReplay duplicates what OTEL already captures on the
|
|
171
|
-
// span, but is deliberately collected as client telemetry
|
|
172
|
-
// can emit it as an UNSAMPLED, full-population metric:
|
|
173
|
-
// server spans are heavily sampled in production (~7%),
|
|
174
|
-
//
|
|
175
|
-
// dashboard's exact TTFS decomposition.
|
|
171
|
+
// finalSchedulingReplay duplicates what OTEL already captures on the
|
|
172
|
+
// run/invocation span, but is deliberately collected as client telemetry
|
|
173
|
+
// so the server can emit it as an UNSAMPLED, full-population metric:
|
|
174
|
+
// workflow-server's server spans are heavily sampled in production (~7%),
|
|
175
|
+
// so they cannot serve as the dashboard's exact TTFS decomposition.
|
|
176
176
|
const rsfs = tracking.rsfsAnchorMs !== undefined &&
|
|
177
177
|
params.stepStartPostSentAtMs !== undefined
|
|
178
178
|
? Math.max(0, params.stepStartPostSentAtMs - tracking.rsfsAnchorMs)
|
|
@@ -192,6 +192,12 @@ export function computeStepLatencyEventData(params) {
|
|
|
192
192
|
optimizations.push('optimisticStart');
|
|
193
193
|
if (params.preclaimedStart)
|
|
194
194
|
optimizations.push('preclaimedStart');
|
|
195
|
+
// Rides the existing optimizations list rather than a dedicated wire
|
|
196
|
+
// field: the server already parses this array and turns each known entry
|
|
197
|
+
// into a bounded boolean tag on every latency metric, so `retained`
|
|
198
|
+
// dimensions ttfs/stso/rsfs/finalSchedulingReplay for free.
|
|
199
|
+
if (tracking.retained)
|
|
200
|
+
optimizations.push('retained');
|
|
195
201
|
return {
|
|
196
202
|
...(ttfs !== undefined ? { ttfs } : {}),
|
|
197
203
|
...(stso !== undefined ? { stso } : {}),
|
|
@@ -206,4 +212,4 @@ export function computeStepLatencyEventData(params) {
|
|
|
206
212
|
optimizations,
|
|
207
213
|
};
|
|
208
214
|
}
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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RSxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQg4oCUIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApIOKAlCBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCDigJQgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlMg4oCUIHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkg4oCUIHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiIOKAlCBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciDigJQgZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wIOKAlCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KSDigJQgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQg4oCUIHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHkg4oCUIHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyB2ZXJ5IHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlIOKAlCB0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2Ag4oCUIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5VHJhY2tpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gcGFyYW1zO1xuXG4gIGxldCB0dGZzRWxpZ2libGUgPVxuICAgIHBhcmFtcy5pbnZvY2F0aW9uU3RhcnRlZENsZWFuICYmXG4gICAgcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cztcbiAgbGV0IHByZVN0ZXBBdHRyU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAodHRmc0VsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgICAgdHRmc0VsaWdpYmxlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRNcyA9ICsoZXZlbnQub2NjdXJyZWRBdCA/PyBldmVudC5jcmVhdGVkQXQpO1xuICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPVxuICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGF0dHJTdGFydE1zXG4gICAgICAgICAgICA6IE1hdGgubWluKHByZVN0ZXBBdHRyU3RhcnRNcywgYXR0clN0YXJ0TXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNUU086IHRoZSB0d28gc3RlcHMgcmFuIGJhY2stdG8tYmFjayDigJQgdGhlIG5ld2VzdCBrbm93biBldmVudCBpcyB0aGVcbiAgLy8gcHJldmlvdXMgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LCB3aXRoIG5vdGhpbmcgKGhvb2tfcmVjZWl2ZWQsIHdhaXRzLFxuICAvLyBhdHRyX3NldCwgLi4uKSBpbiBiZXR3ZWVuIGFuZCB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGluZyBub3RoaW5nIGJ1dFxuICAvLyBzdGVwcy5cbiAgbGV0IHByZXZTdGVwRW5kTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZXBDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZXZlbnRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYXN0RXZlbnQgPSBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdO1xuICBpZiAoXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHMgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25DcmVhdGVkSG9va3MgJiZcbiAgICBsYXN0RXZlbnQgJiZcbiAgICAobGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgbGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJylcbiAgKSB7XG4gICAgcHJldlN0ZXBFbmRNcyA9ICsobGFzdEV2ZW50Lm9jY3VycmVkQXQgPz8gbGFzdEV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGVybWluYWxTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykgJiZcbiAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGVybWluYWxTdGVwSWRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RlcENvdW50ID0gdGVybWluYWxTdGVwSWRzLnNpemU7XG4gICAgZXZlbnRDb3VudCA9IGV2ZW50cy5sZW5ndGg7XG4gIH1cblxuICAvLyBSU0ZTIHNoYXJlcyBUVEZTJ3MgZWxpZ2liaWxpdHkgZXhhY3RseSAoc2FtZSBldmVudC1sb2cvd2FpdCBjaGVja3MpLFxuICAvLyBwbHVzIGl0cyBvd24gYW5jaG9yIGJlaW5nIHJlY292ZXJhYmxlLlxuICBjb25zdCByc2ZzRWxpZ2libGUgPVxuICAgIHR0ZnNFbGlnaWJsZSAmJiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyAhPT0gdW5kZWZpbmVkO1xuXG4gIGlmICghdHRmc0VsaWdpYmxlICYmIHByZXZTdGVwRW5kTXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHR0ZnNBbmNob3JNczogcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zLFxuICAgICAgICAgIC8vIFdoZW4gdGhlIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGZpcnN0IGF0dHIgd3JpdGUsIG9ubHkgaG9va1xuICAgICAgICAgIC8vIHRpbWUgZnJvbSBiZWZvcmUgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNczpcbiAgICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPz8gMClcbiAgICAgICAgICAgICAgOiBwYXJhbXMucHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgLi4uKHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkID8geyBwcmVTdGVwQXR0clN0YXJ0TXMgfSA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgcnNmc0FuY2hvck1zOiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICByZXBsYXlNczogcGFyYW1zLnJlcGxheU1zLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcHJldlN0ZXBFbmRNcywgc3RlcENvdW50LCBldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIHR1cmJvOiBwYXJhbXMudHVyYm8sXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0IOKAlCByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIHdhcyBwcmUtY2xhaW1lZFxuICAgKiBpbnNpZGUgdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIGJhdGNoZWQgZmFuLW91dCB3cml0ZSAobm8gc3RhcnQgUE9TVCBvZlxuICAgKiBpdHMgb3duIGF0IGFsbCkuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5RXZlbnREYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNtYWxsIG5lZ2F0aXZlIGR1cmF0aW9ucyBjbGFtcCB0byAwOiBjcm9zcy1pbnZvY2F0aW9uIHRpbWVzdGFtcHMgY2FuXG4gIC8vIGNvbWUgZnJvbSBhbm90aGVyIG1hY2hpbmUncyBjbG9jaywgc28gYm91bmRlZCBza2V3IG11c3Qgbm90IHByb2R1Y2VcbiAgLy8gbmVnYXRpdmUgdmFsdWVzLiBEdXJhdGlvbnMgbW9yZSBuZWdhdGl2ZSB0aGFuIE1BWF9DTE9DS19TS0VXX01TIGFyZSBub3RcbiAgLy8gc2tldyBidXQgYSBjb3JydXB0IGFuY2hvciwgYW5kIHRoZSBzYW1wbGUgaXMgZHJvcHBlZCAoc2VlIHRoZSBjb25zdGFudCdzXG4gIC8vIGRvYyBjb21tZW50KS5cbiAgLy9cbiAgLy8gQSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciBlbmRzIHRoZSBtZWFzdXJlbWVudCBhdCB0aGUgZmlyc3QgYXR0clxuICAvLyB3cml0ZSBpbnN0ZWFkIG9mIHRoZSBzdGVwJ3MgY29kZSBzdGFydCDigJQgdGhlIHJlbWFpbmRlciBpcyB0aGUgZHVyYXRpb25cbiAgLy8gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCAocmVzb2x2ZWQgdmlhIGFuIGV4dHJhIHJlcGxheSksIHdoaWNoIGlzXG4gIC8vIHN1YnRyYWN0ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc2FtcGxlLiBJbiB0aGF0IGNhc2VcbiAgLy8gYHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zYCBhbHJlYWR5IGhvbGRzIG9ubHkgdGhlIGhvb2sgdGltZSBmcm9tXG4gIC8vIEJFRk9SRSB0aGUgYXR0ciB3cml0ZSDigJQgaG9vayB3cml0ZXMgYWZ0ZXIgdGhlIHdpbmRvdyBjbG9zZWQgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJ5IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIChzZWUgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zKS5cbiAgY29uc3QgdHRmc0VuZE1zID0gdHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zID8/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zO1xuICBjb25zdCByYXdUdGZzID1cbiAgICB0cmFja2luZy50dGZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0dGZzRW5kTXMgLSB0cmFja2luZy50dGZzQW5jaG9yTXMgLSAodHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXMgPz8gMClcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB0dGZzID1cbiAgICByYXdUdGZzICE9PSB1bmRlZmluZWQgJiYgcmF3VHRmcyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3VHRmcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByYXdTdHNvID1cbiAgICB0cmFja2luZy5wcmV2U3RlcEVuZE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXMgLSB0cmFja2luZy5wcmV2U3RlcEVuZE1zXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RzbyA9XG4gICAgcmF3U3RzbyAhPT0gdW5kZWZpbmVkICYmIHJhd1N0c28gPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1N0c28pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgLy8gUlNGUyBlbmRzIGF0IHRoZSBhY3R1YWwgc3RhcnQtUE9TVCBpbnN0YW50LCBub3QgYXQgdHRmc0VuZE1zIOKAlCB1bmxpa2VcbiAgLy8gVFRGUyBpdCBpcyBub3Qgc3ViamVjdCB0byB0aGUgcHJlLXN0ZXAgYXR0ci13cml0ZSBzaG9ydGN1dCwgc28gYVxuICAvLyBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciAocmFyZSkgbWFrZXMgUlNGUyBpbmNsdWRlIHRoZSBkZXRvdXJcbiAgLy8gd2hpbGUgVFRGUyBleGNsdWRlcyBpdC4gYGZpbmFsU2NoZWR1bGluZ1JlcGxheWAgaXMgYSBkaXJlY3QgcGFzc3Rocm91Z2hcbiAgLy8gb2YgYHRyYWNraW5nLnJlcGxheU1zYCDigJQgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkgKHNlZVxuICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKSDigJQgc28gbm8gZnVydGhlciBzdWJ0cmFjdGlvbiBhcHBsaWVzLCBidXRcbiAgLy8gaXQgYWxzbyBtZWFucyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGFueSBlYXJsaWVyIHByZS1maXJzdC1zdGVwXG4gIC8vIHBhc3NlcyAoZS5nLiBhIHNldEF0dHJpYnV0ZXMgZGV0b3VyKSBhbmQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZVxuICAvLyByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI7IHJzZnMgY292ZXJzIHRoZSB3aG9sZSB3aW5kb3cuXG4gIC8vXG4gIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZSBydW4vaW52b2NhdGlvblxuICAvLyBzcGFuLCBidXQgaXMgZGVsaWJlcmF0ZWx5IGNvbGxlY3RlZCBhcyBjbGllbnQgdGVsZW1ldHJ5IHNvIHRoZSBzZXJ2ZXJcbiAgLy8gY2FuIGVtaXQgaXQgYXMgYW4gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAvLyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uICh+NyUpLCBhbmQgY2xpZW50IHNwYW5zXG4gIC8vIGNhbid0IGJlIGZpbHRlcmVkIGJ5IFNESyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGVcbiAgLy8gZGFzaGJvYXJkJ3MgZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLlxuICBjb25zdCByc2ZzID1cbiAgICB0cmFja2luZy5yc2ZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gdHJhY2tpbmcucnNmc0FuY2hvck1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbmFsU2NoZWR1bGluZ1JlcGxheSA9XG4gICAgdHJhY2tpbmcucmVwbGF5TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCB0cmFja2luZy5yZXBsYXlNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0dGZzID09PSB1bmRlZmluZWQgJiYgc3RzbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9wdGltaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0cmFja2luZy50dXJibykgb3B0aW1pemF0aW9ucy5wdXNoKCd0dXJibycpO1xuICBpZiAocGFyYW1zLmxhenlTdGVwU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnbGF6eVN0ZXBTdGFydCcpO1xuICBpZiAocGFyYW1zLm9wdGltaXN0aWNTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdvcHRpbWlzdGljU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgncHJlY2xhaW1lZFN0YXJ0Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4odHRmcyAhPT0gdW5kZWZpbmVkID8geyB0dGZzIH0gOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCA/IHsgc3RzbyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgJiYgdHJhY2tpbmcuc3RlcENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBzdGVwQ291bnQ6IHRyYWNraW5nLnN0ZXBDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLmV2ZW50Q291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGV2ZW50Q291bnQ6IHRyYWNraW5nLmV2ZW50Q291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnMgIT09IHVuZGVmaW5lZCA/IHsgcnNmcyB9IDoge30pLFxuICAgIC4uLihmaW5hbFNjaGVkdWxpbmdSZXBsYXkgIT09IHVuZGVmaW5lZCA/IHsgZmluYWxTY2hlZHVsaW5nUmVwbGF5IH0gOiB7fSksXG4gICAgb3B0aW1pemF0aW9ucyxcbiAgfTtcbn1cbiJdfQ==
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVHQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUEwQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQTBEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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b3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQsIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApOyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCwgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlM6IHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFJlcG9ydGVkIGZvciBldmVyeSBiYXRjaCB0aGF0XG4gICAqIHF1YWxpZmllcyBmb3IgVFRGUyBvciBTVFNPLCBub3QganVzdCB0aGUgZmlyc3Qgc3RlcC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgRklOQUwgcGFzcyBvbmx5OiB0aGUgb25lIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoaXNcbiAgICogYmF0Y2guIFZhbGlkIFJTRlMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW4gb25jZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAgICogKGUuZy4gYSB3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIHR3aWNlKSwgYW5kIGFcbiAgICogcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29yayBlbnRpcmVseTsgdGhpcyB2YWx1ZSBpc1xuICAgKiBub3QgYWNjdW11bGF0ZWQgYWNyb3NzIHRob3NlIGVhcmxpZXIgcGFzc2VzLiBEbyBub3QgcmVhZCBpdCBhcyBcInRoZVxuICAgKiByZXBsYXkgcG9ydGlvbiBvZiBSU0ZTXCI6IFJTRlMgKHtAbGluayByc2ZzQW5jaG9yTXN9KSBjb3ZlcnMgdGhlIHdob2xlXG4gICAqIHJ1bl9zdGFydGVkLXRvLWZpcnN0LXN0ZXAgd2luZG93LCB0aGlzIGNvdmVycyBvbmx5IHRoZSBsYXN0IHBhc3MuXG4gICAqXG4gICAqIE9uIGEgcmV0YWluZWQgcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSwgbm90IGEgcmVwbGF5LCB3aGljaCBpc1xuICAgKiB3aHkgdGhlIGRpc3RyaWJ1dGlvbiBpcyBiaW1vZGFsIGFuZCB3aHkge0BsaW5rIHJldGFpbmVkfSBpcyByZXBvcnRlZFxuICAgKiBhbG9uZ3NpZGUgaXQgYXMgdGhlIGRpbWVuc2lvbiB0aGF0IHNlcGFyYXRlcyB0aGUgdHdvIG1vZGVzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciBhIHJldGFpbmVkIFZNIHNlc3Npb24gc2VydmVkIHRoaXMgYmF0Y2gsIGFzIG9wcG9zZWQgdG8gYSBmdWxsXG4gICAqIHJlcGxheSBmcm9tIHRoZSBldmVudCBsb2cuIFJlcG9ydGVkIGFzIGEgYHJldGFpbmVkYCBlbnRyeSBpblxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lFdmVudERhdGEub3B0aW1pemF0aW9uc30sIGFsb25nc2lkZSBgdHVyYm9gLlxuICAgKi9cbiAgcmV0YWluZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW9zdCBuZWdhdGl2ZSByYXcgZHVyYXRpb24gc3RpbGwgYXR0cmlidXRlZCB0byBjcm9zcy1tYWNoaW5lIGNsb2NrIHNrZXdcbiAqIChhbmQgY2xhbXBlZCB0byAwKS4gQW55dGhpbmcgbW9yZSBuZWdhdGl2ZSBtZWFucyBhIGNvcnJ1cHQgYW5jaG9yIChlLmcuIGFcbiAqIG1pcy1kZWNvZGVkIHJ1bi1JRCB0aW1lc3RhbXApIGFuZCB0aGUgc2FtcGxlIGlzIGRyb3BwZWQgaW5zdGVhZDogYVxuICogc3lzdGVtYXRpY2FsbHkgY29ycnVwdCBhbmNob3Igd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBhbiBleGFjdC16ZXJvIGxhdGVuY3lcbiAqIG9uIGV2ZXJ5IHNhbXBsZSwgc2lsZW50bHkgZHJhZ2dpbmcgZW50aXJlIHBlcmNlbnRpbGUgZGlzdHJpYnV0aW9ucyB0byAwXG4gKiByYXRoZXIgdGhhbiBzdXJmYWNpbmcgYXMgbWlzc2luZyBkYXRhLlxuICovXG5jb25zdCBNQVhfQ0xPQ0tfU0tFV19NUyA9IDYwXzAwMDtcblxuLyoqIExhdGVuY3kgdGVsZW1ldHJ5IGF0dGFjaGVkIHRvIGEgc3RlcCdzIHRlcm1pbmFsIGV2ZW50J3MgYGV2ZW50RGF0YWAuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBMYXRlbmN5RXZlbnREYXRhIHtcbiAgdHRmcz86IG51bWJlcjtcbiAgc3Rzbz86IG51bWJlcjtcbiAgc3RlcENvdW50PzogbnVtYmVyO1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKiogQ2xpZW50LW1lYXN1cmVkIHJ1bl9zdGFydGVkIOKGkiBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCwgbXMuICovXG4gIHJzZnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDbGllbnQtbWVhc3VyZWQgd2FsbC1jbG9jayBtcyBvZiB0aGUgRklOQUwgcGFzcyB0aGF0IHNjaGVkdWxlZCB0aGlzXG4gICAqIGJhdGNoIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KTsgbm90IGFjY3VtdWxhdGVkXG4gICAqIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZlxuICAgKiBgcnNmc2BcIi4gUHJlc2VudCB3aGVuZXZlciBgdHRmc2Agb3IgYHN0c29gIGlzLlxuICAgKi9cbiAgZmluYWxTY2hlZHVsaW5nUmVwbGF5PzogbnVtYmVyO1xuICAvKipcbiAgICogQWN0aXZlIHJ1bnRpbWUgbW9kZXMgZm9yIHRoaXMgbWVhc3VyZW1lbnQ6IGB0dXJib2AsIGBsYXp5U3RlcFN0YXJ0YCxcbiAgICogYG9wdGltaXN0aWNTdGFydGAsIGFuZCBgcmV0YWluZWRgIChhIHJldGFpbmVkIFZNIHNlcnZlZCB0aGUgYmF0Y2g7IGl0c1xuICAgKiBhYnNlbmNlIG1lYW5zIGEgZnVsbCByZXBsYXkpLiBUaGUgc2VydmVyIHR1cm5zIGVhY2gga25vd24gZW50cnkgaW50byBhXG4gICAqIGJvdW5kZWQgYm9vbGVhbiB0YWcgb24gZXZlcnkgbGF0ZW5jeSBtZXRyaWMuXG4gICAqL1xuICBvcHRpbWl6YXRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhhdCBkaXNxdWFsaWZ5IFRURlMgd2hlbiBwcmVzZW50IGluIHRoZSBldmVudCBsb2cgYXQgdGhlIHRpbWVcbiAqIHRoZSBydW4ncyBmaXJzdCBzdGVwIGJhdGNoIGlzIHNjaGVkdWxlZDpcbiAqXG4gKiAtIEFueSBzdGVwIGV2ZW50IG1lYW5zIHRoaXMgaXMgbm90IHRoZSBydW4ncyBmaXJzdCBzdGVwIGV4ZWN1dGlvbi5cbiAqIC0gYGhvb2tfcmVjZWl2ZWRgIC8gYHdhaXRfY3JlYXRlZGAgLyBgd2FpdF9jb21wbGV0ZWRgIG1lYW4gdGhlIHJ1bidzIHBhdGggdG9cbiAqICAgdGhlIGZpcnN0IHN0ZXAgZGVwZW5kZWQgb24gdXNlci1kcml2ZW4gdGltaW5nIChhIHdlYmhvb2sgYXJyaXZpbmcsIGFcbiAqICAgc2xlZXAgZWxhcHNpbmcpLCBzbyB0aGUgbWVhc3VyZW1lbnQgd291bGQgbm90IHJlZmxlY3QgcnVudGltZSBvdmVyaGVhZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYWJzZW50LCB3aXRoIHRoZWlyIGNvc3Qgc3VidHJhY3RlZCBpbnN0ZWFkOlxuICpcbiAqIC0gYGhvb2tfY3JlYXRlZGA6IGEgZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKClgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICogICBjb21taXRzIGluIHRoZSBzYW1lIGludm9jYXRpb24sIHdob3NlIG1lYXN1cmVkIGR1cmF0aW9uIGlzIHN1YnRyYWN0ZWQgdmlhXG4gKiAgIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zfS5cbiAqIC0gYGF0dHJfc2V0YCAod29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlc2ApOiByZXNvbHZlcyB0aHJvdWdoXG4gKiAgIGFuIGV4dHJhIHJlcGxheSBiZWZvcmUgc3RlcHMgcnVuLiBTdWJ0cmFjdGVkIGJ5IGVuZGluZyB0aGUgbWVhc3VyZW1lbnQgYXRcbiAqICAgdGhlIGZpcnN0IGF0dHIgd3JpdGUncyB0aW1lc3RhbXAgaW5zdGVhZDsgc2VlXG4gKiAgIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnByZVN0ZXBBdHRyU3RhcnRNc30uXG4gKi9cbmNvbnN0IFRURlNfRElTUVVBTElGWUlOR19FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoXG4gIFtcbiAgICAnc3RlcF9jcmVhdGVkJyxcbiAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICdob29rX3JlY2VpdmVkJyxcbiAgICAnd2FpdF9jcmVhdGVkJyxcbiAgICAnd2FpdF9jb21wbGV0ZWQnLFxuICBdXG4pO1xuXG4vKipcbiAqIERlY2lkZSwgZnJvbSB0aGUgb3JjaGVzdHJhdG9yJ3MgdmlldyBvZiB0aGUgZXZlbnQgbG9nLCB3aGV0aGVyIHRoZSBpbmxpbmVcbiAqIHN0ZXAgYmF0Y2ggYWJvdXQgdG8gZXhlY3V0ZSBxdWFsaWZpZXMgZm9yIFRURlMgYW5kL29yIFNUU08gbWVhc3VyZW1lbnQuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5laXRoZXIgYXBwbGllcy4gQ2FsbGVkIG9uY2UgcGVyIGJhdGNoOyB0aGUgcmVzdWx0XG4gKiBpcyBwYXNzZWQgdG8gdGhlIGJhdGNoJ3MgZmlyc3Qgc3RlcCBvbmx5LCBzbyBhIHBhcmFsbGVsIGZpcnN0IGJhdGNoIGVtaXRzIGFcbiAqIHNpbmdsZSBzYW1wbGUgcmF0aGVyIHRoYW4gb25lIHBlciBzaWJsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcocGFyYW1zOiB7XG4gIC8qKiBUaGUgb3JjaGVzdHJhdG9yJ3MgY3VycmVudCBpbi1tZW1vcnkgZXZlbnQgbG9nIChhc2NlbmRpbmcgb3JkZXIpLiAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaW52b2NhdGlvbidzIGluaXRpYWwgZXZlbnQgbG9hZCBjb250YWluZWQgbm90aGluZyBiZXlvbmRcbiAgICogcnVuX2NyZWF0ZWQvcnVuX3N0YXJ0ZWQvYXR0cl9zZXQuIFByZS1leGlzdGluZyBob29rIGV2ZW50cyB3ZXJlIHdyaXR0ZW5cbiAgICogYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCBzbyB0aGUgdGltZSB0aGV5IGFkZGVkIChpbmNsdWRpbmcgdGhlIHF1ZXVlXG4gICAqIGhvcCBiYWNrIHRvIHRoaXMgaW52b2NhdGlvbikgaXMgdW5tZWFzdXJhYmxlIGFuZCBkaXNxdWFsaWZpZXMgVFRGUy5cbiAgICogYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYSBjb21taXR0ZWQgcHJlLXN0ZXBcbiAgICogYXR0cl9zZXQsIGFuZCB0aGUgZGV0b3VyIGl0IG1hcmtzIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQXR0clN0YXJ0TXNgXG4gICAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdC5cbiAgICovXG4gIGludm9jYXRpb25TdGFydGVkQ2xlYW46IGJvb2xlYW47XG4gIC8qKiBFcG9jaCBtcyBvZiBydW4gY3JlYXRpb24sIGlmIHJlY292ZXJhYmxlLiBBYnNlbnQgZGlzcXVhbGlmaWVzIFRURlMuICovXG4gIHJ1bkNyZWF0ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBFcG9jaCBtcyB0aGUgYHJ1bl9zdGFydGVkYCByZXNwb25zZSB3YXMgcmVjZWl2ZWQvcGFyc2VkIGJ5IHRoZSBTREsgKG9yLFxuICAgKiB1bmRlciB0dXJibywgdGhlIGluc3RhbnQgdGhlIHJ1biB3YXMgc3ludGhlc2l6ZWQgbG9jYWxseTsgc2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNc30pLiBBYnNlbnQgZGlzcXVhbGlmaWVzIFJTRlMuXG4gICAqL1xuICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgc3VzcGVuc2lvbidzIGBydW5Xb3JrZmxvd2AgY2FsbCBzcGVudCBleGVjdXRpbmdcbiAgICogc3luY2hyb25vdXNseSBiZWZvcmUgdGhyb3dpbmc6IHRoZSBGSU5BTCByZXBsYXkgcGFzcyBvbmx5LCBub3RcbiAgICogYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcGFzc2VzLiBTZWVcbiAgICoge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9LlxuICAgKi9cbiAgcmVwbGF5TXM6IG51bWJlcjtcbiAgLyoqIFNlZSB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uICovXG4gIHByZVN0ZXBCbG9ja2luZ01zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWNjdW11bGF0b3IncyB2YWx1ZSBhcyBvZiB0aGUgc3VzcGVuc2lvbiB0aGF0IHdyb3RlIHRoZSBydW4ncyBmaXJzdFxuICAgKiBhdHRyX3NldCAoaXRzIGhvb2sgcGhhc2UgcnVucyBiZWZvcmUgaXRzIGF0dHIgd3JpdGVzKS4gV2hlbiB0aGVcbiAgICogbWVhc3VyZW1lbnQgZW5kcyBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rIHRpbWUgZnJvbSBiZWZvcmUgdGhhdFxuICAgKiBwb2ludCBtYXkgYmUgc3VidHJhY3RlZDsgbGF0ZXIgaG9vayB3cml0ZXMgZmFsbCBvdXRzaWRlIHRoZSBtZWFzdXJlZFxuICAgKiB3aW5kb3cuIFVuZGVmaW5lZCB3aGVuIG5vIGF0dHIgc3VzcGVuc2lvbiBoYXBwZW5lZCBpbiB0aGlzIGludm9jYXRpb25cbiAgICogKGUuZy4gdGhlIGF0dHJfc2V0IHdhcyBsb2FkZWQgZnJvbSBhIHJlZGVsaXZlcnkncyBzbmFwc2hvdCwgd2hlcmUgbm9cbiAgICogc2FtZS1pbnZvY2F0aW9uIGhvb2sgdGltZSBwcmVjZWRlcyBpdCkuXG4gICAqL1xuICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN1c3BlbnNpb24gdGhhdCBzY2hlZHVsZWQgdGhpcyBiYXRjaCBhbHNvIGNyZWF0ZWQgd2FpdHMuXG4gICAqIFRob3NlIGB3YWl0X2NyZWF0ZWRgIHdyaXRlcyBhcmUgbm90IGluIGBldmVudHNgIHlldCAodGhleSB3ZXJlIGNvbW1pdHRlZFxuICAgKiBieSB0aGlzIHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlICh0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2ApIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xuICAvKiogU2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJldGFpbmVkfS4gKi9cbiAgcmV0YWluZWQ6IGJvb2xlYW47XG59KTogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZXZlbnRzIH0gPSBwYXJhbXM7XG5cbiAgbGV0IHR0ZnNFbGlnaWJsZSA9XG4gICAgcGFyYW1zLmludm9jYXRpb25TdGFydGVkQ2xlYW4gJiZcbiAgICBwYXJhbXMucnVuQ3JlYXRlZEF0TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkhhc1dhaXRzO1xuICBsZXQgcHJlU3RlcEF0dHJTdGFydE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmICh0dGZzRWxpZ2libGUpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFRURlNfRElTUVVBTElGWUlOR19FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgICB0dGZzRWxpZ2libGUgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgIGNvbnN0IGF0dHJTdGFydE1zID0gKyhldmVudC5vY2N1cnJlZEF0ID8/IGV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9XG4gICAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYXR0clN0YXJ0TXNcbiAgICAgICAgICAgIDogTWF0aC5taW4ocHJlU3RlcEF0dHJTdGFydE1zLCBhdHRyU3RhcnRNcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU1RTTzogdGhlIHR3byBzdGVwcyByYW4gYmFjay10by1iYWNrLCBzbyB0aGUgbmV3ZXN0IGtub3duIGV2ZW50IGlzIHRoZVxuICAvLyBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQsIHdpdGggbm90aGluZyAoaG9va19yZWNlaXZlZCwgd2FpdHMsXG4gIC8vIGF0dHJfc2V0LCAuLi4pIGluIGJldHdlZW4gYW5kIHRoaXMgc3VzcGVuc2lvbiBzY2hlZHVsaW5nIG5vdGhpbmcgYnV0XG4gIC8vIHN0ZXBzLlxuICBsZXQgcHJldlN0ZXBFbmRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RlcENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBldmVudENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG4gIGlmIChcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cyAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkNyZWF0ZWRIb29rcyAmJlxuICAgIGxhc3RFdmVudCAmJlxuICAgIChsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICBsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKVxuICApIHtcbiAgICBwcmV2U3RlcEVuZE1zID0gKyhsYXN0RXZlbnQub2NjdXJyZWRBdCA/PyBsYXN0RXZlbnQuY3JlYXRlZEF0KTtcbiAgICBjb25zdCB0ZXJtaW5hbFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICBldmVudC5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB0ZXJtaW5hbFN0ZXBJZHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGVwQ291bnQgPSB0ZXJtaW5hbFN0ZXBJZHMuc2l6ZTtcbiAgICBldmVudENvdW50ID0gZXZlbnRzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFJTRlMgc2hhcmVzIFRURlMncyBlbGlnaWJpbGl0eSBleGFjdGx5IChzYW1lIGV2ZW50LWxvZy93YWl0IGNoZWNrcyksXG4gIC8vIHBsdXMgaXRzIG93biBhbmNob3IgYmVpbmcgcmVjb3ZlcmFibGUuXG4gIGNvbnN0IHJzZnNFbGlnaWJsZSA9XG4gICAgdHRmc0VsaWdpYmxlICYmIHBhcmFtcy5ydW5TdGFydGVkUmVjZWl2ZWRBdE1zICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF0dGZzRWxpZ2libGUgJiYgcHJldlN0ZXBFbmRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgdHRmc0FuY2hvck1zOiBwYXJhbXMucnVuQ3JlYXRlZEF0TXMsXG4gICAgICAgICAgLy8gV2hlbiB0aGUgbWVhc3VyZW1lbnQgZW5kcyBhdCB0aGUgZmlyc3QgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgLy8gdGltZSBmcm9tIGJlZm9yZSB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zOlxuICAgICAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAocGFyYW1zLnByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA/PyAwKVxuICAgICAgICAgICAgICA6IHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAuLi4ocHJlU3RlcEF0dHJTdGFydE1zICE9PSB1bmRlZmluZWQgPyB7IHByZVN0ZXBBdHRyU3RhcnRNcyB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocnNmc0VsaWdpYmxlID8geyByc2ZzQW5jaG9yTXM6IHBhcmFtcy5ydW5TdGFydGVkUmVjZWl2ZWRBdE1zIH0gOiB7fSksXG4gICAgLi4uKHByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHByZXZTdGVwRW5kTXMsIHN0ZXBDb3VudCwgZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAvLyBOb3QgZ2F0ZWQgb24gcnNmc0VsaWdpYmxlOiByZXBsYXkgY29zdCBpcyBtZWFuaW5nZnVsIGZvciBldmVyeSBiYXRjaFxuICAgIC8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cmFja2luZyBmb3IuIEdhdGluZyBpdCBvbiBSU0ZTIGxlZnQgdGhlIFNUU09cbiAgICAvLyBwb3B1bGF0aW9uIOKAlCBvcmRpbmFyeSBzdGVwLXRvLXN0ZXAgdHJhbnNpdGlvbnMsIHRoZSBidWxrIG9mIHN0ZXBcbiAgICAvLyBzY2hlZHVsaW5nIOKAlCB3aXRoIG5vIHJlcGxheS1jb3N0IHRlbGVtZXRyeSBhdCBhbGwuXG4gICAgcmVwbGF5TXM6IHBhcmFtcy5yZXBsYXlNcyxcbiAgICB0dXJibzogcGFyYW1zLnR1cmJvLFxuICAgIHJldGFpbmVkOiBwYXJhbXMucmV0YWluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0OyByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIHdhcyBwcmUtY2xhaW1lZFxuICAgKiBpbnNpZGUgdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIGJhdGNoZWQgZmFuLW91dCB3cml0ZSAobm8gc3RhcnQgUE9TVCBvZlxuICAgKiBpdHMgb3duIGF0IGFsbCkuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5RXZlbnREYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNtYWxsIG5lZ2F0aXZlIGR1cmF0aW9ucyBjbGFtcCB0byAwOiBjcm9zcy1pbnZvY2F0aW9uIHRpbWVzdGFtcHMgY2FuXG4gIC8vIGNvbWUgZnJvbSBhbm90aGVyIG1hY2hpbmUncyBjbG9jaywgc28gYm91bmRlZCBza2V3IG11c3Qgbm90IHByb2R1Y2VcbiAgLy8gbmVnYXRpdmUgdmFsdWVzLiBEdXJhdGlvbnMgbW9yZSBuZWdhdGl2ZSB0aGFuIE1BWF9DTE9DS19TS0VXX01TIGFyZSBub3RcbiAgLy8gc2tldyBidXQgYSBjb3JydXB0IGFuY2hvciwgYW5kIHRoZSBzYW1wbGUgaXMgZHJvcHBlZCAoc2VlIHRoZSBjb25zdGFudCdzXG4gIC8vIGRvYyBjb21tZW50KS5cbiAgLy9cbiAgLy8gQSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciBlbmRzIHRoZSBtZWFzdXJlbWVudCBhdCB0aGUgZmlyc3QgYXR0clxuICAvLyB3cml0ZSBpbnN0ZWFkIG9mIHRoZSBzdGVwJ3MgY29kZSBzdGFydDogdGhlIHJlbWFpbmRlciBpcyB0aGUgZHVyYXRpb25cbiAgLy8gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCAocmVzb2x2ZWQgdmlhIGFuIGV4dHJhIHJlcGxheSksIHdoaWNoIGlzXG4gIC8vIHN1YnRyYWN0ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc2FtcGxlLiBJbiB0aGF0IGNhc2VcbiAgLy8gYHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zYCBhbHJlYWR5IGhvbGRzIG9ubHkgdGhlIGhvb2sgdGltZSBmcm9tXG4gIC8vIEJFRk9SRSB0aGUgYXR0ciB3cml0ZTsgaG9vayB3cml0ZXMgYWZ0ZXIgdGhlIHdpbmRvdyBjbG9zZWQgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJ5IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIChzZWUgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zKS5cbiAgY29uc3QgdHRmc0VuZE1zID0gdHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zID8/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zO1xuICBjb25zdCByYXdUdGZzID1cbiAgICB0cmFja2luZy50dGZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0dGZzRW5kTXMgLSB0cmFja2luZy50dGZzQW5jaG9yTXMgLSAodHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXMgPz8gMClcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB0dGZzID1cbiAgICByYXdUdGZzICE9PSB1bmRlZmluZWQgJiYgcmF3VHRmcyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3VHRmcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByYXdTdHNvID1cbiAgICB0cmFja2luZy5wcmV2U3RlcEVuZE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXMgLSB0cmFja2luZy5wcmV2U3RlcEVuZE1zXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RzbyA9XG4gICAgcmF3U3RzbyAhPT0gdW5kZWZpbmVkICYmIHJhd1N0c28gPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1N0c28pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgLy8gUlNGUyBlbmRzIGF0IHRoZSBhY3R1YWwgc3RhcnQtUE9TVCBpbnN0YW50LCBub3QgYXQgdHRmc0VuZE1zOiB1bmxpa2VcbiAgLy8gVFRGUyBpdCBpcyBub3Qgc3ViamVjdCB0byB0aGUgcHJlLXN0ZXAgYXR0ci13cml0ZSBzaG9ydGN1dCwgc28gYVxuICAvLyBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciAocmFyZSkgbWFrZXMgUlNGUyBpbmNsdWRlIHRoZSBkZXRvdXJcbiAgLy8gd2hpbGUgVFRGUyBleGNsdWRlcyBpdC4gYGZpbmFsU2NoZWR1bGluZ1JlcGxheWAgaXMgYSBkaXJlY3QgcGFzc3Rocm91Z2hcbiAgLy8gb2YgYHRyYWNraW5nLnJlcGxheU1zYCwgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkgKHNlZVxuICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKSwgc28gbm8gZnVydGhlciBzdWJ0cmFjdGlvbiBhcHBsaWVzLCBidXRcbiAgLy8gaXQgYWxzbyBtZWFucyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGFueSBlYXJsaWVyIHByZS1maXJzdC1zdGVwXG4gIC8vIHBhc3NlcyAoZS5nLiBhIHNldEF0dHJpYnV0ZXMgZGV0b3VyKSBhbmQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZVxuICAvLyByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI7IHJzZnMgY292ZXJzIHRoZSB3aG9sZSB3aW5kb3cuXG4gIC8vXG4gIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZVxuICAvLyBydW4vaW52b2NhdGlvbiBzcGFuLCBidXQgaXMgZGVsaWJlcmF0ZWx5IGNvbGxlY3RlZCBhcyBjbGllbnQgdGVsZW1ldHJ5XG4gIC8vIHNvIHRoZSBzZXJ2ZXIgY2FuIGVtaXQgaXQgYXMgYW4gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOlxuICAvLyB3b3JrZmxvdy1zZXJ2ZXIncyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uICh+NyUpLFxuICAvLyBzbyB0aGV5IGNhbm5vdCBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3MgZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLlxuICBjb25zdCByc2ZzID1cbiAgICB0cmFja2luZy5yc2ZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gdHJhY2tpbmcucnNmc0FuY2hvck1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbmFsU2NoZWR1bGluZ1JlcGxheSA9XG4gICAgdHJhY2tpbmcucmVwbGF5TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCB0cmFja2luZy5yZXBsYXlNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0dGZzID09PSB1bmRlZmluZWQgJiYgc3RzbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9wdGltaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0cmFja2luZy50dXJibykgb3B0aW1pemF0aW9ucy5wdXNoKCd0dXJibycpO1xuICBpZiAocGFyYW1zLmxhenlTdGVwU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnbGF6eVN0ZXBTdGFydCcpO1xuICBpZiAocGFyYW1zLm9wdGltaXN0aWNTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdvcHRpbWlzdGljU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgncHJlY2xhaW1lZFN0YXJ0Jyk7XG4gIC8vIFJpZGVzIHRoZSBleGlzdGluZyBvcHRpbWl6YXRpb25zIGxpc3QgcmF0aGVyIHRoYW4gYSBkZWRpY2F0ZWQgd2lyZVxuICAvLyBmaWVsZDogdGhlIHNlcnZlciBhbHJlYWR5IHBhcnNlcyB0aGlzIGFycmF5IGFuZCB0dXJucyBlYWNoIGtub3duIGVudHJ5XG4gIC8vIGludG8gYSBib3VuZGVkIGJvb2xlYW4gdGFnIG9uIGV2ZXJ5IGxhdGVuY3kgbWV0cmljLCBzbyBgcmV0YWluZWRgXG4gIC8vIGRpbWVuc2lvbnMgdHRmcy9zdHNvL3JzZnMvZmluYWxTY2hlZHVsaW5nUmVwbGF5IGZvciBmcmVlLlxuICBpZiAodHJhY2tpbmcucmV0YWluZWQpIG9wdGltaXphdGlvbnMucHVzaCgncmV0YWluZWQnKTtcblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzICE9PSB1bmRlZmluZWQgPyB7IHR0ZnMgfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkID8geyBzdHNvIH0gOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5zdGVwQ291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHN0ZXBDb3VudDogdHJhY2tpbmcuc3RlcENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgJiYgdHJhY2tpbmcuZXZlbnRDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgZXZlbnRDb3VudDogdHJhY2tpbmcuZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocnNmcyAhPT0gdW5kZWZpbmVkID8geyByc2ZzIH0gOiB7fSksXG4gICAgLi4uKGZpbmFsU2NoZWR1bGluZ1JlcGxheSAhPT0gdW5kZWZpbmVkID8geyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgfSA6IHt9KSxcbiAgICBvcHRpbWl6YXRpb25zLFxuICB9O1xufVxuIl19
|
|
@@ -18,13 +18,13 @@ export declare function isStepOwnershipActive(step: StepInvocationQueueItem): bo
|
|
|
18
18
|
/**
|
|
19
19
|
* Seconds left on an owned step's liveness lease, anchored at its latest
|
|
20
20
|
* `step_started`. 0 means the lease has expired (or the start timestamp is
|
|
21
|
-
* missing
|
|
21
|
+
* missing, the degraded mode for worlds whose events lack usable
|
|
22
22
|
* timestamps), in which case dispatch falls back to the immediate enqueue.
|
|
23
23
|
*
|
|
24
24
|
* The result is clamped to the configured lease: `lastStartedAt` is the
|
|
25
25
|
* server-stamped event `createdAt` while `nowMs` is the local clock, so a
|
|
26
26
|
* client running behind the server would otherwise compute a remainder
|
|
27
|
-
* LONGER than the lease itself
|
|
27
|
+
* LONGER than the lease itself, and with the lease tuned to the 900s cap,
|
|
28
28
|
* a `delaySeconds` above the queue's per-message maximum, which SQS-backed
|
|
29
29
|
* worlds reject outright (the wake replay's enqueue would throw and ride
|
|
30
30
|
* the redelivery loop). The clamp makes skew strictly harmless; remaining
|
|
@@ -34,14 +34,14 @@ export declare function stepLeaseRemainingSeconds(step: StepInvocationQueueItem,
|
|
|
34
34
|
/**
|
|
35
35
|
* Idempotency key for the delayed backstop wake of an inline-owned step.
|
|
36
36
|
*
|
|
37
|
-
* The key is scoped to the current OWNERSHIP EPOCH
|
|
38
|
-
* latest `step_started`
|
|
37
|
+
* The key is scoped to the current OWNERSHIP EPOCH (the timestamp of the
|
|
38
|
+
* latest `step_started`), not just the correlation ID. Within one epoch,
|
|
39
39
|
* every wake replay derives the same key, so fan-out stays capped at one
|
|
40
40
|
* pending backstop per step. But when owner recovery re-stamps the step
|
|
41
41
|
* (queue redelivery of the owning message → new `step_started` → new
|
|
42
42
|
* `lastStartedAt`), the key CHANGES. This is load-bearing for liveness:
|
|
43
43
|
* queues dedupe an idempotency key for the lifetime of the original
|
|
44
|
-
* message
|
|
44
|
+
* message (including while a delivery of it is in flight), so a backstop
|
|
45
45
|
* that fires during a refreshed lease and tries to re-arm under a fixed key
|
|
46
46
|
* would dedupe against ITSELF and be dropped, leaving no escape hatch if
|
|
47
47
|
* the recovered owner later dies without further redeliveries. The epoch
|
|
@@ -56,7 +56,7 @@ export declare function stepLeaseRemainingSeconds(step: StepInvocationQueueItem,
|
|
|
56
56
|
* The key must also never be the step message's own `idempotencyKey`
|
|
57
57
|
* (the bare correlation ID): the owner's retry handoff enqueues the step
|
|
58
58
|
* under that key with a short backoff, and a pending backstop sharing it
|
|
59
|
-
* would absorb the retry
|
|
59
|
+
* would absorb the retry, turning a 1s backoff into a full-lease stall.
|
|
60
60
|
*/
|
|
61
61
|
export declare function backstopIdempotencyKey(step: StepInvocationQueueItem): string;
|
|
62
62
|
/**
|
|
@@ -21,13 +21,13 @@ export function isStepOwnershipActive(step) {
|
|
|
21
21
|
/**
|
|
22
22
|
* Seconds left on an owned step's liveness lease, anchored at its latest
|
|
23
23
|
* `step_started`. 0 means the lease has expired (or the start timestamp is
|
|
24
|
-
* missing
|
|
24
|
+
* missing, the degraded mode for worlds whose events lack usable
|
|
25
25
|
* timestamps), in which case dispatch falls back to the immediate enqueue.
|
|
26
26
|
*
|
|
27
27
|
* The result is clamped to the configured lease: `lastStartedAt` is the
|
|
28
28
|
* server-stamped event `createdAt` while `nowMs` is the local clock, so a
|
|
29
29
|
* client running behind the server would otherwise compute a remainder
|
|
30
|
-
* LONGER than the lease itself
|
|
30
|
+
* LONGER than the lease itself, and with the lease tuned to the 900s cap,
|
|
31
31
|
* a `delaySeconds` above the queue's per-message maximum, which SQS-backed
|
|
32
32
|
* worlds reject outright (the wake replay's enqueue would throw and ride
|
|
33
33
|
* the redelivery loop). The clamp makes skew strictly harmless; remaining
|
|
@@ -43,14 +43,14 @@ export function stepLeaseRemainingSeconds(step, nowMs) {
|
|
|
43
43
|
/**
|
|
44
44
|
* Idempotency key for the delayed backstop wake of an inline-owned step.
|
|
45
45
|
*
|
|
46
|
-
* The key is scoped to the current OWNERSHIP EPOCH
|
|
47
|
-
* latest `step_started`
|
|
46
|
+
* The key is scoped to the current OWNERSHIP EPOCH (the timestamp of the
|
|
47
|
+
* latest `step_started`), not just the correlation ID. Within one epoch,
|
|
48
48
|
* every wake replay derives the same key, so fan-out stays capped at one
|
|
49
49
|
* pending backstop per step. But when owner recovery re-stamps the step
|
|
50
50
|
* (queue redelivery of the owning message → new `step_started` → new
|
|
51
51
|
* `lastStartedAt`), the key CHANGES. This is load-bearing for liveness:
|
|
52
52
|
* queues dedupe an idempotency key for the lifetime of the original
|
|
53
|
-
* message
|
|
53
|
+
* message (including while a delivery of it is in flight), so a backstop
|
|
54
54
|
* that fires during a refreshed lease and tries to re-arm under a fixed key
|
|
55
55
|
* would dedupe against ITSELF and be dropped, leaving no escape hatch if
|
|
56
56
|
* the recovered owner later dies without further redeliveries. The epoch
|
|
@@ -65,7 +65,7 @@ export function stepLeaseRemainingSeconds(step, nowMs) {
|
|
|
65
65
|
* The key must also never be the step message's own `idempotencyKey`
|
|
66
66
|
* (the bare correlation ID): the owner's retry handoff enqueues the step
|
|
67
67
|
* under that key with a short backoff, and a pending backstop sharing it
|
|
68
|
-
* would absorb the retry
|
|
68
|
+
* would absorb the retry, turning a 1s backoff into a full-lease stall.
|
|
69
69
|
*/
|
|
70
70
|
export function backstopIdempotencyKey(step) {
|
|
71
71
|
return `${step.correlationId}:backstop:${step.lastStartedAt}`;
|
|
@@ -82,7 +82,7 @@ export function backstopIdempotencyKey(step) {
|
|
|
82
82
|
export function hasPendingStepOwnedByMessage(events, pendingCorrelationIds, messageId) {
|
|
83
83
|
// Latest-wins scan: events are in log order, so later entries overwrite.
|
|
84
84
|
// A step_retrying lapses ownership permanently (matching the sawRetrying
|
|
85
|
-
// semantics of the replay consumer in step.ts)
|
|
85
|
+
// semantics of the replay consumer in step.ts): from that point the step
|
|
86
86
|
// is queue-owned, whatever starts follow.
|
|
87
87
|
const latestOwner = new Map();
|
|
88
88
|
const sawRetrying = new Set();
|
|
@@ -111,4 +111,4 @@ export function hasPendingStepOwnedByMessage(events, pendingCorrelationIds, mess
|
|
|
111
111
|
}
|
|
112
112
|
return false;
|
|
113
113
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vd25lcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGVwLW93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRTs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBNkI7SUFDakUsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSTtRQUM3QixJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFDakMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLElBQTZCLEVBQzdCLEtBQWE7SUFFYixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNyRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQTZCO0lBQ2xFLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxhQUFhLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE1BQWUsRUFDZixxQkFBOEMsRUFDOUMsU0FBaUI7SUFFakIseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMENBQTBDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDNUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUNULFdBQVcsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUztnQkFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO2dCQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjO2dCQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLElBQ0UsRUFBRSxLQUFLLFNBQVM7WUFDaEIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIElubGluZSBzdGVwIG93bmVyc2hpcCBoZWxwZXJzIGZvciB0aGUgcGVuZGluZy1zdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlXG4gKiBpbiBydW50aW1lLnRzICh3b3JrZmxvdyMyNzgwKS4gT3duZXJzaGlwIHN0YXRlIGl0c2VsZiBpcyBkZXJpdmVkIHBlci1yZXBsYXlcbiAqIGZyb20gdGhlIGV2ZW50IGxvZyBieSB0aGUgc3RlcCBjb25zdW1lciBpbiBzdGVwLnRzIGFuZCBzdXJmYWNlZCBvblxuICogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW07IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcnByZXQgdGhhdCBzdGF0ZSBhdCBkaXNwYXRjaFxuICogdGltZS5cbiAqL1xuXG4vKipcbiAqIFdoZXRoZXIgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGlzIGFjdGl2ZSBmb3IgYSBwZW5kaW5nIHN0ZXA6IGNyZWF0ZWQsXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAgY2FycmllcyBhbiBvd25lciBzdGFtcCwgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBoYXNcbiAqIGJlZW4gb2JzZXJ2ZWQgKGZyb20gYHN0ZXBfcmV0cnlpbmdgIG9uLCB0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBieSBpdHNcbiAqIGRlbGF5ZWQgcmV0cnkgaGFuZG9mZiAvIHJlcGxheSByZXF1ZXVlLCBzbyBvd25lcnNoaXAgaXMgcGVybWFuZW50bHlcbiAqIGxhcHNlZCBmb3IgdGhlIGNvcnJlbGF0aW9uIElEKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN0ZXAuaGFzQ3JlYXRlZEV2ZW50ID09PSB0cnVlICYmXG4gICAgc3RlcC5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc3RlcC5zYXdSZXRyeWluZyAhPT0gdHJ1ZVxuICApO1xufVxuXG4vKipcbiAqIFNlY29uZHMgbGVmdCBvbiBhbiBvd25lZCBzdGVwJ3MgbGl2ZW5lc3MgbGVhc2UsIGFuY2hvcmVkIGF0IGl0cyBsYXRlc3RcbiAqIGBzdGVwX3N0YXJ0ZWRgLiAwIG1lYW5zIHRoZSBsZWFzZSBoYXMgZXhwaXJlZCAob3IgdGhlIHN0YXJ0IHRpbWVzdGFtcCBpc1xuICogbWlzc2luZyDigJQgdGhlIGRlZ3JhZGVkIG1vZGUgZm9yIHdvcmxkcyB3aG9zZSBldmVudHMgbGFjayB1c2FibGVcbiAqIHRpbWVzdGFtcHMpLCBpbiB3aGljaCBjYXNlIGRpc3BhdGNoIGZhbGxzIGJhY2sgdG8gdGhlIGltbWVkaWF0ZSBlbnF1ZXVlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgY2xhbXBlZCB0byB0aGUgY29uZmlndXJlZCBsZWFzZTogYGxhc3RTdGFydGVkQXRgIGlzIHRoZVxuICogc2VydmVyLXN0YW1wZWQgZXZlbnQgYGNyZWF0ZWRBdGAgd2hpbGUgYG5vd01zYCBpcyB0aGUgbG9jYWwgY2xvY2ssIHNvIGFcbiAqIGNsaWVudCBydW5uaW5nIGJlaGluZCB0aGUgc2VydmVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIGEgcmVtYWluZGVyXG4gKiBMT05HRVIgdGhhbiB0aGUgbGVhc2UgaXRzZWxmIOKAlCBhbmQgd2l0aCB0aGUgbGVhc2UgdHVuZWQgdG8gdGhlIDkwMHMgY2FwLFxuICogYSBgZGVsYXlTZWNvbmRzYCBhYm92ZSB0aGUgcXVldWUncyBwZXItbWVzc2FnZSBtYXhpbXVtLCB3aGljaCBTUVMtYmFja2VkXG4gKiB3b3JsZHMgcmVqZWN0IG91dHJpZ2h0ICh0aGUgd2FrZSByZXBsYXkncyBlbnF1ZXVlIHdvdWxkIHRocm93IGFuZCByaWRlXG4gKiB0aGUgcmVkZWxpdmVyeSBsb29wKS4gVGhlIGNsYW1wIG1ha2VzIHNrZXcgc3RyaWN0bHkgaGFybWxlc3M7IHJlbWFpbmluZ1xuICogdGltZSBjYW4gbmV2ZXIgbGVnaXRpbWF0ZWx5IGV4Y2VlZCB0aGUgZnVsbCBsZWFzZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKFxuICBzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgbm93TXM6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHN0ZXAubGFzdFN0YXJ0ZWRBdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gIGNvbnN0IHJlbWFpbmluZ01zID0gc3RlcC5sYXN0U3RhcnRlZEF0ICsgbGVhc2VTZWNvbmRzICogMTAwMCAtIG5vd01zO1xuICByZXR1cm4gTWF0aC5taW4obGVhc2VTZWNvbmRzLCBNYXRoLm1heCgwLCBNYXRoLmNlaWwocmVtYWluaW5nTXMgLyAxMDAwKSkpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBvZiBhbiBpbmxpbmUtb3duZWQgc3RlcC5cbiAqXG4gKiBUaGUga2V5IGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCBPV05FUlNISVAgRVBPQ0gg4oCUIHRoZSB0aW1lc3RhbXAgb2YgdGhlXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAg4oCUIG5vdCBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRC4gV2l0aGluIG9uZSBlcG9jaCxcbiAqIGV2ZXJ5IHdha2UgcmVwbGF5IGRlcml2ZXMgdGhlIHNhbWUga2V5LCBzbyBmYW4tb3V0IHN0YXlzIGNhcHBlZCBhdCBvbmVcbiAqIHBlbmRpbmcgYmFja3N0b3AgcGVyIHN0ZXAuIEJ1dCB3aGVuIG93bmVyIHJlY292ZXJ5IHJlLXN0YW1wcyB0aGUgc3RlcFxuICogKHF1ZXVlIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIOKGkiBuZXcgYHN0ZXBfc3RhcnRlZGAg4oaSIG5ld1xuICogYGxhc3RTdGFydGVkQXRgKSwgdGhlIGtleSBDSEFOR0VTLiBUaGlzIGlzIGxvYWQtYmVhcmluZyBmb3IgbGl2ZW5lc3M6XG4gKiBxdWV1ZXMgZGVkdXBlIGFuIGlkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBvcmlnaW5hbFxuICogbWVzc2FnZSDigJQgaW5jbHVkaW5nIHdoaWxlIGEgZGVsaXZlcnkgb2YgaXQgaXMgaW4gZmxpZ2h0IOKAlCBzbyBhIGJhY2tzdG9wXG4gKiB0aGF0IGZpcmVzIGR1cmluZyBhIHJlZnJlc2hlZCBsZWFzZSBhbmQgdHJpZXMgdG8gcmUtYXJtIHVuZGVyIGEgZml4ZWQga2V5XG4gKiB3b3VsZCBkZWR1cGUgYWdhaW5zdCBJVFNFTEYgYW5kIGJlIGRyb3BwZWQsIGxlYXZpbmcgbm8gZXNjYXBlIGhhdGNoIGlmXG4gKiB0aGUgcmVjb3ZlcmVkIG93bmVyIGxhdGVyIGRpZXMgd2l0aG91dCBmdXJ0aGVyIHJlZGVsaXZlcmllcy4gVGhlIGVwb2NoXG4gKiBzdWZmaXggZ2l2ZXMgdGhlIHJlLWFybSBhIGZyZXNoIGtleS4gUGVuZGluZyBiYWNrc3RvcHMgYXJlIGJvdW5kZWQgYnkgdGhlXG4gKiBudW1iZXIgb2Ygb3duZXJzaGlwIGVwb2NocywgaS5lLiB0aGUgcXVldWUncyByZWRlbGl2ZXJ5IGJ1ZGdldCBmb3IgdGhlXG4gKiBvd25pbmcgbWVzc2FnZS5cbiAqXG4gKiBUaGUgZXBvY2ggdmFsdWUgY29tZXMgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3MgYGNyZWF0ZWRBdGAsIHNvIGV2ZXJ5XG4gKiByZXBsYXllciBkZXJpdmVzIHRoZSBzYW1lIGtleS4gQ2FsbGVycyBvbmx5IGJ1aWxkIGJhY2tzdG9wcyB3aGVuIHRoZVxuICogbGVhc2UgaGFzIHRpbWUgcmVtYWluaW5nLCB3aGljaCByZXF1aXJlcyBgbGFzdFN0YXJ0ZWRBdGAgdG8gYmUgc2V0LlxuICpcbiAqIFRoZSBrZXkgbXVzdCBhbHNvIG5ldmVyIGJlIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24gYGlkZW1wb3RlbmN5S2V5YFxuICogKHRoZSBiYXJlIGNvcnJlbGF0aW9uIElEKTogdGhlIG93bmVyJ3MgcmV0cnkgaGFuZG9mZiBlbnF1ZXVlcyB0aGUgc3RlcFxuICogdW5kZXIgdGhhdCBrZXkgd2l0aCBhIHNob3J0IGJhY2tvZmYsIGFuZCBhIHBlbmRpbmcgYmFja3N0b3Agc2hhcmluZyBpdFxuICogd291bGQgYWJzb3JiIHRoZSByZXRyeSDigJQgdHVybmluZyBhIDFzIGJhY2tvZmYgaW50byBhIGZ1bGwtbGVhc2Ugc3RhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrc3RvcElkZW1wb3RlbmN5S2V5KHN0ZXA6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0ZXAuY29ycmVsYXRpb25JZH06YmFja3N0b3A6JHtzdGVwLmxhc3RTdGFydGVkQXR9YDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFueSBvZiB0aGUgZ2l2ZW4gcGVuZGluZyBjb3JyZWxhdGlvbiBJRHMgaXMgaW5saW5lLW93bmVkIGJ5XG4gKiBgbWVzc2FnZUlkYCBwZXIgdGhlIHJhdyBldmVudCBsb2c6IGl0cyBMQVRFU1QgYHN0ZXBfc3RhcnRlZGAgY2Fycmllc1xuICogYG93bmVyTWVzc2FnZUlkID09PSBtZXNzYWdlSWRgIGFuZCBubyBgc3RlcF9yZXRyeWluZ2AgZm9sbG93cyBpdC4gVXNlZCBieVxuICogdGhlIGJhY2tncm91bmQtc3RlcCBmYXN0IHBhdGgsIHdoaWNoIHNlZXMgcmF3IGV2ZW50cyAobm90IHRoZSByZXBsYXknc1xuICogcXVldWVJdGVtcyksIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wIHNvIHRoaXNcbiAqIGludm9jYXRpb24gY2FuIHJlY292ZXIgYSBzdGVwIGl0IG93bnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW5kIGxlYXZpbmcgaXRcbiAqIHRvIHRoZSBkZWxheWVkIGJhY2tzdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZShcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBwZW5kaW5nQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBtZXNzYWdlSWQ6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIC8vIExhdGVzdC13aW5zIHNjYW46IGV2ZW50cyBhcmUgaW4gbG9nIG9yZGVyLCBzbyBsYXRlciBlbnRyaWVzIG92ZXJ3cml0ZS5cbiAgLy8gQSBzdGVwX3JldHJ5aW5nIGxhcHNlcyBvd25lcnNoaXAgcGVybWFuZW50bHkgKG1hdGNoaW5nIHRoZSBzYXdSZXRyeWluZ1xuICAvLyBzZW1hbnRpY3Mgb2YgdGhlIHJlcGxheSBjb25zdW1lciBpbiBzdGVwLnRzKSDigJQgZnJvbSB0aGF0IHBvaW50IHRoZSBzdGVwXG4gIC8vIGlzIHF1ZXVlLW93bmVkLCB3aGF0ZXZlciBzdGFydHMgZm9sbG93LlxuICBjb25zdCBsYXRlc3RPd25lciA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHNhd1JldHJ5aW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5jb3JyZWxhdGlvbklkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZSAmJlxuICAgICAgICBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgIHR5cGVvZiBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBsYXRlc3RPd25lci5zZXQoZS5jb3JyZWxhdGlvbklkLCBvd25lcik7XG4gICAgfSBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICBzYXdSZXRyeWluZy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBpZCBvZiBwZW5kaW5nQ29ycmVsYXRpb25JZHMpIHtcbiAgICBpZiAoXG4gICAgICBpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc2F3UmV0cnlpbmcuaGFzKGlkKSAmJlxuICAgICAgbGF0ZXN0T3duZXIuZ2V0KGlkKSA9PT0gbWVzc2FnZUlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1vd25lcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGVwLW93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRTs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBNkI7SUFDakUsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSTtRQUM3QixJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFDakMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLElBQTZCLEVBQzdCLEtBQWE7SUFFYixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNyRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQTZCO0lBQ2xFLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxhQUFhLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE1BQWUsRUFDZixxQkFBOEMsRUFDOUMsU0FBaUI7SUFFakIseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsMENBQTBDO0lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDNUMsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUNULFdBQVcsSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUztnQkFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO2dCQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjO2dCQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLElBQ0UsRUFBRSxLQUFLLFNBQVM7WUFDaEIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIElubGluZSBzdGVwIG93bmVyc2hpcCBoZWxwZXJzIGZvciB0aGUgcGVuZGluZy1zdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlXG4gKiBpbiBydW50aW1lLnRzICh3b3JrZmxvdyMyNzgwKS4gT3duZXJzaGlwIHN0YXRlIGl0c2VsZiBpcyBkZXJpdmVkIHBlci1yZXBsYXlcbiAqIGZyb20gdGhlIGV2ZW50IGxvZyBieSB0aGUgc3RlcCBjb25zdW1lciBpbiBzdGVwLnRzIGFuZCBzdXJmYWNlZCBvblxuICogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW07IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcnByZXQgdGhhdCBzdGF0ZSBhdCBkaXNwYXRjaFxuICogdGltZS5cbiAqL1xuXG4vKipcbiAqIFdoZXRoZXIgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGlzIGFjdGl2ZSBmb3IgYSBwZW5kaW5nIHN0ZXA6IGNyZWF0ZWQsXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGAgY2FycmllcyBhbiBvd25lciBzdGFtcCwgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBoYXNcbiAqIGJlZW4gb2JzZXJ2ZWQgKGZyb20gYHN0ZXBfcmV0cnlpbmdgIG9uLCB0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBieSBpdHNcbiAqIGRlbGF5ZWQgcmV0cnkgaGFuZG9mZiAvIHJlcGxheSByZXF1ZXVlLCBzbyBvd25lcnNoaXAgaXMgcGVybWFuZW50bHlcbiAqIGxhcHNlZCBmb3IgdGhlIGNvcnJlbGF0aW9uIElEKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN0ZXAuaGFzQ3JlYXRlZEV2ZW50ID09PSB0cnVlICYmXG4gICAgc3RlcC5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc3RlcC5zYXdSZXRyeWluZyAhPT0gdHJ1ZVxuICApO1xufVxuXG4vKipcbiAqIFNlY29uZHMgbGVmdCBvbiBhbiBvd25lZCBzdGVwJ3MgbGl2ZW5lc3MgbGVhc2UsIGFuY2hvcmVkIGF0IGl0cyBsYXRlc3RcbiAqIGBzdGVwX3N0YXJ0ZWRgLiAwIG1lYW5zIHRoZSBsZWFzZSBoYXMgZXhwaXJlZCAob3IgdGhlIHN0YXJ0IHRpbWVzdGFtcCBpc1xuICogbWlzc2luZywgdGhlIGRlZ3JhZGVkIG1vZGUgZm9yIHdvcmxkcyB3aG9zZSBldmVudHMgbGFjayB1c2FibGVcbiAqIHRpbWVzdGFtcHMpLCBpbiB3aGljaCBjYXNlIGRpc3BhdGNoIGZhbGxzIGJhY2sgdG8gdGhlIGltbWVkaWF0ZSBlbnF1ZXVlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgY2xhbXBlZCB0byB0aGUgY29uZmlndXJlZCBsZWFzZTogYGxhc3RTdGFydGVkQXRgIGlzIHRoZVxuICogc2VydmVyLXN0YW1wZWQgZXZlbnQgYGNyZWF0ZWRBdGAgd2hpbGUgYG5vd01zYCBpcyB0aGUgbG9jYWwgY2xvY2ssIHNvIGFcbiAqIGNsaWVudCBydW5uaW5nIGJlaGluZCB0aGUgc2VydmVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIGEgcmVtYWluZGVyXG4gKiBMT05HRVIgdGhhbiB0aGUgbGVhc2UgaXRzZWxmLCBhbmQgd2l0aCB0aGUgbGVhc2UgdHVuZWQgdG8gdGhlIDkwMHMgY2FwLFxuICogYSBgZGVsYXlTZWNvbmRzYCBhYm92ZSB0aGUgcXVldWUncyBwZXItbWVzc2FnZSBtYXhpbXVtLCB3aGljaCBTUVMtYmFja2VkXG4gKiB3b3JsZHMgcmVqZWN0IG91dHJpZ2h0ICh0aGUgd2FrZSByZXBsYXkncyBlbnF1ZXVlIHdvdWxkIHRocm93IGFuZCByaWRlXG4gKiB0aGUgcmVkZWxpdmVyeSBsb29wKS4gVGhlIGNsYW1wIG1ha2VzIHNrZXcgc3RyaWN0bHkgaGFybWxlc3M7IHJlbWFpbmluZ1xuICogdGltZSBjYW4gbmV2ZXIgbGVnaXRpbWF0ZWx5IGV4Y2VlZCB0aGUgZnVsbCBsZWFzZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKFxuICBzdGVwOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgbm93TXM6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHN0ZXAubGFzdFN0YXJ0ZWRBdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gIGNvbnN0IHJlbWFpbmluZ01zID0gc3RlcC5sYXN0U3RhcnRlZEF0ICsgbGVhc2VTZWNvbmRzICogMTAwMCAtIG5vd01zO1xuICByZXR1cm4gTWF0aC5taW4obGVhc2VTZWNvbmRzLCBNYXRoLm1heCgwLCBNYXRoLmNlaWwocmVtYWluaW5nTXMgLyAxMDAwKSkpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgdGhlIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBvZiBhbiBpbmxpbmUtb3duZWQgc3RlcC5cbiAqXG4gKiBUaGUga2V5IGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCBPV05FUlNISVAgRVBPQ0ggKHRoZSB0aW1lc3RhbXAgb2YgdGhlXG4gKiBsYXRlc3QgYHN0ZXBfc3RhcnRlZGApLCBub3QganVzdCB0aGUgY29ycmVsYXRpb24gSUQuIFdpdGhpbiBvbmUgZXBvY2gsXG4gKiBldmVyeSB3YWtlIHJlcGxheSBkZXJpdmVzIHRoZSBzYW1lIGtleSwgc28gZmFuLW91dCBzdGF5cyBjYXBwZWQgYXQgb25lXG4gKiBwZW5kaW5nIGJhY2tzdG9wIHBlciBzdGVwLiBCdXQgd2hlbiBvd25lciByZWNvdmVyeSByZS1zdGFtcHMgdGhlIHN0ZXBcbiAqIChxdWV1ZSByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmcgbWVzc2FnZSDihpIgbmV3IGBzdGVwX3N0YXJ0ZWRgIOKGkiBuZXdcbiAqIGBsYXN0U3RhcnRlZEF0YCksIHRoZSBrZXkgQ0hBTkdFUy4gVGhpcyBpcyBsb2FkLWJlYXJpbmcgZm9yIGxpdmVuZXNzOlxuICogcXVldWVzIGRlZHVwZSBhbiBpZGVtcG90ZW5jeSBrZXkgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgb3JpZ2luYWxcbiAqIG1lc3NhZ2UgKGluY2x1ZGluZyB3aGlsZSBhIGRlbGl2ZXJ5IG9mIGl0IGlzIGluIGZsaWdodCksIHNvIGEgYmFja3N0b3BcbiAqIHRoYXQgZmlyZXMgZHVyaW5nIGEgcmVmcmVzaGVkIGxlYXNlIGFuZCB0cmllcyB0byByZS1hcm0gdW5kZXIgYSBmaXhlZCBrZXlcbiAqIHdvdWxkIGRlZHVwZSBhZ2FpbnN0IElUU0VMRiBhbmQgYmUgZHJvcHBlZCwgbGVhdmluZyBubyBlc2NhcGUgaGF0Y2ggaWZcbiAqIHRoZSByZWNvdmVyZWQgb3duZXIgbGF0ZXIgZGllcyB3aXRob3V0IGZ1cnRoZXIgcmVkZWxpdmVyaWVzLiBUaGUgZXBvY2hcbiAqIHN1ZmZpeCBnaXZlcyB0aGUgcmUtYXJtIGEgZnJlc2gga2V5LiBQZW5kaW5nIGJhY2tzdG9wcyBhcmUgYm91bmRlZCBieSB0aGVcbiAqIG51bWJlciBvZiBvd25lcnNoaXAgZXBvY2hzLCBpLmUuIHRoZSBxdWV1ZSdzIHJlZGVsaXZlcnkgYnVkZ2V0IGZvciB0aGVcbiAqIG93bmluZyBtZXNzYWdlLlxuICpcbiAqIFRoZSBlcG9jaCB2YWx1ZSBjb21lcyBmcm9tIHRoZSBwZXJzaXN0ZWQgZXZlbnQncyBgY3JlYXRlZEF0YCwgc28gZXZlcnlcbiAqIHJlcGxheWVyIGRlcml2ZXMgdGhlIHNhbWUga2V5LiBDYWxsZXJzIG9ubHkgYnVpbGQgYmFja3N0b3BzIHdoZW4gdGhlXG4gKiBsZWFzZSBoYXMgdGltZSByZW1haW5pbmcsIHdoaWNoIHJlcXVpcmVzIGBsYXN0U3RhcnRlZEF0YCB0byBiZSBzZXQuXG4gKlxuICogVGhlIGtleSBtdXN0IGFsc28gbmV2ZXIgYmUgdGhlIHN0ZXAgbWVzc2FnZSdzIG93biBgaWRlbXBvdGVuY3lLZXlgXG4gKiAodGhlIGJhcmUgY29ycmVsYXRpb24gSUQpOiB0aGUgb3duZXIncyByZXRyeSBoYW5kb2ZmIGVucXVldWVzIHRoZSBzdGVwXG4gKiB1bmRlciB0aGF0IGtleSB3aXRoIGEgc2hvcnQgYmFja29mZiwgYW5kIGEgcGVuZGluZyBiYWNrc3RvcCBzaGFyaW5nIGl0XG4gKiB3b3VsZCBhYnNvcmIgdGhlIHJldHJ5LCB0dXJuaW5nIGEgMXMgYmFja29mZiBpbnRvIGEgZnVsbC1sZWFzZSBzdGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcDogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c3RlcC5jb3JyZWxhdGlvbklkfTpiYWNrc3RvcDoke3N0ZXAubGFzdFN0YXJ0ZWRBdH1gO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW55IG9mIHRoZSBnaXZlbiBwZW5kaW5nIGNvcnJlbGF0aW9uIElEcyBpcyBpbmxpbmUtb3duZWQgYnlcbiAqIGBtZXNzYWdlSWRgIHBlciB0aGUgcmF3IGV2ZW50IGxvZzogaXRzIExBVEVTVCBgc3RlcF9zdGFydGVkYCBjYXJyaWVzXG4gKiBgb3duZXJNZXNzYWdlSWQgPT09IG1lc3NhZ2VJZGAgYW5kIG5vIGBzdGVwX3JldHJ5aW5nYCBmb2xsb3dzIGl0LiBVc2VkIGJ5XG4gKiB0aGUgYmFja2dyb3VuZC1zdGVwIGZhc3QgcGF0aCwgd2hpY2ggc2VlcyByYXcgZXZlbnRzIChub3QgdGhlIHJlcGxheSdzXG4gKiBxdWV1ZUl0ZW1zKSwgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIGxvb3Agc28gdGhpc1xuICogaW52b2NhdGlvbiBjYW4gcmVjb3ZlciBhIHN0ZXAgaXQgb3ducyBpbnN0ZWFkIG9mIHJldHVybmluZyBhbmQgbGVhdmluZyBpdFxuICogdG8gdGhlIGRlbGF5ZWQgYmFja3N0b3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHBlbmRpbmdDb3JyZWxhdGlvbklkczogU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgLy8gTGF0ZXN0LXdpbnMgc2NhbjogZXZlbnRzIGFyZSBpbiBsb2cgb3JkZXIsIHNvIGxhdGVyIGVudHJpZXMgb3ZlcndyaXRlLlxuICAvLyBBIHN0ZXBfcmV0cnlpbmcgbGFwc2VzIG93bmVyc2hpcCBwZXJtYW5lbnRseSAobWF0Y2hpbmcgdGhlIHNhd1JldHJ5aW5nXG4gIC8vIHNlbWFudGljcyBvZiB0aGUgcmVwbGF5IGNvbnN1bWVyIGluIHN0ZXAudHMpOiBmcm9tIHRoYXQgcG9pbnQgdGhlIHN0ZXBcbiAgLy8gaXMgcXVldWUtb3duZWQsIHdoYXRldmVyIHN0YXJ0cyBmb2xsb3cuXG4gIGNvbnN0IGxhdGVzdE93bmVyID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3Qgc2F3UmV0cnlpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgIGUuZXZlbnREYXRhICYmXG4gICAgICAgICdvd25lck1lc3NhZ2VJZCcgaW4gZS5ldmVudERhdGEgJiZcbiAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWRcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGxhdGVzdE93bmVyLnNldChlLmNvcnJlbGF0aW9uSWQsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIHNhd1JldHJ5aW5nLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIHBlbmRpbmdDb3JyZWxhdGlvbklkcykge1xuICAgIGlmIChcbiAgICAgIGlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzYXdSZXRyeWluZy5oYXMoaWQpICYmXG4gICAgICBsYXRlc3RPd25lci5nZXQoaWQpID09PSBtZXNzYWdlSWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
@@ -4,7 +4,7 @@ import type { StepExecutionResult } from './step-executor.js';
|
|
|
4
4
|
* already in flight in this process. The winner's result is returned to the
|
|
5
5
|
* winner; a loser awaits the winner's settlement (success OR failure) and
|
|
6
6
|
* then returns `{ type: 'skipped' }` so its caller acks without running the
|
|
7
|
-
* body. A winner failure is not propagated to the loser
|
|
7
|
+
* body. A winner failure is not propagated to the loser: the winner's own
|
|
8
8
|
* queue message redelivers and drives the retry, so exactly one message
|
|
9
9
|
* keeps owning the outcome.
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-single-flight.d.ts","sourceRoot":"","sources":["../../src/runtime/step-single-flight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-single-flight.d.ts","sourceRoot":"","sources":["../../src/runtime/step-single-flight.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAyC9D;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CA8B9B"}
|