@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
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { EntityConflictError, FatalError, HookNotFoundError, PreconditionFailedError, RunExpiredError, WorkflowWorldError, } from '@workflow/errors';
|
|
1
|
+
import { EntityConflictError, FatalError, HookNotFoundError, PreconditionFailedError, RunExpiredError, SerializationError, WorkflowWorldError, } from '@workflow/errors';
|
|
2
2
|
import { AttributeValidationError, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, } from '@workflow/world';
|
|
3
3
|
import { isRetryableWorldError } from '../classify-error.js';
|
|
4
4
|
import { importKey } from '../encryption.js';
|
|
5
5
|
import { runtimeLogger } from '../logger.js';
|
|
6
|
-
import {
|
|
6
|
+
import { GUEST_CODE_EXECUTION_SAMPLE_LIMIT, } from '../serialization/hardened.js';
|
|
7
|
+
import { dehydrateStepArguments, dehydrateStepError, } from '../serialization.js';
|
|
7
8
|
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
8
9
|
import { getAbortStreamIdFromToken } from '../util.js';
|
|
9
10
|
import { COMPUTE_INSTANCE_ID } from './compute-instance.js';
|
|
10
11
|
import { getMaxInlineSteps, isBatchTransitionsEnabled, isResilientStepDispatchEnabled, MAX_BATCH_FANOUT_EVENTS, MAX_RESILIENT_STEP_INPUT_BYTES, } from './constants.js';
|
|
11
12
|
import { absorbSkippedSlotReport, maxEventSlot, queueMessage, slotSnapshotParams, stepDispatchIdempotencyKey, } from './helpers.js';
|
|
12
13
|
import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
|
|
14
|
+
import { unserializableStepInputPlaceholder } from './unserializable-step.js';
|
|
13
15
|
async function createHookEvent({ runId, hookEvent, queueItem, requestId, createEvent, }) {
|
|
14
16
|
try {
|
|
15
17
|
const result = await createEvent(hookEvent, {
|
|
@@ -60,7 +62,7 @@ async function createHookEvent({ runId, hookEvent, queueItem, requestId, createE
|
|
|
60
62
|
}
|
|
61
63
|
/**
|
|
62
64
|
* Handles a workflow suspension by processing all pending operations (hooks, steps, waits).
|
|
63
|
-
* Creates events for all operations but does NOT queue step messages
|
|
65
|
+
* Creates events for all operations but does NOT queue step messages; returns the pending
|
|
64
66
|
* steps so the caller can decide which to execute inline vs queue to background.
|
|
65
67
|
*
|
|
66
68
|
* Processing order:
|
|
@@ -83,7 +85,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
83
85
|
await runReadyBarrier;
|
|
84
86
|
}
|
|
85
87
|
catch {
|
|
86
|
-
// intentional: ordering barrier only
|
|
88
|
+
// intentional: ordering barrier only, see above.
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
91
|
};
|
|
@@ -95,8 +97,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
95
97
|
* in flight. That matters for a 412: the caller reacts by reloading the event
|
|
96
98
|
* log and restarting the replay, so a sibling create that lands after the
|
|
97
99
|
* rejection escaped commits an event whose correlation id came from the
|
|
98
|
-
* abandoned replay's seeded sequence
|
|
99
|
-
* produces
|
|
100
|
+
* abandoned replay's seeded sequence (an event the fresh replay never
|
|
101
|
+
* produces), and it races the restart's reload while doing so. Settling first
|
|
100
102
|
* makes this phase's write set final before the caller acts on the failure.
|
|
101
103
|
* It mirrors the runtime's inline step claim, which settles the in-flight
|
|
102
104
|
* step executions before escalating a 412.
|
|
@@ -123,7 +125,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
123
125
|
// Adds the optimistic-concurrency guard when the caller supplied a loaded
|
|
124
126
|
// event log; without one it creates directly (callers with no replay
|
|
125
127
|
// snapshot, e.g. tests). A stale (412) rejection propagates to the caller,
|
|
126
|
-
// which restarts the replay from a corrected log
|
|
128
|
+
// which restarts the replay from a corrected log. It is not retried here,
|
|
127
129
|
// because the event's correlation id was minted by *this* replay's seeded
|
|
128
130
|
// sequence, so re-committing it against a corrected log would persist an
|
|
129
131
|
// event no correct replay produces.
|
|
@@ -139,8 +141,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
139
141
|
});
|
|
140
142
|
// Bump-and-report: the write landed above the slot it asked for, so the
|
|
141
143
|
// report holds the events it was decided without. Absorbing here rather
|
|
142
|
-
// than at each call site means the rest of this phase's writes
|
|
143
|
-
// the same array to build their own snapshot
|
|
144
|
+
// than at each call site means the rest of this phase's writes (which read
|
|
145
|
+
// the same array to build their own snapshot) ask for a slot above them,
|
|
144
146
|
// and the replay that resumes from this log sees them without a reload.
|
|
145
147
|
const report = absorbSkippedSlotReport(log.events, result);
|
|
146
148
|
reportedEvents += report.added;
|
|
@@ -163,23 +165,23 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
163
165
|
return result;
|
|
164
166
|
};
|
|
165
167
|
// Separate queue items by type
|
|
166
|
-
const stepItems = suspension.
|
|
167
|
-
const allHookItems = suspension.
|
|
168
|
-
const waitItems = suspension.
|
|
169
|
-
const attributeItems = suspension.
|
|
168
|
+
const stepItems = suspension.items.filter((item) => item.type === 'step');
|
|
169
|
+
const allHookItems = suspension.items.filter((item) => item.type === 'hook');
|
|
170
|
+
const waitItems = suspension.items.filter((item) => item.type === 'wait');
|
|
171
|
+
const attributeItems = suspension.items.filter((item) => item.type === 'attribute');
|
|
170
172
|
const hooksNeedingCreation = allHookItems.filter((item) => !item.hasCreatedEvent);
|
|
171
173
|
// Group hook items that need work by token, preserving queue-insertion
|
|
172
174
|
// (workflow code) order within each token. Operations on one token must
|
|
173
175
|
// apply in code order: a dispose() of an earlier hook releases the token
|
|
174
|
-
// before a later same-token hook's creation is validated
|
|
176
|
+
// before a later same-token hook's creation is validated (otherwise the
|
|
175
177
|
// new hook records a spurious hook_conflict against the run's own
|
|
176
|
-
// disposed hook
|
|
178
|
+
// disposed hook), while a hook created and disposed within the same
|
|
177
179
|
// suspension is still created before it is disposed. Different tokens
|
|
178
180
|
// have no claim interaction, so token groups are processed in parallel.
|
|
179
181
|
const hookItemsByToken = new Map();
|
|
180
182
|
for (const item of allHookItems) {
|
|
181
183
|
if (item.hasCreatedEvent && !item.disposed) {
|
|
182
|
-
continue; // already committed and still live
|
|
184
|
+
continue; // already committed and still live: nothing to do
|
|
183
185
|
}
|
|
184
186
|
const group = hookItemsByToken.get(item.token);
|
|
185
187
|
if (group) {
|
|
@@ -194,6 +196,21 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
194
196
|
const encryptionKey = rawKey ? await importKey(rawKey) : undefined;
|
|
195
197
|
// Gate payload compression on the run's specVersion.
|
|
196
198
|
const compression = (run.specVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION;
|
|
199
|
+
let serializationBlockerCount = 0;
|
|
200
|
+
const serializationBlockers = [];
|
|
201
|
+
async function dehydrateInput(value, context) {
|
|
202
|
+
const stats = { executions: [] };
|
|
203
|
+
try {
|
|
204
|
+
return (await dehydrateStepArguments(value, runId, encryptionKey, suspension.globalThis, false, compression, stats));
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
serializationBlockerCount +=
|
|
208
|
+
stats.totalExecutions ?? stats.executions.length;
|
|
209
|
+
serializationBlockers.push(...stats.executions
|
|
210
|
+
.slice(0, GUEST_CODE_EXECUTION_SAMPLE_LIMIT - serializationBlockers.length)
|
|
211
|
+
.map((execution) => ({ ...context, ...execution })));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
197
214
|
async function disposeHook(queueItem) {
|
|
198
215
|
const hookDisposedEvent = {
|
|
199
216
|
eventType: 'hook_disposed',
|
|
@@ -208,7 +225,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
208
225
|
}
|
|
209
226
|
catch (err) {
|
|
210
227
|
if (EntityConflictError.is(err)) {
|
|
211
|
-
// Hook was already disposed by a concurrent invocation
|
|
228
|
+
// Hook was already disposed by a concurrent invocation, safe to skip
|
|
212
229
|
runtimeLogger.info('Hook already disposed, skipping duplicate disposal', {
|
|
213
230
|
workflowRunId: runId,
|
|
214
231
|
correlationId: queueItem.correlationId,
|
|
@@ -236,7 +253,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
236
253
|
}
|
|
237
254
|
}
|
|
238
255
|
// Process hooks first to prevent race conditions with webhook receivers.
|
|
239
|
-
// Track any hook conflicts that occur
|
|
256
|
+
// Track any hook conflicts that occur: these are returned to the caller
|
|
240
257
|
// so the V2 handler can re-invoke immediately.
|
|
241
258
|
let hasHookConflict = false;
|
|
242
259
|
let hasAwaitedHookCreation = false;
|
|
@@ -250,7 +267,10 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
250
267
|
if (!queueItem.hasCreatedEvent) {
|
|
251
268
|
const hookMetadata = typeof queueItem.metadata === 'undefined'
|
|
252
269
|
? undefined
|
|
253
|
-
:
|
|
270
|
+
: await dehydrateInput(queueItem.metadata, {
|
|
271
|
+
source: 'hook_metadata',
|
|
272
|
+
correlationId: queueItem.correlationId,
|
|
273
|
+
});
|
|
254
274
|
const hookEvent = {
|
|
255
275
|
eventType: 'hook_created',
|
|
256
276
|
specVersion: SPEC_VERSION_CURRENT,
|
|
@@ -284,14 +304,20 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
284
304
|
}));
|
|
285
305
|
hookCreationMs = Date.now() - hookPhaseStart;
|
|
286
306
|
}
|
|
287
|
-
// Process abort requests
|
|
307
|
+
// Process abort requests: resume the hook with abort payload and write stream packet
|
|
288
308
|
const hooksNeedingAbort = allHookItems.filter((item) => item.abortRequested && !item.disposed);
|
|
289
309
|
if (hooksNeedingAbort.length > 0) {
|
|
290
310
|
await ensureRunReady();
|
|
291
311
|
await settlePhase(hooksNeedingAbort.map(async (queueItem) => {
|
|
292
312
|
try {
|
|
293
313
|
// Dehydrate the abort payload for storage
|
|
294
|
-
const abortPayload = await
|
|
314
|
+
const abortPayload = await dehydrateInput({
|
|
315
|
+
aborted: true,
|
|
316
|
+
reason: queueItem.abortReason,
|
|
317
|
+
}, {
|
|
318
|
+
source: 'hook_abort',
|
|
319
|
+
correlationId: queueItem.correlationId,
|
|
320
|
+
});
|
|
295
321
|
// Create hook_received event with abort payload
|
|
296
322
|
await createGuarded({
|
|
297
323
|
eventType: 'hook_received',
|
|
@@ -315,7 +341,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
315
341
|
await world.streams.close(runId, streamName);
|
|
316
342
|
}
|
|
317
343
|
catch {
|
|
318
|
-
// Best-effort stream write
|
|
344
|
+
// Best-effort stream write: hook event provides the durable fallback
|
|
319
345
|
runtimeLogger.debug('Failed to write abort stream packet, hook event will provide fallback', {
|
|
320
346
|
workflowRunId: runId,
|
|
321
347
|
correlationId: queueItem.correlationId,
|
|
@@ -337,7 +363,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
337
363
|
}));
|
|
338
364
|
}
|
|
339
365
|
// Create step events for steps that don't have them yet.
|
|
340
|
-
// Unlike V1, we do NOT queue step messages from here
|
|
366
|
+
// Unlike V1, we do NOT queue step messages from here: the caller
|
|
341
367
|
// decides which steps to execute inline vs. queue to background.
|
|
342
368
|
// Wait events are also created in parallel below.
|
|
343
369
|
const stepsNeedingCreation = new Set(stepItems
|
|
@@ -345,29 +371,121 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
345
371
|
.map((queueItem) => queueItem.correlationId));
|
|
346
372
|
// Correlation IDs for which THIS suspension call actually wrote the
|
|
347
373
|
// step_created event. Populated by the ops below after a successful
|
|
348
|
-
// events.create
|
|
374
|
+
// events.create, used by the caller to claim ownership and avoid
|
|
349
375
|
// racing with concurrent handlers on step execution.
|
|
350
376
|
const createdStepCorrelationIds = new Set();
|
|
351
|
-
//
|
|
352
|
-
//
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
377
|
+
// Correlation IDs of steps finalized as failed because their arguments
|
|
378
|
+
// refused to serialize: see finalizeUnserializableStep below.
|
|
379
|
+
const failedStepCorrelationIds = new Set();
|
|
380
|
+
/**
|
|
381
|
+
* A step whose arguments fail to serialize is deterministic: every replay
|
|
382
|
+
* re-derives the same unserializable value, so redelivering the
|
|
383
|
+
* orchestrator message can never succeed. Instead of rejecting the whole
|
|
384
|
+
* suspension (which fails the run from the outside, where no user code can
|
|
385
|
+
* observe it), treat it exactly like a step-body failure: write
|
|
386
|
+
* `step_created` with a placeholder input (every World requires the step
|
|
387
|
+
* entity to exist before a terminal step event, and the real input is
|
|
388
|
+
* precisely what refused to serialize) followed by `step_failed` carrying
|
|
389
|
+
* the SerializationError. The next replay rejects the step's promise with
|
|
390
|
+
* it, so a try/catch around the step call observes the error; uncaught, it
|
|
391
|
+
* propagates out of the workflow body and fails the run as a USER_ERROR,
|
|
392
|
+
* without burning queue redeliveries either way.
|
|
393
|
+
*/
|
|
394
|
+
const finalizeUnserializableStep = async (queueItem, error) => {
|
|
395
|
+
runtimeLogger.warn('Step arguments failed to serialize; failing the step so the ' +
|
|
396
|
+
'workflow can observe the error', {
|
|
397
|
+
workflowRunId: runId,
|
|
398
|
+
correlationId: queueItem.correlationId,
|
|
399
|
+
stepName: queueItem.stepName,
|
|
400
|
+
error: error.message,
|
|
401
|
+
});
|
|
402
|
+
await ensureRunReady();
|
|
403
|
+
// Marker placeholder (not empty args): byte-identical-to-zero-args would
|
|
404
|
+
// make `workflow inspect steps` show "no arguments" for the one step
|
|
405
|
+
// whose entire problem was its arguments.
|
|
406
|
+
const placeholderInput = (await dehydrateStepArguments(unserializableStepInputPlaceholder(), runId, encryptionKey, suspension.globalThis, false, compression));
|
|
407
|
+
try {
|
|
408
|
+
await createGuarded({
|
|
409
|
+
eventType: 'step_created',
|
|
410
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
411
|
+
correlationId: queueItem.correlationId,
|
|
412
|
+
eventData: {
|
|
413
|
+
stepName: queueItem.stepName,
|
|
414
|
+
workflowName: run.workflowName,
|
|
415
|
+
input: placeholderInput,
|
|
416
|
+
},
|
|
417
|
+
}, { requestId });
|
|
418
|
+
}
|
|
419
|
+
catch (createErr) {
|
|
420
|
+
if (EntityConflictError.is(createErr)) {
|
|
421
|
+
// A concurrent handler already created the step: the failure is
|
|
422
|
+
// deterministic, so it is racing toward the same step_failed below.
|
|
423
|
+
runtimeLogger.info('Step already exists, continuing', {
|
|
424
|
+
workflowRunId: runId,
|
|
425
|
+
correlationId: queueItem.correlationId,
|
|
426
|
+
message: createErr.message,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
else if (RunExpiredError.is(createErr)) {
|
|
430
|
+
// Run already finished: nothing to observe the failure.
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
throw createErr;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
try {
|
|
438
|
+
await createGuarded({
|
|
439
|
+
eventType: 'step_failed',
|
|
440
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
441
|
+
correlationId: queueItem.correlationId,
|
|
442
|
+
eventData: {
|
|
443
|
+
stepName: queueItem.stepName,
|
|
444
|
+
// The error itself is a plain WorkflowError (name, message with
|
|
445
|
+
// framed hint, cause chain), serializable even though the step
|
|
446
|
+
// input was not. Error detection is realm-independent
|
|
447
|
+
// (types.isNativeError), so the host-created error serializes
|
|
448
|
+
// the same under either global; the VM global is passed for
|
|
449
|
+
// consistency with every other dehydration in this file and so
|
|
450
|
+
// any VM-realm values guest code threw into the cause chain
|
|
451
|
+
// (getters/proxies executed during the failed dehydration) are
|
|
452
|
+
// detected by the realm-sensitive reducers.
|
|
453
|
+
error: await dehydrateStepError(error, runId, encryptionKey, [], suspension.globalThis, compression),
|
|
454
|
+
},
|
|
455
|
+
}, { requestId });
|
|
456
|
+
}
|
|
457
|
+
catch (failErr) {
|
|
458
|
+
if (EntityConflictError.is(failErr) || RunExpiredError.is(failErr)) {
|
|
459
|
+
// Step already terminal (a concurrent handler wrote the same
|
|
460
|
+
// deterministic failure) or the run already finished.
|
|
461
|
+
runtimeLogger.info('Tried failing step, but step or run has already finished.', {
|
|
462
|
+
workflowRunId: runId,
|
|
463
|
+
correlationId: queueItem.correlationId,
|
|
464
|
+
message: failErr.message,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
throw failErr;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
failedStepCorrelationIds.add(queueItem.correlationId);
|
|
472
|
+
// Release the inline slot bookkeeping: the step never runs, so it must
|
|
473
|
+
// not appear in the rebuilt `lazyInlineSteps`. (Its slot in the first-N
|
|
474
|
+
// selection and in `inlinePairFoldEligible`'s arithmetic was consumed
|
|
475
|
+
// before dehydration could reveal the failure, inherent to selecting
|
|
476
|
+
// before serializing, and bounded to one wasted slot on a pass that
|
|
477
|
+
// ends in a forced replay anyway.)
|
|
478
|
+
lazyInlineCorrelationIds.delete(queueItem.correlationId);
|
|
479
|
+
};
|
|
362
480
|
// Lazy inline start: defer the step_created write for up to
|
|
363
481
|
// `getMaxInlineSteps()` steps the caller will run inline (in parallel). Each
|
|
364
482
|
// step is created on the fly by the lazy `step_started` executeStep sends
|
|
365
483
|
// (saving a round-trip per step). We never defer when a `hook.getConflict()`
|
|
366
484
|
// awaiter is present, because in that case the caller executes nothing inline
|
|
367
485
|
// (it re-invokes immediately to resolve the awaiter), so deferring would
|
|
368
|
-
// leave the steps uncreated and unqueued. We pick the first N uncreated
|
|
369
|
-
//
|
|
370
|
-
// input here so executeStep can ship it as the step_started payload.
|
|
486
|
+
// leave the steps uncreated and unqueued. We pick the first N uncreated
|
|
487
|
+
// steps (matching the caller's inline-candidate selection) and dehydrate
|
|
488
|
+
// their input here so executeStep can ship it as the step_started payload.
|
|
371
489
|
const lazyInlineCorrelationIds = new Set(hasAwaitedHookCreation === false
|
|
372
490
|
? stepItems
|
|
373
491
|
.filter((item) => stepsNeedingCreation.has(item.correlationId))
|
|
@@ -387,13 +505,13 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
387
505
|
// Resilient step dispatch eligibility, shared by every step op below (the
|
|
388
506
|
// per-step input-size check is applied inside the op). All must hold:
|
|
389
507
|
//
|
|
390
|
-
// - The caller provided a dispatch target (`stepDispatch`)
|
|
508
|
+
// - The caller provided a dispatch target (`stepDispatch`): terminal
|
|
391
509
|
// drains and other create-only callers never queue.
|
|
392
510
|
// - The feature is enabled (`WORKFLOW_RESILIENT_STEP_DISPATCH` opt-in).
|
|
393
511
|
// It is off by default because the publish races the create's verdict,
|
|
394
512
|
// and a create can come back refused: as a duplicate the replay should
|
|
395
|
-
// stop pursuing, or
|
|
396
|
-
// than report what it missed
|
|
513
|
+
// stop pursuing, or (on a World that would rather refuse a stale write
|
|
514
|
+
// than report what it missed) as a 412. Either way the queue message
|
|
397
515
|
// carrying the payload is already out, and the consumer can materialize a
|
|
398
516
|
// step whose create was refused. Nothing orders that verdict before the
|
|
399
517
|
// consumer's redelivery re-ensure, so no backend-side revocation
|
|
@@ -409,8 +527,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
409
527
|
// Batched fan-out: fold this suspension's step_created + wait_created
|
|
410
528
|
// writes into one `events.createBatch` call (one durable write, per-event
|
|
411
529
|
// outcomes) instead of one write per event. Engages only for a CLEAN
|
|
412
|
-
// fan-out
|
|
413
|
-
//
|
|
530
|
+
// fan-out (no attribute writes, no hook writes, no resilient dispatch
|
|
531
|
+
// whose creates are each paired with a queue publish) on a World that
|
|
414
532
|
// implements the optional method and a run whose events are slot-numbered.
|
|
415
533
|
// Everything outside the gate keeps the single-event path byte-for-byte.
|
|
416
534
|
const batchFanoutEligible = isBatchTransitionsEnabled() &&
|
|
@@ -430,14 +548,14 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
430
548
|
const batchPreps = [];
|
|
431
549
|
// Pre-claimed inline pairs: fold each lazy-inline step's deferred
|
|
432
550
|
// `step_created` (carrying its input) AND its `step_started` claim (bare,
|
|
433
|
-
// ownership-stamped) into the batch, so the whole fan-out
|
|
434
|
-
// steps' claims included
|
|
551
|
+
// ownership-stamped) into the batch, so the whole fan-out (the inline
|
|
552
|
+
// steps' claims included) commits in the one durable write and the caller
|
|
435
553
|
// starts the bodies straight off that commit instead of posting one claim
|
|
436
554
|
// per inline step. The lone-inline case (nothing else to batch with) is
|
|
437
555
|
// excluded: a pair-only batch costs the same round trip as the single lazy
|
|
438
556
|
// claim while giving up the optimistic claim/body overlap and the
|
|
439
557
|
// bump-and-report that `createGuarded` provides, so it stays on the lazy
|
|
440
|
-
// path. Requires the caller's `ownerMessageId
|
|
558
|
+
// path. Requires the caller's `ownerMessageId`: the started row must
|
|
441
559
|
// stamp ownership exactly like the lazy claim it replaces (and a caller
|
|
442
560
|
// that does not inline-execute never provides one).
|
|
443
561
|
const uncreatedWaitCount = waitItems.filter((item) => !item.hasCreatedEvent).length;
|
|
@@ -461,8 +579,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
461
579
|
};
|
|
462
580
|
// Producer-side resilient recovery count for the suspension span attribute.
|
|
463
581
|
let resilientDispatchRecovered = 0;
|
|
464
|
-
// Steps: create step_created events (no queuing
|
|
465
|
-
// to caller
|
|
582
|
+
// Steps: create step_created events (no queuing, V2 returns pending steps
|
|
583
|
+
// to caller, EXCEPT on the resilient dispatch path, which parallelizes the
|
|
466
584
|
// create with the step's queue publish and reports it in
|
|
467
585
|
// `queuedStepCorrelationIds`).
|
|
468
586
|
let batchOrderCounter = 0;
|
|
@@ -470,24 +588,46 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
470
588
|
if (stepsNeedingCreation.has(queueItem.correlationId)) {
|
|
471
589
|
// Deterministic position in the batched fold (assigned in stepItems
|
|
472
590
|
// order, before the concurrent dehydration runs). A pair-folded inline
|
|
473
|
-
// step occupies two consecutive positions
|
|
474
|
-
// row
|
|
591
|
+
// step occupies two consecutive positions (created row then started
|
|
592
|
+
// row), which the flush keeps adjacent and never splits across chunks,
|
|
475
593
|
// so a World can fold them into one born-running create.
|
|
476
594
|
const pairFolded = inlinePairFoldEligible &&
|
|
477
595
|
lazyInlineCorrelationIds.has(queueItem.correlationId);
|
|
478
596
|
const stepOrder = batchOrderCounter;
|
|
479
597
|
batchOrderCounter += pairFolded ? 2 : 1;
|
|
480
598
|
const stepOp = (async () => {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
599
|
+
let dehydratedInput;
|
|
600
|
+
try {
|
|
601
|
+
dehydratedInput = await dehydrateInput({
|
|
602
|
+
args: queueItem.args,
|
|
603
|
+
closureVars: queueItem.closureVars,
|
|
604
|
+
thisVal: queueItem.thisVal,
|
|
605
|
+
}, {
|
|
606
|
+
source: 'step_input',
|
|
607
|
+
correlationId: queueItem.correlationId,
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
catch (err) {
|
|
611
|
+
if (!SerializationError.is(err)) {
|
|
612
|
+
// e.g. RuntimeDecryptionError: an SDK fault, not a user value
|
|
613
|
+
// problem. Keep its identity (RUNTIME_ERROR) and current
|
|
614
|
+
// fail-the-suspension behavior.
|
|
615
|
+
throw err;
|
|
616
|
+
}
|
|
617
|
+
if (!stepDispatch) {
|
|
618
|
+
// No dispatch target means no replay will observe a
|
|
619
|
+
// finalization: this is the terminal drain (or a create-only
|
|
620
|
+
// test caller). The run is already completing/failing, so
|
|
621
|
+
// writing step_created + step_failed here would leave e.g. a
|
|
622
|
+
// COMPLETED run carrying a failed step nothing can ever
|
|
623
|
+
// observe, reading as a bug from the dashboard. Rethrow
|
|
624
|
+
// instead; the drain's own catch swallows it, preserving its
|
|
625
|
+
// pre-existing behavior (no rows for the unawaited step).
|
|
626
|
+
throw err;
|
|
627
|
+
}
|
|
628
|
+
await finalizeUnserializableStep(queueItem, err);
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
491
631
|
// Deferred (lazy) inline step: skip the step_created write — the
|
|
492
632
|
// caller's inline executeStep will send a lazy step_started carrying
|
|
493
633
|
// this input, and the world creates the step (entity + synthetic
|
|
@@ -498,13 +638,13 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
498
638
|
lazyInlineByCorrelationId.set(queueItem.correlationId, {
|
|
499
639
|
correlationId: queueItem.correlationId,
|
|
500
640
|
stepName: queueItem.stepName,
|
|
501
|
-
dehydratedInput
|
|
641
|
+
dehydratedInput,
|
|
502
642
|
});
|
|
503
643
|
if (pairFolded) {
|
|
504
644
|
// Enqueue the pair the deferral would otherwise leave to the
|
|
505
645
|
// caller's lazy `step_started`: the created row carries the
|
|
506
646
|
// input (payloads ride creates in a batch), the started row is
|
|
507
|
-
// bare and stamps this invocation's ownership
|
|
647
|
+
// bare and stamps this invocation's ownership, the same claim
|
|
508
648
|
// shape the lazy start would have sent, settled by the batch.
|
|
509
649
|
batchQueue.push({
|
|
510
650
|
order: stepOrder,
|
|
@@ -551,7 +691,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
551
691
|
},
|
|
552
692
|
};
|
|
553
693
|
// Resilient step dispatch: fire the step_created write and the
|
|
554
|
-
// step-execution queue publish in parallel
|
|
694
|
+
// step-execution queue publish in parallel: the message carries the
|
|
555
695
|
// same serialized input (`stepInput`) so the consumer can
|
|
556
696
|
// idempotently re-ensure the event if the direct write failed
|
|
557
697
|
// transiently. Mirrors the resilient start (`runInput`) and
|
|
@@ -575,10 +715,10 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
575
715
|
stepInput: { input: dehydratedInput },
|
|
576
716
|
},
|
|
577
717
|
// Same key as the caller's dispatch pass and any concurrent
|
|
578
|
-
// handler's
|
|
718
|
+
// handler's, so redundant publishes for this step dedupe. The
|
|
579
719
|
// key is step-identity-scoped so a revoked message for a
|
|
580
720
|
// reassigned correlation id cannot absorb the corrected
|
|
581
|
-
// schedule's dispatch
|
|
721
|
+
// schedule's dispatch: see stepDispatchIdempotencyKey.
|
|
582
722
|
{
|
|
583
723
|
idempotencyKey: stepDispatchIdempotencyKey(queueItem.correlationId, queueItem.stepName),
|
|
584
724
|
}),
|
|
@@ -587,7 +727,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
587
727
|
// the message the step would rely on the create alone, and if the
|
|
588
728
|
// create ALSO failed there would be no durable record at all.
|
|
589
729
|
// Propagating redelivers the orchestrator message, which
|
|
590
|
-
// re-creates the (idempotent) step_created and re-dispatches
|
|
730
|
+
// re-creates the (idempotent) step_created and re-dispatches,
|
|
591
731
|
// the same recovery as the sequential path.
|
|
592
732
|
if (queueResult.status === 'rejected') {
|
|
593
733
|
throw queueResult.reason;
|
|
@@ -596,7 +736,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
596
736
|
if (createResult.status === 'rejected') {
|
|
597
737
|
const err = createResult.reason;
|
|
598
738
|
if (EntityConflictError.is(err)) {
|
|
599
|
-
// Concurrent handler wrote it first
|
|
739
|
+
// Concurrent handler wrote it first, same as the sequential
|
|
600
740
|
// path. The step message is already out; a duplicate publish
|
|
601
741
|
// by that handler dedupes on the shared idempotency key.
|
|
602
742
|
runtimeLogger.info('Step already exists, continuing', {
|
|
@@ -607,8 +747,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
607
747
|
}
|
|
608
748
|
else if (isRetryableWorldError(err)) {
|
|
609
749
|
// Resilient: the write failed transiently (429 / 5xx /
|
|
610
|
-
// transport) but the step message
|
|
611
|
-
// serialized input
|
|
750
|
+
// transport) but the step message (carrying the same
|
|
751
|
+
// serialized input) was published, so the consumer
|
|
612
752
|
// idempotently re-ensures the step_created before executing.
|
|
613
753
|
resilientDispatchRecovered++;
|
|
614
754
|
runtimeLogger.warn('Step creation event write failed, but the step was ' +
|
|
@@ -664,7 +804,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
664
804
|
if (batchFanoutEligible) {
|
|
665
805
|
// The flush op waits for every prep before committing; a prep that
|
|
666
806
|
// rejected already surfaces through `ops`, so the flush's own wait
|
|
667
|
-
// swallows it and commits whatever was successfully enqueued
|
|
807
|
+
// swallows it and commits whatever was successfully enqueued,
|
|
668
808
|
// preserving today's per-op independence.
|
|
669
809
|
batchPreps.push(stepOp.catch(() => { }));
|
|
670
810
|
}
|
|
@@ -682,7 +822,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
682
822
|
},
|
|
683
823
|
};
|
|
684
824
|
if (batchFanoutEligible) {
|
|
685
|
-
// Waits need no dehydration, so they enqueue synchronously
|
|
825
|
+
// Waits need no dehydration, so they enqueue synchronously, after
|
|
686
826
|
// every step's order slot, preserving steps-then-waits scheduling
|
|
687
827
|
// order in the log.
|
|
688
828
|
batchQueue.push({
|
|
@@ -714,20 +854,20 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
714
854
|
}
|
|
715
855
|
}
|
|
716
856
|
// The batched fold's flush: the clean fan-out commits through
|
|
717
|
-
// `createBatch` in chunks of MAX_BATCH_FANOUT_EVENTS
|
|
857
|
+
// `createBatch` in chunks of MAX_BATCH_FANOUT_EVENTS, all chunks IN
|
|
718
858
|
// FLIGHT CONCURRENTLY. Slot assignment is the server's, so parallel
|
|
719
859
|
// chunks race for slot ranges exactly like the pre-fold path's parallel
|
|
720
860
|
// single writes did; entity conditions, not commit order, carry
|
|
721
861
|
// correctness (sibling fan-out events have no cross-order the replay
|
|
722
|
-
// depends on
|
|
862
|
+
// depends on; it matches by correlation id). Each event reports the
|
|
723
863
|
// outcome its own single create would have had: a 409 is the same
|
|
724
864
|
// already-exists tolerance as the single path, anything else fails the
|
|
725
865
|
// delivery the way a single-path rejection would.
|
|
726
866
|
//
|
|
727
867
|
// Latency shape: only the chunk carrying the pre-claimed inline pairs
|
|
728
868
|
// gates the handler's return (the caller starts bodies off its claims).
|
|
729
|
-
// Every other chunk's commit
|
|
730
|
-
// which fire the moment ITS creates are durable
|
|
869
|
+
// Every other chunk's commit (and every chunk's step-message publishes,
|
|
870
|
+
// which fire the moment ITS creates are durable) rides
|
|
731
871
|
// `deferredBatchWork` when the caller opted in, joined before ack. A slow
|
|
732
872
|
// sibling chunk therefore delays neither the inline bodies nor another
|
|
733
873
|
// chunk's queue messages, while publish-after-create still holds per
|
|
@@ -747,7 +887,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
747
887
|
await ensureRunReady();
|
|
748
888
|
// A batch of ONE gains nothing over the single write (same round
|
|
749
889
|
// trip) and loses the slot-snapshot params + bump-and-report that
|
|
750
|
-
// createGuarded provides
|
|
890
|
+
// createGuarded provides, so a lone eager event takes the ordinary
|
|
751
891
|
// single path, with the same conflict tolerance and ownership
|
|
752
892
|
// bookkeeping it would have had without the fold.
|
|
753
893
|
if (entries.length === 1) {
|
|
@@ -775,8 +915,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
775
915
|
return;
|
|
776
916
|
}
|
|
777
917
|
// Seed for the foreign-interleaving diagnostic below. With chunks
|
|
778
|
-
// committing in parallel there is no per-chunk "expected next slot"
|
|
779
|
-
//
|
|
918
|
+
// committing in parallel there is no per-chunk "expected next slot";
|
|
919
|
+
// the whole fold's committed span is compared against the seed
|
|
780
920
|
// once every chunk has settled: committed slots are dense per the
|
|
781
921
|
// World's invariant, so any excess of (max committed slot − seed +
|
|
782
922
|
// 1) over the fold's own committed count is events OTHER writers
|
|
@@ -785,8 +925,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
785
925
|
? (maxEventSlot(eventLog.events) ?? 0) + 1
|
|
786
926
|
: undefined;
|
|
787
927
|
// Pair-aware chunking: a pre-claimed pair's two rows must land in
|
|
788
|
-
// the same createBatch call
|
|
789
|
-
// into one born-running create
|
|
928
|
+
// the same createBatch call (adjacent, so a World can fold them
|
|
929
|
+
// into one born-running create) and never straddle a chunk
|
|
790
930
|
// boundary, which would turn the started row into a standalone
|
|
791
931
|
// claim racing its own create's commit.
|
|
792
932
|
const chunks = [];
|
|
@@ -815,7 +955,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
815
955
|
}
|
|
816
956
|
// Steps whose queue messages THIS FLUSH will publish (the eager
|
|
817
957
|
// creates), recorded before any chunk settles so the caller's
|
|
818
|
-
// dispatch pass
|
|
958
|
+
// dispatch pass (which runs off the handler's return) skips them.
|
|
819
959
|
// The sends are guaranteed-or-failed by the trailing work the
|
|
820
960
|
// caller joins before acking, so "will be published by this flush"
|
|
821
961
|
// and "already published" are equivalent from the caller's side.
|
|
@@ -834,7 +974,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
834
974
|
const commitChunk = async (chunk) => {
|
|
835
975
|
// Anchors for the pre-claimed steps' telemetry: the POST instant
|
|
836
976
|
// is the claim's "start POST sent" (RSFS's end), the return is the
|
|
837
|
-
// claim's completion (TTR's T6)
|
|
977
|
+
// claim's completion (TTR's T6), the same two instants the lazy
|
|
838
978
|
// claim's own POST would have produced.
|
|
839
979
|
const batchPostSentAtMs = Date.now();
|
|
840
980
|
// biome-ignore lint/style/noNonNullAssertion: batchFanoutEligible implies presence
|
|
@@ -863,7 +1003,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
863
1003
|
// readback entity is authoritative where present; a World
|
|
864
1004
|
// that omitted it gets the same locally synthesized running
|
|
865
1005
|
// attempt-1 the optimistic path executes against. Either
|
|
866
|
-
// way the input is re-attached locally
|
|
1006
|
+
// way the input is re-attached locally: batch responses
|
|
867
1007
|
// return refs lazily, and the body's hydration wants the
|
|
868
1008
|
// exact bytes the pair's created row carried. (The created
|
|
869
1009
|
// row's success is deliberately NOT membership in
|
|
@@ -913,12 +1053,12 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
913
1053
|
entry.kind === 'inline-started') {
|
|
914
1054
|
// The pair lost its atomic create-claim: a concurrent writer
|
|
915
1055
|
// already owns this step (an earlier delivery's create, or a
|
|
916
|
-
// racing handler's claim). Recorded as a lost claim
|
|
1056
|
+
// racing handler's claim). Recorded as a lost claim: the
|
|
917
1057
|
// caller's executeStep returns `skipped` without running the
|
|
918
1058
|
// body, the same outcome as losing the lazy claim. A World
|
|
919
1059
|
// that folds the pair reports the 409 on both rows (set
|
|
920
1060
|
// twice, harmless); one that evaluates rows independently
|
|
921
|
-
// has the started row
|
|
1061
|
+
// has the started row (processed second) decide, which is
|
|
922
1062
|
// exactly the single path's semantics (create lost + claim
|
|
923
1063
|
// won still runs the body; create won + claim lost skips).
|
|
924
1064
|
inlineClaims.set(entry.correlationId, { owned: false });
|
|
@@ -960,7 +1100,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
960
1100
|
}
|
|
961
1101
|
};
|
|
962
1102
|
// Publish the chunk's eager steps' queue messages the moment ITS
|
|
963
|
-
// creates are durable
|
|
1103
|
+
// creates are durable, the per-chunk half of publish-after-create.
|
|
964
1104
|
// Same message shape and step-identity-scoped idempotency key as the
|
|
965
1105
|
// caller's dispatch pass, so anything double-published dedupes.
|
|
966
1106
|
const publishChunkSteps = async (chunk) => {
|
|
@@ -1030,7 +1170,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1030
1170
|
// `step_started` that would race this same fold's still-in-flight
|
|
1031
1171
|
// pair for the same step. Today pairs always land in one chunk
|
|
1032
1172
|
// (they sort first, and two rows per inline step fit inside one
|
|
1033
|
-
// chunk
|
|
1173
|
+
// chunk, pinned by constants.test.ts), so this is at most one
|
|
1034
1174
|
// commit; the filter is what keeps the property true if either cap
|
|
1035
1175
|
// moves.
|
|
1036
1176
|
const pairCommits = chunks.flatMap((chunk, index) => chunk.some((entry) => entry.kind === 'inline-started')
|
|
@@ -1040,7 +1180,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1040
1180
|
// The trailing work is the caller's to join before ack. Attach a
|
|
1041
1181
|
// handler now so a rejection that races that join (or a foreground
|
|
1042
1182
|
// failure that prevents the caller from ever reaching it) is never
|
|
1043
|
-
// an unhandledRejection
|
|
1183
|
+
// an unhandledRejection; awaiting the promise still observes it.
|
|
1044
1184
|
trailing.catch(() => { });
|
|
1045
1185
|
deferredBatchWork = trailing;
|
|
1046
1186
|
// Only the pair chunks gate the return: their claims are what the
|
|
@@ -1053,7 +1193,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1053
1193
|
}
|
|
1054
1194
|
catch (err) {
|
|
1055
1195
|
// A pair chunk failed, so this phase's write set is NOT the
|
|
1056
|
-
// caller's to join any more
|
|
1196
|
+
// caller's to join any more: `deferredBatchWork` never
|
|
1057
1197
|
// reaches it once handleSuspension throws. Settle the rest
|
|
1058
1198
|
// before the rejection escapes, for the reason `settlePhase`
|
|
1059
1199
|
// gives: a sibling create landing after the throw commits an
|
|
@@ -1076,7 +1216,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1076
1216
|
// Guarded like every other suspension write: an attr_set is a
|
|
1077
1217
|
// replay-derived event with a correlation id from this replay's
|
|
1078
1218
|
// seeded sequence, so it must not land on a log the replay never
|
|
1079
|
-
// saw. Rejecting it is cheap
|
|
1219
|
+
// saw. Rejecting it is cheap: a run with attribute events already
|
|
1080
1220
|
// forces an in-process replay, so the restart costs the replay it
|
|
1081
1221
|
// was going to do anyway.
|
|
1082
1222
|
await createGuarded({
|
|
@@ -1101,7 +1241,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1101
1241
|
});
|
|
1102
1242
|
}
|
|
1103
1243
|
else if (isWorldValidationFailure(err)) {
|
|
1104
|
-
// Deterministic validation rejection from the World
|
|
1244
|
+
// Deterministic validation rejection from the World, e.g. the
|
|
1105
1245
|
// cumulative per-run attribute cap, which only the World can
|
|
1106
1246
|
// check against the run's existing attributes. Redelivering the
|
|
1107
1247
|
// orchestrator message replays the workflow into the exact same
|
|
@@ -1127,16 +1267,6 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1127
1267
|
// message is not acked and VQS redelivers, re-creates the (idempotent)
|
|
1128
1268
|
// step_created and re-dispatches, and recovers the run instead of orphaning it.
|
|
1129
1269
|
await settlePhase(ops);
|
|
1130
|
-
// The step-input dehydrations above have settled, so the sink is final.
|
|
1131
|
-
const retainedStepInputsSafe = guestCodeStats.executions.length === 0;
|
|
1132
|
-
if (!retainedStepInputsSafe) {
|
|
1133
|
-
runtimeLogger.debug('Serializing step inputs executed workflow code; falling back to replay instead of retaining the VM', {
|
|
1134
|
-
workflowRunId: runId,
|
|
1135
|
-
executions: guestCodeStats.executions
|
|
1136
|
-
.slice(0, 5)
|
|
1137
|
-
.map((e) => (e.detail ? `${e.kind}(${e.detail})` : e.kind)),
|
|
1138
|
-
});
|
|
1139
|
-
}
|
|
1140
1270
|
// Rebuild the inline batch in deterministic order. `lazyInlineCorrelationIds`
|
|
1141
1271
|
// is a Set seeded from the ordered first-N slice, so iterating it preserves
|
|
1142
1272
|
// stepItems order; every id in it was set by the lazy branch above.
|
|
@@ -1165,6 +1295,9 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1165
1295
|
...Attribute.WorkflowStepsCreated(stepItems.length),
|
|
1166
1296
|
...Attribute.WorkflowHooksCreated(hooksNeedingCreation.length),
|
|
1167
1297
|
...Attribute.WorkflowWaitsCreated(waitItems.length),
|
|
1298
|
+
...(failedStepCorrelationIds.size > 0
|
|
1299
|
+
? Attribute.WorkflowStepsFailedSerialization(failedStepCorrelationIds.size)
|
|
1300
|
+
: {}),
|
|
1168
1301
|
...(resilientDispatchRecovered > 0
|
|
1169
1302
|
? Attribute.StepResilientDispatchRecovered(resilientDispatchRecovered)
|
|
1170
1303
|
: {}),
|
|
@@ -1172,6 +1305,7 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1172
1305
|
return {
|
|
1173
1306
|
pendingSteps: stepItems,
|
|
1174
1307
|
createdStepCorrelationIds,
|
|
1308
|
+
failedStepCorrelationIds,
|
|
1175
1309
|
queuedStepCorrelationIds,
|
|
1176
1310
|
lazyInlineSteps,
|
|
1177
1311
|
inlineClaims,
|
|
@@ -1185,7 +1319,8 @@ export async function handleSuspension({ suspension, world, run, span, requestId
|
|
|
1185
1319
|
hasAttributeEvents: attributeItems.length > 0,
|
|
1186
1320
|
hasHookEvents: hooksNeedingCreation.length > 0,
|
|
1187
1321
|
hookCreationMs,
|
|
1188
|
-
|
|
1322
|
+
serializationBlockerCount,
|
|
1323
|
+
serializationBlockers,
|
|
1189
1324
|
reportedEventCount: reportedEvents,
|
|
1190
1325
|
};
|
|
1191
1326
|
}
|
|
@@ -1206,4 +1341,4 @@ function isWorldValidationFailure(err) {
|
|
|
1206
1341
|
}
|
|
1207
1342
|
return WorkflowWorldError.is(err) && err.status === 400;
|
|
1208
1343
|
}
|
|
1209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx3QkFBd0IsRUFLeEIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxFQUMxQyxpQ0FBaUMsRUFDakMsbUNBQW1DLEdBTXBDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsOEJBQThCLEVBQzlCLHVCQUF1QixFQUN2Qiw4QkFBOEIsR0FDL0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBR3ZCLFlBQVksRUFDWixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLDBCQUEwQixHQUMzQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQThOdkUsS0FBSyxVQUFVLGVBQWUsQ0FBQyxF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LEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgdHlwZSBTZXJpYWxpemVkRGF0YSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbiAgdHlwZSBTdGFydGVkU3RlcCxcbiAgdHlwZSBUcmFjZUNhcnJpZXIsXG4gIHR5cGUgVmFsaWRRdWV1ZU5hbWUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEd1ZXN0Q29kZVN0YXRzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9oYXJkZW5lZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4gfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMsXG4gIE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIHR5cGUgRXZlbnRDcmVhdG9yLFxuICB0eXBlIExvYWRlZEV2ZW50TG9nLFxuICBtYXhFdmVudFNsb3QsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFByZWNsYWltZWRJbmxpbmVTdGFydCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMge1xuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb247XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuOiBXb3JrZmxvd1J1bjtcbiAgc3Bhbj86IFNwYW47XG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50IGxvZy4gRXZlcnkgZXZlbnQgY3JlYXRpb24gdGhpcyBzdXNwZW5zaW9uIG1ha2VzXG4gICAqIG5hbWVzIHRoZSBwb3NpdGlvbiBpdCB3YXMgZGVyaXZlZCBmcm9tLCBzbyBhIGJhY2tlbmQgdGhhdCBoYXMgcmVjb3JkZWRcbiAgICogZXZlbnRzIHRoZSByZXBsYXkgZGlkIG5vdCBzZWUgY2FuIHJlcG9ydCB0aGVtIGJhY2sgb24gdGhlIHdyaXRlIOKAlCBvciwgaWZcbiAgICogaXQgd291bGQgcmF0aGVyIHJlZnVzZSB0aGFuIHJlcG9ydCwgcmVqZWN0IGl0IHdpdGggYSA0MTIuIEEgcmVqZWN0aW9uIGlzXG4gICAqIG5vdCByZXRyaWVkIGhlcmU6IHRoZSBldmVudCdzIGNvcnJlbGF0aW9uIGlkIHdhcyBtaW50ZWQgYnkgKnRoaXMqIHJlcGxheSdzXG4gICAqIHNlZWRlZCBzZXF1ZW5jZSwgc28gcmUtY29tbWl0dGluZyBpdCBhZ2FpbnN0IGEgY29ycmVjdGVkIGxvZyB3b3VsZCBwZXJzaXN0XG4gICAqIGFuIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IHByb2R1Y2VzLiBUaGUgY2FsbGVyIHJlc3RhcnRzIHRoZSByZXBsYXlcbiAgICogaW5zdGVhZC5cbiAgICovXG4gIGV2ZW50TG9nPzogTG9hZGVkRXZlbnRMb2c7XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKHRoZSBydW4gZXhpc3RzKS4gV2hlbiBwcmVzZW50LCBldmVyeSB3b3JsZCB3cml0ZVxuICAgKiB0aGlzIHN1c3BlbnNpb24gcGVyZm9ybXMgKGBob29rX2NyZWF0ZWRgLCBgd2FpdF9jcmVhdGVkYCwgZWFnZXIgb3ZlcmZsb3dcbiAgICogYHN0ZXBfY3JlYXRlZGAsIOKApikgaXMgZ2F0ZWQgb24gaXQgc28gdGhlIHdyaXRlIG5ldmVyIHJhY2VzIGFoZWFkIG9mIHRoZVxuICAgKiBydW4ncyBjcmVhdGlvbi4gVGhlIHB1cmUgaW5saW5lIGhvdCBwYXRoIGRlZmVycyBhbGwgb2YgaXRzIHN0ZXBzIGFuZCB3cml0ZXNcbiAgICogbm90aGluZyBoZXJlLCBzbyBpdCBuZXZlciBhd2FpdHMgdGhpcyBiYXJyaWVyLiBgdW5kZWZpbmVkYCBvdXRzaWRlIHR1cmJvLFxuICAgKiB3aGVyZSBgcnVuX3N0YXJ0ZWRgIHdhcyBhbHJlYWR5IGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICAvKiogT25lLXNob3QgdGVsZW1ldHJ5IHJlcG9ydGVyLCBhY3RpdmF0ZWQgb25seSBhZnRlciByZXBsYXkgaGFzIHJlY292ZXJlZC4gKi9cbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcj86IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXI7XG4gIC8qKlxuICAgKiBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogd2hlbiBwcm92aWRlZCAoYW5kIHRoZSBwZXItc3RlcCBlbGlnaWJpbGl0eSBnYXRlc1xuICAgKiBwYXNzIOKAlCBzZWUgdGhlIHN0ZXAgb3BzIGJlbG93KSwgZWFjaCBuZXdseSBjcmVhdGVkIG5vbi1pbmxpbmUgc3RlcCdzXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIGlzIHBhcmFsbGVsaXplZCB3aXRoIGl0cyBzdGVwLWV4ZWN1dGlvbiBxdWV1ZVxuICAgKiBwdWJsaXNoLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UgY2FycmllcyB0aGUgc2VyaWFsaXplZCBzdGVwIGlucHV0XG4gICAqIChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhbiBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGVcbiAgICogZGlyZWN0IHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseS4gU3RlcHMgcXVldWVkIHRoaXMgd2F5IGFyZSByZXBvcnRlZCBpblxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQucXVldWVkU3RlcENvcnJlbGF0aW9uSWRzfSBzbyB0aGUgY2FsbGVyXG4gICAqIHNraXBzIHRoZW0gaW4gaXRzIG93biBkaXNwYXRjaCBwYXNzLiBPbWl0dGVkIGJ5IGNhbGxlcnMgdGhhdCBtdXN0IG5vdFxuICAgKiBxdWV1ZSAodGVybWluYWwgZHJhaW4sIHRlc3RzKSDigJQgY3JlYXRlcyB0aGVuIGJlaGF2ZSBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICovXG4gIHN0ZXBEaXNwYXRjaD86IHtcbiAgICAvKiogVGhlIHVuaWZpZWQgd29ya2Zsb3cgcXVldWUgdGhpcyBydW4ncyBzdGVwIG1lc3NhZ2VzIGFyZSBwdWJsaXNoZWQgdG8uICovXG4gICAgcXVldWVOYW1lOiBWYWxpZFF1ZXVlTmFtZTtcbiAgICAvKipcbiAgICAgKiBMYXppbHkgcmVzb2x2ZXMgdGhlIHRyYWNlIGNhcnJpZXIgdG8gc3RhbXAgb24gdGhlIHN0ZXAgbWVzc2FnZXMuXG4gICAgICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgc3VzcGVuc2lvbiAobWVtb2l6ZWQgaGVyZSkuXG4gICAgICovXG4gICAgZ2V0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFRyYWNlQ2Fycmllcj47XG4gIH07XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogc3VzcGVuc2lvbiBydW5zIGluICh0aGUgcXVldWUgaGFuZGxlcidzIG1ldGEpLiBXaGVuIHByZXNlbnQgQU5EIHRoZVxuICAgKiBiYXRjaGVkIGZhbi1vdXQgZW5nYWdlcywgdGhlIGxhenktaW5saW5lIHN0ZXBzJyBkZWZlcnJlZCB3cml0ZXMgYXJlXG4gICAqIGZvbGRlZCBpbnRvIHRoZSBiYXRjaCBhcyBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXJzIOKAlCB0aGVcbiAgICogc3RhcnRlZCByb3cgc3RhbXBlZCB3aXRoIHRoaXMgSUQsIGV4YWN0bHkgbGlrZSB0aGUgbGF6eSBjbGFpbSBpdFxuICAgKiByZXBsYWNlcyDigJQgcHJlLWNsYWltaW5nIHRoZSBzdGVwcyB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHJ1biBpbmxpbmUuIFNlZVxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zfS4gQ2FsbGVycyB0aGF0IG5ldmVyXG4gICAqIGlubGluZS1leGVjdXRlICh0ZXJtaW5hbCBkcmFpbikgb21pdCBpdCwga2VlcGluZyB0aGVpciBsYXp5IHN0ZXBzIG9uIHRoZVxuICAgKiBwbGFpbiBkZWZlcnJlZCBwYXRoLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXQgcmV0dXJuIGJlZm9yZSBldmVyeSBjaHVuayBoYXMgY29tbWl0dGVkOiBvbmx5XG4gICAqIHRoZSBjaHVuayBjYXJyeWluZyB0aGUgcHJlLWNsYWltZWQgaW5saW5lIHBhaXJzIGdhdGVzIHRoZSBoYW5kbGVyJ3NcbiAgICogcmV0dXJuIChpdHMgY2xhaW1zIGFyZSB3aGF0IHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBmcm9tKSwgd2hpbGUgdGhlXG4gICAqIHRyYWlsaW5nIGNodW5rcycgY29tbWl0cyDigJQgYW5kIGV2ZXJ5IGNodW5rJ3MgaW4tZmx1c2ggc3RlcC1tZXNzYWdlXG4gICAqIHB1Ymxpc2hlcyDigJQgcmlkZSB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmt9LiBBXG4gICAqIGNhbGxlciB0aGF0IG9wdHMgaW4gTVVTVCBhd2FpdCB0aGF0IHByb21pc2UgYmVmb3JlIGFja2luZyBpdHMgZGVsaXZlcnk6XG4gICAqIHRoZSBkdXJhYmlsaXR5IGNvbnRyYWN0IChcImV2ZXJ5IGNyZWF0ZSBkdXJhYmxlIGJlZm9yZSBhY2tcIikgbW92ZXMgZnJvbVxuICAgKiB0aGUgaGFuZGxlcidzIHJldHVybiB0byB0aGF0IGpvaW4sIGFuZCBub3RoaW5nIGVsc2UgcmUtZHJpdmVzIGEgbG9zdFxuICAgKiB0cmFpbGluZyBjaHVuay4gQ2FsbGVycyB0aGF0IGRvbid0IG9wdCBpbiAodGVybWluYWwgZHJhaW4sIGRlZmF1bHQpXG4gICAqIGtlZXAgdGhlIGV2ZXJ5dGhpbmctZHVyYWJsZS1hdC1yZXR1cm4gYmVoYXZpb3IuXG4gICAqL1xuICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgaGFuZGxpbmcgYSBzdXNwZW5zaW9uLiBSZXR1cm5zIHBlbmRpbmcgc3RlcCBpdGVtcyBzbyB0aGUgY2FsbGVyXG4gKiBjYW4gZGVjaWRlIHdoaWNoIHRvIGV4ZWN1dGUgaW5saW5lIHZzIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQge1xuICAvKiogUGVuZGluZyBzdGVwIGl0ZW1zIHdpdGggZXZlbnRzIGNyZWF0ZWQgYnV0IE5PVCBxdWV1ZWQgKi9cbiAgcGVuZGluZ1N0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCB0aGlzIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IChhcyBvcHBvc2VkIHRvIGNhdGNoaW5nIEVudGl0eUNvbmZsaWN0RXJyb3IgYmVjYXVzZVxuICAgKiBhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCkuIE9ubHkgdGhlIGhhbmRsZXIgdGhhdCB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IHNob3VsZCBxdWV1ZSAvIGlubGluZS1leGVjdXRlIHRoZSBzdGVwIOKAlCB0aGlzXG4gICAqIGd1YXJhbnRlZXMgYSBzaW5nbGUgb3duZXIgcGVyIHN0ZXAsIGV2ZW4gd2hlbiBtdWx0aXBsZSBoYW5kbGVycyByYWNlXG4gICAqIGludG8gdGhlIHNhbWUgYmF0Y2ggYm91bmRhcnkuXG4gICAqL1xuICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB0aGlzIHN1c3BlbnNpb24gY2FsbCBhbHJlYWR5IHB1Ymxpc2hlZFxuICAgKiBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBtZXNzYWdlcyBmb3IsIHZpYSByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCAodGhlXG4gICAqIGBzdGVwX2NyZWF0ZWRgIHdyaXRlIHBhcmFsbGVsaXplZCB3aXRoIGEgYHN0ZXBJbnB1dGAtY2FycnlpbmcgcXVldWVcbiAgICogcHVibGlzaCkuIFRoZSBjYWxsZXIgTVVTVCBOT1QgZGlzcGF0Y2ggdGhlc2UgYWdhaW4g4oCUIHRoZSBtZXNzYWdlIGlzXG4gICAqIGFscmVhZHkgb3V0IChhIGR1cGxpY2F0ZSB3b3VsZCBiZSBkZWR1cGVkIGJ5IGl0cyBpZGVtcG90ZW5jeSBrZXksIGJ1dFxuICAgKiBjb3N0cyBhIHdhc3RlZCByb3VuZC10cmlwKS4gRW1wdHkgd2hlbiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMuc3RlcERpc3BhdGNofVxuICAgKiB3YXMgbm90IHByb3ZpZGVkIG9yIG5vIHN0ZXAgd2FzIGVsaWdpYmxlLlxuICAgKi9cbiAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGV2ZW50cyB0aGlzIHBoYXNlJ3Mgd3JpdGVzIHJlcG9ydGVkIGJhY2sgYXMgb2NjdXB5aW5nIHNsb3RzIHRoZXlcbiAgICogc2tpcHBlZCBvdmVyLCBhbHJlYWR5IG1lcmdlZCBpbnRvIHRoZSBjYWxsZXIncyBgZXZlbnRMb2cuZXZlbnRzYC4gTm9uemVyb1xuICAgKiBtZWFucyB0aGUgYXJyYXkgd2FzIHJlb3JkZXJlZCB0byByZXN0b3JlIHNsb3Qgb3JkZXIsIHNvIGFueSBpbmRleCB0aGVcbiAgICogY2FsbGVyIGNhY2hlZCBpbnRvIGl0IChwYXlsb2FkIHByZXdhcm0gc2NhbiBwb3NpdGlvbikgaXMgc3RhbGUuXG4gICAqL1xuICByZXBvcnRlZEV2ZW50Q291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzdGVwcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCB3cml0ZXMgd2VyZSBpbnRlbnRpb25hbGx5IGRlZmVycmVkIHNvIHRoZVxuICAgKiBjYWxsZXIgY2FuIHJ1biB0aGVtIGlubGluZSB2aWEgbGF6eSBgc3RlcF9zdGFydGVkYCBldmVudHMgKHdoaWNoIGNyZWF0ZVxuICAgKiB0aGUgc3RlcCBvbiB0aGUgZmx5KSwgc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gVXAgdG9cbiAgICogYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIGFyZSBkZWZlcnJlZDsgdGhlIGNhbGxlciBydW5zIHRoZW0gaW5saW5lIGluXG4gICAqIHBhcmFsbGVsIGFuZCBxdWV1ZXMgdGhlIHJlc3QuIEVtcHR5IHdoZW4gbm8gc3RlcCB3YXMgZGVmZXJyZWQgKG5vdGhpbmdcbiAgICogcGVuZGluZywgb3IgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIGlzIHByZXNlbnQgc28gbm90aGluZyBpc1xuICAgKiBleGVjdXRlZCBpbmxpbmUpLiBUaGUgY2FsbGVyIHBhc3NlcyBlYWNoIGBkZWh5ZHJhdGVkSW5wdXRgIHN0cmFpZ2h0IHRvXG4gICAqIGBleGVjdXRlU3RlcGAsIHdoaWNoIHNlbmRzIGl0IGFzIHRoZSBgc3RlcF9zdGFydGVkYCBwYXlsb2FkLiBUaGUgYXRvbWljXG4gICAqIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBgc3RlcF9zdGFydGVkYCBpcyB0aGUgZXhhY3RseS1vbmUtb3duZXIgZ2F0ZSB0aGF0XG4gICAqIHRoZSBzdGFuZGFsb25lIGBzdGVwX2NyZWF0ZWRgIHByb3ZpZGVkIGJlZm9yZTogdGhlIGxvc2VyIG9mIHRoZSByYWNlIGdldHNcbiAgICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgc2tpcHBlZGAgYW5kIGRvZXMgbm90IHJ1biB0aGUgYm9keS5cbiAgICovXG4gIGxhenlJbmxpbmVTdGVwczogQXJyYXk8e1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgIGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gIH0+O1xuICAvKipcbiAgICogUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0cywgYnkgY29ycmVsYXRpb24gaWQ6IHRoZSBwZXItc3RlcCB2ZXJkaWN0cyBvZlxuICAgKiB0aGUgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlycyB0aGUgYmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZFxuICAgKiBmb3IgdGhlIGxhenktaW5saW5lIHN0ZXBzLiBBIHN0ZXAgd2l0aCBhbiBlbnRyeSBoZXJlIGlzIHBhc3NlZCB0b1xuICAgKiBgZXhlY3V0ZVN0ZXBgIGFzIGBwcmVjbGFpbWVkU3RhcnRgIElOU1RFQUQgb2YgYGxhenlTdGVwSW5wdXRgIOKAlCBpdHNcbiAgICogaW5wdXQgYWxyZWFkeSByb2RlIHRoZSBwYWlyLCBhbmQgdGhlIGNsYWltIGlzIHNldHRsZWQ6IGBvd25lZDogdHJ1ZWBcbiAgICogY2FycmllcyB0aGUgc3RhcnRlZCBhdHRlbXB0LTEgZW50aXR5IChpbnB1dCByZS1hdHRhY2hlZCkgc28gdGhlIGJvZHlcbiAgICogcnVucyBzdHJhaWdodCBvZmYgdGhlIGJhdGNoIGNvbW1pdCB3aXRoIG5vIHN0YXJ0IHdyaXRlIG9mIGl0cyBvd247XG4gICAqIGBvd25lZDogZmFsc2VgIGxvc3QgdGhlIHBhaXIncyBhdG9taWMgY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudFxuICAgKiB3cml0ZXIsIGFuZCBleGVjdXRlU3RlcCByZXR1cm5zIGBza2lwcGVkYCB3aXRob3V0IHJ1bm5pbmcgdGhlIGJvZHkg4oCUXG4gICAqIHRoZSBzYW1lIG91dGNvbWUgYXMgbG9zaW5nIHRoZSBsYXp5IGNsYWltLiBFbXB0eSB3aGVuZXZlciB0aGUgZm9sZCBkaWRcbiAgICogbm90IGVuZ2FnZSAoYmF0Y2hpbmcgb2ZmLCBubyBgb3duZXJNZXNzYWdlSWRgLCBvciB0aGUgbG9uZS1pbmxpbmUgY2FzZSxcbiAgICogd2hpY2gga2VlcHMgdGhlIG9wdGltaXN0aWMgbGF6eSBwYXRoIGFuZCBpdHMgY2xhaW0vYm9keSBvdmVybGFwKS5cbiAgICpcbiAgICogQ3Jhc2ggd2luZG93OiB0aGUgcGFpciBjb21taXRzIGJlZm9yZSB0aGUgY2FsbGVyIHJ1bnMgdGhlIGJvZHksIHNvIGFcbiAgICogY3Jhc2ggYmV0d2VlbiB0aGVtIGxlYXZlcyBhIHN0YXJ0ZWQgc3RlcCBzdGFtcGVkIHdpdGggdGhpcyBtZXNzYWdlJ3NcbiAgICogSUQuIFJlZGVsaXZlcnkgb2YgdGhlIHNhbWUgbWVzc2FnZSByZS1leGVjdXRlcyBpdCB2aWEgdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBhdGgg4oCUIHRoZSBleGFjdCBtYWNoaW5lcnkgdGhlIGxhenkgY2xhaW0ncyBjcmFzaCB3aW5kb3cgYWxyZWFkeSB1c2VzLlxuICAgKi9cbiAgaW5saW5lQ2xhaW1zOiBNYXA8c3RyaW5nLCBQcmVjbGFpbWVkSW5saW5lU3RhcnQ+O1xuICAvKipcbiAgICogVGhlIGhpZ2hlc3Qgc2xvdCB0aGUgYmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCwgd2hlbiBpdCByYW4uIFRoZSBiYXRjaCdzXG4gICAqIG93biBldmVudHMgYXJlIG5vdCBpbiB0aGUgY2FsbGVyJ3MgbG9hZGVkIGxvZyAodGhlIG5leHQgcmVsb2FkIHBpY2tzXG4gICAqIHRoZW0gdXApLCBzbyB0aGUgY2FsbGVyIGZvbGRzIHRoaXMgY2VpbGluZyBpbnRvIHRoZSBzbG90IHNuYXBzaG90IGl0XG4gICAqIGhhbmRzIHRoZSBpbmxpbmUgZXhlY3V0aW9ucyDigJQgb3RoZXJ3aXNlIGV2ZXJ5IGlubGluZSB0ZXJtaW5hbCB3cml0ZVxuICAgKiB3b3VsZCBuYW1lIGEgcHJlLWJhdGNoIHBvc2l0aW9uIGFuZCBiZSBhbnN3ZXJlZCB3aXRoIGEgc2tpcHBlZC1zbG90XG4gICAqIHJlcG9ydCBlY2hvaW5nIHRoZSBldmVudHMgdGhpcyBzdXNwZW5zaW9uIGp1c3Qgd3JvdGUuIFVuZGVyXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5hbGxvd0RlZmVycmVkQmF0Y2hXb3JrfSB0aGlzIGNvdmVycyB0aGVcbiAgICogY2h1bmtzIHRoYXQgaGFkIGNvbW1pdHRlZCBieSB0aGUgaGFuZGxlcidzIHJldHVybiAoYWx3YXlzIHRoZSBwYWlyXG4gICAqIGNodW5rKTsgYSB0cmFpbGluZyBjaHVuayB0aGF0IGNvbW1pdHMgbGF0ZXIgaXMgZWNob2VkIGJhY2sgb24gdGhlXG4gICAqIHRlcm1pbmFsIHdyaXRlcyBsaWtlIGFueSBmb3JlaWduIGV2ZW50IOKAlCByZXBvcnRzIHRoZSBleGVjdXRvciByZWFkcyBmb3JcbiAgICogcG9zaXRpb24gYW5kIGRpc2NhcmRzLlxuICAgKlxuICAgKiBTbyB0aGUgZWNobyBpcyBvbmx5IGZ1bGx5IHN1cHByZXNzZWQgZm9yIGEgU0lOR0xFLWNodW5rIGZvbGQuIE9uIGFcbiAgICogbXVsdGktY2h1bmsgZmFuLW91dCB0aGUgYm9kaWVzIHN0YXJ0IG9mZiB0aGUgcGFpciBjaHVuayB3aGlsZSB0cmFpbGluZ1xuICAgKiBjaHVua3MgYXJlIHN0aWxsIGluIGZsaWdodCwgYW5kIGFuIGlubGluZSB0ZXJtaW5hbCB3cml0ZSBpc3N1ZWQgaW4gdGhhdFxuICAgKiB3aW5kb3cgc3RpbGwgbmFtZXMgYSBwb3NpdGlvbiBiZWxvdyB0aGVtIGFuZCBzdGlsbCBkcmF3cyBhIHJlcG9ydCBmb3JcbiAgICogdGhlaXIgZXZlbnRzLiBCb3VuZGVkICh0cmFpbGluZyBjaHVua3Mgb25seSwgbGFyZ2UgZmFuLW91dHMgb25seSkgYW5kXG4gICAqIHNlbGYtY29ycmVjdGluZyBvbiB0aGUgbmV4dCByZWxvYWQg4oCUIHJlY29yZGVkIHNvIGEgcmVwb3J0IHNlZW4gdGhlcmVcbiAgICogcmVhZHMgYXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gYXMgYSBidWcuXG4gICAqL1xuICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGJhdGNoZWQgZmFuLW91dCdzIGRlZmVycmVkIHdvcmssIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWRcbiAgICogaW4gdmlhIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5hbGxvd0RlZmVycmVkQmF0Y2hXb3JrfSBhbmRcbiAgICogdHJhaWxpbmcgd29yayBleGlzdHM6IHRoZSBjb21taXRzIG9mIGV2ZXJ5IGNodW5rIGV4Y2VwdCB0aGUgcGFpciBjaHVuayxcbiAgICogcGx1cyBldmVyeSBjaHVuaydzIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgKGVhY2ggY2hhaW5lZCBvbiBJVFMgT1dOXG4gICAqIGNodW5rJ3MgY29tbWl0LCBzbyBwdWJsaXNoLWFmdGVyLWNyZWF0ZSBob2xkcyBwZXIgc3RlcCkuIFRoZSBjYWxsZXJcbiAgICogTVVTVCBhd2FpdCBpdCBiZWZvcmUgYWNraW5nIOKAlCBhIHJlamVjdGlvbiBoZXJlIGlzIGEgZmFpbGVkIHN1c3BlbnNpb25cbiAgICogd3JpdGUgYW5kIGZhaWxzIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUgYXQgdGhlIGhhbmRsZXInc1xuICAgKiByZXR1cm4uIFN0ZXBzIHdob3NlIG1lc3NhZ2VzIHRoaXMgd29yayBwdWJsaXNoZXMgYXJlIGFscmVhZHkgaW5cbiAgICoge0BsaW5rIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc30gYXQgcmV0dXJuIHRpbWUuXG4gICAqL1xuICBkZWZlcnJlZEJhdGNoV29yaz86IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgc29vbmVzdCBwZW5kaW5nIHdhaXQsIGlmIGFueTogc2Vjb25kcyB1bnRpbCBpdCBlbGFwc2VzIGFuZCB0aGVcbiAgICogY29ycmVsYXRpb25JZCBvZiB0aGUgd2FpdCB0aGF0IHByb2R1Y2VkIHRoYXQgdGltZW91dC4gVGhlXG4gICAqIGNvcnJlbGF0aW9uSWQgc2VlZHMgdGhlIGlkZW1wb3RlbmN5IGtleSBmb3IgdGhlIHdhaXQtY29udGludWF0aW9uXG4gICAqIHF1ZXVlIG1lc3NhZ2Ugc28gdGhhdCByZXBlYXRlZCBzdXNwZW5zaW9uIHBhc3NlcyBvdmVyIHRoZSBzYW1lXG4gICAqIHBlbmRpbmcgd2FpdCBjb2xsYXBzZSBpbnRvIGEgc2luZ2xlIGRlbGF5ZWQgY29udGludWF0aW9uLlxuICAgKi9cbiAgd2FpdFRpbWVvdXQ/OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH07XG4gIC8qKiBXaGV0aGVyIGEgaG9vayBjb25mbGljdCB3YXMgZGV0ZWN0ZWQgKHNob3VsZCByZS1pbnZva2UgaW1tZWRpYXRlbHkpICovXG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIHRoZSB3b3JrZmxvdyB0byBjb250aW51ZSBpbW1lZGlhdGVseSAqL1xuICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBib29sZWFuO1xuICAvKiogV2hldGhlciBuYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyB3ZXJlIHdyaXR0ZW4gZm9yIHJlcGxheS4gKi9cbiAgaGFzQXR0cmlidXRlRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1c3BlbnNpb24gY3JlYXRlZCBhbnkgaG9vayAoYGhvb2tfY3JlYXRlZGApIGV2ZW50cy4gVW5saWtlXG4gICAqIGBoYXNIb29rQ29uZmxpY3RgIC8gYGhhc0F3YWl0ZWRIb29rQ3JlYXRpb25gLCB0aGlzIGlzIHRydWUgZXZlbiBmb3IgYSBwbGFpblxuICAgKiBmaXJlLWFuZC1mb3JnZXQgaG9vayB3aXRoIG5vIGNvbmZsaWN0IGFuZCBubyBhd2FpdGVyLiBUdXJibyBtb2RlIHVzZXMgaXQgdG9cbiAgICogZGV0ZWN0IFwiYSBob29rIHdhcyBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvblwiIGFuZCBzdG9wIGZvcmNpbmcgb3B0aW1pc3RpY1xuICAgKiBpbmxpbmUgc3RhcnQgKGEgaG9vayBpbnRyb2R1Y2VzIGxhdGVyIHJlc3VtZSBpbnZvY2F0aW9ucyB0aGF0IGNvdWxkIHJhY2UpLlxuICAgKi9cbiAgaGFzSG9va0V2ZW50czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyB0aGlzIHN1c3BlbnNpb24ncyBgaG9va19jcmVhdGVkYCBldmVudHNcbiAgICogKDAgd2hlbiBpdCBjcmVhdGVkIG5vbmUpLiBUaGUgY2FsbGVyIGFjY3VtdWxhdGVzIHRoaXMgYWNyb3NzIGl0ZXJhdGlvbnNcbiAgICogYW5kIHN1YnRyYWN0cyBpdCBmcm9tIHRoZSBUVEZTIGxhdGVuY3kgbWVhc3VyZW1lbnQsIHNvIHRpbWUgc3BlbnRcbiAgICogZHVyYWJseSBjcmVhdGluZyB0aGUgdXNlcidzIGhvb2tzIGRvZXNuJ3QgY291bnQgYXMgcnVudGltZSBvdmVyaGVhZC5cbiAgICovXG4gIGhvb2tDcmVhdGlvbk1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlcmlhbGl6aW5nIHRoaXMgc3VzcGVuc2lvbidzIG5ldyBzdGVwIGlucHV0cyB3YXMgcGFzc2l2ZSAoZGlkXG4gICAqIG5vdCBleGVjdXRlIHdvcmtmbG93LW93bmVkIGNvZGUgc3VjaCBhcyBnZXR0ZXJzLCBwcm94eSB0cmFwcywgb3IgY3VzdG9tXG4gICAqIHNlcmlhbGl6ZXJzKS4gYGZhbHNlYCBtZWFucyB0aGUgcmV0YWluZWQgVk0gbWF5IGhhdmUgZGl2ZXJnZWQgZnJvbSB3aGF0XG4gICAqIGEgY29sZCByZXBsYXkgd291bGQgY29tcHV0ZSwgc28gdGhlIGNhbGxlciBtdXN0IGRlbW90ZSB0byByZXBsYXkuXG4gICAqL1xuICByZXRhaW5lZFN0ZXBJbnB1dHNTYWZlOiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVIb29rRXZlbnQoe1xuICBydW5JZCxcbiAgaG9va0V2ZW50LFxuICBxdWV1ZUl0ZW0sXG4gIHJlcXVlc3RJZCxcbiAgY3JlYXRlRXZlbnQsXG59OiB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGhvb2tFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIGNyZWF0ZUV2ZW50OiAoXG4gICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICkgPT4gUHJvbWlzZTxFdmVudFJlc3VsdD47XG59KTogUHJvbWlzZTx7XG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogYm9vbGVhbjtcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChob29rRXZlbnQsIHtcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCByZXR1cm5lZCBhIGhvb2tfY29uZmxpY3QgZXZlbnQgaW5zdGVhZCBvZiBob29rX2NyZWF0ZWQuXG4gICAgLy8gVGhlIGhvb2tfY29uZmxpY3QgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYW5kIHdpbGwgYmUgcmVwbGF5ZWRcbiAgICAvLyBvbiB0aGUgbmV4dCB3b3JrZmxvdyBpbnZvY2F0aW9uLCBjYXVzaW5nIHRoZSBob29rJ3MgcHJvbWlzZSB0byByZWplY3QuXG4gICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogdHJ1ZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vaycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICBgY3JlYXRlSG9vayBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgIHRocm93IGZhdGFsO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgYSB3b3JrZmxvdyBzdXNwZW5zaW9uIGJ5IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoaG9va3MsIHN0ZXBzLCB3YWl0cykuXG4gKiBDcmVhdGVzIGV2ZW50cyBmb3IgYWxsIG9wZXJhdGlvbnMgYnV0IGRvZXMgTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXMg4oCUIHJldHVybnMgdGhlIHBlbmRpbmdcbiAqIHN0ZXBzIHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGljaCB0byBleGVjdXRlIGlubGluZSB2cyBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICpcbiAqIFByb2Nlc3Npbmcgb3JkZXI6XG4gKiAxLiBIb29rcyBhcmUgcHJvY2Vzc2VkIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnNcbiAqIDIuIFN0ZXAgZXZlbnRzIGFuZCB3YWl0IGV2ZW50cyBhcmUgY3JlYXRlZCBpbiBwYXJhbGxlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3VzcGVuc2lvbih7XG4gIHN1c3BlbnNpb24sXG4gIHdvcmxkLFxuICBydW4sXG4gIHNwYW4sXG4gIHJlcXVlc3RJZCxcbiAgZXZlbnRMb2csXG4gIHJ1blJlYWR5QmFycmllcixcbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgc3RlcERpc3BhdGNoLFxuICBvd25lck1lc3NhZ2VJZCxcbiAgYWxsb3dEZWZlcnJlZEJhdGNoV29yayxcbn06IFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zKTogUHJvbWlzZTxTdXNwZW5zaW9uSGFuZGxlclJlc3VsdD4ge1xuICBjb25zdCBydW5JZCA9IHJ1bi5ydW5JZDtcblxuICAvLyBUdXJibyBtb2RlOiBob2xkIGV2ZXJ5IHdvcmxkIHdyaXRlIGJlbG93IHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgKnNldHRsZWQqLCBzbyB3ZSBuZXZlciB3cml0ZSBhIHN0ZXAvaG9vay93YWl0IGV2ZW50IGZvciBhXG4gIC8vIHJ1biB0aGF0IGRvZXMgbm90IGV4aXN0IHlldC4gQSBuby1vcCBvdXRzaWRlIHR1cmJvIChiYXJyaWVyIHVuZGVmaW5lZCkgYW5kXG4gIC8vIG9uIHRoZSBwdXJlIGlubGluZSBob3QgcGF0aCwgd2hpY2ggZGVmZXJzIGFsbCBzdGVwcyBhbmQgd3JpdGVzIG5vdGhpbmcuXG4gIC8vIEF3YWl0aW5nIHRoZSBzYW1lICh1c3VhbGx5IGFscmVhZHktc2V0dGxlZCkgcHJvbWlzZSBtb3JlIHRoYW4gb25jZSBpcyBjaGVhcC5cbiAgLy8gQSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHlcbiAgLy8gZmFpbGVkIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBzdWJzZXF1ZW50IHdyaXRlIHN1cmZhY2VzIHRoZSByZWFsXG4gIC8vIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMuXG4gIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5IOKAlCBzZWUgYWJvdmUuXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBd2FpdCBldmVyeSBvcGVyYXRpb24gaW4gYSBzdXNwZW5zaW9uIHBoYXNlIGJlZm9yZSBsZXR0aW5nIGEgZmFpbHVyZVxuICAgKiBlc2NhcGUsIHByZWZlcnJpbmcgYSBzdGFsZS1zbmFwc2hvdCAoNDEyKSByZWplY3Rpb24gd2hlbiBvbmUgb2NjdXJyZWQuXG4gICAqXG4gICAqIGBQcm9taXNlLmFsbGAgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvcGVyYXRpb24gZG9lcyBhbmQgbGVhdmVzIGl0cyBzaWJsaW5nc1xuICAgKiBpbiBmbGlnaHQuIFRoYXQgbWF0dGVycyBmb3IgYSA0MTI6IHRoZSBjYWxsZXIgcmVhY3RzIGJ5IHJlbG9hZGluZyB0aGUgZXZlbnRcbiAgICogbG9nIGFuZCByZXN0YXJ0aW5nIHRoZSByZXBsYXksIHNvIGEgc2libGluZyBjcmVhdGUgdGhhdCBsYW5kcyBhZnRlciB0aGVcbiAgICogcmVqZWN0aW9uIGVzY2FwZWQgY29tbWl0cyBhbiBldmVudCB3aG9zZSBjb3JyZWxhdGlvbiBpZCBjYW1lIGZyb20gdGhlXG4gICAqIGFiYW5kb25lZCByZXBsYXkncyBzZWVkZWQgc2VxdWVuY2Ug4oCUIGFuIGV2ZW50IHRoZSBmcmVzaCByZXBsYXkgbmV2ZXJcbiAgICogcHJvZHVjZXMg4oCUIGFuZCBpdCByYWNlcyB0aGUgcmVzdGFydCdzIHJlbG9hZCB3aGlsZSBkb2luZyBzby4gU2V0dGxpbmcgZmlyc3RcbiAgICogbWFrZXMgdGhpcyBwaGFzZSdzIHdyaXRlIHNldCBmaW5hbCBiZWZvcmUgdGhlIGNhbGxlciBhY3RzIG9uIHRoZSBmYWlsdXJlLlxuICAgKiBJdCBtaXJyb3JzIHRoZSBydW50aW1lJ3MgaW5saW5lIHN0ZXAgY2xhaW0sIHdoaWNoIHNldHRsZXMgdGhlIGluLWZsaWdodFxuICAgKiBzdGVwIGV4ZWN1dGlvbnMgYmVmb3JlIGVzY2FsYXRpbmcgYSA0MTIuXG4gICAqXG4gICAqIEEgNDEyIGlzIHByZWZlcnJlZCBvdmVyIGFueSBvdGhlciByZWplY3Rpb24gaW4gdGhlIHNhbWUgcGhhc2UgYmVjYXVzZSBpdFxuICAgKiBoYXMgYSBkZWZpbmVkLCBjaGVhcCByZWNvdmVyeSAocmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nKSB3aGlsZSB0aGVcbiAgICogb3RoZXJzIGRvIG5vdC4gQSBkZXRlcm1pbmlzdGljIGZhaWx1cmUgc3VjaCBhcyBhbiBhdHRyaWJ1dGUtdmFsaWRhdGlvblxuICAgKiBgRmF0YWxFcnJvcmAgcmVjdXJzIG9uIHRoZSByZXN0YXJ0IGFuZCBmYWlscyB0aGUgcnVuIHRoZW4sIGF0IHRoZSBjb3N0IG9mXG4gICAqIG9uZSBleHRyYSByZXBsYXkuXG4gICAqL1xuICBjb25zdCBzZXR0bGVQaGFzZSA9IGFzeW5jIChvcHM6IFByb21pc2U8dW5rbm93bj5bXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlYXNvbnMgPSAoYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKG9wcykpXG4gICAgICAuZmlsdGVyKChyKTogciBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT4gci5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAubWFwKChyKSA9PiByLnJlYXNvbik7XG4gICAgaWYgKHJlYXNvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhyb3cgcmVhc29ucy5maW5kKChyKSA9PiBQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhyKSkgPz8gcmVhc29uc1swXTtcbiAgfTtcblxuICAvLyBFdmVyeSBzdXNwZW5zaW9uIHdyaXRlIGNhcnJpZXMgcmVwbGF5LXJlY292ZXJ5IHRlbGVtZXRyeSBvbiB0aGUgZmlyc3Qgb25lXG4gIC8vIHRoYXQgY29tbWl0cyBhZnRlciByZXBsYXkgcmVjb3ZlcmVkLiBBbGwgc3VzcGVuc2lvbiBldmVudHMgYXJlXG4gIC8vIG5vbi1ydW5fY3JlYXRlZCBldmVudHMgb24gdGhpcyBydW4ncyBgcnVuSWRgLlxuICBjb25zdCByZXBvcnRlciA9IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPz8gUmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5pbmVydCgpO1xuICBjb25zdCBjcmVhdGVFdmVudCA9IChkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zKSA9PlxuICAgIHJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShwYXJhbXMsIChwKSA9PlxuICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwgcClcbiAgICApO1xuICAvLyBBZGRzIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IGd1YXJkIHdoZW4gdGhlIGNhbGxlciBzdXBwbGllZCBhIGxvYWRlZFxuICAvLyBldmVudCBsb2c7IHdpdGhvdXQgb25lIGl0IGNyZWF0ZXMgZGlyZWN0bHkgKGNhbGxlcnMgd2l0aCBubyByZXBsYXlcbiAgLy8gc25hcHNob3QsIGUuZy4gdGVzdHMpLiBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIsXG4gIC8vIHdoaWNoIHJlc3RhcnRzIHRoZSByZXBsYXkgZnJvbSBhIGNvcnJlY3RlZCBsb2cg4oCUIGl0IGlzIG5vdCByZXRyaWVkIGhlcmUsXG4gIC8vIGJlY2F1c2UgdGhlIGV2ZW50J3MgY29ycmVsYXRpb24gaWQgd2FzIG1pbnRlZCBieSAqdGhpcyogcmVwbGF5J3Mgc2VlZGVkXG4gIC8vIHNlcXVlbmNlLCBzbyByZS1jb21taXR0aW5nIGl0IGFnYWluc3QgYSBjb3JyZWN0ZWQgbG9nIHdvdWxkIHBlcnNpc3QgYW5cbiAgLy8gZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgcHJvZHVjZXMuXG4gIGxldCByZXBvcnRlZEV2ZW50cyA9IDA7XG4gIGNvbnN0IGNyZWF0ZUd1YXJkZWQ6IEV2ZW50Q3JlYXRvciA9IGFzeW5jIChkYXRhLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIWV2ZW50TG9nKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRXZlbnQoZGF0YSwgcGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gZXZlbnRMb2c7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoZGF0YSwge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgLi4uc2xvdFNuYXBzaG90UGFyYW1zKGxvZy5ldmVudHMpLFxuICAgIH0pO1xuICAgIC8vIEJ1bXAtYW5kLXJlcG9ydDogdGhlIHdyaXRlIGxhbmRlZCBhYm92ZSB0aGUgc2xvdCBpdCBhc2tlZCBmb3IsIHNvIHRoZVxuICAgIC8vIHJlcG9ydCBob2xkcyB0aGUgZXZlbnRzIGl0IHdhcyBkZWNpZGVkIHdpdGhvdXQuIEFic29yYmluZyBoZXJlIHJhdGhlclxuICAgIC8vIHRoYW4gYXQgZWFjaCBjYWxsIHNpdGUgbWVhbnMgdGhlIHJlc3Qgb2YgdGhpcyBwaGFzZSdzIHdyaXRlcyDigJQgd2hpY2ggcmVhZFxuICAgIC8vIHRoZSBzYW1lIGFycmF5IHRvIGJ1aWxkIHRoZWlyIG93biBzbmFwc2hvdCDigJQgYXNrIGZvciBhIHNsb3QgYWJvdmUgdGhlbSxcbiAgICAvLyBhbmQgdGhlIHJlcGxheSB0aGF0IHJlc3VtZXMgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAgICBjb25zdCByZXBvcnQgPSBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChsb2cuZXZlbnRzLCByZXN1bHQpO1xuICAgIHJlcG9ydGVkRXZlbnRzICs9IHJlcG9ydC5hZGRlZDtcbiAgICBpZiAocmVwb3J0LnRydW5jYXRlZCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRHJvcHBlZCBhIHRydW5jYXRlZCBza2lwcGVkLXNsb3QgcmVwb3J0Jywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICBvZmZlcmVkOiByZXBvcnQub2ZmZXJlZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmVwb3J0LmFkZGVkID4gMCkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiB3cml0ZSBza2lwcGVkIG9jY3VwaWVkIHNsb3RzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgZXZlbnRUeXBlOiBkYXRhLmV2ZW50VHlwZSxcbiAgICAgICAgZXZlbnRJZDogcmVzdWx0LmV2ZW50Py5ldmVudElkLFxuICAgICAgICByZXBvcnRlZDogcmVwb3J0LmFkZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIC8vIFNlcGFyYXRlIHF1ZXVlIGl0ZW1zIGJ5IHR5cGVcbiAgY29uc3Qgc3RlcEl0ZW1zID0gc3VzcGVuc2lvbi5zdGVwcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3N0ZXAnXG4gICk7XG4gIGNvbnN0IGFsbEhvb2tJdGVtcyA9IHN1c3BlbnNpb24uc3RlcHMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBIb29rSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdob29rJ1xuICApO1xuICBjb25zdCB3YWl0SXRlbXMgPSBzdXNwZW5zaW9uLnN0ZXBzLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgV2FpdEludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnd2FpdCdcbiAgKTtcbiAgY29uc3QgYXR0cmlidXRlSXRlbXMgPSBzdXNwZW5zaW9uLnN0ZXBzLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdhdHRyaWJ1dGUnXG4gICk7XG5cbiAgY29uc3QgaG9va3NOZWVkaW5nQ3JlYXRpb24gPSBhbGxIb29rSXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiAhaXRlbS5oYXNDcmVhdGVkRXZlbnRcbiAgKTtcblxuICAvLyBHcm91cCBob29rIGl0ZW1zIHRoYXQgbmVlZCB3b3JrIGJ5IHRva2VuLCBwcmVzZXJ2aW5nIHF1ZXVlLWluc2VydGlvblxuICAvLyAod29ya2Zsb3cgY29kZSkgb3JkZXIgd2l0aGluIGVhY2ggdG9rZW4uIE9wZXJhdGlvbnMgb24gb25lIHRva2VuIG11c3RcbiAgLy8gYXBwbHkgaW4gY29kZSBvcmRlcjogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIHJlbGVhc2VzIHRoZSB0b2tlblxuICAvLyBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpcyB2YWxpZGF0ZWQg4oCUIG90aGVyd2lzZSB0aGVcbiAgLy8gbmV3IGhvb2sgcmVjb3JkcyBhIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duXG4gIC8vIGRpc3Bvc2VkIGhvb2sg4oCUIHdoaWxlIGEgaG9vayBjcmVhdGVkIGFuZCBkaXNwb3NlZCB3aXRoaW4gdGhlIHNhbWVcbiAgLy8gc3VzcGVuc2lvbiBpcyBzdGlsbCBjcmVhdGVkIGJlZm9yZSBpdCBpcyBkaXNwb3NlZC4gRGlmZmVyZW50IHRva2Vuc1xuICAvLyBoYXZlIG5vIGNsYWltIGludGVyYWN0aW9uLCBzbyB0b2tlbiBncm91cHMgYXJlIHByb2Nlc3NlZCBpbiBwYXJhbGxlbC5cbiAgY29uc3QgaG9va0l0ZW1zQnlUb2tlbiA9IG5ldyBNYXA8c3RyaW5nLCBIb29rSW52b2NhdGlvblF1ZXVlSXRlbVtdPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWxsSG9va0l0ZW1zKSB7XG4gICAgaWYgKGl0ZW0uaGFzQ3JlYXRlZEV2ZW50ICYmICFpdGVtLmRpc3Bvc2VkKSB7XG4gICAgICBjb250aW51ZTsgLy8gYWxyZWFkeSBjb21taXR0ZWQgYW5kIHN0aWxsIGxpdmUg4oCUIG5vdGhpbmcgdG8gZG9cbiAgICB9XG4gICAgY29uc3QgZ3JvdXAgPSBob29rSXRlbXNCeVRva2VuLmdldChpdGVtLnRva2VuKTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIGdyb3VwLnB1c2goaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tJdGVtc0J5VG9rZW4uc2V0KGl0ZW0udG9rZW4sIFtpdGVtXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBydW5cbiAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bik7XG4gIGNvbnN0IGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHJ1bidzIHNwZWNWZXJzaW9uLlxuICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgKHJ1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZUhvb2soXG4gICAgcXVldWVJdGVtOiBIb29rSW52b2NhdGlvblF1ZXVlSXRlbVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBob29rRGlzcG9zZWRFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcgYXMgY29uc3QsXG4gICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICB0b2tlbjogcXVldWVJdGVtLnRva2VuLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGhvb2tEaXNwb3NlZEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgLy8gSG9vayB3YXMgYWxyZWFkeSBkaXNwb3NlZCBieSBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiDigJQgc2FmZSB0byBza2lwXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnSG9vayBhbHJlYWR5IGRpc3Bvc2VkLCBza2lwcGluZyBkdXBsaWNhdGUgZGlzcG9zYWwnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBob29rIGRpc3Bvc2FsJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIC8vIEhvb2sgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9yIG5ldmVyIGNyZWF0ZWRcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdIb29rIG5vdCBmb3VuZCBmb3IgZGlzcG9zYWwsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3MgaG9va3MgZmlyc3QgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCB3ZWJob29rIHJlY2VpdmVycy5cbiAgLy8gVHJhY2sgYW55IGhvb2sgY29uZmxpY3RzIHRoYXQgb2NjdXIg4oCUIHRoZXNlIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyXG4gIC8vIHNvIHRoZSBWMiBoYW5kbGVyIGNhbiByZS1pbnZva2UgaW1tZWRpYXRlbHkuXG4gIGxldCBoYXNIb29rQ29uZmxpY3QgPSBmYWxzZTtcbiAgbGV0IGhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gPSBmYWxzZTtcbiAgbGV0IGhvb2tDcmVhdGlvbk1zID0gMDtcblxuICBpZiAoaG9va0l0ZW1zQnlUb2tlbi5zaXplID4gMCkge1xuICAgIGNvbnN0IGhvb2tQaGFzZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgIGF3YWl0IHNldHRsZVBoYXNlKFxuICAgICAgWy4uLmhvb2tJdGVtc0J5VG9rZW4udmFsdWVzKCldLm1hcChhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICBsZXQgY3JlYXRpb25Db25mbGljdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoIXF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2tNZXRhZGF0YTogU2VyaWFsaXplZERhdGEgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgICB0eXBlb2YgcXVldWVJdGVtLm1ldGFkYXRhID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiAoKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlSXRlbS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICAgICAgICApKSBhcyBTZXJpYWxpemVkRGF0YSk7XG4gICAgICAgICAgICBjb25zdCBob29rRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgICAgICAgICAgICB0b2tlblJldGVudGlvblVudGlsOiBxdWV1ZUl0ZW0udG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogaG9va01ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGlzV2ViaG9vazogcXVldWVJdGVtLmlzV2ViaG9vayA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICAuLi4ocXVldWVJdGVtLmlzU3lzdGVtICYmIHsgaXNTeXN0ZW06IHRydWUgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSG9va0V2ZW50KHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGhvb2tFdmVudCxcbiAgICAgICAgICAgICAgcXVldWVJdGVtLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZUV2ZW50OiBjcmVhdGVHdWFyZGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBoYXNIb29rQ29uZmxpY3QgfHw9IHJlc3VsdC5oYXNIb29rQ29uZmxpY3Q7XG4gICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uIHx8PSByZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjtcbiAgICAgICAgICAgIGNyZWF0aW9uQ29uZmxpY3RlZCA9IHJlc3VsdC5oYXNIb29rQ29uZmxpY3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGlzcG9zZSBhZnRlciBjcmVhdGlvbiBmb3IgaG9va3MgYm9ybiBhbmQgZGlzcG9zZWQgd2l0aGluIHRoaXNcbiAgICAgICAgICAvLyBiYXRjaC4gQSBob29rIHdob3NlIGNyZWF0aW9uIGNvbmZsaWN0ZWQgd2FzIG5ldmVyIGNyZWF0ZWQsIHNvXG4gICAgICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBkaXNwb3NlLlxuICAgICAgICAgIGlmIChxdWV1ZUl0ZW0uZGlzcG9zZWQgJiYgIWNyZWF0aW9uQ29uZmxpY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgZGlzcG9zZUhvb2socXVldWVJdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICBob29rQ3JlYXRpb25NcyA9IERhdGUubm93KCkgLSBob29rUGhhc2VTdGFydDtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgYWJvcnQgcmVxdWVzdHMg4oCUIHJlc3VtZSB0aGUgaG9vayB3aXRoIGFib3J0IHBheWxvYWQgYW5kIHdyaXRlIHN0cmVhbSBwYWNrZXRcbiAgY29uc3QgaG9va3NOZWVkaW5nQWJvcnQgPSBhbGxIb29rSXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiBpdGVtLmFib3J0UmVxdWVzdGVkICYmICFpdGVtLmRpc3Bvc2VkXG4gICk7XG5cbiAgaWYgKGhvb2tzTmVlZGluZ0Fib3J0Lmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgIGF3YWl0IHNldHRsZVBoYXNlKFxuICAgICAgaG9va3NOZWVkaW5nQWJvcnQubWFwKGFzeW5jIChxdWV1ZUl0ZW0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgICBjb25zdCBhYm9ydFBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb246IHF1ZXVlSXRlbS5hYm9ydFJlYXNvbiB9LFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIGFib3J0IHBheWxvYWRcbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFdyaXRlIHN0cmVhbSBjYW5jZWxsYXRpb24gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAgICAgICAgICAvLyBSZXVzZSB0aGUgc2FtZSBkZWh5ZHJhdGVkIHBheWxvYWQgYXMgdGhlIGhvb2sgZXZlbnQgc28gdGhlIHJlYXNvblxuICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHRocm91Z2ggYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIC8gYGh5ZHJhdGVTdGVwQXJndW1lbnRzYFxuICAgICAgICAgIC8vIChoYW5kbGVzIERPTUV4Y2VwdGlvbiwgY3VzdG9tIGVycm9ycywgZW5jcnlwdGlvbiwgZXRjLikgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIGJhcmUgSlNPTi5zdHJpbmdpZnkgd2hpY2ggbG9zZXMgdHlwZSBpbmZvcm1hdGlvbiBhbmQgZHJvcHMgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIHN0cmVhbU5hbWUgaXMgc2V0IG9uIHRoZSBxdWV1ZSBpdGVtIGF0IGNvbnRyb2xsZXIgY29uc3RydWN0aW9uIHRpbWVcbiAgICAgICAgICAvLyAoc2VlIHdvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIudHMpLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZEZyb21Ub2tlbihxdWV1ZUl0ZW0udG9rZW4pO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWUsXG4gICAgICAgICAgICAgIGFib3J0UGF5bG9hZCBhcyBVaW50OEFycmF5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGUg4oCUIGhvb2sgZXZlbnQgcHJvdmlkZXMgdGhlIGR1cmFibGUgZmFsbGJhY2tcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCwgaG9vayBldmVudCB3aWxsIHByb3ZpZGUgZmFsbGJhY2snLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGFib3J0JyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgc3RlcCBldmVudHMgZm9yIHN0ZXBzIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtIHlldC5cbiAgLy8gVW5saWtlIFYxLCB3ZSBkbyBOT1QgcXVldWUgc3RlcCBtZXNzYWdlcyBmcm9tIGhlcmUg4oCUIHRoZSBjYWxsZXJcbiAgLy8gZGVjaWRlcyB3aGljaCBzdGVwcyB0byBleGVjdXRlIGlubGluZSB2cy4gcXVldWUgdG8gYmFja2dyb3VuZC5cbiAgLy8gV2FpdCBldmVudHMgYXJlIGFsc28gY3JlYXRlZCBpbiBwYXJhbGxlbCBiZWxvdy5cbiAgY29uc3Qgc3RlcHNOZWVkaW5nQ3JlYXRpb24gPSBuZXcgU2V0KFxuICAgIHN0ZXBJdGVtc1xuICAgICAgLmZpbHRlcigocXVldWVJdGVtKSA9PiAhcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudClcbiAgICAgIC5tYXAoKHF1ZXVlSXRlbSkgPT4gcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpXG4gICk7XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCBUSElTIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50LiBQb3B1bGF0ZWQgYnkgdGhlIG9wcyBiZWxvdyBhZnRlciBhIHN1Y2Nlc3NmdWxcbiAgLy8gZXZlbnRzLmNyZWF0ZSDigJQgdXNlZCBieSB0aGUgY2FsbGVyIHRvIGNsYWltIG93bmVyc2hpcCBhbmQgYXZvaWRcbiAgLy8gcmFjaW5nIHdpdGggY29uY3VycmVudCBoYW5kbGVycyBvbiBzdGVwIGV4ZWN1dGlvbi5cbiAgY29uc3QgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFNlcmlhbGl6YXRpb24gYWx3YXlzIHJ1bnMgdGhyb3VnaCB0aGUgb25lIG9yZGluYXJ5IHBhdGggYmVsb3csIHNvIHRoZVxuICAvLyBkdXJhYmxlIGJ5dGVzIGNhbm5vdCBkZXBlbmQgb24gcmV0ZW50aW9uLiBXaGF0IHJldGVudGlvbiBuZWVkcyB0byBrbm93IGlzXG4gIC8vIHdoZXRoZXIgdGhhdCBzZXJpYWxpemF0aW9uICpleGVjdXRlZCogd29ya2Zsb3cgY29kZSAoZ2V0dGVycywgcHJveHlcbiAgLy8gdHJhcHMsIGN1c3RvbSBzZXJpYWxpemVycykg4oCUIHNpZGUgZWZmZWN0cyBhIGNvbGQgcmVwbGF5IHdvdWxkIG5vdFxuICAvLyByZXBlYXQsIHNpbmNlIGEgcmVwbGF5IHNraXBzIGRlaHlkcmF0aW9uIGZvciBhbHJlYWR5LXJlY29yZGVkIHN0ZXBzLlxuICAvLyBUaGUgaGFyZGVuZWQgc2VyaWFsaXplciByZWNvcmRzIGV4YWN0bHkgdGhhdCBpbnRvIHRoaXMgc2luayAoc2VlXG4gIC8vIC4uL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQudHMpOyB3aGVuIGFueSBpbnB1dCBpbiB0aGUgYmF0Y2ggcmVjb3JkcyBhblxuICAvLyBleGVjdXRpb24sIHRoZSBjYWxsZXIgZGVtb3RlcyB0aGUgc2Vzc2lvbiBzbyB0aGUgc2lkZSBlZmZlY3RzIGxhbmQgaW4gYVxuICAvLyBWTSB0aGF0IGlzIGFib3V0IHRvIGJlIGRpc2NhcmRlZCwgZXhhY3RseSBsaWtlIHRoZSBwcmUtcmV0ZW50aW9uXG4gIC8vIHJ1bnRpbWUuXG4gIGNvbnN0IGd1ZXN0Q29kZVN0YXRzOiBHdWVzdENvZGVTdGF0cyA9IHsgZXhlY3V0aW9uczogW10gfTtcblxuICAvLyBMYXp5IGlubGluZSBzdGFydDogZGVmZXIgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3IgdXAgdG9cbiAgLy8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIHRoZSBjYWxsZXIgd2lsbCBydW4gaW5saW5lIChpbiBwYXJhbGxlbCkuIEVhY2hcbiAgLy8gc3RlcCBpcyBjcmVhdGVkIG9uIHRoZSBmbHkgYnkgdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgZXhlY3V0ZVN0ZXAgc2VuZHNcbiAgLy8gKHNhdmluZyBhIHJvdW5kLXRyaXAgcGVyIHN0ZXApLiBXZSBuZXZlciBkZWZlciB3aGVuIGEgYGhvb2suZ2V0Q29uZmxpY3QoKWBcbiAgLy8gYXdhaXRlciBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgY2FsbGVyIGV4ZWN1dGVzIG5vdGhpbmcgaW5saW5lXG4gIC8vIChpdCByZS1pbnZva2VzIGltbWVkaWF0ZWx5IHRvIHJlc29sdmUgdGhlIGF3YWl0ZXIpLCBzbyBkZWZlcnJpbmcgd291bGRcbiAgLy8gbGVhdmUgdGhlIHN0ZXBzIHVuY3JlYXRlZCBhbmQgdW5xdWV1ZWQuIFdlIHBpY2sgdGhlIGZpcnN0IE4gdW5jcmVhdGVkIHN0ZXBzXG4gIC8vIOKAlCBtYXRjaGluZyB0aGUgY2FsbGVyJ3MgaW5saW5lLWNhbmRpZGF0ZSBzZWxlY3Rpb24g4oCUIGFuZCBkZWh5ZHJhdGUgdGhlaXJcbiAgLy8gaW5wdXQgaGVyZSBzbyBleGVjdXRlU3RlcCBjYW4gc2hpcCBpdCBhcyB0aGUgc3RlcF9zdGFydGVkIHBheWxvYWQuXG4gIGNvbnN0IGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPihcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uID09PSBmYWxzZVxuICAgICAgPyBzdGVwSXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMoaXRlbS5jb3JyZWxhdGlvbklkKSlcbiAgICAgICAgICAuc2xpY2UoMCwgZ2V0TWF4SW5saW5lU3RlcHMoKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmNvcnJlbGF0aW9uSWQpXG4gICAgICA6IFtdXG4gICk7XG4gIC8vIENvbGxlY3RlZCBieSBjb3JyZWxhdGlvbklkIGJlY2F1c2UgdGhlIHBlci1zdGVwIG9wcyBiZWxvdyBydW4gY29uY3VycmVudGx5XG4gIC8vIGFuZCBzZXR0bGUgb3V0IG9mIG9yZGVyLiBXZSByZWJ1aWxkIHRoZSBhcnJheSBpbiBkZXRlcm1pbmlzdGljXG4gIC8vIGBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHNgIG9yZGVyICh0aGUgb3JkZXJlZCBzbGljZSBhYm92ZSkgYWZ0ZXIgdGhlIG9wc1xuICAvLyBzZXR0bGUsIHNvIHRoZSBpbmxpbmUgYmF0Y2ggb3JkZXIgaXMgc3RhYmxlIHJlZ2FyZGxlc3Mgb2YgZGVoeWRyYXRpb24gdGltaW5nLlxuICBjb25zdCBsYXp5SW5saW5lQnlDb3JyZWxhdGlvbklkID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddW251bWJlcl1cbiAgPigpO1xuXG4gIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHdob3NlIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2Ugd2FzIGFscmVhZHlcbiAgLy8gcHVibGlzaGVkIGJ5IHRoZSByZXNpbGllbnQtZGlzcGF0Y2ggb3BzIGJlbG93IChhbG9uZ3NpZGUgdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyB3cml0ZSkuIFJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgc28gaXRzIGRpc3BhdGNoIHBhc3Mgc2tpcHMgdGhlbS5cbiAgY29uc3QgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApLiBBbGwgbXVzdCBob2xkOlxuICAvL1xuICAvLyAgLSBUaGUgY2FsbGVyIHByb3ZpZGVkIGEgZGlzcGF0Y2ggdGFyZ2V0IChgc3RlcERpc3BhdGNoYCkg4oCUIHRlcm1pbmFsXG4gIC8vICAgIGRyYWlucyBhbmQgb3RoZXIgY3JlYXRlLW9ubHkgY2FsbGVycyBuZXZlciBxdWV1ZS5cbiAgLy8gIC0gVGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAoYFdPUktGTE9XX1JFU0lMSUVOVF9TVEVQX0RJU1BBVENIYCBvcHQtaW4pLlxuICAvLyAgICBJdCBpcyBvZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBwdWJsaXNoIHJhY2VzIHRoZSBjcmVhdGUncyB2ZXJkaWN0LFxuICAvLyAgICBhbmQgYSBjcmVhdGUgY2FuIGNvbWUgYmFjayByZWZ1c2VkOiBhcyBhIGR1cGxpY2F0ZSB0aGUgcmVwbGF5IHNob3VsZFxuICAvLyAgICBzdG9wIHB1cnN1aW5nLCBvciDigJQgb24gYSBXb3JsZCB0aGF0IHdvdWxkIHJhdGhlciByZWZ1c2UgYSBzdGFsZSB3cml0ZVxuICAvLyAgICB0aGFuIHJlcG9ydCB3aGF0IGl0IG1pc3NlZCDigJQgYXMgYSA0MTIuIEVpdGhlciB3YXkgdGhlIHF1ZXVlIG1lc3NhZ2VcbiAgLy8gICAgY2FycnlpbmcgdGhlIHBheWxvYWQgaXMgYWxyZWFkeSBvdXQsIGFuZCB0aGUgY29uc3VtZXIgY2FuIG1hdGVyaWFsaXplIGFcbiAgLy8gICAgc3RlcCB3aG9zZSBjcmVhdGUgd2FzIHJlZnVzZWQuIE5vdGhpbmcgb3JkZXJzIHRoYXQgdmVyZGljdCBiZWZvcmUgdGhlXG4gIC8vICAgIGNvbnN1bWVyJ3MgcmVkZWxpdmVyeSByZS1lbnN1cmUsIHNvIG5vIGJhY2tlbmQtc2lkZSByZXZvY2F0aW9uXG4gIC8vICAgIGJvb2trZWVwaW5nIGNhbiBjbG9zZSB0aGUgd2luZG93OiBhIGJlc3QtZWZmb3J0IG1hcmtlciB0aGF0IGZhaWxzIG9wZW5cbiAgLy8gICAgY2Fubm90IGNhcnJ5IGEgY29ycmVjdG5lc3MgcHJvcGVydHkuIFRoZSBzZXF1ZW50aWFsIHBhdGggaXMgdGhlIG9ubHlcbiAgLy8gICAgdGhpbmcgdGhhdCBnaXZlcyB0aGUgbWVzc2FnZSBhIGhhcHBlbnMtYWZ0ZXIgZWRnZSBvdmVyIHRoZSB2ZXJkaWN0LlxuICAvLyAgLSBUaGUgcnVuJ3MgcXVldWUgdHJhbnNwb3J0IHByZXNlcnZlcyBiaW5hcnkgcGF5bG9hZHMgKENCT1IsXG4gIC8vICAgIHNwZWNWZXJzaW9uID49IDMpOiBgc3RlcElucHV0LmlucHV0YCBpcyB0aGUgc2VyaWFsaXplZCAocG9zc2libHlcbiAgLy8gICAgZW5jcnlwdGVkKSBpbnB1dCBieXRlcywgd2hpY2ggdGhlIEpTT04gdHJhbnNwb3J0IHdvdWxkIG1hbmdsZS5cbiAgY29uc3QgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSA9XG4gICAgc3RlcERpc3BhdGNoICE9PSB1bmRlZmluZWQgJiZcbiAgICBpc1Jlc2lsaWVudFN0ZXBEaXNwYXRjaEVuYWJsZWQoKSAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUO1xuXG4gIC8vIEJhdGNoZWQgZmFuLW91dDogZm9sZCB0aGlzIHN1c3BlbnNpb24ncyBzdGVwX2NyZWF0ZWQgKyB3YWl0X2NyZWF0ZWRcbiAgLy8gd3JpdGVzIGludG8gb25lIGBldmVudHMuY3JlYXRlQmF0Y2hgIGNhbGwgKG9uZSBkdXJhYmxlIHdyaXRlLCBwZXItZXZlbnRcbiAgLy8gb3V0Y29tZXMpIGluc3RlYWQgb2Ygb25lIHdyaXRlIHBlciBldmVudC4gRW5nYWdlcyBvbmx5IGZvciBhIENMRUFOXG4gIC8vIGZhbi1vdXQg4oCUIG5vIGF0dHJpYnV0ZSB3cml0ZXMsIG5vIGhvb2sgd3JpdGVzLCBubyByZXNpbGllbnQgZGlzcGF0Y2hcbiAgLy8gKHdob3NlIGNyZWF0ZXMgYXJlIGVhY2ggcGFpcmVkIHdpdGggYSBxdWV1ZSBwdWJsaXNoKSDigJQgb24gYSBXb3JsZCB0aGF0XG4gIC8vIGltcGxlbWVudHMgdGhlIG9wdGlvbmFsIG1ldGhvZCBhbmQgYSBydW4gd2hvc2UgZXZlbnRzIGFyZSBzbG90LW51bWJlcmVkLlxuICAvLyBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIGdhdGUga2VlcHMgdGhlIHNpbmdsZS1ldmVudCBwYXRoIGJ5dGUtZm9yLWJ5dGUuXG4gIGNvbnN0IGJhdGNoRmFub3V0RWxpZ2libGUgPVxuICAgIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQoKSAmJlxuICAgIHR5cGVvZiB3b3JsZC5ldmVudHMuY3JlYXRlQmF0Y2ggPT09ICdmdW5jdGlvbicgJiZcbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19TTE9UX0lERU5USVRZICYmXG4gICAgIXJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICBhbGxIb29rSXRlbXMubGVuZ3RoID09PSAwICYmXG4gICAgYXR0cmlidXRlSXRlbXMubGVuZ3RoID09PSAwO1xuICAvKipcbiAgICogVGhlIGZvbGQncyBjb2xsZWN0aW9uLCBpbiBzY2hlZHVsaW5nIG9yZGVyIChzdGVwcyBpbiBzdGVwSXRlbXMgb3JkZXIsXG4gICAqIHRoZW4gd2FpdHMpLiBTdGVwIGVudHJpZXMgYXJlIGVucXVldWVkIGJ5IHRoZWlyIHByZXAgcHJvbWlzZXMgKGlucHV0XG4gICAqIGRlaHlkcmF0aW9uIHJ1bnMgY29uY3VycmVudGx5LCBzbyBlbnRyaWVzIGFyZSBvcmRlcmVkIGJ5IGBvcmRlcmAsIG5vdCBieVxuICAgKiBjb21wbGV0aW9uKTsgdGhlIHNpbmdsZSBmbHVzaCBvcCBiZWxvdyBhd2FpdHMgZXZlcnkgcHJlcCwgc29ydHMsIGFuZFxuICAgKiBjb21taXRzIHRoZSB3aG9sZSBzZXQgdGhyb3VnaCBgY3JlYXRlQmF0Y2hgLlxuICAgKi9cbiAgY29uc3QgYmF0Y2hRdWV1ZToge1xuICAgIG9yZGVyOiBudW1iZXI7XG4gICAga2luZDogJ3N0ZXAnIHwgJ3dhaXQnIHwgJ2lubGluZS1jcmVhdGVkJyB8ICdpbmxpbmUtc3RhcnRlZCc7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgc3RlcCdzIG5hbWUsIHNldCBvbiBzdGVwLWNhcnJ5aW5nIGtpbmRzICh0aGUgaW4tZmx1c2ggcHVibGlzaGVzXG4gICAgICogIGFuZCB0aGUgZGlzcGF0Y2ggaWRlbXBvdGVuY3kga2V5IG5lZWQgaXQpLiAqL1xuICAgIHN0ZXBOYW1lPzogc3RyaW5nO1xuICAgIGV2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3Q7XG4gIH1bXSA9IFtdO1xuICBjb25zdCBiYXRjaFByZXBzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAvLyBQcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnM6IGZvbGQgZWFjaCBsYXp5LWlubGluZSBzdGVwJ3MgZGVmZXJyZWRcbiAgLy8gYHN0ZXBfY3JlYXRlZGAgKGNhcnJ5aW5nIGl0cyBpbnB1dCkgQU5EIGl0cyBgc3RlcF9zdGFydGVkYCBjbGFpbSAoYmFyZSxcbiAgLy8gb3duZXJzaGlwLXN0YW1wZWQpIGludG8gdGhlIGJhdGNoLCBzbyB0aGUgd2hvbGUgZmFuLW91dCDigJQgdGhlIGlubGluZVxuICAvLyBzdGVwcycgY2xhaW1zIGluY2x1ZGVkIOKAlCBjb21taXRzIGluIHRoZSBvbmUgZHVyYWJsZSB3cml0ZSBhbmQgdGhlIGNhbGxlclxuICAvLyBzdGFydHMgdGhlIGJvZGllcyBzdHJhaWdodCBvZmYgdGhhdCBjb21taXQgaW5zdGVhZCBvZiBwb3N0aW5nIG9uZSBjbGFpbVxuICAvLyBwZXIgaW5saW5lIHN0ZXAuIFRoZSBsb25lLWlubGluZSBjYXNlIChub3RoaW5nIGVsc2UgdG8gYmF0Y2ggd2l0aCkgaXNcbiAgLy8gZXhjbHVkZWQ6IGEgcGFpci1vbmx5IGJhdGNoIGNvc3RzIHRoZSBzYW1lIHJvdW5kIHRyaXAgYXMgdGhlIHNpbmdsZSBsYXp5XG4gIC8vIGNsYWltIHdoaWxlIGdpdmluZyB1cCB0aGUgb3B0aW1pc3RpYyBjbGFpbS9ib2R5IG92ZXJsYXAgYW5kIHRoZVxuICAvLyBidW1wLWFuZC1yZXBvcnQgdGhhdCBgY3JlYXRlR3VhcmRlZGAgcHJvdmlkZXMsIHNvIGl0IHN0YXlzIG9uIHRoZSBsYXp5XG4gIC8vIHBhdGguIFJlcXVpcmVzIHRoZSBjYWxsZXIncyBgb3duZXJNZXNzYWdlSWRgIOKAlCB0aGUgc3RhcnRlZCByb3cgbXVzdFxuICAvLyBzdGFtcCBvd25lcnNoaXAgZXhhY3RseSBsaWtlIHRoZSBsYXp5IGNsYWltIGl0IHJlcGxhY2VzIChhbmQgYSBjYWxsZXJcbiAgLy8gdGhhdCBkb2VzIG5vdCBpbmxpbmUtZXhlY3V0ZSBuZXZlciBwcm92aWRlcyBvbmUpLlxuICBjb25zdCB1bmNyZWF0ZWRXYWl0Q291bnQgPSB3YWl0SXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiAhaXRlbS5oYXNDcmVhdGVkRXZlbnRcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGlubGluZVBhaXJGb2xkRWxpZ2libGUgPVxuICAgIGJhdGNoRmFub3V0RWxpZ2libGUgJiZcbiAgICBvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgPiAwICYmXG4gICAgKGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5zaXplID49IDIgfHxcbiAgICAgIHN0ZXBzTmVlZGluZ0NyZWF0aW9uLnNpemUgLVxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuc2l6ZSArXG4gICAgICAgIHVuY3JlYXRlZFdhaXRDb3VudCA+PVxuICAgICAgICAxKTtcbiAgY29uc3QgaW5saW5lQ2xhaW1zOiBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdFsnaW5saW5lQ2xhaW1zJ10gPSBuZXcgTWFwKCk7XG4gIGxldCBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIHRyYWNlIGNhcnJpZXIgZm9yIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoZXMsIHJlc29sdmVkIGF0IG1vc3Qgb25jZSBwZXJcbiAgLy8gc3VzcGVuc2lvbiAodGhlIHBlci1zdGVwIG9wcyBydW4gY29uY3VycmVudGx5IGFuZCBzaGFyZSBpdCkuXG4gIGxldCBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXI6IFByb21pc2U8VHJhY2VDYXJyaWVyPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyID0gKCk6IFByb21pc2U8VHJhY2VDYXJyaWVyPiA9PiB7XG4gICAgc3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyID8/PVxuICAgICAgc3RlcERpc3BhdGNoPy5nZXRUcmFjZUNhcnJpZXIoKSA/PyBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgIHJldHVybiBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXI7XG4gIH07XG5cbiAgLy8gUHJvZHVjZXItc2lkZSByZXNpbGllbnQgcmVjb3ZlcnkgY291bnQgZm9yIHRoZSBzdXNwZW5zaW9uIHNwYW4gYXR0cmlidXRlLlxuICBsZXQgcmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQgPSAwO1xuXG4gIC8vIFN0ZXBzOiBjcmVhdGUgc3RlcF9jcmVhdGVkIGV2ZW50cyAobm8gcXVldWluZyDigJQgVjIgcmV0dXJucyBwZW5kaW5nIHN0ZXBzXG4gIC8vIHRvIGNhbGxlciDigJQgRVhDRVBUIG9uIHRoZSByZXNpbGllbnQgZGlzcGF0Y2ggcGF0aCwgd2hpY2ggcGFyYWxsZWxpemVzIHRoZVxuICAvLyBjcmVhdGUgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggYW5kIHJlcG9ydHMgaXQgaW5cbiAgLy8gYHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc2ApLlxuICBsZXQgYmF0Y2hPcmRlckNvdW50ZXIgPSAwO1xuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBzdGVwSXRlbXMpIHtcbiAgICBpZiAoc3RlcHNOZWVkaW5nQ3JlYXRpb24uaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgLy8gRGV0ZXJtaW5pc3RpYyBwb3NpdGlvbiBpbiB0aGUgYmF0Y2hlZCBmb2xkIChhc3NpZ25lZCBpbiBzdGVwSXRlbXNcbiAgICAgIC8vIG9yZGVyLCBiZWZvcmUgdGhlIGNvbmN1cnJlbnQgZGVoeWRyYXRpb24gcnVucykuIEEgcGFpci1mb2xkZWQgaW5saW5lXG4gICAgICAvLyBzdGVwIG9jY3VwaWVzIHR3byBjb25zZWN1dGl2ZSBwb3NpdGlvbnMg4oCUIGNyZWF0ZWQgcm93IHRoZW4gc3RhcnRlZFxuICAgICAgLy8gcm93IOKAlCB3aGljaCB0aGUgZmx1c2gga2VlcHMgYWRqYWNlbnQgYW5kIG5ldmVyIHNwbGl0cyBhY3Jvc3MgY2h1bmtzLFxuICAgICAgLy8gc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUuXG4gICAgICBjb25zdCBwYWlyRm9sZGVkID1cbiAgICAgICAgaW5saW5lUGFpckZvbGRFbGlnaWJsZSAmJlxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHN0ZXBPcmRlciA9IGJhdGNoT3JkZXJDb3VudGVyO1xuICAgICAgYmF0Y2hPcmRlckNvdW50ZXIgKz0gcGFpckZvbGRlZCA/IDIgOiAxO1xuICAgICAgY29uc3Qgc3RlcE9wID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUGVyLXN0ZXAgc2luaywgbWVyZ2VkIGJlbG93OiB0aGUgZGVoeWRyYXRlIHdyYXBwZXIgZW1pdHMgc3BhblxuICAgICAgICAvLyBhdHRyaWJ1dGVzIGZyb20gdGhlIHNpbmsgaXQgaXMgaGFuZGVkLCBzbyBzaGFyaW5nIG9uZSBhY3Jvc3NcbiAgICAgICAgLy8gc3RlcHMgd291bGQgcmUtZW1pdCAoYW5kIG1pc2F0dHJpYnV0ZSkgZWFybGllciBzdGVwcycgZW50cmllcy5cbiAgICAgICAgY29uc3Qgc3RlcEd1ZXN0Q29kZTogR3Vlc3RDb2RlU3RhdHMgPSB7IGV4ZWN1dGlvbnM6IFtdIH07XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWRJbnB1dCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXJnczogcXVldWVJdGVtLmFyZ3MsXG4gICAgICAgICAgICBjbG9zdXJlVmFyczogcXVldWVJdGVtLmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgdGhpc1ZhbDogcXVldWVJdGVtLnRoaXNWYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIHN1c3BlbnNpb24uZ2xvYmFsVGhpcyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBjb21wcmVzc2lvbixcbiAgICAgICAgICBzdGVwR3Vlc3RDb2RlXG4gICAgICAgICk7XG4gICAgICAgIGd1ZXN0Q29kZVN0YXRzLmV4ZWN1dGlvbnMucHVzaCguLi5zdGVwR3Vlc3RDb2RlLmV4ZWN1dGlvbnMpO1xuICAgICAgICAvLyBEZWZlcnJlZCAobGF6eSkgaW5saW5lIHN0ZXA6IHNraXAgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSDigJQgdGhlXG4gICAgICAgIC8vIGNhbGxlcidzIGlubGluZSBleGVjdXRlU3RlcCB3aWxsIHNlbmQgYSBsYXp5IHN0ZXBfc3RhcnRlZCBjYXJyeWluZ1xuICAgICAgICAvLyB0aGlzIGlucHV0LCBhbmQgdGhlIHdvcmxkIGNyZWF0ZXMgdGhlIHN0ZXAgKGVudGl0eSArIHN5bnRoZXRpY1xuICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnQpIGF0b21pY2FsbHkuIFdlIGRvIE5PVCBhZGQgaXQgdG9cbiAgICAgICAgLy8gY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkczsgb3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgdGhhdCBsYXp5XG4gICAgICAgIC8vIHN0ZXBfc3RhcnRlZCdzIGF0b21pYyBjcmVhdGUtY2xhaW0gaW5zdGVhZC5cbiAgICAgICAgaWYgKGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgICAgbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5zZXQocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dDogZGVoeWRyYXRlZElucHV0IGFzIFNlcmlhbGl6ZWREYXRhLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChwYWlyRm9sZGVkKSB7XG4gICAgICAgICAgICAvLyBFbnF1ZXVlIHRoZSBwYWlyIHRoZSBkZWZlcnJhbCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdG8gdGhlXG4gICAgICAgICAgICAvLyBjYWxsZXIncyBsYXp5IGBzdGVwX3N0YXJ0ZWRgOiB0aGUgY3JlYXRlZCByb3cgY2FycmllcyB0aGVcbiAgICAgICAgICAgIC8vIGlucHV0IChwYXlsb2FkcyByaWRlIGNyZWF0ZXMgaW4gYSBiYXRjaCksIHRoZSBzdGFydGVkIHJvdyBpc1xuICAgICAgICAgICAgLy8gYmFyZSBhbmQgc3RhbXBzIHRoaXMgaW52b2NhdGlvbidzIG93bmVyc2hpcCDigJQgdGhlIHNhbWUgY2xhaW1cbiAgICAgICAgICAgIC8vIHNoYXBlIHRoZSBsYXp5IHN0YXJ0IHdvdWxkIGhhdmUgc2VudCwgc2V0dGxlZCBieSB0aGUgYmF0Y2guXG4gICAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICBvcmRlcjogc3RlcE9yZGVyLFxuICAgICAgICAgICAgICBraW5kOiAnaW5saW5lLWNyZWF0ZWQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogZGVoeWRyYXRlZElucHV0IGFzIFNlcmlhbGl6ZWREYXRhLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIgKyAxLFxuICAgICAgICAgICAgICBraW5kOiAnaW5saW5lLXN0YXJ0ZWQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAvLyBDaGVja2VkIGJ5IGlubGluZVBhaXJGb2xkRWxpZ2libGU7IHNwcmVhZCBrZWVwcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5hcnJvdy10aHJvdWdoLWNsb3N1cmUgcHJvYmxlbSBhd2F5IGZyb20gdGhlIHR5cGUuXG4gICAgICAgICAgICAgICAgICAuLi4ob3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZCA/IHsgb3duZXJNZXNzYWdlSWQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGVwRXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICBpbnB1dDogZGVoeWRyYXRlZElucHV0IGFzIFNlcmlhbGl6ZWREYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgIC8vIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWwg4oCUIHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgIC8vIHNhbWUgc2VyaWFsaXplZCBpbnB1dCAoYHN0ZXBJbnB1dGApIHNvIHRoZSBjb25zdW1lciBjYW5cbiAgICAgICAgLy8gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIHJlc2lsaWVudCBzdGFydCAoYHJ1bklucHV0YCkgYW5kXG4gICAgICAgIC8vIHJlc2lsaWVudCBob29rIHJlc3VtZSAoYGhvb2tJbnB1dGApIHBhdHRlcm5zLiBPbmx5IGZvciBpbnB1dHMgdGhlXG4gICAgICAgIC8vIHF1ZXVlIG1lc3NhZ2UgY2FuIHNhZmVseSBjYXJyeSAoYmluYXJ5LCB1bmRlciB0aGUgVlFTIHNpemUgY2FwKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmXG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgY29uc3QgW2NyZWF0ZVJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgIGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KSxcbiAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogaW1wbGllZCBieSByZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlXG4gICAgICAgICAgICAgIHN0ZXBEaXNwYXRjaCEucXVldWVOYW1lLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogcXVldWVJdGVtLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBzdGVwSW5wdXQ6IHsgaW5wdXQ6IGRlaHlkcmF0ZWRJbnB1dCB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAvLyBTYW1lIGtleSBhcyB0aGUgY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzcyBhbmQgYW55IGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gaGFuZGxlcidzIOKAlCByZWR1bmRhbnQgcHVibGlzaGVzIGZvciB0aGlzIHN0ZXAgZGVkdXBlLiBUaGVcbiAgICAgICAgICAgICAgLy8ga2V5IGlzIHN0ZXAtaWRlbnRpdHktc2NvcGVkIHNvIGEgcmV2b2tlZCBtZXNzYWdlIGZvciBhXG4gICAgICAgICAgICAgIC8vIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQgY2Fubm90IGFic29yYiB0aGUgY29ycmVjdGVkXG4gICAgICAgICAgICAgIC8vIHNjaGVkdWxlJ3MgZGlzcGF0Y2gg4oCUIHNlZSBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleS5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgIHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLnN0ZXBOYW1lXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBzdXNwZW5zaW9uIHBhc3M6IHdpdGhvdXRcbiAgICAgICAgICAvLyB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGUgYWxvbmUsIGFuZCBpZiB0aGVcbiAgICAgICAgICAvLyBjcmVhdGUgQUxTTyBmYWlsZWQgdGhlcmUgd291bGQgYmUgbm8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLlxuICAgICAgICAgIC8vIFByb3BhZ2F0aW5nIHJlZGVsaXZlcnMgdGhlIG9yY2hlc3RyYXRvciBtZXNzYWdlLCB3aGljaFxuICAgICAgICAgIC8vIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KSBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMg4oCUXG4gICAgICAgICAgLy8gdGhlIHNhbWUgcmVjb3ZlcnkgYXMgdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgICBpZiAocXVldWVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBjcmVhdGVSZXN1bHQucmVhc29uO1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGhhbmRsZXIgd3JvdGUgaXQgZmlyc3Qg4oCUIHNhbWUgYXMgdGhlIHNlcXVlbnRpYWxcbiAgICAgICAgICAgICAgLy8gcGF0aC4gVGhlIHN0ZXAgbWVzc2FnZSBpcyBhbHJlYWR5IG91dDsgYSBkdXBsaWNhdGUgcHVibGlzaFxuICAgICAgICAgICAgICAvLyBieSB0aGF0IGhhbmRsZXIgZGVkdXBlcyBvbiB0aGUgc2hhcmVkIGlkZW1wb3RlbmN5IGtleS5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdTdGVwIGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUmVzaWxpZW50OiB0aGUgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5ICg0MjkgLyA1eHggL1xuICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIOKAlCBjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAvLyBzZXJpYWxpemVkIGlucHV0IOKAlCB3YXMgcHVibGlzaGVkLCBzbyB0aGUgY29uc3VtZXJcbiAgICAgICAgICAgICAgLy8gaWRlbXBvdGVudGx5IHJlLWVuc3VyZXMgdGhlIHN0ZXBfY3JlYXRlZCBiZWZvcmUgZXhlY3V0aW5nLlxuICAgICAgICAgICAgICByZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCsrO1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgJ1N0ZXAgY3JlYXRpb24gZXZlbnQgd3JpdGUgZmFpbGVkLCBidXQgdGhlIHN0ZXAgd2FzICcgK1xuICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCB3aWxsICcgK1xuICAgICAgICAgICAgICAgICAgJ2JlIGVuc3VyZWQgYnkgdGhlIHF1ZXVlIGNvbnN1bWVyLicsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAgIC8vIEZvbGQgaW50byB0aGUgYmF0Y2ggaW5zdGVhZCBvZiB3cml0aW5nIGhlcmUuIFRoZSBlbmNsb3NpbmdcbiAgICAgICAgICAvLyBwcm9taXNlIGpvaW5zIGBiYXRjaFByZXBzYCAoc2VlIHRoZSBsb29wIGJlbG93KSwgc28gdGhlIGZsdXNoXG4gICAgICAgICAgLy8gb3AgY2Fubm90IHJ1biBiZWZvcmUgdGhpcyBzdGVwJ3MgaW5wdXQgZmluaXNoZWQgZGVoeWRyYXRpbmcuXG4gICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICBraW5kOiAnc3RlcCcsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICBldmVudDogc3RlcEV2ZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKHN0ZXBFdmVudCwgeyByZXF1ZXN0SWQgfSk7XG4gICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICAgIG9wcy5wdXNoKHN0ZXBPcCk7XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBUaGUgZmx1c2ggb3Agd2FpdHMgZm9yIGV2ZXJ5IHByZXAgYmVmb3JlIGNvbW1pdHRpbmc7IGEgcHJlcCB0aGF0XG4gICAgICAgIC8vIHJlamVjdGVkIGFscmVhZHkgc3VyZmFjZXMgdGhyb3VnaCBgb3BzYCwgc28gdGhlIGZsdXNoJ3Mgb3duIHdhaXRcbiAgICAgICAgLy8gc3dhbGxvd3MgaXQgYW5kIGNvbW1pdHMgd2hhdGV2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZCDigJRcbiAgICAgICAgLy8gcHJlc2VydmluZyB0b2RheSdzIHBlci1vcCBpbmRlcGVuZGVuY2UuXG4gICAgICAgIGJhdGNoUHJlcHMucHVzaChzdGVwT3AuY2F0Y2goKCkgPT4ge30pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgd2FpdCBldmVudHMgKHNhbWUgYXMgVjEpXG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHdhaXRJdGVtcykge1xuICAgIGlmICghcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3Qgd2FpdEV2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIHJlc3VtZUF0OiBxdWV1ZUl0ZW0ucmVzdW1lQXQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgaWYgKGJhdGNoRmFub3V0RWxpZ2libGUpIHtcbiAgICAgICAgLy8gV2FpdHMgbmVlZCBubyBkZWh5ZHJhdGlvbiwgc28gdGhleSBlbnF1ZXVlIHN5bmNocm9ub3VzbHkg4oCUIGFmdGVyXG4gICAgICAgIC8vIGV2ZXJ5IHN0ZXAncyBvcmRlciBzbG90LCBwcmVzZXJ2aW5nIHN0ZXBzLXRoZW4td2FpdHMgc2NoZWR1bGluZ1xuICAgICAgICAvLyBvcmRlciBpbiB0aGUgbG9nLlxuICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgIG9yZGVyOiBiYXRjaE9yZGVyQ291bnRlcisrLFxuICAgICAgICAgIGtpbmQ6ICd3YWl0JyxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudDogd2FpdEV2ZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBvcHMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQod2FpdEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGJhdGNoZWQgZm9sZCdzIGZsdXNoOiB0aGUgY2xlYW4gZmFuLW91dCBjb21taXRzIHRocm91Z2hcbiAgLy8gYGNyZWF0ZUJhdGNoYCBpbiBjaHVua3Mgb2YgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMg4oCUIGFsbCBjaHVua3MgSU5cbiAgLy8gRkxJR0hUIENPTkNVUlJFTlRMWS4gU2xvdCBhc3NpZ25tZW50IGlzIHRoZSBzZXJ2ZXIncywgc28gcGFyYWxsZWxcbiAgLy8gY2h1bmtzIHJhY2UgZm9yIHNsb3QgcmFuZ2VzIGV4YWN0bHkgbGlrZSB0aGUgcHJlLWZvbGQgcGF0aCdzIHBhcmFsbGVsXG4gIC8vIHNpbmdsZSB3cml0ZXMgZGlkOyBlbnRpdHkgY29uZGl0aW9ucywgbm90IGNvbW1pdCBvcmRlciwgY2FycnlcbiAgLy8gY29ycmVjdG5lc3MgKHNpYmxpbmcgZmFuLW91dCBldmVudHMgaGF2ZSBubyBjcm9zcy1vcmRlciB0aGUgcmVwbGF5XG4gIC8vIGRlcGVuZHMgb24g4oCUIGl0IG1hdGNoZXMgYnkgY29ycmVsYXRpb24gaWQpLiBFYWNoIGV2ZW50IHJlcG9ydHMgdGhlXG4gIC8vIG91dGNvbWUgaXRzIG93biBzaW5nbGUgY3JlYXRlIHdvdWxkIGhhdmUgaGFkOiBhIDQwOSBpcyB0aGUgc2FtZVxuICAvLyBhbHJlYWR5LWV4aXN0cyB0b2xlcmFuY2UgYXMgdGhlIHNpbmdsZSBwYXRoLCBhbnl0aGluZyBlbHNlIGZhaWxzIHRoZVxuICAvLyBkZWxpdmVyeSB0aGUgd2F5IGEgc2luZ2xlLXBhdGggcmVqZWN0aW9uIHdvdWxkLlxuICAvL1xuICAvLyBMYXRlbmN5IHNoYXBlOiBvbmx5IHRoZSBjaHVuayBjYXJyeWluZyB0aGUgcHJlLWNsYWltZWQgaW5saW5lIHBhaXJzXG4gIC8vIGdhdGVzIHRoZSBoYW5kbGVyJ3MgcmV0dXJuICh0aGUgY2FsbGVyIHN0YXJ0cyBib2RpZXMgb2ZmIGl0cyBjbGFpbXMpLlxuICAvLyBFdmVyeSBvdGhlciBjaHVuaydzIGNvbW1pdCDigJQgYW5kIGV2ZXJ5IGNodW5rJ3Mgc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyxcbiAgLy8gd2hpY2ggZmlyZSB0aGUgbW9tZW50IElUUyBjcmVhdGVzIGFyZSBkdXJhYmxlIOKAlCByaWRlc1xuICAvLyBgZGVmZXJyZWRCYXRjaFdvcmtgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBpbiwgam9pbmVkIGJlZm9yZSBhY2suIEEgc2xvd1xuICAvLyBzaWJsaW5nIGNodW5rIHRoZXJlZm9yZSBkZWxheXMgbmVpdGhlciB0aGUgaW5saW5lIGJvZGllcyBub3IgYW5vdGhlclxuICAvLyBjaHVuaydzIHF1ZXVlIG1lc3NhZ2VzLCB3aGlsZSBwdWJsaXNoLWFmdGVyLWNyZWF0ZSBzdGlsbCBob2xkcyBwZXJcbiAgLy8gc3RlcDogYSBzdGVwJ3MgbWVzc2FnZSBpcyBvbmx5IGV2ZXIgc2VudCBhZnRlciB0aGUgY2h1bmsgY2FycnlpbmcgaXRzXG4gIC8vIGNyZWF0ZSBoYXMgY29tbWl0dGVkLlxuICBsZXQgZGVmZXJyZWRCYXRjaFdvcms6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgb3BzLnB1c2goXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBQcmVwcyB0aGF0IHJlamVjdGVkIGFscmVhZHkgc3VyZmFjZSB0aHJvdWdoIHRoZWlyIG93biBgb3BzYFxuICAgICAgICAvLyBlbnRyaWVzOyB0aGUgZm9sZCBjb21taXRzIHdoYXRldmVyIHdhcyBzdWNjZXNzZnVsbHkgZW5xdWV1ZWQsXG4gICAgICAgIC8vIHByZXNlcnZpbmcgdG9kYXkncyBwZXItb3AgaW5kZXBlbmRlbmNlLlxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChiYXRjaFByZXBzKTtcbiAgICAgICAgaWYgKGJhdGNoUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbLi4uYmF0Y2hRdWV1ZV0uc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAvLyBBIGJhdGNoIG9mIE9ORSBnYWlucyBub3RoaW5nIG92ZXIgdGhlIHNpbmdsZSB3cml0ZSAoc2FtZSByb3VuZFxuICAgICAgICAvLyB0cmlwKSBhbmQgbG9zZXMgdGhlIHNsb3Qtc25hcHNob3QgcGFyYW1zICsgYnVtcC1hbmQtcmVwb3J0IHRoYXRcbiAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCBwcm92aWRlcyDigJQgc28gYSBsb25lIGVhZ2VyIGV2ZW50IHRha2VzIHRoZSBvcmRpbmFyeVxuICAgICAgICAvLyBzaW5nbGUgcGF0aCwgd2l0aCB0aGUgc2FtZSBjb25mbGljdCB0b2xlcmFuY2UgYW5kIG93bmVyc2hpcFxuICAgICAgICAvLyBib29ra2VlcGluZyBpdCB3b3VsZCBoYXZlIGhhZCB3aXRob3V0IHRoZSBmb2xkLlxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBbZW50cnldID0gZW50cmllcztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChlbnRyeS5ldmVudCwgeyByZXF1ZXN0SWQgfSk7XG4gICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMuYWRkKGVudHJ5LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ3N0ZXAnXG4gICAgICAgICAgICAgICAgICA/ICdTdGVwIGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJ1xuICAgICAgICAgICAgICAgICAgOiAnV2FpdCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VlZCBmb3IgdGhlIGZvcmVpZ24taW50ZXJsZWF2aW5nIGRpYWdub3N0aWMgYmVsb3cuIFdpdGggY2h1bmtzXG4gICAgICAgIC8vIGNvbW1pdHRpbmcgaW4gcGFyYWxsZWwgdGhlcmUgaXMgbm8gcGVyLWNodW5rIFwiZXhwZWN0ZWQgbmV4dCBzbG90XCJcbiAgICAgICAgLy8g4oCUIHRoZSB3aG9sZSBmb2xkJ3MgY29tbWl0dGVkIHNwYW4gaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgc2VlZFxuICAgICAgICAvLyBvbmNlIGV2ZXJ5IGNodW5rIGhhcyBzZXR0bGVkOiBjb21taXR0ZWQgc2xvdHMgYXJlIGRlbnNlIHBlciB0aGVcbiAgICAgICAgLy8gV29ybGQncyBpbnZhcmlhbnQsIHNvIGFueSBleGNlc3Mgb2YgKG1heCBjb21taXR0ZWQgc2xvdCDiiJIgc2VlZCArXG4gICAgICAgIC8vIDEpIG92ZXIgdGhlIGZvbGQncyBvd24gY29tbWl0dGVkIGNvdW50IGlzIGV2ZW50cyBPVEhFUiB3cml0ZXJzXG4gICAgICAgIC8vIGxhbmRlZCBpbiBiZXR3ZWVuLlxuICAgICAgICBjb25zdCBleHBlY3RlZEZpcnN0U2xvdCA9IGV2ZW50TG9nXG4gICAgICAgICAgPyAobWF4RXZlbnRTbG90KGV2ZW50TG9nLmV2ZW50cykgPz8gMCkgKyAxXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFBhaXItYXdhcmUgY2h1bmtpbmc6IGEgcHJlLWNsYWltZWQgcGFpcidzIHR3byByb3dzIG11c3QgbGFuZCBpblxuICAgICAgICAvLyB0aGUgc2FtZSBjcmVhdGVCYXRjaCBjYWxsIOKAlCBhZGphY2VudCwgc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtXG4gICAgICAgIC8vIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUg4oCUIGFuZCBuZXZlciBzdHJhZGRsZSBhIGNodW5rXG4gICAgICAgIC8vIGJvdW5kYXJ5LCB3aGljaCB3b3VsZCB0dXJuIHRoZSBzdGFydGVkIHJvdyBpbnRvIGEgc3RhbmRhbG9uZVxuICAgICAgICAvLyBjbGFpbSByYWNpbmcgaXRzIG93biBjcmVhdGUncyBjb21taXQuXG4gICAgICAgIGNvbnN0IGNodW5rczogKHR5cGVvZiBlbnRyaWVzKVtdID0gW107XG4gICAgICAgIHtcbiAgICAgICAgICBsZXQgY3VycmVudDogdHlwZW9mIGVudHJpZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZW50cmllc1tpbmRleCArIDFdO1xuICAgICAgICAgICAgY29uc3QgcGFpckxlYWQgPVxuICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnICYmXG4gICAgICAgICAgICAgIG5leHQ/LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dC5jb3JyZWxhdGlvbklkID09PSBlbnRyeS5jb3JyZWxhdGlvbklkO1xuICAgICAgICAgICAgY29uc3QgdGFrZSA9IHBhaXJMZWFkID8gMiA6IDE7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBjdXJyZW50Lmxlbmd0aCArIHRha2UgPiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UU1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICBjdXJyZW50ID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgaWYgKHBhaXJMZWFkKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoID4gMCkgY2h1bmtzLnB1c2goY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RlcHMgd2hvc2UgcXVldWUgbWVzc2FnZXMgVEhJUyBGTFVTSCB3aWxsIHB1Ymxpc2ggKHRoZSBlYWdlclxuICAgICAgICAvLyBjcmVhdGVzKSwgcmVjb3JkZWQgYmVmb3JlIGFueSBjaHVuayBzZXR0bGVzIHNvIHRoZSBjYWxsZXInc1xuICAgICAgICAvLyBkaXNwYXRjaCBwYXNzIOKAlCB3aGljaCBydW5zIG9mZiB0aGUgaGFuZGxlcidzIHJldHVybiDigJQgc2tpcHMgdGhlbS5cbiAgICAgICAgLy8gVGhlIHNlbmRzIGFyZSBndWFyYW50ZWVkLW9yLWZhaWxlZCBieSB0aGUgdHJhaWxpbmcgd29yayB0aGVcbiAgICAgICAgLy8gY2FsbGVyIGpvaW5zIGJlZm9yZSBhY2tpbmcsIHNvIFwid2lsbCBiZSBwdWJsaXNoZWQgYnkgdGhpcyBmbHVzaFwiXG4gICAgICAgIC8vIGFuZCBcImFscmVhZHkgcHVibGlzaGVkXCIgYXJlIGVxdWl2YWxlbnQgZnJvbSB0aGUgY2FsbGVyJ3Mgc2lkZS5cbiAgICAgICAgY29uc3QgcHVibGlzaEVhZ2VyU3RlcHMgPSBzdGVwRGlzcGF0Y2ggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHB1Ymxpc2hFYWdlclN0ZXBzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGFsbGllcyBmb3IgdGhlIGZvcmVpZ24taW50ZXJsZWF2aW5nIGRpYWdub3N0aWMsIGZvbGRlZCBhY3Jvc3NcbiAgICAgICAgLy8gdGhlIGNvbmN1cnJlbnQgY2h1bmtzIGFuZCByZWFkIG9uY2UgYWxsIG9mIHRoZW0gc2V0dGxlZC5cbiAgICAgICAgbGV0IGNvbW1pdHRlZENvdW50ID0gMDtcbiAgICAgICAgbGV0IG1heENvbW1pdHRlZFNsb3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBjb21taXRDaHVuayA9IGFzeW5jIChjaHVuazogdHlwZW9mIGVudHJpZXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAvLyBBbmNob3JzIGZvciB0aGUgcHJlLWNsYWltZWQgc3RlcHMnIHRlbGVtZXRyeTogdGhlIFBPU1QgaW5zdGFudFxuICAgICAgICAgIC8vIGlzIHRoZSBjbGFpbSdzIFwic3RhcnQgUE9TVCBzZW50XCIgKFJTRlMncyBlbmQpLCB0aGUgcmV0dXJuIGlzIHRoZVxuICAgICAgICAgIC8vIGNsYWltJ3MgY29tcGxldGlvbiAoVFRSJ3MgVDYpIOKAlCB0aGUgc2FtZSB0d28gaW5zdGFudHMgdGhlIGxhenlcbiAgICAgICAgICAvLyBjbGFpbSdzIG93biBQT1NUIHdvdWxkIGhhdmUgcHJvZHVjZWQuXG4gICAgICAgICAgY29uc3QgYmF0Y2hQb3N0U2VudEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogYmF0Y2hGYW5vdXRFbGlnaWJsZSBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgY29uc3QgeyByZXN1bHRzIH0gPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlQmF0Y2ghKFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBjaHVuay5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsXG4gICAgICAgICAgICAgIC8vIFRoZSBzdGFydGVkIHJvdyBpcyB0aGUgc3RlcCdzIGV4ZWN1dGluZyBjbGFpbSwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAvLyB0aGUgY29tcHV0ZS1pbnN0YW5jZSBhdHRyaWJ1dGlvbiB0aGUgc2luZ2xlIGNsYWltIHNlbmRzIHZpYVxuICAgICAgICAgICAgICAvLyBDcmVhdGVFdmVudFBhcmFtcy5cbiAgICAgICAgICAgICAgLi4uKGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCdcbiAgICAgICAgICAgICAgICA/IHsgY29tcHV0ZUluc3RhbmNlSWQ6IENPTVBVVEVfSU5TVEFOQ0VfSUQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgLy8gUGVyLXdyaXRlIHJlcXVlc3QgYXR0cmlidXRpb24sIHNhbWUgYXMgdGhlIHNpbmdsZSBwYXRoJ3NcbiAgICAgICAgICAgIC8vIGNyZWF0ZUd1YXJkZWQo4oCmLCB7IHJlcXVlc3RJZCB9KS5cbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltQ29tcGxldGVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNodW5rW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChpdGVtLmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmtpbmQgPT09ICdzdGVwJykge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMuYWRkKGVudHJ5LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBjb21taXR0ZWQ6IHRoaXMgaW52b2NhdGlvbiBvd25zIHRoZSBzdGVwIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjYWxsZXIgcnVucyB0aGUgYm9keSB3aXRoIG5vIGNsYWltIG9mIGl0cyBvd24uIFRoZVxuICAgICAgICAgICAgICAgIC8vIHJlYWRiYWNrIGVudGl0eSBpcyBhdXRob3JpdGF0aXZlIHdoZXJlIHByZXNlbnQ7IGEgV29ybGRcbiAgICAgICAgICAgICAgICAvLyB0aGF0IG9taXR0ZWQgaXQgZ2V0cyB0aGUgc2FtZSBsb2NhbGx5IHN5bnRoZXNpemVkIHJ1bm5pbmdcbiAgICAgICAgICAgICAgICAvLyBhdHRlbXB0LTEgdGhlIG9wdGltaXN0aWMgcGF0aCBleGVjdXRlcyBhZ2FpbnN0LiBFaXRoZXJcbiAgICAgICAgICAgICAgICAvLyB3YXkgdGhlIGlucHV0IGlzIHJlLWF0dGFjaGVkIGxvY2FsbHkg4oCUIGJhdGNoIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiByZWZzIGxhemlseSwgYW5kIHRoZSBib2R5J3MgaHlkcmF0aW9uIHdhbnRzIHRoZVxuICAgICAgICAgICAgICAgIC8vIGV4YWN0IGJ5dGVzIHRoZSBwYWlyJ3MgY3JlYXRlZCByb3cgY2FycmllZC4gKFRoZSBjcmVhdGVkXG4gICAgICAgICAgICAgICAgLy8gcm93J3Mgc3VjY2VzcyBpcyBkZWxpYmVyYXRlbHkgTk9UIG1lbWJlcnNoaXAgaW5cbiAgICAgICAgICAgICAgICAvLyBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOiBmb3IgaW5saW5lIHN0ZXBzIG93bmVyc2hpcCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydGVkIHJvdydzIHZlcmRpY3QsIGFuZCB0aGUgY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzc1xuICAgICAgICAgICAgICAgIC8vIHNraXBzIGlubGluZSBjb3JyZWxhdGlvbiBpZHMgcmVnYXJkbGVzcy4pXG4gICAgICAgICAgICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuZ2V0KFxuICAgICAgICAgICAgICAgICAgZW50cnkuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBzYW1lIHByZXAgb3AgdGhhdCBlbnF1ZXVlZCB0aGUgcGFpciBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZW50cnksIGFuZCB0aGUgZmx1c2ggYXdhaXRlZCBldmVyeSBwcmVwIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIE5vdCBmcmVlIGlmIGl0IGV2ZXIgZmlyZXMsIHRob3VnaDogdGhlIHBhaXIgaXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBoZXJlLCBzbyB0aGlzIHRocm93cyB3aXRoIHRoZSBzdGVwIGNsYWltZWQgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgYm9keSBuZXZlciBydW4uIFRoZSBkZWxpdmVyeSBmYWlscywgYW5kIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJzIGl0IHRocm91Z2ggb3duZWQtcmVjb3ZlcnkgKHRoZSBzdGVwIGNhcnJpZXMgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93bmVyc2hpcCBzdGFtcCkgcmF0aGVyIHRoYW4gdGhlIHJlcXVlc3QganVzdFxuICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyBjbGVhbmx5LlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYG5vIGRlaHlkcmF0ZWQgaW5wdXQgZm9yIHByZS1jbGFpbWVkIHN0ZXAgJHtlbnRyeS5jb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgICAgICAgIHsgc3RhdHVzOiA1MDAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydGVkU3RlcDogU3RhcnRlZFN0ZXAgPSBpdGVtLnN0ZXA/LnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgPyB7IC4uLml0ZW0uc3RlcCwgc3RhcnRlZEF0OiBpdGVtLnN0ZXAuc3RhcnRlZEF0IH1cbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogZGVoeWRyYXRlZC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlubGluZUNsYWltcy5zZXQoZW50cnkuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgICAgICAgICAgb3duZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBzdGVwOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXJ0ZWRTdGVwLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogZGVoeWRyYXRlZC5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmF0Y2hQb3N0U2VudEF0TXMsXG4gICAgICAgICAgICAgICAgICBjbGFpbUNvbXBsZXRlZEF0TXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1jcmVhdGVkJyB8fFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCdcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHBhaXIgbG9zdCBpdHMgYXRvbWljIGNyZWF0ZS1jbGFpbTogYSBjb25jdXJyZW50IHdyaXRlclxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3ducyB0aGlzIHN0ZXAgKGFuIGVhcmxpZXIgZGVsaXZlcnkncyBjcmVhdGUsIG9yIGFcbiAgICAgICAgICAgICAgICAvLyByYWNpbmcgaGFuZGxlcidzIGNsYWltKS4gUmVjb3JkZWQgYXMgYSBsb3N0IGNsYWltIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjYWxsZXIncyBleGVjdXRlU3RlcCByZXR1cm5zIGBza2lwcGVkYCB3aXRob3V0IHJ1bm5pbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gYm9keSwgdGhlIHNhbWUgb3V0Y29tZSBhcyBsb3NpbmcgdGhlIGxhenkgY2xhaW0uIEEgV29ybGRcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGZvbGRzIHRoZSBwYWlyIHJlcG9ydHMgdGhlIDQwOSBvbiBib3RoIHJvd3MgKHNldFxuICAgICAgICAgICAgICAgIC8vIHR3aWNlLCBoYXJtbGVzcyk7IG9uZSB0aGF0IGV2YWx1YXRlcyByb3dzIGluZGVwZW5kZW50bHlcbiAgICAgICAgICAgICAgICAvLyBoYXMgdGhlIHN0YXJ0ZWQgcm93IOKAlCBwcm9jZXNzZWQgc2Vjb25kIOKAlCBkZWNpZGUsIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgLy8gZXhhY3RseSB0aGUgc2luZ2xlIHBhdGgncyBzZW1hbnRpY3MgKGNyZWF0ZSBsb3N0ICsgY2xhaW1cbiAgICAgICAgICAgICAgICAvLyB3b24gc3RpbGwgcnVucyB0aGUgYm9keTsgY3JlYXRlIHdvbiArIGNsYWltIGxvc3Qgc2tpcHMpLlxuICAgICAgICAgICAgICAgIGlubGluZUNsYWltcy5zZXQoZW50cnkuY29ycmVsYXRpb25JZCwgeyBvd25lZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdJbmxpbmUgc3RlcCBwcmUtY2xhaW0gbG9zdCwgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTYW1lIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgncyBFbnRpdHlDb25mbGljdEVycm9yOiBhXG4gICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgb3IgZWFybGllciBkZWxpdmVyeSBhbHJlYWR5IGNyZWF0ZWQgaXQuXG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpdGVtLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBiYXRjaGVkICR7ZW50cnkuZXZlbnQuZXZlbnRUeXBlfSBmb3IgJHtlbnRyeS5jb3JyZWxhdGlvbklkfSBgICtcbiAgICAgICAgICAgICAgICBgZmFpbGVkOiAke2l0ZW0uZXJyb3J9OiAke2l0ZW0ubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB7IHN0YXR1czogaXRlbS5zdGF0dXMgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSGlnaGVzdCBzbG90IHRoaXMgY2h1bmsgY29tbWl0dGVkOiB0aGUgY2VpbGluZyB0aGUgY2FsbGVyIGZvbGRzXG4gICAgICAgICAgLy8gaW50byB0aGUgaW5saW5lIGV4ZWN1dGlvbnMnIHNsb3Qgc25hcHNob3QgKHNlZVxuICAgICAgICAgIC8vIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0LmJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcpIGFuZCBvbmUgaW5wdXRcbiAgICAgICAgICAvLyBvZiB0aGUgaW50ZXJsZWF2aW5nIGRpYWdub3N0aWMuXG4gICAgICAgICAgY29uc3QgY2h1bmtNYXhTbG90ID0gbWF4RXZlbnRTbG90KFxuICAgICAgICAgICAgcmVzdWx0cy5mbGF0TWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICBpdGVtLmVycm9yID09PSB1bmRlZmluZWQgJiYgaXRlbS5ldmVudCA/IFtpdGVtLmV2ZW50XSA6IFtdXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaHVua01heFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBjaHVua01heFNsb3QgPiBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyA9IGNodW5rTWF4U2xvdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tbWl0dGVkQ291bnQgKz0gcmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5lcnJvciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2h1bmtNYXhTbG90ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIChtYXhDb21taXR0ZWRTbG90ID09PSB1bmRlZmluZWQgfHwgY2h1bmtNYXhTbG90ID4gbWF4Q29tbWl0dGVkU2xvdClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgPSBjaHVua01heFNsb3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdGhlIGNodW5rJ3MgZWFnZXIgc3RlcHMnIHF1ZXVlIG1lc3NhZ2VzIHRoZSBtb21lbnQgSVRTXG4gICAgICAgIC8vIGNyZWF0ZXMgYXJlIGR1cmFibGUg4oCUIHRoZSBwZXItY2h1bmsgaGFsZiBvZiBwdWJsaXNoLWFmdGVyLWNyZWF0ZS5cbiAgICAgICAgLy8gU2FtZSBtZXNzYWdlIHNoYXBlIGFuZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgYXMgdGhlXG4gICAgICAgIC8vIGNhbGxlcidzIGRpc3BhdGNoIHBhc3MsIHNvIGFueXRoaW5nIGRvdWJsZS1wdWJsaXNoZWQgZGVkdXBlcy5cbiAgICAgICAgY29uc3QgcHVibGlzaENodW5rU3RlcHMgPSBhc3luYyAoXG4gICAgICAgICAgY2h1bms6IHR5cGVvZiBlbnRyaWVzXG4gICAgICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIGlmICghcHVibGlzaEVhZ2VyU3RlcHMpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBzdGVwRW50cmllcyA9IGNodW5rLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09ICdzdGVwJyk7XG4gICAgICAgICAgaWYgKHN0ZXBFbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IGdldFN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgc3RlcEVudHJpZXMubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcHVibGlzaEVhZ2VyU3RlcHMgaW1wbGllcyBwcmVzZW5jZVxuICAgICAgICAgICAgICAgIHN0ZXBEaXNwYXRjaCEucXVldWVOYW1lLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBzZXQgb24gZXZlcnkgJ3N0ZXAnIGVudHJ5IGF0IGVucXVldWVcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBlbnRyeS5zdGVwTmFtZSEsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBzZXQgb24gZXZlcnkgJ3N0ZXAnIGVudHJ5IGF0IGVucXVldWVcbiAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RlcE5hbWUhXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTGF1bmNoIGV2ZXJ5IGNodW5rJ3MgUE9TVCBub3c7IGNoYWluIGVhY2ggY2h1bmsncyBwdWJsaXNoZXMgb24gaXRzXG4gICAgICAgIC8vIE9XTiBjb21taXQuIEEgY2h1bmsgd2hvc2UgY29tbWl0IHJlamVjdGVkIGtlZXBzIGl0cyBtZXNzYWdlc1xuICAgICAgICAvLyB1bnNlbnQgKHRoZSByZWplY3Rpb24gZmFpbHMgdGhlIGRlbGl2ZXJ5OyByZWRlbGl2ZXJ5IHJlLWNyZWF0ZXNcbiAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMsIGRlZHVwZWQgYnkgdGhlIGlkZW1wb3RlbmN5IGtleXMpLlxuICAgICAgICBjb25zdCBjb21taXRzID0gY2h1bmtzLm1hcCgoY2h1bmspID0+IGNvbW1pdENodW5rKGNodW5rKSk7XG4gICAgICAgIGNvbnN0IHB1Ymxpc2hlcyA9IGNodW5rcy5tYXAoYXN5bmMgKGNodW5rLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNvbW1pdHNbaW5kZXhdO1xuICAgICAgICAgIGF3YWl0IHB1Ymxpc2hDaHVua1N0ZXBzKGNodW5rKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdHJhaWxpbmcgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIExldCBldmVyeSBzaWJsaW5nIHNldHRsZSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBmaXJzdCBmYWlsdXJlOiBhXG4gICAgICAgICAgLy8gY2h1bmsgdGhhdCBjb21taXR0ZWQgbXVzdCBzdGlsbCBnZXQgaXRzIHB1Ymxpc2hlcyBvdXQgZXZlbiB3aGVuXG4gICAgICAgICAgLy8gYW5vdGhlciBjaHVuayBmYWlsZWQsIGFuZCB0aGUgY2FsbGVyIGFja3Mgb25seSBhZnRlciB0aGlzXG4gICAgICAgICAgLy8gcmVzb2x2ZXMuXG4gICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4uY29tbWl0cywgLi4ucHVibGlzaGVzXSk7XG4gICAgICAgICAgLy8gRm9yZWlnbi1pbnRlcmxlYXZpbmcgdmlzaWJpbGl0eTogdGhlIGJhdGNoIGVuZHBvaW50IGhhcyBub1xuICAgICAgICAgIC8vIGJ1bXAtYW5kLXJlcG9ydCwgc28gZXZlbnRzIG90aGVyIHdyaXRlcnMgbGFuZGVkIGJldHdlZW4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgYW5kIHRoZXNlIGNvbW1pdHMgcHVzaGVkIHRoZSBmb2xkIHRvIGhpZ2hlciBzbG90c1xuICAgICAgICAgIC8vIFdJVEhPVVQgaGFuZGluZyB1cyB0aGUgc2tpcHBlZCBldmVudHMuIFNhbWUgYWNjZXB0ZWQgZXhwb3N1cmVcbiAgICAgICAgICAvLyBhcyBhIGRyb3BwZWQgdHJ1bmNhdGVkIHJlcG9ydCBvbiB0aGUgc2luZ2xlIHBhdGg6IHRoZSBsb2NhbFxuICAgICAgICAgIC8vIGxvZyBzdGF5cyBhIHN0cmljdCBwcmVmaXggYW5kIHRoZSBuZXh0IHJlbG9hZCBvYnNlcnZlcyB0aGVtLlxuICAgICAgICAgIC8vIExvZ2dlZCBzbyBhIGJ1bXAgaXMgZGlhZ25vc2FibGUgcmF0aGVyIHRoYW4gc2lsZW50LlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGV4cGVjdGVkRmlyc3RTbG90ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJsZWF2ZWQgPVxuICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90IC0gZXhwZWN0ZWRGaXJzdFNsb3QgKyAxIC0gY29tbWl0dGVkQ291bnQ7XG4gICAgICAgICAgICBpZiAoaW50ZXJsZWF2ZWQgPiAwKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0JhdGNoZWQgZmFuLW91dCBjb21taXR0ZWQgYWJvdmUgc25hcHNob3QnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QsXG4gICAgICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRDb3VudCxcbiAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZhaWx1cmUgPSBzZXR0bGVkLmZpbmQoXG4gICAgICAgICAgICAob3V0Y29tZSk6IG91dGNvbWUgaXMgUHJvbWlzZVJlamVjdGVkUmVzdWx0ID0+XG4gICAgICAgICAgICAgIG91dGNvbWUuc3RhdHVzID09PSAncmVqZWN0ZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmFpbHVyZSkgdGhyb3cgZmFpbHVyZS5yZWFzb247XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgLy8gRVZFUlkgY2h1bmsgY2FycnlpbmcgcGFpcnMgZ2F0ZXMgdGhlIHJldHVybiwgbm90IGp1c3QgdGhlIGZpcnN0OlxuICAgICAgICAvLyBhIHBhaXIgd2hvc2UgY29tbWl0IHRoZSBjYWxsZXIgaGFzIG5vdCBzZWVuIHlpZWxkcyBub1xuICAgICAgICAvLyBgaW5saW5lQ2xhaW1zYCBlbnRyeSwgc28gdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIGEgbGF6eVxuICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCB0aGF0IHdvdWxkIHJhY2UgdGhpcyBzYW1lIGZvbGQncyBzdGlsbC1pbi1mbGlnaHRcbiAgICAgICAgLy8gcGFpciBmb3IgdGhlIHNhbWUgc3RlcC4gVG9kYXkgcGFpcnMgYWx3YXlzIGxhbmQgaW4gb25lIGNodW5rXG4gICAgICAgIC8vICh0aGV5IHNvcnQgZmlyc3QsIGFuZCB0d28gcm93cyBwZXIgaW5saW5lIHN0ZXAgZml0IGluc2lkZSBvbmVcbiAgICAgICAgLy8gY2h1bmsg4oCUIHBpbm5lZCBieSBjb25zdGFudHMudGVzdC50cyksIHNvIHRoaXMgaXMgYXQgbW9zdCBvbmVcbiAgICAgICAgLy8gY29tbWl0OyB0aGUgZmlsdGVyIGlzIHdoYXQga2VlcHMgdGhlIHByb3BlcnR5IHRydWUgaWYgZWl0aGVyIGNhcFxuICAgICAgICAvLyBtb3Zlcy5cbiAgICAgICAgY29uc3QgcGFpckNvbW1pdHMgPSBjaHVua3MuZmxhdE1hcCgoY2h1bmssIGluZGV4KSA9PlxuICAgICAgICAgIGNodW5rLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5raW5kID09PSAnaW5saW5lLXN0YXJ0ZWQnKVxuICAgICAgICAgICAgPyBbY29tbWl0c1tpbmRleF1dXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbGxvd0RlZmVycmVkQmF0Y2hXb3JrKSB7XG4gICAgICAgICAgLy8gVGhlIHRyYWlsaW5nIHdvcmsgaXMgdGhlIGNhbGxlcidzIHRvIGpvaW4gYmVmb3JlIGFjay4gQXR0YWNoIGFcbiAgICAgICAgICAvLyBoYW5kbGVyIG5vdyBzbyBhIHJlamVjdGlvbiB0aGF0IHJhY2VzIHRoYXQgam9pbiAob3IgYSBmb3JlZ3JvdW5kXG4gICAgICAgICAgLy8gZmFpbHVyZSB0aGF0IHByZXZlbnRzIHRoZSBjYWxsZXIgZnJvbSBldmVyIHJlYWNoaW5nIGl0KSBpcyBuZXZlclxuICAgICAgICAgIC8vIGFuIHVuaGFuZGxlZFJlamVjdGlvbiDigJQgYXdhaXRpbmcgdGhlIHByb21pc2Ugc3RpbGwgb2JzZXJ2ZXMgaXQuXG4gICAgICAgICAgdHJhaWxpbmcuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIGRlZmVycmVkQmF0Y2hXb3JrID0gdHJhaWxpbmc7XG4gICAgICAgICAgLy8gT25seSB0aGUgcGFpciBjaHVua3MgZ2F0ZSB0aGUgcmV0dXJuOiB0aGVpciBjbGFpbXMgYXJlIHdoYXQgdGhlXG4gICAgICAgICAgLy8gY2FsbGVyIHN0YXJ0cyB0aGUgaW5saW5lIGJvZGllcyBmcm9tLiBXaXRoIG5vIHBhaXJzIHRoZXJlIGlzXG4gICAgICAgICAgLy8gbm90aGluZyB0aGUgY2FsbGVyJ3MgcG9zdC1yZXR1cm4gd29yayByZWFkcyBmcm9tIHRoZSBjb21taXRzLFxuICAgICAgICAgIC8vIHNvIG5vdGhpbmcgZ2F0ZXMuXG4gICAgICAgICAgaWYgKHBhaXJDb21taXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBhaXJDb21taXRzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBBIHBhaXIgY2h1bmsgZmFpbGVkLCBzbyB0aGlzIHBoYXNlJ3Mgd3JpdGUgc2V0IGlzIE5PVCB0aGVcbiAgICAgICAgICAgICAgLy8gY2FsbGVyJ3MgdG8gam9pbiBhbnkgbW9yZSDigJQgYGRlZmVycmVkQmF0Y2hXb3JrYCBuZXZlclxuICAgICAgICAgICAgICAvLyByZWFjaGVzIGl0IG9uY2UgaGFuZGxlU3VzcGVuc2lvbiB0aHJvd3MuIFNldHRsZSB0aGUgcmVzdFxuICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlamVjdGlvbiBlc2NhcGVzLCBmb3IgdGhlIHJlYXNvbiBgc2V0dGxlUGhhc2VgXG4gICAgICAgICAgICAgIC8vIGdpdmVzOiBhIHNpYmxpbmcgY3JlYXRlIGxhbmRpbmcgYWZ0ZXIgdGhlIHRocm93IGNvbW1pdHMgYW5cbiAgICAgICAgICAgICAgLy8gZXZlbnQgZnJvbSB0aGUgYWJhbmRvbmVkIHJlcGxheSdzIHNlZWRlZCBzZXF1ZW5jZSBhbmQgcmFjZXNcbiAgICAgICAgICAgICAgLy8gdGhlIGNhbGxlcidzIHJlc3RhcnQgcmVsb2FkIHdoaWxlIGRvaW5nIHNvLlxuICAgICAgICAgICAgICBhd2FpdCB0cmFpbGluZy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdHJhaWxpbmc7XG4gICAgICAgIH1cbiAgICAgIH0pKClcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2YgYXR0cmlidXRlSXRlbXMpIHtcbiAgICBvcHMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICAvLyBHdWFyZGVkIGxpa2UgZXZlcnkgb3RoZXIgc3VzcGVuc2lvbiB3cml0ZTogYW4gYXR0cl9zZXQgaXMgYVxuICAgICAgICAgIC8vIHJlcGxheS1kZXJpdmVkIGV2ZW50IHdpdGggYSBjb3JyZWxhdGlvbiBpZCBmcm9tIHRoaXMgcmVwbGF5J3NcbiAgICAgICAgICAvLyBzZWVkZWQgc2VxdWVuY2UsIHNvIGl0IG11c3Qgbm90IGxhbmQgb24gYSBsb2cgdGhlIHJlcGxheSBuZXZlclxuICAgICAgICAgIC8vIHNhdy4gUmVqZWN0aW5nIGl0IGlzIGNoZWFwIOKAlCBhIHJ1biB3aXRoIGF0dHJpYnV0ZSBldmVudHMgYWxyZWFkeVxuICAgICAgICAgIC8vIGZvcmNlcyBhbiBpbi1wcm9jZXNzIHJlcGxheSwgc28gdGhlIHJlc3RhcnQgY29zdHMgdGhlIHJlcGxheSBpdFxuICAgICAgICAgIC8vIHdhcyBnb2luZyB0byBkbyBhbnl3YXkuXG4gICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnYXR0cl9zZXQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBxdWV1ZUl0ZW0uY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihxdWV1ZUl0ZW0uYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnV29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycikpIHtcbiAgICAgICAgICAgIC8vIERldGVybWluaXN0aWMgdmFsaWRhdGlvbiByZWplY3Rpb24gZnJvbSB0aGUgV29ybGQg4oCUIGUuZy4gdGhlXG4gICAgICAgICAgICAvLyBjdW11bGF0aXZlIHBlci1ydW4gYXR0cmlidXRlIGNhcCwgd2hpY2ggb25seSB0aGUgV29ybGQgY2FuXG4gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IHRoZSBydW4ncyBleGlzdGluZyBhdHRyaWJ1dGVzLiBSZWRlbGl2ZXJpbmcgdGhlXG4gICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSByZXBsYXlzIHRoZSB3b3JrZmxvdyBpbnRvIHRoZSBleGFjdCBzYW1lXG4gICAgICAgICAgICAvLyB3cml0ZSBhbmQgdGhlIGV4YWN0IHNhbWUgcmVqZWN0aW9uLCBzbyByZXRyeWluZyBjYW4gbmV2ZXJcbiAgICAgICAgICAgIC8vIHN1Y2NlZWQuIFN1cmZhY2UgaXQgYXMgYSBGYXRhbEVycm9yIHNvIHRoZSBjYWxsZXIgZmFpbHMgdGhlXG4gICAgICAgICAgICAvLyBydW4gd2l0aCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyBpdCBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgY29uc3QgZmF0YWwgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYHNldEF0dHJpYnV0ZXMgZmFpbGVkIFdvcmxkIHZhbGlkYXRpb246ICR7XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmF0YWwuY2F1c2UgPSBlcnI7XG4gICAgICAgICAgICB0aHJvdyBmYXRhbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICAvLyBBd2FpdCB0aGUgc3RlcF9jcmVhdGVkIC8gd2FpdF9jcmVhdGVkIGV2ZW50IGNyZWF0ZXMgYmVmb3JlIHJldHVybmluZy5cbiAgLy8gVGhlIGNhbGxlciAod29ya2Zsb3dFbnRyeXBvaW50KSBvbmx5IGVucXVldWVzIHRoZSBzdGVwLWRpc3BhdGNoIHF1ZXVlXG4gIC8vIG1lc3NhZ2VzIEFGVEVSIGhhbmRsZVN1c3BlbnNpb24gcmVzb2x2ZXMsIGFuZCB0aGUgcXVldWUgaGFuZGxlciBhY2tzXG4gIC8vIHRoZSBvcmNoZXN0cmF0b3IgbWVzc2FnZSBvbmx5IGFmdGVyIHRoZSBjYWxsZXIgcmVzb2x2ZXMuIFNvIHRoZSBzdGVwX2NyZWF0ZWRcbiAgLy8gZXZlbnRzIG11c3QgYmUgZHVyYWJsZSBoZXJlLCBhbmQgdGhlIGRpc3BhdGNoIHNlbmRzIG11c3QgY29tcGxldGUgaW4gdGhlIGNhbGxlcixcbiAgLy8gYWxsIGJlZm9yZSBhY2suIElmIHRoZSBwcm9jZXNzIGNyYXNoZXMgYmVmb3JlIHRoaXMgcmVzb2x2ZXMsIHRoZSBvcmNoZXN0cmF0b3JcbiAgLy8gbWVzc2FnZSBpcyBub3QgYWNrZWQgYW5kIFZRUyByZWRlbGl2ZXJzLCByZS1jcmVhdGVzIHRoZSAoaWRlbXBvdGVudClcbiAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLCBhbmQgcmVjb3ZlcnMgdGhlIHJ1biBpbnN0ZWFkIG9mIG9ycGhhbmluZyBpdC5cbiAgYXdhaXQgc2V0dGxlUGhhc2Uob3BzKTtcblxuICAvLyBUaGUgc3RlcC1pbnB1dCBkZWh5ZHJhdGlvbnMgYWJvdmUgaGF2ZSBzZXR0bGVkLCBzbyB0aGUgc2luayBpcyBmaW5hbC5cbiAgY29uc3QgcmV0YWluZWRTdGVwSW5wdXRzU2FmZSA9IGd1ZXN0Q29kZVN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoID09PSAwO1xuICBpZiAoIXJldGFpbmVkU3RlcElucHV0c1NhZmUpIHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgJ1NlcmlhbGl6aW5nIHN0ZXAgaW5wdXRzIGV4ZWN1dGVkIHdvcmtmbG93IGNvZGU7IGZhbGxpbmcgYmFjayB0byByZXBsYXkgaW5zdGVhZCBvZiByZXRhaW5pbmcgdGhlIFZNJyxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV4ZWN1dGlvbnM6IGd1ZXN0Q29kZVN0YXRzLmV4ZWN1dGlvbnNcbiAgICAgICAgICAuc2xpY2UoMCwgNSlcbiAgICAgICAgICAubWFwKChlKSA9PiAoZS5kZXRhaWwgPyBgJHtlLmtpbmR9KCR7ZS5kZXRhaWx9KWAgOiBlLmtpbmQpKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLy8gUmVidWlsZCB0aGUgaW5saW5lIGJhdGNoIGluIGRldGVybWluaXN0aWMgb3JkZXIuIGBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHNgXG4gIC8vIGlzIGEgU2V0IHNlZWRlZCBmcm9tIHRoZSBvcmRlcmVkIGZpcnN0LU4gc2xpY2UsIHNvIGl0ZXJhdGluZyBpdCBwcmVzZXJ2ZXNcbiAgLy8gc3RlcEl0ZW1zIG9yZGVyOyBldmVyeSBpZCBpbiBpdCB3YXMgc2V0IGJ5IHRoZSBsYXp5IGJyYW5jaCBhYm92ZS5cbiAgY29uc3QgbGF6eUlubGluZVN0ZXBzOiBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdFsnbGF6eUlubGluZVN0ZXBzJ10gPSBbXTtcbiAgZm9yIChjb25zdCBjb3JyZWxhdGlvbklkIG9mIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcykge1xuICAgIGNvbnN0IGxhenlTdGVwID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgaWYgKGxhenlTdGVwKSBsYXp5SW5saW5lU3RlcHMucHVzaChsYXp5U3RlcCk7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCAobWluaW11bSB0aW1lb3V0KVxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBsZXQgc29vbmVzdFdhaXQ6IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgY29uc3QgcmVzdW1lQXRNcyA9IHF1ZXVlSXRlbS5yZXN1bWVBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgZGVsYXlNcyA9IE1hdGgubWF4KDEwMDAsIHJlc3VtZUF0TXMgLSBub3cpO1xuICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5jZWlsKGRlbGF5TXMgLyAxMDAwKTtcbiAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHRpbWVvdXRTZWNvbmRzIDwgc29vbmVzdFdhaXQuc2Vjb25kcykge1xuICAgICAgc29vbmVzdFdhaXQgPSB7XG4gICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCd3b3JrZmxvd19zdXNwZW5kZWQnKSxcbiAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGVwc0NyZWF0ZWQoc3RlcEl0ZW1zLmxlbmd0aCksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93SG9va3NDcmVhdGVkKGhvb2tzTmVlZGluZ0NyZWF0aW9uLmxlbmd0aCksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93V2FpdHNDcmVhdGVkKHdhaXRJdGVtcy5sZW5ndGgpLFxuICAgIC4uLihyZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCA+IDBcbiAgICAgID8gQXR0cmlidXRlLlN0ZXBSZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZChyZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZClcbiAgICAgIDoge30pLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHBlbmRpbmdTdGVwczogc3RlcEl0ZW1zLFxuICAgIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIGxhenlJbmxpbmVTdGVwcyxcbiAgICBpbmxpbmVDbGFpbXMsXG4gICAgYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyxcbiAgICBkZWZlcnJlZEJhdGNoV29yayxcbiAgICAvLyBPbiBob29rIGNvbmZsaWN0IHRoZSBjYWxsZXIgcmUtaW52b2tlcyBpbW1lZGlhdGVseSBhbmQgbmV2ZXIgcmVhZHNcbiAgICAvLyB0aGUgd2FpdCB0aW1lb3V0LCBzbyBkb24ndCByZXBvcnQgb25lLlxuICAgIHdhaXRUaW1lb3V0OiBoYXNIb29rQ29uZmxpY3QgPyB1bmRlZmluZWQgOiBzb29uZXN0V2FpdCxcbiAgICBoYXNIb29rQ29uZmxpY3QsXG4gICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICBoYXNBdHRyaWJ1dGVFdmVudHM6IGF0dHJpYnV0ZUl0ZW1zLmxlbmd0aCA+IDAsXG4gICAgaGFzSG9va0V2ZW50czogaG9va3NOZWVkaW5nQ3JlYXRpb24ubGVuZ3RoID4gMCxcbiAgICBob29rQ3JlYXRpb25NcyxcbiAgICByZXRhaW5lZFN0ZXBJbnB1dHNTYWZlLFxuICAgIHJlcG9ydGVkRXZlbnRDb3VudDogcmVwb3J0ZWRFdmVudHMsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBgZXZlbnRzLmNyZWF0ZWAgcmVqZWN0aW9uIGlzIGRldGVybWluaXN0aWMgV29ybGQgdmFsaWRhdGlvblxuICogcmF0aGVyIHRoYW4gYSB0cmFuc2llbnQvc3RvcmFnZSBlcnJvci4gTG9jYWwgV29ybGRzXG4gKiAod29ybGQtbG9jYWwsIHdvcmxkLXBvc3RncmVzKSB0aHJvdyBgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yYCBkaXJlY3RseTtcbiAqIHJlbW90ZSBXb3JsZHMgc3VyZmFjZSB0aGUgZXF1aXZhbGVudCBzZXJ2ZXItc2lkZSByZWplY3Rpb24gYXMgYVxuICogYFdvcmtmbG93V29ybGRFcnJvcmAgd2l0aCBIVFRQIHN0YXR1cyA0MDAuIFRoZSBuYW1lIGNoZWNrIGNvdmVyc1xuICogYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgaW5zdGFuY2VzIGZyb20gYSBkaWZmZXJlbnQgY29weSBvZlxuICogYEB3b3JrZmxvdy93b3JsZGAgdGhhbiB0aGUgb25lIHRoaXMgcGFja2FnZSByZXNvbHZlZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSAnQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSAmJiBlcnIuc3RhdHVzID09PSA0MDA7XG59XG4iXX0=
|
|
1344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VzcGVuc2lvbi1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsd0JBQXdCLEVBS3hCLG9CQUFvQixFQUNwQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1DQUFtQyxHQU1wQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVE3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxpQ0FBaUMsR0FHbEMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIseUJBQXlCLEVBQ3pCLDhCQUE4QixFQUM5Qix1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHVCQUF1QixFQUd2QixZQUFZLEVBQ1osWUFBWSxFQUNaLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FDM0IsTUFBTSxjQUFjLENBQUM7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QUM7UUFDcEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgdHlwZSBTZXJpYWxpemVkRGF0YSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbiAgdHlwZSBTdGFydGVkU3RlcCxcbiAgdHlwZSBUcmFjZUNhcnJpZXIsXG4gIHR5cGUgVmFsaWRRdWV1ZU5hbWUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0sXG4gIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLFxuICBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQsXG4gIHR5cGUgR3Vlc3RDb2RlRXhlY3V0aW9uLFxuICB0eXBlIEd1ZXN0Q29kZVN0YXRzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWRGcm9tVG9rZW4gfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzQmF0Y2hUcmFuc2l0aW9uc0VuYWJsZWQsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMsXG4gIE1BWF9SRVNJTElFTlRfU1RFUF9JTlBVVF9CWVRFUyxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIHR5cGUgRXZlbnRDcmVhdG9yLFxuICB0eXBlIExvYWRlZEV2ZW50TG9nLFxuICBtYXhFdmVudFNsb3QsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFByZWNsYWltZWRJbmxpbmVTdGFydCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyIH0gZnJvbSAnLi91bnNlcmlhbGl6YWJsZS1zdGVwLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcyB7XG4gIHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW46IFdvcmtmbG93UnVuO1xuICBzcGFuPzogU3BhbjtcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUncyBsb2FkZWQgZXZlbnQgbG9nLiBFdmVyeSBldmVudCBjcmVhdGlvbiB0aGlzIHN1c3BlbnNpb24gbWFrZXNcbiAgICogbmFtZXMgdGhlIHBvc2l0aW9uIGl0IHdhcyBkZXJpdmVkIGZyb20sIHNvIGEgYmFja2VuZCB0aGF0IGhhcyByZWNvcmRlZFxuICAgKiBldmVudHMgdGhlIHJlcGxheSBkaWQgbm90IHNlZSBjYW4gcmVwb3J0IHRoZW0gYmFjayBvbiB0aGUgd3JpdGUsIG9yLCBpZlxuICAgKiBpdCB3b3VsZCByYXRoZXIgcmVmdXNlIHRoYW4gcmVwb3J0LCByZWplY3QgaXQgd2l0aCBhIDQxMi4gQSByZWplY3Rpb24gaXNcbiAgICogbm90IHJldHJpZWQgaGVyZTogdGhlIGV2ZW50J3MgY29ycmVsYXRpb24gaWQgd2FzIG1pbnRlZCBieSAqdGhpcyogcmVwbGF5J3NcbiAgICogc2VlZGVkIHNlcXVlbmNlLCBzbyByZS1jb21taXR0aW5nIGl0IGFnYWluc3QgYSBjb3JyZWN0ZWQgbG9nIHdvdWxkIHBlcnNpc3RcbiAgICogYW4gZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgcHJvZHVjZXMuIFRoZSBjYWxsZXIgcmVzdGFydHMgdGhlIHJlcGxheVxuICAgKiBpbnN0ZWFkLlxuICAgKi9cbiAgZXZlbnRMb2c/OiBMb2FkZWRFdmVudExvZztcbiAgLyoqXG4gICAqIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAqIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAodGhlIHJ1biBleGlzdHMpLiBXaGVuIHByZXNlbnQsIGV2ZXJ5IHdvcmxkIHdyaXRlXG4gICAqIHRoaXMgc3VzcGVuc2lvbiBwZXJmb3JtcyAoYGhvb2tfY3JlYXRlZGAsIGB3YWl0X2NyZWF0ZWRgLCBlYWdlciBvdmVyZmxvd1xuICAgKiBgc3RlcF9jcmVhdGVkYCwg4oCmKSBpcyBnYXRlZCBvbiBpdCBzbyB0aGUgd3JpdGUgbmV2ZXIgcmFjZXMgYWhlYWQgb2YgdGhlXG4gICAqIHJ1bidzIGNyZWF0aW9uLiBUaGUgcHVyZSBpbmxpbmUgaG90IHBhdGggZGVmZXJzIGFsbCBvZiBpdHMgc3RlcHMgYW5kIHdyaXRlc1xuICAgKiBub3RoaW5nIGhlcmUsIHNvIGl0IG5ldmVyIGF3YWl0cyB0aGlzIGJhcnJpZXIuIGB1bmRlZmluZWRgIG91dHNpZGUgdHVyYm8sXG4gICAqIHdoZXJlIGBydW5fc3RhcnRlZGAgd2FzIGFscmVhZHkgYXdhaXRlZCB1cCBmcm9udC5cbiAgICovXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBPbmUtc2hvdCB0ZWxlbWV0cnkgcmVwb3J0ZXIsIGFjdGl2YXRlZCBvbmx5IGFmdGVyIHJlcGxheSBoYXMgcmVjb3ZlcmVkLiAqL1xuICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyPzogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcjtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB3aGVuIHByb3ZpZGVkIChhbmQgdGhlIHBlci1zdGVwIGVsaWdpYmlsaXR5IGdhdGVzXG4gICAqIHBhc3MsIHNlZSB0aGUgc3RlcCBvcHMgYmVsb3cpLCBlYWNoIG5ld2x5IGNyZWF0ZWQgbm9uLWlubGluZSBzdGVwJ3NcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgaXMgcGFyYWxsZWxpemVkIHdpdGggaXRzIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlXG4gICAqIHB1Ymxpc2gsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIHN0ZXAgaW5wdXRcbiAgICogKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZVxuICAgKiBkaXJlY3Qgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluXG4gICAqIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5xdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHN9IHNvIHRoZSBjYWxsZXJcbiAgICogc2tpcHMgdGhlbSBpbiBpdHMgb3duIGRpc3BhdGNoIHBhc3MuIE9taXR0ZWQgYnkgY2FsbGVycyB0aGF0IG11c3Qgbm90XG4gICAqIHF1ZXVlICh0ZXJtaW5hbCBkcmFpbiwgdGVzdHMpOyBjcmVhdGVzIHRoZW4gYmVoYXZlIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgc3RlcERpc3BhdGNoPzoge1xuICAgIC8qKiBUaGUgdW5pZmllZCB3b3JrZmxvdyBxdWV1ZSB0aGlzIHJ1bidzIHN0ZXAgbWVzc2FnZXMgYXJlIHB1Ymxpc2hlZCB0by4gKi9cbiAgICBxdWV1ZU5hbWU6IFZhbGlkUXVldWVOYW1lO1xuICAgIC8qKlxuICAgICAqIExhemlseSByZXNvbHZlcyB0aGUgdHJhY2UgY2FycmllciB0byBzdGFtcCBvbiB0aGUgc3RlcCBtZXNzYWdlcy5cbiAgICAgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIHBlciBzdXNwZW5zaW9uIChtZW1vaXplZCBoZXJlKS5cbiAgICAgKi9cbiAgICBnZXRUcmFjZUNhcnJpZXI6ICgpID0+IFByb21pc2U8VHJhY2VDYXJyaWVyPjtcbiAgfTtcbiAgLyoqXG4gICAqIElubGluZSBzdGVwIG93bmVyc2hpcDogdGhlIHF1ZXVlIG1lc3NhZ2UgSUQgb2YgdGhlIGludm9jYXRpb24gdGhpc1xuICAgKiBzdXNwZW5zaW9uIHJ1bnMgaW4gKHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gcHJlc2VudCBBTkQgdGhlXG4gICAqIGJhdGNoZWQgZmFuLW91dCBlbmdhZ2VzLCB0aGUgbGF6eS1pbmxpbmUgc3RlcHMnIGRlZmVycmVkIHdyaXRlcyBhcmVcbiAgICogZm9sZGVkIGludG8gdGhlIGJhdGNoIGFzIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpcnMgKHRoZVxuICAgKiBzdGFydGVkIHJvdyBzdGFtcGVkIHdpdGggdGhpcyBJRCwgZXhhY3RseSBsaWtlIHRoZSBsYXp5IGNsYWltIGl0XG4gICAqIHJlcGxhY2VzKSwgcHJlLWNsYWltaW5nIHRoZSBzdGVwcyB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHJ1biBpbmxpbmUuIFNlZVxuICAgKiB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zfS4gQ2FsbGVycyB0aGF0IG5ldmVyXG4gICAqIGlubGluZS1leGVjdXRlICh0ZXJtaW5hbCBkcmFpbikgb21pdCBpdCwga2VlcGluZyB0aGVpciBsYXp5IHN0ZXBzIG9uIHRoZVxuICAgKiBwbGFpbiBkZWZlcnJlZCBwYXRoLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXQgcmV0dXJuIGJlZm9yZSBldmVyeSBjaHVuayBoYXMgY29tbWl0dGVkOiBvbmx5XG4gICAqIHRoZSBjaHVuayBjYXJyeWluZyB0aGUgcHJlLWNsYWltZWQgaW5saW5lIHBhaXJzIGdhdGVzIHRoZSBoYW5kbGVyJ3NcbiAgICogcmV0dXJuIChpdHMgY2xhaW1zIGFyZSB3aGF0IHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBmcm9tKSwgd2hpbGUgdGhlXG4gICAqIHRyYWlsaW5nIGNodW5rcycgY29tbWl0cyAoYW5kIGV2ZXJ5IGNodW5rJ3MgaW4tZmx1c2ggc3RlcC1tZXNzYWdlXG4gICAqIHB1Ymxpc2hlcykgcmlkZSB7QGxpbmsgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmt9LiBBXG4gICAqIGNhbGxlciB0aGF0IG9wdHMgaW4gTVVTVCBhd2FpdCB0aGF0IHByb21pc2UgYmVmb3JlIGFja2luZyBpdHMgZGVsaXZlcnk6XG4gICAqIHRoZSBkdXJhYmlsaXR5IGNvbnRyYWN0IChcImV2ZXJ5IGNyZWF0ZSBkdXJhYmxlIGJlZm9yZSBhY2tcIikgbW92ZXMgZnJvbVxuICAgKiB0aGUgaGFuZGxlcidzIHJldHVybiB0byB0aGF0IGpvaW4sIGFuZCBub3RoaW5nIGVsc2UgcmUtZHJpdmVzIGEgbG9zdFxuICAgKiB0cmFpbGluZyBjaHVuay4gQ2FsbGVycyB0aGF0IGRvbid0IG9wdCBpbiAodGVybWluYWwgZHJhaW4sIGRlZmF1bHQpXG4gICAqIGtlZXAgdGhlIGV2ZXJ5dGhpbmctZHVyYWJsZS1hdC1yZXR1cm4gYmVoYXZpb3IuXG4gICAqL1xuICBhbGxvd0RlZmVycmVkQmF0Y2hXb3JrPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgaGFuZGxpbmcgYSBzdXNwZW5zaW9uLiBSZXR1cm5zIHBlbmRpbmcgc3RlcCBpdGVtcyBzbyB0aGUgY2FsbGVyXG4gKiBjYW4gZGVjaWRlIHdoaWNoIHRvIGV4ZWN1dGUgaW5saW5lIHZzIHF1ZXVlIHRvIGJhY2tncm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQge1xuICAvKiogUGVuZGluZyBzdGVwIGl0ZW1zIHdpdGggZXZlbnRzIGNyZWF0ZWQgYnV0IE5PVCBxdWV1ZWQgKi9cbiAgcGVuZGluZ1N0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdO1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCB0aGlzIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IChhcyBvcHBvc2VkIHRvIGNhdGNoaW5nIEVudGl0eUNvbmZsaWN0RXJyb3IgYmVjYXVzZVxuICAgKiBhIGNvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCkuIE9ubHkgdGhlIGhhbmRsZXIgdGhhdCB3cm90ZSB0aGVcbiAgICogc3RlcF9jcmVhdGVkIGV2ZW50IHNob3VsZCBxdWV1ZSAvIGlubGluZS1leGVjdXRlIHRoZSBzdGVwOyB0aGlzXG4gICAqIGd1YXJhbnRlZXMgYSBzaW5nbGUgb3duZXIgcGVyIHN0ZXAsIGV2ZW4gd2hlbiBtdWx0aXBsZSBoYW5kbGVycyByYWNlXG4gICAqIGludG8gdGhlIHNhbWUgYmF0Y2ggYm91bmRhcnkuXG4gICAqL1xuICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZS4gRWFjaCB3YXNcbiAgICogZmluYWxpemVkIGhlcmUgYXMgYHN0ZXBfY3JlYXRlZGAgKHdpdGggYSBwbGFjZWhvbGRlciBpbnB1dDsgdGhlIHJlYWxcbiAgICogaW5wdXQgaXMgcHJlY2lzZWx5IHdoYXQgcmVmdXNlZCB0byBzZXJpYWxpemUpIGZvbGxvd2VkIGJ5IGBzdGVwX2ZhaWxlZGBcbiAgICogY2FycnlpbmcgdGhlIFNlcmlhbGl6YXRpb25FcnJvciwgc28gdGhlIG5leHQgcmVwbGF5IHJlamVjdHMgdGhlIHN0ZXAnc1xuICAgKiBwcm9taXNlIGFuZCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcyB0aGUgZXJyb3IsXG4gICAqIGV4YWN0bHkgbGlrZSBhIHN0ZXAtYm9keSBmYWlsdXJlLiBObyBzdGVwLWV4ZWN1dGlvbiBtZXNzYWdlIGlzXG4gICAqIGRpc3BhdGNoZWQgZm9yIHRoZXNlLCBzbyB0aGUgY2FsbGVyIE1VU1QgZm9yY2UgYW4gaW4tcHJvY2VzcyByZXBsYXk6XG4gICAqIHdoZW4gdGhlIGZhaWxlZCBzdGVwIHdhcyB0aGUgb25seSBwZW5kaW5nIHdvcmssIG5vdGhpbmcgZWxzZSB3aWxsIGV2ZXJcbiAgICogcmUtaW52b2tlIHRoZSBydW4gdG8gb2JzZXJ2ZSB0aGUgdGVybWluYWwgZXZlbnQuXG4gICAqL1xuICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogQ29ycmVsYXRpb24gSURzIG9mIHN0ZXBzIHRoaXMgc3VzcGVuc2lvbiBjYWxsIGFscmVhZHkgcHVibGlzaGVkXG4gICAqIHN0ZXAtZXhlY3V0aW9uIHF1ZXVlIG1lc3NhZ2VzIGZvciwgdmlhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoICh0aGVcbiAgICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgcGFyYWxsZWxpemVkIHdpdGggYSBgc3RlcElucHV0YC1jYXJyeWluZyBxdWV1ZVxuICAgKiBwdWJsaXNoKS4gVGhlIGNhbGxlciBNVVNUIE5PVCBkaXNwYXRjaCB0aGVzZSBhZ2FpbjogdGhlIG1lc3NhZ2UgaXNcbiAgICogYWxyZWFkeSBvdXQgKGEgZHVwbGljYXRlIHdvdWxkIGJlIGRlZHVwZWQgYnkgaXRzIGlkZW1wb3RlbmN5IGtleSwgYnV0XG4gICAqIGNvc3RzIGEgd2FzdGVkIHJvdW5kLXRyaXApLiBFbXB0eSB3aGVuIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2h9XG4gICAqIHdhcyBub3QgcHJvdmlkZWQgb3Igbm8gc3RlcCB3YXMgZWxpZ2libGUuXG4gICAqL1xuICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogSG93IG1hbnkgZXZlbnRzIHRoaXMgcGhhc2UncyB3cml0ZXMgcmVwb3J0ZWQgYmFjayBhcyBvY2N1cHlpbmcgc2xvdHMgdGhleVxuICAgKiBza2lwcGVkIG92ZXIsIGFscmVhZHkgbWVyZ2VkIGludG8gdGhlIGNhbGxlcidzIGBldmVudExvZy5ldmVudHNgLiBOb256ZXJvXG4gICAqIG1lYW5zIHRoZSBhcnJheSB3YXMgcmVvcmRlcmVkIHRvIHJlc3RvcmUgc2xvdCBvcmRlciwgc28gYW55IGluZGV4IHRoZVxuICAgKiBjYWxsZXIgY2FjaGVkIGludG8gaXQgKHBheWxvYWQgcHJld2FybSBzY2FuIHBvc2l0aW9uKSBpcyBzdGFsZS5cbiAgICovXG4gIHJlcG9ydGVkRXZlbnRDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0ZXBzIHdob3NlIGBzdGVwX2NyZWF0ZWRgIHdyaXRlcyB3ZXJlIGludGVudGlvbmFsbHkgZGVmZXJyZWQgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gcnVuIHRoZW0gaW5saW5lIHZpYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyAod2hpY2ggY3JlYXRlXG4gICAqIHRoZSBzdGVwIG9uIHRoZSBmbHkpLCBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBVcCB0b1xuICAgKiBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgYXJlIGRlZmVycmVkOyB0aGUgY2FsbGVyIHJ1bnMgdGhlbSBpbmxpbmUgaW5cbiAgICogcGFyYWxsZWwgYW5kIHF1ZXVlcyB0aGUgcmVzdC4gRW1wdHkgd2hlbiBubyBzdGVwIHdhcyBkZWZlcnJlZCAobm90aGluZ1xuICAgKiBwZW5kaW5nLCBvciBhIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgaXMgcHJlc2VudCBzbyBub3RoaW5nIGlzXG4gICAqIGV4ZWN1dGVkIGlubGluZSkuIFRoZSBjYWxsZXIgcGFzc2VzIGVhY2ggYGRlaHlkcmF0ZWRJbnB1dGAgc3RyYWlnaHQgdG9cbiAgICogYGV4ZWN1dGVTdGVwYCwgd2hpY2ggc2VuZHMgaXQgYXMgdGhlIGBzdGVwX3N0YXJ0ZWRgIHBheWxvYWQuIFRoZSBhdG9taWNcbiAgICogY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIGBzdGVwX3N0YXJ0ZWRgIGlzIHRoZSBleGFjdGx5LW9uZS1vd25lciBnYXRlIHRoYXRcbiAgICogdGhlIHN0YW5kYWxvbmUgYHN0ZXBfY3JlYXRlZGAgcHJvdmlkZWQgYmVmb3JlOiB0aGUgbG9zZXIgb2YgdGhlIHJhY2UgZ2V0c1xuICAgKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGBza2lwcGVkYCBhbmQgZG9lcyBub3QgcnVuIHRoZSBib2R5LlxuICAgKi9cbiAgbGF6eUlubGluZVN0ZXBzOiBBcnJheTx7XG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgZGVoeWRyYXRlZElucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgfT47XG4gIC8qKlxuICAgKiBQcmUtY2xhaW1lZCBpbmxpbmUgc3RhcnRzLCBieSBjb3JyZWxhdGlvbiBpZDogdGhlIHBlci1zdGVwIHZlcmRpY3RzIG9mXG4gICAqIHRoZSBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXJzIHRoZSBiYXRjaGVkIGZhbi1vdXQgY29tbWl0dGVkXG4gICAqIGZvciB0aGUgbGF6eS1pbmxpbmUgc3RlcHMuIEEgc3RlcCB3aXRoIGFuIGVudHJ5IGhlcmUgaXMgcGFzc2VkIHRvXG4gICAqIGBleGVjdXRlU3RlcGAgYXMgYHByZWNsYWltZWRTdGFydGAgSU5TVEVBRCBvZiBgbGF6eVN0ZXBJbnB1dGA6IGl0c1xuICAgKiBpbnB1dCBhbHJlYWR5IHJvZGUgdGhlIHBhaXIsIGFuZCB0aGUgY2xhaW0gaXMgc2V0dGxlZDogYG93bmVkOiB0cnVlYFxuICAgKiBjYXJyaWVzIHRoZSBzdGFydGVkIGF0dGVtcHQtMSBlbnRpdHkgKGlucHV0IHJlLWF0dGFjaGVkKSBzbyB0aGUgYm9keVxuICAgKiBydW5zIHN0cmFpZ2h0IG9mZiB0aGUgYmF0Y2ggY29tbWl0IHdpdGggbm8gc3RhcnQgd3JpdGUgb2YgaXRzIG93bjtcbiAgICogYG93bmVkOiBmYWxzZWAgbG9zdCB0aGUgcGFpcidzIGF0b21pYyBjcmVhdGUtY2xhaW0gdG8gYSBjb25jdXJyZW50XG4gICAqIHdyaXRlciwgYW5kIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGUgYm9keSxcbiAgICogdGhlIHNhbWUgb3V0Y29tZSBhcyBsb3NpbmcgdGhlIGxhenkgY2xhaW0uIEVtcHR5IHdoZW5ldmVyIHRoZSBmb2xkIGRpZFxuICAgKiBub3QgZW5nYWdlIChiYXRjaGluZyBvZmYsIG5vIGBvd25lck1lc3NhZ2VJZGAsIG9yIHRoZSBsb25lLWlubGluZSBjYXNlLFxuICAgKiB3aGljaCBrZWVwcyB0aGUgb3B0aW1pc3RpYyBsYXp5IHBhdGggYW5kIGl0cyBjbGFpbS9ib2R5IG92ZXJsYXApLlxuICAgKlxuICAgKiBDcmFzaCB3aW5kb3c6IHRoZSBwYWlyIGNvbW1pdHMgYmVmb3JlIHRoZSBjYWxsZXIgcnVucyB0aGUgYm9keSwgc28gYVxuICAgKiBjcmFzaCBiZXR3ZWVuIHRoZW0gbGVhdmVzIGEgc3RhcnRlZCBzdGVwIHN0YW1wZWQgd2l0aCB0aGlzIG1lc3NhZ2Unc1xuICAgKiBJRC4gUmVkZWxpdmVyeSBvZiB0aGUgc2FtZSBtZXNzYWdlIHJlLWV4ZWN1dGVzIGl0IHZpYSB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICogcGF0aCwgdGhlIGV4YWN0IG1hY2hpbmVyeSB0aGUgbGF6eSBjbGFpbSdzIGNyYXNoIHdpbmRvdyBhbHJlYWR5IHVzZXMuXG4gICAqL1xuICBpbmxpbmVDbGFpbXM6IE1hcDxzdHJpbmcsIFByZWNsYWltZWRJbmxpbmVTdGFydD47XG4gIC8qKlxuICAgKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBiYXRjaGVkIGZhbi1vdXQgY29tbWl0dGVkLCB3aGVuIGl0IHJhbi4gVGhlIGJhdGNoJ3NcbiAgICogb3duIGV2ZW50cyBhcmUgbm90IGluIHRoZSBjYWxsZXIncyBsb2FkZWQgbG9nICh0aGUgbmV4dCByZWxvYWQgcGlja3NcbiAgICogdGhlbSB1cCksIHNvIHRoZSBjYWxsZXIgZm9sZHMgdGhpcyBjZWlsaW5nIGludG8gdGhlIHNsb3Qgc25hcHNob3QgaXRcbiAgICogaGFuZHMgdGhlIGlubGluZSBleGVjdXRpb25zOyBvdGhlcndpc2UgZXZlcnkgaW5saW5lIHRlcm1pbmFsIHdyaXRlXG4gICAqIHdvdWxkIG5hbWUgYSBwcmUtYmF0Y2ggcG9zaXRpb24gYW5kIGJlIGFuc3dlcmVkIHdpdGggYSBza2lwcGVkLXNsb3RcbiAgICogcmVwb3J0IGVjaG9pbmcgdGhlIGV2ZW50cyB0aGlzIHN1c3BlbnNpb24ganVzdCB3cm90ZS4gVW5kZXJcbiAgICoge0BsaW5rIFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zLmFsbG93RGVmZXJyZWRCYXRjaFdvcmt9IHRoaXMgY292ZXJzIHRoZVxuICAgKiBjaHVua3MgdGhhdCBoYWQgY29tbWl0dGVkIGJ5IHRoZSBoYW5kbGVyJ3MgcmV0dXJuIChhbHdheXMgdGhlIHBhaXJcbiAgICogY2h1bmspOyBhIHRyYWlsaW5nIGNodW5rIHRoYXQgY29tbWl0cyBsYXRlciBpcyBlY2hvZWQgYmFjayBvbiB0aGVcbiAgICogdGVybWluYWwgd3JpdGVzIGxpa2UgYW55IGZvcmVpZ24gZXZlbnQ6IHJlcG9ydHMgdGhlIGV4ZWN1dG9yIHJlYWRzIGZvclxuICAgKiBwb3NpdGlvbiBhbmQgZGlzY2FyZHMuXG4gICAqXG4gICAqIFNvIHRoZSBlY2hvIGlzIG9ubHkgZnVsbHkgc3VwcHJlc3NlZCBmb3IgYSBTSU5HTEUtY2h1bmsgZm9sZC4gT24gYVxuICAgKiBtdWx0aS1jaHVuayBmYW4tb3V0IHRoZSBib2RpZXMgc3RhcnQgb2ZmIHRoZSBwYWlyIGNodW5rIHdoaWxlIHRyYWlsaW5nXG4gICAqIGNodW5rcyBhcmUgc3RpbGwgaW4gZmxpZ2h0LCBhbmQgYW4gaW5saW5lIHRlcm1pbmFsIHdyaXRlIGlzc3VlZCBpbiB0aGF0XG4gICAqIHdpbmRvdyBzdGlsbCBuYW1lcyBhIHBvc2l0aW9uIGJlbG93IHRoZW0gYW5kIHN0aWxsIGRyYXdzIGEgcmVwb3J0IGZvclxuICAgKiB0aGVpciBldmVudHMuIEJvdW5kZWQgKHRyYWlsaW5nIGNodW5rcyBvbmx5LCBsYXJnZSBmYW4tb3V0cyBvbmx5KSBhbmRcbiAgICogc2VsZi1jb3JyZWN0aW5nIG9uIHRoZSBuZXh0IHJlbG9hZCwgYW5kIHJlY29yZGVkIHNvIGEgcmVwb3J0IHNlZW4gdGhlcmVcbiAgICogcmVhZHMgYXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gYXMgYSBidWcuXG4gICAqL1xuICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGJhdGNoZWQgZmFuLW91dCdzIGRlZmVycmVkIHdvcmssIHByZXNlbnQgb25seSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWRcbiAgICogaW4gdmlhIHtAbGluayBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5hbGxvd0RlZmVycmVkQmF0Y2hXb3JrfSBhbmRcbiAgICogdHJhaWxpbmcgd29yayBleGlzdHM6IHRoZSBjb21taXRzIG9mIGV2ZXJ5IGNodW5rIGV4Y2VwdCB0aGUgcGFpciBjaHVuayxcbiAgICogcGx1cyBldmVyeSBjaHVuaydzIHN0ZXAtbWVzc2FnZSBwdWJsaXNoZXMgKGVhY2ggY2hhaW5lZCBvbiBJVFMgT1dOXG4gICAqIGNodW5rJ3MgY29tbWl0LCBzbyBwdWJsaXNoLWFmdGVyLWNyZWF0ZSBob2xkcyBwZXIgc3RlcCkuIFRoZSBjYWxsZXJcbiAgICogTVVTVCBhd2FpdCBpdCBiZWZvcmUgYWNraW5nOiBhIHJlamVjdGlvbiBoZXJlIGlzIGEgZmFpbGVkIHN1c3BlbnNpb25cbiAgICogd3JpdGUgYW5kIGZhaWxzIHRoZSBkZWxpdmVyeSBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUgYXQgdGhlIGhhbmRsZXInc1xuICAgKiByZXR1cm4uIFN0ZXBzIHdob3NlIG1lc3NhZ2VzIHRoaXMgd29yayBwdWJsaXNoZXMgYXJlIGFscmVhZHkgaW5cbiAgICoge0BsaW5rIHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkc30gYXQgcmV0dXJuIHRpbWUuXG4gICAqL1xuICBkZWZlcnJlZEJhdGNoV29yaz86IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgc29vbmVzdCBwZW5kaW5nIHdhaXQsIGlmIGFueTogc2Vjb25kcyB1bnRpbCBpdCBlbGFwc2VzIGFuZCB0aGVcbiAgICogY29ycmVsYXRpb25JZCBvZiB0aGUgd2FpdCB0aGF0IHByb2R1Y2VkIHRoYXQgdGltZW91dC4gVGhlXG4gICAqIGNvcnJlbGF0aW9uSWQgc2VlZHMgdGhlIGlkZW1wb3RlbmN5IGtleSBmb3IgdGhlIHdhaXQtY29udGludWF0aW9uXG4gICAqIHF1ZXVlIG1lc3NhZ2Ugc28gdGhhdCByZXBlYXRlZCBzdXNwZW5zaW9uIHBhc3NlcyBvdmVyIHRoZSBzYW1lXG4gICAqIHBlbmRpbmcgd2FpdCBjb2xsYXBzZSBpbnRvIGEgc2luZ2xlIGRlbGF5ZWQgY29udGludWF0aW9uLlxuICAgKi9cbiAgd2FpdFRpbWVvdXQ/OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH07XG4gIC8qKiBXaGV0aGVyIGEgaG9vayBjb25mbGljdCB3YXMgZGV0ZWN0ZWQgKHNob3VsZCByZS1pbnZva2UgaW1tZWRpYXRlbHkpICovXG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIHRoZSB3b3JrZmxvdyB0byBjb250aW51ZSBpbW1lZGlhdGVseSAqL1xuICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBib29sZWFuO1xuICAvKiogV2hldGhlciBuYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyB3ZXJlIHdyaXR0ZW4gZm9yIHJlcGxheS4gKi9cbiAgaGFzQXR0cmlidXRlRXZlbnRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1c3BlbnNpb24gY3JlYXRlZCBhbnkgaG9vayAoYGhvb2tfY3JlYXRlZGApIGV2ZW50cy4gVW5saWtlXG4gICAqIGBoYXNIb29rQ29uZmxpY3RgIC8gYGhhc0F3YWl0ZWRIb29rQ3JlYXRpb25gLCB0aGlzIGlzIHRydWUgZXZlbiBmb3IgYSBwbGFpblxuICAgKiBmaXJlLWFuZC1mb3JnZXQgaG9vayB3aXRoIG5vIGNvbmZsaWN0IGFuZCBubyBhd2FpdGVyLiBUdXJibyBtb2RlIHVzZXMgaXQgdG9cbiAgICogZGV0ZWN0IFwiYSBob29rIHdhcyBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvblwiIGFuZCBzdG9wIGZvcmNpbmcgb3B0aW1pc3RpY1xuICAgKiBpbmxpbmUgc3RhcnQgKGEgaG9vayBpbnRyb2R1Y2VzIGxhdGVyIHJlc3VtZSBpbnZvY2F0aW9ucyB0aGF0IGNvdWxkIHJhY2UpLlxuICAgKi9cbiAgaGFzSG9va0V2ZW50czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyB0aGlzIHN1c3BlbnNpb24ncyBgaG9va19jcmVhdGVkYCBldmVudHNcbiAgICogKDAgd2hlbiBpdCBjcmVhdGVkIG5vbmUpLiBUaGUgY2FsbGVyIGFjY3VtdWxhdGVzIHRoaXMgYWNyb3NzIGl0ZXJhdGlvbnNcbiAgICogYW5kIHN1YnRyYWN0cyBpdCBmcm9tIHRoZSBUVEZTIGxhdGVuY3kgbWVhc3VyZW1lbnQsIHNvIHRpbWUgc3BlbnRcbiAgICogZHVyYWJseSBjcmVhdGluZyB0aGUgdXNlcidzIGhvb2tzIGRvZXNuJ3QgY291bnQgYXMgcnVudGltZSBvdmVyaGVhZC5cbiAgICovXG4gIGhvb2tDcmVhdGlvbk1zOiBudW1iZXI7XG4gIC8qKiBFeGFjdCBudW1iZXIgb2Ygd29ya2Zsb3ctY29kZSBleGVjdXRpb25zIG9ic2VydmVkIGR1cmluZyBzZXJpYWxpemF0aW9uLiAqL1xuICBzZXJpYWxpemF0aW9uQmxvY2tlckNvdW50OiBudW1iZXI7XG4gIC8qKiBCb3VuZGVkIHNhbXBsZSB1c2VkIG9ubHkgZm9yIHJldGVudGlvbiBkaWFnbm9zdGljcy4gKi9cbiAgc2VyaWFsaXphdGlvbkJsb2NrZXJzOiBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXJbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIgZXh0ZW5kcyBHdWVzdENvZGVFeGVjdXRpb24ge1xuICBzb3VyY2U6ICdzdGVwX2lucHV0JyB8ICdob29rX21ldGFkYXRhJyB8ICdob29rX2Fib3J0JztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVIb29rRXZlbnQoe1xuICBydW5JZCxcbiAgaG9va0V2ZW50LFxuICBxdWV1ZUl0ZW0sXG4gIHJlcXVlc3RJZCxcbiAgY3JlYXRlRXZlbnQsXG59OiB7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGhvb2tFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0O1xuICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIGNyZWF0ZUV2ZW50OiAoXG4gICAgZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICkgPT4gUHJvbWlzZTxFdmVudFJlc3VsdD47XG59KTogUHJvbWlzZTx7XG4gIGhhc0hvb2tDb25mbGljdDogYm9vbGVhbjtcbiAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogYm9vbGVhbjtcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChob29rRXZlbnQsIHtcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCByZXR1cm5lZCBhIGhvb2tfY29uZmxpY3QgZXZlbnQgaW5zdGVhZCBvZiBob29rX2NyZWF0ZWQuXG4gICAgLy8gVGhlIGhvb2tfY29uZmxpY3QgZXZlbnQgaXMgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYW5kIHdpbGwgYmUgcmVwbGF5ZWRcbiAgICAvLyBvbiB0aGUgbmV4dCB3b3JrZmxvdyBpbnZvY2F0aW9uLCBjYXVzaW5nIHRoZSBob29rJ3MgcHJvbWlzZSB0byByZWplY3QuXG4gICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhhc0hvb2tDb25mbGljdDogdHJ1ZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBmYWxzZSxcbiAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjogcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9PT0gdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dvcmtmbG93IHJ1biBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgaG9vaycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IGZhbHNlLFxuICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzV29ybGRWYWxpZGF0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICBgY3JlYXRlSG9vayBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgIHRocm93IGZhdGFsO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgYSB3b3JrZmxvdyBzdXNwZW5zaW9uIGJ5IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoaG9va3MsIHN0ZXBzLCB3YWl0cykuXG4gKiBDcmVhdGVzIGV2ZW50cyBmb3IgYWxsIG9wZXJhdGlvbnMgYnV0IGRvZXMgTk9UIHF1ZXVlIHN0ZXAgbWVzc2FnZXM7IHJldHVybnMgdGhlIHBlbmRpbmdcbiAqIHN0ZXBzIHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGljaCB0byBleGVjdXRlIGlubGluZSB2cyBxdWV1ZSB0byBiYWNrZ3JvdW5kLlxuICpcbiAqIFByb2Nlc3Npbmcgb3JkZXI6XG4gKiAxLiBIb29rcyBhcmUgcHJvY2Vzc2VkIGZpcnN0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggd2ViaG9vayByZWNlaXZlcnNcbiAqIDIuIFN0ZXAgZXZlbnRzIGFuZCB3YWl0IGV2ZW50cyBhcmUgY3JlYXRlZCBpbiBwYXJhbGxlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3VzcGVuc2lvbih7XG4gIHN1c3BlbnNpb24sXG4gIHdvcmxkLFxuICBydW4sXG4gIHNwYW4sXG4gIHJlcXVlc3RJZCxcbiAgZXZlbnRMb2csXG4gIHJ1blJlYWR5QmFycmllcixcbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgc3RlcERpc3BhdGNoLFxuICBvd25lck1lc3NhZ2VJZCxcbiAgYWxsb3dEZWZlcnJlZEJhdGNoV29yayxcbn06IFN1c3BlbnNpb25IYW5kbGVyUGFyYW1zKTogUHJvbWlzZTxTdXNwZW5zaW9uSGFuZGxlclJlc3VsdD4ge1xuICBjb25zdCBydW5JZCA9IHJ1bi5ydW5JZDtcblxuICAvLyBUdXJibyBtb2RlOiBob2xkIGV2ZXJ5IHdvcmxkIHdyaXRlIGJlbG93IHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgKnNldHRsZWQqLCBzbyB3ZSBuZXZlciB3cml0ZSBhIHN0ZXAvaG9vay93YWl0IGV2ZW50IGZvciBhXG4gIC8vIHJ1biB0aGF0IGRvZXMgbm90IGV4aXN0IHlldC4gQSBuby1vcCBvdXRzaWRlIHR1cmJvIChiYXJyaWVyIHVuZGVmaW5lZCkgYW5kXG4gIC8vIG9uIHRoZSBwdXJlIGlubGluZSBob3QgcGF0aCwgd2hpY2ggZGVmZXJzIGFsbCBzdGVwcyBhbmQgd3JpdGVzIG5vdGhpbmcuXG4gIC8vIEF3YWl0aW5nIHRoZSBzYW1lICh1c3VhbGx5IGFscmVhZHktc2V0dGxlZCkgcHJvbWlzZSBtb3JlIHRoYW4gb25jZSBpcyBjaGVhcC5cbiAgLy8gQSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHlcbiAgLy8gZmFpbGVkIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBzdWJzZXF1ZW50IHdyaXRlIHN1cmZhY2VzIHRoZSByZWFsXG4gIC8vIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlIHJlZGVsaXZlcnMuXG4gIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBd2FpdCBldmVyeSBvcGVyYXRpb24gaW4gYSBzdXNwZW5zaW9uIHBoYXNlIGJlZm9yZSBsZXR0aW5nIGEgZmFpbHVyZVxuICAgKiBlc2NhcGUsIHByZWZlcnJpbmcgYSBzdGFsZS1zbmFwc2hvdCAoNDEyKSByZWplY3Rpb24gd2hlbiBvbmUgb2NjdXJyZWQuXG4gICAqXG4gICAqIGBQcm9taXNlLmFsbGAgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvcGVyYXRpb24gZG9lcyBhbmQgbGVhdmVzIGl0cyBzaWJsaW5nc1xuICAgKiBpbiBmbGlnaHQuIFRoYXQgbWF0dGVycyBmb3IgYSA0MTI6IHRoZSBjYWxsZXIgcmVhY3RzIGJ5IHJlbG9hZGluZyB0aGUgZXZlbnRcbiAgICogbG9nIGFuZCByZXN0YXJ0aW5nIHRoZSByZXBsYXksIHNvIGEgc2libGluZyBjcmVhdGUgdGhhdCBsYW5kcyBhZnRlciB0aGVcbiAgICogcmVqZWN0aW9uIGVzY2FwZWQgY29tbWl0cyBhbiBldmVudCB3aG9zZSBjb3JyZWxhdGlvbiBpZCBjYW1lIGZyb20gdGhlXG4gICAqIGFiYW5kb25lZCByZXBsYXkncyBzZWVkZWQgc2VxdWVuY2UgKGFuIGV2ZW50IHRoZSBmcmVzaCByZXBsYXkgbmV2ZXJcbiAgICogcHJvZHVjZXMpLCBhbmQgaXQgcmFjZXMgdGhlIHJlc3RhcnQncyByZWxvYWQgd2hpbGUgZG9pbmcgc28uIFNldHRsaW5nIGZpcnN0XG4gICAqIG1ha2VzIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgZmluYWwgYmVmb3JlIHRoZSBjYWxsZXIgYWN0cyBvbiB0aGUgZmFpbHVyZS5cbiAgICogSXQgbWlycm9ycyB0aGUgcnVudGltZSdzIGlubGluZSBzdGVwIGNsYWltLCB3aGljaCBzZXR0bGVzIHRoZSBpbi1mbGlnaHRcbiAgICogc3RlcCBleGVjdXRpb25zIGJlZm9yZSBlc2NhbGF0aW5nIGEgNDEyLlxuICAgKlxuICAgKiBBIDQxMiBpcyBwcmVmZXJyZWQgb3ZlciBhbnkgb3RoZXIgcmVqZWN0aW9uIGluIHRoZSBzYW1lIHBoYXNlIGJlY2F1c2UgaXRcbiAgICogaGFzIGEgZGVmaW5lZCwgY2hlYXAgcmVjb3ZlcnkgKHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZykgd2hpbGUgdGhlXG4gICAqIG90aGVycyBkbyBub3QuIEEgZGV0ZXJtaW5pc3RpYyBmYWlsdXJlIHN1Y2ggYXMgYW4gYXR0cmlidXRlLXZhbGlkYXRpb25cbiAgICogYEZhdGFsRXJyb3JgIHJlY3VycyBvbiB0aGUgcmVzdGFydCBhbmQgZmFpbHMgdGhlIHJ1biB0aGVuLCBhdCB0aGUgY29zdCBvZlxuICAgKiBvbmUgZXh0cmEgcmVwbGF5LlxuICAgKi9cbiAgY29uc3Qgc2V0dGxlUGhhc2UgPSBhc3luYyAob3BzOiBQcm9taXNlPHVua25vd24+W10pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZWFzb25zID0gKGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChvcHMpKVxuICAgICAgLmZpbHRlcigocik6IHIgaXMgUHJvbWlzZVJlamVjdGVkUmVzdWx0ID0+IHIuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICAgLm1hcCgocikgPT4gci5yZWFzb24pO1xuICAgIGlmIChyZWFzb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRocm93IHJlYXNvbnMuZmluZCgocikgPT4gUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMocikpID8/IHJlYXNvbnNbMF07XG4gIH07XG5cbiAgLy8gRXZlcnkgc3VzcGVuc2lvbiB3cml0ZSBjYXJyaWVzIHJlcGxheS1yZWNvdmVyeSB0ZWxlbWV0cnkgb24gdGhlIGZpcnN0IG9uZVxuICAvLyB0aGF0IGNvbW1pdHMgYWZ0ZXIgcmVwbGF5IHJlY292ZXJlZC4gQWxsIHN1c3BlbnNpb24gZXZlbnRzIGFyZVxuICAvLyBub24tcnVuX2NyZWF0ZWQgZXZlbnRzIG9uIHRoaXMgcnVuJ3MgYHJ1bklkYC5cbiAgY29uc3QgcmVwb3J0ZXIgPSByZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgY29uc3QgY3JlYXRlRXZlbnQgPSAoZGF0YTogQ3JlYXRlRXZlbnRSZXF1ZXN0LCBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtcykgPT5cbiAgICByZXBvcnRlci53aXRoRXZlbnRDcmVhdGUocGFyYW1zLCAocCkgPT5cbiAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgKTtcbiAgLy8gQWRkcyB0aGUgb3B0aW1pc3RpYy1jb25jdXJyZW5jeSBndWFyZCB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZWQgYSBsb2FkZWRcbiAgLy8gZXZlbnQgbG9nOyB3aXRob3V0IG9uZSBpdCBjcmVhdGVzIGRpcmVjdGx5IChjYWxsZXJzIHdpdGggbm8gcmVwbGF5XG4gIC8vIHNuYXBzaG90LCBlLmcuIHRlc3RzKS4gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLFxuICAvLyB3aGljaCByZXN0YXJ0cyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nLiBJdCBpcyBub3QgcmV0cmllZCBoZXJlLFxuICAvLyBiZWNhdXNlIHRoZSBldmVudCdzIGNvcnJlbGF0aW9uIGlkIHdhcyBtaW50ZWQgYnkgKnRoaXMqIHJlcGxheSdzIHNlZWRlZFxuICAvLyBzZXF1ZW5jZSwgc28gcmUtY29tbWl0dGluZyBpdCBhZ2FpbnN0IGEgY29ycmVjdGVkIGxvZyB3b3VsZCBwZXJzaXN0IGFuXG4gIC8vIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IHByb2R1Y2VzLlxuICBsZXQgcmVwb3J0ZWRFdmVudHMgPSAwO1xuICBjb25zdCBjcmVhdGVHdWFyZGVkOiBFdmVudENyZWF0b3IgPSBhc3luYyAoZGF0YSwgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFldmVudExvZykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50KGRhdGEsIHBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGV2ZW50TG9nO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KGRhdGEsIHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIC4uLnNsb3RTbmFwc2hvdFBhcmFtcyhsb2cuZXZlbnRzKSxcbiAgICB9KTtcbiAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IHRoZSB3cml0ZSBsYW5kZWQgYWJvdmUgdGhlIHNsb3QgaXQgYXNrZWQgZm9yLCBzbyB0aGVcbiAgICAvLyByZXBvcnQgaG9sZHMgdGhlIGV2ZW50cyBpdCB3YXMgZGVjaWRlZCB3aXRob3V0LiBBYnNvcmJpbmcgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIGF0IGVhY2ggY2FsbCBzaXRlIG1lYW5zIHRoZSByZXN0IG9mIHRoaXMgcGhhc2UncyB3cml0ZXMgKHdoaWNoIHJlYWRcbiAgICAvLyB0aGUgc2FtZSBhcnJheSB0byBidWlsZCB0aGVpciBvd24gc25hcHNob3QpIGFzayBmb3IgYSBzbG90IGFib3ZlIHRoZW0sXG4gICAgLy8gYW5kIHRoZSByZXBsYXkgdGhhdCByZXN1bWVzIGZyb20gdGhpcyBsb2cgc2VlcyB0aGVtIHdpdGhvdXQgYSByZWxvYWQuXG4gICAgY29uc3QgcmVwb3J0ID0gYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQobG9nLmV2ZW50cywgcmVzdWx0KTtcbiAgICByZXBvcnRlZEV2ZW50cyArPSByZXBvcnQuYWRkZWQ7XG4gICAgaWYgKHJlcG9ydC50cnVuY2F0ZWQpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0Ryb3BwZWQgYSB0cnVuY2F0ZWQgc2tpcHBlZC1zbG90IHJlcG9ydCcsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgb2ZmZXJlZDogcmVwb3J0Lm9mZmVyZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcG9ydC5hZGRlZCA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gd3JpdGUgc2tpcHBlZCBvY2N1cGllZCBzbG90cycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGV2ZW50VHlwZTogZGF0YS5ldmVudFR5cGUsXG4gICAgICAgIGV2ZW50SWQ6IHJlc3VsdC5ldmVudD8uZXZlbnRJZCxcbiAgICAgICAgcmVwb3J0ZWQ6IHJlcG9ydC5hZGRlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBTZXBhcmF0ZSBxdWV1ZSBpdGVtcyBieSB0eXBlXG4gIGNvbnN0IHN0ZXBJdGVtcyA9IHN1c3BlbnNpb24uaXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKTogaXRlbSBpcyBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9PiBpdGVtLnR5cGUgPT09ICdzdGVwJ1xuICApO1xuICBjb25zdCBhbGxIb29rSXRlbXMgPSBzdXNwZW5zaW9uLml0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSk6IGl0ZW0gaXMgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnaG9vaydcbiAgKTtcbiAgY29uc3Qgd2FpdEl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtID0+IGl0ZW0udHlwZSA9PT0gJ3dhaXQnXG4gICk7XG4gIGNvbnN0IGF0dHJpYnV0ZUl0ZW1zID0gc3VzcGVuc2lvbi5pdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pOiBpdGVtIGlzIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0gPT4gaXRlbS50eXBlID09PSAnYXR0cmlidXRlJ1xuICApO1xuXG4gIGNvbnN0IGhvb2tzTmVlZGluZ0NyZWF0aW9uID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gIWl0ZW0uaGFzQ3JlYXRlZEV2ZW50XG4gICk7XG5cbiAgLy8gR3JvdXAgaG9vayBpdGVtcyB0aGF0IG5lZWQgd29yayBieSB0b2tlbiwgcHJlc2VydmluZyBxdWV1ZS1pbnNlcnRpb25cbiAgLy8gKHdvcmtmbG93IGNvZGUpIG9yZGVyIHdpdGhpbiBlYWNoIHRva2VuLiBPcGVyYXRpb25zIG9uIG9uZSB0b2tlbiBtdXN0XG4gIC8vIGFwcGx5IGluIGNvZGUgb3JkZXI6IGEgZGlzcG9zZSgpIG9mIGFuIGVhcmxpZXIgaG9vayByZWxlYXNlcyB0aGUgdG9rZW5cbiAgLy8gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkIChvdGhlcndpc2UgdGhlXG4gIC8vIG5ldyBob29rIHJlY29yZHMgYSBzcHVyaW91cyBob29rX2NvbmZsaWN0IGFnYWluc3QgdGhlIHJ1bidzIG93blxuICAvLyBkaXNwb3NlZCBob29rKSwgd2hpbGUgYSBob29rIGNyZWF0ZWQgYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGUgc2FtZVxuICAvLyBzdXNwZW5zaW9uIGlzIHN0aWxsIGNyZWF0ZWQgYmVmb3JlIGl0IGlzIGRpc3Bvc2VkLiBEaWZmZXJlbnQgdG9rZW5zXG4gIC8vIGhhdmUgbm8gY2xhaW0gaW50ZXJhY3Rpb24sIHNvIHRva2VuIGdyb3VwcyBhcmUgcHJvY2Vzc2VkIGluIHBhcmFsbGVsLlxuICBjb25zdCBob29rSXRlbXNCeVRva2VuID0gbmV3IE1hcDxzdHJpbmcsIEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtW10+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhbGxIb29rSXRlbXMpIHtcbiAgICBpZiAoaXRlbS5oYXNDcmVhdGVkRXZlbnQgJiYgIWl0ZW0uZGlzcG9zZWQpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBhbHJlYWR5IGNvbW1pdHRlZCBhbmQgc3RpbGwgbGl2ZTogbm90aGluZyB0byBkb1xuICAgIH1cbiAgICBjb25zdCBncm91cCA9IGhvb2tJdGVtc0J5VG9rZW4uZ2V0KGl0ZW0udG9rZW4pO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va0l0ZW1zQnlUb2tlbi5zZXQoaXRlbS50b2tlbiwgW2l0ZW1dKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1blxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gIC8vIEdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbiBvbiB0aGUgcnVuJ3Mgc3BlY1ZlcnNpb24uXG4gIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcblxuICBsZXQgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCA9IDA7XG4gIGNvbnN0IHNlcmlhbGl6YXRpb25CbG9ja2VyczogU3VzcGVuc2lvblNlcmlhbGl6YXRpb25CbG9ja2VyW10gPSBbXTtcbiAgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlSW5wdXQoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgY29udGV4dDogUGljazxTdXNwZW5zaW9uU2VyaWFsaXphdGlvbkJsb2NrZXIsICdzb3VyY2UnIHwgJ2NvcnJlbGF0aW9uSWQnPlxuICApOiBQcm9taXNlPFNlcmlhbGl6ZWREYXRhPiB7XG4gICAgY29uc3Qgc3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0geyBleGVjdXRpb25zOiBbXSB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgIHN0YXRzXG4gICAgICApKSBhcyBTZXJpYWxpemVkRGF0YTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2VyaWFsaXphdGlvbkJsb2NrZXJDb3VudCArPVxuICAgICAgICBzdGF0cy50b3RhbEV4ZWN1dGlvbnMgPz8gc3RhdHMuZXhlY3V0aW9ucy5sZW5ndGg7XG4gICAgICBzZXJpYWxpemF0aW9uQmxvY2tlcnMucHVzaChcbiAgICAgICAgLi4uc3RhdHMuZXhlY3V0aW9uc1xuICAgICAgICAgIC5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQgLSBzZXJpYWxpemF0aW9uQmxvY2tlcnMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGV4ZWN1dGlvbikgPT4gKHsgLi4uY29udGV4dCwgLi4uZXhlY3V0aW9uIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkaXNwb3NlSG9vayhcbiAgICBxdWV1ZUl0ZW06IEhvb2tJbnZvY2F0aW9uUXVldWVJdGVtXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhvb2tEaXNwb3NlZEV2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICBldmVudFR5cGU6ICdob29rX2Rpc3Bvc2VkJyBhcyBjb25zdCxcbiAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICB9LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoaG9va0Rpc3Bvc2VkRXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAvLyBIb29rIHdhcyBhbHJlYWR5IGRpc3Bvc2VkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uLCBzYWZlIHRvIHNraXBcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdIb29rIGFscmVhZHkgZGlzcG9zZWQsIHNraXBwaW5nIGR1cGxpY2F0ZSBkaXNwb3NhbCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGhvb2sgZGlzcG9zYWwnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgLy8gSG9vayBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb3IgbmV2ZXIgY3JlYXRlZFxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0hvb2sgbm90IGZvdW5kIGZvciBkaXNwb3NhbCwgY29udGludWluZycsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBob29rcyBmaXJzdCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIHdlYmhvb2sgcmVjZWl2ZXJzLlxuICAvLyBUcmFjayBhbnkgaG9vayBjb25mbGljdHMgdGhhdCBvY2N1cjogdGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXJcbiAgLy8gc28gdGhlIFYyIGhhbmRsZXIgY2FuIHJlLWludm9rZSBpbW1lZGlhdGVseS5cbiAgbGV0IGhhc0hvb2tDb25mbGljdCA9IGZhbHNlO1xuICBsZXQgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiA9IGZhbHNlO1xuICBsZXQgaG9va0NyZWF0aW9uTXMgPSAwO1xuXG4gIGlmIChob29rSXRlbXNCeVRva2VuLnNpemUgPiAwKSB7XG4gICAgY29uc3QgaG9va1BoYXNlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgYXdhaXQgc2V0dGxlUGhhc2UoXG4gICAgICBbLi4uaG9va0l0ZW1zQnlUb2tlbi52YWx1ZXMoKV0ubWFwKGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgIGxldCBjcmVhdGlvbkNvbmZsaWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgaG9va01ldGFkYXRhID1cbiAgICAgICAgICAgICAgdHlwZW9mIHF1ZXVlSXRlbS5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogYXdhaXQgZGVoeWRyYXRlSW5wdXQocXVldWVJdGVtLm1ldGFkYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hvb2tfbWV0YWRhdGEnLFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaG9va0V2ZW50OiBDcmVhdGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHRva2VuOiBxdWV1ZUl0ZW0udG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDogcXVldWVJdGVtLnRva2VuUmV0ZW50aW9uVW50aWwsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBpc1dlYmhvb2s6IHF1ZXVlSXRlbS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5pc1N5c3RlbSAmJiB7IGlzU3lzdGVtOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUhvb2tFdmVudCh7XG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBob29rRXZlbnQsXG4gICAgICAgICAgICAgIHF1ZXVlSXRlbSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBjcmVhdGVFdmVudDogY3JlYXRlR3VhcmRlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0IHx8PSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiB8fD0gcmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb247XG4gICAgICAgICAgICBjcmVhdGlvbkNvbmZsaWN0ZWQgPSByZXN1bHQuaGFzSG9va0NvbmZsaWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERpc3Bvc2UgYWZ0ZXIgY3JlYXRpb24gZm9yIGhvb2tzIGJvcm4gYW5kIGRpc3Bvc2VkIHdpdGhpbiB0aGlzXG4gICAgICAgICAgLy8gYmF0Y2guIEEgaG9vayB3aG9zZSBjcmVhdGlvbiBjb25mbGljdGVkIHdhcyBuZXZlciBjcmVhdGVkLCBzb1xuICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcG9zZS5cbiAgICAgICAgICBpZiAocXVldWVJdGVtLmRpc3Bvc2VkICYmICFjcmVhdGlvbkNvbmZsaWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGRpc3Bvc2VIb29rKHF1ZXVlSXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgaG9va0NyZWF0aW9uTXMgPSBEYXRlLm5vdygpIC0gaG9va1BoYXNlU3RhcnQ7XG4gIH1cblxuICAvLyBQcm9jZXNzIGFib3J0IHJlcXVlc3RzOiByZXN1bWUgdGhlIGhvb2sgd2l0aCBhYm9ydCBwYXlsb2FkIGFuZCB3cml0ZSBzdHJlYW0gcGFja2V0XG4gIGNvbnN0IGhvb2tzTmVlZGluZ0Fib3J0ID0gYWxsSG9va0l0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gaXRlbS5hYm9ydFJlcXVlc3RlZCAmJiAhaXRlbS5kaXNwb3NlZFxuICApO1xuXG4gIGlmIChob29rc05lZWRpbmdBYm9ydC5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICBhd2FpdCBzZXR0bGVQaGFzZShcbiAgICAgIGhvb2tzTmVlZGluZ0Fib3J0Lm1hcChhc3luYyAocXVldWVJdGVtKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGVoeWRyYXRlIHRoZSBhYm9ydCBwYXlsb2FkIGZvciBzdG9yYWdlXG4gICAgICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYXNvbjogcXVldWVJdGVtLmFib3J0UmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc291cmNlOiAnaG9va19hYm9ydCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIGFib3J0IHBheWxvYWRcbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgdG9rZW46IHF1ZXVlSXRlbS50b2tlbixcbiAgICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFdyaXRlIHN0cmVhbSBjYW5jZWxsYXRpb24gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAgICAgICAgICAvLyBSZXVzZSB0aGUgc2FtZSBkZWh5ZHJhdGVkIHBheWxvYWQgYXMgdGhlIGhvb2sgZXZlbnQgc28gdGhlIHJlYXNvblxuICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHRocm91Z2ggYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIC8gYGh5ZHJhdGVTdGVwQXJndW1lbnRzYFxuICAgICAgICAgIC8vIChoYW5kbGVzIERPTUV4Y2VwdGlvbiwgY3VzdG9tIGVycm9ycywgZW5jcnlwdGlvbiwgZXRjLikgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIGJhcmUgSlNPTi5zdHJpbmdpZnkgd2hpY2ggbG9zZXMgdHlwZSBpbmZvcm1hdGlvbiBhbmQgZHJvcHMgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIHN0cmVhbU5hbWUgaXMgc2V0IG9uIHRoZSBxdWV1ZSBpdGVtIGF0IGNvbnRyb2xsZXIgY29uc3RydWN0aW9uIHRpbWVcbiAgICAgICAgICAvLyAoc2VlIHdvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIudHMpLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZEZyb21Ub2tlbihxdWV1ZUl0ZW0udG9rZW4pO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWUsXG4gICAgICAgICAgICAgIGFib3J0UGF5bG9hZCBhcyBVaW50OEFycmF5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGU6IGhvb2sgZXZlbnQgcHJvdmlkZXMgdGhlIGR1cmFibGUgZmFsbGJhY2tcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCwgaG9vayBldmVudCB3aWxsIHByb3ZpZGUgZmFsbGJhY2snLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIGFib3J0JyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgc3RlcCBldmVudHMgZm9yIHN0ZXBzIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtIHlldC5cbiAgLy8gVW5saWtlIFYxLCB3ZSBkbyBOT1QgcXVldWUgc3RlcCBtZXNzYWdlcyBmcm9tIGhlcmU6IHRoZSBjYWxsZXJcbiAgLy8gZGVjaWRlcyB3aGljaCBzdGVwcyB0byBleGVjdXRlIGlubGluZSB2cy4gcXVldWUgdG8gYmFja2dyb3VuZC5cbiAgLy8gV2FpdCBldmVudHMgYXJlIGFsc28gY3JlYXRlZCBpbiBwYXJhbGxlbCBiZWxvdy5cbiAgY29uc3Qgc3RlcHNOZWVkaW5nQ3JlYXRpb24gPSBuZXcgU2V0KFxuICAgIHN0ZXBJdGVtc1xuICAgICAgLmZpbHRlcigocXVldWVJdGVtKSA9PiAhcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudClcbiAgICAgIC5tYXAoKHF1ZXVlSXRlbSkgPT4gcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpXG4gICk7XG5cbiAgLy8gQ29ycmVsYXRpb24gSURzIGZvciB3aGljaCBUSElTIHN1c3BlbnNpb24gY2FsbCBhY3R1YWxseSB3cm90ZSB0aGVcbiAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50LiBQb3B1bGF0ZWQgYnkgdGhlIG9wcyBiZWxvdyBhZnRlciBhIHN1Y2Nlc3NmdWxcbiAgLy8gZXZlbnRzLmNyZWF0ZSwgdXNlZCBieSB0aGUgY2FsbGVyIHRvIGNsYWltIG93bmVyc2hpcCBhbmQgYXZvaWRcbiAgLy8gcmFjaW5nIHdpdGggY29uY3VycmVudCBoYW5kbGVycyBvbiBzdGVwIGV4ZWN1dGlvbi5cbiAgY29uc3QgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyBmaW5hbGl6ZWQgYXMgZmFpbGVkIGJlY2F1c2UgdGhlaXIgYXJndW1lbnRzXG4gIC8vIHJlZnVzZWQgdG8gc2VyaWFsaXplOiBzZWUgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXAgYmVsb3cuXG4gIGNvbnN0IGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIHN0ZXAgd2hvc2UgYXJndW1lbnRzIGZhaWwgdG8gc2VyaWFsaXplIGlzIGRldGVybWluaXN0aWM6IGV2ZXJ5IHJlcGxheVxuICAgKiByZS1kZXJpdmVzIHRoZSBzYW1lIHVuc2VyaWFsaXphYmxlIHZhbHVlLCBzbyByZWRlbGl2ZXJpbmcgdGhlXG4gICAqIG9yY2hlc3RyYXRvciBtZXNzYWdlIGNhbiBuZXZlciBzdWNjZWVkLiBJbnN0ZWFkIG9mIHJlamVjdGluZyB0aGUgd2hvbGVcbiAgICogc3VzcGVuc2lvbiAod2hpY2ggZmFpbHMgdGhlIHJ1biBmcm9tIHRoZSBvdXRzaWRlLCB3aGVyZSBubyB1c2VyIGNvZGUgY2FuXG4gICAqIG9ic2VydmUgaXQpLCB0cmVhdCBpdCBleGFjdGx5IGxpa2UgYSBzdGVwLWJvZHkgZmFpbHVyZTogd3JpdGVcbiAgICogYHN0ZXBfY3JlYXRlZGAgd2l0aCBhIHBsYWNlaG9sZGVyIGlucHV0IChldmVyeSBXb3JsZCByZXF1aXJlcyB0aGUgc3RlcFxuICAgKiBlbnRpdHkgdG8gZXhpc3QgYmVmb3JlIGEgdGVybWluYWwgc3RlcCBldmVudCwgYW5kIHRoZSByZWFsIGlucHV0IGlzXG4gICAqIHByZWNpc2VseSB3aGF0IHJlZnVzZWQgdG8gc2VyaWFsaXplKSBmb2xsb3dlZCBieSBgc3RlcF9mYWlsZWRgIGNhcnJ5aW5nXG4gICAqIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IuIFRoZSBuZXh0IHJlcGxheSByZWplY3RzIHRoZSBzdGVwJ3MgcHJvbWlzZSB3aXRoXG4gICAqIGl0LCBzbyBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHN0ZXAgY2FsbCBvYnNlcnZlcyB0aGUgZXJyb3I7IHVuY2F1Z2h0LCBpdFxuICAgKiBwcm9wYWdhdGVzIG91dCBvZiB0aGUgd29ya2Zsb3cgYm9keSBhbmQgZmFpbHMgdGhlIHJ1biBhcyBhIFVTRVJfRVJST1IsXG4gICAqIHdpdGhvdXQgYnVybmluZyBxdWV1ZSByZWRlbGl2ZXJpZXMgZWl0aGVyIHdheS5cbiAgICovXG4gIGNvbnN0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwID0gYXN5bmMgKFxuICAgIHF1ZXVlSXRlbTogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sXG4gICAgZXJyb3I6IFNlcmlhbGl6YXRpb25FcnJvclxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAnU3RlcCBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZTsgZmFpbGluZyB0aGUgc3RlcCBzbyB0aGUgJyArXG4gICAgICAgICd3b3JrZmxvdyBjYW4gb2JzZXJ2ZSB0aGUgZXJyb3InLFxuICAgICAge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfVxuICAgICk7XG4gICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAvLyBNYXJrZXIgcGxhY2Vob2xkZXIgKG5vdCBlbXB0eSBhcmdzKTogYnl0ZS1pZGVudGljYWwtdG8temVyby1hcmdzIHdvdWxkXG4gICAgLy8gbWFrZSBgd29ya2Zsb3cgaW5zcGVjdCBzdGVwc2Agc2hvdyBcIm5vIGFyZ3VtZW50c1wiIGZvciB0aGUgb25lIHN0ZXBcbiAgICAvLyB3aG9zZSBlbnRpcmUgcHJvYmxlbSB3YXMgaXRzIGFyZ3VtZW50cy5cbiAgICBjb25zdCBwbGFjZWhvbGRlcklucHV0ID0gKGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyKCksXG4gICAgICBydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBzdXNwZW5zaW9uLmdsb2JhbFRoaXMsXG4gICAgICBmYWxzZSxcbiAgICAgIGNvbXByZXNzaW9uXG4gICAgKSkgYXMgU2VyaWFsaXplZERhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICBpbnB1dDogcGxhY2Vob2xkZXJJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGNyZWF0ZUVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoY3JlYXRlRXJyKSkge1xuICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBhbHJlYWR5IGNyZWF0ZWQgdGhlIHN0ZXA6IHRoZSBmYWlsdXJlIGlzXG4gICAgICAgIC8vIGRldGVybWluaXN0aWMsIHNvIGl0IGlzIHJhY2luZyB0b3dhcmQgdGhlIHNhbWUgc3RlcF9mYWlsZWQgYmVsb3cuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlOiBjcmVhdGVFcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhjcmVhdGVFcnIpKSB7XG4gICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkOiBub3RoaW5nIHRvIG9ic2VydmUgdGhlIGZhaWx1cmUuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNyZWF0ZUVycjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBpdHNlbGYgaXMgYSBwbGFpbiBXb3JrZmxvd0Vycm9yIChuYW1lLCBtZXNzYWdlIHdpdGhcbiAgICAgICAgICAgIC8vIGZyYW1lZCBoaW50LCBjYXVzZSBjaGFpbiksIHNlcmlhbGl6YWJsZSBldmVuIHRob3VnaCB0aGUgc3RlcFxuICAgICAgICAgICAgLy8gaW5wdXQgd2FzIG5vdC4gRXJyb3IgZGV0ZWN0aW9uIGlzIHJlYWxtLWluZGVwZW5kZW50XG4gICAgICAgICAgICAvLyAodHlwZXMuaXNOYXRpdmVFcnJvciksIHNvIHRoZSBob3N0LWNyZWF0ZWQgZXJyb3Igc2VyaWFsaXplc1xuICAgICAgICAgICAgLy8gdGhlIHNhbWUgdW5kZXIgZWl0aGVyIGdsb2JhbDsgdGhlIFZNIGdsb2JhbCBpcyBwYXNzZWQgZm9yXG4gICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSB3aXRoIGV2ZXJ5IG90aGVyIGRlaHlkcmF0aW9uIGluIHRoaXMgZmlsZSBhbmQgc29cbiAgICAgICAgICAgIC8vIGFueSBWTS1yZWFsbSB2YWx1ZXMgZ3Vlc3QgY29kZSB0aHJldyBpbnRvIHRoZSBjYXVzZSBjaGFpblxuICAgICAgICAgICAgLy8gKGdldHRlcnMvcHJveGllcyBleGVjdXRlZCBkdXJpbmcgdGhlIGZhaWxlZCBkZWh5ZHJhdGlvbikgYXJlXG4gICAgICAgICAgICAvLyBkZXRlY3RlZCBieSB0aGUgcmVhbG0tc2Vuc2l0aXZlIHJlZHVjZXJzLlxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgc3VzcGVuc2lvbi5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgICAvLyBTdGVwIGFscmVhZHkgdGVybWluYWwgKGEgY29uY3VycmVudCBoYW5kbGVyIHdyb3RlIHRoZSBzYW1lXG4gICAgICAgIC8vIGRldGVybWluaXN0aWMgZmFpbHVyZSkgb3IgdGhlIHJ1biBhbHJlYWR5IGZpbmlzaGVkLlxuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgb3IgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgfVxuICAgIH1cbiAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuYWRkKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAvLyBSZWxlYXNlIHRoZSBpbmxpbmUgc2xvdCBib29ra2VlcGluZzogdGhlIHN0ZXAgbmV2ZXIgcnVucywgc28gaXQgbXVzdFxuICAgIC8vIG5vdCBhcHBlYXIgaW4gdGhlIHJlYnVpbHQgYGxhenlJbmxpbmVTdGVwc2AuIChJdHMgc2xvdCBpbiB0aGUgZmlyc3QtTlxuICAgIC8vIHNlbGVjdGlvbiBhbmQgaW4gYGlubGluZVBhaXJGb2xkRWxpZ2libGVgJ3MgYXJpdGhtZXRpYyB3YXMgY29uc3VtZWRcbiAgICAvLyBiZWZvcmUgZGVoeWRyYXRpb24gY291bGQgcmV2ZWFsIHRoZSBmYWlsdXJlLCBpbmhlcmVudCB0byBzZWxlY3RpbmdcbiAgICAvLyBiZWZvcmUgc2VyaWFsaXppbmcsIGFuZCBib3VuZGVkIHRvIG9uZSB3YXN0ZWQgc2xvdCBvbiBhIHBhc3MgdGhhdFxuICAgIC8vIGVuZHMgaW4gYSBmb3JjZWQgcmVwbGF5IGFueXdheS4pXG4gICAgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLmRlbGV0ZShxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gIH07XG5cbiAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IGRlZmVyIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yIHVwIHRvXG4gIC8vIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyB0aGUgY2FsbGVyIHdpbGwgcnVuIGlubGluZSAoaW4gcGFyYWxsZWwpLiBFYWNoXG4gIC8vIHN0ZXAgaXMgY3JlYXRlZCBvbiB0aGUgZmx5IGJ5IHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGV4ZWN1dGVTdGVwIHNlbmRzXG4gIC8vIChzYXZpbmcgYSByb3VuZC10cmlwIHBlciBzdGVwKS4gV2UgbmV2ZXIgZGVmZXIgd2hlbiBhIGBob29rLmdldENvbmZsaWN0KClgXG4gIC8vIGF3YWl0ZXIgaXMgcHJlc2VudCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIGNhbGxlciBleGVjdXRlcyBub3RoaW5nIGlubGluZVxuICAvLyAoaXQgcmUtaW52b2tlcyBpbW1lZGlhdGVseSB0byByZXNvbHZlIHRoZSBhd2FpdGVyKSwgc28gZGVmZXJyaW5nIHdvdWxkXG4gIC8vIGxlYXZlIHRoZSBzdGVwcyB1bmNyZWF0ZWQgYW5kIHVucXVldWVkLiBXZSBwaWNrIHRoZSBmaXJzdCBOIHVuY3JlYXRlZFxuICAvLyBzdGVwcyAobWF0Y2hpbmcgdGhlIGNhbGxlcidzIGlubGluZS1jYW5kaWRhdGUgc2VsZWN0aW9uKSBhbmQgZGVoeWRyYXRlXG4gIC8vIHRoZWlyIGlucHV0IGhlcmUgc28gZXhlY3V0ZVN0ZXAgY2FuIHNoaXAgaXQgYXMgdGhlIHN0ZXBfc3RhcnRlZCBwYXlsb2FkLlxuICBjb25zdCBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiA9PT0gZmFsc2VcbiAgICAgID8gc3RlcEl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gc3RlcHNOZWVkaW5nQ3JlYXRpb24uaGFzKGl0ZW0uY29ycmVsYXRpb25JZCkpXG4gICAgICAgICAgLnNsaWNlKDAsIGdldE1heElubGluZVN0ZXBzKCkpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jb3JyZWxhdGlvbklkKVxuICAgICAgOiBbXVxuICApO1xuICAvLyBDb2xsZWN0ZWQgYnkgY29ycmVsYXRpb25JZCBiZWNhdXNlIHRoZSBwZXItc3RlcCBvcHMgYmVsb3cgcnVuIGNvbmN1cnJlbnRseVxuICAvLyBhbmQgc2V0dGxlIG91dCBvZiBvcmRlci4gV2UgcmVidWlsZCB0aGUgYXJyYXkgaW4gZGV0ZXJtaW5pc3RpY1xuICAvLyBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYCBvcmRlciAodGhlIG9yZGVyZWQgc2xpY2UgYWJvdmUpIGFmdGVyIHRoZSBvcHNcbiAgLy8gc2V0dGxlLCBzbyB0aGUgaW5saW5lIGJhdGNoIG9yZGVyIGlzIHN0YWJsZSByZWdhcmRsZXNzIG9mIGRlaHlkcmF0aW9uIHRpbWluZy5cbiAgY29uc3QgbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZCA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydsYXp5SW5saW5lU3RlcHMnXVtudW1iZXJdXG4gID4oKTtcblxuICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIENvcnJlbGF0aW9uIElEcyBvZiBzdGVwcyB3aG9zZSBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBtZXNzYWdlIHdhcyBhbHJlYWR5XG4gIC8vIHB1Ymxpc2hlZCBieSB0aGUgcmVzaWxpZW50LWRpc3BhdGNoIG9wcyBiZWxvdyAoYWxvbmdzaWRlIHRoZSBzdGVwX2NyZWF0ZWRcbiAgLy8gd3JpdGUpLiBSZXBvcnRlZCB0byB0aGUgY2FsbGVyIHNvIGl0cyBkaXNwYXRjaCBwYXNzIHNraXBzIHRoZW0uXG4gIGNvbnN0IHF1ZXVlZFN0ZXBDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIGVsaWdpYmlsaXR5LCBzaGFyZWQgYnkgZXZlcnkgc3RlcCBvcCBiZWxvdyAodGhlXG4gIC8vIHBlci1zdGVwIGlucHV0LXNpemUgY2hlY2sgaXMgYXBwbGllZCBpbnNpZGUgdGhlIG9wKS4gQWxsIG11c3QgaG9sZDpcbiAgLy9cbiAgLy8gIC0gVGhlIGNhbGxlciBwcm92aWRlZCBhIGRpc3BhdGNoIHRhcmdldCAoYHN0ZXBEaXNwYXRjaGApOiB0ZXJtaW5hbFxuICAvLyAgICBkcmFpbnMgYW5kIG90aGVyIGNyZWF0ZS1vbmx5IGNhbGxlcnMgbmV2ZXIgcXVldWUuXG4gIC8vICAtIFRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgKGBXT1JLRkxPV19SRVNJTElFTlRfU1RFUF9ESVNQQVRDSGAgb3B0LWluKS5cbiAgLy8gICAgSXQgaXMgb2ZmIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgcHVibGlzaCByYWNlcyB0aGUgY3JlYXRlJ3MgdmVyZGljdCxcbiAgLy8gICAgYW5kIGEgY3JlYXRlIGNhbiBjb21lIGJhY2sgcmVmdXNlZDogYXMgYSBkdXBsaWNhdGUgdGhlIHJlcGxheSBzaG91bGRcbiAgLy8gICAgc3RvcCBwdXJzdWluZywgb3IgKG9uIGEgV29ybGQgdGhhdCB3b3VsZCByYXRoZXIgcmVmdXNlIGEgc3RhbGUgd3JpdGVcbiAgLy8gICAgdGhhbiByZXBvcnQgd2hhdCBpdCBtaXNzZWQpIGFzIGEgNDEyLiBFaXRoZXIgd2F5IHRoZSBxdWV1ZSBtZXNzYWdlXG4gIC8vICAgIGNhcnJ5aW5nIHRoZSBwYXlsb2FkIGlzIGFscmVhZHkgb3V0LCBhbmQgdGhlIGNvbnN1bWVyIGNhbiBtYXRlcmlhbGl6ZSBhXG4gIC8vICAgIHN0ZXAgd2hvc2UgY3JlYXRlIHdhcyByZWZ1c2VkLiBOb3RoaW5nIG9yZGVycyB0aGF0IHZlcmRpY3QgYmVmb3JlIHRoZVxuICAvLyAgICBjb25zdW1lcidzIHJlZGVsaXZlcnkgcmUtZW5zdXJlLCBzbyBubyBiYWNrZW5kLXNpZGUgcmV2b2NhdGlvblxuICAvLyAgICBib29ra2VlcGluZyBjYW4gY2xvc2UgdGhlIHdpbmRvdzogYSBiZXN0LWVmZm9ydCBtYXJrZXIgdGhhdCBmYWlscyBvcGVuXG4gIC8vICAgIGNhbm5vdCBjYXJyeSBhIGNvcnJlY3RuZXNzIHByb3BlcnR5LiBUaGUgc2VxdWVudGlhbCBwYXRoIGlzIHRoZSBvbmx5XG4gIC8vICAgIHRoaW5nIHRoYXQgZ2l2ZXMgdGhlIG1lc3NhZ2UgYSBoYXBwZW5zLWFmdGVyIGVkZ2Ugb3ZlciB0aGUgdmVyZGljdC5cbiAgLy8gIC0gVGhlIHJ1bidzIHF1ZXVlIHRyYW5zcG9ydCBwcmVzZXJ2ZXMgYmluYXJ5IHBheWxvYWRzIChDQk9SLFxuICAvLyAgICBzcGVjVmVyc2lvbiA+PSAzKTogYHN0ZXBJbnB1dC5pbnB1dGAgaXMgdGhlIHNlcmlhbGl6ZWQgKHBvc3NpYmx5XG4gIC8vICAgIGVuY3J5cHRlZCkgaW5wdXQgYnl0ZXMsIHdoaWNoIHRoZSBKU09OIHRyYW5zcG9ydCB3b3VsZCBtYW5nbGUuXG4gIGNvbnN0IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgPVxuICAgIHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcblxuICAvLyBCYXRjaGVkIGZhbi1vdXQ6IGZvbGQgdGhpcyBzdXNwZW5zaW9uJ3Mgc3RlcF9jcmVhdGVkICsgd2FpdF9jcmVhdGVkXG4gIC8vIHdyaXRlcyBpbnRvIG9uZSBgZXZlbnRzLmNyZWF0ZUJhdGNoYCBjYWxsIChvbmUgZHVyYWJsZSB3cml0ZSwgcGVyLWV2ZW50XG4gIC8vIG91dGNvbWVzKSBpbnN0ZWFkIG9mIG9uZSB3cml0ZSBwZXIgZXZlbnQuIEVuZ2FnZXMgb25seSBmb3IgYSBDTEVBTlxuICAvLyBmYW4tb3V0IChubyBhdHRyaWJ1dGUgd3JpdGVzLCBubyBob29rIHdyaXRlcywgbm8gcmVzaWxpZW50IGRpc3BhdGNoXG4gIC8vIHdob3NlIGNyZWF0ZXMgYXJlIGVhY2ggcGFpcmVkIHdpdGggYSBxdWV1ZSBwdWJsaXNoKSBvbiBhIFdvcmxkIHRoYXRcbiAgLy8gaW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgbWV0aG9kIGFuZCBhIHJ1biB3aG9zZSBldmVudHMgYXJlIHNsb3QtbnVtYmVyZWQuXG4gIC8vIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgZ2F0ZSBrZWVwcyB0aGUgc2luZ2xlLWV2ZW50IHBhdGggYnl0ZS1mb3ItYnl0ZS5cbiAgY29uc3QgYmF0Y2hGYW5vdXRFbGlnaWJsZSA9XG4gICAgaXNCYXRjaFRyYW5zaXRpb25zRW5hYmxlZCgpICYmXG4gICAgdHlwZW9mIHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIChydW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFkgJiZcbiAgICAhcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgIGFsbEhvb2tJdGVtcy5sZW5ndGggPT09IDAgJiZcbiAgICBhdHRyaWJ1dGVJdGVtcy5sZW5ndGggPT09IDA7XG4gIC8qKlxuICAgKiBUaGUgZm9sZCdzIGNvbGxlY3Rpb24sIGluIHNjaGVkdWxpbmcgb3JkZXIgKHN0ZXBzIGluIHN0ZXBJdGVtcyBvcmRlcixcbiAgICogdGhlbiB3YWl0cykuIFN0ZXAgZW50cmllcyBhcmUgZW5xdWV1ZWQgYnkgdGhlaXIgcHJlcCBwcm9taXNlcyAoaW5wdXRcbiAgICogZGVoeWRyYXRpb24gcnVucyBjb25jdXJyZW50bHksIHNvIGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgYG9yZGVyYCwgbm90IGJ5XG4gICAqIGNvbXBsZXRpb24pOyB0aGUgc2luZ2xlIGZsdXNoIG9wIGJlbG93IGF3YWl0cyBldmVyeSBwcmVwLCBzb3J0cywgYW5kXG4gICAqIGNvbW1pdHMgdGhlIHdob2xlIHNldCB0aHJvdWdoIGBjcmVhdGVCYXRjaGAuXG4gICAqL1xuICBjb25zdCBiYXRjaFF1ZXVlOiB7XG4gICAgb3JkZXI6IG51bWJlcjtcbiAgICBraW5kOiAnc3RlcCcgfCAnd2FpdCcgfCAnaW5saW5lLWNyZWF0ZWQnIHwgJ2lubGluZS1zdGFydGVkJztcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzdGVwJ3MgbmFtZSwgc2V0IG9uIHN0ZXAtY2Fycnlpbmcga2luZHMgKHRoZSBpbi1mbHVzaCBwdWJsaXNoZXNcbiAgICAgKiAgYW5kIHRoZSBkaXNwYXRjaCBpZGVtcG90ZW5jeSBrZXkgbmVlZCBpdCkuICovXG4gICAgc3RlcE5hbWU/OiBzdHJpbmc7XG4gICAgZXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdDtcbiAgfVtdID0gW107XG4gIGNvbnN0IGJhdGNoUHJlcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIC8vIFByZS1jbGFpbWVkIGlubGluZSBwYWlyczogZm9sZCBlYWNoIGxhenktaW5saW5lIHN0ZXAncyBkZWZlcnJlZFxuICAvLyBgc3RlcF9jcmVhdGVkYCAoY2FycnlpbmcgaXRzIGlucHV0KSBBTkQgaXRzIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIChiYXJlLFxuICAvLyBvd25lcnNoaXAtc3RhbXBlZCkgaW50byB0aGUgYmF0Y2gsIHNvIHRoZSB3aG9sZSBmYW4tb3V0ICh0aGUgaW5saW5lXG4gIC8vIHN0ZXBzJyBjbGFpbXMgaW5jbHVkZWQpIGNvbW1pdHMgaW4gdGhlIG9uZSBkdXJhYmxlIHdyaXRlIGFuZCB0aGUgY2FsbGVyXG4gIC8vIHN0YXJ0cyB0aGUgYm9kaWVzIHN0cmFpZ2h0IG9mZiB0aGF0IGNvbW1pdCBpbnN0ZWFkIG9mIHBvc3Rpbmcgb25lIGNsYWltXG4gIC8vIHBlciBpbmxpbmUgc3RlcC4gVGhlIGxvbmUtaW5saW5lIGNhc2UgKG5vdGhpbmcgZWxzZSB0byBiYXRjaCB3aXRoKSBpc1xuICAvLyBleGNsdWRlZDogYSBwYWlyLW9ubHkgYmF0Y2ggY29zdHMgdGhlIHNhbWUgcm91bmQgdHJpcCBhcyB0aGUgc2luZ2xlIGxhenlcbiAgLy8gY2xhaW0gd2hpbGUgZ2l2aW5nIHVwIHRoZSBvcHRpbWlzdGljIGNsYWltL2JvZHkgb3ZlcmxhcCBhbmQgdGhlXG4gIC8vIGJ1bXAtYW5kLXJlcG9ydCB0aGF0IGBjcmVhdGVHdWFyZGVkYCBwcm92aWRlcywgc28gaXQgc3RheXMgb24gdGhlIGxhenlcbiAgLy8gcGF0aC4gUmVxdWlyZXMgdGhlIGNhbGxlcidzIGBvd25lck1lc3NhZ2VJZGA6IHRoZSBzdGFydGVkIHJvdyBtdXN0XG4gIC8vIHN0YW1wIG93bmVyc2hpcCBleGFjdGx5IGxpa2UgdGhlIGxhenkgY2xhaW0gaXQgcmVwbGFjZXMgKGFuZCBhIGNhbGxlclxuICAvLyB0aGF0IGRvZXMgbm90IGlubGluZS1leGVjdXRlIG5ldmVyIHByb3ZpZGVzIG9uZSkuXG4gIGNvbnN0IHVuY3JlYXRlZFdhaXRDb3VudCA9IHdhaXRJdGVtcy5maWx0ZXIoXG4gICAgKGl0ZW0pID0+ICFpdGVtLmhhc0NyZWF0ZWRFdmVudFxuICApLmxlbmd0aDtcbiAgY29uc3QgaW5saW5lUGFpckZvbGRFbGlnaWJsZSA9XG4gICAgYmF0Y2hGYW5vdXRFbGlnaWJsZSAmJlxuICAgIG93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuc2l6ZSA+IDAgJiZcbiAgICAobGF6eUlubGluZUNvcnJlbGF0aW9uSWRzLnNpemUgPj0gMiB8fFxuICAgICAgc3RlcHNOZWVkaW5nQ3JlYXRpb24uc2l6ZSAtXG4gICAgICAgIGxhenlJbmxpbmVDb3JyZWxhdGlvbklkcy5zaXplICtcbiAgICAgICAgdW5jcmVhdGVkV2FpdENvdW50ID49XG4gICAgICAgIDEpO1xuICBjb25zdCBpbmxpbmVDbGFpbXM6IFN1c3BlbnNpb25IYW5kbGVyUmVzdWx0WydpbmxpbmVDbGFpbXMnXSA9IG5ldyBNYXAoKTtcbiAgbGV0IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmc6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgdHJhY2UgY2FycmllciBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2hlcywgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlclxuICAvLyBzdXNwZW5zaW9uICh0aGUgcGVyLXN0ZXAgb3BzIHJ1biBjb25jdXJyZW50bHkgYW5kIHNoYXJlIGl0KS5cbiAgbGV0IHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjogUHJvbWlzZTxUcmFjZUNhcnJpZXI+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxUcmFjZUNhcnJpZXI+ID0+IHtcbiAgICBzdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIgPz89XG4gICAgICBzdGVwRGlzcGF0Y2g/LmdldFRyYWNlQ2FycmllcigpID8/IFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgcmV0dXJuIHN0ZXBEaXNwYXRjaFRyYWNlQ2FycmllcjtcbiAgfTtcblxuICAvLyBQcm9kdWNlci1zaWRlIHJlc2lsaWVudCByZWNvdmVyeSBjb3VudCBmb3IgdGhlIHN1c3BlbnNpb24gc3BhbiBhdHRyaWJ1dGUuXG4gIGxldCByZXNpbGllbnREaXNwYXRjaFJlY292ZXJlZCA9IDA7XG5cbiAgLy8gU3RlcHM6IGNyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnRzIChubyBxdWV1aW5nLCBWMiByZXR1cm5zIHBlbmRpbmcgc3RlcHNcbiAgLy8gdG8gY2FsbGVyLCBFWENFUFQgb24gdGhlIHJlc2lsaWVudCBkaXNwYXRjaCBwYXRoLCB3aGljaCBwYXJhbGxlbGl6ZXMgdGhlXG4gIC8vIGNyZWF0ZSB3aXRoIHRoZSBzdGVwJ3MgcXVldWUgcHVibGlzaCBhbmQgcmVwb3J0cyBpdCBpblxuICAvLyBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCkuXG4gIGxldCBiYXRjaE9yZGVyQ291bnRlciA9IDA7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHN0ZXBJdGVtcykge1xuICAgIGlmIChzdGVwc05lZWRpbmdDcmVhdGlvbi5oYXMocXVldWVJdGVtLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAvLyBEZXRlcm1pbmlzdGljIHBvc2l0aW9uIGluIHRoZSBiYXRjaGVkIGZvbGQgKGFzc2lnbmVkIGluIHN0ZXBJdGVtc1xuICAgICAgLy8gb3JkZXIsIGJlZm9yZSB0aGUgY29uY3VycmVudCBkZWh5ZHJhdGlvbiBydW5zKS4gQSBwYWlyLWZvbGRlZCBpbmxpbmVcbiAgICAgIC8vIHN0ZXAgb2NjdXBpZXMgdHdvIGNvbnNlY3V0aXZlIHBvc2l0aW9ucyAoY3JlYXRlZCByb3cgdGhlbiBzdGFydGVkXG4gICAgICAvLyByb3cpLCB3aGljaCB0aGUgZmx1c2gga2VlcHMgYWRqYWNlbnQgYW5kIG5ldmVyIHNwbGl0cyBhY3Jvc3MgY2h1bmtzLFxuICAgICAgLy8gc28gYSBXb3JsZCBjYW4gZm9sZCB0aGVtIGludG8gb25lIGJvcm4tcnVubmluZyBjcmVhdGUuXG4gICAgICBjb25zdCBwYWlyRm9sZGVkID1cbiAgICAgICAgaW5saW5lUGFpckZvbGRFbGlnaWJsZSAmJlxuICAgICAgICBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHN0ZXBPcmRlciA9IGJhdGNoT3JkZXJDb3VudGVyO1xuICAgICAgYmF0Y2hPcmRlckNvdW50ZXIgKz0gcGFpckZvbGRlZCA/IDIgOiAxO1xuICAgICAgY29uc3Qgc3RlcE9wID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRlaHlkcmF0ZWRJbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVoeWRyYXRlZElucHV0ID0gYXdhaXQgZGVoeWRyYXRlSW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFyZ3M6IHF1ZXVlSXRlbS5hcmdzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogcXVldWVJdGVtLmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgICB0aGlzVmFsOiBxdWV1ZUl0ZW0udGhpc1ZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ3N0ZXBfaW5wdXQnLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIVNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBlLmcuIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6IGFuIFNESyBmYXVsdCwgbm90IGEgdXNlciB2YWx1ZVxuICAgICAgICAgICAgLy8gcHJvYmxlbS4gS2VlcCBpdHMgaWRlbnRpdHkgKFJVTlRJTUVfRVJST1IpIGFuZCBjdXJyZW50XG4gICAgICAgICAgICAvLyBmYWlsLXRoZS1zdXNwZW5zaW9uIGJlaGF2aW9yLlxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN0ZXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgLy8gTm8gZGlzcGF0Y2ggdGFyZ2V0IG1lYW5zIG5vIHJlcGxheSB3aWxsIG9ic2VydmUgYVxuICAgICAgICAgICAgLy8gZmluYWxpemF0aW9uOiB0aGlzIGlzIHRoZSB0ZXJtaW5hbCBkcmFpbiAob3IgYSBjcmVhdGUtb25seVxuICAgICAgICAgICAgLy8gdGVzdCBjYWxsZXIpLiBUaGUgcnVuIGlzIGFscmVhZHkgY29tcGxldGluZy9mYWlsaW5nLCBzb1xuICAgICAgICAgICAgLy8gd3JpdGluZyBzdGVwX2NyZWF0ZWQgKyBzdGVwX2ZhaWxlZCBoZXJlIHdvdWxkIGxlYXZlIGUuZy4gYVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEIHJ1biBjYXJyeWluZyBhIGZhaWxlZCBzdGVwIG5vdGhpbmcgY2FuIGV2ZXJcbiAgICAgICAgICAgIC8vIG9ic2VydmUsIHJlYWRpbmcgYXMgYSBidWcgZnJvbSB0aGUgZGFzaGJvYXJkLiBSZXRocm93XG4gICAgICAgICAgICAvLyBpbnN0ZWFkOyB0aGUgZHJhaW4ncyBvd24gY2F0Y2ggc3dhbGxvd3MgaXQsIHByZXNlcnZpbmcgaXRzXG4gICAgICAgICAgICAvLyBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgKG5vIHJvd3MgZm9yIHRoZSB1bmF3YWl0ZWQgc3RlcCkuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwKHF1ZXVlSXRlbSwgZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmZXJyZWQgKGxhenkpIGlubGluZSBzdGVwOiBza2lwIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUg4oCUIHRoZVxuICAgICAgICAvLyBjYWxsZXIncyBpbmxpbmUgZXhlY3V0ZVN0ZXAgd2lsbCBzZW5kIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmdcbiAgICAgICAgLy8gdGhpcyBpbnB1dCwgYW5kIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIChlbnRpdHkgKyBzeW50aGV0aWNcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KSBhdG9taWNhbGx5LiBXZSBkbyBOT1QgYWRkIGl0IHRvXG4gICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM7IG93bmVyc2hpcCBpcyBkZWNpZGVkIGJ5IHRoYXQgbGF6eVxuICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQncyBhdG9taWMgY3JlYXRlLWNsYWltIGluc3RlYWQuXG4gICAgICAgIGlmIChsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgIGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuc2V0KHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHBhaXJGb2xkZWQpIHtcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIHBhaXIgdGhlIGRlZmVycmFsIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNhbGxlcidzIGxhenkgYHN0ZXBfc3RhcnRlZGA6IHRoZSBjcmVhdGVkIHJvdyBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgLy8gaW5wdXQgKHBheWxvYWRzIHJpZGUgY3JlYXRlcyBpbiBhIGJhdGNoKSwgdGhlIHN0YXJ0ZWQgcm93IGlzXG4gICAgICAgICAgICAvLyBiYXJlIGFuZCBzdGFtcHMgdGhpcyBpbnZvY2F0aW9uJ3Mgb3duZXJzaGlwLCB0aGUgc2FtZSBjbGFpbVxuICAgICAgICAgICAgLy8gc2hhcGUgdGhlIGxhenkgc3RhcnQgd291bGQgaGF2ZSBzZW50LCBzZXR0bGVkIGJ5IHRoZSBiYXRjaC5cbiAgICAgICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIG9yZGVyOiBzdGVwT3JkZXIsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtY3JlYXRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlciArIDEsXG4gICAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUtc3RhcnRlZCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrZWQgYnkgaW5saW5lUGFpckZvbGRFbGlnaWJsZTsgc3ByZWFkIGtlZXBzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmFycm93LXRocm91Z2gtY2xvc3VyZSBwcm9ibGVtIGF3YXkgZnJvbSB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgICAgIC4uLihvd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkID8geyBvd25lck1lc3NhZ2VJZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudDogQ3JlYXRlRXZlbnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkSW5wdXQgYXMgU2VyaWFsaXplZERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgLy8gc3RlcC1leGVjdXRpb24gcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudCBpZiB0aGUgZGlyZWN0IHdyaXRlIGZhaWxlZFxuICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHN0YXJ0IChgcnVuSW5wdXRgKSBhbmRcbiAgICAgICAgLy8gcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuIE9ubHkgZm9yIGlucHV0cyB0aGVcbiAgICAgICAgLy8gcXVldWUgbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgIGRlaHlkcmF0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBkZWh5ZHJhdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBnZXRTdGVwRGlzcGF0Y2hUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgY3JlYXRlR3VhcmRlZChzdGVwRXZlbnQsIHsgcmVxdWVzdElkIH0pLFxuICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBpbXBsaWVkIGJ5IHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGVcbiAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBxdWV1ZUl0ZW0uc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHN0ZXBJbnB1dDogeyBpbnB1dDogZGVoeWRyYXRlZElucHV0IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFNhbWUga2V5IGFzIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzIGFuZCBhbnkgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3MsIHNvIHJlZHVuZGFudCBwdWJsaXNoZXMgZm9yIHRoaXMgc3RlcCBkZWR1cGUuIFRoZVxuICAgICAgICAgICAgICAvLyBrZXkgaXMgc3RlcC1pZGVudGl0eS1zY29wZWQgc28gYSByZXZva2VkIG1lc3NhZ2UgZm9yIGFcbiAgICAgICAgICAgICAgLy8gcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCBjYW5ub3QgYWJzb3JiIHRoZSBjb3JyZWN0ZWRcbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUncyBkaXNwYXRjaDogc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBxdWV1ZUl0ZW0uc3RlcE5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIHN1c3BlbnNpb24gcGFzczogd2l0aG91dFxuICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZSBhbG9uZSwgYW5kIGlmIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBubyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuXG4gICAgICAgICAgLy8gUHJvcGFnYXRpbmcgcmVkZWxpdmVycyB0aGUgb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoXG4gICAgICAgICAgLy8gcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpIHN0ZXBfY3JlYXRlZCBhbmQgcmUtZGlzcGF0Y2hlcyxcbiAgICAgICAgICAvLyB0aGUgc2FtZSByZWNvdmVyeSBhcyB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaGFuZGxlciB3cm90ZSBpdCBmaXJzdCwgc2FtZSBhcyB0aGUgc2VxdWVudGlhbFxuICAgICAgICAgICAgICAvLyBwYXRoLiBUaGUgc3RlcCBtZXNzYWdlIGlzIGFscmVhZHkgb3V0OyBhIGR1cGxpY2F0ZSBwdWJsaXNoXG4gICAgICAgICAgICAgIC8vIGJ5IHRoYXQgaGFuZGxlciBkZWR1cGVzIG9uIHRoZSBzaGFyZWQgaWRlbXBvdGVuY3kga2V5LlxuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSZXNpbGllbnQ6IHRoZSB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkgKDQyOSAvIDV4eCAvXG4gICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQpIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAvLyBpZGVtcG90ZW50bHkgcmUtZW5zdXJlcyB0aGUgc3RlcF9jcmVhdGVkIGJlZm9yZSBleGVjdXRpbmcuXG4gICAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkKys7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAnU3RlcCBjcmVhdGlvbiBldmVudCB3cml0ZSBmYWlsZWQsIGJ1dCB0aGUgc3RlcCB3YXMgJyArXG4gICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50IHdpbGwgJyArXG4gICAgICAgICAgICAgICAgICAnYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgICAgLy8gRm9sZCBpbnRvIHRoZSBiYXRjaCBpbnN0ZWFkIG9mIHdyaXRpbmcgaGVyZS4gVGhlIGVuY2xvc2luZ1xuICAgICAgICAgIC8vIHByb21pc2Ugam9pbnMgYGJhdGNoUHJlcHNgIChzZWUgdGhlIGxvb3AgYmVsb3cpLCBzbyB0aGUgZmx1c2hcbiAgICAgICAgICAvLyBvcCBjYW5ub3QgcnVuIGJlZm9yZSB0aGlzIHN0ZXAncyBpbnB1dCBmaW5pc2hlZCBkZWh5ZHJhdGluZy5cbiAgICAgICAgICBiYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgb3JkZXI6IHN0ZXBPcmRlcixcbiAgICAgICAgICAgIGtpbmQ6ICdzdGVwJyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHF1ZXVlSXRlbS5zdGVwTmFtZSxcbiAgICAgICAgICAgIGV2ZW50OiBzdGVwRXZlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUd1YXJkZWQoc3RlcEV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZycsIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgICAgb3BzLnB1c2goc3RlcE9wKTtcbiAgICAgIGlmIChiYXRjaEZhbm91dEVsaWdpYmxlKSB7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBvcCB3YWl0cyBmb3IgZXZlcnkgcHJlcCBiZWZvcmUgY29tbWl0dGluZzsgYSBwcmVwIHRoYXRcbiAgICAgICAgLy8gcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlcyB0aHJvdWdoIGBvcHNgLCBzbyB0aGUgZmx1c2gncyBvd24gd2FpdFxuICAgICAgICAvLyBzd2FsbG93cyBpdCBhbmQgY29tbWl0cyB3aGF0ZXZlciB3YXMgc3VjY2Vzc2Z1bGx5IGVucXVldWVkLFxuICAgICAgICAvLyBwcmVzZXJ2aW5nIHRvZGF5J3MgcGVyLW9wIGluZGVwZW5kZW5jZS5cbiAgICAgICAgYmF0Y2hQcmVwcy5wdXNoKHN0ZXBPcC5jYXRjaCgoKSA9PiB7fSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSB3YWl0IGV2ZW50cyAoc2FtZSBhcyBWMSlcbiAgZm9yIChjb25zdCBxdWV1ZUl0ZW0gb2Ygd2FpdEl0ZW1zKSB7XG4gICAgaWYgKCFxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCB3YWl0RXZlbnQ6IENyZWF0ZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyBhcyBjb25zdCxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBxdWV1ZUl0ZW0uY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgcmVzdW1lQXQ6IHF1ZXVlSXRlbS5yZXN1bWVBdCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAoYmF0Y2hGYW5vdXRFbGlnaWJsZSkge1xuICAgICAgICAvLyBXYWl0cyBuZWVkIG5vIGRlaHlkcmF0aW9uLCBzbyB0aGV5IGVucXVldWUgc3luY2hyb25vdXNseSwgYWZ0ZXJcbiAgICAgICAgLy8gZXZlcnkgc3RlcCdzIG9yZGVyIHNsb3QsIHByZXNlcnZpbmcgc3RlcHMtdGhlbi13YWl0cyBzY2hlZHVsaW5nXG4gICAgICAgIC8vIG9yZGVyIGluIHRoZSBsb2cuXG4gICAgICAgIGJhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgb3JkZXI6IGJhdGNoT3JkZXJDb3VudGVyKyssXG4gICAgICAgICAga2luZDogJ3dhaXQnLFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHF1ZXVlSXRlbS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50OiB3YWl0RXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlR3VhcmRlZCh3YWl0RXZlbnQsIHsgcmVxdWVzdElkIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLCB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmF0Y2hlZCBmb2xkJ3MgZmx1c2g6IHRoZSBjbGVhbiBmYW4tb3V0IGNvbW1pdHMgdGhyb3VnaFxuICAvLyBgY3JlYXRlQmF0Y2hgIGluIGNodW5rcyBvZiBNQVhfQkFUQ0hfRkFOT1VUX0VWRU5UUywgYWxsIGNodW5rcyBJTlxuICAvLyBGTElHSFQgQ09OQ1VSUkVOVExZLiBTbG90IGFzc2lnbm1lbnQgaXMgdGhlIHNlcnZlcidzLCBzbyBwYXJhbGxlbFxuICAvLyBjaHVua3MgcmFjZSBmb3Igc2xvdCByYW5nZXMgZXhhY3RseSBsaWtlIHRoZSBwcmUtZm9sZCBwYXRoJ3MgcGFyYWxsZWxcbiAgLy8gc2luZ2xlIHdyaXRlcyBkaWQ7IGVudGl0eSBjb25kaXRpb25zLCBub3QgY29tbWl0IG9yZGVyLCBjYXJyeVxuICAvLyBjb3JyZWN0bmVzcyAoc2libGluZyBmYW4tb3V0IGV2ZW50cyBoYXZlIG5vIGNyb3NzLW9yZGVyIHRoZSByZXBsYXlcbiAgLy8gZGVwZW5kcyBvbjsgaXQgbWF0Y2hlcyBieSBjb3JyZWxhdGlvbiBpZCkuIEVhY2ggZXZlbnQgcmVwb3J0cyB0aGVcbiAgLy8gb3V0Y29tZSBpdHMgb3duIHNpbmdsZSBjcmVhdGUgd291bGQgaGF2ZSBoYWQ6IGEgNDA5IGlzIHRoZSBzYW1lXG4gIC8vIGFscmVhZHktZXhpc3RzIHRvbGVyYW5jZSBhcyB0aGUgc2luZ2xlIHBhdGgsIGFueXRoaW5nIGVsc2UgZmFpbHMgdGhlXG4gIC8vIGRlbGl2ZXJ5IHRoZSB3YXkgYSBzaW5nbGUtcGF0aCByZWplY3Rpb24gd291bGQuXG4gIC8vXG4gIC8vIExhdGVuY3kgc2hhcGU6IG9ubHkgdGhlIGNodW5rIGNhcnJ5aW5nIHRoZSBwcmUtY2xhaW1lZCBpbmxpbmUgcGFpcnNcbiAgLy8gZ2F0ZXMgdGhlIGhhbmRsZXIncyByZXR1cm4gKHRoZSBjYWxsZXIgc3RhcnRzIGJvZGllcyBvZmYgaXRzIGNsYWltcykuXG4gIC8vIEV2ZXJ5IG90aGVyIGNodW5rJ3MgY29tbWl0IChhbmQgZXZlcnkgY2h1bmsncyBzdGVwLW1lc3NhZ2UgcHVibGlzaGVzLFxuICAvLyB3aGljaCBmaXJlIHRoZSBtb21lbnQgSVRTIGNyZWF0ZXMgYXJlIGR1cmFibGUpIHJpZGVzXG4gIC8vIGBkZWZlcnJlZEJhdGNoV29ya2Agd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGluLCBqb2luZWQgYmVmb3JlIGFjay4gQSBzbG93XG4gIC8vIHNpYmxpbmcgY2h1bmsgdGhlcmVmb3JlIGRlbGF5cyBuZWl0aGVyIHRoZSBpbmxpbmUgYm9kaWVzIG5vciBhbm90aGVyXG4gIC8vIGNodW5rJ3MgcXVldWUgbWVzc2FnZXMsIHdoaWxlIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlIHN0aWxsIGhvbGRzIHBlclxuICAvLyBzdGVwOiBhIHN0ZXAncyBtZXNzYWdlIGlzIG9ubHkgZXZlciBzZW50IGFmdGVyIHRoZSBjaHVuayBjYXJyeWluZyBpdHNcbiAgLy8gY3JlYXRlIGhhcyBjb21taXR0ZWQuXG4gIGxldCBkZWZlcnJlZEJhdGNoV29yazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGJhdGNoRmFub3V0RWxpZ2libGUpIHtcbiAgICBvcHMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFByZXBzIHRoYXQgcmVqZWN0ZWQgYWxyZWFkeSBzdXJmYWNlIHRocm91Z2ggdGhlaXIgb3duIGBvcHNgXG4gICAgICAgIC8vIGVudHJpZXM7IHRoZSBmb2xkIGNvbW1pdHMgd2hhdGV2ZXIgd2FzIHN1Y2Nlc3NmdWxseSBlbnF1ZXVlZCxcbiAgICAgICAgLy8gcHJlc2VydmluZyB0b2RheSdzIHBlci1vcCBpbmRlcGVuZGVuY2UuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoUHJlcHMpO1xuICAgICAgICBpZiAoYmF0Y2hRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IFsuLi5iYXRjaFF1ZXVlXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG4gICAgICAgIC8vIEEgYmF0Y2ggb2YgT05FIGdhaW5zIG5vdGhpbmcgb3ZlciB0aGUgc2luZ2xlIHdyaXRlIChzYW1lIHJvdW5kXG4gICAgICAgIC8vIHRyaXApIGFuZCBsb3NlcyB0aGUgc2xvdC1zbmFwc2hvdCBwYXJhbXMgKyBidW1wLWFuZC1yZXBvcnQgdGhhdFxuICAgICAgICAvLyBjcmVhdGVHdWFyZGVkIHByb3ZpZGVzLCBzbyBhIGxvbmUgZWFnZXIgZXZlbnQgdGFrZXMgdGhlIG9yZGluYXJ5XG4gICAgICAgIC8vIHNpbmdsZSBwYXRoLCB3aXRoIHRoZSBzYW1lIGNvbmZsaWN0IHRvbGVyYW5jZSBhbmQgb3duZXJzaGlwXG4gICAgICAgIC8vIGJvb2trZWVwaW5nIGl0IHdvdWxkIGhhdmUgaGFkIHdpdGhvdXQgdGhlIGZvbGQuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IFtlbnRyeV0gPSBlbnRyaWVzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKGVudHJ5LmV2ZW50LCB7IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnc3RlcCdcbiAgICAgICAgICAgICAgICAgID8gJ1N0ZXAgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnXG4gICAgICAgICAgICAgICAgICA6ICdXYWl0IGFscmVhZHkgZXhpc3RzLCBjb250aW51aW5nJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWVkIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYyBiZWxvdy4gV2l0aCBjaHVua3NcbiAgICAgICAgLy8gY29tbWl0dGluZyBpbiBwYXJhbGxlbCB0aGVyZSBpcyBubyBwZXItY2h1bmsgXCJleHBlY3RlZCBuZXh0IHNsb3RcIjtcbiAgICAgICAgLy8gdGhlIHdob2xlIGZvbGQncyBjb21taXR0ZWQgc3BhbiBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzZWVkXG4gICAgICAgIC8vIG9uY2UgZXZlcnkgY2h1bmsgaGFzIHNldHRsZWQ6IGNvbW1pdHRlZCBzbG90cyBhcmUgZGVuc2UgcGVyIHRoZVxuICAgICAgICAvLyBXb3JsZCdzIGludmFyaWFudCwgc28gYW55IGV4Y2VzcyBvZiAobWF4IGNvbW1pdHRlZCBzbG90IOKIkiBzZWVkICtcbiAgICAgICAgLy8gMSkgb3ZlciB0aGUgZm9sZCdzIG93biBjb21taXR0ZWQgY291bnQgaXMgZXZlbnRzIE9USEVSIHdyaXRlcnNcbiAgICAgICAgLy8gbGFuZGVkIGluIGJldHdlZW4uXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkRmlyc3RTbG90ID0gZXZlbnRMb2dcbiAgICAgICAgICA/IChtYXhFdmVudFNsb3QoZXZlbnRMb2cuZXZlbnRzKSA/PyAwKSArIDFcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUGFpci1hd2FyZSBjaHVua2luZzogYSBwcmUtY2xhaW1lZCBwYWlyJ3MgdHdvIHJvd3MgbXVzdCBsYW5kIGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGNyZWF0ZUJhdGNoIGNhbGwgKGFkamFjZW50LCBzbyBhIFdvcmxkIGNhbiBmb2xkIHRoZW1cbiAgICAgICAgLy8gaW50byBvbmUgYm9ybi1ydW5uaW5nIGNyZWF0ZSkgYW5kIG5ldmVyIHN0cmFkZGxlIGEgY2h1bmtcbiAgICAgICAgLy8gYm91bmRhcnksIHdoaWNoIHdvdWxkIHR1cm4gdGhlIHN0YXJ0ZWQgcm93IGludG8gYSBzdGFuZGFsb25lXG4gICAgICAgIC8vIGNsYWltIHJhY2luZyBpdHMgb3duIGNyZWF0ZSdzIGNvbW1pdC5cbiAgICAgICAgY29uc3QgY2h1bmtzOiAodHlwZW9mIGVudHJpZXMpW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgIGxldCBjdXJyZW50OiB0eXBlb2YgZW50cmllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBlbnRyaWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBwYWlyTGVhZCA9XG4gICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgbmV4dD8ua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJyAmJlxuICAgICAgICAgICAgICBuZXh0LmNvcnJlbGF0aW9uSWQgPT09IGVudHJ5LmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gcGFpckxlYWQgPyAyIDogMTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VycmVudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGN1cnJlbnQubGVuZ3RoICsgdGFrZSA+IE1BWF9CQVRDSF9GQU5PVVRfRVZFTlRTXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBpZiAocGFpckxlYWQpIHtcbiAgICAgICAgICAgICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSBjaHVua3MucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwcyB3aG9zZSBxdWV1ZSBtZXNzYWdlcyBUSElTIEZMVVNIIHdpbGwgcHVibGlzaCAodGhlIGVhZ2VyXG4gICAgICAgIC8vIGNyZWF0ZXMpLCByZWNvcmRlZCBiZWZvcmUgYW55IGNodW5rIHNldHRsZXMgc28gdGhlIGNhbGxlcidzXG4gICAgICAgIC8vIGRpc3BhdGNoIHBhc3MgKHdoaWNoIHJ1bnMgb2ZmIHRoZSBoYW5kbGVyJ3MgcmV0dXJuKSBza2lwcyB0aGVtLlxuICAgICAgICAvLyBUaGUgc2VuZHMgYXJlIGd1YXJhbnRlZWQtb3ItZmFpbGVkIGJ5IHRoZSB0cmFpbGluZyB3b3JrIHRoZVxuICAgICAgICAvLyBjYWxsZXIgam9pbnMgYmVmb3JlIGFja2luZywgc28gXCJ3aWxsIGJlIHB1Ymxpc2hlZCBieSB0aGlzIGZsdXNoXCJcbiAgICAgICAgLy8gYW5kIFwiYWxyZWFkeSBwdWJsaXNoZWRcIiBhcmUgZXF1aXZhbGVudCBmcm9tIHRoZSBjYWxsZXIncyBzaWRlLlxuICAgICAgICBjb25zdCBwdWJsaXNoRWFnZXJTdGVwcyA9IHN0ZXBEaXNwYXRjaCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocHVibGlzaEVhZ2VyU3RlcHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSAnc3RlcCcpIHtcbiAgICAgICAgICAgICAgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzLmFkZChlbnRyeS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUYWxsaWVzIGZvciB0aGUgZm9yZWlnbi1pbnRlcmxlYXZpbmcgZGlhZ25vc3RpYywgZm9sZGVkIGFjcm9zc1xuICAgICAgICAvLyB0aGUgY29uY3VycmVudCBjaHVua3MgYW5kIHJlYWQgb25jZSBhbGwgb2YgdGhlbSBzZXR0bGVkLlxuICAgICAgICBsZXQgY29tbWl0dGVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgbWF4Q29tbWl0dGVkU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNvbW1pdENodW5rID0gYXN5bmMgKGNodW5rOiB0eXBlb2YgZW50cmllcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIC8vIEFuY2hvcnMgZm9yIHRoZSBwcmUtY2xhaW1lZCBzdGVwcycgdGVsZW1ldHJ5OiB0aGUgUE9TVCBpbnN0YW50XG4gICAgICAgICAgLy8gaXMgdGhlIGNsYWltJ3MgXCJzdGFydCBQT1NUIHNlbnRcIiAoUlNGUydzIGVuZCksIHRoZSByZXR1cm4gaXMgdGhlXG4gICAgICAgICAgLy8gY2xhaW0ncyBjb21wbGV0aW9uIChUVFIncyBUNiksIHRoZSBzYW1lIHR3byBpbnN0YW50cyB0aGUgbGF6eVxuICAgICAgICAgIC8vIGNsYWltJ3Mgb3duIFBPU1Qgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICAgICAgICBjb25zdCBiYXRjaFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBiYXRjaEZhbm91dEVsaWdpYmxlIGltcGxpZXMgcHJlc2VuY2VcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGVCYXRjaCEoXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGNodW5rLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAgICAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXJ0ZWQgcm93IGlzIHRoZSBzdGVwJ3MgZXhlY3V0aW5nIGNsYWltLCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgIC8vIHRoZSBjb21wdXRlLWluc3RhbmNlIGF0dHJpYnV0aW9uIHRoZSBzaW5nbGUgY2xhaW0gc2VuZHMgdmlhXG4gICAgICAgICAgICAgIC8vIENyZWF0ZUV2ZW50UGFyYW1zLlxuICAgICAgICAgICAgICAuLi4oZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICAgID8geyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAvLyBQZXItd3JpdGUgcmVxdWVzdCBhdHRyaWJ1dGlvbiwgc2FtZSBhcyB0aGUgc2luZ2xlIHBhdGgnc1xuICAgICAgICAgICAgLy8gY3JlYXRlR3VhcmRlZCjigKYsIHsgcmVxdWVzdElkIH0pLlxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgcmVzdWx0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2h1bmtbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoZW50cnkua2luZCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkcy5hZGQoZW50cnkuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwYWlyIGNvbW1pdHRlZDogdGhpcyBpbnZvY2F0aW9uIG93bnMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlciBydW5zIHRoZSBib2R5IHdpdGggbm8gY2xhaW0gb2YgaXRzIG93bi4gVGhlXG4gICAgICAgICAgICAgICAgLy8gcmVhZGJhY2sgZW50aXR5IGlzIGF1dGhvcml0YXRpdmUgd2hlcmUgcHJlc2VudDsgYSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgb21pdHRlZCBpdCBnZXRzIHRoZSBzYW1lIGxvY2FsbHkgc3ludGhlc2l6ZWQgcnVubmluZ1xuICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQtMSB0aGUgb3B0aW1pc3RpYyBwYXRoIGV4ZWN1dGVzIGFnYWluc3QuIEVpdGhlclxuICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgaW5wdXQgaXMgcmUtYXR0YWNoZWQgbG9jYWxseTogYmF0Y2ggcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHJlZnMgbGF6aWx5LCBhbmQgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3QgYnl0ZXMgdGhlIHBhaXIncyBjcmVhdGVkIHJvdyBjYXJyaWVkLiAoVGhlIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAvLyByb3cncyBzdWNjZXNzIGlzIGRlbGliZXJhdGVseSBOT1QgbWVtYmVyc2hpcCBpblxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHM6IGZvciBpbmxpbmUgc3RlcHMgb3duZXJzaGlwIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0ZWQgcm93J3MgdmVyZGljdCwgYW5kIHRoZSBjYWxsZXIncyBkaXNwYXRjaCBwYXNzXG4gICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5saW5lIGNvcnJlbGF0aW9uIGlkcyByZWdhcmRsZXNzLilcbiAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gbGF6eUlubGluZUJ5Q29ycmVsYXRpb25JZC5nZXQoXG4gICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHNhbWUgcHJlcCBvcCB0aGF0IGVucXVldWVkIHRoZSBwYWlyIHNldFxuICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRyeSwgYW5kIHRoZSBmbHVzaCBhd2FpdGVkIGV2ZXJ5IHByZXAgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGZyZWUgaWYgaXQgZXZlciBmaXJlcywgdGhvdWdoOiB0aGUgcGFpciBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGhlcmUsIHNvIHRoaXMgdGhyb3dzIHdpdGggdGhlIHN0ZXAgY2xhaW1lZCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBib2R5IG5ldmVyIHJ1bi4gVGhlIGRlbGl2ZXJ5IGZhaWxzLCBhbmQgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnMgaXQgdGhyb3VnaCBvd25lZC1yZWNvdmVyeSAodGhlIHN0ZXAgY2FycmllcyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duZXJzaGlwIHN0YW1wKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdCBqdXN0XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGNsZWFubHkuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbm8gZGVoeWRyYXRlZCBpbnB1dCBmb3IgcHJlLWNsYWltZWQgc3RlcCAke2VudHJ5LmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRTdGVwOiBTdGFydGVkU3RlcCA9IGl0ZW0uc3RlcD8uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbS5zdGVwLCBzdGFydGVkQXQ6IGl0ZW0uc3RlcC5zdGFydGVkQXQgfVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBkZWh5ZHJhdGVkLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgICAgICAgICBvd25lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RhcnRlZFN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBkZWh5ZHJhdGVkLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiYXRjaFBvc3RTZW50QXRNcyxcbiAgICAgICAgICAgICAgICAgIGNsYWltQ29tcGxldGVkQXRNcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbnRyeS5raW5kID09PSAnaW5saW5lLWNyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgZW50cnkua2luZCA9PT0gJ2lubGluZS1zdGFydGVkJ1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFpciBsb3N0IGl0cyBhdG9taWMgY3JlYXRlLWNsYWltOiBhIGNvbmN1cnJlbnQgd3JpdGVyXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvd25zIHRoaXMgc3RlcCAoYW4gZWFybGllciBkZWxpdmVyeSdzIGNyZWF0ZSwgb3IgYVxuICAgICAgICAgICAgICAgIC8vIHJhY2luZyBoYW5kbGVyJ3MgY2xhaW0pLiBSZWNvcmRlZCBhcyBhIGxvc3QgY2xhaW06IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxlcidzIGV4ZWN1dGVTdGVwIHJldHVybnMgYHNraXBwZWRgIHdpdGhvdXQgcnVubmluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBib2R5LCB0aGUgc2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eSBjbGFpbS4gQSBXb3JsZFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgZm9sZHMgdGhlIHBhaXIgcmVwb3J0cyB0aGUgNDA5IG9uIGJvdGggcm93cyAoc2V0XG4gICAgICAgICAgICAgICAgLy8gdHdpY2UsIGhhcm1sZXNzKTsgb25lIHRoYXQgZXZhbHVhdGVzIHJvd3MgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgICAgIC8vIGhhcyB0aGUgc3RhcnRlZCByb3cgKHByb2Nlc3NlZCBzZWNvbmQpIGRlY2lkZSwgd2hpY2ggaXNcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHRoZSBzaW5nbGUgcGF0aCdzIHNlbWFudGljcyAoY3JlYXRlIGxvc3QgKyBjbGFpbVxuICAgICAgICAgICAgICAgIC8vIHdvbiBzdGlsbCBydW5zIHRoZSBib2R5OyBjcmVhdGUgd29uICsgY2xhaW0gbG9zdCBza2lwcykuXG4gICAgICAgICAgICAgICAgaW5saW5lQ2xhaW1zLnNldChlbnRyeS5jb3JyZWxhdGlvbklkLCB7IG93bmVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ0lubGluZSBzdGVwIHByZS1jbGFpbSBsb3N0LCBjb250aW51aW5nJywge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaXRlbS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNhbWUgdG9sZXJhbmNlIGFzIHRoZSBzaW5nbGUgcGF0aCdzIEVudGl0eUNvbmZsaWN0RXJyb3I6IGFcbiAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBvciBlYXJsaWVyIGRlbGl2ZXJ5IGFscmVhZHkgY3JlYXRlZCBpdC5cbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIGVudHJ5LmtpbmQgPT09ICdzdGVwJ1xuICAgICAgICAgICAgICAgICAgPyAnU3RlcCBhbHJlYWR5IGV4aXN0cywgY29udGludWluZydcbiAgICAgICAgICAgICAgICAgIDogJ1dhaXQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZW50cnkuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYGJhdGNoZWQgJHtlbnRyeS5ldmVudC5ldmVudFR5cGV9IGZvciAke2VudHJ5LmNvcnJlbGF0aW9uSWR9IGAgK1xuICAgICAgICAgICAgICAgIGBmYWlsZWQ6ICR7aXRlbS5lcnJvcn06ICR7aXRlbS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHsgc3RhdHVzOiBpdGVtLnN0YXR1cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIaWdoZXN0IHNsb3QgdGhpcyBjaHVuayBjb21taXR0ZWQ6IHRoZSBjZWlsaW5nIHRoZSBjYWxsZXIgZm9sZHNcbiAgICAgICAgICAvLyBpbnRvIHRoZSBpbmxpbmUgZXhlY3V0aW9ucycgc2xvdCBzbmFwc2hvdCAoc2VlXG4gICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZykgYW5kIG9uZSBpbnB1dFxuICAgICAgICAgIC8vIG9mIHRoZSBpbnRlcmxlYXZpbmcgZGlhZ25vc3RpYy5cbiAgICAgICAgICBjb25zdCBjaHVua01heFNsb3QgPSBtYXhFdmVudFNsb3QoXG4gICAgICAgICAgICByZXN1bHRzLmZsYXRNYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICAgIGl0ZW0uZXJyb3IgPT09IHVuZGVmaW5lZCAmJiBpdGVtLmV2ZW50ID8gW2l0ZW0uZXZlbnRdIDogW11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNodW5rTWF4U2xvdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAoYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIGNodW5rTWF4U2xvdCA+IGJhdGNoQ29tbWl0dGVkU2xvdENlaWxpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nID0gY2h1bmtNYXhTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21taXR0ZWRDb3VudCArPSByZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaHVua01heFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKG1heENvbW1pdHRlZFNsb3QgPT09IHVuZGVmaW5lZCB8fCBjaHVua01heFNsb3QgPiBtYXhDb21taXR0ZWRTbG90KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCA9IGNodW5rTWF4U2xvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgY2h1bmsncyBlYWdlciBzdGVwcycgcXVldWUgbWVzc2FnZXMgdGhlIG1vbWVudCBJVFNcbiAgICAgICAgLy8gY3JlYXRlcyBhcmUgZHVyYWJsZSwgdGhlIHBlci1jaHVuayBoYWxmIG9mIHB1Ymxpc2gtYWZ0ZXItY3JlYXRlLlxuICAgICAgICAvLyBTYW1lIG1lc3NhZ2Ugc2hhcGUgYW5kIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBhcyB0aGVcbiAgICAgICAgLy8gY2FsbGVyJ3MgZGlzcGF0Y2ggcGFzcywgc28gYW55dGhpbmcgZG91YmxlLXB1Ymxpc2hlZCBkZWR1cGVzLlxuICAgICAgICBjb25zdCBwdWJsaXNoQ2h1bmtTdGVwcyA9IGFzeW5jIChcbiAgICAgICAgICBjaHVuazogdHlwZW9mIGVudHJpZXNcbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgaWYgKCFwdWJsaXNoRWFnZXJTdGVwcykgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHN0ZXBFbnRyaWVzID0gY2h1bmsuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gJ3N0ZXAnKTtcbiAgICAgICAgICBpZiAoc3RlcEVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgZ2V0U3RlcERpc3BhdGNoVHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBzdGVwRW50cmllcy5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBwdWJsaXNoRWFnZXJTdGVwcyBpbXBsaWVzIHByZXNlbmNlXG4gICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoIS5xdWV1ZU5hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IGVudHJ5LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGVudHJ5LnN0ZXBOYW1lISxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHNldCBvbiBldmVyeSAnc3RlcCcgZW50cnkgYXQgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGVwTmFtZSFcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBMYXVuY2ggZXZlcnkgY2h1bmsncyBQT1NUIG5vdzsgY2hhaW4gZWFjaCBjaHVuaydzIHB1Ymxpc2hlcyBvbiBpdHNcbiAgICAgICAgLy8gT1dOIGNvbW1pdC4gQSBjaHVuayB3aG9zZSBjb21taXQgcmVqZWN0ZWQga2VlcHMgaXRzIG1lc3NhZ2VzXG4gICAgICAgIC8vIHVuc2VudCAodGhlIHJlamVjdGlvbiBmYWlscyB0aGUgZGVsaXZlcnk7IHJlZGVsaXZlcnkgcmUtY3JlYXRlc1xuICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcywgZGVkdXBlZCBieSB0aGUgaWRlbXBvdGVuY3kga2V5cykuXG4gICAgICAgIGNvbnN0IGNvbW1pdHMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gY29tbWl0Q2h1bmsoY2h1bmspKTtcbiAgICAgICAgY29uc3QgcHVibGlzaGVzID0gY2h1bmtzLm1hcChhc3luYyAoY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29tbWl0c1tpbmRleF07XG4gICAgICAgICAgYXdhaXQgcHVibGlzaENodW5rU3RlcHMoY2h1bmspO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gTGV0IGV2ZXJ5IHNpYmxpbmcgc2V0dGxlIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGZpcnN0IGZhaWx1cmU6IGFcbiAgICAgICAgICAvLyBjaHVuayB0aGF0IGNvbW1pdHRlZCBtdXN0IHN0aWxsIGdldCBpdHMgcHVibGlzaGVzIG91dCBldmVuIHdoZW5cbiAgICAgICAgICAvLyBhbm90aGVyIGNodW5rIGZhaWxlZCwgYW5kIHRoZSBjYWxsZXIgYWNrcyBvbmx5IGFmdGVyIHRoaXNcbiAgICAgICAgICAvLyByZXNvbHZlcy5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5jb21taXRzLCAuLi5wdWJsaXNoZXNdKTtcbiAgICAgICAgICAvLyBGb3JlaWduLWludGVybGVhdmluZyB2aXNpYmlsaXR5OiB0aGUgYmF0Y2ggZW5kcG9pbnQgaGFzIG5vXG4gICAgICAgICAgLy8gYnVtcC1hbmQtcmVwb3J0LCBzbyBldmVudHMgb3RoZXIgd3JpdGVycyBsYW5kZWQgYmV0d2VlbiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBhbmQgdGhlc2UgY29tbWl0cyBwdXNoZWQgdGhlIGZvbGQgdG8gaGlnaGVyIHNsb3RzXG4gICAgICAgICAgLy8gV0lUSE9VVCBoYW5kaW5nIHVzIHRoZSBza2lwcGVkIGV2ZW50cy4gU2FtZSBhY2NlcHRlZCBleHBvc3VyZVxuICAgICAgICAgIC8vIGFzIGEgZHJvcHBlZCB0cnVuY2F0ZWQgcmVwb3J0IG9uIHRoZSBzaW5nbGUgcGF0aDogdGhlIGxvY2FsXG4gICAgICAgICAgLy8gbG9nIHN0YXlzIGEgc3RyaWN0IHByZWZpeCBhbmQgdGhlIG5leHQgcmVsb2FkIG9ic2VydmVzIHRoZW0uXG4gICAgICAgICAgLy8gTG9nZ2VkIHNvIGEgYnVtcCBpcyBkaWFnbm9zYWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhwZWN0ZWRGaXJzdFNsb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbWF4Q29tbWl0dGVkU2xvdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmxlYXZlZCA9XG4gICAgICAgICAgICAgIG1heENvbW1pdHRlZFNsb3QgLSBleHBlY3RlZEZpcnN0U2xvdCArIDEgLSBjb21taXR0ZWRDb3VudDtcbiAgICAgICAgICAgIGlmIChpbnRlcmxlYXZlZCA+IDApIHtcbiAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnQmF0Y2hlZCBmYW4tb3V0IGNvbW1pdHRlZCBhYm92ZSBzbmFwc2hvdCcsIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEZpcnN0U2xvdCxcbiAgICAgICAgICAgICAgICBtYXhDb21taXR0ZWRTbG90LFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZENvdW50LFxuICAgICAgICAgICAgICAgIGludGVybGVhdmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmFpbHVyZSA9IHNldHRsZWQuZmluZChcbiAgICAgICAgICAgIChvdXRjb21lKTogb3V0Y29tZSBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT5cbiAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdyZWplY3RlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBmYWlsdXJlLnJlYXNvbjtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyBFVkVSWSBjaHVuayBjYXJyeWluZyBwYWlycyBnYXRlcyB0aGUgcmV0dXJuLCBub3QganVzdCB0aGUgZmlyc3Q6XG4gICAgICAgIC8vIGEgcGFpciB3aG9zZSBjb21taXQgdGhlIGNhbGxlciBoYXMgbm90IHNlZW4geWllbGRzIG5vXG4gICAgICAgIC8vIGBpbmxpbmVDbGFpbXNgIGVudHJ5LCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBsYXp5XG4gICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgd291bGQgcmFjZSB0aGlzIHNhbWUgZm9sZCdzIHN0aWxsLWluLWZsaWdodFxuICAgICAgICAvLyBwYWlyIGZvciB0aGUgc2FtZSBzdGVwLiBUb2RheSBwYWlycyBhbHdheXMgbGFuZCBpbiBvbmUgY2h1bmtcbiAgICAgICAgLy8gKHRoZXkgc29ydCBmaXJzdCwgYW5kIHR3byByb3dzIHBlciBpbmxpbmUgc3RlcCBmaXQgaW5zaWRlIG9uZVxuICAgICAgICAvLyBjaHVuaywgcGlubmVkIGJ5IGNvbnN0YW50cy50ZXN0LnRzKSwgc28gdGhpcyBpcyBhdCBtb3N0IG9uZVxuICAgICAgICAvLyBjb21taXQ7IHRoZSBmaWx0ZXIgaXMgd2hhdCBrZWVwcyB0aGUgcHJvcGVydHkgdHJ1ZSBpZiBlaXRoZXIgY2FwXG4gICAgICAgIC8vIG1vdmVzLlxuICAgICAgICBjb25zdCBwYWlyQ29tbWl0cyA9IGNodW5rcy5mbGF0TWFwKChjaHVuaywgaW5kZXgpID0+XG4gICAgICAgICAgY2h1bmsuc29tZSgoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09ICdpbmxpbmUtc3RhcnRlZCcpXG4gICAgICAgICAgICA/IFtjb21taXRzW2luZGV4XV1cbiAgICAgICAgICAgIDogW11cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFsbG93RGVmZXJyZWRCYXRjaFdvcmspIHtcbiAgICAgICAgICAvLyBUaGUgdHJhaWxpbmcgd29yayBpcyB0aGUgY2FsbGVyJ3MgdG8gam9pbiBiZWZvcmUgYWNrLiBBdHRhY2ggYVxuICAgICAgICAgIC8vIGhhbmRsZXIgbm93IHNvIGEgcmVqZWN0aW9uIHRoYXQgcmFjZXMgdGhhdCBqb2luIChvciBhIGZvcmVncm91bmRcbiAgICAgICAgICAvLyBmYWlsdXJlIHRoYXQgcHJldmVudHMgdGhlIGNhbGxlciBmcm9tIGV2ZXIgcmVhY2hpbmcgaXQpIGlzIG5ldmVyXG4gICAgICAgICAgLy8gYW4gdW5oYW5kbGVkUmVqZWN0aW9uOyBhd2FpdGluZyB0aGUgcHJvbWlzZSBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICB0cmFpbGluZy5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgZGVmZXJyZWRCYXRjaFdvcmsgPSB0cmFpbGluZztcbiAgICAgICAgICAvLyBPbmx5IHRoZSBwYWlyIGNodW5rcyBnYXRlIHRoZSByZXR1cm46IHRoZWlyIGNsYWltcyBhcmUgd2hhdCB0aGVcbiAgICAgICAgICAvLyBjYWxsZXIgc3RhcnRzIHRoZSBpbmxpbmUgYm9kaWVzIGZyb20uIFdpdGggbm8gcGFpcnMgdGhlcmUgaXNcbiAgICAgICAgICAvLyBub3RoaW5nIHRoZSBjYWxsZXIncyBwb3N0LXJldHVybiB3b3JrIHJlYWRzIGZyb20gdGhlIGNvbW1pdHMsXG4gICAgICAgICAgLy8gc28gbm90aGluZyBnYXRlcy5cbiAgICAgICAgICBpZiAocGFpckNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGFpckNvbW1pdHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIEEgcGFpciBjaHVuayBmYWlsZWQsIHNvIHRoaXMgcGhhc2UncyB3cml0ZSBzZXQgaXMgTk9UIHRoZVxuICAgICAgICAgICAgICAvLyBjYWxsZXIncyB0byBqb2luIGFueSBtb3JlOiBgZGVmZXJyZWRCYXRjaFdvcmtgIG5ldmVyXG4gICAgICAgICAgICAgIC8vIHJlYWNoZXMgaXQgb25jZSBoYW5kbGVTdXNwZW5zaW9uIHRocm93cy4gU2V0dGxlIHRoZSByZXN0XG4gICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgcmVqZWN0aW9uIGVzY2FwZXMsIGZvciB0aGUgcmVhc29uIGBzZXR0bGVQaGFzZWBcbiAgICAgICAgICAgICAgLy8gZ2l2ZXM6IGEgc2libGluZyBjcmVhdGUgbGFuZGluZyBhZnRlciB0aGUgdGhyb3cgY29tbWl0cyBhblxuICAgICAgICAgICAgICAvLyBldmVudCBmcm9tIHRoZSBhYmFuZG9uZWQgcmVwbGF5J3Mgc2VlZGVkIHNlcXVlbmNlIGFuZCByYWNlc1xuICAgICAgICAgICAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzdGFydCByZWxvYWQgd2hpbGUgZG9pbmcgc28uXG4gICAgICAgICAgICAgIGF3YWl0IHRyYWlsaW5nLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0cmFpbGluZztcbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHF1ZXVlSXRlbSBvZiBhdHRyaWJ1dGVJdGVtcykge1xuICAgIG9wcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgICAgIC8vIEd1YXJkZWQgbGlrZSBldmVyeSBvdGhlciBzdXNwZW5zaW9uIHdyaXRlOiBhbiBhdHRyX3NldCBpcyBhXG4gICAgICAgICAgLy8gcmVwbGF5LWRlcml2ZWQgZXZlbnQgd2l0aCBhIGNvcnJlbGF0aW9uIGlkIGZyb20gdGhpcyByZXBsYXknc1xuICAgICAgICAgIC8vIHNlZWRlZCBzZXF1ZW5jZSwgc28gaXQgbXVzdCBub3QgbGFuZCBvbiBhIGxvZyB0aGUgcmVwbGF5IG5ldmVyXG4gICAgICAgICAgLy8gc2F3LiBSZWplY3RpbmcgaXQgaXMgY2hlYXA6IGEgcnVuIHdpdGggYXR0cmlidXRlIGV2ZW50cyBhbHJlYWR5XG4gICAgICAgICAgLy8gZm9yY2VzIGFuIGluLXByb2Nlc3MgcmVwbGF5LCBzbyB0aGUgcmVzdGFydCBjb3N0cyB0aGUgcmVwbGF5IGl0XG4gICAgICAgICAgLy8gd2FzIGdvaW5nIHRvIGRvIGFueXdheS5cbiAgICAgICAgICBhd2FpdCBjcmVhdGVHdWFyZGVkKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdhdHRyX3NldCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IHF1ZXVlSXRlbS5jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHdyaXRlcjogeyB0eXBlOiAnd29ya2Zsb3cnIH0sXG4gICAgICAgICAgICAgICAgLi4uKHF1ZXVlSXRlbS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdXb3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnQgYWxyZWFkeSBleGlzdHMsIGNvbnRpbnVpbmcnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1dvcmxkVmFsaWRhdGlvbkZhaWx1cmUoZXJyKSkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5pc3RpYyB2YWxpZGF0aW9uIHJlamVjdGlvbiBmcm9tIHRoZSBXb3JsZCwgZS5nLiB0aGVcbiAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgcGVyLXJ1biBhdHRyaWJ1dGUgY2FwLCB3aGljaCBvbmx5IHRoZSBXb3JsZCBjYW5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgdGhlIHJ1bidzIGV4aXN0aW5nIGF0dHJpYnV0ZXMuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJlcGxheXMgdGhlIHdvcmtmbG93IGludG8gdGhlIGV4YWN0IHNhbWVcbiAgICAgICAgICAgIC8vIHdyaXRlIGFuZCB0aGUgZXhhY3Qgc2FtZSByZWplY3Rpb24sIHNvIHJldHJ5aW5nIGNhbiBuZXZlclxuICAgICAgICAgICAgLy8gc3VjY2VlZC4gU3VyZmFjZSBpdCBhcyBhIEZhdGFsRXJyb3Igc28gdGhlIGNhbGxlciBmYWlscyB0aGVcbiAgICAgICAgICAgIC8vIHJ1biB3aXRoIGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIGl0IGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICBjb25zdCBmYXRhbCA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgc2V0QXR0cmlidXRlcyBmYWlsZWQgV29ybGQgdmFsaWRhdGlvbjogJHtcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmYXRhbC5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgIHRocm93IGZhdGFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEF3YWl0IHRoZSBzdGVwX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgZXZlbnQgY3JlYXRlcyBiZWZvcmUgcmV0dXJuaW5nLlxuICAvLyBUaGUgY2FsbGVyICh3b3JrZmxvd0VudHJ5cG9pbnQpIG9ubHkgZW5xdWV1ZXMgdGhlIHN0ZXAtZGlzcGF0Y2ggcXVldWVcbiAgLy8gbWVzc2FnZXMgQUZURVIgaGFuZGxlU3VzcGVuc2lvbiByZXNvbHZlcywgYW5kIHRoZSBxdWV1ZSBoYW5kbGVyIGFja3NcbiAgLy8gdGhlIG9yY2hlc3RyYXRvciBtZXNzYWdlIG9ubHkgYWZ0ZXIgdGhlIGNhbGxlciByZXNvbHZlcy4gU28gdGhlIHN0ZXBfY3JlYXRlZFxuICAvLyBldmVudHMgbXVzdCBiZSBkdXJhYmxlIGhlcmUsIGFuZCB0aGUgZGlzcGF0Y2ggc2VuZHMgbXVzdCBjb21wbGV0ZSBpbiB0aGUgY2FsbGVyLFxuICAvLyBhbGwgYmVmb3JlIGFjay4gSWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBiZWZvcmUgdGhpcyByZXNvbHZlcywgdGhlIG9yY2hlc3RyYXRvclxuICAvLyBtZXNzYWdlIGlzIG5vdCBhY2tlZCBhbmQgVlFTIHJlZGVsaXZlcnMsIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAvLyBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMsIGFuZCByZWNvdmVycyB0aGUgcnVuIGluc3RlYWQgb2Ygb3JwaGFuaW5nIGl0LlxuICBhd2FpdCBzZXR0bGVQaGFzZShvcHMpO1xuXG4gIC8vIFJlYnVpbGQgdGhlIGlubGluZSBiYXRjaCBpbiBkZXRlcm1pbmlzdGljIG9yZGVyLiBgbGF6eUlubGluZUNvcnJlbGF0aW9uSWRzYFxuICAvLyBpcyBhIFNldCBzZWVkZWQgZnJvbSB0aGUgb3JkZXJlZCBmaXJzdC1OIHNsaWNlLCBzbyBpdGVyYXRpbmcgaXQgcHJlc2VydmVzXG4gIC8vIHN0ZXBJdGVtcyBvcmRlcjsgZXZlcnkgaWQgaW4gaXQgd2FzIHNldCBieSB0aGUgbGF6eSBicmFuY2ggYWJvdmUuXG4gIGNvbnN0IGxhenlJbmxpbmVTdGVwczogU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHRbJ2xhenlJbmxpbmVTdGVwcyddID0gW107XG4gIGZvciAoY29uc3QgY29ycmVsYXRpb25JZCBvZiBsYXp5SW5saW5lQ29ycmVsYXRpb25JZHMpIHtcbiAgICBjb25zdCBsYXp5U3RlcCA9IGxhenlJbmxpbmVCeUNvcnJlbGF0aW9uSWQuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgIGlmIChsYXp5U3RlcCkgbGF6eUlubGluZVN0ZXBzLnB1c2gobGF6eVN0ZXApO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgKG1pbmltdW0gdGltZW91dClcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcXVldWVJdGVtIG9mIHdhaXRJdGVtcykge1xuICAgIGNvbnN0IHJlc3VtZUF0TXMgPSBxdWV1ZUl0ZW0ucmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KTtcbiAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGguY2VpbChkZWxheU1zIC8gMTAwMCk7XG4gICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgIHNvb25lc3RXYWl0ID0ge1xuICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcXVldWVJdGVtLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnd29ya2Zsb3dfc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RlcHNDcmVhdGVkKHN0ZXBJdGVtcy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0hvb2tzQ3JlYXRlZChob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1dhaXRzQ3JlYXRlZCh3YWl0SXRlbXMubGVuZ3RoKSxcbiAgICAuLi4oZmFpbGVkU3RlcENvcnJlbGF0aW9uSWRzLnNpemUgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd1N0ZXBzRmFpbGVkU2VyaWFsaXphdGlvbihcbiAgICAgICAgICBmYWlsZWRTdGVwQ29ycmVsYXRpb25JZHMuc2l6ZVxuICAgICAgICApXG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQgPiAwXG4gICAgICA/IEF0dHJpYnV0ZS5TdGVwUmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQocmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWQpXG4gICAgICA6IHt9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwZW5kaW5nU3RlcHM6IHN0ZXBJdGVtcyxcbiAgICBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzLFxuICAgIGZhaWxlZFN0ZXBDb3JyZWxhdGlvbklkcyxcbiAgICBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHMsXG4gICAgbGF6eUlubGluZVN0ZXBzLFxuICAgIGlubGluZUNsYWltcyxcbiAgICBiYXRjaENvbW1pdHRlZFNsb3RDZWlsaW5nLFxuICAgIGRlZmVycmVkQmF0Y2hXb3JrLFxuICAgIC8vIE9uIGhvb2sgY29uZmxpY3QgdGhlIGNhbGxlciByZS1pbnZva2VzIGltbWVkaWF0ZWx5IGFuZCBuZXZlciByZWFkc1xuICAgIC8vIHRoZSB3YWl0IHRpbWVvdXQsIHNvIGRvbid0IHJlcG9ydCBvbmUuXG4gICAgd2FpdFRpbWVvdXQ6IGhhc0hvb2tDb25mbGljdCA/IHVuZGVmaW5lZCA6IHNvb25lc3RXYWl0LFxuICAgIGhhc0hvb2tDb25mbGljdCxcbiAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgIGhhc0F0dHJpYnV0ZUV2ZW50czogYXR0cmlidXRlSXRlbXMubGVuZ3RoID4gMCxcbiAgICBoYXNIb29rRXZlbnRzOiBob29rc05lZWRpbmdDcmVhdGlvbi5sZW5ndGggPiAwLFxuICAgIGhvb2tDcmVhdGlvbk1zLFxuICAgIHNlcmlhbGl6YXRpb25CbG9ja2VyQ291bnQsXG4gICAgc2VyaWFsaXphdGlvbkJsb2NrZXJzLFxuICAgIHJlcG9ydGVkRXZlbnRDb3VudDogcmVwb3J0ZWRFdmVudHMsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBgZXZlbnRzLmNyZWF0ZWAgcmVqZWN0aW9uIGlzIGRldGVybWluaXN0aWMgV29ybGQgdmFsaWRhdGlvblxuICogcmF0aGVyIHRoYW4gYSB0cmFuc2llbnQvc3RvcmFnZSBlcnJvci4gTG9jYWwgV29ybGRzXG4gKiAod29ybGQtbG9jYWwsIHdvcmxkLXBvc3RncmVzKSB0aHJvdyBgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yYCBkaXJlY3RseTtcbiAqIHJlbW90ZSBXb3JsZHMgc3VyZmFjZSB0aGUgZXF1aXZhbGVudCBzZXJ2ZXItc2lkZSByZWplY3Rpb24gYXMgYVxuICogYFdvcmtmbG93V29ybGRFcnJvcmAgd2l0aCBIVFRQIHN0YXR1cyA0MDAuIFRoZSBuYW1lIGNoZWNrIGNvdmVyc1xuICogYEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcmAgaW5zdGFuY2VzIGZyb20gYSBkaWZmZXJlbnQgY29weSBvZlxuICogYEB3b3JrZmxvdy93b3JsZGAgdGhhbiB0aGUgb25lIHRoaXMgcGFja2FnZSByZXNvbHZlZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3JsZFZhbGlkYXRpb25GYWlsdXJlKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSAnQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSAmJiBlcnIuc3RhdHVzID09PSA0MDA7XG59XG4iXX0=
|