@workflow/core 4.4.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.d.ts +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +52 -4
- package/dist/classify-error.d.ts +15 -0
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +47 -3
- package/dist/create-hook.d.ts +39 -0
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/events-consumer.d.ts +9 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +56 -18
- package/dist/global.d.ts +2 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +48 -2
- package/dist/private.d.ts +31 -0
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +13 -1
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +14 -8
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +63 -0
- package/dist/runtime/helpers.d.ts +4 -2
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +6 -7
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +23 -12
- package/dist/runtime/start.d.ts +11 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +92 -33
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +32 -20
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +81 -40
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime.d.ts +3 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +27 -7
- package/dist/serialization.d.ts +113 -3
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +381 -19
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +6 -3
- package/dist/step-hydration-cache.d.ts +148 -0
- package/dist/step-hydration-cache.d.ts.map +1 -0
- package/dist/step-hydration-cache.js +171 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +18 -2
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +2 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +92 -3
- package/dist/workflow.d.ts +10 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +37 -6
- package/docs/api-reference/create-hook.mdx +32 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/streaming.mdx +7 -1
- package/docs/foundations/versioning.mdx +1 -1
- package/docs/how-it-works/encryption.mdx +2 -2
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/package.json +9 -5
package/dist/runtime/start.js
CHANGED
|
@@ -1,19 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { EntityConflictError, ThrottleError, WorkflowRuntimeError, WorkflowWorldError, } from '@workflow/errors';
|
|
1
|
+
import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
|
|
3
2
|
import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_EVENT_SOURCING, } from '@workflow/world';
|
|
4
3
|
import { monotonicFactory } from 'ulid';
|
|
4
|
+
import { getRunCapabilities } from '../capabilities.js';
|
|
5
|
+
import { isRetryableWorldError } from '../classify-error.js';
|
|
5
6
|
import { importKey } from '../encryption.js';
|
|
6
7
|
import { runtimeLogger } from '../logger.js';
|
|
7
8
|
import { dehydrateWorkflowArguments } from '../serialization.js';
|
|
8
9
|
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
9
10
|
import { serializeTraceCarrier, trace } from '../telemetry.js';
|
|
10
|
-
import { waitedUntil } from '../util.js';
|
|
11
11
|
import { version as workflowCoreVersion } from '../version.js';
|
|
12
|
-
import { getWorkflowQueueName } from './helpers.js';
|
|
12
|
+
import { getWorkflowQueueName, healthCheck } from './helpers.js';
|
|
13
13
|
import { Run } from './run.js';
|
|
14
|
+
import { safeWaitUntil, waitedUntil } from './wait-until.js';
|
|
14
15
|
import { getWorld } from './world.js';
|
|
16
|
+
/**
|
|
17
|
+
* Timeout for the cross-deployment capability probe done before
|
|
18
|
+
* dehydrating workflow arguments. Kept tight on purpose: the probe is
|
|
19
|
+
* an optimization (it lets the caller emit the framed byte-stream wire
|
|
20
|
+
* format when the target supports it), and the fallback on timeout is
|
|
21
|
+
* the legacy raw format which always works. Long delays here would just
|
|
22
|
+
* make `start({ deploymentId: ... })` slower for users whose target
|
|
23
|
+
* deployments don't recognize the health check at all.
|
|
24
|
+
*/
|
|
25
|
+
const CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS = 2_000;
|
|
15
26
|
/** ULID generator for client-side runId generation */
|
|
16
27
|
const ulid = monotonicFactory();
|
|
28
|
+
// `deploymentId: 'latest'` is a no-op in Worlds without atomic deployments.
|
|
29
|
+
// The warning that explains this only needs to fire once per process: a
|
|
30
|
+
// workflow that hardcodes 'latest' for its Vercel deployment would otherwise
|
|
31
|
+
// log it on every local/Postgres run, flooding tight dev loops.
|
|
32
|
+
let hasWarnedLatestNoOp = false;
|
|
33
|
+
/**
|
|
34
|
+
* Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only —
|
|
35
|
+
* exported so unit tests can exercise the warn path across `start()` calls.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export function _resetLatestNoOpWarnForTests() {
|
|
40
|
+
hasWarnedLatestNoOp = false;
|
|
41
|
+
}
|
|
17
42
|
export async function start(workflow, argsOrOptions, options) {
|
|
18
43
|
return await waitedUntil(() => {
|
|
19
44
|
// @ts-expect-error this field is added by our client transform
|
|
@@ -38,15 +63,57 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
38
63
|
...Attribute.WorkflowArgumentsCount(args.length),
|
|
39
64
|
});
|
|
40
65
|
const world = opts?.world ?? getWorld();
|
|
41
|
-
|
|
66
|
+
const currentDeploymentId = await world.getDeploymentId();
|
|
67
|
+
let deploymentId = opts.deploymentId ?? currentDeploymentId;
|
|
42
68
|
// When 'latest' is requested, resolve the actual latest deployment ID
|
|
43
69
|
// for the current deployment's environment (same production target or
|
|
44
70
|
// same git branch for preview deployments).
|
|
71
|
+
//
|
|
72
|
+
// Resolving 'latest' only means something in worlds with atomic,
|
|
73
|
+
// immutable deployments (e.g. Vercel), which implement
|
|
74
|
+
// resolveLatestDeploymentId(). Worlds without that concept (local dev,
|
|
75
|
+
// self-hosted Postgres) have nothing to resolve between, so rather than
|
|
76
|
+
// fail a run that works fine on Vercel, we warn and fall back to the
|
|
77
|
+
// current deployment — making 'latest' an effective no-op there.
|
|
45
78
|
if (deploymentId === 'latest') {
|
|
46
|
-
if (
|
|
47
|
-
|
|
79
|
+
if (world.resolveLatestDeploymentId) {
|
|
80
|
+
deploymentId = await world.resolveLatestDeploymentId();
|
|
48
81
|
}
|
|
49
|
-
|
|
82
|
+
else {
|
|
83
|
+
// Warn once per process — see hasWarnedLatestNoOp above.
|
|
84
|
+
if (!hasWarnedLatestNoOp) {
|
|
85
|
+
hasWarnedLatestNoOp = true;
|
|
86
|
+
runtimeLogger.warn("deploymentId: 'latest' has no effect in this world and was ignored. " +
|
|
87
|
+
'It is only supported by worlds with atomic deployments, such as Vercel. ' +
|
|
88
|
+
'The run will target the current deployment.', { currentDeploymentId });
|
|
89
|
+
}
|
|
90
|
+
deploymentId = currentDeploymentId;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Decide whether to write byte streams in the framed wire format.
|
|
94
|
+
// For same-deployment starts (the common case) we know the target is
|
|
95
|
+
// running this same SDK version, so framing is safe. For cross-
|
|
96
|
+
// deployment starts (explicit deploymentId or 'latest' that resolves
|
|
97
|
+
// to a different deployment) we probe the target via healthCheck to
|
|
98
|
+
// learn its workflow-core version, then derive the capability. The
|
|
99
|
+
// probe has a tight timeout — on miss/failure we fall back to the
|
|
100
|
+
// legacy raw byte format, which is universally readable.
|
|
101
|
+
//
|
|
102
|
+
// Worlds that don't expose the stream-reading API (e.g. minimal test
|
|
103
|
+
// mocks) can't service health checks, so we skip the probe for them.
|
|
104
|
+
let framedByteStreams;
|
|
105
|
+
if (deploymentId === currentDeploymentId) {
|
|
106
|
+
framedByteStreams = true;
|
|
107
|
+
}
|
|
108
|
+
else if (typeof world.readFromStream !== 'function') {
|
|
109
|
+
framedByteStreams = false;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const probe = await healthCheck(world, 'workflow', {
|
|
113
|
+
deploymentId,
|
|
114
|
+
timeout: CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS,
|
|
115
|
+
}).catch(() => undefined);
|
|
116
|
+
framedByteStreams = getRunCapabilities(probe?.workflowCoreVersion).framedByteStreams;
|
|
50
117
|
}
|
|
51
118
|
const ops = [];
|
|
52
119
|
// Generate runId client-side so we have it before serialization
|
|
@@ -76,7 +143,7 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
76
143
|
const encryptionKey = rawKey ? await importKey(rawKey) : undefined;
|
|
77
144
|
// Create run via run_created event (event-sourced architecture)
|
|
78
145
|
// Pass client-generated runId - server will accept and use it
|
|
79
|
-
const workflowArguments = await dehydrateWorkflowArguments(args, runId, encryptionKey, ops, globalThis, v1Compat);
|
|
146
|
+
const workflowArguments = await dehydrateWorkflowArguments(args, runId, encryptionKey, ops, globalThis, v1Compat, framedByteStreams);
|
|
80
147
|
const executionContext = {
|
|
81
148
|
traceCarrier,
|
|
82
149
|
workflowCoreVersion,
|
|
@@ -129,10 +196,11 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
129
196
|
// + run_started call completes faster. We expect this to be <=1% of cases.
|
|
130
197
|
// In this case, we can safely return.
|
|
131
198
|
}
|
|
132
|
-
else if (
|
|
133
|
-
// 429 (ThrottleError)
|
|
134
|
-
// are retryable — the run was accepted via the
|
|
135
|
-
// will be re-tried by the runtime when it calls
|
|
199
|
+
else if (isRetryableWorldError(err)) {
|
|
200
|
+
// 429 (ThrottleError), 5xx, and transient transport failures
|
|
201
|
+
// (TRANSPORT/TIMEOUT) are retryable — the run was accepted via the
|
|
202
|
+
// queue and creation will be re-tried by the runtime when it calls
|
|
203
|
+
// run_started.
|
|
136
204
|
resilientStart = true;
|
|
137
205
|
runtimeLogger.warn('Run creation event failed, but the run was accepted via the queue. ' +
|
|
138
206
|
'The run_created event will be re-tried async by the runtime.', { workflowRunId: runId, error: err.message });
|
|
@@ -152,12 +220,16 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
152
220
|
throw new WorkflowRuntimeError(`Server returned different runId than requested: expected ${runId}, got ${result.run.runId}`);
|
|
153
221
|
}
|
|
154
222
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
223
|
+
// These argument-stream ops are flushed in the background; the promise
|
|
224
|
+
// handed to waitUntil must never reject (an unconsumed waitUntil
|
|
225
|
+
// rejection crashes the process as unhandledRejection), so unexpected
|
|
226
|
+
// failures are logged instead.
|
|
227
|
+
safeWaitUntil(Promise.all(ops), (err) => {
|
|
228
|
+
runtimeLogger.warn('Background flush of workflow argument streams failed', {
|
|
229
|
+
workflowRunId: runId,
|
|
230
|
+
error: err instanceof Error ? err.message : String(err),
|
|
231
|
+
});
|
|
232
|
+
});
|
|
161
233
|
span?.setAttributes({
|
|
162
234
|
...Attribute.WorkflowRunId(runId),
|
|
163
235
|
...Attribute.DeploymentId(deploymentId),
|
|
@@ -170,17 +242,4 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
170
242
|
});
|
|
171
243
|
});
|
|
172
244
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Checks if an error from events.create (run_created) is retryable,
|
|
175
|
-
* meaning the queue can re-try creation later via the run_started path.
|
|
176
|
-
* - ThrottleError (429): rate limited, will succeed later
|
|
177
|
-
* - WorkflowWorldError with status >= 500: server error, will succeed later
|
|
178
|
-
*/
|
|
179
|
-
function isRetryableStartError(err) {
|
|
180
|
-
if (ThrottleError.is(err))
|
|
181
|
-
return true;
|
|
182
|
-
if (WorkflowWorldError.is(err) && err.status && err.status >= 500)
|
|
183
|
-
return true;
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsMENBQTBDLEVBQzFDLG9DQUFvQyxHQUNyQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0QyxzREFBc0Q7QUFDdEQsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztBQXlGaEMsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQ3pCLFFBQTZELEVBQzdELGFBQW9DLEVB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SSxHQUFHO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdFVudGlsIH0gZnJvbSAnQHZlcmNlbC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW52b2tlUGF5bG9hZCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfRVZFTlRfU09VUkNJTkcsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgd2FpdGVkVW50aWwgfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3dvcmxkLmpzJztcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBjdXJyZW50bHkgYSBWZXJjZWwtc3BlY2lmaWMgZmVhdHVyZS5cbiAgICpcbiAgICogKipOb3RlOioqIFdoZW4gYGRlcGxveW1lbnRJZGAgaXMgcHJvdmlkZWQsIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGJlY29tZSBgdW5rbm93bmBcbiAgICogc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB0eXBlcyB3aWxsIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgZGVwbG95bWVudElkOiAnbGF0ZXN0JyB8IChzdHJpbmcgJiB7fSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICBkZXBsb3ltZW50SWQ/OiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXJ0T3B0aW9ucyA9XG4gIHwgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuICB8IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSAoXG4gIC4uLmFyZ3M6IFRBcmdzXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1ldGFkYXRhIG9mIGEgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93TWV0YWRhdGEgPSB7IHdvcmtmbG93SWQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24gdG8gc3RhcnQuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3cgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3b3JrZmxvdyBydW4gKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcnVuIElEIGZvciB0aGUgbmV3bHkgc3RhcnRlZCB3b3JrZmxvdyBpbnZvY2F0aW9uLlxuICovXG4vLyBPdmVybG9hZHMgd2l0aCBkZXBsb3ltZW50SWQgLSBhcmdzIGFuZCByZXR1cm4gdHlwZSBiZWNvbWUgdW5rbm93blxuLy8gVXNlcyBnZW5lcmljcyBzbyB0eXBlZCB3b3JrZmxvd3MgYXJlIGFzc2lnbmFibGUgKGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMpLFxuLy8gYnV0IHRoZSByZXR1cm4gdHlwZSBhbmQgYXJncyBhcmUgc3RpbGwgdW5rbm93biBzaW5jZSB0aGUgZGVwbG95ZWQgdmVyc2lvbiBtYXkgZGlmZmVyLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogdW5rbm93bltdLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG4vLyBPdmVybG9hZHMgd2l0aG91dCBkZXBsb3ltZW50SWQgLSBwcmVzZXJ2ZSB0eXBlIGluZmVyZW5jZVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogVEFyZ3MsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnc09yT3B0aW9ucz86IFRBcmdzIHwgU3RhcnRPcHRpb25zLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zXG4pIHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgZmllbGQgaXMgYWRkZWQgYnkgb3VyIGNsaWVudCB0cmFuc2Zvcm1cbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSB3b3JrZmxvdz8ud29ya2Zsb3dJZDtcblxuICAgIGlmICghd29ya2Zsb3dOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGAnc3RhcnQnIHJlY2VpdmVkIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24uIEVuc3VyZSB0aGUgV29ya2Zsb3cgU0RLIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYSAndXNlIHdvcmtmbG93JyBkaXJlY3RpdmUuYCxcbiAgICAgICAgeyBzbHVnOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2UoYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dOYW1lfWAsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFyZ3M6IFNlcmlhbGl6YWJsZVtdID0gW107XG4gICAgICBsZXQgb3B0czogU3RhcnRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NPck9wdGlvbnMpKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzT3JPcHRpb25zIGFzIFNlcmlhbGl6YWJsZVtdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnc09yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NPck9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChhcmdzLmxlbmd0aCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBvcHRzPy53b3JsZCA/PyBnZXRXb3JsZCgpO1xuICAgICAgbGV0IGRlcGxveW1lbnRJZCA9IG9wdHMuZGVwbG95bWVudElkID8/IChhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKSk7XG5cbiAgICAgIC8vIFdoZW4gJ2xhdGVzdCcgaXMgcmVxdWVzdGVkLCByZXNvbHZlIHRoZSBhY3R1YWwgbGF0ZXN0IGRlcGxveW1lbnQgSURcbiAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50J3MgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3JcbiAgICAgIC8vIHNhbWUgZ2l0IGJyYW5jaCBmb3IgcHJldmlldyBkZXBsb3ltZW50cykuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAoIXdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBcImRlcGxveW1lbnRJZCAnbGF0ZXN0JyByZXF1aXJlcyBhIFdvcmxkIHRoYXQgaW1wbGVtZW50cyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKClcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBydW5JZCBjbGllbnQtc2lkZSBzbyB3ZSBoYXZlIGl0IGJlZm9yZSBzZXJpYWxpemF0aW9uXG4gICAgICAvLyAocmVxdWlyZWQgZm9yIGZ1dHVyZSBFMkUgZW5jcnlwdGlvbiB3aGVyZSBydW5JZCBpcyBwYXJ0IG9mIHRoZSBlbmNyeXB0aW9uIGNvbnRleHQpXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7dWxpZCgpfWA7XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIFVzZSB3b3JsZC1kZWNsYXJlZCBzcGVjVmVyc2lvbiB3aGVuIGF2YWlsYWJsZSAob3VyIHdvcmxkcyBzZXQgdGhpcyksXG4gICAgICAvLyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBzYWZlIGJhc2VsaW5lIHRoYXQgY29tbXVuaXR5IHdvcmxkcyBoYW5kbGUuXG4gICAgICAvLyBDb21tdW5pdHkgd29ybGRzIGJ1aWx0IGFnYWluc3Qgb2xkZXIgQHdvcmtmbG93L3dvcmxkIHJlamVjdCBydW5zIHdpdGhcbiAgICAgIC8vIHNwZWNWZXJzaW9uID4gdGhlaXIgU1BFQ19WRVJTSU9OX0NVUlJFTlQgdmlhIHJlcXVpcmVzTmV3ZXJXb3JsZCgpLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPVxuICAgICAgICBvcHRzLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIHdvcmxkLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19FVkVOVF9TT1VSQ0lORztcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDcmVhdGUgcnVuIHZpYSBydW5fY3JlYXRlZCBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAvLyBQYXNzIGNsaWVudC1nZW5lcmF0ZWQgcnVuSWQgLSBzZXJ2ZXIgd2lsbCBhY2NlcHQgYW5kIHVzZSBpdFxuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBhbmQgcXVldWUgaW4gcGFyYWxsZWwuXG4gICAgICAvLyBJZiBldmVudHMuY3JlYXRlIGZhaWxzIHdpdGggNDI5LzV4eCwgdGhlIHJ1biB3YXMgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIHZpYSB0aGUgcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICBjb25zdCBbcnVuQ3JlYXRlZFJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHYxQ29tcGF0IH1cbiAgICAgICAgKSxcbiAgICAgICAgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC4uLihzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlRcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBydW5JbnB1dDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIOKAlCB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVTdGFydEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpIGFuZCA1eHggKFdvcmtmbG93V29ybGRFcnJvciB3aXRoIHN0YXR1cyA+PSA1MDApXG4gICAgICAgICAgLy8gYXJlIHJldHJ5YWJsZSDigJQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb25cbiAgICAgICAgICAvLyB3aWxsIGJlIHJlLXRyaWVkIGJ5IHRoZSBydW50aW1lIHdoZW4gaXQgY2FsbHMgcnVuX3N0YXJ0ZWQuXG4gICAgICAgICAgcmVzaWxpZW50U3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdSdW4gY3JlYXRpb24gZXZlbnQgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZS4gJyArXG4gICAgICAgICAgICAgICdUaGUgcnVuX2NyZWF0ZWQgZXZlbnQgd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS4nLFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgZXJyb3I6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZTtcbiAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHJ1biB3YXMgY3JlYXRlZFxuICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBcIk1pc3NpbmcgJ3J1bicgaW4gc2VydmVyIHJlc3BvbnNlIGZvciAncnVuX2NyZWF0ZWQnIGV2ZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlcnZlciBhY2NlcHRlZCBvdXIgcnVuSWRcbiAgICAgICAgaWYgKCF2MUNvbXBhdCAmJiByZXN1bHQucnVuLnJ1bklkICE9PSBydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IHJ1bklkIHRoYW4gcmVxdWVzdGVkOiBleHBlY3RlZCAke3J1bklkfSwgZ290ICR7cmVzdWx0LnJ1bi5ydW5JZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3YWl0VW50aWwoXG4gICAgICAgIFByb21pc2UuYWxsKG9wcykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBleHBlY3RlZCBjbGllbnQgZGlzY29ubmVjdCBlcnJvcnMgKGUuZy4sIGJyb3dzZXIgcmVmcmVzaCBkdXJpbmcgc3RyZWFtaW5nKVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgICAgIGlmICghaXNBYm9ydEVycm9yKSB0aHJvdyBlcnI7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRGVwbG95bWVudElkKGRlcGxveW1lbnRJZCksXG4gICAgICAgIC4uLihydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW5cbiAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1bi5zdGF0dXMpXG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBSdW48VFJlc3VsdD4ocnVuSWQsIHsgcmVzaWxpZW50U3RhcnQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBlcnJvciBmcm9tIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBpcyByZXRyeWFibGUsXG4gKiBtZWFuaW5nIHRoZSBxdWV1ZSBjYW4gcmUtdHJ5IGNyZWF0aW9uIGxhdGVyIHZpYSB0aGUgcnVuX3N0YXJ0ZWQgcGF0aC5cbiAqIC0gVGhyb3R0bGVFcnJvciAoNDI5KTogcmF0ZSBsaW1pdGVkLCB3aWxsIHN1Y2NlZWQgbGF0ZXJcbiAqIC0gV29ya2Zsb3dXb3JsZEVycm9yIHdpdGggc3RhdHVzID49IDUwMDogc2VydmVyIGVycm9yLCB3aWxsIHN1Y2NlZWQgbGF0ZXJcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGFydEVycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdvcmtmbG93V29ybGRFcnJvci5pcyhlcnIpICYmIGVyci5zdGF0dXMgJiYgZXJyLnN0YXR1cyA+PSA1MDApXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDBDQUEwQyxFQUMxQyxvQ0FBb0MsR0FDckMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSw0Q0FBNEMsR0FBRyxLQUFLLENBQUM7QUFFM0Qsc0RBQXNEO0FB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QUM7YUFDUixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksR0FBRyxDQUFVLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0VWRU5UX1NPVVJDSU5HLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgZ2V0UnVuQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vY2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NjaGVtYXMuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKipcbiAqIFRpbWVvdXQgZm9yIHRoZSBjcm9zcy1kZXBsb3ltZW50IGNhcGFiaWxpdHkgcHJvYmUgZG9uZSBiZWZvcmVcbiAqIGRlaHlkcmF0aW5nIHdvcmtmbG93IGFyZ3VtZW50cy4gS2VwdCB0aWdodCBvbiBwdXJwb3NlOiB0aGUgcHJvYmUgaXNcbiAqIGFuIG9wdGltaXphdGlvbiAoaXQgbGV0cyB0aGUgY2FsbGVyIGVtaXQgdGhlIGZyYW1lZCBieXRlLXN0cmVhbSB3aXJlXG4gKiBmb3JtYXQgd2hlbiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGl0KSwgYW5kIHRoZSBmYWxsYmFjayBvbiB0aW1lb3V0IGlzXG4gKiB0aGUgbGVnYWN5IHJhdyBmb3JtYXQgd2hpY2ggYWx3YXlzIHdvcmtzLiBMb25nIGRlbGF5cyBoZXJlIHdvdWxkIGp1c3RcbiAqIG1ha2UgYHN0YXJ0KHsgZGVwbG95bWVudElkOiAuLi4gfSlgIHNsb3dlciBmb3IgdXNlcnMgd2hvc2UgdGFyZ2V0XG4gKiBkZXBsb3ltZW50cyBkb24ndCByZWNvZ25pemUgdGhlIGhlYWx0aCBjaGVjayBhdCBhbGwuXG4gKi9cbmNvbnN0IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxubGV0IGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5IOKAlFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gd29ybGRzIHdpdGggYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHNcbiAgICogKGN1cnJlbnRseSBWZXJjZWwpLiBJbiBvdGhlciB3b3JsZHMgKGxvY2FsIGRldiwgUG9zdGdyZXMpIHRoZXJlIGlzIG5vXG4gICAqIG5vdGlvbiBvZiBtdWx0aXBsZSBkZXBsb3ltZW50cyB0byByZXNvbHZlIGJldHdlZW4sIHNvIGAnbGF0ZXN0J2AgaGFzIG5vXG4gICAqIGVmZmVjdCDigJQgYSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhlIHJ1biB0YXJnZXRzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqTm90ZToqKiBXaGVuIGBkZXBsb3ltZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBiZWNvbWUgYHVua25vd25gXG4gICAqIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgdHlwZXMgd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBkZXBsb3ltZW50cy5cbiAgICovXG4gIGRlcGxveW1lbnRJZDogJ2xhdGVzdCcgfCAoc3RyaW5nICYge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgZGVwbG95bWVudElkPzogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgdHlwZSBTdGFydE9wdGlvbnMgPVxuICB8IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbiAgfCBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+ID0gKFxuICAuLi5hcmdzOiBUQXJnc1xuKSA9PiBQcm9taXNlPFRSZXN1bHQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBvZiBhIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd01ldGFkYXRhID0geyB3b3JrZmxvd0lkOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTdGFydHMgYSB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uIHRvIHN0YXJ0LlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdvcmtmbG93IChvcHRpb25hbCkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgcnVuIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJ1biBJRCBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgd29ya2Zsb3cgaW52b2NhdGlvbi5cbiAqL1xuLy8gT3ZlcmxvYWRzIHdpdGggZGVwbG95bWVudElkIC0gYXJncyBhbmQgcmV0dXJuIHR5cGUgYmVjb21lIHVua25vd25cbi8vIFVzZXMgZ2VuZXJpY3Mgc28gdHlwZWQgd29ya2Zsb3dzIGFyZSBhc3NpZ25hYmxlIChhdm9pZHMgY29udHJhdmFyaWFuY2UgaXNzdWVzKSxcbi8vIGJ1dCB0aGUgcmV0dXJuIHR5cGUgYW5kIGFyZ3MgYXJlIHN0aWxsIHVua25vd24gc2luY2UgdGhlIGRlcGxveWVkIHZlcnNpb24gbWF5IGRpZmZlci5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuLy8gT3ZlcmxvYWRzIHdpdGhvdXQgZGVwbG95bWVudElkIC0gcHJlc2VydmUgdHlwZSBpbmZlcmVuY2VcbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IFRBcmdzLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3NPck9wdGlvbnM/OiBUQXJncyB8IFN0YXJ0T3B0aW9ucyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1xuKSB7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGZpZWxkIGlzIGFkZGVkIGJ5IG91ciBjbGllbnQgdHJhbnNmb3JtXG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3c/LndvcmtmbG93SWQ7XG5cbiAgICBpZiAoIXdvcmtmbG93TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgJ3N0YXJ0JyByZWNlaXZlZCBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLiBFbnN1cmUgdGhlIFdvcmtmbG93IFNESyBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBhbmQgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGEgJ3VzZSB3b3JrZmxvdycgZGlyZWN0aXZlLmAsXG4gICAgICAgIHsgc2x1ZzogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5zdGFydCAke3dvcmtmbG93TmFtZX1gLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cz8ud29ybGQgPz8gZ2V0V29ybGQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgIGxldCBkZXBsb3ltZW50SWQgPSBvcHRzLmRlcGxveW1lbnRJZCA/PyBjdXJyZW50RGVwbG95bWVudElkO1xuXG4gICAgICAvLyBXaGVuICdsYXRlc3QnIGlzIHJlcXVlc3RlZCwgcmVzb2x2ZSB0aGUgYWN0dWFsIGxhdGVzdCBkZXBsb3ltZW50IElEXG4gICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCdzIGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yXG4gICAgICAvLyBzYW1lIGdpdCBicmFuY2ggZm9yIHByZXZpZXcgZGVwbG95bWVudHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFJlc29sdmluZyAnbGF0ZXN0JyBvbmx5IG1lYW5zIHNvbWV0aGluZyBpbiB3b3JsZHMgd2l0aCBhdG9taWMsXG4gICAgICAvLyBpbW11dGFibGUgZGVwbG95bWVudHMgKGUuZy4gVmVyY2VsKSwgd2hpY2ggaW1wbGVtZW50XG4gICAgICAvLyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCkuIFdvcmxkcyB3aXRob3V0IHRoYXQgY29uY2VwdCAobG9jYWwgZGV2LFxuICAgICAgLy8gc2VsZi1ob3N0ZWQgUG9zdGdyZXMpIGhhdmUgbm90aGluZyB0byByZXNvbHZlIGJldHdlZW4sIHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBmYWlsIGEgcnVuIHRoYXQgd29ya3MgZmluZSBvbiBWZXJjZWwsIHdlIHdhcm4gYW5kIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGN1cnJlbnQgZGVwbG95bWVudCDigJQgbWFraW5nICdsYXRlc3QnIGFuIGVmZmVjdGl2ZSBuby1vcCB0aGVyZS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICh3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKSB7XG4gICAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdhcm4gb25jZSBwZXIgcHJvY2VzcyDigJQgc2VlIGhhc1dhcm5lZExhdGVzdE5vT3AgYWJvdmUuXG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRMYXRlc3ROb09wKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRMYXRlc3ROb09wID0gdHJ1ZTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgXCJkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIGhhcyBubyBlZmZlY3QgaW4gdGhpcyB3b3JsZCBhbmQgd2FzIGlnbm9yZWQuIFwiICtcbiAgICAgICAgICAgICAgICAnSXQgaXMgb25seSBzdXBwb3J0ZWQgYnkgd29ybGRzIHdpdGggYXRvbWljIGRlcGxveW1lbnRzLCBzdWNoIGFzIFZlcmNlbC4gJyArXG4gICAgICAgICAgICAgICAgJ1RoZSBydW4gd2lsbCB0YXJnZXQgdGhlIGN1cnJlbnQgZGVwbG95bWVudC4nLFxuICAgICAgICAgICAgICB7IGN1cnJlbnREZXBsb3ltZW50SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVwbG95bWVudElkID0gY3VycmVudERlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byB3cml0ZSBieXRlIHN0cmVhbXMgaW4gdGhlIGZyYW1lZCB3aXJlIGZvcm1hdC5cbiAgICAgIC8vIEZvciBzYW1lLWRlcGxveW1lbnQgc3RhcnRzICh0aGUgY29tbW9uIGNhc2UpIHdlIGtub3cgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gcnVubmluZyB0aGlzIHNhbWUgU0RLIHZlcnNpb24sIHNvIGZyYW1pbmcgaXMgc2FmZS4gRm9yIGNyb3NzLVxuICAgICAgLy8gZGVwbG95bWVudCBzdGFydHMgKGV4cGxpY2l0IGRlcGxveW1lbnRJZCBvciAnbGF0ZXN0JyB0aGF0IHJlc29sdmVzXG4gICAgICAvLyB0byBhIGRpZmZlcmVudCBkZXBsb3ltZW50KSB3ZSBwcm9iZSB0aGUgdGFyZ2V0IHZpYSBoZWFsdGhDaGVjayB0b1xuICAgICAgLy8gbGVhcm4gaXRzIHdvcmtmbG93LWNvcmUgdmVyc2lvbiwgdGhlbiBkZXJpdmUgdGhlIGNhcGFiaWxpdHkuIFRoZVxuICAgICAgLy8gcHJvYmUgaGFzIGEgdGlnaHQgdGltZW91dCDigJQgb24gbWlzcy9mYWlsdXJlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGxlZ2FjeSByYXcgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIHVuaXZlcnNhbGx5IHJlYWRhYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIFdvcmxkcyB0aGF0IGRvbid0IGV4cG9zZSB0aGUgc3RyZWFtLXJlYWRpbmcgQVBJIChlLmcuIG1pbmltYWwgdGVzdFxuICAgICAgLy8gbW9ja3MpIGNhbid0IHNlcnZpY2UgaGVhbHRoIGNoZWNrcywgc28gd2Ugc2tpcCB0aGUgcHJvYmUgZm9yIHRoZW0uXG4gICAgICBsZXQgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSBjdXJyZW50RGVwbG95bWVudElkKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdvcmxkLnJlYWRGcm9tU3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGhlYWx0aENoZWNrKHdvcmxkLCAnd29ya2Zsb3cnLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgIHRpbWVvdXQ6IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgICAgICAgICBwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICApLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBydW5JZCBjbGllbnQtc2lkZSBzbyB3ZSBoYXZlIGl0IGJlZm9yZSBzZXJpYWxpemF0aW9uXG4gICAgICAvLyAocmVxdWlyZWQgZm9yIGZ1dHVyZSBFMkUgZW5jcnlwdGlvbiB3aGVyZSBydW5JZCBpcyBwYXJ0IG9mIHRoZSBlbmNyeXB0aW9uIGNvbnRleHQpXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7dWxpZCgpfWA7XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIFVzZSB3b3JsZC1kZWNsYXJlZCBzcGVjVmVyc2lvbiB3aGVuIGF2YWlsYWJsZSAob3VyIHdvcmxkcyBzZXQgdGhpcyksXG4gICAgICAvLyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBzYWZlIGJhc2VsaW5lIHRoYXQgY29tbXVuaXR5IHdvcmxkcyBoYW5kbGUuXG4gICAgICAvLyBDb21tdW5pdHkgd29ybGRzIGJ1aWx0IGFnYWluc3Qgb2xkZXIgQHdvcmtmbG93L3dvcmxkIHJlamVjdCBydW5zIHdpdGhcbiAgICAgIC8vIHNwZWNWZXJzaW9uID4gdGhlaXIgU1BFQ19WRVJTSU9OX0NVUlJFTlQgdmlhIHJlcXVpcmVzTmV3ZXJXb3JsZCgpLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPVxuICAgICAgICBvcHRzLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIHdvcmxkLnNwZWNWZXJzaW9uID8/XG4gICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19FVkVOVF9TT1VSQ0lORztcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDcmVhdGUgcnVuIHZpYSBydW5fY3JlYXRlZCBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAvLyBQYXNzIGNsaWVudC1nZW5lcmF0ZWQgcnVuSWQgLSBzZXJ2ZXIgd2lsbCBhY2NlcHQgYW5kIHVzZSBpdFxuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAuLi4oc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCDigJQgdGhlIHJ1biB3YXMgbm90IGVucXVldWVkXG4gICAgICBpZiAocXVldWVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGV2ZW50cy5jcmVhdGUgcmVzdWx0XG4gICAgICBsZXQgcmVzaWxpZW50U3RhcnQgPSBmYWxzZTtcbiAgICAgIGlmIChydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICBjb25zdCBlcnIgPSBydW5DcmVhdGVkUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIC8vIDQwOTogVGhlIHJ1biBhbHJlYWR5IGV4aXN0cy4gVGhpcyBjYW4gaGFwcGVuIGluIGV4dHJlbWUgY2FzZXMgd2hlcmVcbiAgICAgICAgICAvLyB0aGUgcnVuIGNyZWF0aW9uIGNhbGwgZ2V0cyBhIGNvbGQgc3RhcnQgb3Igb3RoZXIgc2xvd2Rvd24sIGFuZCB0aGUgcXVldWVcbiAgICAgICAgICAvLyArIHJ1bl9zdGFydGVkIGNhbGwgY29tcGxldGVzIGZhc3Rlci4gV2UgZXhwZWN0IHRoaXMgdG8gYmUgPD0xJSBvZiBjYXNlcy5cbiAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiBzYWZlbHkgcmV0dXJuLlxuICAgICAgICB9IGVsc2UgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgLy8gNDI5IChUaHJvdHRsZUVycm9yKSwgNXh4LCBhbmQgdHJhbnNpZW50IHRyYW5zcG9ydCBmYWlsdXJlc1xuICAgICAgICAgIC8vIChUUkFOU1BPUlQvVElNRU9VVCkgYXJlIHJldHJ5YWJsZSDigJQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZVxuICAgICAgICAgIC8vIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGJ5IHRoZSBydW50aW1lIHdoZW4gaXQgY2FsbHNcbiAgICAgICAgICAvLyBydW5fc3RhcnRlZC5cbiAgICAgICAgICByZXNpbGllbnRTdGFydCA9IHRydWU7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1J1biBjcmVhdGlvbiBldmVudCBmYWlsZWQsIGJ1dCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlLiAnICtcbiAgICAgICAgICAgICAgJ1RoZSBydW5fY3JlYXRlZCBldmVudCB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBydW5DcmVhdGVkUmVzdWx0LnZhbHVlO1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcnVuIHdhcyBjcmVhdGVkXG4gICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyAncnVuJyBpbiBzZXJ2ZXIgcmVzcG9uc2UgZm9yICdydW5fY3JlYXRlZCcgZXZlbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgc2VydmVyIGFjY2VwdGVkIG91ciBydW5JZFxuICAgICAgICBpZiAoIXYxQ29tcGF0ICYmIHJlc3VsdC5ydW4ucnVuSWQgIT09IHJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFNlcnZlciByZXR1cm5lZCBkaWZmZXJlbnQgcnVuSWQgdGhhbiByZXF1ZXN0ZWQ6IGV4cGVjdGVkICR7cnVuSWR9LCBnb3QgJHtyZXN1bHQucnVuLnJ1bklkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIGFyZ3VtZW50LXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZSBwcm9taXNlXG4gICAgICAvLyBoYW5kZWQgdG8gd2FpdFVudGlsIG11c3QgbmV2ZXIgcmVqZWN0IChhbiB1bmNvbnN1bWVkIHdhaXRVbnRpbFxuICAgICAgLy8gcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSwgc28gdW5leHBlY3RlZFxuICAgICAgLy8gZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnQmFja2dyb3VuZCBmbHVzaCBvZiB3b3JrZmxvdyBhcmd1bWVudCBzdHJlYW1zIGZhaWxlZCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRGVwbG95bWVudElkKGRlcGxveW1lbnRJZCksXG4gICAgICAgIC4uLihydW5DcmVhdGVkUmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW5cbiAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1bi5zdGF0dXMpXG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBSdW48VFJlc3VsdD4ocnVuSWQsIHsgcmVzaWxpZW50U3RhcnQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/step-handler.ts"],"names":[],"mappings":"AA+5BA;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CACC,CAAC"}
|