@workflow/core 5.0.0-beta.37 → 5.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.d.ts +5 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +20 -2
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +4 -2
- package/dist/private.d.ts +21 -5
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +67 -7
- package/dist/replay-payload-cache.d.ts +11 -0
- package/dist/replay-payload-cache.d.ts.map +1 -1
- package/dist/replay-payload-cache.js +21 -4
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +18 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +42 -1
- package/dist/runtime/helpers.d.ts +103 -31
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +138 -61
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +22 -2
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +281 -47
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +50 -3
- package/dist/runtime/step-executor.d.ts +17 -13
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +36 -24
- package/dist/runtime/suspension-handler.d.ts +13 -8
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +60 -18
- package/dist/runtime/world.d.ts +10 -5
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +128 -21
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +622 -67
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +9 -2
- package/dist/serialization/codec.d.ts +17 -0
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +1 -1
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +2 -1
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +1 -1
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +100 -61
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization.d.ts +13 -9
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +150 -49
- package/dist/set-attributes.d.ts.map +1 -1
- package/dist/set-attributes.js +5 -1
- package/dist/step/context-storage.d.ts +1 -1
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +6 -4
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +3 -2
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +9 -2
- package/dist/telemetry/semantic-conventions.d.ts +43 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +32 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +38 -1
- package/dist/workflow.d.ts +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +6 -2
- package/package.json +7 -12
- package/dist/runtime/world-target.d.ts +0 -11
- package/dist/runtime/world-target.d.ts.map +0 -1
- package/dist/runtime/world-target.js +0 -15
package/dist/runtime.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { types } from 'node:util';
|
|
2
|
-
import { CorruptedEventLogError, EntityConflictError, FatalError, MaxEventsExceededError, PreconditionFailedError, ReplayDivergenceError, RUN_ERROR_CODES, RunExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
2
|
+
import { CorruptedEventLogError, EntityConflictError, FatalError, HookNotFoundError, MaxEventsExceededError, PreconditionFailedError, ReplayDivergenceError, RUN_ERROR_CODES, RunExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
3
3
|
import { setWorkflowBasePath } from '@workflow/utils';
|
|
4
4
|
import { parseWorkflowName, workflowDisplayName, } from '@workflow/utils/parse-name';
|
|
5
5
|
import { getQueueTopicPrefix, isLegacySpecVersion, ROOT_RUN_ID_ATTRIBUTE, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, WorkflowInvokePayloadSchema, } from '@workflow/world';
|
|
6
|
+
import { decodeTime } from 'ulid';
|
|
6
7
|
import { classifyRunError, isRetryableWorldError, isWorldContractError, } from './classify-error.js';
|
|
7
8
|
import { describeError } from './describe-error.js';
|
|
8
9
|
import { WorkflowSuspension } from './global.js';
|
|
9
10
|
import { runtimeLogger } from './logger.js';
|
|
10
11
|
import { getStepFunction } from './private.js';
|
|
11
12
|
import { ReplayPayloadCache } from './replay-payload-cache.js';
|
|
12
|
-
import {
|
|
13
|
+
import { COMPUTE_INSTANCE_ID } from './runtime/compute-instance.js';
|
|
14
|
+
import { getMaxEventsOverride, getMaxQueueDeliveries, getPreconditionMaxInProcessRestarts, getPreconditionMaxReinvocations, getPreconditionReinvokeDelaySeconds, getReplayDivergenceMaxRetries, isInlineOwnershipEnabled, isTurboEnabled, } from './runtime/constants.js';
|
|
13
15
|
import { countStepStartedEvents } from './runtime/count-step-started-events.js';
|
|
14
|
-
import { appendUniqueEvents, getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, isPreconditionGuardEnabled, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload,
|
|
16
|
+
import { appendUniqueEvents, getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, insertEventByEventId, isPreconditionGuardEnabled, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload, preconditionEventDelta, preconditionSnapshotParams, queueMessage, withHealthCheck, } from './runtime/helpers.js';
|
|
15
17
|
import { handleReplayBudgetExhausted, ReplayBudget, } from './runtime/replay-budget.js';
|
|
18
|
+
import { ReplayRecoveryReporter } from './runtime/replay-recovery-reporter.js';
|
|
16
19
|
import { runIdCreatedAt } from './runtime/run-id-time.js';
|
|
17
20
|
import { DEFAULT_STEP_MAX_RETRIES, executeStep, } from './runtime/step-executor.js';
|
|
18
21
|
import { computeStepLatencyTracking } from './runtime/step-latency.js';
|
|
@@ -49,6 +52,109 @@ function clampMaxEvents(serverValue) {
|
|
|
49
52
|
return serverValue;
|
|
50
53
|
return serverValue === undefined ? override : Math.min(serverValue, override);
|
|
51
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Refuse a queue delivery whose run was created in a different environment than
|
|
57
|
+
* this deployment runs in.
|
|
58
|
+
*
|
|
59
|
+
* `start()` performs two writes that must land in the same tenant: the
|
|
60
|
+
* `run_created` event, attributed to whatever environment the *caller*
|
|
61
|
+
* authenticates as, and the queue message, pinned to a *deployment*. A
|
|
62
|
+
* misconfigured caller can split them — writing the run to one environment
|
|
63
|
+
* while addressing the message to a deployment in another. The consumer then
|
|
64
|
+
* finds no run under its own tenant and the backend's resilient start
|
|
65
|
+
* (`run_started` creates the run when `run_created` was never seen) mints a
|
|
66
|
+
* SECOND copy of the same run id in this environment. Both copies are real: the
|
|
67
|
+
* creator's sits pending forever, this one executes, and every subsequent
|
|
68
|
+
* cross-tenant queue ack fails to find its message.
|
|
69
|
+
*
|
|
70
|
+
* Nothing external is needed to catch this: the creator's environment rides the
|
|
71
|
+
* message in `runInput.environment` and this process already knows its own. So
|
|
72
|
+
* compare them and stop BEFORE `run_started` — the write that would create the
|
|
73
|
+
* fork. Refusing after it would be too late.
|
|
74
|
+
*
|
|
75
|
+
* Returns `true` when the caller must abandon the delivery. Skipped whenever
|
|
76
|
+
* either side is unknown, which keeps every existing setup on its current
|
|
77
|
+
* behavior: worlds with no environment dimension (`world-local`,
|
|
78
|
+
* `world-postgres`) don't implement `getEnvironment`, and runs started by an
|
|
79
|
+
* older SDK carry no `environment` field.
|
|
80
|
+
*/
|
|
81
|
+
function refuseCrossEnvironmentDelivery({ world, runInput, runId, runLogger, }) {
|
|
82
|
+
const creatorEnvironment = runInput?.environment;
|
|
83
|
+
if (!creatorEnvironment)
|
|
84
|
+
return false;
|
|
85
|
+
const currentEnvironment = world.getEnvironment?.();
|
|
86
|
+
if (!currentEnvironment || currentEnvironment === creatorEnvironment) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
runLogger.error(`Refusing to run this workflow: it was created in the "${creatorEnvironment}" ` +
|
|
90
|
+
`environment but this deployment runs in "${currentEnvironment}". ` +
|
|
91
|
+
'Executing it here would create a second copy of the same run id in ' +
|
|
92
|
+
'both environments — one pending forever, one running — so the queue ' +
|
|
93
|
+
'message is being discarded without executing and without retrying. ' +
|
|
94
|
+
'The client that called start() wrote the run to its own environment ' +
|
|
95
|
+
'but addressed the queue message to a deployment in another one. Check ' +
|
|
96
|
+
'that the environment that client authenticates as (WORKFLOW_VERCEL_ENV ' +
|
|
97
|
+
"for CLI and CI clients, or the OIDC token's environment inside a " +
|
|
98
|
+
'deployment) matches the environment of the deployment it targets. The ' +
|
|
99
|
+
`run it created is still pending in "${creatorEnvironment}" and will ` +
|
|
100
|
+
'not run.', {
|
|
101
|
+
workflowRunId: runId,
|
|
102
|
+
creatorEnvironment,
|
|
103
|
+
currentEnvironment,
|
|
104
|
+
pinnedDeploymentId: runInput?.deploymentId,
|
|
105
|
+
});
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Log when a `start()`-enqueued message pinned to one deployment is delivered
|
|
110
|
+
* to a different one.
|
|
111
|
+
*
|
|
112
|
+
* A first-delivery message carries `runInput.deploymentId` — the deployment
|
|
113
|
+
* `start()` addressed it to — so comparing that against this handler's own
|
|
114
|
+
* deployment detects mis-delivery directly. This is a DIAGNOSTIC, not a gate:
|
|
115
|
+
* it warns and lets the invocation proceed, deliberately.
|
|
116
|
+
*
|
|
117
|
+
* Why this one only warns while its environment sibling above refuses: a
|
|
118
|
+
* differing deployment id is not by itself evidence of the fork we care about.
|
|
119
|
+
* The environment pair is exact — two named environments that disagree — and it
|
|
120
|
+
* is the dimension the run's tenant is keyed on. Deployment ids disagree for
|
|
121
|
+
* benign reasons too: `world-local` derives its id from the installed package
|
|
122
|
+
* version (`dpl_local@<version>`), so upgrading the SDK mid-run changes it with
|
|
123
|
+
* nothing wrong. Refusing on that signal would strand correct runs, and
|
|
124
|
+
* refusing before `run_started` leaves no server-side record to explain why.
|
|
125
|
+
* Anyone tempted to promote this to a hard failure has to handle that first.
|
|
126
|
+
*
|
|
127
|
+
* Skipped unless BOTH ids are known — `getDeploymentId()` throws in worlds that
|
|
128
|
+
* require a deployment and have none, and a re-enqueued message carries no
|
|
129
|
+
* `runInput` at all.
|
|
130
|
+
*/
|
|
131
|
+
async function warnOnDeploymentPinningMismatch({ world, runInput, runId, runLogger, }) {
|
|
132
|
+
const pinnedDeploymentId = runInput?.deploymentId;
|
|
133
|
+
if (!pinnedDeploymentId)
|
|
134
|
+
return;
|
|
135
|
+
let currentDeploymentId;
|
|
136
|
+
try {
|
|
137
|
+
currentDeploymentId = await world.getDeploymentId();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Worlds that require a deployment id throw when there isn't one. That is
|
|
141
|
+
// not a mismatch — there is simply nothing to compare against.
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!currentDeploymentId || currentDeploymentId === pinnedDeploymentId) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
runLogger.error('Queue message was delivered to a deployment it was not pinned to. ' +
|
|
148
|
+
'The run was created targeting a different deployment, so this ' +
|
|
149
|
+
'invocation may be replaying against code the run was not started on. ' +
|
|
150
|
+
'Continuing — this is expected if the Workflow SDK version changed ' +
|
|
151
|
+
'mid-run in local development, where the deployment id is derived from ' +
|
|
152
|
+
'that version.', {
|
|
153
|
+
workflowRunId: runId,
|
|
154
|
+
pinnedDeploymentId,
|
|
155
|
+
currentDeploymentId,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
52
158
|
function getWorkflowSetupErrorCode(err) {
|
|
53
159
|
if (WorkflowRuntimeError.is(err)) {
|
|
54
160
|
return RUN_ERROR_CODES.RUNTIME_ERROR;
|
|
@@ -109,6 +215,15 @@ function hasRecordedTerminalRunEvent(events, runId) {
|
|
|
109
215
|
});
|
|
110
216
|
return true;
|
|
111
217
|
}
|
|
218
|
+
/** How many of `ids` are absent from `present`. */
|
|
219
|
+
function countMissingIds(ids, present) {
|
|
220
|
+
let missing = 0;
|
|
221
|
+
for (const id of ids) {
|
|
222
|
+
if (!present.has(id))
|
|
223
|
+
missing++;
|
|
224
|
+
}
|
|
225
|
+
return missing;
|
|
226
|
+
}
|
|
112
227
|
/**
|
|
113
228
|
* The lineage root of a loaded run: its `$rootRunId` attribute, or its own id
|
|
114
229
|
* when it is itself a root.
|
|
@@ -186,7 +301,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
186
301
|
await handleHealthCheckMessage(healthCheck, worldHandlers.specVersion);
|
|
187
302
|
return;
|
|
188
303
|
}
|
|
189
|
-
const { runId, traceCarrier: incomingTraceCarrier, requestedAt, stepId: incomingStepId, stepName: incomingStepName, replayDivergence, runInput, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
304
|
+
const { runId, traceCarrier: incomingTraceCarrier, requestedAt, stepId: incomingStepId, stepName: incomingStepName, replayDivergence, preconditionReinvocations, runInput, hookInput, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
190
305
|
// `start()` always attaches a trace carrier, but
|
|
191
306
|
// serializeTraceCarrier() returns `{}` when no OTEL SDK is registered
|
|
192
307
|
// or no span is active — treat an empty carrier the same as an
|
|
@@ -275,6 +390,32 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
275
390
|
return await withTraceContext(parentTraceCarrier, async () => {
|
|
276
391
|
return await withWorkflowBaggage({ workflowRunId: runId, workflowName }, async () => {
|
|
277
392
|
const world = await trace('workflow.route.get_world', async () => getWorld());
|
|
393
|
+
// Both checks below look at `runInput`, so both are no-ops on a
|
|
394
|
+
// re-enqueued message (which carries none) — they only ever run on
|
|
395
|
+
// a first delivery, the one that could create the run.
|
|
396
|
+
//
|
|
397
|
+
// Returning acks the message. That is deliberate: the mismatch is
|
|
398
|
+
// baked into this message, so every redelivery would reach the
|
|
399
|
+
// same verdict, and throwing would just hot-loop the handler until
|
|
400
|
+
// MAX_QUEUE_DELIVERIES with the same error each time. It matches
|
|
401
|
+
// how the run_started path already discards deliveries whose
|
|
402
|
+
// verdict cannot change (EntityConflictError, RunExpiredError).
|
|
403
|
+
if (refuseCrossEnvironmentDelivery({
|
|
404
|
+
world,
|
|
405
|
+
runInput,
|
|
406
|
+
runId,
|
|
407
|
+
runLogger,
|
|
408
|
+
})) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
// Diagnostic only — see the helper for why this warns instead of
|
|
412
|
+
// refusing the invocation.
|
|
413
|
+
await warnOnDeploymentPinningMismatch({
|
|
414
|
+
world,
|
|
415
|
+
runInput,
|
|
416
|
+
runId,
|
|
417
|
+
runLogger,
|
|
418
|
+
});
|
|
278
419
|
return trace(`workflow.execute ${workflowDisplayName(workflowName)}`, { kind: spanKind, links: spanLinks }, async (span) => {
|
|
279
420
|
span?.setAttributes({
|
|
280
421
|
...Attribute.WorkflowName(workflowName),
|
|
@@ -290,6 +431,10 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
290
431
|
});
|
|
291
432
|
const invocationStartTime = Date.now();
|
|
292
433
|
let loopIteration = 0;
|
|
434
|
+
const replayRecoveryReporter = replayDivergence
|
|
435
|
+
? new ReplayRecoveryReporter(replayDivergence.count)
|
|
436
|
+
: ReplayRecoveryReporter.inert();
|
|
437
|
+
const createEvent = (data, params) => replayRecoveryReporter.withEventCreate(params, (p) => world.events.create(runId, data, p));
|
|
293
438
|
// Event cache: keep loaded events in memory across loop iterations.
|
|
294
439
|
// On the first iteration we do a full load; on subsequent iterations
|
|
295
440
|
// we fetch only events created after the last known cursor.
|
|
@@ -302,7 +447,9 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
302
447
|
// events.list round-trip. Each value is consumed exactly once
|
|
303
448
|
// and then cleared. Null means "no delta pending — fetch
|
|
304
449
|
// normally". See the consume site at the top of the loop and
|
|
305
|
-
// the produce
|
|
450
|
+
// the produce sites: after inline executeStep, and in
|
|
451
|
+
// restartReplayInProcess when a stale-snapshot rejection
|
|
452
|
+
// carried the missing events with it.
|
|
306
453
|
let pendingInlineDelta = null;
|
|
307
454
|
// Shared state: set by either the background step path
|
|
308
455
|
// or the run_started setup below.
|
|
@@ -331,7 +478,11 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
331
478
|
let runStartedReceivedAtMs;
|
|
332
479
|
// Wall-clock ms spent committing hook_created events before
|
|
333
480
|
// the first step ran, accumulated across suspension passes
|
|
334
|
-
// and subtracted from TTFS.
|
|
481
|
+
// and subtracted from TTFS. Accumulators here survive an
|
|
482
|
+
// in-process replay restart (a stale-snapshot rejection, or
|
|
483
|
+
// the attribute-event restart below), so a restarted
|
|
484
|
+
// invocation over-counts by the abandoned pass's hook time —
|
|
485
|
+
// the same slight over-count either restart has always had.
|
|
335
486
|
let preStepBlockingMs = 0;
|
|
336
487
|
// Snapshot of the accumulator as of the suspension that
|
|
337
488
|
// wrote the run's first attr_set (whose hook phase ran
|
|
@@ -430,7 +581,16 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
430
581
|
});
|
|
431
582
|
}
|
|
432
583
|
};
|
|
433
|
-
const reinvoke = async (delaySeconds
|
|
584
|
+
const reinvoke = async (delaySeconds,
|
|
585
|
+
/**
|
|
586
|
+
* Extra fields to carry on the new message. Only reaches the
|
|
587
|
+
* next invocation on the turbo path: without turbo no
|
|
588
|
+
* message is enqueued at all — the handler returns a
|
|
589
|
+
* visibility timeout and the queue redelivers the CURRENT
|
|
590
|
+
* message, whose body (and therefore any counter on it)
|
|
591
|
+
* cannot be changed.
|
|
592
|
+
*/
|
|
593
|
+
extraPayload) => {
|
|
434
594
|
assertNoInFlightOwnedSteps('reinvoke');
|
|
435
595
|
if (!turbo)
|
|
436
596
|
return { timeoutSeconds: delaySeconds };
|
|
@@ -438,9 +598,201 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
438
598
|
runId,
|
|
439
599
|
traceCarrier: await nextTraceCarrier(),
|
|
440
600
|
requestedAt: new Date(),
|
|
601
|
+
...extraPayload,
|
|
441
602
|
}, delaySeconds > 0 ? { delaySeconds } : undefined);
|
|
442
603
|
return undefined;
|
|
443
604
|
};
|
|
605
|
+
// Precondition (412) recovery: how many times this invocation
|
|
606
|
+
// has thrown away its replay and started over in-process.
|
|
607
|
+
let preconditionRestarts = 0;
|
|
608
|
+
/**
|
|
609
|
+
* Event ids the discarded replay held, kept until the next
|
|
610
|
+
* load resolves so a restart can report what its reload
|
|
611
|
+
* actually found. Without this a 412 only ever tells you that
|
|
612
|
+
* a restart happened, which conflates two very different
|
|
613
|
+
* situations: a log that grew (expected — the fence did its
|
|
614
|
+
* job) and a log that came back identical, which means client
|
|
615
|
+
* and backend disagree about the count for the same set of
|
|
616
|
+
* events and the restart will re-derive the same snapshot and
|
|
617
|
+
* be rejected again.
|
|
618
|
+
*/
|
|
619
|
+
let preconditionRestartBaseline = null;
|
|
620
|
+
/**
|
|
621
|
+
* Report what a stale-snapshot restart's reload found, once
|
|
622
|
+
* the log this replay will actually consume is in hand.
|
|
623
|
+
*
|
|
624
|
+
* `grew` is the expected case and gives 412 volume a
|
|
625
|
+
* denominator. `unchanged` means the reload disagreed with
|
|
626
|
+
* the rejection, so this replay re-derives the same snapshot
|
|
627
|
+
* and is rejected again until the budget is spent. `shrank`
|
|
628
|
+
* should be impossible: every load path only adds to a run's
|
|
629
|
+
* log.
|
|
630
|
+
*/
|
|
631
|
+
const reportPreconditionRestartReload = (events) => {
|
|
632
|
+
const baseline = preconditionRestartBaseline;
|
|
633
|
+
if (!baseline)
|
|
634
|
+
return;
|
|
635
|
+
preconditionRestartBaseline = null;
|
|
636
|
+
const reloadedIds = new Set(events.map((event) => event.eventId));
|
|
637
|
+
const added = countMissingIds(reloadedIds, baseline.ids);
|
|
638
|
+
const dropped = countMissingIds(baseline.ids, reloadedIds);
|
|
639
|
+
const outcome = dropped > 0 ? 'shrank' : added > 0 ? 'grew' : 'unchanged';
|
|
640
|
+
runtimeLogger.warn('Restarted replay reloaded its event log after a stale-snapshot rejection', {
|
|
641
|
+
workflowRunId: runId,
|
|
642
|
+
outcome,
|
|
643
|
+
added,
|
|
644
|
+
dropped,
|
|
645
|
+
eventsBefore: baseline.ids.size,
|
|
646
|
+
eventsAfter: reloadedIds.size,
|
|
647
|
+
preconditionRestarts: baseline.restart,
|
|
648
|
+
reason: baseline.reason,
|
|
649
|
+
source: baseline.source,
|
|
650
|
+
loopIteration,
|
|
651
|
+
});
|
|
652
|
+
};
|
|
653
|
+
/**
|
|
654
|
+
* Recover from a stale-snapshot rejection by restarting the
|
|
655
|
+
* replay inside this invocation, returning false when the
|
|
656
|
+
* per-invocation budget is spent (the caller then falls back
|
|
657
|
+
* to a fresh invocation).
|
|
658
|
+
*
|
|
659
|
+
* A 412 means the log this replay derived its events from was
|
|
660
|
+
* missing an event the backend had already recorded. The
|
|
661
|
+
* rejected write cannot simply be retried: correlation ids
|
|
662
|
+
* are positional ordinals of one seeded sequence, so a replay
|
|
663
|
+
* over the corrected log mints a different id for the same
|
|
664
|
+
* logical event, and re-posting this one would persist an
|
|
665
|
+
* event no correct replay ever produces. The whole replay has
|
|
666
|
+
* to be re-derived — which the loop does by discarding its
|
|
667
|
+
* cached log, since `runWorkflow` then builds a fresh VM,
|
|
668
|
+
* seed and correlation-id sequence from the reloaded events.
|
|
669
|
+
*/
|
|
670
|
+
const restartReplayInProcess = (reason, error,
|
|
671
|
+
/**
|
|
672
|
+
* Set false when writes this invocation made concurrently
|
|
673
|
+
* with the rejected one may be missing from the 412's
|
|
674
|
+
* delta: the World computed that delta against the
|
|
675
|
+
* rejected request's snapshot, so it cannot contain an
|
|
676
|
+
* event a sibling committed afterwards, and merging it
|
|
677
|
+
* would restart the replay on a log that is still
|
|
678
|
+
* incomplete. Only a full reload is authoritative then.
|
|
679
|
+
*/
|
|
680
|
+
{ allowDelta = true } = {}) => {
|
|
681
|
+
if (preconditionRestarts >=
|
|
682
|
+
getPreconditionMaxInProcessRestarts()) {
|
|
683
|
+
return false;
|
|
684
|
+
}
|
|
685
|
+
preconditionRestarts++;
|
|
686
|
+
// A World MAY return the events we were missing on the 412.
|
|
687
|
+
// Trust it only on the FIRST restart: its completeness proof
|
|
688
|
+
// leans on the backend's own bookkeeping, so if that
|
|
689
|
+
// under-counts, a "complete" delta can still leave a hole.
|
|
690
|
+
// Bounding it to one attempt caps that at a single wasted
|
|
691
|
+
// restart; every later restart does the authoritative load.
|
|
692
|
+
const delta = allowDelta && preconditionRestarts === 1
|
|
693
|
+
? preconditionEventDelta(error, runId)
|
|
694
|
+
: null;
|
|
695
|
+
// A delta is only usable as a delta if there is a cached log
|
|
696
|
+
// to merge it into; with no base log the restart has to load
|
|
697
|
+
// the whole thing anyway.
|
|
698
|
+
const usedDelta = Boolean(delta && cachedEvents);
|
|
699
|
+
// Snapshot the set being discarded while it is still in
|
|
700
|
+
// hand; the comparison happens once the next load resolves.
|
|
701
|
+
preconditionRestartBaseline = cachedEvents
|
|
702
|
+
? {
|
|
703
|
+
ids: new Set(cachedEvents.map((event) => event.eventId)),
|
|
704
|
+
restart: preconditionRestarts,
|
|
705
|
+
reason,
|
|
706
|
+
source: usedDelta ? 'inline-delta' : 'full-reload',
|
|
707
|
+
}
|
|
708
|
+
: null;
|
|
709
|
+
if (usedDelta) {
|
|
710
|
+
// Consumed by the loop's first branch
|
|
711
|
+
// (`pendingInlineDelta && cachedEvents`) with no
|
|
712
|
+
// events.list round trip at all.
|
|
713
|
+
pendingInlineDelta = delta;
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
// MUST be a full, cursor-less reload. The cursor filters
|
|
717
|
+
// by lexicographic event id while a hole is defined by
|
|
718
|
+
// ULID *time*: an event in the same millisecond sorts
|
|
719
|
+
// either side of the cursor depending on its random
|
|
720
|
+
// component, and an event minted in an earlier
|
|
721
|
+
// millisecond but committed later always sorts below it.
|
|
722
|
+
// An incremental load therefore heals the hole only by
|
|
723
|
+
// luck.
|
|
724
|
+
cachedEvents = null;
|
|
725
|
+
eventsCursor = null;
|
|
726
|
+
preloadedEvents = undefined;
|
|
727
|
+
preloadedEventsCursor = undefined;
|
|
728
|
+
pendingInlineDelta = null;
|
|
729
|
+
// The corrected log inserts the missing events BELOW the
|
|
730
|
+
// length already scanned for payload prewarming, shifting
|
|
731
|
+
// every later position. Only a full rescan sees them.
|
|
732
|
+
replayPayloadCache.resetScan();
|
|
733
|
+
}
|
|
734
|
+
runtimeLogger.warn('Event creation rejected as stale; restarting replay in-process', {
|
|
735
|
+
workflowRunId: runId,
|
|
736
|
+
reason,
|
|
737
|
+
loopIteration,
|
|
738
|
+
preconditionRestarts,
|
|
739
|
+
source: usedDelta ? 'inline-delta' : 'full-reload',
|
|
740
|
+
});
|
|
741
|
+
span?.setAttributes({
|
|
742
|
+
'workflow.precondition_restarts': preconditionRestarts,
|
|
743
|
+
});
|
|
744
|
+
return true;
|
|
745
|
+
};
|
|
746
|
+
/**
|
|
747
|
+
* Escalate a stale-snapshot rejection that survived the
|
|
748
|
+
* in-process restart budget to a fresh invocation, or give up
|
|
749
|
+
* on the run when the per-run budget is also spent.
|
|
750
|
+
*
|
|
751
|
+
* The in-process budget is a closure variable and the queue's
|
|
752
|
+
* delivery count restarts at 1 whenever a new message is
|
|
753
|
+
* enqueued, so a run that is permanently unable to catch up
|
|
754
|
+
* with its own event log would otherwise cycle restarts →
|
|
755
|
+
* re-invoke → restarts with no run-level bound. The chain is
|
|
756
|
+
* therefore counted on the message itself, in the same way
|
|
757
|
+
* replay divergences are, and fails the run once exhausted.
|
|
758
|
+
*
|
|
759
|
+
* The counter only advances on hops that enqueue a new message
|
|
760
|
+
* (see `reinvoke`). A redelivery-based hop keeps the same body
|
|
761
|
+
* and so the same count, but it also keeps advancing
|
|
762
|
+
* `metadata.attempt`, which the max-delivery check at the top
|
|
763
|
+
* of the handler already bounds — and the delay below is what
|
|
764
|
+
* makes that budget span real time rather than being burned in
|
|
765
|
+
* a tight loop.
|
|
766
|
+
*/
|
|
767
|
+
const reinvokeAfterStaleRejection = async (reason, error) => {
|
|
768
|
+
const attempt = (preconditionReinvocations ?? 0) + 1;
|
|
769
|
+
const maxReinvocations = getPreconditionMaxReinvocations();
|
|
770
|
+
if (attempt > maxReinvocations) {
|
|
771
|
+
return {
|
|
772
|
+
reinvoked: false,
|
|
773
|
+
error: new WorkflowRuntimeError(`Event creation was rejected as stale after ${maxReinvocations} re-invocations of ${getPreconditionMaxInProcessRestarts()} in-process replay restarts each: this run cannot observe its own event log completely enough to make progress. Last rejection (${reason}): ${error instanceof Error ? error.message : String(error)}`, { cause: error }),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
runtimeLogger.warn('Event creation rejected as stale after in-process restarts; re-invoking run for a fresh replay', {
|
|
777
|
+
workflowRunId: runId,
|
|
778
|
+
reason,
|
|
779
|
+
loopIteration,
|
|
780
|
+
preconditionReinvocations: attempt,
|
|
781
|
+
maxReinvocations,
|
|
782
|
+
});
|
|
783
|
+
span?.setAttributes({
|
|
784
|
+
'workflow.precondition_reinvocations': attempt,
|
|
785
|
+
});
|
|
786
|
+
// Delayed, unlike the other reinvoke() callers: the
|
|
787
|
+
// in-process restarts already reloaded the log several times
|
|
788
|
+
// without catching up, so the writers this replay is racing
|
|
789
|
+
// are still active. Retrying instantly just burns the
|
|
790
|
+
// per-run budget at full speed.
|
|
791
|
+
return {
|
|
792
|
+
reinvoked: true,
|
|
793
|
+
result: await reinvoke(getPreconditionReinvokeDelaySeconds(), { preconditionReinvocations: attempt }),
|
|
794
|
+
};
|
|
795
|
+
};
|
|
444
796
|
// If incoming message has a stepId, this is a background step
|
|
445
797
|
// execution. Execute the step, then check if all parallel steps
|
|
446
798
|
// from the batch are done. If so, replay inline (saving a queue
|
|
@@ -700,7 +1052,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
700
1052
|
// handler, optimistic step_started, terminal run writes) so
|
|
701
1053
|
// nothing is written before the run exists.
|
|
702
1054
|
recordRunStartedCreateStart(true);
|
|
703
|
-
const startedPromise =
|
|
1055
|
+
const startedPromise = createEvent(runStartedEvent,
|
|
704
1056
|
// We background this purely as a write barrier and
|
|
705
1057
|
// never read its preloaded events (preloadedEvents is
|
|
706
1058
|
// forced to [] below), so tell the World to skip the
|
|
@@ -774,7 +1126,9 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
774
1126
|
else {
|
|
775
1127
|
try {
|
|
776
1128
|
recordRunStartedCreateStart(false);
|
|
777
|
-
const result = await
|
|
1129
|
+
const result = await createEvent(runStartedEvent, {
|
|
1130
|
+
requestId,
|
|
1131
|
+
});
|
|
778
1132
|
if (!result.run) {
|
|
779
1133
|
throw new WorkflowRuntimeError(`Event creation for 'run_started' did not return the run entity for run "${runId}"`);
|
|
780
1134
|
}
|
|
@@ -842,6 +1196,145 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
842
1196
|
}
|
|
843
1197
|
} // end else (non-turbo run_started)
|
|
844
1198
|
} // end if (!workflowRun)
|
|
1199
|
+
// Lazy hook resume: the producer (resumeHook fast path)
|
|
1200
|
+
// parallelized the `hook_received` write with this queue
|
|
1201
|
+
// publish, so the event may not be persisted yet. Idempotently
|
|
1202
|
+
// ensure it before replay — keyed by `resumeId` so a
|
|
1203
|
+
// concurrent producer write converges on exactly one event
|
|
1204
|
+
// (the server resolves a matching claim as success, not an
|
|
1205
|
+
// error). `hookInput` never rides a turbo first-delivery
|
|
1206
|
+
// (that path carries `runInput`, not `hookInput`), so this
|
|
1207
|
+
// only runs on the normal load-and-replay path.
|
|
1208
|
+
if (hookInput) {
|
|
1209
|
+
// Perf (Option A): if the producer's concurrent direct
|
|
1210
|
+
// write already landed in the run_started preload, the
|
|
1211
|
+
// canonical event is in the log and the re-ensure round trip
|
|
1212
|
+
// is pure overhead. Skip it when the preload already carries
|
|
1213
|
+
// a `hook_received` with this resume's persisted `resumeId`
|
|
1214
|
+
// (unique per resume, so we never skip on an unrelated
|
|
1215
|
+
// hook_received). Best-effort: the win lands only when the
|
|
1216
|
+
// producer's write beat this consumer's load; otherwise we
|
|
1217
|
+
// fall through to the idempotent re-ensure below.
|
|
1218
|
+
const alreadyPreloaded = hookInput.resumeId !== undefined &&
|
|
1219
|
+
preloadedEvents?.some((e) => e.eventType === 'hook_received' &&
|
|
1220
|
+
e.resumeId === hookInput.resumeId);
|
|
1221
|
+
if (alreadyPreloaded) {
|
|
1222
|
+
// Event already visible in the preloaded log — nothing to
|
|
1223
|
+
// ensure or splice.
|
|
1224
|
+
}
|
|
1225
|
+
else {
|
|
1226
|
+
// Date the materialized event to when the resume actually
|
|
1227
|
+
// occurred, not when this queue delivery ran. `resumeId`
|
|
1228
|
+
// is the ULID minted by `resumeHook()` at resume time, so
|
|
1229
|
+
// its embedded timestamp is the honest `occurredAt` and
|
|
1230
|
+
// keeps latency attribution off the queue round trip. A
|
|
1231
|
+
// non-ULID resumeId (legacy / test) simply leaves it
|
|
1232
|
+
// undefined, so the World falls back to `createdAt`.
|
|
1233
|
+
let occurredAt;
|
|
1234
|
+
try {
|
|
1235
|
+
occurredAt =
|
|
1236
|
+
hookInput.resumeId !== undefined
|
|
1237
|
+
? new Date(decodeTime(hookInput.resumeId))
|
|
1238
|
+
: undefined;
|
|
1239
|
+
}
|
|
1240
|
+
catch {
|
|
1241
|
+
occurredAt = undefined;
|
|
1242
|
+
}
|
|
1243
|
+
let ensuredEvent;
|
|
1244
|
+
try {
|
|
1245
|
+
const ensured = await world.events.create(runId, {
|
|
1246
|
+
eventType: 'hook_received',
|
|
1247
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
1248
|
+
correlationId: hookInput.hookId,
|
|
1249
|
+
eventData: {
|
|
1250
|
+
token: hookInput.token,
|
|
1251
|
+
payload: hookInput.payload,
|
|
1252
|
+
},
|
|
1253
|
+
}, {
|
|
1254
|
+
requestId,
|
|
1255
|
+
occurredAt,
|
|
1256
|
+
resumeId: hookInput.resumeId,
|
|
1257
|
+
resumePayloadDigest: hookInput.payloadDigest,
|
|
1258
|
+
});
|
|
1259
|
+
// Consumer-side completion of the recovery path: this
|
|
1260
|
+
// replay materialized the event because the producer's
|
|
1261
|
+
// direct write had not landed in the preload.
|
|
1262
|
+
span?.setAttributes(Attribute.HookResilientResumeMaterialized(true));
|
|
1263
|
+
// The canonical event — whether this call committed it or
|
|
1264
|
+
// converged on the producer's concurrent write — so we can
|
|
1265
|
+
// splice it into the preloaded log instead of discarding
|
|
1266
|
+
// the preload (see below).
|
|
1267
|
+
//
|
|
1268
|
+
// Reconstruct `eventData` from `hookInput` rather than
|
|
1269
|
+
// trusting the POST response's payload: world-vercel posts
|
|
1270
|
+
// hook_received with `remoteRefBehavior: 'lazy'`, so the
|
|
1271
|
+
// returned event's payload is a RemoteRef *descriptor*, not
|
|
1272
|
+
// the serialized bytes replay needs. `hookInput` carries
|
|
1273
|
+
// the real token + payload bytes (they rode the queue
|
|
1274
|
+
// message), so splice those onto the returned event's
|
|
1275
|
+
// stable eventId/metadata.
|
|
1276
|
+
// The re-ensure always returns a `hook_received` event, so
|
|
1277
|
+
// the splice is safe. The cast is needed because spreading
|
|
1278
|
+
// the raw `Event` union and overriding `eventData` collapses
|
|
1279
|
+
// to a non-`hook_received` member (whose `eventData` is a
|
|
1280
|
+
// different shape); the object is a genuine `hook_received`
|
|
1281
|
+
// event by construction.
|
|
1282
|
+
const base = ensured.event;
|
|
1283
|
+
ensuredEvent = base
|
|
1284
|
+
? {
|
|
1285
|
+
...base,
|
|
1286
|
+
eventData: {
|
|
1287
|
+
token: hookInput.token,
|
|
1288
|
+
payload: hookInput.payload,
|
|
1289
|
+
},
|
|
1290
|
+
}
|
|
1291
|
+
: undefined;
|
|
1292
|
+
}
|
|
1293
|
+
catch (err) {
|
|
1294
|
+
// A matching concurrent claim (same resumeId + digest) is
|
|
1295
|
+
// resolved as success server-side and never throws, so
|
|
1296
|
+
// anything caught here is a genuine terminal or transient
|
|
1297
|
+
// condition:
|
|
1298
|
+
//
|
|
1299
|
+
// - HookNotFound / RunExpired: the producer's direct write
|
|
1300
|
+
// already ended this resume's eligibility (the run went
|
|
1301
|
+
// terminal). There is nothing left to resume, so consume
|
|
1302
|
+
// the message and stop. Continuing to replay would be
|
|
1303
|
+
// wasted work — and, worse, would ack a delivery that may
|
|
1304
|
+
// carry the only copy of the payload.
|
|
1305
|
+
if (HookNotFoundError.is(err) ||
|
|
1306
|
+
RunExpiredError.is(err)) {
|
|
1307
|
+
return;
|
|
1308
|
+
}
|
|
1309
|
+
// - EntityConflict (and any other unexpected error): the
|
|
1310
|
+
// resumeId constraint exists but the matching event is
|
|
1311
|
+
// not yet observable — the producer's parallel write is
|
|
1312
|
+
// still in flight, or a redrive raced the claim. This is
|
|
1313
|
+
// transient: rethrow so the queue redelivers and a later
|
|
1314
|
+
// attempt converges on the committed event instead of
|
|
1315
|
+
// replaying (and acking) without the payload.
|
|
1316
|
+
throw err;
|
|
1317
|
+
}
|
|
1318
|
+
// The run_started response preloaded the log BEFORE this
|
|
1319
|
+
// ensure, so it cannot include the hook_received. Rather
|
|
1320
|
+
// than discard the preload (which would cost a fresh
|
|
1321
|
+
// events.list round trip on the first replay iteration),
|
|
1322
|
+
// splice in the canonical event reconstructed above. It
|
|
1323
|
+
// carries a stable eventId, so `insertEventByEventId` keeps
|
|
1324
|
+
// it in ascending eventId order (preloadedEvents load
|
|
1325
|
+
// `sortOrder: 'asc'` and are not re-sorted client-side) and
|
|
1326
|
+
// is idempotent even if a later list re-observes it. Only
|
|
1327
|
+
// when the World returns no event (older backend) do we fall
|
|
1328
|
+
// back to dropping the preload so a fresh list observes it.
|
|
1329
|
+
if (preloadedEvents && ensuredEvent) {
|
|
1330
|
+
insertEventByEventId(preloadedEvents, ensuredEvent);
|
|
1331
|
+
}
|
|
1332
|
+
else {
|
|
1333
|
+
preloadedEvents = undefined;
|
|
1334
|
+
preloadedEventsCursor = undefined;
|
|
1335
|
+
}
|
|
1336
|
+
} // end else (re-ensure needed)
|
|
1337
|
+
}
|
|
845
1338
|
// Resolve the encryption key for this run's deployment.
|
|
846
1339
|
// Used eagerly here since both runWorkflow (input
|
|
847
1340
|
// hydration / hook payload decryption) and the run_failed
|
|
@@ -973,6 +1466,15 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
973
1466
|
eventsCursor = loaded.cursor;
|
|
974
1467
|
events = cachedEvents;
|
|
975
1468
|
}
|
|
1469
|
+
// Publish the snapshot to the loop-scoped cache as soon
|
|
1470
|
+
// as it is loaded, not just at the end of the iteration:
|
|
1471
|
+
// a stale-snapshot rejection thrown by the wait-completion
|
|
1472
|
+
// writes below restarts the replay, and that restart can
|
|
1473
|
+
// only consume a World-attached event delta when there is
|
|
1474
|
+
// a cached array to merge it into. Reassigned again after
|
|
1475
|
+
// the wait pass, which may swap in a freshly loaded array.
|
|
1476
|
+
cachedEvents = events;
|
|
1477
|
+
reportPreconditionRestartReload(events);
|
|
976
1478
|
// Detect concurrent completion via the event log: if
|
|
977
1479
|
// any other handler wrote a terminal run event, exit
|
|
978
1480
|
// before doing replay work. The run entity's status is
|
|
@@ -1001,15 +1503,11 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1001
1503
|
},
|
|
1002
1504
|
}));
|
|
1003
1505
|
for (const waitEvent of waitsToComplete) {
|
|
1004
|
-
const waitLog = {
|
|
1005
|
-
events,
|
|
1006
|
-
cursor: eventsCursor,
|
|
1007
|
-
};
|
|
1008
1506
|
try {
|
|
1009
|
-
await
|
|
1507
|
+
await createEvent(waitEvent, {
|
|
1010
1508
|
requestId,
|
|
1011
|
-
|
|
1012
|
-
})
|
|
1509
|
+
...preconditionSnapshotParams(events, eventsCursor),
|
|
1510
|
+
});
|
|
1013
1511
|
}
|
|
1014
1512
|
catch (err) {
|
|
1015
1513
|
if (EntityConflictError.is(err)) {
|
|
@@ -1021,10 +1519,6 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1021
1519
|
}
|
|
1022
1520
|
throw err;
|
|
1023
1521
|
}
|
|
1024
|
-
finally {
|
|
1025
|
-
// Reloads inside the guard may have advanced the cursor.
|
|
1026
|
-
eventsCursor = waitLog.cursor;
|
|
1027
|
-
}
|
|
1028
1522
|
}
|
|
1029
1523
|
if (waitsToComplete.length > 0) {
|
|
1030
1524
|
// The event list above may be stale by the time an
|
|
@@ -1119,25 +1613,25 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1119
1613
|
loopIteration,
|
|
1120
1614
|
replayMs: Date.now() - replayStart,
|
|
1121
1615
|
});
|
|
1616
|
+
replayRecoveryReporter.activate();
|
|
1122
1617
|
// Workflow completed. Send the snapshot but do NOT
|
|
1123
1618
|
// reload-and-retry the create in place: `result` was
|
|
1124
1619
|
// computed by this replay, so a stale (412) rejection must
|
|
1125
1620
|
// force a *fresh replay* (which may observe the new event
|
|
1126
1621
|
// and produce a different result), not re-commit the stale
|
|
1127
|
-
// result. The catch below
|
|
1128
|
-
// propagate to the queue for re-invocation.
|
|
1622
|
+
// result. The catch below restarts the replay in-process.
|
|
1129
1623
|
try {
|
|
1130
1624
|
// Turbo: a workflow that finishes with no steps reaches
|
|
1131
1625
|
// here before the backgrounded run_started; order the
|
|
1132
1626
|
// terminal write after it so the run exists.
|
|
1133
1627
|
await awaitRunReady();
|
|
1134
|
-
await
|
|
1628
|
+
await createEvent({
|
|
1135
1629
|
eventType: 'run_completed',
|
|
1136
1630
|
specVersion: SPEC_VERSION_CURRENT,
|
|
1137
1631
|
eventData: { output: result },
|
|
1138
1632
|
}, {
|
|
1139
1633
|
requestId,
|
|
1140
|
-
|
|
1634
|
+
...preconditionSnapshotParams(events, eventsCursor),
|
|
1141
1635
|
});
|
|
1142
1636
|
}
|
|
1143
1637
|
catch (err) {
|
|
@@ -1155,6 +1649,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1155
1649
|
}
|
|
1156
1650
|
catch (err) {
|
|
1157
1651
|
if (WorkflowSuspension.is(err)) {
|
|
1652
|
+
replayRecoveryReporter.activate();
|
|
1158
1653
|
// Synchronous `runWorkflow` duration for THIS
|
|
1159
1654
|
// suspension only — anchors the `finalSchedulingReplay`
|
|
1160
1655
|
// telemetry field below (see
|
|
@@ -1195,10 +1690,11 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1195
1690
|
}
|
|
1196
1691
|
// V2: handle suspension without queuing steps.
|
|
1197
1692
|
// Each event creation inside handleSuspension carries the
|
|
1198
|
-
//
|
|
1199
|
-
//
|
|
1200
|
-
//
|
|
1201
|
-
//
|
|
1693
|
+
// precondition snapshot of the loaded event log, so a
|
|
1694
|
+
// backend holding an event this replay never saw rejects
|
|
1695
|
+
// the write (412) instead of accepting a divergent one.
|
|
1696
|
+
// The rejection is handled here, by restarting the
|
|
1697
|
+
// replay — never by re-posting the same event.
|
|
1202
1698
|
const suspensionStart = Date.now();
|
|
1203
1699
|
// The snapshot refresh above always sets cachedEvents
|
|
1204
1700
|
// before the replay can suspend. Re-narrow it for this
|
|
@@ -1223,18 +1719,27 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1223
1719
|
requestId,
|
|
1224
1720
|
eventLog: suspensionLog,
|
|
1225
1721
|
runReadyBarrier,
|
|
1722
|
+
replayRecoveryReporter,
|
|
1226
1723
|
});
|
|
1227
1724
|
}
|
|
1228
1725
|
catch (suspensionError) {
|
|
1229
|
-
// A suspension create
|
|
1230
|
-
//
|
|
1726
|
+
// A suspension create was rejected as stale: re-derive
|
|
1727
|
+
// the replay from a corrected log in this invocation.
|
|
1728
|
+
// Once the in-process budget is spent, fall back to an
|
|
1231
1729
|
// explicit immediate re-invocation (a rethrow relies
|
|
1232
1730
|
// on redelivery of a message the turbo path already
|
|
1233
1731
|
// acked — the run would stall for the queue's ~300s
|
|
1234
1732
|
// default visibility timeout).
|
|
1235
1733
|
if (PreconditionFailedError.is(suspensionError)) {
|
|
1236
|
-
|
|
1237
|
-
|
|
1734
|
+
if (restartReplayInProcess('suspension-create', suspensionError)) {
|
|
1735
|
+
continue;
|
|
1736
|
+
}
|
|
1737
|
+
const escalation = await reinvokeAfterStaleRejection('suspension-create', suspensionError);
|
|
1738
|
+
if (escalation.reinvoked)
|
|
1739
|
+
return escalation.result;
|
|
1740
|
+
// Per-run budget spent: fail the run rather than
|
|
1741
|
+
// hand it back to the queue to spin again.
|
|
1742
|
+
throw escalation.error;
|
|
1238
1743
|
}
|
|
1239
1744
|
if (!FatalError.is(suspensionError)) {
|
|
1240
1745
|
// Transient failures propagate to the queue
|
|
@@ -1260,7 +1765,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1260
1765
|
// Turbo: order the terminal write after the
|
|
1261
1766
|
// backgrounded run_started so the run exists.
|
|
1262
1767
|
await awaitRunReady();
|
|
1263
|
-
await
|
|
1768
|
+
await createEvent({
|
|
1264
1769
|
eventType: 'run_failed',
|
|
1265
1770
|
specVersion: SPEC_VERSION_CURRENT,
|
|
1266
1771
|
eventData: {
|
|
@@ -1735,11 +2240,12 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1735
2240
|
// is deferred), so without a snapshot it would bypass
|
|
1736
2241
|
// the guard entirely and a stale replay could claim —
|
|
1737
2242
|
// and commit — a step scheduled off a view that misses
|
|
1738
|
-
// an
|
|
1739
|
-
// returns
|
|
1740
|
-
// this is a no-op
|
|
1741
|
-
// that don't
|
|
1742
|
-
|
|
2243
|
+
// an event it never loaded.
|
|
2244
|
+
// `preconditionSnapshotParams` returns an empty object
|
|
2245
|
+
// when the guard env flag is off, so this is a no-op
|
|
2246
|
+
// outside guarded deployments; Worlds that don't
|
|
2247
|
+
// enforce the guard ignore it.
|
|
2248
|
+
const inlineClaimSnapshot = preconditionSnapshotParams(cachedEvents ?? [], preInlineWriteCursor);
|
|
1743
2249
|
replayBudget.pause();
|
|
1744
2250
|
let stepResults;
|
|
1745
2251
|
const stepExecutionPromises = inlineExecutions.map((s, stepIndex) => {
|
|
@@ -1805,7 +2311,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1805
2311
|
// see suppressOptimisticStart above.
|
|
1806
2312
|
suppressOptimisticStart,
|
|
1807
2313
|
runReadyBarrier,
|
|
1808
|
-
|
|
2314
|
+
preconditionSnapshot: inlineClaimSnapshot,
|
|
1809
2315
|
...(stepIndex === 0 &&
|
|
1810
2316
|
s.lazyStepInput !== undefined &&
|
|
1811
2317
|
latencyTracking
|
|
@@ -1816,6 +2322,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1816
2322
|
inlineDeltaSinceCursor: preInlineWriteCursor,
|
|
1817
2323
|
}
|
|
1818
2324
|
: {}),
|
|
2325
|
+
replayRecoveryReporter,
|
|
1819
2326
|
});
|
|
1820
2327
|
// Invariant bookkeeping: this invocation owns
|
|
1821
2328
|
// these bodies until they settle — see
|
|
@@ -1838,20 +2345,40 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1838
2345
|
catch (stepErr) {
|
|
1839
2346
|
// A stale (412) rejection of an inline step_started
|
|
1840
2347
|
// claim: the loaded view this batch was scheduled
|
|
1841
|
-
// from is
|
|
1842
|
-
//
|
|
1843
|
-
//
|
|
1844
|
-
//
|
|
1845
|
-
//
|
|
1846
|
-
//
|
|
1847
|
-
//
|
|
1848
|
-
//
|
|
2348
|
+
// from is missing an event the backend already has,
|
|
2349
|
+
// so the claim was fenced by the guard and no step
|
|
2350
|
+
// events were written. Abandon the batch — any
|
|
2351
|
+
// optimistic body result is discarded by executeStep's
|
|
2352
|
+
// reconciliation — and restart the replay so it
|
|
2353
|
+
// observes the missing event. Wait for the sibling
|
|
2354
|
+
// executions to settle first so no owned body is in
|
|
2355
|
+
// flight when the restart (or the ack path) runs.
|
|
1849
2356
|
if (PreconditionFailedError.is(stepErr)) {
|
|
1850
|
-
await Promise.allSettled(stepExecutionPromises);
|
|
1851
|
-
|
|
2357
|
+
const settled = await Promise.allSettled(stepExecutionPromises);
|
|
2358
|
+
// A sibling whose claim was accepted wrote step
|
|
2359
|
+
// events of its own, possibly after the World built
|
|
2360
|
+
// this 412's delta — so that delta can no longer be
|
|
2361
|
+
// assumed to complete the log, and the restart has
|
|
2362
|
+
// to reload it in full. `skipped` (the step already
|
|
2363
|
+
// existed), `gone` and `throttled` (claim rejected)
|
|
2364
|
+
// wrote nothing.
|
|
2365
|
+
const siblingWrote = settled.some((outcome) => outcome.status === 'fulfilled' &&
|
|
2366
|
+
(outcome.value.type === 'completed' ||
|
|
2367
|
+
outcome.value.type === 'failed' ||
|
|
2368
|
+
outcome.value.type === 'retry'));
|
|
2369
|
+
if (restartReplayInProcess('inline-claim', stepErr, {
|
|
2370
|
+
allowDelta: !siblingWrote,
|
|
2371
|
+
})) {
|
|
2372
|
+
// The finally below resumes the replay budget
|
|
2373
|
+
// before the next iteration starts.
|
|
2374
|
+
continue;
|
|
2375
|
+
}
|
|
1852
2376
|
// The finally below resumes the replay budget
|
|
1853
|
-
// before this return completes.
|
|
1854
|
-
|
|
2377
|
+
// before this return (or throw) completes.
|
|
2378
|
+
const escalation = await reinvokeAfterStaleRejection('inline-claim', stepErr);
|
|
2379
|
+
if (escalation.reinvoked)
|
|
2380
|
+
return escalation.result;
|
|
2381
|
+
throw escalation.error;
|
|
1855
2382
|
}
|
|
1856
2383
|
throw stepErr;
|
|
1857
2384
|
}
|
|
@@ -2009,19 +2536,35 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2009
2536
|
}
|
|
2010
2537
|
}
|
|
2011
2538
|
else {
|
|
2012
|
-
// Stale-snapshot rejection of a
|
|
2013
|
-
//
|
|
2014
|
-
//
|
|
2015
|
-
//
|
|
2016
|
-
//
|
|
2017
|
-
//
|
|
2018
|
-
//
|
|
2019
|
-
//
|
|
2020
|
-
//
|
|
2021
|
-
//
|
|
2539
|
+
// Stale-snapshot rejection of a guarded write made
|
|
2540
|
+
// directly by the replay loop — the result-bearing
|
|
2541
|
+
// `run_completed`, or the `wait_completed` of the wait
|
|
2542
|
+
// pass. Both reach this one catch and the rejection
|
|
2543
|
+
// does not say which, hence the neutral label.
|
|
2544
|
+
// Neither may be re-posted in place: the correlation id
|
|
2545
|
+
// and (for run_completed) the result itself came from
|
|
2546
|
+
// this replay, and a corrected log may produce
|
|
2547
|
+
// different ones. Don't fail the run — restart the
|
|
2548
|
+
// replay in this invocation, and only once that budget
|
|
2549
|
+
// is spent schedule an explicit re-invocation.
|
|
2550
|
+
// Rethrowing instead would rely on redelivery of the
|
|
2551
|
+
// CURRENT message, which the turbo path has already
|
|
2552
|
+
// acked — empirically the run then stalls for the
|
|
2553
|
+
// queue's ~300s default visibility timeout before
|
|
2554
|
+
// completing.
|
|
2555
|
+
let terminalError = err;
|
|
2022
2556
|
if (PreconditionFailedError.is(err)) {
|
|
2023
|
-
|
|
2024
|
-
|
|
2557
|
+
if (restartReplayInProcess('replay-write', err)) {
|
|
2558
|
+
continue;
|
|
2559
|
+
}
|
|
2560
|
+
const escalation = await reinvokeAfterStaleRejection('replay-write', err);
|
|
2561
|
+
if (escalation.reinvoked)
|
|
2562
|
+
return escalation.result;
|
|
2563
|
+
// Per-run budget spent. Fall through to the terminal
|
|
2564
|
+
// path below instead of rethrowing: this catch owns
|
|
2565
|
+
// failing the run, and a rethrow would escape to the
|
|
2566
|
+
// queue handler and be redelivered.
|
|
2567
|
+
terminalError = escalation.error;
|
|
2025
2568
|
}
|
|
2026
2569
|
// Transient infrastructure failures talking to the
|
|
2027
2570
|
// world (workflow-server) — an exhausted RetryAgent
|
|
@@ -2045,7 +2588,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2045
2588
|
});
|
|
2046
2589
|
throw err;
|
|
2047
2590
|
}
|
|
2048
|
-
let
|
|
2591
|
+
let replayDivergenceCountForFailure;
|
|
2049
2592
|
if (ReplayDivergenceError.is(err)) {
|
|
2050
2593
|
const divergenceCount = (replayDivergence?.count ?? 0) + 1;
|
|
2051
2594
|
const maxRecoveryReplays = getReplayDivergenceMaxRetries();
|
|
@@ -2070,8 +2613,12 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2070
2613
|
});
|
|
2071
2614
|
return;
|
|
2072
2615
|
}
|
|
2616
|
+
replayDivergenceCountForFailure = divergenceCount;
|
|
2073
2617
|
terminalError = new CorruptedEventLogError(`Workflow replay diverged ${divergenceCount} times after ${maxRecoveryReplays} recovery replays; latest divergent event was ${err.eventId}. Last divergence: ${err.message}`, { cause: err });
|
|
2074
2618
|
}
|
|
2619
|
+
else if (replayStart > 0) {
|
|
2620
|
+
replayRecoveryReporter.activate();
|
|
2621
|
+
}
|
|
2075
2622
|
// User code errors and terminal runtime errors fail the run.
|
|
2076
2623
|
if (terminalError instanceof Error) {
|
|
2077
2624
|
span?.recordException?.(terminalError);
|
|
@@ -2125,7 +2672,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2125
2672
|
// Turbo: order the terminal write after the
|
|
2126
2673
|
// backgrounded run_started so the run exists.
|
|
2127
2674
|
await awaitRunReady();
|
|
2128
|
-
await
|
|
2675
|
+
await createEvent({
|
|
2129
2676
|
eventType: 'run_failed',
|
|
2130
2677
|
specVersion: SPEC_VERSION_CURRENT,
|
|
2131
2678
|
eventData: {
|
|
@@ -2133,7 +2680,14 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2133
2680
|
SPEC_VERSION_SUPPORTS_COMPRESSION),
|
|
2134
2681
|
errorCode,
|
|
2135
2682
|
},
|
|
2136
|
-
}, {
|
|
2683
|
+
}, {
|
|
2684
|
+
requestId,
|
|
2685
|
+
...(replayDivergenceCountForFailure !== undefined
|
|
2686
|
+
? {
|
|
2687
|
+
replayDivergenceCount: replayDivergenceCountForFailure,
|
|
2688
|
+
}
|
|
2689
|
+
: {}),
|
|
2690
|
+
});
|
|
2137
2691
|
}
|
|
2138
2692
|
catch (failErr) {
|
|
2139
2693
|
if (EntityConflictError.is(failErr) ||
|
|
@@ -2185,6 +2739,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2185
2739
|
kind: spanKind,
|
|
2186
2740
|
attributes: {
|
|
2187
2741
|
...Attribute.WorkflowRouteType('flow'),
|
|
2742
|
+
...Attribute.FaasInstance(COMPUTE_INSTANCE_ID),
|
|
2188
2743
|
...Attribute.WorkflowRouteHandlerCached(handlerCached),
|
|
2189
2744
|
...Attribute.WorkflowRouteInvocationCount(invocationCount),
|
|
2190
2745
|
...Attribute.WorkflowRouteEntrypointAgeMs(Date.now() - entrypointCreatedAt),
|
|
@@ -2209,4 +2764,4 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2209
2764
|
});
|
|
2210
2765
|
});
|
|
2211
2766
|
}
|
|
2212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGVBQWUsRUFFZixlQUFlLEVBQ2Ysb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixpQ0FBaUMsRUFDakMsMkJBQTJCLEdBRzVCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLDZCQUE2QixFQUM3Qix3QkFBd0IsRUFDeEIsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMs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bnRlbnQiOlsiaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlSdW5FcnJvcixcbiAgaXNSZXRyeWFibGVXb3JsZEVycm9yLFxuICBpc1dvcmxkQ29udHJhY3RFcnJvcixcbn0gZnJvbSAnLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi9kZXNjcmliZS1lcnJvci5qcyc7XG5pbXBvcnQgeyB0eXBlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4RXZlbnRzT3ZlcnJpZGUsXG4gIGdldE1heFF1ZXVlRGVsaXZlcmllcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG59IGZyb20gJy4vcnVudGltZS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY291bnRTdGVwU3RhcnRlZEV2ZW50cyB9IGZyb20gJy4vcnVudGltZS9jb3VudC1zdGVwLXN0YXJ0ZWQtZXZlbnRzLmpzJztcbmltcG9ydCB7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgaXNQcmVjb25kaXRpb25HdWFyZEVuYWJsZWQsXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgdHlwZSBNdXRhYmxlRXZlbnRMb2csXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcXVldWVNZXNzYWdlLFxuICBzdGF0ZVVwZGF0ZWRBdEZvckNyZWF0ZSxcbiAgd2l0aEhlYWx0aENoZWNrLFxuICB3aXRoUHJlY29uZGl0aW9uUmV0cnksXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVudGltZS9ydW4taWQtdGltZS5qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMsXG4gIGV4ZWN1dGVTdGVwLFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyB9IGZyb20gJy4vcnVudGltZS9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSxcbiAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZSxcbiAgaXNTdGVwT3duZXJzaGlwQWN0aXZlLFxuICBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzLFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1vd25lcnNoaXAuanMnO1xuaW1wb3J0IHsgcnVuU3RlcFNpbmdsZUZsaWdodCB9IGZyb20gJy4vcnVudGltZS9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICB0eXBlIFdvcmxkSGFuZGxlcnMsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyxcbiAgZ2V0TmV4dFRyYWNlQ2FycmllcixcbiAgZ2V0U3BhbktpbmQsXG4gIGdldFdvcmtmbG93VHJhY2VNb2RlLFxuICBpc1VzYWJsZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG4gIHdpdGhXb3JrZmxvd0JhZ2dhZ2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldEVycm9yTmFtZSwgZ2V0RXJyb3JTdGFjaywgbm9ybWFsaXplVW5rbm93bkVycm9yIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHsgcnVuV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHR5cGUgUmVlbnF1ZXVlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBvcHRpb25hbCBjbGllbnQtc2lkZSBldmVudC1saW1pdCBvdmVycmlkZS5cbiAqIGBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCwgd2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCBjbGFtcHMgdGhlXG4gKiBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIHRvIGEgc21hbGxlciB2YWx1ZSBzbyBlbmZvcmNlbWVudCBjYW5cbiAqIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGEgc2VydmVyLXNpZGUgY2hhbmdlLiBDbGFtcC1kb3duIG9ubHk6IGl0IG5ldmVyIHJhaXNlc1xuICogdGhlIHNlcnZlcidzIGxpbWl0LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgbm9uZS5cbiAqIFVuc2V0IOKHkiBzZXJ2ZXIgdmFsdWUgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBjbGFtcE1heEV2ZW50cyhzZXJ2ZXJWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBnZXRNYXhFdmVudHNPdmVycmlkZSgpO1xuICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNlcnZlclZhbHVlO1xuICByZXR1cm4gc2VydmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlIDogTWF0aC5taW4oc2VydmVyVmFsdWUsIG92ZXJyaWRlKTtcbn1cblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnI6IHVua25vd24pOiBSdW5FcnJvckNvZGUgfCBudWxsIHtcbiAgaWYgKFdvcmtmbG93UnVudGltZUVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gIH1cblxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gIHdvcmxkLFxuICB3b3JrZmxvd1J1bixcbiAgcnVuSWQsXG4gIHJlcXVlc3RJZCxcbiAgZXJyLFxuICBlcnJvckNvZGUsXG4gIGxvZ01lc3NhZ2UsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICByZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZXJyOiB1bmtub3duO1xuICBlcnJvckNvZGU6IFJ1bkVycm9yQ29kZTtcbiAgbG9nTWVzc2FnZTogc3RyaW5nO1xufSkge1xuICBydW50aW1lTG9nZ2VyLmVycm9yKGxvZ01lc3NhZ2UsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBlcnJvckNvZGUsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuID8/IHJ1bklkKTtcbiAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgcnVuSWQsXG4gICAgICB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgKSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAnRmF0YWwgd29ybGQgY29udHJhY3QgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIHdvcmtmbG93IGZhaWx1cmUnLFxuICAgICAgICB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IsXG4gICAgICAgICAgZXJyb3I6IGZhaWxFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxFcnIubWVzc2FnZSA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZmFpbEVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzOiBFdmVudFtdLCBydW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRlcm1pbmFsIHJ1biBldmVudHMgYXJlIGFsd2F5cyBsYXN0IGJ5IGNvbnN0cnVjdGlvbiAobm8gZXZlbnQgY3JlYXRpb25cbiAgLy8gc3VjY2VlZHMgYWdhaW5zdCBhIHRlcm1pbmFsIHJ1biksIGJ1dCBzY2FuIHRoZSBmdWxsIGFycmF5IGZvclxuICAvLyBkZWZlbnNlLWluLWRlcHRoOiBhIFdvcmxkL2JhY2tlbmQgb3JkZXJpbmcgYnVnIHNob3VsZG4ndCBtYWtlIHVzIG1pc3MgYW5cbiAgLy8gYWN0dWFsIHRlcm1pbmF0aW9uIHNpZ25hbC5cbiAgY29uc3QgdGVybWluYWxSdW5FdmVudCA9IGV2ZW50cy5maW5kKFxuICAgIChlKSA9PlxuICAgICAgZS5ydW5JZCA9PT0gcnVuSWQgJiZcbiAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJylcbiAgKTtcblxuICBpZiAoIXRlcm1pbmFsUnVuRXZlbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdSdW4gcmVhY2hlZCB0ZXJtaW5hbCBldmVudCwgZXhpdGluZycsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBldmVudFR5cGU6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRJZCxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFRoZSBsaW5lYWdlIHJvb3Qgb2YgYSBsb2FkZWQgcnVuOiBpdHMgYCRyb290UnVuSWRgIGF0dHJpYnV0ZSwgb3IgaXRzIG93biBpZFxuICogd2hlbiBpdCBpcyBpdHNlbGYgYSByb290LlxuICovXG5mdW5jdGlvbiByb290UnVuSWRGcm9tKFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBydW5JZDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYXR0cmlidXRlcz8uW1JPT1RfUlVOX0lEX0FUVFJJQlVURV0gPz8gcnVuSWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhIGhvb2sgYW5kL29yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCBhbmQgdHVyYm8ncyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydC5cbiAqIEEgdGVybWluYWwtc3RlcCBkZWx0YSBjYW4gb21pdCBhbiBldmVudCBhcHBlbmRlZCBjb25jdXJyZW50bHkgYWZ0ZXIgdGhhdFxuICogd3JpdGUuIFdpdGggbm8gb3BlbiBob29rIG9yIHdhaXQsIG9ubHkgY2FuY2VsbGF0aW9uIGNhbiBkbyBzbywgYW5kIG9ic2VydmluZ1xuICogaXQgb25lIHJlcGxheSBsYXRlIGlzIHNhZmUgYmVjYXVzZSB0aGUgbmV4dCBlbnRpdHkgd3JpdGUgaXMgcmVqZWN0ZWQuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50czogRXZlbnRbXSk6IHtcbiAgb3Blbkhvb2s6IGJvb2xlYW47XG4gIG9wZW5XYWl0OiBib29sZWFuO1xufSB7XG4gIGNvbnN0IGRpc3Bvc2VkSG9va0lkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykgZGlzcG9zZWRIb29rSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICBjb21wbGV0ZWRXYWl0SWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuICBsZXQgb3Blbkhvb2sgPSBmYWxzZTtcbiAgbGV0IG9wZW5XYWl0ID0gZmFsc2U7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICFkaXNwb3NlZEhvb2tJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIG9wZW5Ib29rID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgb3BlbldhaXQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3Blbkhvb2sgJiYgb3BlbldhaXQpIGJyZWFrO1xuICB9XG4gIHJldHVybiB7IG9wZW5Ib29rLCBvcGVuV2FpdCB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0PzogbnVtYmVyO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHNldFdvcmtmbG93QmFzZVBhdGgob3B0aW9ucz8uYmFzZVBhdGgpO1xuXG4gIGNvbnN0IE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgPVxuICAgIE51bWJlcihwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TKSB8fCAxMjBfMDAwO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBpbmNvbWluZ1RyYWNlQ2FycmllcixcbiAgICAgICAgICByZXF1ZXN0ZWRBdCxcbiAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2UsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUg4oCUIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1biDigJQgYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb24g4oCUXG4gICAgICAgIC8vIHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMg4oCUIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzIOKAlFxuICAgICAgICAvLyBzZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVGhlIHJlcGxheSBidWRnZXQgY292ZXJzIG9yY2hlc3RyYXRpb24gd29yayBiZXR3ZWVuIHN0ZXBzLCBub3QgaW5saW5lXG4gICAgICAgIC8vIHN0ZXAgYm9kaWVzLiBJdCBpcyBjaGVja2VkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zOyBzdGVwIGJvZGllcyB1c2VcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHRpbWVvdXQgYW5kIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgZ3VhcmQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcblxuICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgY2FjaGU6IGtlZXAgbG9hZGVkIGV2ZW50cyBpbiBtZW1vcnkgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gd2UgZG8gYSBmdWxsIGxvYWQ7IG9uIHN1YnNlcXVlbnQgaXRlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gd2UgZmV0Y2ggb25seSBldmVudHMgY3JlYXRlZCBhZnRlciB0aGUgbGFzdCBrbm93biBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICBsZXQgY2FjaGVkRXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogd2hlbiBhbiBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByZXR1cm5zIHRoZSBldmVudC1sb2cgZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIChhIHN1cHBvcnRpbmcgV29ybGQgb25seSksIHdlIHN0YXNoIGl0IGhlcmUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGNvbnN1bWVzIGl0IGluIHBsYWNlIG9mIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQtdHJpcC4gRWFjaCB2YWx1ZSBpcyBjb25zdW1lZCBleGFjdGx5IG9uY2VcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNsZWFyZWQuIE51bGwgbWVhbnMgXCJubyBkZWx0YSBwZW5kaW5nIOKAlCBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHlcIi4gU2VlIHRoZSBjb25zdW1lIHNpdGUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlIHNpdGUgYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLlxuICAgICAgICAgICAgICAgICAgbGV0IHBlbmRpbmdJbmxpbmVEZWx0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlLiBVbmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50IChvbGRlciBzZXJ2ZXJzLCB0dXJibykuXG4gICAgICAgICAgICAgICAgICBsZXQgbWF4RXZlbnRzTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHNDdXJzb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZSDigJQgc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESyDigJQgYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCDigJQgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIHZlcnkgZmlyc3QgZGVsaXZlcnkgb2YgdGhlIHZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSDigJQgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2sgb3Igd2FpdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAodGhleSBpbnRyb2R1Y2UgcmVzdW1lIGludm9jYXRpb25zKSwgc28gdHVyYm8gZXhpdHMgYXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS4gV29ya2Zsb3cgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgaW50cm9kdWNlIG5vIHN1Y2ggaW52b2NhdGlvbiBzb3VyY2Ug4oCUIHRoZXkgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgLy8gdmlhIGFuIGluLXByb2Nlc3MgcmVwbGF5IGFuZCBkb24ndCBlbmQgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWAgaXMgYWxzbyBsb2FkLWJlYXJpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBvd25lcnNoaXA6IG93bmVkLXJlY292ZXJ5IHN0ZXBzIChhIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHN0YW1wZWQgYnkgYSBQUkVWSU9VUyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UpIGNhbiBvbmx5XG4gICAgICAgICAgICAgICAgICAvLyBleGlzdCBvbiBhdHRlbXB0IOKJpSAyLCBzbyB0dXJibyBhbmQgb3duZWQgcmVjb3ZlcnkgYXJlXG4gICAgICAgICAgICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSB0dXJibyBgcmVpbnZva2UoKWAgcGF0aHMgKGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0LCB0aHJvdHRsZSBiYWNrb2ZmKSBhY2sgdGhpcyBtZXNzYWdlIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgc2FmZSBvbmx5IGJlY2F1c2Ugbm9cbiAgICAgICAgICAgICAgICAgIC8vIG5vbi10ZXJtaW5hbCBzdGVwIGNhbiBiZSBpbmxpbmUtb3duZWQgYnkgdGhlIGFja2VkIGlkXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIHR1cmJvIGlzIG9uLiBJZiB0dXJibyBldmVyIGVuZ2FnZXMgb24gcmVkZWxpdmVyaWVzLFxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgcGF0aHMgbXVzdCBmaXJzdCBjaGVjayBmb3Igb3duZWQgcGVuZGluZyBzdGVwcyBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBgeyB0aW1lb3V0U2Vjb25kcyB9YCByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIGludmFyaWFudCBndWFyZDogY29ycmVsYXRpb24gSURzIG9mXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwcyB3aG9zZSBib2RpZXMgdGhpcyBpbnZvY2F0aW9uIGlzIGV4ZWN1dGluZyB1bmRlciBhblxuICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIHN0YW1wIChsYXp5IGlubGluZSArIG93bmVkIHJlY292ZXJ5KSwgd2hpbGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBib2R5IGlzIGluIGZsaWdodC4gQ3Jhc2ggcmVjb3ZlcnkgZGVwZW5kcyBvbiB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIE5PVCBiZWluZyBhY2tlZCB3aGlsZSBzdWNoIGEgc3RlcCBpcyBub24tdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIChhY2sgPSBoYW5kbGVyIHJldHVybiBvciByZWludm9rZSwgd2hpY2ggYWNrcyArIGVucXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkIOKAlCB0aGUgcmVkZWxpdmVyeSBvZiB0aGUgb2xkIGlkIGlzXG4gICAgICAgICAgICAgICAgICAvLyB3aGF0IHJlLWV4ZWN1dGVzIGFuIG9ycGhhbmVkIG93bmVkIHN0ZXApLiBBbGwgZXhlY3V0ZVN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIGFyZSBhd2FpdGVkIGJlZm9yZSBhbnkgYWNrIHBhdGggcnVucywgc28gdGhpcyBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5IGF0IGV2ZXJ5IGFjayBieSBjb25zdHJ1Y3Rpb247IHRoZSBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBicmVhayB0aGF0IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbGlnaHRPd25lZFN0ZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcyA9IChcbiAgICAgICAgICAgICAgICAgICAgYWNrUGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0T3duZWRTdGVwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogYWNraW5nIHRoZSB3b3JrZmxvdyBtZXNzYWdlIHdoaWxlIG93bmVkIGlubGluZSBzdGVwcyBhcmUgc3RpbGwgZXhlY3V0aW5nIOKAlCBjcmFzaCByZWNvdmVyeSBmb3IgdGhlc2Ugc3RlcHMgaXMgYnJva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IFsuLi5pbkZsaWdodE93bmVkU3RlcHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlclxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcygncmVpbnZva2UnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1J1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IGJnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyArYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nIGZvciBhIGJhY2tncm91bmRlZCBzdGVwLiBgbWV0YWRhdGEuYXR0ZW1wdGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50KSBpcyBhIGNoZWFwIHVwcGVyIGJvdW5kLCBidXQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyLWNvdW50czogYSBUaHJvdHRsZUVycm9yIC8gVG9vRWFybHlFcnJvciDigJQgb3IgYW55XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSB0aGF0IG5ldmVyIHJhbiB0aGUgYm9keSDigJQgc3RpbGwgYWR2YW5jZXMgaXQsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1c3RpbmcgaXQgZGlyZWN0bHkgY291bGQgZmFpbCBhIHN0ZXAgYXMgXCJleGNlZWRlZCBtYXhcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzXCIgYmVmb3JlIHRoZSBib2R5IGV2ZXIgcmFuIChhIHVzZXItdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3Jlc3Npb24gdW5kZXIgdHJhbnNpZW50IGJhY2tlbmQgcHJlc3N1cmUpLiBVc2UgaXQgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFzdCBnYXRlOiB3aGlsZSBpdCBpcyBhdCBvciB1bmRlciB0aGUgY2VpbGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGNhbm5vdCBiZSBleGhhdXN0ZWQsIHNvIHByb2NlZWQgd2l0aG91dCB0b3VjaGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cuIE9ubHkgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIGRvIHdlIGxvYWQgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cgYW5kIGRlcml2ZSB0aGUgYXV0aG9yaXRhdGl2ZSBhdHRlbXB0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkZWQgYHN0ZXBfc3RhcnRlZGAgY291bnQg4oCUIHNjb3BlZCB0byB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0b3RhbCAoYmFyZSBzdGFydHMgcGx1cyB0aGUgbGFyZ2VzdCBzaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcidzIHN0YXJ0cyk6IHRocm90dGxlL3Rvby1lYXJseSByZWRlbGl2ZXJpZXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGFydCBhdCBhbGwsIHJhY2luZyBpbnZvY2F0aW9ucycgb25lLW9mZiBzdGFtcGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlcyBkb24ndCBhY2N1bXVsYXRlIChjb3VudGluZyB0aGVtIGZhbHNlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGhhdXN0ZWQgaGVhbHRoeSBzdGVwcyDigJQgc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhdHRlbXB0cyBidXJuZWQgdW5kZXIgYSBwcmlvciBpbmxpbmUtb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2Ugc3RpbGwgY291bnQsIHNvIGEgc3RlcCB0aGF0IHRpbWVzIG91dCB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkIHJlY292ZXJ5IGFuZCB0aGVuIHRyYW5zaXRpb25zIHRvIHF1ZXVlZC9iYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllcyB0cmlwcyB0aGUgY29tYmluZWQgY2VpbGluZy4gVGhpcyBzdGlsbCBib3VuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cywgd2hpY2ggd3JpdGUgbm8gZXJyb3IgZm9yIHRoZSBwb3N0LWJvZHkgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaC4gVGhlIGxvYWQgYWxzbyBwcmltZXMgdGhlIHJlcGxheSdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGNhY2hlZEV2ZW50c2AvYGV2ZW50c0N1cnNvcmAgKHRoZSBwb3N0LXN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gYmVsb3cgcmVmcmVzaGVzIHRoZW0gb25jZSB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnQgbGFuZHMpLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID0gbWV0YWRhdGEuYXR0ZW1wdDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ01heFJldHJpZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RlcEZ1bmN0aW9uKGluY29taW5nU3RlcE5hbWUpPy5tYXhSZXRyaWVzID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgPiBiZ01heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRTdGVwU3RhcnRlZEV2ZW50cyhjYWNoZWRFdmVudHMsIGluY29taW5nU3RlcElkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RvdGFsQXR0ZW1wdHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgdGhlIHJlcGxheSBidWRnZXQgd2hpbGUgdGhlIHN0ZXAgYm9keSBydW5zIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBTZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5QnVkZ2V0IGRvY3MgZm9yIHRoZSBjb250cmFjdC5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD4+O1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUtZmxpZ2h0OiBhIGRlbGF5ZWQgYmFja3N0b3AgKG9yIHJldHJ5KSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYXJyaXZlIHdoaWxlIGFub3RoZXIgZXhlY3V0aW9uIG9mIHRoaXMgc2FtZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBtaWQtYm9keSBpbiB0aGlzIHByb2Nlc3Mg4oCUIG1vc3QgaW1wb3J0YW50bHkgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIG5vIGludm9jYXRpb24ga2lsbCBib3VuZCAod29ybGQtbG9jYWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgdGhlIG93bmVyc2hpcCBsZWFzZSBpcyBub3QgYSBkZWF0aCBwcm9vZi4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3NlciBhd2FpdHMgdGhlIHdpbm5lcidzIHNldHRsZW1lbnQsIHRoZW4gYWNrc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBleGVjdXRpbmcuIE5vIG93bmVyTWVzc2FnZUlkIGhlcmU6IHRoZSBiYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgb2YgYSBxdWV1ZS1kcml2ZW4gZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGNsZWFycyBpbmxpbmUgb3duZXJzaGlwICh0aGUgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUtb3duZWQgZnJvbSB0aGlzIHBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSBhd2FpdCBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBiZ1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogYmdTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290UnVuSWQ6IHJvb3RSdW5JZEZyb20oYmdSdW4uYXR0cmlidXRlcywgcnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IGJnUnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZzogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50IGFzIGEgZmFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2F0ZSwgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVjb3JkZWQgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgKHNlZSBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDogYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGVwIGhhZCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcyksIGJyZWFrIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0VW50aWwgZmx1c2ggdGhlbSDigJQgY2FuJ3QgY29udGludWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnc2tpcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIHRvIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXJzb3ItYmFzZWQgbG9hZGluZyBzbyB0aGUgbWFpbiBsb29wIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWxseSBmcm9tIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIHN0ZXBzOiBhbnkgc3RlcF9jcmVhdGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWF0Y2hpbmcgc3RlcF9jb21wbGV0ZWQgb3Igc3RlcF9mYWlsZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRlcm1pbmFsSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBUZXJtaW5hbElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3RlcENyZWF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwVGVybWluYWxJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdTdGVwSWRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcGVuZGluZyBzdGVwIHRoYXQgVEhJUyBtZXNzYWdlIGlubGluZS1vd25zIChhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBzdGFtcGVkIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYW5kIHRoZW4gY3Jhc2hlZCBtaWQtYm9keSkgbXVzdCBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyZWQgaGVyZTogb25seSB0aGUgb3duaW5nIG1lc3NhZ2UgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWV4ZWN1dGUgaXQgYmVmb3JlIHRoZSBvd25lcnNoaXAgbGVhc2UgZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdha2UgcmVwbGF5cyBtZXJlbHkgZW5zdXJlIGEgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcC4gRmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIGxvb3AsIHdob3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRhYmxlIHJvdXRlcyBpdCB0byBvd25lZCByZWNvdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lOyBmYWxsaW5nIHRocm91Z2ggdG8gcmVjb3ZlciBhbiBpbmxpbmUgc3RlcCBvd25lZCBieSB0aGlzIG1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdGVwcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1aW5nIOKAlCB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlIHdpbGwgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZywgcmV0dXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBjYWNoZWRFdmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5SW5wdXQ6IHVua25vd247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gcnVuQ3JlYXRlZEV2ZW50LmV2ZW50RGF0YS5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNMZWdhY3lTcGVjVmVyc2lvbihiZ1J1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJydW5fY3JlYXRlZFwiIGV2ZW50YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IHJ1bnMgcHJlZGF0ZSB0aGUgZXZlbnQtc291cmNlZCBydW5fY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhcmlhbnQsIHNvIHJldGFpbiB0aGUgcmVzb2x2ZWQgR0VUIG9ubHkgZm9yIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2FjeVJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZ2FjeVJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IGxlZ2FjeVJ1bi5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iZ1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJlcGxheUlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyBhbmQgZXZlbnRzQ3Vyc29yIGFscmVhZHkgc2V0IGZyb20gbG9hZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSkuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgc2tpcFByZWxvYWQ6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiBza2lwUHJlbG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBiYWNrZ3JvdW5kIHRoaXMgcHVyZWx5IGFzIGEgd3JpdGUgYmFycmllciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlYWQgaXRzIHByZWxvYWRlZCBldmVudHMgKHByZWxvYWRlZEV2ZW50cyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIHRvIFtdIGJlbG93KSwgc28gdGVsbCB0aGUgV29ybGQgdG8gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIOKAlCBzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXAg4oCUIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gYmFja2dyb3VuZHMgcnVuX3N0YXJ0ZWQsIHNvIHRoZSBub24tdHVyYm8gYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93IG5ldmVyIHJ1bnMg4oCUIHRocmVhZCB0aGUgcGVyLXJ1biBldmVudCBjZWlsaW5nIG9mZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcmVzcG9uc2UgaGVyZSBpbnN0ZWFkLiBUaGUgZ3VhcmQgcmUtY2hlY2tzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RXZlbnRzTGltaXQgZXZlcnkgbG9vcCBpdGVyYXRpb24sIHNvIGEgdmFsdWUgdGhhdCBsYW5kc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0bHkgYWZ0ZXIgc3RhcnQgc3RpbGwgZW5mb3JjZXMgd2VsbCBiZWZvcmUgYSBydW5hd2F5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGFwcHJvYWNoZXMgdGhlIGNlaWxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZFByb21pc2UudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gY2xhbXBNYXhFdmVudHMocj8ubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQpIG1heEV2ZW50c0xpbWl0ID0gbGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge31cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5vLW9wIHJlamVjdGlvbiBoYW5kbGVyIHNvIGFuIGVhcmx5IGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gYmVmb3JlIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYXdhaXQvdGhlbikgaXMgYXR0YWNoZWQ7IGNvbnN1bWVycyBzdGlsbCBvYnNlcnZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWRlZCBzZXQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyAobm8gc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcpLiBgW11gIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSB0cnV0aHkgaGVyZSDigJQgZG8gbm90IGNoYW5nZSB0aGUgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJyYW5jaGVzJyBgaWYgKHByZWxvYWRlZEV2ZW50cylgIGNoZWNrcyB0byB0ZXN0IGxlbmd0aC5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cyDigJQgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGBydW5TdGFydGVkUmVjZWl2ZWRBdE1zYCBkZWNsYXJhdGlvbiBhYm92ZTpcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBzeW50aGVzaXplcyB0aGUgcnVuIGJlZm9yZSB0aGUgcmVhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZHMsIHNvIGFuY2hvciBSU0ZTIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCBhbiBhY3R1YWwgcmVzcG9uc2UgaW5zdGFudC5cbiAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkUnVuU3RhcnRlZENyZWF0ZVN0YXJ0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiBmb3IgJ3J1bl9zdGFydGVkJyBkaWQgbm90IHJldHVybiB0aGUgcnVuIGVudGl0eSBmb3IgcnVuIFwiJHtydW5JZH1cImBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMg4oCUIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGV2ZW50cywgdXNlIHRoZW0gdG8gc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QgY2FsbCBhbmQgcmVkdWNlIFRURkIuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID0gcmVzdWx0LmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bi5zdGFydGVkQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3dSdW4uc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgYGNhbmNlbGAsIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJvcGFnYXRlIGEgV29ya2Zsb3dDYW5jZWxsZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dCBzbyB0aGUgdXNlciBjYW4gZ3JhY2VmdWxseSBleGl0LiB0aGlzIGlzIFNJR1RFUk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGFjdHVhbGx5IGV4aXQgaGVyZSB3aXRob3V0IHJlcGxheWluZyB0aGUgd29ya2Zsb3cgYXQgYWxsLCBpbiB0aGUgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheWluZyB0aGUgd29ya2Zsb3cgaXMgaXRzZWxmIGZhaWxpbmcuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bidzIGRlcGxveW1lbnQuXG4gICAgICAgICAgICAgICAgICAvLyBVc2VkIGVhZ2VybHkgaGVyZSBzaW5jZSBib3RoIHJ1bldvcmtmbG93IChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgVk0taW5kZXBlbmRlbnQgcHJlcGFyZWQgcGF5bG9hZHNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbW11dGFibGUgZmluYWwgdmFsdWVzLiBJdCBzdXJ2aXZlcyB0aGUgZnJlc2ggd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgIC8vIFZNIGNyZWF0ZWQgYnkgZWFjaCBpbmxpbmUgcmVwbGF5LCBidXQgbmV2ZXIgY3Jvc3NlcyBydW5zIG9yXG4gICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3Mvbm9Db25zdGFudENvbmRpdGlvbjogaW50ZW50aW9uYWwgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT24gVmVyY2VsLCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQgYWx3YXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgdGhlIHByb2Nlc3MuIE9uIGxvY2FsIGRldiBpdCByZXR1cm5zOyB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgdGhlIHJlcXVlc3QgZW5kcyBub3JtYWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fZmFpbGVkIGhhcyBiZWVuIHdyaXR0ZW4gYmVzdC1lZmZvcnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdWMiB0aW1lb3V0IHJlYWNoZWQsIHJlLXNjaGVkdWxpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3Vyc29yIG9mIHRoaXMgaXRlcmF0aW9uJ3MgZXZlbnQgbG9nIGJlZm9yZSBhbnkgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBhZHZhbmNlIGl0IOKAlCBkZWNsYXJlZCBhdCB0cnkgc2NvcGUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gY2F0Y2ggKHdoaWNoIHJ1bnMgdGhlIGlubGluZSBzdGVwKSBjYW4gcmVhZCBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgYHNpbmNlQ3Vyc29yYCBmb3IgdGhlIGlubGluZS1kZWx0YSBvcHRpbWl6YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVJbmxpbmVXcml0ZUN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMg4oCUIHVzZSBjYWNoZWQgZXZlbnRzIHdpdGggaW5jcmVtZW50YWwgZmV0Y2ggb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgYSBjdXJzb3Igd2hlbiB0aGVyZSBhcmUgZXZlbnRzIChldmVuIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhZ2UpLCBzbyB3ZSBjYW4gcmVsaWFibHkgdXNlIGl0IGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJbmxpbmVEZWx0YSAmJiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogdGhlIHByZXZpb3VzIGl0ZXJhdGlvbidzIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCB0aGUgYXV0aG9yaXRhdGl2ZSBldmVudC1sb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGUgY3Vyc29yLCBzbyB3ZSBjb25zdW1lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWx0YSBpcyBieXRlLWZvci1ieXRlIHdoYXQgZXZlbnRzLmxpc3QoY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgaGF2ZSByZXR1cm5lZCBhdCB3cml0ZSB0aW1lIOKAlCBpdCBpbmNsdWRlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3Mgb3duIHN0ZXAgZXZlbnRzLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXAgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkKSBhbm90aGVyIHdyaXRlciBhcHBlbmRlZCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciDigJQgc28gc2tpcHBpbmcgdGhlIGZldGNoIGNhbm5vdCBkcm9wIGV2ZW50cyBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tldyB0aGUgcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGVuZGluZ0lubGluZURlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhjYWNoZWRFdmVudHMsIGRlbHRhLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBkZWx0YS5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkRXZlbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBpdGVyYXRpb246IHVzZSBwcmVsb2FkZWQgZXZlbnRzIGlmIGF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBkbyBhIGZ1bGwgbG9hZCB3aXRoIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgaXRlcmF0aW9uOiBmZXRjaCBvbmx5IG5ldyBldmVudHMgc2luY2UgbGFzdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZHVwZSBieSBldmVudElkOiBhIHByZXZpb3VzIGl0ZXJhdGlvbiBtYXkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kZWQgYSByZWZyZXNoZWQgd2FpdC1jb21wbGV0aW9uIGRlbHRhIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbG9vcCBvYnNlcnZlcyB0aGUgYWR2YW5jZWQgY3Vyc29yLCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgZmV0Y2ggY2FuIHJldHVybiBldmVudHMgd2UgYWxyZWFkeSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGNhY2hlZEV2ZW50cywgbG9hZGVkLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uIDIgYWZ0ZXIgaXRlcmF0aW9uIDEgdXNlZCBwcmVsb2FkZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggZG9uJ3QgY2FycnkgYSBjdXJzb3IpLiBEbyBhIGZ1bGwgbG9hZCBub3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW55IGV2ZW50cyB3cml0dGVuIHNpbmNlIHRoZSBwcmVsb2FkZWQgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb2J0YWluIGEgY3Vyc29yIGZvciBzdWJzZXF1ZW50IGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcy4gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcGF0aCwgbm90IGEgYnVnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1cnNvciBhZnRlciBwcmVsb2FkZWQtZXZlbnRzIGZpcnN0IGl0ZXJhdGlvbjsgZG9pbmcgZnVsbCByZWxvYWQgdG8gcGljayB1cCBjdXJzb3IuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjdXJzb3IgYXZhaWxhYmxlIGRlc3BpdGUgaGF2aW5nIGNhY2hlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBwcmVsb2FkZWQtZXZlbnRzIGV4cGxhbmF0aW9uLiBBbGwgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcmV0dXJuIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSBldmVudHMsIHNvIHRoaXMgc2lnbmFscyBhIGJ1ZyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkLiBGYWxsIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciBtaXNzaW5nIGFmdGVyIGluaXRpYWwgbG9hZCDigJQgZmFsbGluZyBiYWNrIHRvIGZ1bGwgcmVsb2FkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIFdvcmxkIGltcGxlbWVudGF0aW9uLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgY29uY3VycmVudCBjb21wbGV0aW9uIHZpYSB0aGUgZXZlbnQgbG9nOiBpZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBvdGhlciBoYW5kbGVyIHdyb3RlIGEgdGVybWluYWwgcnVuIGV2ZW50LCBleGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRvaW5nIHJlcGxheSB3b3JrLiBUaGUgcnVuIGVudGl0eSdzIHN0YXR1cyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSB0aGVzZSBldmVudHMsIHNvIGNoZWNraW5nIHRoZSBsb2cgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVzIHVzIHRoZSBzYW1lIHNpZ25hbCBhcyBhIHJ1bnMuZ2V0KCkgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIHJlcXVlc3QgcGVyIGxvb3AgaXRlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSBlbGFwc2VkIHdhaXRzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdHNUb0NvbXBsZXRlID0gZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApOiBlIGlzIEV4dHJhY3Q8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBldmVudFR5cGU6ICd3YWl0X2NyZWF0ZWQnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiAmIHsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID49IChlLmV2ZW50RGF0YS5yZXN1bWVBdCBhcyBEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBlLmV2ZW50RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FpdEV2ZW50IG9mIHdhaXRzVG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdExvZzogTXV0YWJsZUV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRzQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdpdGhQcmVjb25kaXRpb25SZXRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZVVwZGF0ZWRBdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlVXBkYXRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkcyBpbnNpZGUgdGhlIGd1YXJkIG1heSBoYXZlIGFkdmFuY2VkIHRoZSBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IHdhaXRMb2cuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0c1RvQ29tcGxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLiBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yIHNvIGNvbmN1cnJlbnQgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsIGtlZXAgdGhlaXIgb3JkZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsIGJhY2sgdG8gYSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdCBnaXZlIHVzIGEgc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdCBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMoZXZlbnRzLCBsb2FkZWQuZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW5nIGVsYXBzZWQgd2FpdHMgcmVmcmVzaGVzIHRoZSBldmVudCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBtYXkgaGF2ZSB3cml0dGVuIHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBhZnRlciB0aGUgaW5pdGlhbCBzbmFwc2hvdCBidXQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIE9uY2UgdGhlIGV2ZW50IGxvZyByZWNvcmRzIHRoYXQgb3V0Y29tZSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlcyB0aGUgc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcgKHVuZGVmaW5lZCDih5Igbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbmZvcmNlbWVudCkuIFRoZSB0aHJvdyBpcyBjYXVnaHQgYmVsb3cgYW5kIHdyaXR0ZW4gYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fZmFpbGVkIC8gTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHJlZmVyZW5jZSAobWF5IGhhdmUgYmVlbiBzZXQgZm9yIGZpcnN0IHRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBjdXJzb3IgYXMgaXQgc3RhbmRzIGZvciB0aGlzIGl0ZXJhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nLCBiZWZvcmUgYW55IGlubGluZSB3cml0ZXMgKHN0ZXBfY3JlYXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVTdXNwZW5zaW9uLCBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXApIGFkdmFuY2UgaXQuIFRoaXMgaXMgdGhlIGBzaW5jZUN1cnNvcmBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gYSBzdXBwb3J0aW5nIFdvcmxkIG9uIHRoZSBpbmxpbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgc28gaXQgY2FuIHJldHVybiB0aGUgZXZlbnQtbG9nIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG5leHQgaXRlcmF0aW9uIHNraXAgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QuIENhcHR1cmVkIGhlcmUgYmVjYXVzZSBub3RoaW5nIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGFuZCB0aGUgaW5saW5lIGV4ZWN1dGVTdGVwIG11dGF0ZXMgZXZlbnRzQ3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yID0gZXZlbnRzQ3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5IHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFZNIHNldHVwLiBXZWIgQ3J5cHRvIHdvcmsgY2FuIG92ZXJsYXAgYnVuZGxlIGV2YWx1YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHN0aWxsIGRlc2VyaWFsaXplIGFuZCByZXNvbHZlIGluIGV2ZW50IG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWRQcmV3YXJtID0gcmVwbGF5UGF5bG9hZENhY2hlLnByZXdhcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogdGhlIGVuZC1vZi1ydW4gZHJhaW4gaW5zaWRlIHJ1bldvcmtmbG93IGNvbW1pdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYCBldmVudHMgYmVmb3JlIHRoZSB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3csIHNvIGdhdGUgdGhvc2Ugd3JpdGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHRvby4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBheWxvYWRQcmV3YXJtO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHJlcGxheSBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkLiBTZW5kIHRoZSBzbmFwc2hvdCBidXQgZG8gTk9UXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkLWFuZC1yZXRyeSB0aGUgY3JlYXRlIGluIHBsYWNlOiBgcmVzdWx0YCB3YXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBieSB0aGlzIHJlcGxheSwgc28gYSBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgKmZyZXNoIHJlcGxheSogKHdoaWNoIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcHJvZHVjZSBhIGRpZmZlcmVudCByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdC4gVGhlIGNhdGNoIGJlbG93IGxldHMgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdG8gdGhlIHF1ZXVlIGZvciByZS1pbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlVXBkYXRlZEF0OiBzdGF0ZVVwZGF0ZWRBdEZvckNyZWF0ZShldmVudHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbm91cyBgcnVuV29ya2Zsb3dgIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHkg4oCUIGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIiDigJQgcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBzbmFwc2hvdCdzIHN0YXRlVXBkYXRlZEF0IGFuZCBzZWxmLXJlbG9hZHMgb24gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgKDQxMikgcmVqZWN0aW9uIHZpYSB0aGUgc2hhcmVkIGV2ZW50IGxvZy4gV2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGd1YXJkIHBlci1jcmVhdGUgKHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSB3aG9sZSBjYWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gYSByZXRyeSBuZXZlciByZS1pc3N1ZXMgYW4gYWxyZWFkeS1jcmVhdGVkIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbmFwc2hvdCByZWZyZXNoIGFib3ZlIGFsd2F5cyBzZXRzIGNhY2hlZEV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXBsYXkgY2FuIHN1c3BlbmQuIFJlLW5hcnJvdyBpdCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggc2NvcGUgaW5zdGVhZCBvZiBkZWZhdWx0aW5nIHRvIGFuIGVtcHR5IGFycmF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBmYWxsYmFjayB3b3VsZCBzaWxlbnRseSBkaXNhcm0gdGhlIHByZWNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQgKG5vIHNuYXBzaG90IHNlbnQpIGFuZCBsZXQgYSBtaWQtc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIG1lcmdlIGludG8gYSB0aHJvd2F3YXkgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFyaWFudCB2aW9sYXRpb246IHdvcmtmbG93IHN1c3BlbmRlZCBiZWZvcmUgaXRzIGV2ZW50IGxvZyB3YXMgbG9hZGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbkxvZzogTXV0YWJsZUV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGNhY2hlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBldmVudHNDdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nOiBzdXNwZW5zaW9uTG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3aG9zZSBzdGFsZSAoNDEyKSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vydml2ZWQgdGhlIGluLWd1YXJkIHJlbG9hZCByZXRyaWVzOiBzY2hlZHVsZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1c3BlbnNpb24gZXZlbnQgY3JlYXRpb24gcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgcmVsb2FkIHJldHJpZXM7IHJlLWludm9raW5nIHJ1biBmb3IgYSBmcmVzaCByZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gc3VzcGVuc2lvbkxvZy5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyArPSBzdXNwZW5zaW9uUmVzdWx0Lmhvb2tDcmVhdGlvbk1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9IHByZVN0ZXBCbG9ja2luZ01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHJlcGxheTogdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gcmVsb2FkcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyAobm93IGhvbGRpbmcgdGhlIGp1c3QtY29tbWl0dGVkIGF0dHJfc2V0KSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMsIHJlc29sdmluZyB0aGUgc2V0QXR0cmlidXRlcyBwcm9taXNlLiBTa2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHByb2Nlc3NpbmcgZm9yIHRoaXMgcGFzcyBzbyB0aGF0IHJlcGxheSBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByYWNlcyBmaXJzdCDigJQgaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwKCldKSwgdGhlIGR1cmFibGUgYXR0cmlidXRlIGV2ZW50IG11c3QgYmUgYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBsb3Npbmcgc3RlcC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwcGVucyBpbi1wcm9jZXNzIHJhdGhlciB0aGFuIHZpYSBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB1bmxpa2UgaG9va3MgYW5kIHdhaXRzLCBhbiBhdHRyX3NldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm9kdWNlcyBubyBvdXQtb2YtYmFuZCBpbnZvY2F0aW9uIHNvdXJjZSB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciB3b3VsZCBuZWVkIHRvIHlpZWxkIHRoZSBtZXNzYWdlIGZvciwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBheWluZyBhIGRlbGl2ZXJ5IHJvdW5kLXRyaXAgaGVyZSB3b3VsZCBvbmx5IGFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBiZWZvcmUgdGhlIHdvcmtmbG93J3MgbmV4dCBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSDigJQgaW4gcGFyYWxsZWwg4oCUIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwIOKAlCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlIChwZXIgcGVuZGluZyBzdGVwIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduYXRlZCBsYXp5LWlubGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgPT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhlY3V0ZSBpbiBUSElTIGludm9jYXRpb24gKG93bmVkIHJlY292ZXJ5OiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBpdCBjcmFzaGVkIG9uLCB2aWEgYSBwYXlsb2FkLWxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBlZCB3aXRoIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG93bmVyTWVzc2FnZUlkIOKAlCBub3QgYSBiYXJlIHN0YXJ0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyICE9PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuc3VyZSBhIERFTEFZRUQgYmFja3N0b3Agd2FrZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZGVsYXlTZWNvbmRzID0gb3duZXJzaGlwIGxlYXNlIHJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGVucXVldWVpbmcgdGhlIHN0ZXAuIFRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnZvY2F0aW9uIGlzIChsaWtlbHkpIHN0aWxsIHJ1bm5pbmcgdGhlIGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW4gaW1tZWRpYXRlIHN0ZXAgbWVzc2FnZSB3b3VsZCBiYXJlLXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJ1bm5pbmcgc3RlcCBhbmQgZXhlY3V0ZSBpdCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHdvcmtmbG93IzI3ODApLiBUaGUgYmFja3N0b3AgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb250aW51YXRpb24sIE5PVCBhIHN0ZXAgbWVzc2FnZTogd2hlbiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpcmVzLCB0aGlzIHNhbWUgZGVjaXNpb24gdGFibGUgaGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdoYXRldmVyIHN0YXRlIHRoZSBzdGVwIGlzIGluIGJ5IHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAodGVybWluYWwg4oaSIG5vdGhpbmcgcGVuZGluZzsgcXVldWUtb3duZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3JldHJ5aW5nIOKGkiBub3JtYWwga2V5ZWQgZGlzcGF0Y2g7IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGVhZCB3aXRoIGxlYXNlIGV4cGlyZWQg4oaSIGltbWVkaWF0ZSBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmVzZXJ2aW5nIHN0ZXAtbGV2ZWwgZmFpbHVyZSBzZW1hbnRpY3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pc29uIHN0ZXBzOyBsZWFzZSByZWZyZXNoZWQgYnkgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWNvdmVyeSDihpIgcmUtYXJtKS4gVGhlIGJhY2tzdG9wJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBpcyBzY29wZWQgdG8gdGhlIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEVQT0NIIChsYXRlc3Qgc3RlcF9zdGFydGVkIHRpbWVzdGFtcCksIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGp1c3QgdGhlIGNvcnJlbGF0aW9uIElELCBhbmQgbXVzdCBuZXZlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24ga2V5IOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5IGZvciBib3RoIGludmFyaWFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZml4ZWQga2V5cyBlaXRoZXIgYWJzb3JiIHRoZSByZXRyeSBoYW5kb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3IgZGVkdXBlIHRoZSByZWZyZXNoZWQtbGVhc2UgcmUtYXJtIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgaW4tZmxpZ2h0IGJhY2tzdG9wIGl0c2VsZikuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gTm90IG93bmVkIChuZXZlciBzdGFtcGVkIC8gZWFnZXIgLyBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsYXBzZWQgYXQgc3RlcF9yZXRyeWluZyAvIGxlYXNlIGV4cGlyZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGtpbGwtc3dpdGNoZWQpIOKGkiBpbW1lZGlhdGUgZW5xdWV1ZSwgZXhhY3RseSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlZm9yZS4gVGhpcyBjb3ZlcnMgY3Jhc2ggcmVjb3Zlcnk6IGlmIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZCBidXQgY3Jhc2hlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHF1ZXVlcyBpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBvbiBjb3JyZWxhdGlvbklkIGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWR1bmRhbnQgcXVldWVzIGFjcm9zcyBjb25jdXJyZW50IGhhbmRsZXJzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3YWl0IGNvbnRpbnVhdGlvbiBpcyB3aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgYmVoYXZlIGNvcnJlY3RseSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBleGVjdXRpb246IGV2ZW4gaWYgdGhlIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBibG9ja3MgdGhpcyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgdGltZXIgZmlyZXMgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbi4gSWYgdGhlIHNsZWVwIHdpbnMsIHRoYXQgcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gY29tcGxldGVzIHRoZSBydW47IGlmIHRoZSBzdGVwIHdpbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBjb250aW51YXRpb24gZmlyZXMgbGF0ZXIgYW5kIG5vLW9wcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlcm1pbmFsIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29udGludWF0aW9uJ3MgZGVsYXkgaXMgY2xhbXBlZCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heGltdW0gcXVldWUgZGVsYXkgKGxvbmcgd2FpdHMgY2hhaW4gYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBob3BzKSBhbmQgaXRzIGlkZW1wb3RlbmN5IGtleSBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBwYXNzZXMg4oCUIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5L2tleSBzZWxlY3Rpb24gcmF0aW9uYWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVPd25lcnNoaXAgPSBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoTm93TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWRSZWNvdmVyeVN0ZXBzOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbVtdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFja3N0b3BXYWtlc0FybWVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBwZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiYgaXNTdGVwT3duZXJzaGlwQWN0aXZlKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVkIHJlY292ZXJ5OiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlOyByZS1leGVjdXRlIHRoZSBzdGVwIGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGluc3RlYWQgb2YgcXVldWVpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCBiYWNrc3RvcCB3YWtlIHdoaWxlIGFub3RoZXIgaW52b2NhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBsZWFzZSBpcyBsaXZlOyBpbW1lZGlhdGUgc3RlcCBlbnF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSAobGVhc2UgZXhwaXJlZCDih5IgcmVtYWluaW5nIDAg4oeSIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kYXksIHdoaWNoIGlzIGFsc28gdGhlIGRlZ3JhZGVkIG1vZGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIHVuc3RhYmxlIG1lc3NhZ2UgSURzIOKAlCB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWJvdmUgbmV2ZXIgbWF0Y2hlcyB0aGVyZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tzdG9wRGVsYXlTZWNvbmRzID0gb3duZXJzaGlwQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzKHN0ZXAsIGRpc3BhdGNoTm93TXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3N0b3BEZWxheVNlY29uZHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQZW5kaW5nIHN0ZXAgaXMgaW5saW5lLW93bmVkIGJ5IGEgbGl2ZSBpbnZvY2F0aW9uOyBlbnN1cmluZyBkZWxheWVkIGJhY2tzdG9wIHdha2UgaW5zdGVhZCBvZiBpbW1lZGlhdGUgcmVxdWV1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IHN0ZXAub3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogYmFja3N0b3BJZGVtcG90ZW5jeUtleShzdGVwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNldCBvZiBzdGVwcyBUSElTIGludm9jYXRpb24gZXhlY3V0ZXM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXJyZWQgbGF6eS1pbmxpbmUgYmF0Y2ggcGx1cyBhbnkgb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzICh0aGlzIG1lc3NhZ2UncyByZWRlbGl2ZXJ5IHJlLWV4ZWN1dGluZyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGl0IGNyYXNoZWQgb24g4oCUIG5vIGxhenlTdGVwSW5wdXQ7IHRoZSBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0ZXMgZnJvbSB0aGUgc3RlcCBlbnRpdHkgbGlrZSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIHRoZSBwYXlsb2FkLWxlc3Mgc3RlcF9zdGFydGVkIHJlLXN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIOKAlCB1bmxpa2UgdGhlIGJhY2tncm91bmQgcGF0aCdzIHN0YXJ0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgYmFyZTogaXQgY2FycmllcyB0aGlzIG1lc3NhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJNZXNzYWdlSWQsIHdoaWNoIGlzIGFsc28gd2hhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHJldHJ5IGNlaWxpbmcgY291bnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUV4ZWN1dGlvbnM6IEFycmF5PHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0PzogKHR5cGVvZiBsYXp5SW5saW5lU3RlcHMpW251bWJlcl1bJ2RlaHlkcmF0ZWRJbnB1dCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgfT4gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHRlbGVtZXRyeSAoZGVzaWduIGRvYyBQaGFzZSA3KTogc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlcyBzbyBwcm9kdWN0aW9uIHRyYWNlcyBzaG93IHdoZW4gY3Jhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IHJhbiBvciBhIHdha2Ugd2FzIGNvbnZlcnRlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLCBhbmQgYSB3YXJuIChhbHdheXMgcHJpbnRlZCwgdW5saWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Zy9pbmZvKSBmb3Igb3duZWQgcmVjb3Zlcnkg4oCUIGl0IG1lYW5zIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBkaWVkIG1pZC1zdGVwLWJvZHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93T3duZWRSZWNvdmVyeVN0ZXBzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhY2tzdG9wV2FrZXNBcm1lZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93QmFja3N0b3BXYWtlc0FybWVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZS1leGVjdXRpbmcgaW5saW5lIHN0ZXBzIG93bmVkIGJ5IHRoaXMgcXVldWUgbWVzc2FnZSDigJQgYSBwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkIG1pZC1ib2R5IGFuZCB0aGlzIHJlZGVsaXZlcnkgaXMgcmVjb3ZlcmluZyB0aGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IG93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzKSA9PiBzLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGV4ZWN1dGUgaW5saW5lIOKAlCBldmVyeXRoaW5nIGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgKG9yIG5vIHdvcmsgbmVlZHMgc2NoZWR1bGluZykuIEV4aXQgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGRyaXZlIHN1YnNlcXVlbnQgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHRoZSByZXBsYXkgY29uc3VtZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIuIFdpdGhvdXQgaXQgKG5vIGlubGluZSBzdGVwLCBhbGwgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgb3Igbm9uZSBwZW5kaW5nKSB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgaW5saW5lIHN0ZXAuIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdGVwIGJvZHkg4oCUIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBXaXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRoZSByZXBsYXktYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIHdvdWxkIChpbmNvcnJlY3RseSkgY2hhcmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBib2R5IGFnYWluc3QgdGhlIGJ1ZGdldC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gaG9va3Mvd2FpdHMgaW4gdGhlIGN1bXVsYXRpdmUgbG9nLCBjb21wdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBmb3IgdGhlIHR3byBnYXRlcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdFN0YXRlID0gb3Blbkhvb2tBbmRXYWl0U3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA/PyBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwcmVJbmxpbmVXcml0ZUN1cnNvcmA7IGEgV29ybGQgbWF5IHJldHVybiBub25lIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdHMgKGBlcnIue3N0ZXAsd2FpdH1Db3VudGApLCB0aGF0IG9uZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbG9uZSBwZW5kaW5nIHN0ZXAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgbG9uZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW4gd2FpdCBpbiB0aGUgY3VtdWxhdGl2ZSBsb2c6IGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHdhaXRfY29tcGxldGVkYCBsYW5kaW5nIGFmdGVyIHRoZSBkZWx0YSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZG9lcyBub3QgYnVtcCB0aGUgb3V0c2lkZS1ldmVudCBtYXJrZXIsIHNvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZlbmNlcyBhIHJlcGxheSBmcm9tIHRoZSBzdGFsZSBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIG9wZW4gKG9yIHRoaXMtc3VzcGVuc2lvbi1jcmVhdGVkKSBob29rIOKAlCBVTkxFU1NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBwcmVjb25kaXRpb24gZ3VhcmQgaXMgZW5hYmxlZCBBTkQgdGhlIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWNsYXJlcyBpdCBhY3R1YWxseSBlbmZvcmNlcyB0aGUgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgY2FwYWJpbGl0aWVzLnByZWNvbmRpdGlvbkd1YXJkYDsgdGhlIGVudiBmbGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbG9uZSBvbmx5IG1ha2VzIHRoZSBydW50aW1lIFNFTkQgc25hcHNob3RzLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW4gdW5zdXBwb3J0aW5nIGJhY2tlbmQgaWdub3JlcyDigJQgbm8gZmVuY2UpLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbHRhIHNuYXBzaG90cyB0aGUgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uIHRoZSBuZXh0IHJlcGxheSwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIGluIHRoYXQgd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhYnNlbnQgZnJvbSB0aGUgZGVsdGEgYW5kIG9ic2VydmVkIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlcmF0aW9uIGxhdGVyIHRoYW4gYSByZWFsIGZldGNoIHdvdWxkIG9ic2VydmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LiBUaGF0IHN0YWxlbmVzcyBpcyBxdWFsaXRhdGl2ZWx5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFkLXRvLXdyaXRlIHJhY2UgdGhlIGZldGNoIHBhdGggYWxyZWFkeSBoYXMgKGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBldmVudCBjYW4gbGFuZCByaWdodCBhZnRlciBgZXZlbnRzLmxpc3RgIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCBiZWZvcmUgdGhlIHN1c3BlbnNpb24ncyB3cml0ZXMpOyB3aXRoIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBlbmZvcmNlZCBndWFyZCBpdCBpcyBhbHNvIGZlbmNlZDogYGhvb2tfcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBidW1wcyB0aGUgcGVyLXJ1biBvdXRzaWRlLWV2ZW50IG1hcmtlciwgc28gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGR1cmFibGUgd3JpdGUgdGhlIHN0YWxlIHJlcGxheSBhdHRlbXB0cyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVqZWN0ZWQgd2l0aCA0MTIg4oCUIGl0cyBndWFyZGVkIHN1c3BlbnNpb24gY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKHJldHJpZWQgb3ZlciB0aGUgcmVsb2FkZWQgbG9nLCBvciBleGhhdXN0ZWQgaW50b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYSBxdWV1ZSByZS1pbnZvY2F0aW9uKSwgQU5EIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY2xhaW0gb2YgaXRzIG5leHQgaW5saW5lIHN0ZXAsIHdoaWNoIGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbmFwc2hvdCB0b28gKHRocmVhZGVkIGJlbG93IHZpYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0YXRlVXBkYXRlZEF0YDsgb24gcmVqZWN0aW9uIHRoZSBiYXRjaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWJhbmRvbmVkIGFuZCByZS1pbnZva2VkIGZvciBhIGZyZXNoIHJlcGxheSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhbGUgdmlldyBjYW4gbmV2ZXIgY29tbWl0IGEgc3RlcCkuIEhvb2tzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ5IFRISVMgc3VzcGVuc2lvbiBhcmUgaW5zaWRlIHRoZSBkZWx0YSAodGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBob29rX2NyZWF0ZWRgIGxhbmRzIGJlZm9yZSB0aGUgc3RlcC10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUpLCBzbyBvbmx5IHRoZWlyIGBob29rX3JlY2VpdmVkYCByZXNwb25zZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIGZlbmNlZCB3aW5kb3cuIFdpdGhvdXQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZm9yY2VkIGd1YXJkIHRoZXJlIGlzIG5vIGZlbmNlLCBzbyBrZWVwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc2VydmF0aXZlIGdhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXaXRoIG5vIGhvb2sgb3Igd2FpdCBvcGVuIGF0IGFsbCwgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHByZWNvbmRpdGlvbiBndWFyZCBpcyBhY3R1YWxseSBpbiBmb3JjZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgYnkgZW52IEFORCBlbmZvcmNlZCBieSB0aGUgV29ybGQuIFRoZSBlbnZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcgYWxvbmUgb25seSBtYWtlcyB0aGUgcnVudGltZSBzZW5kIHNuYXBzaG90cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFuIHVuc3VwcG9ydGluZyBiYWNrZW5kIGlnbm9yZXMgKG5vIGZlbmNlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRW5mb3JjZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8ucHJlY29uZGl0aW9uR3VhcmQgPT09IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcmVJbmxpbmVXcml0ZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VhcmRFbmZvcmNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2spKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCkg4oCUIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZS4gV2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGd1YXJkIGluIGZvcmNlLCB0aGUgZmVuY2UgcmVqZWN0cyBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSdzIGR1cmFibGUgd3JpdGVzIOKAlCBidXQgaXQgY2Fubm90IHVuLXJ1biBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJPRFkgdGhhdCBvcHRpbWlzdGljIHN0YXJ0IGJlZ2FuIGJlZm9yZSB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRsZWQuIFN1cHByZXNzIG9wdGltaXN0aWMgc3RhcnQgZm9yIHRoZXNlIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0YWtlIGF3YWl0LXRoZW4tcnVuKSBzbyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgdXNlciBjb2RlIGF0IGFsbDogdGhlIGZlbmNlIHRoZW4gY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIGVmZmVjdHMsIG5vdCBqdXN0IHRoZSBldmVudCBsb2cuIENvc3RzIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhIGhvb2sgaXMgb3Blbiwgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gZ3VhcmQtZW5mb3JjaW5nIGRlcGxveW1lbnRzLiBXaXRob3V0IHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyA0MTJzLCBzbyBzdXBwcmVzc2lvbiB3b3VsZCBidXkgbm90aGluZyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlLXZpZXcgZXhwb3N1cmUgdGhlcmUgaXMgdGhlIHByZS1leGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYy1zdGFydCBjb250cmFjdCAoaWRlbXBvdGVudCBzaWRlIGVmZmVjdHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZEVuZm9yY2VkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgYGNhY2hlZEV2ZW50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogYFdPUktGTE9XX1NFUVVFTlRJQUxfUkVQTEFZUz0xYCAocGVyLXJ1biBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3BpY3MgY29uc3VtZWQgd2l0aCBgbWF4Q29uY3VycmVuY3k6IDFgKSB3b3VsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbmNpcGxlIHdhaXZlIHRoaXMgbGF0Y2gg4oCUIHNlcmlhbGl6ZWQgb3JjaGVzdHJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyByZXN0b3JlIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGVsaXZlcnkuIFRoZSB3YWl2ZXIgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuOiB0aGUgZW52IHZhciBpcyBhIHJ1bnRpbWUtcHJvY2VzcyBzZXR0aW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBwcm92ZSB0aGUgQlVJTFQgZmxvdyB0cmlnZ2VyIGFjdHVhbGx5IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhDb25jdXJyZW5jeTogMWAgKGl0IG11c3QgYmUgc2V0IGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbywgYW5kIHNvbWUgaW50ZWdyYXRpb25zIHdyaXRlIHRoZWlyIG93biB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcpLCBhbmQgYGNhcGFiaWxpdGllcy5tYXhDb25jdXJyZW5jeWAgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgcXVldWUgc3VwcG9ydCwgbm90IGRlcGxveWVkIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnRpbCB0aGUgYnVpbGQgZW1pdHMgYSB2ZXJpZmlhYmxlIHNpZ25hbCB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95ZWQgdHJpZ2dlciBpcyBzZXJpYWxpemVkLCB0aGUgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRjaCBzdGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCDigJQgc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQg4oCUIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGRlY2lkZSB3aGV0aGVyIHRoaXMgYmF0Y2gncyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMvU1RTTyBtZWFzdXJlbWVudC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoJ3MgZmlyc3Qgc3RlcCBjYXJyaWVzIHRoZSB0cmFja2luZyBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBiYXRjaCBlbWl0cyBvbmUgc2FtcGxlIHBlciBzY2hlZHVsaW5nIGdhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvbmUgcGVyIHNpYmxpbmcuIFR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYSBsb2NhbC1jbG9jayBjcmVhdGVkQXQsIHNvIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBvbmx5IHRoZSBydW4taWQgVUxJRCB0aW1lc3RhbXAgaXMgdHJ1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lUcmFja2luZyA9IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEF0TXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRDcmVhdGVkQXQocnVuSWQpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1cmJvID8gdW5kZWZpbmVkIDogK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbi1ndWFyZCBzbmFwc2hvdCBmb3IgdGhlIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGNsYWltczogdGhlIGxhenkgY2xhaW0gaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGggc3RlcCAoaXRzIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGEgc25hcHNob3QgaXQgd291bGQgYnlwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3VhcmQgZW50aXJlbHkgYW5kIGEgc3RhbGUgcmVwbGF5IGNvdWxkIGNsYWltIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbW1pdCDigJQgYSBzdGVwIHNjaGVkdWxlZCBvZmYgYSB2aWV3IHRoYXQgbWlzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBvdXQtb2YtYmFuZCBldmVudC4gYHN0YXRlVXBkYXRlZEF0Rm9yQ3JlYXRlYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgZ3VhcmQgZW52IGZsYWcgaXMgb2ZmLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5vLW9wIG91dHNpZGUgZ3VhcmRlZCBkZXBsb3ltZW50czsgV29ybGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGRvbid0IGVuZm9yY2UgdGhlIGd1YXJkIGlnbm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNsYWltU3RhdGVVcGRhdGVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVVwZGF0ZWRBdEZvckNyZWF0ZShjYWNoZWRFdmVudHMgPz8gW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwRXhlY3V0aW9uUHJvbWlzZXMgPSBpbmxpbmVFeGVjdXRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHN0ZXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyDigJQgb3Igbm9uZSDigJQgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxIOKAlCBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvd25lZEJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIG9uIHRoZSBmbHkuIEFic2VudCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcHMsIHdob3NlIGlucHV0IGh5ZHJhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4aXN0aW5nIHN0ZXAgZW50aXR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBvd25lcnNoaXA6IHN0YW1wIChvciByZS1zdGFtcCkgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgcXVldWUgbWVzc2FnZSBJRCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkLCBzbyB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluIGZsaWdodCBoZXJlIGFuZCBzdXBwcmVzcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHJlcXVldWUgKHdvcmtmbG93IzI3ODApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSkuIEJvdGggYXJlIHVuZGVmaW5lZC9mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB3aXRoIGFuIG9wZW4gaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGUgY2xhaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGJvZHksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyIGV4ZWN1dGVzIHVzZXIgY29kZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0IGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc09wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVVwZGF0ZWRBdDogaW5saW5lQ2xhaW1TdGF0ZVVwZGF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBwcmVJbmxpbmVXcml0ZUN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YXJpYW50IGJvb2trZWVwaW5nOiB0aGlzIGludm9jYXRpb24gb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJvZGllcyB1bnRpbCB0aGV5IHNldHRsZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmFkZChzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgc3RlcHMgYXJlIGJyYW5kLW5ldyAodGhlaXIgY3JlYXRlLWNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSwgYnV0IGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3Mg4oCUIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gb2YgYW4gaW5saW5lIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbTogdGhlIGxvYWRlZCB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGlzIGJlaGluZCBhbiBvdXQtb2YtYmFuZCBldmVudCAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVkIGhvb2spLCBzbyB0aGUgY2xhaW0gd2FzIGZlbmNlZCBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQgYW5kIG5vIHN0ZXAgZXZlbnRzIHdlcmUgd3JpdHRlbi4gQWJhbmRvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gg4oCUIGFueSBvcHRpbWlzdGljIGJvZHkgcmVzdWx0IGlzIGRpc2NhcmRlZCBieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlU3RlcCdzIHJlY29uY2lsaWF0aW9uIOKAlCBhbmQgcmUtaW52b2tlIGZvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSB0aGF0IG9ic2VydmVzIHRoZSBuZXcgZXZlbnQuIFdhaXQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbnMgdG8gc2V0dGxlIGZpcnN0IHNvIG5vIG93bmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgaW4gZmxpZ2h0IHdoZW4gdGhlIGFjayBwYXRoIHJ1bnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdGVwRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzdGVwRXhlY3V0aW9uUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbmxpbmUgc3RlcCBjbGFpbSByZWplY3RlZCBhcyBzdGFsZTsgcmUtaW52b2tpbmcgcnVuIGZvciBhIGZyZXNoIHJlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyByZXR1cm4gY29tcGxldGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0IOKAlCB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgaW5saW5lRXhlY3V0aW9ucylbbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbnlQZW5kaW5nT3BzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRocm90dGxlZCBpbmxpbmUgc3RlcCBkZWxheXMgcmVkZWxpdmVyeSBvZiBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSByYXRoZXIgdGhhbiBiZWluZyByZS1xdWV1ZWQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwLiBDcnVjaWFsbHksIGEgYHRocm90dGxlZGAgcmVzdWx0IG1lYW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCB3YXMgcmVqZWN0ZWQgb24gdGhlIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIOKAlCBzbyB0aGUgc3RlcCB3YXMgTkVWRVIgY3JlYXRlZCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBubyBzdGVwIGVudGl0eSkuIFJlLXF1ZXVpbmcgaXQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwIHdvdWxkIHNlbmQgYSBiYXJlIGBzdGVwX3N0YXJ0ZWRgIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQpLCB3aGljaCB0aGUgd29ybGQgcmVqZWN0cyB3aXRoIGBTdGVwIFwiPGlkPlwiIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmRgIGJlY2F1c2UgaXQgY2Fubm90IGxhemlseSBjcmVhdGUgdGhlIHN0ZXAgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGlucHV0OyB0aGF0IGVycm9yIGlzbid0IHRyYW5zbGF0YWJsZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlZGVsaXZlcnMgdW50aWwgTUFYX1FVRVVFX0RFTElWRVJJRVMgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAoYW5kIHJ1bikgZmFpbC4gRGVmZXJyaW5nIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgaW5zdGVhZCByZS1hdHRlbXB0cyB0aGUgdGhyb3R0bGVkIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBXSVRIIGl0cyBpbnB1dCBvbiByZXBsYXkuIFdlIHRyYWNrIHRoZSBsb25nZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrb2ZmIHNvIGEgYmF0Y2ggd2l0aCBtdWx0aXBsZSB0aHJvdHRsZXMgd2FpdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIE5vdGU6IGByZXRyeWAgcmVzdWx0cyBhcmUgc2FmZSB0byByZS1xdWV1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyBiZWNhdXNlIGEgcmV0cnkgaW1wbGllcyBgc3RlcF9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzdWNjZWVkZWQgYW5kIHRoZSBzdGVwIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aHJvdHRsZVRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5saW5lRXhlY3V0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc3RlcFJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpbmxpbmVFeGVjdXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlIOKAlCB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UodGhyb3R0bGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5tYXAoKHsgc3RlcCwgZGVsYXlTZWNvbmRzIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJldHJ5VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSB0aGUgZGVsYXllZCByZXRyeSBvbiB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb25JZCBzbyBpdCBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgcmUtZGlzcGF0Y2ggdGhlIHN1c3BlbnNpb24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1zIG9uIHJlcGxheSAoaXQgYWxzbyB1c2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWRgKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBtaXhlZCBiYXRjaCB3aGVyZSBvbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb21wbGV0ZWRgIHdpdGggdW5mbHVzaGVkIGJhY2tncm91bmQgb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBhbnlQZW5kaW5nT3BzYCkgYW5kIGFub3RoZXIgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGRvdWJsZS1kaXNwYXRjaCB0aGUgcmV0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2ggYmVsb3cgcXVldWVzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHBsYWluIGNvbnRpbnVhdGlvbiwgd2hvc2UgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlcyB0aGUgc3RpbGwtYHJldHJ5aW5nYCBzdGVwIGFzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcyBpdCAqaW1tZWRpYXRlbHkqIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICp3aXRoKiBhIGtleS4gU2luY2UgdGhpcyBkZWxheWVkIHJldHJ5IGhhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGtleSwgdGhlIHR3byBtZXNzYWdlcyB3b3VsZG4ndCBkZWR1cGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgd291bGQgcnVuIHR3aWNlLCB0aGUgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJhY2tvZmYgd291bGQgYmUgaWdub3JlZCAocGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgRXJyb3JgIHJldHJpZXMgcGVyc2lzdCBubyBgcmV0cnlBZnRlcmAsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGhhcyBubyBgVG9vRWFybHlgIGd1YXJkKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJvZHkgY291bGQgcnVuIGVhcmx5L2NvbmN1cnJlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFyaW5nIHRoZSBrZXkgbGV0cyB0aGUgZWFybGllciBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3aW4sIGhvbm9yaW5nIHRoZSBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBwZW5kaW5nIGJhY2tncm91bmQgb3BlcmF0aW9ucyBmbHVzaCBiZWZvcmUgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSByZWFkcyB0aGVpciByZXN1bHRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueVBlbmRpbmdPcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJlYWtpbmcgbG9vcDogaW5saW5lIHN0ZXAgaGFzIHBlbmRpbmcgb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBpbmxpbmUgc3RlcHMgd2lsbCBiZSByZS1ydW4gdmlhIHRoZWlyIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBtZXNzYWdlczsgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbGwgc3RlcHMgYXJlIHRlcm1pbmFsLiBEb24ndCBsb29wIGhlcmUg4oCUIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyBzdGVwcyBoYXZlIG5vIHRlcm1pbmFsIGV2ZW50IHRvIG9ic2VydmUgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbmxpbmUgc3RlcHMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIOKAlCBsb29wIGJhY2sgdG8gcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHdvcmtmbG93IG9ic2VydmVzIHRoZSB0ZXJtaW5hbCBldmVudHMgb24gcmVwbGF5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlIGlubGluZSBzdGVwJ3MgdGVybWluYWwgd3JpdGUgcmV0dXJuZWQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBkZWx0YSAoc3VwcG9ydGluZyBXb3JsZCArIHRoZSBzaW5nbGUtc3RlcCBnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSksIHN0YXNoIGl0IHNvIHRoZSBuZXh0IGl0ZXJhdGlvbidzIGxvYWQgY29uc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC4gT25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBsZXRlZCBwYXRoIGNhcnJpZXMgYSBkZWx0YTsgbXVsdGktc3RlcCBiYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZXF1ZXN0IG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmx5ID0gc3RlcFJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS5pbmxpbmVEZWx0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvbmx5LmlubGluZURlbHRhLmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBvbmx5LmlubGluZURlbHRhLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogb25seS5pbmxpbmVEZWx0YS5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gb2YgYSByZXN1bHQtYmVhcmluZyBjcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fY29tcGxldGVkIHNlbmRzIHRoZSBzbmFwc2hvdCBidXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9UIHJldHJpZWQgaW4gcGxhY2UpLCBvciBvbmUgdGhhdCBzdXJ2aXZlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluLWd1YXJkIHJlbG9hZCByZXRyaWVzLiBEb24ndCBmYWlsIHRoZSBydW4g4oCUIHNjaGVkdWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiBzbyBhIGZyZXNoIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIG5ldyBldmVudC4gUmV0aHJvd2luZyBpbnN0ZWFkIHdvdWxkIHJlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlZGVsaXZlcnkgb2YgdGhlIENVUlJFTlQgbWVzc2FnZSwgd2hpY2ggdGhlIHR1cmJvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGhhcyBhbHJlYWR5IGFja2VkIOKAlCBlbXBpcmljYWxseSB0aGUgcnVuIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxscyBmb3IgdGhlIHF1ZXVlJ3MgfjMwMHMgZGVmYXVsdCB2aXNpYmlsaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IGJlZm9yZSBjb21wbGV0aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZTsgcmUtaW52b2tpbmcgcnVuIGZvciBhIGZyZXNoIHJlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGluZnJhc3RydWN0dXJlIGZhaWx1cmVzIHRhbGtpbmcgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZCAod29ya2Zsb3ctc2VydmVyKSDigJQgYW4gZXhoYXVzdGVkIFJldHJ5QWdlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChVTkRfRVJSX1JFUV9SRVRSWSBmcm9tIGEgc3VzdGFpbmVkIDQyOS81MDMgc3Rvcm0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBkcm9wcGVkIHNvY2tldCwgYSBjb25uZWN0L0ROUyBmYWlsdXJlLCBvciBhIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dCDigJQgbXVzdCBOT1QgZmFpbCB0aGUgcnVuLiBSZXRocm93IHNvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycyBhbmQgYSBmcmVzaCBpbnZvY2F0aW9uIHJldHJpZXMgdGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGUgYmFja2VuZCByZWNvdmVycy4gVGhlIEB2ZXJjZWwvcXVldWUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyBhIGZhc3QgKDFz4oaSNjBzKSBiYWNrb2ZmIGJ5IGRlbGl2ZXJ5IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWRpbmcgdGhlIH41bWluIGRlZmF1bHQgdmlzaWJpbGl0eS10aW1lb3V0IHJlZHJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgbmV2ZXIga2lsbGluZyB0aGUgcHJvY2VzcyB2aWEgcnVuX2ZhaWxlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyYW5zaWVudCB3b3JsZCBlcnJvciBkdXJpbmcgcmVwbGF5OyByZWRlbGl2ZXJpbmcgdmlhIHF1ZXVlIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZlcmdlbmNlQ291bnQgPD0gbWF4UmVjb3ZlcnlSZXBsYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24tZ3VhcmQgYXN5bW1ldHJ5OiB1bmxpa2UgYHJ1bl9jb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0ZXJtaW5hbCBgcnVuX2ZhaWxlZGAgc2VuZHMgbm8gYHN0YXRlVXBkYXRlZEF0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QsIHNvIGl0IGlzIG5ldmVyIDQxMi1yZWplY3RlZCBldmVuIGlmIGEgaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFuZGVkIG1pZC1yZXBsYXkgYW5kIGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgcGF0aCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJldy4gVGhpcyBpcyBpbnRlbnRpb25hbCBhbmQgZmFpbC1vcGVuOiBhIHNwdXJpb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlICh0aGUgcnVuIGNhbiBiZSByZS1ydW4gZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhc2hib2FyZCksIHdoZXJlYXMgYSBzcHVyaW91cyAqY29tcGxldGlvbiogY29tbWl0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyByZXN1bHQuIEd1YXJkaW5nIHRoaXMgd3JpdGUgc3ltbWV0cmljYWxseSB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBuZWVkIHRoZSBsb2FkZWQgZXZlbnQgbG9nLCB3aGljaCBpcyBzY29wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgYHRyeWAgYWJvdmUgYW5kIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSGFuZGxlckNhY2hlZChoYW5kbGVyQ2FjaGVkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUludm9jYXRpb25Db3VudChpbnZvY2F0aW9uQ291bnQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zKFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGVudHJ5cG9pbnRDcmVhdGVkQXRcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLihyb3V0ZU1vZHVsZUJvZHlJbml0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBBdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlJbml0TXMocm91dGVNb2R1bGVCb2R5SW5pdE1zKSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSZXF1ZXN0TWV0aG9kKHJlcS5tZXRob2QpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUm91dGUoJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5pbml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ybGRIYW5kbGVycyA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkX2hhbmRsZXJzJyxcbiAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gZ2V0V29ybGRIYW5kbGVycygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19
|
|
2767
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBRXJCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsaUNBQWlDLEVBRWpDLDJCQUEyQixHQUc1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFlLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FB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akM7Z0JBQ0QsR0FBRyxDQUFDLHFCQUFxQixLQUFLLFNBQVM7b0JBQ3JDLENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDbkUsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDO2FBQ3hEO1NBQ0YsRUFDRCxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDNUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLENBQy9CLG1DQUFtQyxFQUNuQyxLQUFLLElBQUksRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQy9CLENBQUM7b0JBQ0YsT0FBTyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEVBQUUsYUFBYSxDQUNqQixTQUFTLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNsRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgc2V0V29ya2Zsb3dCYXNlUGF0aCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIHR5cGUgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG59IGZyb20gJy4vcnVudGltZS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY291bnRTdGVwU3RhcnRlZEV2ZW50cyB9IGZyb20gJy4vcnVudGltZS9jb3VudC1zdGVwLXN0YXJ0ZWQtZXZlbnRzLmpzJztcbmltcG9ydCB7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgdHlwZSBFdmVudENyZWF0b3IsXG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGluc2VydEV2ZW50QnlFdmVudElkLFxuICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5LFxuICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlLFxuICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUsXG4gIHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLW93bmVyc2hpcC5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHR5cGUgV29ybGRIYW5kbGVycyxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBydW5Xb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja09wdGlvbnMsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXN1bHQsXG4gIGhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBnZXRIb29rQnlUb2tlbixcbiAgdHlwZSBSZXN1bWVkSG9vayxcbiAgcmVzdW1lSG9vayxcbiAgcmVzdW1lV2ViaG9vayxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vcnVudGltZS9ydW4uanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDYW5jZWxSdW5PcHRpb25zLFxuICBjYW5jZWxSdW4sXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgdHlwZSBSZWVucXVldWVSdW5PcHRpb25zLFxuICByZWFkU3RyZWFtLFxuICByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyxcbiAgcmVlbnF1ZXVlUnVuLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVudGltZS9ydW5zLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICB0eXBlIFN0YXJ0T3B0aW9uc0Jhc2UsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkLFxuICBzdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0YXJ0LmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbiAgdHlwZSBXb3JsZEZhY3RvcnlNb2R1bGUsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbi8qKlxuICogQXBwbHkgdGhlIG9wdGlvbmFsIGNsaWVudC1zaWRlIGV2ZW50LWxpbWl0IG92ZXJyaWRlLlxuICogYFdPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREVgLCB3aGVuIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIsIGNsYW1wcyB0aGVcbiAqIHNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgdG8gYSBzbWFsbGVyIHZhbHVlIHNvIGVuZm9yY2VtZW50IGNhblxuICogYmUgZXhlcmNpc2VkIHdpdGhvdXQgYSBzZXJ2ZXItc2lkZSBjaGFuZ2UuIENsYW1wLWRvd24gb25seTogaXQgbmV2ZXIgcmFpc2VzXG4gKiB0aGUgc2VydmVyJ3MgbGltaXQsIGFuZCBpdCB0YWtlcyBlZmZlY3QgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBub25lLlxuICogVW5zZXQg4oeSIHNlcnZlciB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGNsYW1wTWF4RXZlbnRzKHNlcnZlclZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IGdldE1heEV2ZW50c092ZXJyaWRlKCk7XG4gIGlmIChvdmVycmlkZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc2VydmVyVmFsdWU7XG4gIHJldHVybiBzZXJ2ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUgOiBNYXRoLm1pbihzZXJ2ZXJWYWx1ZSwgb3ZlcnJpZGUpO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIHF1ZXVlIGRlbGl2ZXJ5IHdob3NlIHJ1biB3YXMgY3JlYXRlZCBpbiBhIGRpZmZlcmVudCBlbnZpcm9ubWVudCB0aGFuXG4gKiB0aGlzIGRlcGxveW1lbnQgcnVucyBpbi5cbiAqXG4gKiBgc3RhcnQoKWAgcGVyZm9ybXMgdHdvIHdyaXRlcyB0aGF0IG11c3QgbGFuZCBpbiB0aGUgc2FtZSB0ZW5hbnQ6IHRoZVxuICogYHJ1bl9jcmVhdGVkYCBldmVudCwgYXR0cmlidXRlZCB0byB3aGF0ZXZlciBlbnZpcm9ubWVudCB0aGUgKmNhbGxlcipcbiAqIGF1dGhlbnRpY2F0ZXMgYXMsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSwgcGlubmVkIHRvIGEgKmRlcGxveW1lbnQqLiBBXG4gKiBtaXNjb25maWd1cmVkIGNhbGxlciBjYW4gc3BsaXQgdGhlbSDigJQgd3JpdGluZyB0aGUgcnVuIHRvIG9uZSBlbnZpcm9ubWVudFxuICogd2hpbGUgYWRkcmVzc2luZyB0aGUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlci4gVGhlIGNvbnN1bWVyIHRoZW5cbiAqIGZpbmRzIG5vIHJ1biB1bmRlciBpdHMgb3duIHRlbmFudCBhbmQgdGhlIGJhY2tlbmQncyByZXNpbGllbnQgc3RhcnRcbiAqIChgcnVuX3N0YXJ0ZWRgIGNyZWF0ZXMgdGhlIHJ1biB3aGVuIGBydW5fY3JlYXRlZGAgd2FzIG5ldmVyIHNlZW4pIG1pbnRzIGFcbiAqIFNFQ09ORCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiB0aGlzIGVudmlyb25tZW50LiBCb3RoIGNvcGllcyBhcmUgcmVhbDogdGhlXG4gKiBjcmVhdG9yJ3Mgc2l0cyBwZW5kaW5nIGZvcmV2ZXIsIHRoaXMgb25lIGV4ZWN1dGVzLCBhbmQgZXZlcnkgc3Vic2VxdWVudFxuICogY3Jvc3MtdGVuYW50IHF1ZXVlIGFjayBmYWlscyB0byBmaW5kIGl0cyBtZXNzYWdlLlxuICpcbiAqIE5vdGhpbmcgZXh0ZXJuYWwgaXMgbmVlZGVkIHRvIGNhdGNoIHRoaXM6IHRoZSBjcmVhdG9yJ3MgZW52aXJvbm1lbnQgcmlkZXMgdGhlXG4gKiBtZXNzYWdlIGluIGBydW5JbnB1dC5lbnZpcm9ubWVudGAgYW5kIHRoaXMgcHJvY2VzcyBhbHJlYWR5IGtub3dzIGl0cyBvd24uIFNvXG4gKiBjb21wYXJlIHRoZW0gYW5kIHN0b3AgQkVGT1JFIGBydW5fc3RhcnRlZGAg4oCUIHRoZSB3cml0ZSB0aGF0IHdvdWxkIGNyZWF0ZSB0aGVcbiAqIGZvcmsuIFJlZnVzaW5nIGFmdGVyIGl0IHdvdWxkIGJlIHRvbyBsYXRlLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGNhbGxlciBtdXN0IGFiYW5kb24gdGhlIGRlbGl2ZXJ5LiBTa2lwcGVkIHdoZW5ldmVyXG4gKiBlaXRoZXIgc2lkZSBpcyB1bmtub3duLCB3aGljaCBrZWVwcyBldmVyeSBleGlzdGluZyBzZXR1cCBvbiBpdHMgY3VycmVudFxuICogYmVoYXZpb3I6IHdvcmxkcyB3aXRoIG5vIGVudmlyb25tZW50IGRpbWVuc2lvbiAoYHdvcmxkLWxvY2FsYCxcbiAqIGB3b3JsZC1wb3N0Z3Jlc2ApIGRvbid0IGltcGxlbWVudCBgZ2V0RW52aXJvbm1lbnRgLCBhbmQgcnVucyBzdGFydGVkIGJ5IGFuXG4gKiBvbGRlciBTREsgY2Fycnkgbm8gYGVudmlyb25tZW50YCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHJ1bklucHV0Py5lbnZpcm9ubWVudDtcbiAgaWYgKCFjcmVhdG9yRW52aXJvbm1lbnQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjdXJyZW50RW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG4gIGlmICghY3VycmVudEVudmlyb25tZW50IHx8IGN1cnJlbnRFbnZpcm9ubWVudCA9PT0gY3JlYXRvckVudmlyb25tZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBydW4gdGhpcyB3b3JrZmxvdzogaXQgd2FzIGNyZWF0ZWQgaW4gdGhlIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYCArXG4gICAgICBgZW52aXJvbm1lbnQgYnV0IHRoaXMgZGVwbG95bWVudCBydW5zIGluIFwiJHtjdXJyZW50RW52aXJvbm1lbnR9XCIuIGAgK1xuICAgICAgJ0V4ZWN1dGluZyBpdCBoZXJlIHdvdWxkIGNyZWF0ZSBhIHNlY29uZCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiAnICtcbiAgICAgICdib3RoIGVudmlyb25tZW50cyDigJQgb25lIHBlbmRpbmcgZm9yZXZlciwgb25lIHJ1bm5pbmcg4oCUIHNvIHRoZSBxdWV1ZSAnICtcbiAgICAgICdtZXNzYWdlIGlzIGJlaW5nIGRpc2NhcmRlZCB3aXRob3V0IGV4ZWN1dGluZyBhbmQgd2l0aG91dCByZXRyeWluZy4gJyArXG4gICAgICAnVGhlIGNsaWVudCB0aGF0IGNhbGxlZCBzdGFydCgpIHdyb3RlIHRoZSBydW4gdG8gaXRzIG93biBlbnZpcm9ubWVudCAnICtcbiAgICAgICdidXQgYWRkcmVzc2VkIHRoZSBxdWV1ZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyIG9uZS4gQ2hlY2sgJyArXG4gICAgICAndGhhdCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjbGllbnQgYXV0aGVudGljYXRlcyBhcyAoV09SS0ZMT1dfVkVSQ0VMX0VOViAnICtcbiAgICAgIFwiZm9yIENMSSBhbmQgQ0kgY2xpZW50cywgb3IgdGhlIE9JREMgdG9rZW4ncyBlbnZpcm9ubWVudCBpbnNpZGUgYSBcIiArXG4gICAgICAnZGVwbG95bWVudCkgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGRlcGxveW1lbnQgaXQgdGFyZ2V0cy4gVGhlICcgK1xuICAgICAgYHJ1biBpdCBjcmVhdGVkIGlzIHN0aWxsIHBlbmRpbmcgaW4gXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBhbmQgd2lsbCBgICtcbiAgICAgICdub3QgcnVuLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBjcmVhdG9yRW52aXJvbm1lbnQsXG4gICAgICBjdXJyZW50RW52aXJvbm1lbnQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQ6IHJ1bklucHV0Py5kZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMb2cgd2hlbiBhIGBzdGFydCgpYC1lbnF1ZXVlZCBtZXNzYWdlIHBpbm5lZCB0byBvbmUgZGVwbG95bWVudCBpcyBkZWxpdmVyZWRcbiAqIHRvIGEgZGlmZmVyZW50IG9uZS5cbiAqXG4gKiBBIGZpcnN0LWRlbGl2ZXJ5IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXQuZGVwbG95bWVudElkYCDigJQgdGhlIGRlcGxveW1lbnRcbiAqIGBzdGFydCgpYCBhZGRyZXNzZWQgaXQgdG8g4oCUIHNvIGNvbXBhcmluZyB0aGF0IGFnYWluc3QgdGhpcyBoYW5kbGVyJ3Mgb3duXG4gKiBkZXBsb3ltZW50IGRldGVjdHMgbWlzLWRlbGl2ZXJ5IGRpcmVjdGx5LiBUaGlzIGlzIGEgRElBR05PU1RJQywgbm90IGEgZ2F0ZTpcbiAqIGl0IHdhcm5zIGFuZCBsZXRzIHRoZSBpbnZvY2F0aW9uIHByb2NlZWQsIGRlbGliZXJhdGVseS5cbiAqXG4gKiBXaHkgdGhpcyBvbmUgb25seSB3YXJucyB3aGlsZSBpdHMgZW52aXJvbm1lbnQgc2libGluZyBhYm92ZSByZWZ1c2VzOiBhXG4gKiBkaWZmZXJpbmcgZGVwbG95bWVudCBpZCBpcyBub3QgYnkgaXRzZWxmIGV2aWRlbmNlIG9mIHRoZSBmb3JrIHdlIGNhcmUgYWJvdXQuXG4gKiBUaGUgZW52aXJvbm1lbnQgcGFpciBpcyBleGFjdCDigJQgdHdvIG5hbWVkIGVudmlyb25tZW50cyB0aGF0IGRpc2FncmVlIOKAlCBhbmQgaXRcbiAqIGlzIHRoZSBkaW1lbnNpb24gdGhlIHJ1bidzIHRlbmFudCBpcyBrZXllZCBvbi4gRGVwbG95bWVudCBpZHMgZGlzYWdyZWUgZm9yXG4gKiBiZW5pZ24gcmVhc29ucyB0b286IGB3b3JsZC1sb2NhbGAgZGVyaXZlcyBpdHMgaWQgZnJvbSB0aGUgaW5zdGFsbGVkIHBhY2thZ2VcbiAqIHZlcnNpb24gKGBkcGxfbG9jYWxAPHZlcnNpb24+YCksIHNvIHVwZ3JhZGluZyB0aGUgU0RLIG1pZC1ydW4gY2hhbmdlcyBpdCB3aXRoXG4gKiBub3RoaW5nIHdyb25nLiBSZWZ1c2luZyBvbiB0aGF0IHNpZ25hbCB3b3VsZCBzdHJhbmQgY29ycmVjdCBydW5zLCBhbmRcbiAqIHJlZnVzaW5nIGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGxlYXZlcyBubyBzZXJ2ZXItc2lkZSByZWNvcmQgdG8gZXhwbGFpbiB3aHkuXG4gKiBBbnlvbmUgdGVtcHRlZCB0byBwcm9tb3RlIHRoaXMgdG8gYSBoYXJkIGZhaWx1cmUgaGFzIHRvIGhhbmRsZSB0aGF0IGZpcnN0LlxuICpcbiAqIFNraXBwZWQgdW5sZXNzIEJPVEggaWRzIGFyZSBrbm93biDigJQgYGdldERlcGxveW1lbnRJZCgpYCB0aHJvd3MgaW4gd29ybGRzIHRoYXRcbiAqIHJlcXVpcmUgYSBkZXBsb3ltZW50IGFuZCBoYXZlIG5vbmUsIGFuZCBhIHJlLWVucXVldWVkIG1lc3NhZ2UgY2FycmllcyBub1xuICogYHJ1bklucHV0YCBhdCBhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICB3b3JsZCxcbiAgcnVuSW5wdXQsXG4gIHJ1bklkLFxuICBydW5Mb2dnZXIsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuSW5wdXQ6IFJ1bklucHV0IHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICBydW5Mb2dnZXI6IExvZ2dlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlubmVkRGVwbG95bWVudElkID0gcnVuSW5wdXQ/LmRlcGxveW1lbnRJZDtcbiAgaWYgKCFwaW5uZWREZXBsb3ltZW50SWQpIHJldHVybjtcblxuICBsZXQgY3VycmVudERlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gV29ybGRzIHRoYXQgcmVxdWlyZSBhIGRlcGxveW1lbnQgaWQgdGhyb3cgd2hlbiB0aGVyZSBpc24ndCBvbmUuIFRoYXQgaXNcbiAgICAvLyBub3QgYSBtaXNtYXRjaCDigJQgdGhlcmUgaXMgc2ltcGx5IG5vdGhpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWN1cnJlbnREZXBsb3ltZW50SWQgfHwgY3VycmVudERlcGxveW1lbnRJZCA9PT0gcGlubmVkRGVwbG95bWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICdRdWV1ZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgdG8gYSBkZXBsb3ltZW50IGl0IHdhcyBub3QgcGlubmVkIHRvLiAnICtcbiAgICAgICdUaGUgcnVuIHdhcyBjcmVhdGVkIHRhcmdldGluZyBhIGRpZmZlcmVudCBkZXBsb3ltZW50LCBzbyB0aGlzICcgK1xuICAgICAgJ2ludm9jYXRpb24gbWF5IGJlIHJlcGxheWluZyBhZ2FpbnN0IGNvZGUgdGhlIHJ1biB3YXMgbm90IHN0YXJ0ZWQgb24uICcgK1xuICAgICAgJ0NvbnRpbnVpbmcg4oCUIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIFdvcmtmbG93IFNESyB2ZXJzaW9uIGNoYW5nZWQgJyArXG4gICAgICAnbWlkLXJ1biBpbiBsb2NhbCBkZXZlbG9wbWVudCwgd2hlcmUgdGhlIGRlcGxveW1lbnQgaWQgaXMgZGVyaXZlZCBmcm9tICcgK1xuICAgICAgJ3RoYXQgdmVyc2lvbi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgcGlubmVkRGVwbG95bWVudElkLFxuICAgICAgY3VycmVudERlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIGNvbnN0IHRlcm1pbmFsUnVuRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEhvdyBtYW55IG9mIGBpZHNgIGFyZSBhYnNlbnQgZnJvbSBgcHJlc2VudGAuICovXG5mdW5jdGlvbiBjb3VudE1pc3NpbmdJZHMoaWRzOiBJdGVyYWJsZTxzdHJpbmc+LCBwcmVzZW50OiBTZXQ8c3RyaW5nPik6IG51bWJlciB7XG4gIGxldCBtaXNzaW5nID0gMDtcbiAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICBpZiAoIXByZXNlbnQuaGFzKGlkKSkgbWlzc2luZysrO1xuICB9XG4gIHJldHVybiBtaXNzaW5nO1xufVxuXG4vKipcbiAqIFRoZSBsaW5lYWdlIHJvb3Qgb2YgYSBsb2FkZWQgcnVuOiBpdHMgYCRyb290UnVuSWRgIGF0dHJpYnV0ZSwgb3IgaXRzIG93biBpZFxuICogd2hlbiBpdCBpcyBpdHNlbGYgYSByb290LlxuICovXG5mdW5jdGlvbiByb290UnVuSWRGcm9tKFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBydW5JZDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYXR0cmlidXRlcz8uW1JPT1RfUlVOX0lEX0FUVFJJQlVURV0gPz8gcnVuSWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhIGhvb2sgYW5kL29yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCBhbmQgdHVyYm8ncyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydC5cbiAqIEEgdGVybWluYWwtc3RlcCBkZWx0YSBjYW4gb21pdCBhbiBldmVudCBhcHBlbmRlZCBjb25jdXJyZW50bHkgYWZ0ZXIgdGhhdFxuICogd3JpdGUuIFdpdGggbm8gb3BlbiBob29rIG9yIHdhaXQsIG9ubHkgY2FuY2VsbGF0aW9uIGNhbiBkbyBzbywgYW5kIG9ic2VydmluZ1xuICogaXQgb25lIHJlcGxheSBsYXRlIGlzIHNhZmUgYmVjYXVzZSB0aGUgbmV4dCBlbnRpdHkgd3JpdGUgaXMgcmVqZWN0ZWQuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50czogRXZlbnRbXSk6IHtcbiAgb3Blbkhvb2s6IGJvb2xlYW47XG4gIG9wZW5XYWl0OiBib29sZWFuO1xufSB7XG4gIGNvbnN0IGRpc3Bvc2VkSG9va0lkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykgZGlzcG9zZWRIb29rSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICBjb21wbGV0ZWRXYWl0SWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuICBsZXQgb3Blbkhvb2sgPSBmYWxzZTtcbiAgbGV0IG9wZW5XYWl0ID0gZmFsc2U7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICFkaXNwb3NlZEhvb2tJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIG9wZW5Ib29rID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgb3BlbldhaXQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3Blbkhvb2sgJiYgb3BlbldhaXQpIGJyZWFrO1xuICB9XG4gIHJldHVybiB7IG9wZW5Ib29rLCBvcGVuV2FpdCB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0PzogbnVtYmVyO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHNldFdvcmtmbG93QmFzZVBhdGgob3B0aW9ucz8uYmFzZVBhdGgpO1xuXG4gIGNvbnN0IE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgPVxuICAgIE51bWJlcihwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TKSB8fCAxMjBfMDAwO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBpbmNvbWluZ1RyYWNlQ2FycmllcixcbiAgICAgICAgICByZXF1ZXN0ZWRBdCxcbiAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2UsXG4gICAgICAgICAgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICBob29rSW5wdXQsXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUg4oCUIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1biDigJQgYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb24g4oCUXG4gICAgICAgIC8vIHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMg4oCUIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzIOKAlFxuICAgICAgICAvLyBzZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVGhlIHJlcGxheSBidWRnZXQgY292ZXJzIG9yY2hlc3RyYXRpb24gd29yayBiZXR3ZWVuIHN0ZXBzLCBub3QgaW5saW5lXG4gICAgICAgIC8vIHN0ZXAgYm9kaWVzLiBJdCBpcyBjaGVja2VkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zOyBzdGVwIGJvZGllcyB1c2VcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHRpbWVvdXQgYW5kIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgZ3VhcmQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBCb3RoIGNoZWNrcyBiZWxvdyBsb29rIGF0IGBydW5JbnB1dGAsIHNvIGJvdGggYXJlIG5vLW9wcyBvbiBhXG4gICAgICAgICAgICAgIC8vIHJlLWVucXVldWVkIG1lc3NhZ2UgKHdoaWNoIGNhcnJpZXMgbm9uZSkg4oCUIHRoZXkgb25seSBldmVyIHJ1biBvblxuICAgICAgICAgICAgICAvLyBhIGZpcnN0IGRlbGl2ZXJ5LCB0aGUgb25lIHRoYXQgY291bGQgY3JlYXRlIHRoZSBydW4uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJldHVybmluZyBhY2tzIHRoZSBtZXNzYWdlLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBtaXNtYXRjaCBpc1xuICAgICAgICAgICAgICAvLyBiYWtlZCBpbnRvIHRoaXMgbWVzc2FnZSwgc28gZXZlcnkgcmVkZWxpdmVyeSB3b3VsZCByZWFjaCB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB2ZXJkaWN0LCBhbmQgdGhyb3dpbmcgd291bGQganVzdCBob3QtbG9vcCB0aGUgaGFuZGxlciB1bnRpbFxuICAgICAgICAgICAgICAvLyBNQVhfUVVFVUVfREVMSVZFUklFUyB3aXRoIHRoZSBzYW1lIGVycm9yIGVhY2ggdGltZS4gSXQgbWF0Y2hlc1xuICAgICAgICAgICAgICAvLyBob3cgdGhlIHJ1bl9zdGFydGVkIHBhdGggYWxyZWFkeSBkaXNjYXJkcyBkZWxpdmVyaWVzIHdob3NlXG4gICAgICAgICAgICAgIC8vIHZlcmRpY3QgY2Fubm90IGNoYW5nZSAoRW50aXR5Q29uZmxpY3RFcnJvciwgUnVuRXhwaXJlZEVycm9yKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIERpYWdub3N0aWMgb25seSDigJQgc2VlIHRoZSBoZWxwZXIgZm9yIHdoeSB0aGlzIHdhcm5zIGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgLy8gcmVmdXNpbmcgdGhlIGludm9jYXRpb24uXG4gICAgICAgICAgICAgIGF3YWl0IHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHJ1bkxvZ2dlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICAgICAgICBgd29ya2Zsb3cuZXhlY3V0ZSAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gLFxuICAgICAgICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdleGVjdXRlX3YyJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKG1ldGFkYXRhLnF1ZXVlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWV0YWRhdGEubWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3Byb2Nlc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0UXVldWVPdmVyaGVhZCh7IHJlcXVlc3RlZEF0IH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCghIXRyYWNlQ29udGV4dCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlTW9kZSh0cmFjZU1vZGUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGludm9jYXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUV2ZW50OiBFdmVudENyZWF0b3IgPSAoZGF0YSwgcGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShwYXJhbXMsIChwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGNhY2hlOiBrZWVwIGxvYWRlZCBldmVudHMgaW4gbWVtb3J5IGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHdlIGRvIGEgZnVsbCBsb2FkOyBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGZldGNoIG9ubHkgZXZlbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZEV2ZW50czogRXZlbnRbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IHdoZW4gYW4gaW5saW5lIHN0ZXAncyB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmV0dXJucyB0aGUgZXZlbnQtbG9nIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciAoYSBzdXBwb3J0aW5nIFdvcmxkIG9ubHkpLCB3ZSBzdGFzaCBpdCBoZXJlIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBjb25zdW1lcyBpdCBpbiBwbGFjZSBvZiB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IHJvdW5kLXRyaXAuIEVhY2ggdmFsdWUgaXMgY29uc3VtZWQgZXhhY3RseSBvbmNlXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjbGVhcmVkLiBOdWxsIG1lYW5zIFwibm8gZGVsdGEgcGVuZGluZyDigJQgZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5XCIuIFNlZSB0aGUgY29uc3VtZSBzaXRlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZSBzaXRlczogYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLCBhbmQgaW5cbiAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRSZXBsYXlJblByb2Nlc3Mgd2hlbiBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgLy8gY2FycmllZCB0aGUgbWlzc2luZyBldmVudHMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgICAgIGxldCBwZW5kaW5nSW5saW5lRGVsdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBzdGF0ZTogc2V0IGJ5IGVpdGhlciB0aGUgYmFja2dyb3VuZCBzdGVwIHBhdGhcbiAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAvLyByZXNwb25zZS4gVW5kZWZpbmVkIOKHkiBubyBlbmZvcmNlbWVudCAob2xkZXIgc2VydmVycywgdHVyYm8pLlxuICAgICAgICAgICAgICAgICAgbGV0IG1heEV2ZW50c0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dTdGFydGVkQXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHM6IEV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSAoVFRGUykgc3RhdGUg4oCUIHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cy5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uJ3MgRklSU1QgZXZlbnQgc25hcHNob3QgY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGJleW9uZCBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZDogYW55dGhpbmcgZWxzZSB3YXNcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCB3aG9zZSBjb250cmlidXRpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUtdG8tZmlyc3Qtc3RlcCAoaW5jbHVkaW5nIHRoZSBxdWV1ZSBob3AgYmFjayBoZXJlKVxuICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIG1lYXN1cmVkIHdhbGwtY2xvY2ssIHNvIFRURlMgaXMgbm90IHJlcG9ydGVkLlxuICAgICAgICAgICAgICAgICAgLy8gU2V0IG9uY2UsIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24ncyBsb2FkZWQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICBsZXQgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIEVwb2NoIG1zIHRoZSBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIHdhcyByZWNlaXZlZC9wYXJzZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBTREsg4oCUIGFuY2hvcnMgUlNGUyAocnVuX3N0YXJ0ZWQg4oaSIGZpcnN0IHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgUE9TVCkuIFNldCBvbmNlLCBpbiB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAvLyBhd2FpdGVkLCBzbyB0aGlzIGlzIHN0YW1wZWQgYXQgdGhlIHBvaW50IHRoZSBydW4gaXNcbiAgICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemVkIGxvY2FsbHkgaW5zdGVhZCBvZiB0aGUgcmVhbCByZXNwb25zZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNcy5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBXYWxsLWNsb2NrIG1zIHNwZW50IGNvbW1pdHRpbmcgaG9va19jcmVhdGVkIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzdGVwIHJhbiwgYWNjdW11bGF0ZWQgYWNyb3NzIHN1c3BlbnNpb24gcGFzc2VzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgc3VidHJhY3RlZCBmcm9tIFRURlMuIEFjY3VtdWxhdG9ycyBoZXJlIHN1cnZpdmUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnQgKGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uLCBvclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZS1ldmVudCByZXN0YXJ0IGJlbG93KSwgc28gYSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gb3Zlci1jb3VudHMgYnkgdGhlIGFiYW5kb25lZCBwYXNzJ3MgaG9vayB0aW1lIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgc2xpZ2h0IG92ZXItY291bnQgZWl0aGVyIHJlc3RhcnQgaGFzIGFsd2F5cyBoYWQuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlU3RlcEJsb2NraW5nTXMgPSAwO1xuICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3Qgb2YgdGhlIGFjY3VtdWxhdG9yIGFzIG9mIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIHRoZSBydW4ncyBmaXJzdCBhdHRyX3NldCAod2hvc2UgaG9vayBwaGFzZSByYW5cbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdHMgYXR0ciB3cml0ZXMpLiBXaGVuIGEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgLy8gZW5kcyB0aGUgVFRGUyBtZWFzdXJlbWVudCBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lIGZyb20gQkVGT1JFIHRoYXQgcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHdyaXRlcyBmYWxsIG91dHNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSB2ZXJ5IGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSB2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBpdCBpcyBwcm92YWJseSBzYWZlIHRvOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLCBza2lwIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhc1xuICAgICAgICAgICAgICAgICAgLy8gYmVlbiB3cml0dGVuIHlldCksIGFuZCBmb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCAobm9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIGV4aXN0cyB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0pLlxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bklucHV0YCBpcyBvbmx5IHByZXNlbnQgb24gdGhlIHN0YXJ0KCktZW5xdWV1ZWQgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBgYXR0ZW1wdCA9PT0gMWAgKDEtYmFzZWQpIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeTsgYGluY29taW5nU3RlcElkYCB3b3VsZCBtYXJrIGEgYmFja2dyb3VuZC1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgYSByZWNvdmVyeSByZXBsYXkg4oCUIGJvdGhcbiAgICAgICAgICAgICAgICAgIC8vIGluZWxpZ2libGUuIFRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlcyBmb3JjZWRcbiAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBlbmRzIG9uY2UgYSBob29rIG9yIHdhaXQgaXMgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgaW50cm9kdWNlIHJlc3VtZSBpbnZvY2F0aW9ucyksIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHBvaW50IChzZWUgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCkuIFdvcmtmbG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGludHJvZHVjZSBubyBzdWNoIGludm9jYXRpb24gc291cmNlIOKAlCB0aGV5IHJlc29sdmVcbiAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbiBpbi1wcm9jZXNzIHJlcGxheSBhbmQgZG9uJ3QgZW5kIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgLy8gTk9URTogYG1ldGFkYXRhLmF0dGVtcHQgPT09IDFgIGlzIGFsc28gbG9hZC1iZWFyaW5nIGZvclxuICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgb3duZXJzaGlwOiBvd25lZC1yZWNvdmVyeSBzdGVwcyAoYSBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBzdGFtcGVkIGJ5IGEgUFJFVklPVVMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlKSBjYW4gb25seVxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3Qgb24gYXR0ZW1wdCDiiaUgMiwgc28gdHVyYm8gYW5kIG93bmVkIHJlY292ZXJ5IGFyZVxuICAgICAgICAgICAgICAgICAgLy8gbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGUgdHVyYm8gYHJlaW52b2tlKClgIHBhdGhzIChob29rXG4gICAgICAgICAgICAgICAgICAvLyBjb25mbGljdCwgdGhyb3R0bGUgYmFja29mZikgYWNrIHRoaXMgbWVzc2FnZSBhbmQgY29udGludWVcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQg4oCUIHNhZmUgb25seSBiZWNhdXNlIG5vXG4gICAgICAgICAgICAgICAgICAvLyBub24tdGVybWluYWwgc3RlcCBjYW4gYmUgaW5saW5lLW93bmVkIGJ5IHRoZSBhY2tlZCBpZFxuICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0dXJibyBpcyBvbi4gSWYgdHVyYm8gZXZlciBlbmdhZ2VzIG9uIHJlZGVsaXZlcmllcyxcbiAgICAgICAgICAgICAgICAgIC8vIHRob3NlIHBhdGhzIG11c3QgZmlyc3QgY2hlY2sgZm9yIG93bmVkIHBlbmRpbmcgc3RlcHMgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gYHsgdGltZW91dFNlY29uZHMgfWAgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cmJvID1cbiAgICAgICAgICAgICAgICAgICAgaXNUdXJib0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmF0dGVtcHQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVwbGF5RGl2ZXJnZW5jZTtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLldvcmtmbG93VHVyYm8odHVyYm8pKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAob3IgcmVqZWN0cyBpZiBpdCBmYWlsZWQpLiBUaHJlYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW50byBoYW5kbGVTdXNwZW5zaW9uIGFuZCBleGVjdXRlU3RlcCBzbyBubyBzdGVwL2hvb2svd2FpdFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmFjZXMgYWhlYWQgb2YgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWQgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZCB1cCBmcm9udC5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5SZWFkeUJhcnJpZXI6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE9yZGVyIGEgdGVybWluYWwgcnVuIHdyaXRlIChydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCkgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgaW4gdHVyYm8gbW9kZSDigJQgYSBuby1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gb3RoZXJ3aXNlIHJlYWNoIHJ1bl9jb21wbGV0ZWQgYmVmb3JlIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cy4gQmVzdC1lZmZvcnQ6IGEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvclxuICAgICAgICAgICAgICAgICAgLy8gb3JkZXJpbmcgb25seTsgaWYgcnVuX3N0YXJ0ZWQgdHJ1bHkgZmFpbGVkIHRoZSB0ZXJtaW5hbCB3cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd2FpdFJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgb3JjaGVzdHJhdG9yLiBPdXRzaWRlIHR1cmJvIHRoaXMgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAsIHdoaWNoIG1ha2VzIHRoZSBxdWV1ZSByZXNjaGVkdWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBkZWxpdmVyeSdzIG1lc3NhZ2UuIEluIHR1cmJvIHRoYXQgaXMgYSB0cmFwOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAsIGFuZCBvbiBhc3luYyBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGdyYXBoaWxlLXdvcmtlcikgYSByZXNjaGVkdWxlIGNvbWVzIGJhY2sgYXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMSDigJQgc28gdHVyYm8gcmUtZW5nYWdlcywgc2tpcHMgdGhlIGV2ZW50LWxvZyBsb2FkXG4gICAgICAgICAgICAgICAgICAvLyBhZ2FpbiwgcmVwbGF5cyBhZ2FpbnN0IGFuIGVtcHR5IGxvZywgbmV2ZXIgb2JzZXJ2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBqdXN0IHdyb3RlLCBhbmQgcmUtc3VzcGVuZHNcbiAgICAgICAgICAgICAgICAgIC8vIGZvcmV2ZXIgKHRoZSBydW4gd2VkZ2VzKS4gVW5kZXIgdHVyYm8gd2UgaW5zdGVhZCBlbnF1ZXVlIGFuXG4gICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gdGhhdCBjYXJyaWVzIE5PIGBydW5JbnB1dGAsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBkZWxpdmVyeSBpcyBhIG5vcm1hbCAobm9uLXR1cmJvKSBsb2FkLWFuZC1yZXBsYXkgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIGNvbW1pdHRlZCBldmVudHMgYW5kIG1ha2VzIHByb2dyZXNzOyB3ZSB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYHVuZGVmaW5lZGAgc28gdGhlIHF1ZXVlIHRyZWF0cyB0aGlzIGRlbGl2ZXJ5IGFzIGRvbmVcbiAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFsc28gcmVzY2hlZHVsaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBpbnZhcmlhbnQgZ3VhcmQ6IGNvcnJlbGF0aW9uIElEcyBvZlxuICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgd2hvc2UgYm9kaWVzIHRoaXMgaW52b2NhdGlvbiBpcyBleGVjdXRpbmcgdW5kZXIgYW5cbiAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBzdGFtcCAobGF6eSBpbmxpbmUgKyBvd25lZCByZWNvdmVyeSksIHdoaWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYm9keSBpcyBpbiBmbGlnaHQuIENyYXNoIHJlY292ZXJ5IGRlcGVuZHMgb24gdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBOT1QgYmVpbmcgYWNrZWQgd2hpbGUgc3VjaCBhIHN0ZXAgaXMgbm9uLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyAoYWNrID0gaGFuZGxlciByZXR1cm4gb3IgcmVpbnZva2UsIHdoaWNoIGFja3MgKyBlbnF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgdGhlIHJlZGVsaXZlcnkgb2YgdGhlIG9sZCBpZCBpc1xuICAgICAgICAgICAgICAgICAgLy8gd2hhdCByZS1leGVjdXRlcyBhbiBvcnBoYW5lZCBvd25lZCBzdGVwKS4gQWxsIGV4ZWN1dGVTdGVwXG4gICAgICAgICAgICAgICAgICAvLyBjYWxscyBhcmUgYXdhaXRlZCBiZWZvcmUgYW55IGFjayBwYXRoIHJ1bnMsIHNvIHRoaXMgc2V0XG4gICAgICAgICAgICAgICAgICAvLyBpcyBlbXB0eSBhdCBldmVyeSBhY2sgYnkgY29uc3RydWN0aW9uOyB0aGUgY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBmdXR1cmUgcmVmYWN0b3JzIHRoYXQgYnJlYWsgdGhhdCBvcmRlcmluZy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluRmxpZ2h0T3duZWRTdGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMgPSAoXG4gICAgICAgICAgICAgICAgICAgIGFja1BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkZsaWdodE93bmVkU3RlcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFyaWFudCB2aW9sYXRpb246IGFja2luZyB0aGUgd29ya2Zsb3cgbWVzc2FnZSB3aGlsZSBvd25lZCBpbmxpbmUgc3RlcHMgYXJlIHN0aWxsIGV4ZWN1dGluZyDigJQgY3Jhc2ggcmVjb3ZlcnkgZm9yIHRoZXNlIHN0ZXBzIGlzIGJyb2tlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBbLi4uaW5GbGlnaHRPd25lZFN0ZXBzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBFeHRyYSBmaWVsZHMgdG8gY2Fycnkgb24gdGhlIG5ldyBtZXNzYWdlLiBPbmx5IHJlYWNoZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAqIG5leHQgaW52b2NhdGlvbiBvbiB0aGUgdHVyYm8gcGF0aDogd2l0aG91dCB0dXJibyBub1xuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGlzIGVucXVldWVkIGF0IGFsbCDigJQgdGhlIGhhbmRsZXIgcmV0dXJucyBhXG4gICAgICAgICAgICAgICAgICAgICAqIHZpc2liaWxpdHkgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgdGhlIENVUlJFTlRcbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSwgd2hvc2UgYm9keSAoYW5kIHRoZXJlZm9yZSBhbnkgY291bnRlciBvbiBpdClcbiAgICAgICAgICAgICAgICAgICAgICogY2Fubm90IGJlIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBleHRyYVBheWxvYWQ/OiBQYXJ0aWFsPFdvcmtmbG93SW52b2tlUGF5bG9hZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMoJ3JlaW52b2tlJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHVyYm8pIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBkZWxheVNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5leHRyYVBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uICg0MTIpIHJlY292ZXJ5OiBob3cgbWFueSB0aW1lcyB0aGlzIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgIC8vIGhhcyB0aHJvd24gYXdheSBpdHMgcmVwbGF5IGFuZCBzdGFydGVkIG92ZXIgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0cyA9IDA7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEV2ZW50IGlkcyB0aGUgZGlzY2FyZGVkIHJlcGxheSBoZWxkLCBrZXB0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgKiBsb2FkIHJlc29sdmVzIHNvIGEgcmVzdGFydCBjYW4gcmVwb3J0IHdoYXQgaXRzIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICogYWN0dWFsbHkgZm91bmQuIFdpdGhvdXQgdGhpcyBhIDQxMiBvbmx5IGV2ZXIgdGVsbHMgeW91IHRoYXRcbiAgICAgICAgICAgICAgICAgICAqIGEgcmVzdGFydCBoYXBwZW5lZCwgd2hpY2ggY29uZmxhdGVzIHR3byB2ZXJ5IGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICogc2l0dWF0aW9uczogYSBsb2cgdGhhdCBncmV3IChleHBlY3RlZCDigJQgdGhlIGZlbmNlIGRpZCBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGpvYikgYW5kIGEgbG9nIHRoYXQgY2FtZSBiYWNrIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2VuZCBkaXNhZ3JlZSBhYm91dCB0aGUgY291bnQgZm9yIHRoZSBzYW1lIHNldCBvZlxuICAgICAgICAgICAgICAgICAgICogZXZlbnRzIGFuZCB0aGUgcmVzdGFydCB3aWxsIHJlLWRlcml2ZSB0aGUgc2FtZSBzbmFwc2hvdCBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGJlIHJlamVjdGVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkczogU2V0PHN0cmluZz47XG4gICAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2lubGluZS1kZWx0YScgfCAnZnVsbC1yZWxvYWQnO1xuICAgICAgICAgICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZXBvcnQgd2hhdCBhIHN0YWxlLXNuYXBzaG90IHJlc3RhcnQncyByZWxvYWQgZm91bmQsIG9uY2VcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2cgdGhpcyByZXBsYXkgd2lsbCBhY3R1YWxseSBjb25zdW1lIGlzIGluIGhhbmQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogYGdyZXdgIGlzIHRoZSBleHBlY3RlZCBjYXNlIGFuZCBnaXZlcyA0MTIgdm9sdW1lIGFcbiAgICAgICAgICAgICAgICAgICAqIGRlbm9taW5hdG9yLiBgdW5jaGFuZ2VkYCBtZWFucyB0aGUgcmVsb2FkIGRpc2FncmVlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgcmVqZWN0aW9uLCBzbyB0aGlzIHJlcGxheSByZS1kZXJpdmVzIHRoZSBzYW1lIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgaXMgcmVqZWN0ZWQgYWdhaW4gdW50aWwgdGhlIGJ1ZGdldCBpcyBzcGVudC4gYHNocmFua2BcbiAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSBpbXBvc3NpYmxlOiBldmVyeSBsb2FkIHBhdGggb25seSBhZGRzIHRvIGEgcnVuJ3NcbiAgICAgICAgICAgICAgICAgICAqIGxvZy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0UHJlY29uZGl0aW9uUmVzdGFydFJlbG9hZCA9IChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZWxpbmUgPSBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZWxpbmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRlZElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gY291bnRNaXNzaW5nSWRzKHJlbG9hZGVkSWRzLCBiYXNlbGluZS5pZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm9wcGVkID0gY291bnRNaXNzaW5nSWRzKGJhc2VsaW5lLmlkcywgcmVsb2FkZWRJZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRjb21lID1cbiAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkID4gMCA/ICdzaHJhbmsnIDogYWRkZWQgPiAwID8gJ2dyZXcnIDogJ3VuY2hhbmdlZCc7XG5cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdSZXN0YXJ0ZWQgcmVwbGF5IHJlbG9hZGVkIGl0cyBldmVudCBsb2cgYWZ0ZXIgYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0JlZm9yZTogYmFzZWxpbmUuaWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNBZnRlcjogcmVsb2FkZWRJZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzOiBiYXNlbGluZS5yZXN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBiYXNlbGluZS5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGJhc2VsaW5lLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVjb3ZlciBmcm9tIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgaW5zaWRlIHRoaXMgaW52b2NhdGlvbiwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBwZXItaW52b2NhdGlvbiBidWRnZXQgaXMgc3BlbnQgKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrXG4gICAgICAgICAgICAgICAgICAgKiB0byBhIGZyZXNoIGludm9jYXRpb24pLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIEEgNDEyIG1lYW5zIHRoZSBsb2cgdGhpcyByZXBsYXkgZGVyaXZlZCBpdHMgZXZlbnRzIGZyb20gd2FzXG4gICAgICAgICAgICAgICAgICAgKiBtaXNzaW5nIGFuIGV2ZW50IHRoZSBiYWNrZW5kIGhhZCBhbHJlYWR5IHJlY29yZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAqIHJlamVjdGVkIHdyaXRlIGNhbm5vdCBzaW1wbHkgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkIOKAlCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBXb3JsZCBNQVkgcmV0dXJuIHRoZSBldmVudHMgd2Ugd2VyZSBtaXNzaW5nIG9uIHRoZSA0MTIuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRydXN0IGl0IG9ubHkgb24gdGhlIEZJUlNUIHJlc3RhcnQ6IGl0cyBjb21wbGV0ZW5lc3MgcHJvb2ZcbiAgICAgICAgICAgICAgICAgICAgLy8gbGVhbnMgb24gdGhlIGJhY2tlbmQncyBvd24gYm9va2tlZXBpbmcsIHNvIGlmIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXItY291bnRzLCBhIFwiY29tcGxldGVcIiBkZWx0YSBjYW4gc3RpbGwgbGVhdmUgYSBob2xlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCb3VuZGluZyBpdCB0byBvbmUgYXR0ZW1wdCBjYXBzIHRoYXQgYXQgYSBzaW5nbGUgd2FzdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQ7IGV2ZXJ5IGxhdGVyIHJlc3RhcnQgZG9lcyB0aGUgYXV0aG9yaXRhdGl2ZSBsb2FkLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YSAmJiBwcmVjb25kaXRpb25SZXN0YXJ0cyA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwcmVjb25kaXRpb25FdmVudERlbHRhKGVycm9yLCBydW5JZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWx0YSBpcyBvbmx5IHVzYWJsZSBhcyBhIGRlbHRhIGlmIHRoZXJlIGlzIGEgY2FjaGVkIGxvZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBtZXJnZSBpdCBpbnRvOyB3aXRoIG5vIGJhc2UgbG9nIHRoZSByZXN0YXJ0IGhhcyB0byBsb2FkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSB0aGluZyBhbnl3YXkuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZWREZWx0YSA9IEJvb2xlYW4oZGVsdGEgJiYgY2FjaGVkRXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3QgdGhlIHNldCBiZWluZyBkaXNjYXJkZWQgd2hpbGUgaXQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZDsgdGhlIGNvbXBhcmlzb24gaGFwcGVucyBvbmNlIHRoZSBuZXh0IGxvYWQgcmVzb2x2ZXMuXG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZSA9IGNhY2hlZEV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZWREZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN1bWVkIGJ5IHRoZSBsb29wJ3MgZmlyc3QgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGBwZW5kaW5nSW5saW5lRGVsdGEgJiYgY2FjaGVkRXZlbnRzYCkgd2l0aCBub1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IHJvdW5kIHRyaXAgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmxpbmVEZWx0YSA9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE1VU1QgYmUgYSBmdWxsLCBjdXJzb3ItbGVzcyByZWxvYWQuIFRoZSBjdXJzb3IgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGxleGljb2dyYXBoaWMgZXZlbnQgaWQgd2hpbGUgYSBob2xlIGlzIGRlZmluZWQgYnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVTElEICp0aW1lKjogYW4gZXZlbnQgaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQgc29ydHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgc2lkZSBvZiB0aGUgY3Vyc29yIGRlcGVuZGluZyBvbiBpdHMgcmFuZG9tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LCBhbmQgYW4gZXZlbnQgbWludGVkIGluIGFuIGVhcmxpZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaXNlY29uZCBidXQgY29tbWl0dGVkIGxhdGVyIGFsd2F5cyBzb3J0cyBiZWxvdyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBpbmNyZW1lbnRhbCBsb2FkIHRoZXJlZm9yZSBoZWFscyB0aGUgaG9sZSBvbmx5IGJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gbHVjay5cbiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0ZWQgbG9nIGluc2VydHMgdGhlIG1pc3NpbmcgZXZlbnRzIEJFTE9XIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBhbHJlYWR5IHNjYW5uZWQgZm9yIHBheWxvYWQgcHJld2FybWluZywgc2hpZnRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBsYXRlciBwb3NpdGlvbi4gT25seSBhIGZ1bGwgcmVzY2FuIHNlZXMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUucmVzZXRTY2FuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZTsgcmVzdGFydGluZyByZXBsYXkgaW4tcHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVzdGFydHMnOiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFc2NhbGF0ZSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiB0aGF0IHN1cnZpdmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tcHJvY2VzcyByZXN0YXJ0IGJ1ZGdldCB0byBhIGZyZXNoIGludm9jYXRpb24sIG9yIGdpdmUgdXBcbiAgICAgICAgICAgICAgICAgICAqIG9uIHRoZSBydW4gd2hlbiB0aGUgcGVyLXJ1biBidWRnZXQgaXMgYWxzbyBzcGVudC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgYSBjbG9zdXJlIHZhcmlhYmxlIGFuZCB0aGUgcXVldWUnc1xuICAgICAgICAgICAgICAgICAgICogZGVsaXZlcnkgY291bnQgcmVzdGFydHMgYXQgMSB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlZCwgc28gYSBydW4gdGhhdCBpcyBwZXJtYW5lbnRseSB1bmFibGUgdG8gY2F0Y2ggdXBcbiAgICAgICAgICAgICAgICAgICAqIHdpdGggaXRzIG93biBldmVudCBsb2cgd291bGQgb3RoZXJ3aXNlIGN5Y2xlIHJlc3RhcnRzIOKGklxuICAgICAgICAgICAgICAgICAgICogcmUtaW52b2tlIOKGkiByZXN0YXJ0cyB3aXRoIG5vIHJ1bi1sZXZlbCBib3VuZC4gVGhlIGNoYWluIGlzXG4gICAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUgY291bnRlZCBvbiB0aGUgbWVzc2FnZSBpdHNlbGYsIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGRpdmVyZ2VuY2VzIGFyZSwgYW5kIGZhaWxzIHRoZSBydW4gb25jZSBleGhhdXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGNvdW50ZXIgb25seSBhZHZhbmNlcyBvbiBob3BzIHRoYXQgZW5xdWV1ZSBhIG5ldyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgKiAoc2VlIGByZWludm9rZWApLiBBIHJlZGVsaXZlcnktYmFzZWQgaG9wIGtlZXBzIHRoZSBzYW1lIGJvZHlcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBzbyB0aGUgc2FtZSBjb3VudCwgYnV0IGl0IGFsc28ga2VlcHMgYWR2YW5jaW5nXG4gICAgICAgICAgICAgICAgICAgKiBgbWV0YWRhdGEuYXR0ZW1wdGAsIHdoaWNoIHRoZSBtYXgtZGVsaXZlcnkgY2hlY2sgYXQgdGhlIHRvcFxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGhhbmRsZXIgYWxyZWFkeSBib3VuZHMg4oCUIGFuZCB0aGUgZGVsYXkgYmVsb3cgaXMgd2hhdFxuICAgICAgICAgICAgICAgICAgICogbWFrZXMgdGhhdCBidWRnZXQgc3BhbiByZWFsIHRpbWUgcmF0aGVyIHRoYW4gYmVpbmcgYnVybmVkIGluXG4gICAgICAgICAgICAgICAgICAgKiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmtub3duXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogeyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB8IHsgcmVpbnZva2VkOiBmYWxzZTsgZXJyb3I6IEVycm9yIH1cbiAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gKHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWludm9jYXRpb25zID0gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IG1heFJlaW52b2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiB3YXMgcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgJHttYXhSZWludm9jYXRpb25zfSByZS1pbnZvY2F0aW9ucyBvZiAke2dldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKCl9IGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnRzIGVhY2g6IHRoaXMgcnVuIGNhbm5vdCBvYnNlcnZlIGl0cyBvd24gZXZlbnQgbG9nIGNvbXBsZXRlbHkgZW5vdWdoIHRvIG1ha2UgcHJvZ3Jlc3MuIExhc3QgcmVqZWN0aW9uICgke3JlYXNvbn0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZSBhZnRlciBpbi1wcm9jZXNzIHJlc3RhcnRzOyByZS1pbnZva2luZyBydW4gZm9yIGEgZnJlc2ggcmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVpbnZvY2F0aW9ucyc6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkLCB1bmxpa2UgdGhlIG90aGVyIHJlaW52b2tlKCkgY2FsbGVyczogdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVzdGFydHMgYWxyZWFkeSByZWxvYWRlZCB0aGUgbG9nIHNldmVyYWwgdGltZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBjYXRjaGluZyB1cCwgc28gdGhlIHdyaXRlcnMgdGhpcyByZXBsYXkgaXMgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUuIFJldHJ5aW5nIGluc3RhbnRseSBqdXN0IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybiDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogYmdSdW4uc3RhdHVzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnU3RhcnRlZEF0ID0gYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA/ICtiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmcgZm9yIGEgYmFja2dyb3VuZGVkIHN0ZXAuIGBtZXRhZGF0YS5hdHRlbXB0YFxuICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgcXVldWUgZGVsaXZlcnkgY291bnQpIGlzIGEgY2hlYXAgdXBwZXIgYm91bmQsIGJ1dCBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXItY291bnRzOiBhIFRocm90dGxlRXJyb3IgLyBUb29FYXJseUVycm9yIOKAlCBvciBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5IHRoYXQgbmV2ZXIgcmFuIHRoZSBib2R5IOKAlCBzdGlsbCBhZHZhbmNlcyBpdCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyBpdCBkaXJlY3RseSBjb3VsZCBmYWlsIGEgc3RlcCBhcyBcImV4Y2VlZGVkIG1heFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXNcIiBiZWZvcmUgdGhlIGJvZHkgZXZlciByYW4gKGEgdXNlci12aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVncmVzc2lvbiB1bmRlciB0cmFuc2llbnQgYmFja2VuZCBwcmVzc3VyZSkuIFVzZSBpdCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBmYXN0IGdhdGU6IHdoaWxlIGl0IGlzIGF0IG9yIHVuZGVyIHRoZSBjZWlsaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgY2Fubm90IGJlIGV4aGF1c3RlZCwgc28gcHJvY2VlZCB3aXRob3V0IHRvdWNoaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZy4gT25seSBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgZG8gd2UgbG9hZCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZyBhbmQgZGVyaXZlIHRoZSBhdXRob3JpdGF0aXZlIGF0dGVtcHQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmRlZCBgc3RlcF9zdGFydGVkYCBjb3VudCDigJQgc2NvcGVkIHRvIHRoZSBsaWZlY3ljbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvdGFsIChiYXJlIHN0YXJ0cyBwbHVzIHRoZSBsYXJnZXN0IHNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyJ3Mgc3RhcnRzKTogdGhyb3R0bGUvdG9vLWVhcmx5IHJlZGVsaXZlcmllcyB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0YXJ0IGF0IGFsbCwgcmFjaW5nIGludm9jYXRpb25zJyBvbmUtb2ZmIHN0YW1wZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGVzIGRvbid0IGFjY3VtdWxhdGUgKGNvdW50aW5nIHRoZW0gZmFsc2VseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aGF1c3RlZCBoZWFsdGh5IHN0ZXBzIOKAlCBzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGF0dGVtcHRzIGJ1cm5lZCB1bmRlciBhIHByaW9yIGlubGluZS1vd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBzdGlsbCBjb3VudCwgc28gYSBzdGVwIHRoYXQgdGltZXMgb3V0IHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQgcmVjb3ZlcnkgYW5kIHRoZW4gdHJhbnNpdGlvbnMgdG8gcXVldWVkL2JhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzIHRyaXBzIHRoZSBjb21iaW5lZCBjZWlsaW5nLiBUaGlzIHN0aWxsIGJvdW5kc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRzLCB3aGljaCB3cml0ZSBubyBlcnJvciBmb3IgdGhlIHBvc3QtYm9keSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoLiBUaGUgbG9hZCBhbHNvIHByaW1lcyB0aGUgcmVwbGF5J3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgY2FjaGVkRXZlbnRzYC9gZXZlbnRzQ3Vyc29yYCAodGhlIHBvc3Qtc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBiZWxvdyByZWZyZXNoZXMgdGhlbSBvbmNlIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBsYW5kcykuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPSBtZXRhZGF0YS5hdHRlbXB0O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnTWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGVwRnVuY3Rpb24oaW5jb21pbmdTdGVwTmFtZSk/Lm1heFJldHJpZXMgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IGJnTWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKGNhY2hlZEV2ZW50cywgaW5jb21pbmdTdGVwSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndG90YWxBdHRlbXB0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldCB3aGlsZSB0aGUgc3RlcCBib2R5IHJ1bnMg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFNlZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXlCdWRnZXQgZG9jcyBmb3IgdGhlIGNvbnRyYWN0LlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPj47XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZS1mbGlnaHQ6IGEgZGVsYXllZCBiYWNrc3RvcCAob3IgcmV0cnkpIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBhcnJpdmUgd2hpbGUgYW5vdGhlciBleGVjdXRpb24gb2YgdGhpcyBzYW1lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG1pZC1ib2R5IGluIHRoaXMgcHJvY2VzcyDigJQgbW9zdCBpbXBvcnRhbnRseSBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggbm8gaW52b2NhdGlvbiBraWxsIGJvdW5kICh3b3JsZC1sb2NhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSB0aGUgb3duZXJzaGlwIGxlYXNlIGlzIG5vdCBhIGRlYXRoIHByb29mLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc2VyIGF3YWl0cyB0aGUgd2lubmVyJ3Mgc2V0dGxlbWVudCwgdGhlbiBhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGV4ZWN1dGluZy4gTm8gb3duZXJNZXNzYWdlSWQgaGVyZTogdGhlIGJhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBvZiBhIHF1ZXVlLWRyaXZlbiBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgY2xlYXJzIGlubGluZSBvd25lcnNoaXAgKHRoZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZS1vd25lZCBmcm9tIHRoaXMgcG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IHJ1blN0ZXBTaW5nbGVGbGlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IGJnUnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBiZ1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShiZ1J1bi5hdHRyaWJ1dGVzLCBydW5JZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogYmdSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSBjZWlsaW5nOiB0aGUgcXVldWUgZGVsaXZlcnkgY291bnQgYXMgYSBmYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXRlLCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyAoc2VlIGFib3ZlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtIOKAlCBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzdGVwQ3JlYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBUZXJtaW5hbElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1N0ZXBJZHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwZW5kaW5nIHN0ZXAgdGhhdCBUSElTIG1lc3NhZ2UgaW5saW5lLW93bnMgKGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIHN0YW1wZWQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBhbmQgdGhlbiBjcmFzaGVkIG1pZC1ib2R5KSBtdXN0IGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJlZCBoZXJlOiBvbmx5IHRoZSBvd25pbmcgbWVzc2FnZSBtYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZXhlY3V0ZSBpdCBiZWZvcmUgdGhlIG93bmVyc2hpcCBsZWFzZSBleHBpcmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2FrZSByZXBsYXlzIG1lcmVseSBlbnN1cmUgYSBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLiBGYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gbG9vcCwgd2hvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggdGFibGUgcm91dGVzIGl0IHRvIG93bmVkIHJlY292ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmU7IGZhbGxpbmcgdGhyb3VnaCB0byByZWNvdmVyIGFuIGlubGluZSBzdGVwIG93bmVkIGJ5IHRoaXMgbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHN0ZXBzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmUg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudCA9IGNhY2hlZEV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlJbnB1dDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5DcmVhdGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBydW5DcmVhdGVkRXZlbnQuZXZlbnREYXRhLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVNwZWNWZXJzaW9uKGJnUnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInJ1bl9jcmVhdGVkXCIgZXZlbnRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdhY3kgcnVucyBwcmVkYXRlIHRoZSBldmVudC1zb3VyY2VkIHJ1bl9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFyaWFudCwgc28gcmV0YWluIHRoZSByZXNvbHZlZCBHRVQgb25seSBmb3IgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVnYWN5UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVnYWN5UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gbGVnYWN5UnVuLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJnUnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcmVwbGF5SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkRXZlbnRzIGFuZCBldmVudHNDdXJzb3IgYWxyZWFkeSBzZXQgZnJvbSBsb2FkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBlcnJvciB3aGlsZSBwcmVwYXJpbmcgYmFja2dyb3VuZCB3b3JrZmxvdyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKS5cbiAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgcnVuX3N0YXJ0ZWQgZGlyZWN0bHkg4oCUIHRoaXMgYm90aCB0cmFuc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHRvICdydW5uaW5nJyBBTkQgcmV0dXJucyB0aGUgcnVuIGVudGl0eSwgc2F2aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgc2VwYXJhdGUgcnVucy5nZXQgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJhY3Q6IGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJykgbXVzdCBiZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBydW5zIGFscmVhZHkgaW4gJ3J1bm5pbmcnIHN0YXR1cyAocmV0dXJuIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBlcnJvciksIG5vdCBqdXN0IGZvciBwZW5kaW5nIOKGkiBydW5uaW5nIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5TdGFydGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX3N0YXJ0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3BlYyB2ZXJzaW9uIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0KCkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYXZhaWxhYmxlLCBzbyB0aGUgcmVzaWxpZW50IHN0YXJ0IHBhdGggY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9uIChub3QgYWx3YXlzIGN1cnJlbnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ/LnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgcnVuIGlucHV0IGZyb20gcXVldWUgc28gdGhlIHNlcnZlciBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJ1biBpZiBydW5fY3JlYXRlZCB3YXMgbWlzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVpbnQ4QXJyYXkgdmFsdWVzIHN1cnZpdmUgdGhlIHF1ZXVlIG5hdGl2ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKENCT1Igb24gd29ybGQtdmVyY2VsLCBKU09OIHJldml2ZXIgb24gd29ybGQtbG9jYWwpLlxuICAgICAgICAgICAgICAgICAgICAgIC4uLihydW5JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydCA9IChcbiAgICAgICAgICAgICAgICAgICAgICBza2lwUHJlbG9hZDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHNraXBQcmVsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dXJibyAmJiBydW5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBiYWNrZ3JvdW5kIGBydW5fc3RhcnRlZGAgYW5kIHN5bnRoZXNpemUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGl0eSBsb2NhbGx5IHNvIHJlcGxheSBjYW4gYmVnaW4gd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZC10cmlwLiBTYWZlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uIOKAlCBzdGFydCgpIGNyZWF0ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG1vbWVudHMgYWdvIGFuZCBubyBldmVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyIGlzIGNvbnN1bWVkIGJ5IGV2ZXJ5IGRvd25zdHJlYW0gd3JpdGUgKHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyLCBvcHRpbWlzdGljIHN0ZXBfc3RhcnRlZCwgdGVybWluYWwgcnVuIHdyaXRlcykgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmFja2dyb3VuZCB0aGlzIHB1cmVseSBhcyBhIHdyaXRlIGJhcnJpZXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFkIGl0cyBwcmVsb2FkZWQgZXZlbnRzIChwcmVsb2FkZWRFdmVudHMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCB0byBbXSBiZWxvdyksIHNvIHRlbGwgdGhlIFdvcmxkIHRvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIGJhY2tncm91bmRzIHJ1bl9zdGFydGVkLCBzbyB0aGUgbm9uLXR1cmJvIGFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyBuZXZlciBydW5zIOKAlCB0aHJlYWQgdGhlIHBlci1ydW4gZXZlbnQgY2VpbGluZyBvZmYgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJlc3BvbnNlIGhlcmUgaW5zdGVhZC4gVGhlIGd1YXJkIHJlLWNoZWNrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heEV2ZW50c0xpbWl0IGV2ZXJ5IGxvb3AgaXRlcmF0aW9uLCBzbyBhIHZhbHVlIHRoYXQgbGFuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGx5IGFmdGVyIHN0YXJ0IHN0aWxsIGVuZm9yY2VzIHdlbGwgYmVmb3JlIGEgcnVuYXdheVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBhcHByb2FjaGVzIHRoZSBjZWlsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRQcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHI/Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkKSBtYXhFdmVudHNMaW1pdCA9IGxpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYSBuby1vcCByZWplY3Rpb24gaGFuZGxlciBzbyBhbiBlYXJseSBmYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgc3VyZmFjZXMgYXMgYW4gdW5oYW5kbGVkUmVqZWN0aW9uIGJlZm9yZSBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGF3YWl0L3RoZW4pIGlzIGF0dGFjaGVkOyBjb25zdW1lcnMgc3RpbGwgb2JzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdDogbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyB5ZXQgb24gYSBmaXJzdCBkZWxpdmVyeSAocnVuX3N0YXJ0ZWQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQpLiBBbiBlbXB0eSBwcmVsb2FkZWQgc2V0IHJvdXRlcyBpdGVyYXRpb24gMSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vLWxvYWQgcHJlbG9hZGVkIGJyYW5jaDsgaXRlcmF0aW9uIDIgdGhlbiB0YWtlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwb3N0LXByZWxvYWRlZCBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKG5vIHNwdXJpb3VzIFwiY3Vyc29yIG1pc3NpbmdcIiB3YXJuaW5nKS4gYFtdYCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgdHJ1dGh5IGhlcmUg4oCUIGRvIG5vdCBjaGFuZ2UgdGhlIGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBicmFuY2hlcycgYGlmIChwcmVsb2FkZWRFdmVudHMpYCBjaGVja3MgdG8gdGVzdCBsZW5ndGguXG4gICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IHJ1bklucHV0LnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZWQgYXR0cmlidXRlcyBmcm9tIHN0YXJ0KCkgcmlkZSBhbG9uZyBpbiBgcnVuSW5wdXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhleSBsaXZlIGluIGBydW5fY3JlYXRlZGAncyBldmVudERhdGEsIG5vdCBzZXBhcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGF0dHJfc2V0YCBldmVudHMpLCBzbyB0aGUgc3ludGhlc2l6ZWQgc25hcHNob3QgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBldmVuIHRob3VnaCB3ZSBza2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBjb3JyZWN0IE9OTFkgd2hpbGUgYXR0cmlidXRlcyBhcmUgd3JpdGUtb25seTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGluLXdvcmtmbG93IHJlYWQgQVBJIHRvZGF5IChzZWUgd29ya2Zsb3cudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwic3RydWN0dXJhbCB1bnRpbCBhIHJlYWQgQVBJIGlzIGludHJvZHVjZWRcIiksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgcHJlbG9hZGVkIGxvZyBjYW4ndCBkaXZlcmdlIG9uIGEgcmVhZC4gSWYgYSByZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgaXMgZXZlciBhZGRlZCBpdCBNVVNUIHJlYWQgZnJvbSB0aGlzIHNuYXBzaG90LCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHJlcGxheWluZyBydW5fY3JlYXRlZC9hdHRyX3NldCBldmVudHMg4oCUIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8ncyBlbXB0eSBpbml0aWFsIGxvZyB3b3VsZCBzdXJmYWNlIHNlZWQgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYHt9YCBvbiB0aGUgZmlyc3QgZGVsaXZlcnkgb25seS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtub3c7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHRoZSBgcnVuU3RhcnRlZFJlY2VpdmVkQXRNc2AgZGVjbGFyYXRpb24gYWJvdmU6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gc3ludGhlc2l6ZXMgdGhlIHJ1biBiZWZvcmUgdGhlIHJlYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIGxhbmRzLCBzbyBhbmNob3IgUlNGUyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgYW4gYWN0dWFsIHJlc3BvbnNlIGluc3RhbnQuXG4gICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9ICtub3c7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ3J1bm5pbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChydW5TdGFydGVkRXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiBmb3IgJ3J1bl9zdGFydGVkJyBkaWQgbm90IHJldHVybiB0aGUgcnVuIGVudGl0eSBmb3IgcnVuIFwiJHtydW5JZH1cImBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMg4oCUIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGV2ZW50cywgdXNlIHRoZW0gdG8gc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QgY2FsbCBhbmQgcmVkdWNlIFRURkIuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID0gcmVzdWx0LmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bi5zdGFydGVkQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3dSdW4uc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgYGNhbmNlbGAsIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJvcGFnYXRlIGEgV29ya2Zsb3dDYW5jZWxsZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dCBzbyB0aGUgdXNlciBjYW4gZ3JhY2VmdWxseSBleGl0LiB0aGlzIGlzIFNJR1RFUk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGFjdHVhbGx5IGV4aXQgaGVyZSB3aXRob3V0IHJlcGxheWluZyB0aGUgd29ya2Zsb3cgYXQgYWxsLCBpbiB0aGUgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheWluZyB0aGUgd29ya2Zsb3cgaXMgaXRzZWxmIGZhaWxpbmcuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG5cbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaG9vayByZXN1bWU6IHRoZSBwcm9kdWNlciAocmVzdW1lSG9vayBmYXN0IHBhdGgpXG4gICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbGl6ZWQgdGhlIGBob29rX3JlY2VpdmVkYCB3cml0ZSB3aXRoIHRoaXMgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIHB1Ymxpc2gsIHNvIHRoZSBldmVudCBtYXkgbm90IGJlIHBlcnNpc3RlZCB5ZXQuIElkZW1wb3RlbnRseVxuICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIGl0IGJlZm9yZSByZXBsYXkg4oCUIGtleWVkIGJ5IGByZXN1bWVJZGAgc28gYVxuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwcm9kdWNlciB3cml0ZSBjb252ZXJnZXMgb24gZXhhY3RseSBvbmUgZXZlbnRcbiAgICAgICAgICAgICAgICAgIC8vICh0aGUgc2VydmVyIHJlc29sdmVzIGEgbWF0Y2hpbmcgY2xhaW0gYXMgc3VjY2Vzcywgbm90IGFuXG4gICAgICAgICAgICAgICAgICAvLyBlcnJvcikuIGBob29rSW5wdXRgIG5ldmVyIHJpZGVzIGEgdHVyYm8gZmlyc3QtZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vICh0aGF0IHBhdGggY2FycmllcyBgcnVuSW5wdXRgLCBub3QgYGhvb2tJbnB1dGApLCBzbyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IHJ1bnMgb24gdGhlIG5vcm1hbCBsb2FkLWFuZC1yZXBsYXkgcGF0aC5cbiAgICAgICAgICAgICAgICAgIGlmIChob29rSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyZiAoT3B0aW9uIEEpOiBpZiB0aGUgcHJvZHVjZXIncyBjb25jdXJyZW50IGRpcmVjdFxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbHJlYWR5IGxhbmRlZCBpbiB0aGUgcnVuX3N0YXJ0ZWQgcHJlbG9hZCwgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBldmVudCBpcyBpbiB0aGUgbG9nIGFuZCB0aGUgcmUtZW5zdXJlIHJvdW5kIHRyaXBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHVyZSBvdmVyaGVhZC4gU2tpcCBpdCB3aGVuIHRoZSBwcmVsb2FkIGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGBob29rX3JlY2VpdmVkYCB3aXRoIHRoaXMgcmVzdW1lJ3MgcGVyc2lzdGVkIGByZXN1bWVJZGBcbiAgICAgICAgICAgICAgICAgICAgLy8gKHVuaXF1ZSBwZXIgcmVzdW1lLCBzbyB3ZSBuZXZlciBza2lwIG9uIGFuIHVucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkKS4gQmVzdC1lZmZvcnQ6IHRoZSB3aW4gbGFuZHMgb25seSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcidzIHdyaXRlIGJlYXQgdGhpcyBjb25zdW1lcidzIGxvYWQ7IG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGlkZW1wb3RlbnQgcmUtZW5zdXJlIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5UHJlbG9hZGVkID1cbiAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cz8uc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nIOKAlCBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgc2ltcGx5IGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQg4oCUIHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUg4oCUIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlIOKAlCB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciAocHJlbG9hZGVkRXZlbnRzIGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc29ydE9yZGVyOiAnYXNjJ2AgYW5kIGFyZSBub3QgcmUtc29ydGVkIGNsaWVudC1zaWRlKSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpZGVtcG90ZW50IGV2ZW4gaWYgYSBsYXRlciBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgV29ybGQgcmV0dXJucyBubyBldmVudCAob2xkZXIgYmFja2VuZCkgZG8gd2UgZmFsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gZHJvcHBpbmcgdGhlIHByZWxvYWQgc28gYSBmcmVzaCBsaXN0IG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChwcmVsb2FkZWRFdmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKHJlLWVuc3VyZSBuZWVkZWQpXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bidzIGRlcGxveW1lbnQuXG4gICAgICAgICAgICAgICAgICAvLyBVc2VkIGVhZ2VybHkgaGVyZSBzaW5jZSBib3RoIHJ1bldvcmtmbG93IChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgVk0taW5kZXBlbmRlbnQgcHJlcGFyZWQgcGF5bG9hZHNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbW11dGFibGUgZmluYWwgdmFsdWVzLiBJdCBzdXJ2aXZlcyB0aGUgZnJlc2ggd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgIC8vIFZNIGNyZWF0ZWQgYnkgZWFjaCBpbmxpbmUgcmVwbGF5LCBidXQgbmV2ZXIgY3Jvc3NlcyBydW5zIG9yXG4gICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3Mvbm9Db25zdGFudENvbmRpdGlvbjogaW50ZW50aW9uYWwgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT24gVmVyY2VsLCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQgYWx3YXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgdGhlIHByb2Nlc3MuIE9uIGxvY2FsIGRldiBpdCByZXR1cm5zOyB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgdGhlIHJlcXVlc3QgZW5kcyBub3JtYWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fZmFpbGVkIGhhcyBiZWVuIHdyaXR0ZW4gYmVzdC1lZmZvcnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdWMiB0aW1lb3V0IHJlYWNoZWQsIHJlLXNjaGVkdWxpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3Vyc29yIG9mIHRoaXMgaXRlcmF0aW9uJ3MgZXZlbnQgbG9nIGJlZm9yZSBhbnkgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBhZHZhbmNlIGl0IOKAlCBkZWNsYXJlZCBhdCB0cnkgc2NvcGUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gY2F0Y2ggKHdoaWNoIHJ1bnMgdGhlIGlubGluZSBzdGVwKSBjYW4gcmVhZCBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgYHNpbmNlQ3Vyc29yYCBmb3IgdGhlIGlubGluZS1kZWx0YSBvcHRpbWl6YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVJbmxpbmVXcml0ZUN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMg4oCUIHVzZSBjYWNoZWQgZXZlbnRzIHdpdGggaW5jcmVtZW50YWwgZmV0Y2ggb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgYSBjdXJzb3Igd2hlbiB0aGVyZSBhcmUgZXZlbnRzIChldmVuIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhZ2UpLCBzbyB3ZSBjYW4gcmVsaWFibHkgdXNlIGl0IGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJbmxpbmVEZWx0YSAmJiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogdGhlIHByZXZpb3VzIGl0ZXJhdGlvbidzIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCB0aGUgYXV0aG9yaXRhdGl2ZSBldmVudC1sb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGUgY3Vyc29yLCBzbyB3ZSBjb25zdW1lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWx0YSBpcyBieXRlLWZvci1ieXRlIHdoYXQgZXZlbnRzLmxpc3QoY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgaGF2ZSByZXR1cm5lZCBhdCB3cml0ZSB0aW1lIOKAlCBpdCBpbmNsdWRlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3Mgb3duIHN0ZXAgZXZlbnRzLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXAgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkKSBhbm90aGVyIHdyaXRlciBhcHBlbmRlZCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciDigJQgc28gc2tpcHBpbmcgdGhlIGZldGNoIGNhbm5vdCBkcm9wIGV2ZW50cyBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tldyB0aGUgcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGVuZGluZ0lubGluZURlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhjYWNoZWRFdmVudHMsIGRlbHRhLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBkZWx0YS5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkRXZlbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBpdGVyYXRpb246IHVzZSBwcmVsb2FkZWQgZXZlbnRzIGlmIGF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBkbyBhIGZ1bGwgbG9hZCB3aXRoIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgaXRlcmF0aW9uOiBmZXRjaCBvbmx5IG5ldyBldmVudHMgc2luY2UgbGFzdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZHVwZSBieSBldmVudElkOiBhIHByZXZpb3VzIGl0ZXJhdGlvbiBtYXkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kZWQgYSByZWZyZXNoZWQgd2FpdC1jb21wbGV0aW9uIGRlbHRhIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbG9vcCBvYnNlcnZlcyB0aGUgYWR2YW5jZWQgY3Vyc29yLCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgZmV0Y2ggY2FuIHJldHVybiBldmVudHMgd2UgYWxyZWFkeSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGNhY2hlZEV2ZW50cywgbG9hZGVkLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uIDIgYWZ0ZXIgaXRlcmF0aW9uIDEgdXNlZCBwcmVsb2FkZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggZG9uJ3QgY2FycnkgYSBjdXJzb3IpLiBEbyBhIGZ1bGwgbG9hZCBub3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW55IGV2ZW50cyB3cml0dGVuIHNpbmNlIHRoZSBwcmVsb2FkZWQgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb2J0YWluIGEgY3Vyc29yIGZvciBzdWJzZXF1ZW50IGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcy4gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcGF0aCwgbm90IGEgYnVnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1cnNvciBhZnRlciBwcmVsb2FkZWQtZXZlbnRzIGZpcnN0IGl0ZXJhdGlvbjsgZG9pbmcgZnVsbCByZWxvYWQgdG8gcGljayB1cCBjdXJzb3IuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjdXJzb3IgYXZhaWxhYmxlIGRlc3BpdGUgaGF2aW5nIGNhY2hlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBwcmVsb2FkZWQtZXZlbnRzIGV4cGxhbmF0aW9uLiBBbGwgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcmV0dXJuIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSBldmVudHMsIHNvIHRoaXMgc2lnbmFscyBhIGJ1ZyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkLiBGYWxsIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciBtaXNzaW5nIGFmdGVyIGluaXRpYWwgbG9hZCDigJQgZmFsbGluZyBiYWNrIHRvIGZ1bGwgcmVsb2FkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIFdvcmxkIGltcGxlbWVudGF0aW9uLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaXNoIHRoZSBzbmFwc2hvdCB0byB0aGUgbG9vcC1zY29wZWQgY2FjaGUgYXMgc29vblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGlzIGxvYWRlZCwgbm90IGp1c3QgYXQgdGhlIGVuZCBvZiB0aGUgaXRlcmF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRocm93biBieSB0aGUgd2FpdC1jb21wbGV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGJlbG93IHJlc3RhcnRzIHRoZSByZXBsYXksIGFuZCB0aGF0IHJlc3RhcnQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb25zdW1lIGEgV29ybGQtYXR0YWNoZWQgZXZlbnQgZGVsdGEgd2hlbiB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY2FjaGVkIGFycmF5IHRvIG1lcmdlIGl0IGludG8uIFJlYXNzaWduZWQgYWdhaW4gYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBwYXNzLCB3aGljaCBtYXkgc3dhcCBpbiBhIGZyZXNobHkgbG9hZGVkIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGV2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoZXZlbnRzLCBldmVudHNDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0c1RvQ29tcGxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLiBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yIHNvIGNvbmN1cnJlbnQgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsIGtlZXAgdGhlaXIgb3JkZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsIGJhY2sgdG8gYSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdCBnaXZlIHVzIGEgc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdCBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMoZXZlbnRzLCBsb2FkZWQuZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW5nIGVsYXBzZWQgd2FpdHMgcmVmcmVzaGVzIHRoZSBldmVudCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBtYXkgaGF2ZSB3cml0dGVuIHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBhZnRlciB0aGUgaW5pdGlhbCBzbmFwc2hvdCBidXQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIE9uY2UgdGhlIGV2ZW50IGxvZyByZWNvcmRzIHRoYXQgb3V0Y29tZSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlcyB0aGUgc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcgKHVuZGVmaW5lZCDih5Igbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbmZvcmNlbWVudCkuIFRoZSB0aHJvdyBpcyBjYXVnaHQgYmVsb3cgYW5kIHdyaXR0ZW4gYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fZmFpbGVkIC8gTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHJlZmVyZW5jZSAobWF5IGhhdmUgYmVlbiBzZXQgZm9yIGZpcnN0IHRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBjdXJzb3IgYXMgaXQgc3RhbmRzIGZvciB0aGlzIGl0ZXJhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nLCBiZWZvcmUgYW55IGlubGluZSB3cml0ZXMgKHN0ZXBfY3JlYXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVTdXNwZW5zaW9uLCBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXApIGFkdmFuY2UgaXQuIFRoaXMgaXMgdGhlIGBzaW5jZUN1cnNvcmBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gYSBzdXBwb3J0aW5nIFdvcmxkIG9uIHRoZSBpbmxpbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgc28gaXQgY2FuIHJldHVybiB0aGUgZXZlbnQtbG9nIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG5leHQgaXRlcmF0aW9uIHNraXAgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QuIENhcHR1cmVkIGhlcmUgYmVjYXVzZSBub3RoaW5nIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGFuZCB0aGUgaW5saW5lIGV4ZWN1dGVTdGVwIG11dGF0ZXMgZXZlbnRzQ3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yID0gZXZlbnRzQ3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5IHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFZNIHNldHVwLiBXZWIgQ3J5cHRvIHdvcmsgY2FuIG92ZXJsYXAgYnVuZGxlIGV2YWx1YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHN0aWxsIGRlc2VyaWFsaXplIGFuZCByZXNvbHZlIGluIGV2ZW50IG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWRQcmV3YXJtID0gcmVwbGF5UGF5bG9hZENhY2hlLnByZXdhcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogdGhlIGVuZC1vZi1ydW4gZHJhaW4gaW5zaWRlIHJ1bldvcmtmbG93IGNvbW1pdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYCBldmVudHMgYmVmb3JlIHRoZSB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3csIHNvIGdhdGUgdGhvc2Ugd3JpdGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHRvby4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBheWxvYWRQcmV3YXJtO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHJlcGxheSBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZC4gU2VuZCB0aGUgc25hcHNob3QgYnV0IGRvIE5PVFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZC1hbmQtcmV0cnkgdGhlIGNyZWF0ZSBpbiBwbGFjZTogYHJlc3VsdGAgd2FzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgYnkgdGhpcyByZXBsYXksIHNvIGEgc3RhbGUgKDQxMikgcmVqZWN0aW9uIG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBhICpmcmVzaCByZXBsYXkqICh3aGljaCBtYXkgb2JzZXJ2ZSB0aGUgbmV3IGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHByb2R1Y2UgYSBkaWZmZXJlbnQgcmVzdWx0KSwgbm90IHJlLWNvbW1pdCB0aGUgc3RhbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQuIFRoZSBjYXRjaCBiZWxvdyByZXN0YXJ0cyB0aGUgcmVwbGF5IGluLXByb2Nlc3MuXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBhIHdvcmtmbG93IHRoYXQgZmluaXNoZXMgd2l0aCBubyBzdGVwcyByZWFjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGJlZm9yZSB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkOyBvcmRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIGFmdGVyIGl0IHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7IG91dHB1dDogcmVzdWx0IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoZXZlbnRzLCBldmVudHNDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbm91cyBgcnVuV29ya2Zsb3dgIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHkg4oCUIGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIiDigJQgcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkg4oCUIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNuYXBzaG90IHJlZnJlc2ggYWJvdmUgYWx3YXlzIHNldHMgY2FjaGVkRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlcGxheSBjYW4gc3VzcGVuZC4gUmUtbmFycm93IGl0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBzY29wZSBpbnN0ZWFkIG9mIGRlZmF1bHRpbmcgdG8gYW4gZW1wdHkgYXJyYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGZhbGxiYWNrIHdvdWxkIHNpbGVudGx5IGRpc2FybSB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBndWFyZCAobm8gc25hcHNob3Qgc2VudCkgYW5kIGxldCBhIG1pZC1zdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgbWVyZ2UgaW50byBhIHRocm93YXdheSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogd29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTG9nOiBMb2FkZWRFdmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRzQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZzogc3VzcGVuc2lvbkxvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBzdXNwZW5zaW9uTG9nLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zICs9IHN1c3BlbnNpb25SZXN1bHQuaG9va0NyZWF0aW9uTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID0gcHJlU3RlcEJsb2NraW5nTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdXNwZW5zaW9uIGhhbmRsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uTXM6IERhdGUubm93KCkgLSBzdXNwZW5zaW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwczogc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kczogc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dD8uc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F0dHJpYnV0ZUV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIGNvbmZsaWN0OiBicmVhayBsb29wLCByZS1pbnZva2UgdmlhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyBhcmUgcmVzb2x2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggcmVwbGF5OiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiByZWxvYWRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIChub3cgaG9sZGluZyB0aGUganVzdC1jb21taXR0ZWQgYXR0cl9zZXQpIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cywgcmVzb2x2aW5nIHRoZSBzZXRBdHRyaWJ1dGVzIHByb21pc2UuIFNraXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcHJvY2Vzc2luZyBmb3IgdGhpcyBwYXNzIHNvIHRoYXQgcmVwbGF5IGRlY2lkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhY2VzIGZpcnN0IOKAlCBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAoKV0pLCB0aGUgZHVyYWJsZSBhdHRyaWJ1dGUgZXZlbnQgbXVzdCBiZSBhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB3aW4gd2l0aG91dCBleGVjdXRpbmcgdGhlIGxvc2luZyBzdGVwLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXBwZW5zIGluLXByb2Nlc3MgcmF0aGVyIHRoYW4gdmlhIGEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHVubGlrZSBob29rcyBhbmQgd2FpdHMsIGFuIGF0dHJfc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRyb2R1Y2VzIG5vIG91dC1vZi1iYW5kIGludm9jYXRpb24gc291cmNlIHRoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHdvdWxkIG5lZWQgdG8geWllbGQgdGhlIG1lc3NhZ2UgZm9yLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF5aW5nIGEgZGVsaXZlcnkgcm91bmQtdHJpcCBoZXJlIHdvdWxkIG9ubHkgYWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IGJlZm9yZSB0aGUgd29ya2Zsb3cncyBuZXh0IHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwcyA9IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXhlY3V0aW9uIGlzIGdhdGVkIG9uIG93bmVyc2hpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHRvIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyAoYGxhenlJbmxpbmVTdGVwc2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcnVuIHRoZW0gaW5saW5lIOKAlCBpbiBwYXJhbGxlbCDigJQgdmlhIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyB0aGF0IGNyZWF0ZSBlYWNoIHN0ZXAgb24gdGhlIGZseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgYXRvbWljIGFuZCBleGFjdGx5LW9uZSBwZXIgc3RlcDogdGhlIHdvcmxkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBzdGVwX3N0YXJ0ZWQgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICjihpIgZXhlY3V0ZVN0ZXAgYHNraXBwZWRgKSB0byBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgbG9zZXIsIHNvIG9ubHkgb25lIGhhbmRsZXIgZXZlciBydW5zIGEgZ2l2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkuIEV2ZXJ5IG90aGVyIHBlbmRpbmcgc3RlcCBrZWVwcyBpdHMgZWFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCAoaW4gYGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBhbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIG9ubHkgZGVzaWduYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhenlJbmxpbmVTdGVwc2Agd2hlbiBubyBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwcmVzZW50LiBUaGF0IGF3YWl0ZXIgY2FzZSBtdXN0IGV4ZWN1dGUgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lOiBhbiBpbmxpbmUgYGF3YWl0IGV4ZWN1dGVTdGVwKC4uLilgIGJsb2NrcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLCBzbyB0aGUgYXdhaXRlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gKHdoaWNoIG9ubHkgYWR2YW5jZXMgb24gdGhlIG5leHQgcmVwbGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgc2VyaWFsaXplZCBiZWhpbmQgdGhlIHN0ZXAg4oCUIGRlZmVhdGluZyB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ya2Zsb3cgZXhwcmVzc2VkIGFzIHBhcmFsbGVsIChlLmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgaG9vay5nZXRDb25mbGljdCgpLnRoZW4oKCkgPT4gc3RlcEIoKSlgIHJhY2luZyBgYXdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBBKClgKS4gSW4gdGhhdCBjYXNlIGBsYXp5SW5saW5lU3RlcHNgIGlzIGVtcHR5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgc3RlcCBpcyBxdWV1ZWQgZm9yIHJlLWludm9jYXRpb24sIHdoaWNoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyIHdoaWxlIHF1ZXVlZCBzdGVwcyBydW4gaW4gcGFyYWxsZWwgaW52b2NhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5SW5saW5lU3RlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmxhenlJbmxpbmVTdGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZmllZCBxdWV1ZSBkaXNwYXRjaCBmb3IgZXZlcnl0aGluZyB3ZSBhcmUgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUtZXhlY3V0aW5nLiBTdGVwcyBhcmUgcXVldWVkIHdpdGggc3RlcElkIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIgcnVucyB0aGVtOyB0aGUgd2FpdCB0aW1lciBpcyBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZ2VuZXJpYyBjb250aW51YXRpb24gdGhhdCBmaXJlcyBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZWxhcHNlcyBhbmQgbGV0cyB0aGUgbmV4dCByZXBsYXkgb2JzZXJ2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCB2aWEgdGhlIFwiY29tcGxldGUgZWxhcHNlZCB3YWl0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgZGlzcGF0Y2ggZGVjaXNpb24gdGFibGUgKHBlciBwZW5kaW5nIHN0ZXAgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNpZ25hdGVkIGxhenktaW5saW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciA9PT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBleGVjdXRlIGluIFRISVMgaW52b2NhdGlvbiAob3duZWQgcmVjb3Zlcnk6IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmcgbWVzc2FnZSByZS1leGVjdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIGl0IGNyYXNoZWQgb24sIHZpYSBhIHBheWxvYWQtbGVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHN0ZXBfc3RhcnRlZCByZS1zdGFtcGVkIHdpdGggaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3duZXJNZXNzYWdlSWQg4oCUIG5vdCBhIGJhcmUgc3RhcnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgIT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZW5zdXJlIGEgREVMQVlFRCBiYWNrc3RvcCB3YWtlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChkZWxheVNlY29uZHMgPSBvd25lcnNoaXAgbGVhc2UgcmVtYWluaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGluc3RlYWQgb2YgZW5xdWV1ZWluZyB0aGUgc3RlcC4gVGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGludm9jYXRpb24gaXMgKGxpa2VseSkgc3RpbGwgcnVubmluZyB0aGUgYm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhbiBpbW1lZGlhdGUgc3RlcCBtZXNzYWdlIHdvdWxkIGJhcmUtc3RhcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcnVubmluZyBzdGVwIGFuZCBleGVjdXRlIGl0IGEgc2Vjb25kIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAod29ya2Zsb3cjMjc4MCkuIFRoZSBiYWNrc3RvcCBpcyBhIHBsYWluIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnRpbnVhdGlvbiwgTk9UIGEgc3RlcCBtZXNzYWdlOiB3aGVuIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZmlyZXMsIHRoaXMgc2FtZSBkZWNpc2lvbiB0YWJsZSBoYW5kbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgd2hhdGV2ZXIgc3RhdGUgdGhlIHN0ZXAgaXMgaW4gYnkgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh0ZXJtaW5hbCDihpIgbm90aGluZyBwZW5kaW5nOyBxdWV1ZS1vd25lZCBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHN0ZXBfcmV0cnlpbmcg4oaSIG5vcm1hbCBrZXllZCBkaXNwYXRjaDsgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkZWFkIHdpdGggbGVhc2UgZXhwaXJlZCDihpIgaW1tZWRpYXRlIGRpc3BhdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHByZXNlcnZpbmcgc3RlcC1sZXZlbCBmYWlsdXJlIHNlbWFudGljcyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwb2lzb24gc3RlcHM7IGxlYXNlIHJlZnJlc2hlZCBieSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlY292ZXJ5IOKGkiByZS1hcm0pLiBUaGUgYmFja3N0b3Anc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlkZW1wb3RlbmN5S2V5IGlzIHNjb3BlZCB0byB0aGUgb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgRVBPQ0ggKGxhdGVzdCBzdGVwX3N0YXJ0ZWQgdGltZXN0YW1wKSwgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAganVzdCB0aGUgY29ycmVsYXRpb24gSUQsIGFuZCBtdXN0IG5ldmVyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgbWVzc2FnZSdzIG93biBrZXkg4oCUIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkgZm9yIGJvdGggaW52YXJpYW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChmaXhlZCBrZXlzIGVpdGhlciBhYnNvcmIgdGhlIHJldHJ5IGhhbmRvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvciBkZWR1cGUgdGhlIHJlZnJlc2hlZC1sZWFzZSByZS1hcm0gYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBpbi1mbGlnaHQgYmFja3N0b3AgaXRzZWxmKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBOb3Qgb3duZWQgKG5ldmVyIHN0YW1wZWQgLyBlYWdlciAvIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxhcHNlZCBhdCBzdGVwX3JldHJ5aW5nIC8gbGVhc2UgZXhwaXJlZCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAga2lsbC1zd2l0Y2hlZCkg4oaSIGltbWVkaWF0ZSBlbnF1ZXVlLCBleGFjdGx5IGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmVmb3JlLiBUaGlzIGNvdmVycyBjcmFzaCByZWNvdmVyeTogaWYgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIgd3JvdGUgc3RlcF9jcmVhdGVkIGJ1dCBjcmFzaGVkIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHF1ZXVlaW5nLCBhIGxhdGVyIGhhbmRsZXIgcXVldWVzIGl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlkZW1wb3RlbmN5S2V5IG9uIGNvcnJlbGF0aW9uSWQgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZU93bmVyc2hpcCA9IGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hOb3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZFJlY292ZXJ5U3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrc3RvcFdha2VzQXJtZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lcnNoaXBBY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU93bmVyc2hpcCAmJiBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLm93bmVyTWVzc2FnZUlkID09PSBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZWQgcmVjb3Zlcnk6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2U7IHJlLWV4ZWN1dGUgdGhlIHN0ZXAgaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gaW5zdGVhZCBvZiBxdWV1ZWluZyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMucHVzaChzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkIGJhY2tzdG9wIHdha2Ugd2hpbGUgYW5vdGhlciBpbnZvY2F0aW9uJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIGxlYXNlIGlzIGxpdmU7IGltbWVkaWF0ZSBzdGVwIGVucXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIChsZWFzZSBleHBpcmVkIOKHkiByZW1haW5pbmcgMCDih5Igc2FtZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RheSwgd2hpY2ggaXMgYWxzbyB0aGUgZGVncmFkZWQgbW9kZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggdW5zdGFibGUgbWVzc2FnZSBJRHMg4oCUIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhYm92ZSBuZXZlciBtYXRjaGVzIHRoZXJlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja3N0b3BEZWxheVNlY29uZHMgPSBvd25lcnNoaXBBY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMoc3RlcCwgZGlzcGF0Y2hOb3dNcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrc3RvcERlbGF5U2Vjb25kcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcgc3RlcCBpcyBpbmxpbmUtb3duZWQgYnkgYSBsaXZlIGludm9jYXRpb247IGVuc3VyaW5nIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZSByZXF1ZXVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogc3RlcC5vd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBiYWNrc3RvcElkZW1wb3RlbmN5S2V5KHN0ZXApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2V0IG9mIHN0ZXBzIFRISVMgaW52b2NhdGlvbiBleGVjdXRlczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlcnJlZCBsYXp5LWlubGluZSBiYXRjaCBwbHVzIGFueSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgKHRoaXMgbWVzc2FnZSdzIHJlZGVsaXZlcnkgcmUtZXhlY3V0aW5nIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgaXQgY3Jhc2hlZCBvbiDigJQgbm8gbGF6eVN0ZXBJbnB1dDsgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoeWRyYXRlcyBmcm9tIHRoZSBzdGVwIGVudGl0eSBsaWtlIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoLCBhbmQgdGhlIHBheWxvYWQtbGVzcyBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAg4oCUIHVubGlrZSB0aGUgYmFja2dyb3VuZCBwYXRoJ3Mgc3RhcnQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBiYXJlOiBpdCBjYXJyaWVzIHRoaXMgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lck1lc3NhZ2VJZCwgd2hpY2ggaXMgYWxzbyB3aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3ZlcnkgcmV0cnkgY2VpbGluZyBjb3VudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lRXhlY3V0aW9uczogQXJyYXk8e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ/OiAodHlwZW9mIGxhenlJbmxpbmVTdGVwcylbbnVtYmVyXVsnZGVoeWRyYXRlZElucHV0J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9PiA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3duZWRSZWNvdmVyeVN0ZXBzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgdGVsZW1ldHJ5IChkZXNpZ24gZG9jIFBoYXNlIDcpOiBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIHNvIHByb2R1Y3Rpb24gdHJhY2VzIHNob3cgd2hlbiBjcmFzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcnkgcmFuIG9yIGEgd2FrZSB3YXMgY29udmVydGVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AsIGFuZCBhIHdhcm4gKGFsd2F5cyBwcmludGVkLCB1bmxpa2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnL2luZm8pIGZvciBvd25lZCByZWNvdmVyeSDigJQgaXQgbWVhbnMgYSBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIGRpZWQgbWlkLXN0ZXAtYm9keS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dPd25lZFJlY292ZXJ5U3RlcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmFja3N0b3BXYWtlc0FybWVkID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dCYWNrc3RvcFdha2VzQXJtZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BXYWtlc0FybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlLWV4ZWN1dGluZyBpbmxpbmUgc3RlcHMgb3duZWQgYnkgdGhpcyBxdWV1ZSBtZXNzYWdlIOKAlCBhIHByZXZpb3VzIGRlbGl2ZXJ5IGNyYXNoZWQgbWlkLWJvZHkgYW5kIHRoaXMgcmVkZWxpdmVyeSBpcyByZWNvdmVyaW5nIHRoZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkczogb3duZWRSZWNvdmVyeVN0ZXBzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZXhlY3V0ZSBpbmxpbmUg4oCUIGV2ZXJ5dGhpbmcgaGFzIGJlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCAob3Igbm8gd29yayBuZWVkcyBzY2hlZHVsaW5nKS4gRXhpdCBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgZHJpdmUgc3Vic2VxdWVudCByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBuZWVkcyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdGhlIHJlcGxheSBjb25zdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlci4gV2l0aG91dCBpdCAobm8gaW5saW5lIHN0ZXAsIGFsbCB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBvciBub25lIHBlbmRpbmcpIHRoZSBydW4gd291bGQgc2l0IGlkbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW50aWwgc29tZSB1bnJlbGF0ZWQgbWVzc2FnZSB3b2tlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbmxpbmUgc3RlcC4gUGF1c2UgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHN0ZXAgYm9keSDigJQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGhlIHJlcGxheS1idWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gd291bGQgKGluY29ycmVjdGx5KSBjaGFyZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIGJvZHkgYWdhaW5zdCB0aGUgYnVkZ2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgY3VtdWxhdGl2ZSBsb2csIGNvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGZvciB0aGUgdHdvIGdhdGVzIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0U3RhdGUgPSBvcGVuSG9va0FuZFdhaXRTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID8/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgZmFzdCBwYXRoIGdhdGUuIFdlIHJlcXVlc3QgdGhlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBjb25zdW1lIGl0IGluIHBsYWNlIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qg4oCUIG9ubHkgd2hlbiBBTEwgaG9sZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXZSBoYXZlIGEgcmVhbCBwcmlvciBjdXJzb3IgdG8gZGlmZiBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHByZUlubGluZVdyaXRlQ3Vyc29yYDsgYSBXb3JsZCBtYXkgcmV0dXJuIG5vbmUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0cyAoYGVyci57c3RlcCx3YWl0fUNvdW50YCksIHRoYXQgb25lIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBsb25lIHBlbmRpbmcgc3RlcCAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIHRoZSBsb25lIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgIOKAlCBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24sIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3BlbiB3YWl0IGluIHRoZSBjdW11bGF0aXZlIGxvZzogYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgd2FpdF9jb21wbGV0ZWRgIGxhbmRpbmcgYWZ0ZXIgdGhlIGRlbHRhIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkb2VzIG5vdCBidW1wIHRoZSBvdXRzaWRlLWV2ZW50IG1hcmtlciwgc28gbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmVuY2VzIGEgcmVwbGF5IGZyb20gdGhlIHN0YWxlIGRlbHRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gb3BlbiAob3IgdGhpcy1zdXNwZW5zaW9uLWNyZWF0ZWQpIGhvb2sg4oCUIFVOTEVTU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIHByZWNvbmRpdGlvbiBndWFyZCBpcyBlbmFibGVkIEFORCB0aGUgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlY2xhcmVzIGl0IGFjdHVhbGx5IGVuZm9yY2VzIHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBjYXBhYmlsaXRpZXMucHJlY29uZGl0aW9uR3VhcmRgOyB0aGUgZW52IGZsYWdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFsb25lIG9ubHkgbWFrZXMgdGhlIHJ1bnRpbWUgU0VORCBzbmFwc2hvdHMsIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbiB1bnN1cHBvcnRpbmcgYmFja2VuZCBpZ25vcmVzIOKAlCBubyBmZW5jZSkuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVsdGEgc25hcHNob3RzIHRoZSBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSBidXQgaXMgY29uc3VtZWQgb24gdGhlIG5leHQgcmVwbGF5LCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgYGhvb2tfcmVjZWl2ZWRgIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGFic2VudCBmcm9tIHRoZSBkZWx0YSBhbmQgb2JzZXJ2ZWQgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdGVyYXRpb24gbGF0ZXIgdGhhbiBhIHJlYWwgZmV0Y2ggd291bGQgb2JzZXJ2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQuIFRoYXQgc3RhbGVuZXNzIGlzIHF1YWxpdGF0aXZlbHkgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWQtdG8td3JpdGUgcmFjZSB0aGUgZmV0Y2ggcGF0aCBhbHJlYWR5IGhhcyAoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV2ZW50IGNhbiBsYW5kIHJpZ2h0IGFmdGVyIGBldmVudHMubGlzdGAgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIGJlZm9yZSB0aGUgc3VzcGVuc2lvbidzIHdyaXRlcyk7IHdpdGggYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZm9yY2VkIGd1YXJkIGl0IGlzIGFsc28gZmVuY2VkOiBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ1bXBzIHRoZSBwZXItcnVuIG91dHNpZGUtZXZlbnQgbWFya2VyLCBzbyBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZHVyYWJsZSB3cml0ZSB0aGUgc3RhbGUgcmVwbGF5IGF0dGVtcHRzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWplY3RlZCB3aXRoIDQxMiDigJQgaXRzIGd1YXJkZWQgc3VzcGVuc2lvbiBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAocmV0cmllZCBvdmVyIHRoZSByZWxvYWRlZCBsb2csIG9yIGV4aGF1c3RlZCBpbnRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhIHF1ZXVlIHJlLWludm9jYXRpb24pLCBBTkQgdGhlIGxhenkgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjbGFpbSBvZiBpdHMgbmV4dCBpbmxpbmUgc3RlcCwgd2hpY2ggY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNuYXBzaG90IHRvbyAodGhyZWFkZWQgYmVsb3cgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgc3RhdGVVcGRhdGVkQXRgOyBvbiByZWplY3Rpb24gdGhlIGJhdGNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhYmFuZG9uZWQgYW5kIHJlLWludm9rZWQgZm9yIGEgZnJlc2ggcmVwbGF5LCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFsZSB2aWV3IGNhbiBuZXZlciBjb21taXQgYSBzdGVwKS4gSG9va3MgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnkgVEhJUyBzdXNwZW5zaW9uIGFyZSBpbnNpZGUgdGhlIGRlbHRhICh0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYGhvb2tfY3JlYXRlZGAgbGFuZHMgYmVmb3JlIHRoZSBzdGVwLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSksIHNvIG9ubHkgdGhlaXIgYGhvb2tfcmVjZWl2ZWRgIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUgZmVuY2VkIHdpbmRvdy4gV2l0aG91dCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZW5mb3JjZWQgZ3VhcmQgdGhlcmUgaXMgbm8gZmVuY2UsIHNvIGtlZXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb25zZXJ2YXRpdmUgZ2F0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdpdGggbm8gaG9vayBvciB3YWl0IG9wZW4gYXQgYWxsLCB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2ggaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3Blbkhvb2tBbmRXYWl0U3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGUgcHJlY29uZGl0aW9uIGd1YXJkIGlzIGFjdHVhbGx5IGluIGZvcmNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCBieSBlbnYgQU5EIGVuZm9yY2VkIGJ5IHRoZSBXb3JsZC4gVGhlIGVudlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxhZyBhbG9uZSBvbmx5IG1ha2VzIHRoZSBydW50aW1lIHNlbmQgc25hcHNob3RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYW4gdW5zdXBwb3J0aW5nIGJhY2tlbmQgaWdub3JlcyAobm8gZmVuY2UpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VhcmRFbmZvcmNlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlY29uZGl0aW9uR3VhcmRFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQuY2FwYWJpbGl0aWVzPy5wcmVjb25kaXRpb25HdWFyZCA9PT0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHByZUlubGluZVdyaXRlQ3Vyc29yID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChndWFyZEVuZm9yY2VkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyci5ob29rQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vaykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgYmF0Y2g6IGEgaG9vayBpcyBvcGVuIGluIHRoZSBydW4gKG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCBieSB0aGlzIHN1c3BlbnNpb24sIHNvIGl0cyBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gbGFuZCBhbnkgbW9tZW50KSDigJQgYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZCBmcm9tIHN0YWxlLiBXaXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3VhcmQgaW4gZm9yY2UsIHRoZSBmZW5jZSByZWplY3RzIGEgc3RhbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltJ3MgZHVyYWJsZSB3cml0ZXMg4oCUIGJ1dCBpdCBjYW5ub3QgdW4tcnVuIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQk9EWSB0aGF0IG9wdGltaXN0aWMgc3RhcnQgYmVnYW4gYmVmb3JlIHRoZSBjbGFpbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGxlZC4gU3VwcHJlc3Mgb3B0aW1pc3RpYyBzdGFydCBmb3IgdGhlc2UgYmF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRha2UgYXdhaXQtdGhlbi1ydW4pIHNvIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlcyB1c2VyIGNvZGUgYXQgYWxsOiB0aGUgZmVuY2UgdGhlbiBjb3ZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZGUgZWZmZWN0cywgbm90IGp1c3QgdGhlIGV2ZW50IGxvZy4gQ29zdHMgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSByb3VuZC10cmlwIHBlciBzdGVwIHdoaWxlIGEgaG9vayBpcyBvcGVuLCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBndWFyZC1lbmZvcmNpbmcgZGVwbG95bWVudHMuIFdpdGhvdXQgdGhlIGd1YXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIDQxMnMsIHNvIHN1cHByZXNzaW9uIHdvdWxkIGJ1eSBub3RoaW5nIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUtdmlldyBleHBvc3VyZSB0aGVyZSBpcyB0aGUgcHJlLWV4aXN0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljLXN0YXJ0IGNvbnRyYWN0IChpZGVtcG90ZW50IHNpZGUgZWZmZWN0cykuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwcmVzc09wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkRW5mb3JjZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGFydCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gg4oCUIGJ1dCBvbmx5IHdoaWxlIHRoZSBydW4gaXMgc3RpbGwgXCJjbGVhblwiIChhIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbikuIFRoZSBtb21lbnQgYSBob29rIG9yIHdhaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzIOKAlCB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IGNhc2UgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgZWFybHkgYWJvdmUsIHRoZSBhdHRyIGNhc2UgY29udGludWVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlc2ggcmVwbGF5IChzbyBhIGJhdGNoLXNjaGVkdWxpbmcgc3VzcGVuc2lvbiBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmllcyBhdHRyIGV2ZW50cyksIGFuZCB0aGUgYXdhaXRlZC1ob29rIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHRpZWQgbGF6eUlubGluZVN0ZXBzOyB0aGUgY2hlY2tzIGJlbG93IGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHkg4oCUIGNoZWNrZWQgaGVyZSB2aWEgYG9wZW5Ib29rQW5kV2FpdFN0YXRlYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgY3VtdWxhdGl2ZSBgY2FjaGVkRXZlbnRzYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgV09SS0ZMT1dfU0VRVUVOVElBTF9SRVBMQVlTPTFgIChwZXItcnVuIGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvcGljcyBjb25zdW1lZCB3aXRoIGBtYXhDb25jdXJyZW5jeTogMWApIHdvdWxkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmluY2lwbGUgd2FpdmUgdGhpcyBsYXRjaCDigJQgc2VyaWFsaXplZCBvcmNoZXN0cmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIHJlc3RvcmUgdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSBkZWxpdmVyeS4gVGhlIHdhaXZlciBpcyBpbnRlbnRpb25hbGx5IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZW46IHRoZSBlbnYgdmFyIGlzIGEgcnVudGltZS1wcm9jZXNzIHNldHRpbmcgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IHByb3ZlIHRoZSBCVUlMVCBmbG93IHRyaWdnZXIgYWN0dWFsbHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYG1heENvbmN1cnJlbmN5OiAxYCAoaXQgbXVzdCBiZSBzZXQgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vLCBhbmQgc29tZSBpbnRlZ3JhdGlvbnMgd3JpdGUgdGhlaXIgb3duIHRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZyksIGFuZCBgY2FwYWJpbGl0aWVzLm1heENvbmN1cnJlbmN5YCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlcyBxdWV1ZSBzdXBwb3J0LCBub3QgZGVwbG95ZWQgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVudGlsIHRoZSBidWlsZCBlbWl0cyBhIHZlcmlmaWFibGUgc2lnbmFsIHRoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBsb3llZCB0cmlnZ2VyIGlzIHNlcmlhbGl6ZWQsIHRoZSBjb25zZXJ2YXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGNoIHN0YXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yY2VPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3BlbldhaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBzdGVwcyBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVkZ2V0IGlzIHBhdXNlZCBmb3IgdGhlIHdob2xlIGJhdGNoIOKAlCBzdGVwIGR1cmF0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIG1heER1cmF0aW9uLCBub3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGltZW91dCDigJQgc28gdGhlIGJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBkb2Vzbid0IGNoYXJnZSB0aGUgc3RlcCBib2RpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeTogZGVjaWRlIHdoZXRoZXIgdGhpcyBiYXRjaCdzIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHF1YWxpZmllcyBmb3IgVFRGUy9TVFNPIG1lYXN1cmVtZW50LiBPbmx5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gncyBmaXJzdCBzdGVwIGNhcnJpZXMgdGhlIHRyYWNraW5nIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIGJhdGNoIGVtaXRzIG9uZSBzYW1wbGUgcGVyIHNjaGVkdWxpbmcgZ2FwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG9uZSBwZXIgc2libGluZy4gVHVyYm8ncyBzeW50aGVzaXplZCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGhhcyBhIGxvY2FsLWNsb2NrIGNyZWF0ZWRBdCwgc28gdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIG9ubHkgdGhlIHJ1bi1pZCBVTElEIHRpbWVzdGFtcCBpcyB0cnVzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVRyYWNraW5nID0gY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGNhY2hlZEV2ZW50cyA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5DcmVhdGVkQXRNczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZENyZWF0ZWRBdChydW5JZCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHVyYm8gPyB1bmRlZmluZWQgOiArd29ya2Zsb3dSdW4uY3JlYXRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IHJlcGxheUR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3VzcGVuc2lvbidzIG93biBob29rL3dhaXQgd3JpdGVzIGFyZSBub3QgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkRXZlbnRzIHlldCwgc28gcmVwb3J0IHRoZW0gZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkhhc1dhaXRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uQ3JlYXRlZEhvb2tzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uLWd1YXJkIHNuYXBzaG90IGZvciB0aGUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgY2xhaW1zOiB0aGUgbGF6eSBjbGFpbSBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibGUgd3JpdGUgb2YgYSBob3QtcGF0aCBzdGVwIChpdHMgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBkZWZlcnJlZCksIHNvIHdpdGhvdXQgYSBzbmFwc2hvdCBpdCB3b3VsZCBieXBhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBndWFyZCBlbnRpcmVseSBhbmQgYSBzdGFsZSByZXBsYXkgY291bGQgY2xhaW0g4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29tbWl0IOKAlCBhIHN0ZXAgc2NoZWR1bGVkIG9mZiBhIHZpZXcgdGhhdCBtaXNzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGV2ZW50IGl0IG5ldmVyIGxvYWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtc2AgcmV0dXJucyBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGd1YXJkIGVudiBmbGFnIGlzIG9mZiwgc28gdGhpcyBpcyBhIG5vLW9wXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIGd1YXJkZWQgZGVwbG95bWVudHM7IFdvcmxkcyB0aGF0IGRvbid0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmZvcmNlIHRoZSBndWFyZCBpZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDbGFpbVNuYXBzaG90ID0gcHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlSW5saW5lV3JpdGVDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBFeGVjdXRpb25Qcm9taXNlcyA9IGlubGluZUV4ZWN1dGlvbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocywgc3RlcEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290UnVuSWQ6IHJvb3RSdW5JZEZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCBudW1iZXIgPSBwcmlvciBzdGVwX3N0YXJ0ZWQgY291bnQgKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGlzIGV4ZWN1dGlvbidzIHN0YXJ0KSwgY291bnRpbmcgb25seSBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UncyBvd24gc3RhcnRzOiB0aGUgb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VpbGluZyBib3VuZHMgaG93IG1hbnkgdGltZXMgdGhpcyBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZS1ydW5zIGEgc3RlcCBpdCBjcmFzaGVkL3RpbWVkIG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiwgYW5kIGVhY2ggb2YgdGhvc2UgKHJlKXN0YXJ0cyBzdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWV0YWRhdGEubWVzc2FnZUlkLiBTdGFydHMgd3JpdHRlbiBieSByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgKHN0YWxlL3dha2UgcmVwbGF5cywgYSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgZGlzcGF0Y2hlZCBvZmYgYSBsb3N0IGNyZWF0ZS1jbGFpbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fycnkgb3RoZXIgSURzIOKAlCBvciBub25lIOKAlCBhbmQgbXVzdCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQsIG9yIHRoZSBjZWlsaW5nIGZhbHNlbHkgZXhoYXVzdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFsdGh5IHN0ZXAgKHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBsYXp5IHN0ZXAgaXMgYnJhbmQtbmV3IGJ5IGNvbnN0cnVjdGlvbiAoaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXJzIHRoZSBiYXRjaCBvbmx5IHdoZW4gaXQgaGFzIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCB5ZXQpLCBzbyBpdCBoYXMgemVybyBwcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgYW5kIGlzIGFsd2F5cyBhdHRlbXB0IDEg4oCUIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBzY2FuIGVudGlyZWx5LiBPbmx5IGFuIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXJ1biBjYW4gaGF2ZSBwcmlvciBzdGFydHMsIGFuZCB0aGF0IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5jb21tb24sIHNvIHJlc2VydmUgdGhlIE8obikgc2NhbiBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gd2Fsa2luZyB0aGUgZ3Jvd2luZyBsb2cgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGlubGluZSBzdGVwICh3aGljaCB3b3VsZCBiZSBPKG7CsilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIGEgbG9uZyBzZXF1ZW50aWFsIHdvcmtmbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ293bmVkQnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgb24gdGhlIGZseS4gQWJzZW50IGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBzdGVwcywgd2hvc2UgaW5wdXQgaHlkcmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZXhpc3Rpbmcgc3RlcCBlbnRpdHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIG93bmVyc2hpcDogc3RhbXAgKG9yIHJlLXN0YW1wKSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBxdWV1ZSBtZXNzYWdlIElEIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQsIHNvIHdha2UgcmVwbGF5cyBzZWUgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgaW4gZmxpZ2h0IGhlcmUgYW5kIHN1cHByZXNzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcmVxdWV1ZSAod29ya2Zsb3cjMjc4MCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBmb3JjZSBvcHRpbWlzdGljIHN0YXJ0IGFuZCBob2xkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IHN0ZXBfc3RhcnRlZCB1bnRpbCB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGxhbmRzICh0aGUgYm9keSBzdGlsbCBydW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5KS4gQm90aCBhcmUgdW5kZWZpbmVkL2ZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHdWFyZC1lbmZvcmNlZCBiYXRjaGVzIHdpdGggYW4gb3BlbiBob29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoZSBjbGFpbSBiZWZvcmUgcnVubmluZyB0aGUgYm9keSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSA0MTItZmVuY2VkIHN0ZXAgbmV2ZXIgZXhlY3V0ZXMgdXNlciBjb2RlIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblNuYXBzaG90OiBpbmxpbmVDbGFpbVNuYXBzaG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcEluZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lUcmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBsYXRlbmN5VHJhY2tpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVxdWVzdElubGluZURlbHRhICYmIHByZUlubGluZVdyaXRlQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZURlbHRhU2luY2VDdXJzb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlSW5saW5lV3JpdGVDdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhcmlhbnQgYm9va2tlZXBpbmc6IHRoaXMgaW52b2NhdGlvbiBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYm9kaWVzIHVudGlsIHRoZXkgc2V0dGxlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuYWRkKHMuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBzdGVwcyBhcmUgYnJhbmQtbmV3ICh0aGVpciBjcmVhdGUtY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgZXhhY3RseS1vbmNlIGdhdGUpLCBidXQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBzdGVwIGFscmVhZHkgZXhpc3RzIGFuZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIGJhY2tzdG9wIG1lc3NhZ2UgbWF5IGZpcmUgbWlkLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNhbWUgcHJvY2VzcyDigJQgcm91dGUgdGhvc2UgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1wcm9jZXNzIHNpbmdsZS1mbGlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcnVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVkLmZpbmFsbHkoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5kZWxldGUocy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBvZiBhbiBpbmxpbmUgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltOiB0aGUgbG9hZGVkIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXMgbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBhbHJlYWR5IGhhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIGNsYWltIHdhcyBmZW5jZWQgYnkgdGhlIGd1YXJkIGFuZCBubyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3ZXJlIHdyaXR0ZW4uIEFiYW5kb24gdGhlIGJhdGNoIOKAlCBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBib2R5IHJlc3VsdCBpcyBkaXNjYXJkZWQgYnkgZXhlY3V0ZVN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhdGlvbiDigJQgYW5kIHJlc3RhcnQgdGhlIHJlcGxheSBzbyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgbWlzc2luZyBldmVudC4gV2FpdCBmb3IgdGhlIHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9ucyB0byBzZXR0bGUgZmlyc3Qgc28gbm8gb3duZWQgYm9keSBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgd2hlbiB0aGUgcmVzdGFydCAob3IgdGhlIGFjayBwYXRoKSBydW5zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3RlcEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNpYmxpbmcgd2hvc2UgY2xhaW0gd2FzIGFjY2VwdGVkIHdyb3RlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgb2YgaXRzIG93biwgcG9zc2libHkgYWZ0ZXIgdGhlIFdvcmxkIGJ1aWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyA0MTIncyBkZWx0YSDigJQgc28gdGhhdCBkZWx0YSBjYW4gbm8gbG9uZ2VyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lZCB0byBjb21wbGV0ZSB0aGUgbG9nLCBhbmQgdGhlIHJlc3RhcnQgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVsb2FkIGl0IGluIGZ1bGwuIGBza2lwcGVkYCAodGhlIHN0ZXAgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0ZWQpLCBgZ29uZWAgYW5kIGB0aHJvdHRsZWRgIChjbGFpbSByZWplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdXcm90ZSA9IHNldHRsZWQuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAncmV0cnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcygnaW5saW5lLWNsYWltJywgc3RlcEVyciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhOiAhc2libGluZ1dyb3RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyByZXR1cm4gKG9yIHRocm93KSBjb21wbGV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmxpbmUtY2xhaW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSBiYXRjaCByZXN1bHRzLiBgcmV0cnlgIHN0ZXBzICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBleGlzdCDigJQgdGhlaXIgYHN0ZXBfc3RhcnRlZGAgc3VjY2VlZGVkKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXF1ZXVlZCBwZXItc3RlcCBhcyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheTsgYHRocm90dGxlZGAgc3RlcHMgKHJlamVjdGVkIG9uIHRoZSBjcmVhdGUtY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZXZlciBjcmVhdGVkKSBpbnN0ZWFkIGRlZmVyIHJlZGVsaXZlcnkgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugc28gdGhleSByZS1ydW4gaW5saW5lIHdpdGggaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlcGxheTsgY29tcGxldGVkL2ZhaWxlZCBzdGVwcyBhbHJlYWR5IHdyb3RlIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudHMuIFdlIG9ubHkgbG9vcCBiYWNrIHRvIHJlcGxheSB3aGVuIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUg4oCUIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXBlbmRpbmcgc3RlcHMgd2lsbCBiZSByZS1ydW4gYnkgdGhlaXIgcXVldWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlcyBhbmQgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXMgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAodHlwZW9mIGlubGluZUV4ZWN1dGlvbnMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSDigJQgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaW5saW5lRXhlY3V0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiByLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlQZW5kaW5nT3BzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXIgcmVkZWxpdmVyeSBvZiB0aGUgb3JjaGVzdHJhdG9yIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdHRsZSBiYWNrb2ZmLiBPbiByZXBsYXkgZXZlcnkgbm9uLXRlcm1pbmFsIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcmUtZGlzcGF0Y2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtdGhyb3R0bGVkIHN0ZXBzIHJ1biBpbmxpbmUgYWdhaW4gV0lUSCB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCAodGhlaXIgYHN0ZXBfY3JlYXRlZGAgaXMgZGVmZXJyZWQgYW5ldyksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgYHJldHJ5YCBzdGVwcyBpbiB0aGlzIGJhdGNoIGFyZSBxdWV1ZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93biByZXRyeUFmdGVyIGhvbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHN0ZXBzIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVkIGZyb20gdGhlaXIgZXZlbnRzIGFuZCBub3QgcmUtcnVuLiBCZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZHJpdmVzIGFsbCByZW1haW5pbmcgd29yaywgd2UgbXVzdCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyByZS1xdWV1ZSBgdG9SZXRyeWAgaGVyZSDigJQgdGhhdCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGUtZGlzcGF0Y2ggdGhvc2Ugc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJucyBCRUZPUkUgdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNvIGEgYmF0Y2ggdGhhdCBtaXhlcyBhIHRocm90dGxlIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc3RlcCB0aGF0IGxlZnQgdW5mbHVzaGVkIG9wcyBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGUgZXhwbGljaXQgZmx1c2ggY29udGludWF0aW9uLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGhyb3R0bGUgYmFja29mZiAoPj0gMXMpIGFsd2F5cyBleGNlZWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1pbnZvY2F0aW9uIGZsdXNoIHdpbmRvdyAoPD0gNTAwbXMgKyB3YWl0VW50aWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvcHMgc2V0dGxlIGJlZm9yZSB0aGUgcG9zdC1iYWNrb2ZmIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cyBhbmQgcmVhZHMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHRocm90dGxlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgdGhlIGRlbGF5ZWQgcmV0cnkgb24gdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uSWQgc28gaXQgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWVkIHJlLWRpc3BhdGNoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJmb3JtcyBvbiByZXBsYXkgKGl0IGFsc28gdXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkYCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGEgbWl4ZWQgYmF0Y2ggd2hlcmUgb25lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY29tcGxldGVkYCB3aXRoIHVuZmx1c2hlZCBiYWNrZ3JvdW5kIG9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgYW55UGVuZGluZ09wc2ApIGFuZCBhbm90aGVyIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyB3b3VsZCBkb3VibGUtZGlzcGF0Y2ggdGhlIHJldHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoIGJlbG93IHF1ZXVlcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBwbGFpbiBjb250aW51YXRpb24sIHdob3NlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIHN0aWxsLWByZXRyeWluZ2Agc3RlcCBhcyBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMgaXQgKmltbWVkaWF0ZWx5KiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqd2l0aCogYSBrZXkuIFNpbmNlIHRoaXMgZGVsYXllZCByZXRyeSBoYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBrZXksIHRoZSB0d28gbWVzc2FnZXMgd291bGRuJ3QgZGVkdXBlIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIHdvdWxkIHJ1biB0d2ljZSwgdGhlIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBiYWNrb2ZmIHdvdWxkIGJlIGlnbm9yZWQgKHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVycm9yYCByZXRyaWVzIHBlcnNpc3Qgbm8gYHJldHJ5QWZ0ZXJgLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBoYXMgbm8gYFRvb0Vhcmx5YCBndWFyZCksIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBib2R5IGNvdWxkIHJ1biBlYXJseS9jb25jdXJyZW50bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmluZyB0aGUga2V5IGxldHMgdGhlIGVhcmxpZXIgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2Ugd2luLCBob25vcmluZyB0aGUgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgcGVuZGluZyBiYWNrZ3JvdW5kIG9wZXJhdGlvbnMgZmx1c2ggYmVmb3JlIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcmVhZHMgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbnlQZW5kaW5nT3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JyZWFraW5nIGxvb3A6IGlubGluZSBzdGVwIGhhcyBwZW5kaW5nIG9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgaW5saW5lIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIHZpYSB0aGVpciBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgbWVzc2FnZXM7IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYWxsIHN0ZXBzIGFyZSB0ZXJtaW5hbC4gRG9uJ3QgbG9vcCBoZXJlIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgc3RlcHMgaGF2ZSBubyB0ZXJtaW5hbCBldmVudCB0byBvYnNlcnZlIHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgaW5saW5lIHN0ZXBzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSDigJQgbG9vcCBiYWNrIHRvIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSB3b3JrZmxvdyBvYnNlcnZlcyB0aGUgdGVybWluYWwgZXZlbnRzIG9uIHJlcGxheSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZSBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgZGVsdGEgKHN1cHBvcnRpbmcgV29ybGQgKyB0aGUgc2luZ2xlLXN0ZXAgZ2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUpLCBzdGFzaCBpdCBzbyB0aGUgbmV4dCBpdGVyYXRpb24ncyBsb2FkIGNvbnN1bWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnN0ZWFkIG9mIGlzc3VpbmcgYW4gaW5jcmVtZW50YWwgZXZlbnRzLmxpc3QuIE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wbGV0ZWQgcGF0aCBjYXJyaWVzIGEgZGVsdGE7IG11bHRpLXN0ZXAgYmF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVxdWVzdCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25seSA9IHN0ZXBSZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuaW5saW5lRGVsdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb25seS5pbmxpbmVEZWx0YS5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmxpbmVEZWx0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogb25seS5pbmxpbmVEZWx0YS5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG9ubHkuaW5saW5lRGVsdGEuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIG9mIGEgZ3VhcmRlZCB3cml0ZSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBieSB0aGUgcmVwbGF5IGxvb3Ag4oCUIHRoZSByZXN1bHQtYmVhcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9jb21wbGV0ZWRgLCBvciB0aGUgYHdhaXRfY29tcGxldGVkYCBvZiB0aGUgd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy4gQm90aCByZWFjaCB0aGlzIG9uZSBjYXRjaCBhbmQgdGhlIHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgc2F5IHdoaWNoLCBoZW5jZSB0aGUgbmV1dHJhbCBsYWJlbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgbWF5IGJlIHJlLXBvc3RlZCBpbiBwbGFjZTogdGhlIGNvcnJlbGF0aW9uIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgKGZvciBydW5fY29tcGxldGVkKSB0aGUgcmVzdWx0IGl0c2VsZiBjYW1lIGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwbGF5LCBhbmQgYSBjb3JyZWN0ZWQgbG9nIG1heSBwcm9kdWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgb25lcy4gRG9uJ3QgZmFpbCB0aGUgcnVuIOKAlCByZXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGluIHRoaXMgaW52b2NhdGlvbiwgYW5kIG9ubHkgb25jZSB0aGF0IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3BlbnQgc2NoZWR1bGUgYW4gZXhwbGljaXQgcmUtaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGhyb3dpbmcgaW5zdGVhZCB3b3VsZCByZWx5IG9uIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIG1lc3NhZ2UsIHdoaWNoIHRoZSB0dXJibyBwYXRoIGhhcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZCDigJQgZW1waXJpY2FsbHkgdGhlIHJ1biB0aGVuIHN0YWxscyBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSdzIH4zMDBzIGRlZmF1bHQgdmlzaWJpbGl0eSB0aW1lb3V0IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ3JlcGxheS13cml0ZScsIGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID0gYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBsYXktd3JpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQuIEZhbGwgdGhyb3VnaCB0byB0aGUgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBiZWxvdyBpbnN0ZWFkIG9mIHJldGhyb3dpbmc6IHRoaXMgY2F0Y2ggb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHRoZSBydW4sIGFuZCBhIHJldGhyb3cgd291bGQgZXNjYXBlIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBoYW5kbGVyIGFuZCBiZSByZWRlbGl2ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudCBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlcyB0YWxraW5nIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGQgKHdvcmtmbG93LXNlcnZlcikg4oCUIGFuIGV4aGF1c3RlZCBSZXRyeUFnZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoVU5EX0VSUl9SRVFfUkVUUlkgZnJvbSBhIHN1c3RhaW5lZCA0MjkvNTAzIHN0b3JtKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZHJvcHBlZCBzb2NrZXQsIGEgY29ubmVjdC9ETlMgZmFpbHVyZSwgb3IgYSBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQg4oCUIG11c3QgTk9UIGZhaWwgdGhlIHJ1bi4gUmV0aHJvdyBzbyB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMgYW5kIGEgZnJlc2ggaW52b2NhdGlvbiByZXRyaWVzIHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgdGhlIGJhY2tlbmQgcmVjb3ZlcnMuIFRoZSBAdmVyY2VsL3F1ZXVlIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpZXMgYSBmYXN0ICgxc+KGkjYwcykgYmFja29mZiBieSBkZWxpdmVyeSBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkaW5nIHRoZSB+NW1pbiBkZWZhdWx0IHZpc2liaWxpdHktdGltZW91dCByZWRyaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIG5ldmVyIGtpbGxpbmcgdGhlIHByb2Nlc3MgdmlhIHJ1bl9mYWlsZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmFuc2llbnQgd29ybGQgZXJyb3IgZHVyaW5nIHJlcGxheTsgcmVkZWxpdmVyaW5nIHZpYSBxdWV1ZSBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZlcmdlbmNlQ291bnQgPD0gbWF4UmVjb3ZlcnlSZXBsYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSA9IGRpdmVyZ2VuY2VDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5U3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24tZ3VhcmQgYXN5bW1ldHJ5OiB1bmxpa2UgYHJ1bl9jb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0ZXJtaW5hbCBgcnVuX2ZhaWxlZGAgc2VuZHMgbm8gYHN0YXRlVXBkYXRlZEF0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QsIHNvIGl0IGlzIG5ldmVyIDQxMi1yZWplY3RlZCBldmVuIGlmIGEgaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFuZGVkIG1pZC1yZXBsYXkgYW5kIGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgcGF0aCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJldy4gVGhpcyBpcyBpbnRlbnRpb25hbCBhbmQgZmFpbC1vcGVuOiBhIHNwdXJpb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlICh0aGUgcnVuIGNhbiBiZSByZS1ydW4gZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhc2hib2FyZCksIHdoZXJlYXMgYSBzcHVyaW91cyAqY29tcGxldGlvbiogY29tbWl0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyByZXN1bHQuIEd1YXJkaW5nIHRoaXMgd3JpdGUgc3ltbWV0cmljYWxseSB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBuZWVkIHRoZSBsb2FkZWQgZXZlbnQgbG9nLCB3aGljaCBpcyBzY29wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgYHRyeWAgYWJvdmUgYW5kIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgbGV0IGNhY2hlZEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnZvY2F0aW9uQ291bnQgPSAwO1xuICBjb25zdCBlbnRyeXBvaW50Q3JlYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm91dGVNb2R1bGVCb2R5SW5pdE1zID1cbiAgICB0eXBlb2Ygb3B0aW9ucz8ucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID09PSAnbnVtYmVyJ1xuICAgICAgPyBlbnRyeXBvaW50Q3JlYXRlZEF0IC0gb3B0aW9ucy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGludm9jYXRpb25Db3VudCArPSAxO1xuICAgIGNvbnN0IGhhbmRsZXJDYWNoZWQgPSBjYWNoZWRIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnU0VSVkVSJyk7XG5cbiAgICByZXR1cm4gdHJhY2UoXG4gICAgICAnd29ya2Zsb3cucm91dGUuZmxvdycsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IHNwYW5LaW5kLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVUeXBlKCdmbG93JyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkZhYXNJbnN0YW5jZShDT01QVVRFX0lOU1RBTkNFX0lEKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkSGFuZGxlcnMgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgICAgICAgJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZF9oYW5kbGVycycsXG4gICAgICAgICAgICAgIGFzeW5jICgpID0+IGdldFdvcmxkSGFuZGxlcnMoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHdvcmxkSGFuZGxlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZWRIYW5kbGVyKHJlcSk7XG4gICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgIEF0dHJpYnV0ZS5IdHRwUmVzcG9uc2VTdGF0dXNDb2RlKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cbiJdfQ==
|