@workflow/core 5.0.0-beta.39 → 5.0.0-beta.40
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/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +5 -2
- package/dist/correlation-id.d.ts +109 -0
- package/dist/correlation-id.d.ts.map +1 -0
- package/dist/correlation-id.js +139 -0
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +14 -1
- package/dist/events-consumer.d.ts +1 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +11 -3
- package/dist/private.d.ts +17 -1
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +1 -1
- package/dist/runtime/constants.d.ts +19 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +30 -1
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1429 -0
- package/dist/runtime/quickjs-runtime.d.ts +193 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +1944 -0
- package/dist/runtime/run.d.ts +2 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +9 -4
- package/dist/runtime/runs.d.ts +18 -1
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +96 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +9 -1
- package/dist/runtime/suspension-handler.d.ts +7 -0
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +29 -2
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +484 -47
- package/dist/serialization/codec-devalue-vm.d.ts +9 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +137 -0
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +579 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +28 -6
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/vm-bundle-entry.d.ts +12 -0
- package/dist/serialization/vm-bundle-entry.d.ts.map +1 -0
- package/dist/serialization/vm-bundle-entry.js +58 -0
- package/dist/serialization/workflow-vm.d.ts +24 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +66 -0
- package/dist/serialization.d.ts +2 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +26 -21
- package/dist/source-map.d.ts +20 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +47 -1
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +7 -2
- package/dist/telemetry/semantic-conventions.d.ts +78 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +56 -1
- package/dist/telemetry.d.ts +5 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +13 -13
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +6 -4
- package/dist/workflow/attribute-dispatcher.js +2 -2
- package/dist/workflow/hook.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow.d.ts +49 -2
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +723 -569
- package/docs/api-reference/create-hook.mdx +1 -1
- package/docs/foundations/starting-workflows.mdx +74 -1
- package/package.json +8 -7
package/dist/runtime.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { types } from 'node:util';
|
|
2
2
|
import { CorruptedEventLogError, EntityConflictError, FatalError, HookNotFoundError, MaxEventsExceededError, PreconditionFailedError, ReplayDivergenceError, RUN_ERROR_CODES, RunExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
3
|
-
import { setWorkflowBasePath } from '@workflow/utils';
|
|
3
|
+
import { once, 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 ms from 'ms';
|
|
6
7
|
import { decodeTime } from 'ulid';
|
|
7
8
|
import { classifyRunError, isRetryableWorldError, isWorldContractError, } from './classify-error.js';
|
|
8
9
|
import { describeError } from './describe-error.js';
|
|
@@ -11,8 +12,9 @@ import { runtimeLogger } from './logger.js';
|
|
|
11
12
|
import { getStepFunction } from './private.js';
|
|
12
13
|
import { ReplayPayloadCache } from './replay-payload-cache.js';
|
|
13
14
|
import { COMPUTE_INSTANCE_ID } from './runtime/compute-instance.js';
|
|
14
|
-
import { getMaxEventsOverride, getMaxQueueDeliveries, getPreconditionMaxInProcessRestarts, getPreconditionMaxReinvocations, getPreconditionReinvokeDelaySeconds, getReplayDivergenceMaxRetries, isInlineOwnershipEnabled, isTurboEnabled, } from './runtime/constants.js';
|
|
15
|
+
import { getMaxEventsOverride, getMaxQueueDeliveries, getPreconditionMaxInProcessRestarts, getPreconditionMaxReinvocations, getPreconditionReinvokeDelaySeconds, getReplayDivergenceMaxRetries, isInlineOwnershipEnabled, isTurboEnabled, isVmRetentionEnabled, } from './runtime/constants.js';
|
|
15
16
|
import { countStepStartedEvents } from './runtime/count-step-started-events.js';
|
|
17
|
+
import { guardDeploymentAffinity, } from './runtime/deployment-guard.js';
|
|
16
18
|
import { appendUniqueEvents, getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, insertEventByEventId, isPreconditionGuardEnabled, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload, preconditionEventDelta, preconditionSnapshotParams, queueMessage, withHealthCheck, } from './runtime/helpers.js';
|
|
17
19
|
import { handleReplayBudgetExhausted, ReplayBudget, } from './runtime/replay-budget.js';
|
|
18
20
|
import { ReplayRecoveryReporter } from './runtime/replay-recovery-reporter.js';
|
|
@@ -22,6 +24,7 @@ import { computeStepLatencyTracking } from './runtime/step-latency.js';
|
|
|
22
24
|
import { backstopIdempotencyKey, hasPendingStepOwnedByMessage, isStepOwnershipActive, stepLeaseRemainingSeconds, } from './runtime/step-ownership.js';
|
|
23
25
|
import { runStepSingleFlight } from './runtime/step-single-flight.js';
|
|
24
26
|
import { handleSuspension } from './runtime/suspension-handler.js';
|
|
27
|
+
import { useQuickJSVm } from './runtime/vm-mode.js';
|
|
25
28
|
import { getWaitContinuationDispatch } from './runtime/wait-continuation.js';
|
|
26
29
|
import { getWorld, getWorldHandlers, } from './runtime/world.js';
|
|
27
30
|
import { dehydrateRunError } from './serialization.js';
|
|
@@ -30,12 +33,12 @@ import * as Attribute from './telemetry/semantic-conventions.js';
|
|
|
30
33
|
import { buildInvocationSpanLinks, getNextTraceCarrier, getSpanKind, getWorkflowTraceMode, isUsableTraceCarrier, trace, withTraceContext, withWorkflowBaggage, } from './telemetry.js';
|
|
31
34
|
import { getErrorName, getErrorStack, normalizeUnknownError } from './types.js';
|
|
32
35
|
import { buildWorkflowSuspensionMessage } from './util.js';
|
|
33
|
-
import {
|
|
36
|
+
import { replayWorkflow, resumeWorkflow, } from './workflow.js';
|
|
34
37
|
export { WorkflowSuspension } from './global.js';
|
|
35
38
|
export { healthCheck, } from './runtime/helpers.js';
|
|
36
39
|
export { getHookByToken, resumeHook, resumeWebhook, } from './runtime/resume-hook.js';
|
|
37
40
|
export { getRun, Run, } from './runtime/run.js';
|
|
38
|
-
export { cancelRun, listStreams, readStream, recreateRunFromExisting, reenqueueRun, wakeUpRun, } from './runtime/runs.js';
|
|
41
|
+
export { cancelRun, cancelRuns, listStreams, readStream, recreateRunFromExisting, reenqueueRun, wakeUpRun, } from './runtime/runs.js';
|
|
39
42
|
export { start, } from './runtime/start.js';
|
|
40
43
|
export { createWorld, createWorldFromModule, getWorld, getWorldHandlers, setWorld, } from './runtime/world.js';
|
|
41
44
|
/**
|
|
@@ -240,10 +243,11 @@ function rootRunIdFrom(attributes, runId) {
|
|
|
240
243
|
* `wait_completed`, which the wait timer can resolve with
|
|
241
244
|
* `wait_completed`).
|
|
242
245
|
*
|
|
243
|
-
* This gates the inline-delta fast path and turbo's forced
|
|
244
|
-
* A terminal-step delta can omit an event appended
|
|
245
|
-
* write. With no open hook or wait, only cancellation
|
|
246
|
-
* it one replay late is safe because the next entity
|
|
246
|
+
* This gates VM retention, the inline-delta fast path, and turbo's forced
|
|
247
|
+
* optimistic start. A terminal-step delta can omit an event appended
|
|
248
|
+
* concurrently after that write. With no open hook or wait, only cancellation
|
|
249
|
+
* can do so, and observing it one replay late is safe because the next entity
|
|
250
|
+
* write is rejected.
|
|
247
251
|
*
|
|
248
252
|
* Step-body `attr_set` writes are NOT a concern: they land before the
|
|
249
253
|
* step's terminal write and are therefore already inside the returned
|
|
@@ -275,6 +279,71 @@ function openHookAndWaitState(events) {
|
|
|
275
279
|
}
|
|
276
280
|
return { openHook, openWait };
|
|
277
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* The whole retention predicate: keep the session only for a pure step
|
|
284
|
+
* boundary (every suspension item is a step — any other item type, present
|
|
285
|
+
* or future, is unretainable by default) whose new step inputs serialized
|
|
286
|
+
* without executing workflow code, with no out-of-band continuation source:
|
|
287
|
+
* attributes require replay; hooks and waits can wake another invocation.
|
|
288
|
+
* `WORKFLOW_RETAINED_VM=0` disables retention entirely.
|
|
289
|
+
*
|
|
290
|
+
* The open hook/wait scan is O(events), so it is taken through a lazy getter
|
|
291
|
+
* and consulted last, after every cheap check has passed.
|
|
292
|
+
*
|
|
293
|
+
* INVARIANT this predicate leans on: every suspension signaler that does NOT
|
|
294
|
+
* carry the step-consumer generation guard (sleep, hook, attribute — see
|
|
295
|
+
* `suspensionGeneration` in private.ts) must be unretainable here, either via
|
|
296
|
+
* a non-step queue item or the open hook/wait scan. A new signaler that
|
|
297
|
+
* satisfies neither would let a stale signal be accepted as a fresh
|
|
298
|
+
* suspension on a resumed session.
|
|
299
|
+
*
|
|
300
|
+
* Quiescence assumes workflow code stays inside the sandbox's determinism
|
|
301
|
+
* contract. Escaping to the host realm (e.g. recovering the host `Function`
|
|
302
|
+
* constructor from an exposed host class to schedule real timers) makes a
|
|
303
|
+
* workflow nondeterministic under ordinary replay too, and is not defended
|
|
304
|
+
* here.
|
|
305
|
+
*/
|
|
306
|
+
function canRetainWorkflowSession(suspension, stepInputsSafe, openHookWait) {
|
|
307
|
+
if (!isVmRetentionEnabled() ||
|
|
308
|
+
!stepInputsSafe ||
|
|
309
|
+
suspension.steps.length === 0 ||
|
|
310
|
+
!suspension.steps.every((item) => item.type === 'step')) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
const { openHook, openWait } = openHookWait.value;
|
|
314
|
+
return !openHook && !openWait;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Maximum inline-execution duration for a single handler invocation.
|
|
318
|
+
*
|
|
319
|
+
* Order of precedence:
|
|
320
|
+
* 1. `WORKFLOW_V2_TIMEOUT_MS` env var
|
|
321
|
+
* 2. Tiered budget derived from `world.getRuntimeDeadline()`
|
|
322
|
+
* 3. Default of 2 minutes
|
|
323
|
+
*/
|
|
324
|
+
async function getMaxInlineDurationMs(world, invocationStartTime) {
|
|
325
|
+
const rawEnvOverride = process.env.WORKFLOW_V2_TIMEOUT_MS;
|
|
326
|
+
if (rawEnvOverride !== undefined && rawEnvOverride !== '') {
|
|
327
|
+
const parsed = Number(rawEnvOverride);
|
|
328
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
329
|
+
return parsed;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const runtimeDeadline = await world.getRuntimeDeadline?.();
|
|
333
|
+
if (runtimeDeadline !== undefined) {
|
|
334
|
+
const deadlineMs = runtimeDeadline.getTime();
|
|
335
|
+
if (!Number.isNaN(deadlineMs)) {
|
|
336
|
+
const maxDurationMs = Math.floor(deadlineMs - invocationStartTime);
|
|
337
|
+
if (maxDurationMs >= ms('25m')) {
|
|
338
|
+
return ms('10m');
|
|
339
|
+
}
|
|
340
|
+
if (maxDurationMs >= ms('10m')) {
|
|
341
|
+
return ms('5m');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return ms('2m');
|
|
346
|
+
}
|
|
278
347
|
/**
|
|
279
348
|
* Creates a single route which handles workflow execution requests,
|
|
280
349
|
* executing steps inline when possible to reduce function invocations
|
|
@@ -288,7 +357,6 @@ function openHookAndWaitState(events) {
|
|
|
288
357
|
*/
|
|
289
358
|
export function workflowEntrypoint(workflowCode, options) {
|
|
290
359
|
setWorkflowBasePath(options?.basePath);
|
|
291
|
-
const NO_INLINE_REPLAY_AFTER_MS = Number(process.env.WORKFLOW_V2_TIMEOUT_MS) || 120_000;
|
|
292
360
|
const namespace = resolveQueueNamespace(options?.namespace);
|
|
293
361
|
const workflowPrefix = getQueueTopicPrefix('workflow', namespace);
|
|
294
362
|
const handler = (worldHandlers) => worldHandlers.createQueueHandler(workflowPrefix, async (message_, metadata) => {
|
|
@@ -301,7 +369,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
301
369
|
await handleHealthCheckMessage(healthCheck, worldHandlers.specVersion);
|
|
302
370
|
return;
|
|
303
371
|
}
|
|
304
|
-
const { runId, traceCarrier: incomingTraceCarrier, requestedAt, stepId: incomingStepId, stepName: incomingStepName, replayDivergence, preconditionReinvocations, runInput, hookInput, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
372
|
+
const { runId, traceCarrier: incomingTraceCarrier, requestedAt, stepId: incomingStepId, stepName: incomingStepName, replayDivergence, preconditionReinvocations, deploymentMismatchRetryCount, runInput, hookInput, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
305
373
|
// `start()` always attaches a trace carrier, but
|
|
306
374
|
// serializeTraceCarrier() returns `{}` when no OTEL SDK is registered
|
|
307
375
|
// or no span is active — treat an empty carrier the same as an
|
|
@@ -430,6 +498,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
430
498
|
...Attribute.WorkflowTraceMode(traceMode),
|
|
431
499
|
});
|
|
432
500
|
const invocationStartTime = Date.now();
|
|
501
|
+
const noInlineReplayAfterMs = await getMaxInlineDurationMs(world, invocationStartTime);
|
|
433
502
|
let loopIteration = 0;
|
|
434
503
|
const replayRecoveryReporter = replayDivergence
|
|
435
504
|
? new ReplayRecoveryReporter(replayDivergence.count)
|
|
@@ -460,6 +529,12 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
460
529
|
let workflowStartedAt = -1;
|
|
461
530
|
let preloadedEvents;
|
|
462
531
|
let preloadedEventsCursor;
|
|
532
|
+
// True only when `preloadedEvents` is known to be the
|
|
533
|
+
// COMPLETE event log (the lazy hook fast path's validated
|
|
534
|
+
// hasMore-false preload). Lets QuickJS trust it as-is —
|
|
535
|
+
// its own heuristic only recognizes first-invocation
|
|
536
|
+
// (run_created/run_started-only) preloads.
|
|
537
|
+
let preloadedEventsComplete = false;
|
|
463
538
|
// Latency telemetry (TTFS) state — see runtime/step-latency.ts.
|
|
464
539
|
// Whether this invocation's FIRST event snapshot contained
|
|
465
540
|
// nothing beyond run_created/run_started: anything else was
|
|
@@ -581,6 +656,15 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
581
656
|
});
|
|
582
657
|
}
|
|
583
658
|
};
|
|
659
|
+
// A plain orchestrator-replay message. Omits `runInput` (it
|
|
660
|
+
// re-engages turbo on the next delivery and wedges the run —
|
|
661
|
+
// see `reinvoke` below) and `replayDivergence` /
|
|
662
|
+
// `serverErrorRetryCount` (this delivery chain's budgets).
|
|
663
|
+
const replayMessage = async () => ({
|
|
664
|
+
runId,
|
|
665
|
+
traceCarrier: await nextTraceCarrier(),
|
|
666
|
+
requestedAt: new Date(),
|
|
667
|
+
});
|
|
584
668
|
const reinvoke = async (delaySeconds,
|
|
585
669
|
/**
|
|
586
670
|
* Extra fields to carry on the new message. Only reaches the
|
|
@@ -594,12 +678,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
594
678
|
assertNoInFlightOwnedSteps('reinvoke');
|
|
595
679
|
if (!turbo)
|
|
596
680
|
return { timeoutSeconds: delaySeconds };
|
|
597
|
-
await queueMessage(world, getWorkflowQueueName(workflowName, namespace), {
|
|
598
|
-
runId,
|
|
599
|
-
traceCarrier: await nextTraceCarrier(),
|
|
600
|
-
requestedAt: new Date(),
|
|
601
|
-
...extraPayload,
|
|
602
|
-
}, delaySeconds > 0 ? { delaySeconds } : undefined);
|
|
681
|
+
await queueMessage(world, getWorkflowQueueName(workflowName, namespace), { ...(await replayMessage()), ...extraPayload }, delaySeconds > 0 ? { delaySeconds } : undefined);
|
|
603
682
|
return undefined;
|
|
604
683
|
};
|
|
605
684
|
// Precondition (412) recovery: how many times this invocation
|
|
@@ -683,6 +762,14 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
683
762
|
return false;
|
|
684
763
|
}
|
|
685
764
|
preconditionRestarts++;
|
|
765
|
+
// Every stale-snapshot restart invalidates the parked VM:
|
|
766
|
+
// the log it consumed was missing events, so only a fresh
|
|
767
|
+
// replay over the corrected log is authoritative. This
|
|
768
|
+
// also covers the suspension-create 412, which fires
|
|
769
|
+
// before the retention decision (kill switch + step-input
|
|
770
|
+
// gate) ever ran, and the run_completed 412, where a
|
|
771
|
+
// completed session must not be resumed again.
|
|
772
|
+
retainedSession = null;
|
|
686
773
|
// A World MAY return the events we were missing on the 412.
|
|
687
774
|
// Trust it only on the FIRST restart: its completeness proof
|
|
688
775
|
// leans on the backend's own bookkeeping, so if that
|
|
@@ -725,6 +812,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
725
812
|
eventsCursor = null;
|
|
726
813
|
preloadedEvents = undefined;
|
|
727
814
|
preloadedEventsCursor = undefined;
|
|
815
|
+
preloadedEventsComplete = false;
|
|
728
816
|
pendingInlineDelta = null;
|
|
729
817
|
// The corrected log inserts the missing events BELOW the
|
|
730
818
|
// length already scanned for payload prewarming, shifting
|
|
@@ -793,6 +881,27 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
793
881
|
result: await reinvoke(getPreconditionReinvokeDelaySeconds(), { preconditionReinvocations: attempt }),
|
|
794
882
|
};
|
|
795
883
|
};
|
|
884
|
+
// Deployment-affinity guard, shared by the two paths that
|
|
885
|
+
// execute a run: queued step executions and flow replays.
|
|
886
|
+
const guardDeployment = async (run, reenqueuePayload, beforeStop) => {
|
|
887
|
+
const { outcome, spanAttributes } = await guardDeploymentAffinity({
|
|
888
|
+
world,
|
|
889
|
+
run,
|
|
890
|
+
requestId,
|
|
891
|
+
retryCount: deploymentMismatchRetryCount,
|
|
892
|
+
beforeStop,
|
|
893
|
+
isDeploymentUnavailableError: world.isDeploymentUnavailableError,
|
|
894
|
+
reenqueue: async ({ deploymentId, specVersion, deploymentMismatchRetryCount: retryCount, delaySeconds, }) => {
|
|
895
|
+
await queueMessage(world, getWorkflowQueueName(workflowName, namespace), {
|
|
896
|
+
...(await reenqueuePayload()),
|
|
897
|
+
deploymentMismatchRetryCount: retryCount,
|
|
898
|
+
}, { deploymentId, specVersion, delaySeconds });
|
|
899
|
+
},
|
|
900
|
+
});
|
|
901
|
+
if (spanAttributes)
|
|
902
|
+
span?.setAttributes(spanAttributes);
|
|
903
|
+
return outcome;
|
|
904
|
+
};
|
|
796
905
|
// If incoming message has a stepId, this is a background step
|
|
797
906
|
// execution. Execute the step, then check if all parallel steps
|
|
798
907
|
// from the batch are done. If so, replay inline (saving a queue
|
|
@@ -807,6 +916,15 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
807
916
|
runtimeLogger.debug('Run already finished, skipping background step', { workflowRunId: runId, status: bgRun.status });
|
|
808
917
|
return;
|
|
809
918
|
}
|
|
919
|
+
// Covers every queued step execution — first dispatch and
|
|
920
|
+
// redeliveries/retries alike.
|
|
921
|
+
if ((await guardDeployment(bgRun, async () => ({
|
|
922
|
+
...(await replayMessage()),
|
|
923
|
+
stepId: incomingStepId,
|
|
924
|
+
stepName: incomingStepName,
|
|
925
|
+
}))) !== 'continue') {
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
810
928
|
const bgStartedAt = bgRun.startedAt
|
|
811
929
|
? +bgRun.startedAt
|
|
812
930
|
: Date.now();
|
|
@@ -1004,9 +1122,175 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1004
1122
|
return;
|
|
1005
1123
|
}
|
|
1006
1124
|
}
|
|
1125
|
+
// --- Lazy hook resume fast path ---
|
|
1126
|
+
// A lazy hook delivery (resumeId + digest on the queue
|
|
1127
|
+
// message) hoists the consumer's idempotent hook_received
|
|
1128
|
+
// re-ensure above run_started and asks the World to return
|
|
1129
|
+
// the current replay log with the write (preloadEvents). A
|
|
1130
|
+
// supporting World answers with the reconstructed run, the
|
|
1131
|
+
// complete replay log, and the run's event ceiling —
|
|
1132
|
+
// everything the generic setup below would spend a
|
|
1133
|
+
// run_started POST and an events.list on. Any other result
|
|
1134
|
+
// (older server, a World that ignores the param, or a
|
|
1135
|
+
// preload that fails validation, including a bounded
|
|
1136
|
+
// hasMore page) falls back to that generic setup; the
|
|
1137
|
+
// hook_received write itself has still succeeded either
|
|
1138
|
+
// way, so the re-ensure block below is skipped via
|
|
1139
|
+
// `hookEnsured`. Never taken on turbo (turbo deliveries
|
|
1140
|
+
// carry runInput, not hookInput) or after the background
|
|
1141
|
+
// step path already loaded the run.
|
|
1142
|
+
let hookEnsured = false;
|
|
1143
|
+
if (!workflowRun &&
|
|
1144
|
+
hookInput &&
|
|
1145
|
+
hookInput.resumeId !== undefined &&
|
|
1146
|
+
hookInput.payloadDigest !== undefined) {
|
|
1147
|
+
const hookResumeInput = hookInput;
|
|
1148
|
+
// Date the materialized event to when the resume actually
|
|
1149
|
+
// occurred — same derivation as the re-ensure below (the
|
|
1150
|
+
// resumeId is a ULID minted by resumeHook() at resume
|
|
1151
|
+
// time).
|
|
1152
|
+
let occurredAt;
|
|
1153
|
+
try {
|
|
1154
|
+
occurredAt = new Date(decodeTime(hookResumeInput.resumeId));
|
|
1155
|
+
}
|
|
1156
|
+
catch {
|
|
1157
|
+
occurredAt = undefined;
|
|
1158
|
+
}
|
|
1159
|
+
try {
|
|
1160
|
+
span?.addEvent('workflow.hook_received.create.start', {
|
|
1161
|
+
'workflow.hook_received.preload_events': true,
|
|
1162
|
+
});
|
|
1163
|
+
const result = await createEvent({
|
|
1164
|
+
eventType: 'hook_received',
|
|
1165
|
+
specVersion: SPEC_VERSION_CURRENT,
|
|
1166
|
+
correlationId: hookResumeInput.hookId,
|
|
1167
|
+
eventData: {
|
|
1168
|
+
token: hookResumeInput.token,
|
|
1169
|
+
payload: hookResumeInput.payload,
|
|
1170
|
+
},
|
|
1171
|
+
}, {
|
|
1172
|
+
requestId,
|
|
1173
|
+
occurredAt,
|
|
1174
|
+
resumeId: hookResumeInput.resumeId,
|
|
1175
|
+
resumePayloadDigest: hookResumeInput.payloadDigest,
|
|
1176
|
+
preloadEvents: true,
|
|
1177
|
+
});
|
|
1178
|
+
hookEnsured = true;
|
|
1179
|
+
// Note: unlike the re-ensure below, this hoisted write
|
|
1180
|
+
// does NOT set HookResilientResumeMaterialized — it
|
|
1181
|
+
// runs on every fast-path resume, including the common
|
|
1182
|
+
// case where the producer's direct write already landed
|
|
1183
|
+
// and this call merely converged on it, so it carries
|
|
1184
|
+
// no recovery signal. workflow.resume_setup_source
|
|
1185
|
+
// (below) describes this path instead.
|
|
1186
|
+
// The preload is usable as replay input only when it is
|
|
1187
|
+
// demonstrably the complete picture: a reconstructed
|
|
1188
|
+
// run with a start time, a non-empty COMPLETE log
|
|
1189
|
+
// (hasMore false — this path has no cursor-continuation
|
|
1190
|
+
// machinery, so a bounded page must not be trusted),
|
|
1191
|
+
// the server's event ceiling (this response plays
|
|
1192
|
+
// run_started's role, so a missing ceiling would leave
|
|
1193
|
+
// event-limit enforcement disabled for the run),
|
|
1194
|
+
// both run lifecycle events, the canonical event this
|
|
1195
|
+
// write converged on, and the hook_received matching
|
|
1196
|
+
// THIS resume (so we never replay against a log that is
|
|
1197
|
+
// missing the very event that triggered this delivery).
|
|
1198
|
+
const usableReplayPreload = result.run !== undefined &&
|
|
1199
|
+
result.run.startedAt !== undefined &&
|
|
1200
|
+
result.event !== undefined &&
|
|
1201
|
+
result.events !== undefined &&
|
|
1202
|
+
result.events.length > 0 &&
|
|
1203
|
+
result.cursor != null &&
|
|
1204
|
+
result.hasMore === false &&
|
|
1205
|
+
typeof result.maxEvents === 'number' &&
|
|
1206
|
+
result.events.some((e) => e.eventType === 'run_created') &&
|
|
1207
|
+
result.events.some((e) => e.eventType === 'run_started') &&
|
|
1208
|
+
result.events.some((e) => e.eventType === 'hook_received' &&
|
|
1209
|
+
e.resumeId === hookResumeInput.resumeId);
|
|
1210
|
+
if (usableReplayPreload &&
|
|
1211
|
+
result.run?.startedAt &&
|
|
1212
|
+
result.events) {
|
|
1213
|
+
// The reconstructed run always reads 'running', but a
|
|
1214
|
+
// terminal event committed concurrently rides in the
|
|
1215
|
+
// log itself. The node replay loop would catch it, but
|
|
1216
|
+
// QuickJS dispatches before that check — so consume
|
|
1217
|
+
// the delivery here, before any engine runs. Same
|
|
1218
|
+
// outcome as the run_started path's non-running
|
|
1219
|
+
// status check.
|
|
1220
|
+
const terminalEvent = result.events.find((e) => e.runId === runId &&
|
|
1221
|
+
(e.eventType === 'run_completed' ||
|
|
1222
|
+
e.eventType === 'run_failed' ||
|
|
1223
|
+
e.eventType === 'run_cancelled'));
|
|
1224
|
+
if (terminalEvent) {
|
|
1225
|
+
// The preload still initialized this delivery (it
|
|
1226
|
+
// is how the terminal state was observed), so the
|
|
1227
|
+
// setup-source and the run's actual terminal
|
|
1228
|
+
// status are recorded before consuming.
|
|
1229
|
+
span?.setAttributes({
|
|
1230
|
+
...Attribute.WorkflowRunStatus(terminalEvent.eventType === 'run_completed'
|
|
1231
|
+
? 'completed'
|
|
1232
|
+
: terminalEvent.eventType === 'run_failed'
|
|
1233
|
+
? 'failed'
|
|
1234
|
+
: 'cancelled'),
|
|
1235
|
+
...Attribute.HookResumeSetupSource('hook_received_stream'),
|
|
1236
|
+
});
|
|
1237
|
+
runtimeLogger.info('Run already finished during lazy hook setup, skipping', {
|
|
1238
|
+
workflowRunId: runId,
|
|
1239
|
+
eventType: terminalEvent.eventType,
|
|
1240
|
+
});
|
|
1241
|
+
return;
|
|
1242
|
+
}
|
|
1243
|
+
workflowRun = result.run;
|
|
1244
|
+
maxEventsLimit = clampMaxEvents(result.maxEvents);
|
|
1245
|
+
// Anchors RSFS — see the declaration above. This
|
|
1246
|
+
// response plays run_started's role on this path.
|
|
1247
|
+
runStartedReceivedAtMs = Date.now();
|
|
1248
|
+
preloadedEvents = result.events;
|
|
1249
|
+
preloadedEventsCursor = result.cursor;
|
|
1250
|
+
// The validated preload is the COMPLETE log (hasMore
|
|
1251
|
+
// false), so QuickJS may trust it as-is instead of
|
|
1252
|
+
// refetching — its own first-invocation heuristic
|
|
1253
|
+
// only recognizes run_created/run_started preloads.
|
|
1254
|
+
preloadedEventsComplete = true;
|
|
1255
|
+
workflowStartedAt = +result.run.startedAt;
|
|
1256
|
+
span?.setAttributes({
|
|
1257
|
+
...Attribute.WorkflowRunStatus(result.run.status),
|
|
1258
|
+
...Attribute.WorkflowStartedAt(workflowStartedAt),
|
|
1259
|
+
...Attribute.HookResumeSetupSource('hook_received_stream'),
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
else {
|
|
1263
|
+
// Successful write, no usable preload (CBOR response
|
|
1264
|
+
// from an older server, a World that ignored the
|
|
1265
|
+
// opt-in, a bounded hasMore page, or a preload that
|
|
1266
|
+
// failed validation): take the generic run_started
|
|
1267
|
+
// setup below. Its preload is loaded after this write
|
|
1268
|
+
// committed, so the canonical hook_received is part
|
|
1269
|
+
// of whatever log that setup reads — no splice
|
|
1270
|
+
// needed.
|
|
1271
|
+
span?.setAttributes(Attribute.HookResumeSetupSource('hook_received_fallback'));
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
catch (err) {
|
|
1275
|
+
// Same classification as the re-ensure below:
|
|
1276
|
+
// - HookNotFound / RunExpired: the run went terminal;
|
|
1277
|
+
// nothing left to resume, consume the message.
|
|
1278
|
+
// - anything else (EntityConflict, a truncated preload
|
|
1279
|
+
// stream, transport failures): transient — rethrow so
|
|
1280
|
+
// the queue redelivers and the idempotent
|
|
1281
|
+
// (runId, resumeId) claim converges on retry.
|
|
1282
|
+
if (HookNotFoundError.is(err) ||
|
|
1283
|
+
RunExpiredError.is(err)) {
|
|
1284
|
+
runtimeLogger.info('Run already finished during lazy hook setup, skipping', { workflowRunId: runId, message: err.message });
|
|
1285
|
+
return;
|
|
1286
|
+
}
|
|
1287
|
+
throw err;
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1007
1290
|
// --- Infrastructure: prepare the run state ---
|
|
1008
1291
|
// Skip if workflowRun was already set by the background
|
|
1009
|
-
// step path (inline replay after all parallel steps done)
|
|
1292
|
+
// step path (inline replay after all parallel steps done)
|
|
1293
|
+
// or by the lazy hook fast path above.
|
|
1010
1294
|
if (!workflowRun) {
|
|
1011
1295
|
// Always call run_started directly — this both transitions
|
|
1012
1296
|
// the run to 'running' AND returns the run entity, saving
|
|
@@ -1196,6 +1480,25 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1196
1480
|
}
|
|
1197
1481
|
} // end else (non-turbo run_started)
|
|
1198
1482
|
} // end if (!workflowRun)
|
|
1483
|
+
// Covers every flow replay — initial start, step completions,
|
|
1484
|
+
// hook resumptions, wait completions — and stops before any
|
|
1485
|
+
// workflow code, inline step, or event write happens when the
|
|
1486
|
+
// run is not pinned here (see `guardDeploymentAffinity`).
|
|
1487
|
+
// `awaitRunReady` orders turbo's `run_started` before either
|
|
1488
|
+
// stopping action.
|
|
1489
|
+
//
|
|
1490
|
+
// Runs ahead of the lazy-hook re-ensure below, so a misrouted
|
|
1491
|
+
// resume writes nothing here — which means the re-routed
|
|
1492
|
+
// message must carry `hookInput`, or a resume whose producer
|
|
1493
|
+
// write had not yet landed would be lost (that re-ensure is
|
|
1494
|
+
// idempotent per `resumeId`, so the pinned deployment still
|
|
1495
|
+
// converges on one event).
|
|
1496
|
+
if ((await guardDeployment(workflowRun, async () => ({
|
|
1497
|
+
...(await replayMessage()),
|
|
1498
|
+
...(hookInput ? { hookInput } : {}),
|
|
1499
|
+
}), awaitRunReady)) !== 'continue') {
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1199
1502
|
// Lazy hook resume: the producer (resumeHook fast path)
|
|
1200
1503
|
// parallelized the `hook_received` write with this queue
|
|
1201
1504
|
// publish, so the event may not be persisted yet. Idempotently
|
|
@@ -1204,8 +1507,12 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1204
1507
|
// (the server resolves a matching claim as success, not an
|
|
1205
1508
|
// error). `hookInput` never rides a turbo first-delivery
|
|
1206
1509
|
// (that path carries `runInput`, not `hookInput`), so this
|
|
1207
|
-
// only runs on the normal load-and-replay path.
|
|
1208
|
-
|
|
1510
|
+
// only runs on the normal load-and-replay path. Skipped
|
|
1511
|
+
// entirely when the fast path above already ensured the
|
|
1512
|
+
// event (`hookEnsured`) — successfully or via its fallback,
|
|
1513
|
+
// whose run_started preload was loaded after the write and
|
|
1514
|
+
// therefore already contains the canonical event.
|
|
1515
|
+
if (hookInput && !hookEnsured) {
|
|
1209
1516
|
// Perf (Option A): if the producer's concurrent direct
|
|
1210
1517
|
// write already landed in the run_started preload, the
|
|
1211
1518
|
// canonical event is in the log and the re-ensure round trip
|
|
@@ -1215,6 +1522,13 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1215
1522
|
// hook_received). Best-effort: the win lands only when the
|
|
1216
1523
|
// producer's write beat this consumer's load; otherwise we
|
|
1217
1524
|
// fall through to the idempotent re-ensure below.
|
|
1525
|
+
//
|
|
1526
|
+
// Intentionally unreachable for atomic lazy resumes
|
|
1527
|
+
// (resumeId + digest): those set `hookEnsured` in the
|
|
1528
|
+
// hoisted fast path above — on success AND on its
|
|
1529
|
+
// fallback — so this block (and the skip check) now only
|
|
1530
|
+
// serves hookInput shapes without the full idempotency
|
|
1531
|
+
// pair.
|
|
1218
1532
|
const alreadyPreloaded = hookInput.resumeId !== undefined &&
|
|
1219
1533
|
preloadedEvents?.some((e) => e.eventType === 'hook_received' &&
|
|
1220
1534
|
e.resumeId === hookInput.resumeId);
|
|
@@ -1332,11 +1646,12 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1332
1646
|
else {
|
|
1333
1647
|
preloadedEvents = undefined;
|
|
1334
1648
|
preloadedEventsCursor = undefined;
|
|
1649
|
+
preloadedEventsComplete = false;
|
|
1335
1650
|
}
|
|
1336
1651
|
} // end else (re-ensure needed)
|
|
1337
1652
|
}
|
|
1338
1653
|
// Resolve the encryption key for this run's deployment.
|
|
1339
|
-
// Used eagerly here since both
|
|
1654
|
+
// Used eagerly here since both workflow execution (input
|
|
1340
1655
|
// hydration / hook payload decryption) and the run_failed
|
|
1341
1656
|
// dehydrate path below need it. Memoized accessor: first
|
|
1342
1657
|
// call triggers the actual fetch / HKDF derivation,
|
|
@@ -1348,6 +1663,10 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1348
1663
|
// VM created by each inline replay, but never crosses runs or
|
|
1349
1664
|
// queue deliveries.
|
|
1350
1665
|
const replayPayloadCache = new ReplayPayloadCache(encryptionKey);
|
|
1666
|
+
// The live VM parked at the previous boundary, when the
|
|
1667
|
+
// retention decision kept it. null → this iteration cold-
|
|
1668
|
+
// replays. Invocation-scoped: dies with this delivery.
|
|
1669
|
+
let retainedSession = null;
|
|
1351
1670
|
// Main replay loop
|
|
1352
1671
|
// biome-ignore lint/correctness/noConstantCondition: intentional loop
|
|
1353
1672
|
while (true) {
|
|
@@ -1373,7 +1692,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1373
1692
|
}
|
|
1374
1693
|
// Check timeout before replay
|
|
1375
1694
|
if (Date.now() - invocationStartTime >=
|
|
1376
|
-
|
|
1695
|
+
noInlineReplayAfterMs) {
|
|
1377
1696
|
runtimeLogger.info('V2 timeout reached, re-scheduling workflow', {
|
|
1378
1697
|
workflowRunId: runId,
|
|
1379
1698
|
loopIteration,
|
|
@@ -1393,6 +1712,81 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1393
1712
|
// as the `sinceCursor` for the inline-delta optimization.
|
|
1394
1713
|
let preInlineWriteCursor = null;
|
|
1395
1714
|
try {
|
|
1715
|
+
// --- QuickJS VM engine dispatch ---
|
|
1716
|
+
// The QuickJS engine (opt-in via WORKFLOW_VM=quickjs
|
|
1717
|
+
// or executionContext.workflowVm) is a self-contained
|
|
1718
|
+
// alternative to the node:vm inline-replay logic
|
|
1719
|
+
// below. It performs the same full event replay, but
|
|
1720
|
+
// runs the workflow code in a QuickJS WASM VM, queues
|
|
1721
|
+
// steps via the same combined route (so they hit
|
|
1722
|
+
// executeStep below on re-entry), and manages its own
|
|
1723
|
+
// run_completed / run_failed lifecycle for workflow
|
|
1724
|
+
// outcomes. When the QuickJS engine is in effect,
|
|
1725
|
+
// return immediately after dispatch.
|
|
1726
|
+
//
|
|
1727
|
+
// Deliberately INSIDE this try: engine failures that
|
|
1728
|
+
// escape the entrypoint (MaxEventsExceededError, a
|
|
1729
|
+
// WASM OOM at the memory ceiling, a bundle-eval
|
|
1730
|
+
// failure) must reach this loop's catch so they are
|
|
1731
|
+
// classified and recorded as run_failed — outside the
|
|
1732
|
+
// try they would nack the message and burn all queue
|
|
1733
|
+
// redeliveries before dying as
|
|
1734
|
+
// MAX_DELIVERIES_EXCEEDED. Transient world errors
|
|
1735
|
+
// still rethrow out of the catch for redelivery, same
|
|
1736
|
+
// as node-engine replay failures.
|
|
1737
|
+
if (useQuickJSVm(workflowRun)) {
|
|
1738
|
+
runtimeLogger.debug('Using QuickJS VM engine', {
|
|
1739
|
+
workflowRunId: runId,
|
|
1740
|
+
loopIteration,
|
|
1741
|
+
});
|
|
1742
|
+
// Under turbo, run_started is backgrounded. The
|
|
1743
|
+
// QuickJS entrypoint fetches the event log and
|
|
1744
|
+
// writes events directly, so wait for the run to be
|
|
1745
|
+
// durably started first — it does not thread the
|
|
1746
|
+
// turbo runReadyBarrier the way handleSuspension
|
|
1747
|
+
// does.
|
|
1748
|
+
await awaitRunReady();
|
|
1749
|
+
// Lazy import: the QuickJS entrypoint's import chain
|
|
1750
|
+
// embeds the base64 WASM binary + extensions
|
|
1751
|
+
// (~1.3 MB decoded at module scope). Loading it here
|
|
1752
|
+
// keeps that out of node-engine deployments entirely
|
|
1753
|
+
// — only the opt-in path pays, on first dispatch.
|
|
1754
|
+
const { runWorkflowWithQuickJS } = await import('./runtime/quickjs-entrypoint.js');
|
|
1755
|
+
const quickjsResult = await runWorkflowWithQuickJS({
|
|
1756
|
+
workflowCode,
|
|
1757
|
+
workflowName,
|
|
1758
|
+
workflowRun,
|
|
1759
|
+
preloadedEvents,
|
|
1760
|
+
preloadedEventsComplete,
|
|
1761
|
+
runInput,
|
|
1762
|
+
parentSpan: span,
|
|
1763
|
+
maxEventsLimit,
|
|
1764
|
+
namespace,
|
|
1765
|
+
nextTraceCarrier,
|
|
1766
|
+
// Inline-step ownership plumbing: redeliveries of
|
|
1767
|
+
// this message drive crash recovery for steps an
|
|
1768
|
+
// earlier invocation claimed inline (see the
|
|
1769
|
+
// backstop pass in the entrypoint's loop), and
|
|
1770
|
+
// the message id is stamped as `ownerMessageId`
|
|
1771
|
+
// on inline lazy step claims so wake replays
|
|
1772
|
+
// defer to the in-flight body instead of
|
|
1773
|
+
// requeueing the step.
|
|
1774
|
+
deliveryAttempt: metadata.attempt,
|
|
1775
|
+
ownerMessageId: metadata.messageId,
|
|
1776
|
+
});
|
|
1777
|
+
if (quickjsResult?.timeoutSeconds !== undefined) {
|
|
1778
|
+
// Use `reinvoke` rather than returning
|
|
1779
|
+
// `{ timeoutSeconds }` directly: under turbo the
|
|
1780
|
+
// current message carries `runInput` and a
|
|
1781
|
+
// reschedule would re-engage turbo on redelivery
|
|
1782
|
+
// (replaying against a stale preloaded log and
|
|
1783
|
+
// wedging the run — see the reinvoke() docs
|
|
1784
|
+
// above). reinvoke enqueues an explicit
|
|
1785
|
+
// continuation without `runInput` in that case.
|
|
1786
|
+
return await reinvoke(quickjsResult.timeoutSeconds);
|
|
1787
|
+
}
|
|
1788
|
+
return;
|
|
1789
|
+
}
|
|
1396
1790
|
// Load events — use cached events with incremental fetch on subsequent iterations.
|
|
1397
1791
|
// The server always returns a cursor when there are events (even on the
|
|
1398
1792
|
// final page), so we can reliably use it for incremental loading.
|
|
@@ -1590,28 +1984,51 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1590
1984
|
// events.list. Captured here because nothing between this
|
|
1591
1985
|
// point and the inline executeStep mutates eventsCursor.
|
|
1592
1986
|
preInlineWriteCursor = eventsCursor;
|
|
1593
|
-
|
|
1594
|
-
runtimeLogger.debug('Starting workflow replay', {
|
|
1987
|
+
runtimeLogger.debug('Starting workflow execution', {
|
|
1595
1988
|
workflowRunId: runId,
|
|
1596
1989
|
loopIteration,
|
|
1597
1990
|
eventCount: events.length,
|
|
1991
|
+
executionMode: retainedSession ? 'retained' : 'replay',
|
|
1598
1992
|
});
|
|
1599
1993
|
replayStart = Date.now();
|
|
1600
|
-
// Start every missing decrypt/decompress operation
|
|
1601
|
-
//
|
|
1994
|
+
// Start every missing decrypt/decompress operation up
|
|
1995
|
+
// front (already-prepared payloads are skipped). Web
|
|
1996
|
+
// Crypto work overlaps VM setup on the replay path and
|
|
1997
|
+
// the appended events' consumption on the resume path;
|
|
1602
1998
|
// consumers still deserialize and resolve in event order.
|
|
1603
1999
|
const payloadPrewarm = replayPayloadCache.prewarm(workflowRun, events);
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
2000
|
+
let workflowResult = retainedSession
|
|
2001
|
+
? await resumeWorkflow(retainedSession, events)
|
|
2002
|
+
: { type: 'replay' };
|
|
2003
|
+
if (workflowResult.type === 'replay') {
|
|
2004
|
+
retainedSession = null;
|
|
2005
|
+
workflowResult = await replayWorkflow({
|
|
2006
|
+
workflowCode,
|
|
2007
|
+
workflowRun,
|
|
2008
|
+
events,
|
|
2009
|
+
encryptionKey,
|
|
2010
|
+
replayPayloadCache,
|
|
2011
|
+
// Turbo: the end-of-run drain inside workflow
|
|
2012
|
+
// execution commits fire-and-forget `*_created`
|
|
2013
|
+
// events before the terminal `awaitRunReady()` below.
|
|
2014
|
+
runReadyBarrier,
|
|
2015
|
+
worldCapabilities: world.capabilities,
|
|
2016
|
+
});
|
|
2017
|
+
}
|
|
1610
2018
|
await payloadPrewarm;
|
|
1611
|
-
|
|
2019
|
+
if (workflowResult.type === 'suspended') {
|
|
2020
|
+
// Park the live session; the suspension catch below
|
|
2021
|
+
// makes the one retention decision — keep it for the
|
|
2022
|
+
// next iteration or discard it for a fresh replay.
|
|
2023
|
+
retainedSession = workflowResult.session;
|
|
2024
|
+
throw workflowResult.suspension;
|
|
2025
|
+
}
|
|
2026
|
+
const result = workflowResult.output;
|
|
2027
|
+
runtimeLogger.debug('Workflow execution completed', {
|
|
1612
2028
|
workflowRunId: runId,
|
|
1613
2029
|
loopIteration,
|
|
1614
2030
|
replayMs: Date.now() - replayStart,
|
|
2031
|
+
executionMode: retainedSession ? 'retained' : 'replay',
|
|
1615
2032
|
});
|
|
1616
2033
|
replayRecoveryReporter.activate();
|
|
1617
2034
|
// Workflow completed. Send the snapshot but do NOT
|
|
@@ -1650,7 +2067,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1650
2067
|
catch (err) {
|
|
1651
2068
|
if (WorkflowSuspension.is(err)) {
|
|
1652
2069
|
replayRecoveryReporter.activate();
|
|
1653
|
-
// Synchronous
|
|
2070
|
+
// Synchronous workflow-execution duration for THIS
|
|
1654
2071
|
// suspension only — anchors the `finalSchedulingReplay`
|
|
1655
2072
|
// telemetry field below (see
|
|
1656
2073
|
// StepLatencyTracking.replayMs). This is the FINAL
|
|
@@ -1674,7 +2091,10 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1674
2091
|
// server spans are heavily sampled in production
|
|
1675
2092
|
// (~7%), and client spans can't be filtered by SDK
|
|
1676
2093
|
// version, so neither can serve as the dashboard's
|
|
1677
|
-
// exact TTFS decomposition.
|
|
2094
|
+
// exact TTFS decomposition. On a retained-VM
|
|
2095
|
+
// resume this measures the resume (typically ~0ms),
|
|
2096
|
+
// not a replay, so the field's distribution is
|
|
2097
|
+
// bimodal once retention is active.
|
|
1678
2098
|
const replayDurationMs = Date.now() - replayStart;
|
|
1679
2099
|
runtimeLogger.debug('Workflow suspended', {
|
|
1680
2100
|
workflowRunId: runId,
|
|
@@ -1796,6 +2216,30 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1796
2216
|
return;
|
|
1797
2217
|
}
|
|
1798
2218
|
eventsCursor = suspensionLog.cursor;
|
|
2219
|
+
// Open hooks/waits in the log as loaded for this
|
|
2220
|
+
// replay. This suspension's own hook/wait writes are
|
|
2221
|
+
// NOT in it — they never reach retention anyway,
|
|
2222
|
+
// because a suspension containing a non-step item
|
|
2223
|
+
// fails canRetainWorkflowSession's type check before
|
|
2224
|
+
// the scan is consulted. Computed
|
|
2225
|
+
// lazily, at most once, and shared between the
|
|
2226
|
+
// retention decision here and the delta/turbo gates
|
|
2227
|
+
// below — the attr-detour and hook-conflict paths
|
|
2228
|
+
// return/continue before the gates and usually
|
|
2229
|
+
// short-circuit before ever scanning the log.
|
|
2230
|
+
// Narrowed alias: the closure below would otherwise
|
|
2231
|
+
// lose `cachedEvents`'s non-null narrowing. Nothing in
|
|
2232
|
+
// this catch scope reassigns the array.
|
|
2233
|
+
const suspensionEvents = cachedEvents;
|
|
2234
|
+
const openHookWait = once(() => openHookAndWaitState(suspensionEvents));
|
|
2235
|
+
// The single retention decision: keep the parked
|
|
2236
|
+
// session only across a pure step boundary with no
|
|
2237
|
+
// out-of-band continuation source and provably
|
|
2238
|
+
// passive step inputs.
|
|
2239
|
+
if (retainedSession &&
|
|
2240
|
+
!canRetainWorkflowSession(err, suspensionResult.retainedStepInputsSafe, openHookWait)) {
|
|
2241
|
+
retainedSession = null;
|
|
2242
|
+
}
|
|
1799
2243
|
preStepBlockingMs += suspensionResult.hookCreationMs;
|
|
1800
2244
|
if (suspensionResult.hasAttributeEvents &&
|
|
1801
2245
|
preStepBlockingBeforeAttrMs === undefined) {
|
|
@@ -2052,16 +2496,9 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2052
2496
|
}
|
|
2053
2497
|
return;
|
|
2054
2498
|
}
|
|
2055
|
-
//
|
|
2056
|
-
//
|
|
2057
|
-
|
|
2058
|
-
// maxDuration, not by the replay timeout. Without
|
|
2059
|
-
// this the replay-budget check at the top of the
|
|
2060
|
-
// next loop iteration would (incorrectly) charge
|
|
2061
|
-
// the step body against the budget.
|
|
2062
|
-
// Open hooks/waits in the cumulative log, computed
|
|
2063
|
-
// once for the two gates below.
|
|
2064
|
-
const openHookWaitState = openHookAndWaitState(cachedEvents ?? []);
|
|
2499
|
+
// Open hooks/waits are consulted by all three gates
|
|
2500
|
+
// below; resolve the memoized scan once here.
|
|
2501
|
+
const openHookWaitState = openHookWait.value;
|
|
2065
2502
|
// Inline-delta fast path gate. We request the delta —
|
|
2066
2503
|
// and on the next iteration consume it in place of the
|
|
2067
2504
|
// events.list — only when ALL hold:
|
|
@@ -2219,7 +2656,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2219
2656
|
// snapshot has a local-clock createdAt, so under
|
|
2220
2657
|
// turbo only the run-id ULID timestamp is trusted.
|
|
2221
2658
|
const latencyTracking = computeStepLatencyTracking({
|
|
2222
|
-
events: cachedEvents
|
|
2659
|
+
events: cachedEvents,
|
|
2223
2660
|
invocationStartedClean: invocationStartedClean === true,
|
|
2224
2661
|
runCreatedAtMs: runIdCreatedAt(runId) ??
|
|
2225
2662
|
(turbo ? undefined : +workflowRun.createdAt),
|
|
@@ -2245,7 +2682,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2245
2682
|
// when the guard env flag is off, so this is a no-op
|
|
2246
2683
|
// outside guarded deployments; Worlds that don't
|
|
2247
2684
|
// enforce the guard ignore it.
|
|
2248
|
-
const inlineClaimSnapshot = preconditionSnapshotParams(cachedEvents
|
|
2685
|
+
const inlineClaimSnapshot = preconditionSnapshotParams(cachedEvents, preInlineWriteCursor);
|
|
2249
2686
|
replayBudget.pause();
|
|
2250
2687
|
let stepResults;
|
|
2251
2688
|
const stepExecutionPromises = inlineExecutions.map((s, stepIndex) => {
|
|
@@ -2764,4 +3201,4 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
2764
3201
|
});
|
|
2765
3202
|
});
|
|
2766
3203
|
}
|
|
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==
|
|
3204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUVyQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0Qs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QyxDQUFDO2dCQUNuRSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUM7YUFDeEQ7U0FDRixFQUNELEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO29CQUM1RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FDL0IsbUNBQW1DLEVBQ25DLEtBQUssSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FDL0IsQ0FBQztvQkFDRixPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxhQUFhLENBQ2pCLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2xELENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlLCBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG4gIGlzVm1SZXRlbnRpb25FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMgfSBmcm9tICcuL3J1bnRpbWUvY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERlcGxveW1lbnRBZmZpbml0eU91dGNvbWUsXG4gIGd1YXJkRGVwbG95bWVudEFmZmluaXR5LFxuICB0eXBlIFJlZW5xdWV1ZUFyZ3MsXG59IGZyb20gJy4vcnVudGltZS9kZXBsb3ltZW50LWd1YXJkLmpzJztcbmltcG9ydCB7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgdHlwZSBFdmVudENyZWF0b3IsXG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGluc2VydEV2ZW50QnlFdmVudElkLFxuICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5LFxuICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlLFxuICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUsXG4gIHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLW93bmVyc2hpcC5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyB1c2VRdWlja0pTVm0gfSBmcm9tICcuL3J1bnRpbWUvdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHR5cGUgV29ybGRIYW5kbGVycyxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1xuICByZXBsYXlXb3JrZmxvdyxcbiAgcmVzdW1lV29ya2Zsb3csXG4gIHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQsXG4gIHR5cGUgV29ya2Zsb3dTZXNzaW9uLFxufSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHR5cGUgUmVzdW1lZEhvb2ssXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBjYW5jZWxSdW5zLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHR5cGUgUmVlbnF1ZXVlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBvcHRpb25hbCBjbGllbnQtc2lkZSBldmVudC1saW1pdCBvdmVycmlkZS5cbiAqIGBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCwgd2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCBjbGFtcHMgdGhlXG4gKiBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIHRvIGEgc21hbGxlciB2YWx1ZSBzbyBlbmZvcmNlbWVudCBjYW5cbiAqIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGEgc2VydmVyLXNpZGUgY2hhbmdlLiBDbGFtcC1kb3duIG9ubHk6IGl0IG5ldmVyIHJhaXNlc1xuICogdGhlIHNlcnZlcidzIGxpbWl0LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgbm9uZS5cbiAqIFVuc2V0IOKHkiBzZXJ2ZXIgdmFsdWUgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBjbGFtcE1heEV2ZW50cyhzZXJ2ZXJWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBnZXRNYXhFdmVudHNPdmVycmlkZSgpO1xuICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNlcnZlclZhbHVlO1xuICByZXR1cm4gc2VydmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlIDogTWF0aC5taW4oc2VydmVyVmFsdWUsIG92ZXJyaWRlKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgYSBxdWV1ZSBkZWxpdmVyeSB3aG9zZSBydW4gd2FzIGNyZWF0ZWQgaW4gYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdGhhblxuICogdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4uXG4gKlxuICogYHN0YXJ0KClgIHBlcmZvcm1zIHR3byB3cml0ZXMgdGhhdCBtdXN0IGxhbmQgaW4gdGhlIHNhbWUgdGVuYW50OiB0aGVcbiAqIGBydW5fY3JlYXRlZGAgZXZlbnQsIGF0dHJpYnV0ZWQgdG8gd2hhdGV2ZXIgZW52aXJvbm1lbnQgdGhlICpjYWxsZXIqXG4gKiBhdXRoZW50aWNhdGVzIGFzLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UsIHBpbm5lZCB0byBhICpkZXBsb3ltZW50Ki4gQVxuICogbWlzY29uZmlndXJlZCBjYWxsZXIgY2FuIHNwbGl0IHRoZW0g4oCUIHdyaXRpbmcgdGhlIHJ1biB0byBvbmUgZW52aXJvbm1lbnRcbiAqIHdoaWxlIGFkZHJlc3NpbmcgdGhlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIuIFRoZSBjb25zdW1lciB0aGVuXG4gKiBmaW5kcyBubyBydW4gdW5kZXIgaXRzIG93biB0ZW5hbnQgYW5kIHRoZSBiYWNrZW5kJ3MgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bl9zdGFydGVkYCBjcmVhdGVzIHRoZSBydW4gd2hlbiBgcnVuX2NyZWF0ZWRgIHdhcyBuZXZlciBzZWVuKSBtaW50cyBhXG4gKiBTRUNPTkQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gQm90aCBjb3BpZXMgYXJlIHJlYWw6IHRoZVxuICogY3JlYXRvcidzIHNpdHMgcGVuZGluZyBmb3JldmVyLCB0aGlzIG9uZSBleGVjdXRlcywgYW5kIGV2ZXJ5IHN1YnNlcXVlbnRcbiAqIGNyb3NzLXRlbmFudCBxdWV1ZSBhY2sgZmFpbHMgdG8gZmluZCBpdHMgbWVzc2FnZS5cbiAqXG4gKiBOb3RoaW5nIGV4dGVybmFsIGlzIG5lZWRlZCB0byBjYXRjaCB0aGlzOiB0aGUgY3JlYXRvcidzIGVudmlyb25tZW50IHJpZGVzIHRoZVxuICogbWVzc2FnZSBpbiBgcnVuSW5wdXQuZW52aXJvbm1lbnRgIGFuZCB0aGlzIHByb2Nlc3MgYWxyZWFkeSBrbm93cyBpdHMgb3duLiBTb1xuICogY29tcGFyZSB0aGVtIGFuZCBzdG9wIEJFRk9SRSBgcnVuX3N0YXJ0ZWRgIOKAlCB0aGUgd3JpdGUgdGhhdCB3b3VsZCBjcmVhdGUgdGhlXG4gKiBmb3JrLiBSZWZ1c2luZyBhZnRlciBpdCB3b3VsZCBiZSB0b28gbGF0ZS5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBjYWxsZXIgbXVzdCBhYmFuZG9uIHRoZSBkZWxpdmVyeS4gU2tpcHBlZCB3aGVuZXZlclxuICogZWl0aGVyIHNpZGUgaXMgdW5rbm93biwgd2hpY2gga2VlcHMgZXZlcnkgZXhpc3Rpbmcgc2V0dXAgb24gaXRzIGN1cnJlbnRcbiAqIGJlaGF2aW9yOiB3b3JsZHMgd2l0aCBubyBlbnZpcm9ubWVudCBkaW1lbnNpb24gKGB3b3JsZC1sb2NhbGAsXG4gKiBgd29ybGQtcG9zdGdyZXNgKSBkb24ndCBpbXBsZW1lbnQgYGdldEVudmlyb25tZW50YCwgYW5kIHJ1bnMgc3RhcnRlZCBieSBhblxuICogb2xkZXIgU0RLIGNhcnJ5IG5vIGBlbnZpcm9ubWVudGAgZmllbGQuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IGJvb2xlYW4ge1xuICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSBydW5JbnB1dD8uZW52aXJvbm1lbnQ7XG4gIGlmICghY3JlYXRvckVudmlyb25tZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY3VycmVudEVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuICBpZiAoIWN1cnJlbnRFbnZpcm9ubWVudCB8fCBjdXJyZW50RW52aXJvbm1lbnQgPT09IGNyZWF0b3JFbnZpcm9ubWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICBgUmVmdXNpbmcgdG8gcnVuIHRoaXMgd29ya2Zsb3c6IGl0IHdhcyBjcmVhdGVkIGluIHRoZSBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGAgK1xuICAgICAgYGVudmlyb25tZW50IGJ1dCB0aGlzIGRlcGxveW1lbnQgcnVucyBpbiBcIiR7Y3VycmVudEVudmlyb25tZW50fVwiLiBgICtcbiAgICAgICdFeGVjdXRpbmcgaXQgaGVyZSB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gJyArXG4gICAgICAnYm90aCBlbnZpcm9ubWVudHMg4oCUIG9uZSBwZW5kaW5nIGZvcmV2ZXIsIG9uZSBydW5uaW5nIOKAlCBzbyB0aGUgcXVldWUgJyArXG4gICAgICAnbWVzc2FnZSBpcyBiZWluZyBkaXNjYXJkZWQgd2l0aG91dCBleGVjdXRpbmcgYW5kIHdpdGhvdXQgcmV0cnlpbmcuICcgK1xuICAgICAgJ1RoZSBjbGllbnQgdGhhdCBjYWxsZWQgc3RhcnQoKSB3cm90ZSB0aGUgcnVuIHRvIGl0cyBvd24gZW52aXJvbm1lbnQgJyArXG4gICAgICAnYnV0IGFkZHJlc3NlZCB0aGUgcXVldWUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlciBvbmUuIENoZWNrICcgK1xuICAgICAgJ3RoYXQgdGhlIGVudmlyb25tZW50IHRoYXQgY2xpZW50IGF1dGhlbnRpY2F0ZXMgYXMgKFdPUktGTE9XX1ZFUkNFTF9FTlYgJyArXG4gICAgICBcImZvciBDTEkgYW5kIENJIGNsaWVudHMsIG9yIHRoZSBPSURDIHRva2VuJ3MgZW52aXJvbm1lbnQgaW5zaWRlIGEgXCIgK1xuICAgICAgJ2RlcGxveW1lbnQpIG1hdGNoZXMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBkZXBsb3ltZW50IGl0IHRhcmdldHMuIFRoZSAnICtcbiAgICAgIGBydW4gaXQgY3JlYXRlZCBpcyBzdGlsbCBwZW5kaW5nIGluIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYW5kIHdpbGwgYCArXG4gICAgICAnbm90IHJ1bi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY3JlYXRvckVudmlyb25tZW50LFxuICAgICAgY3VycmVudEVudmlyb25tZW50LFxuICAgICAgcGlubmVkRGVwbG95bWVudElkOiBydW5JbnB1dD8uZGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogTG9nIHdoZW4gYSBgc3RhcnQoKWAtZW5xdWV1ZWQgbWVzc2FnZSBwaW5uZWQgdG8gb25lIGRlcGxveW1lbnQgaXMgZGVsaXZlcmVkXG4gKiB0byBhIGRpZmZlcmVudCBvbmUuXG4gKlxuICogQSBmaXJzdC1kZWxpdmVyeSBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0LmRlcGxveW1lbnRJZGAg4oCUIHRoZSBkZXBsb3ltZW50XG4gKiBgc3RhcnQoKWAgYWRkcmVzc2VkIGl0IHRvIOKAlCBzbyBjb21wYXJpbmcgdGhhdCBhZ2FpbnN0IHRoaXMgaGFuZGxlcidzIG93blxuICogZGVwbG95bWVudCBkZXRlY3RzIG1pcy1kZWxpdmVyeSBkaXJlY3RseS4gVGhpcyBpcyBhIERJQUdOT1NUSUMsIG5vdCBhIGdhdGU6XG4gKiBpdCB3YXJucyBhbmQgbGV0cyB0aGUgaW52b2NhdGlvbiBwcm9jZWVkLCBkZWxpYmVyYXRlbHkuXG4gKlxuICogV2h5IHRoaXMgb25lIG9ubHkgd2FybnMgd2hpbGUgaXRzIGVudmlyb25tZW50IHNpYmxpbmcgYWJvdmUgcmVmdXNlczogYVxuICogZGlmZmVyaW5nIGRlcGxveW1lbnQgaWQgaXMgbm90IGJ5IGl0c2VsZiBldmlkZW5jZSBvZiB0aGUgZm9yayB3ZSBjYXJlIGFib3V0LlxuICogVGhlIGVudmlyb25tZW50IHBhaXIgaXMgZXhhY3Qg4oCUIHR3byBuYW1lZCBlbnZpcm9ubWVudHMgdGhhdCBkaXNhZ3JlZSDigJQgYW5kIGl0XG4gKiBpcyB0aGUgZGltZW5zaW9uIHRoZSBydW4ncyB0ZW5hbnQgaXMga2V5ZWQgb24uIERlcGxveW1lbnQgaWRzIGRpc2FncmVlIGZvclxuICogYmVuaWduIHJlYXNvbnMgdG9vOiBgd29ybGQtbG9jYWxgIGRlcml2ZXMgaXRzIGlkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlXG4gKiB2ZXJzaW9uIChgZHBsX2xvY2FsQDx2ZXJzaW9uPmApLCBzbyB1cGdyYWRpbmcgdGhlIFNESyBtaWQtcnVuIGNoYW5nZXMgaXQgd2l0aFxuICogbm90aGluZyB3cm9uZy4gUmVmdXNpbmcgb24gdGhhdCBzaWduYWwgd291bGQgc3RyYW5kIGNvcnJlY3QgcnVucywgYW5kXG4gKiByZWZ1c2luZyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBsZWF2ZXMgbm8gc2VydmVyLXNpZGUgcmVjb3JkIHRvIGV4cGxhaW4gd2h5LlxuICogQW55b25lIHRlbXB0ZWQgdG8gcHJvbW90ZSB0aGlzIHRvIGEgaGFyZCBmYWlsdXJlIGhhcyB0byBoYW5kbGUgdGhhdCBmaXJzdC5cbiAqXG4gKiBTa2lwcGVkIHVubGVzcyBCT1RIIGlkcyBhcmUga25vd24g4oCUIGBnZXREZXBsb3ltZW50SWQoKWAgdGhyb3dzIGluIHdvcmxkcyB0aGF0XG4gKiByZXF1aXJlIGEgZGVwbG95bWVudCBhbmQgaGF2ZSBub25lLCBhbmQgYSByZS1lbnF1ZXVlZCBtZXNzYWdlIGNhcnJpZXMgbm9cbiAqIGBydW5JbnB1dGAgYXQgYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IHJ1bklucHV0Py5kZXBsb3ltZW50SWQ7XG4gIGlmICghcGlubmVkRGVwbG95bWVudElkKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFdvcmxkcyB0aGF0IHJlcXVpcmUgYSBkZXBsb3ltZW50IGlkIHRocm93IHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiBUaGF0IGlzXG4gICAgLy8gbm90IGEgbWlzbWF0Y2gg4oCUIHRoZXJlIGlzIHNpbXBseSBub3RoaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFjdXJyZW50RGVwbG95bWVudElkIHx8IGN1cnJlbnREZXBsb3ltZW50SWQgPT09IHBpbm5lZERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnUXVldWUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkIHRvIGEgZGVwbG95bWVudCBpdCB3YXMgbm90IHBpbm5lZCB0by4gJyArXG4gICAgICAnVGhlIHJ1biB3YXMgY3JlYXRlZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgZGVwbG95bWVudCwgc28gdGhpcyAnICtcbiAgICAgICdpbnZvY2F0aW9uIG1heSBiZSByZXBsYXlpbmcgYWdhaW5zdCBjb2RlIHRoZSBydW4gd2FzIG5vdCBzdGFydGVkIG9uLiAnICtcbiAgICAgICdDb250aW51aW5nIOKAlCB0aGlzIGlzIGV4cGVjdGVkIGlmIHRoZSBXb3JrZmxvdyBTREsgdmVyc2lvbiBjaGFuZ2VkICcgK1xuICAgICAgJ21pZC1ydW4gaW4gbG9jYWwgZGV2ZWxvcG1lbnQsIHdoZXJlIHRoZSBkZXBsb3ltZW50IGlkIGlzIGRlcml2ZWQgZnJvbSAnICtcbiAgICAgICd0aGF0IHZlcnNpb24uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBIb3cgbWFueSBvZiBgaWRzYCBhcmUgYWJzZW50IGZyb20gYHByZXNlbnRgLiAqL1xuZnVuY3Rpb24gY291bnRNaXNzaW5nSWRzKGlkczogSXRlcmFibGU8c3RyaW5nPiwgcHJlc2VudDogU2V0PHN0cmluZz4pOiBudW1iZXIge1xuICBsZXQgbWlzc2luZyA9IDA7XG4gIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgaWYgKCFwcmVzZW50LmhhcyhpZCkpIG1pc3NpbmcrKztcbiAgfVxuICByZXR1cm4gbWlzc2luZztcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcm9vdFJ1bklkRnJvbShcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXM/LltST09UX1JVTl9JRF9BVFRSSUJVVEVdID8/IHJ1bklkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgVk0gcmV0ZW50aW9uLCB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCwgYW5kIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBBIHRlcm1pbmFsLXN0ZXAgZGVsdGEgY2FuIG9taXQgYW4gZXZlbnQgYXBwZW5kZWRcbiAqIGNvbmN1cnJlbnRseSBhZnRlciB0aGF0IHdyaXRlLiBXaXRoIG5vIG9wZW4gaG9vayBvciB3YWl0LCBvbmx5IGNhbmNlbGxhdGlvblxuICogY2FuIGRvIHNvLCBhbmQgb2JzZXJ2aW5nIGl0IG9uZSByZXBsYXkgbGF0ZSBpcyBzYWZlIGJlY2F1c2UgdGhlIG5leHQgZW50aXR5XG4gKiB3cml0ZSBpcyByZWplY3RlZC5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gb3Blbkhvb2tBbmRXYWl0U3RhdGUoZXZlbnRzOiBFdmVudFtdKToge1xuICBvcGVuSG9vazogYm9vbGVhbjtcbiAgb3BlbldhaXQ6IGJvb2xlYW47XG59IHtcbiAgY29uc3QgZGlzcG9zZWRIb29rSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSBkaXNwb3NlZEhvb2tJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbXBsZXRlZFdhaXRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgfVxuICB9XG4gIGxldCBvcGVuSG9vayA9IGZhbHNlO1xuICBsZXQgb3BlbldhaXQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgIWRpc3Bvc2VkSG9va0lkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgb3Blbkhvb2sgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBvcGVuV2FpdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcGVuSG9vayAmJiBvcGVuV2FpdCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHsgb3Blbkhvb2ssIG9wZW5XYWl0IH07XG59XG5cbi8qKlxuICogVGhlIHdob2xlIHJldGVudGlvbiBwcmVkaWNhdGU6IGtlZXAgdGhlIHNlc3Npb24gb25seSBmb3IgYSBwdXJlIHN0ZXBcbiAqIGJvdW5kYXJ5IChldmVyeSBzdXNwZW5zaW9uIGl0ZW0gaXMgYSBzdGVwIOKAlCBhbnkgb3RoZXIgaXRlbSB0eXBlLCBwcmVzZW50XG4gKiBvciBmdXR1cmUsIGlzIHVucmV0YWluYWJsZSBieSBkZWZhdWx0KSB3aG9zZSBuZXcgc3RlcCBpbnB1dHMgc2VyaWFsaXplZFxuICogd2l0aG91dCBleGVjdXRpbmcgd29ya2Zsb3cgY29kZSwgd2l0aCBubyBvdXQtb2YtYmFuZCBjb250aW51YXRpb24gc291cmNlOlxuICogYXR0cmlidXRlcyByZXF1aXJlIHJlcGxheTsgaG9va3MgYW5kIHdhaXRzIGNhbiB3YWtlIGFub3RoZXIgaW52b2NhdGlvbi5cbiAqIGBXT1JLRkxPV19SRVRBSU5FRF9WTT0wYCBkaXNhYmxlcyByZXRlbnRpb24gZW50aXJlbHkuXG4gKlxuICogVGhlIG9wZW4gaG9vay93YWl0IHNjYW4gaXMgTyhldmVudHMpLCBzbyBpdCBpcyB0YWtlbiB0aHJvdWdoIGEgbGF6eSBnZXR0ZXJcbiAqIGFuZCBjb25zdWx0ZWQgbGFzdCwgYWZ0ZXIgZXZlcnkgY2hlYXAgY2hlY2sgaGFzIHBhc3NlZC5cbiAqXG4gKiBJTlZBUklBTlQgdGhpcyBwcmVkaWNhdGUgbGVhbnMgb246IGV2ZXJ5IHN1c3BlbnNpb24gc2lnbmFsZXIgdGhhdCBkb2VzIE5PVFxuICogY2FycnkgdGhlIHN0ZXAtY29uc3VtZXIgZ2VuZXJhdGlvbiBndWFyZCAoc2xlZXAsIGhvb2ssIGF0dHJpYnV0ZSDigJQgc2VlXG4gKiBgc3VzcGVuc2lvbkdlbmVyYXRpb25gIGluIHByaXZhdGUudHMpIG11c3QgYmUgdW5yZXRhaW5hYmxlIGhlcmUsIGVpdGhlciB2aWFcbiAqIGEgbm9uLXN0ZXAgcXVldWUgaXRlbSBvciB0aGUgb3BlbiBob29rL3dhaXQgc2Nhbi4gQSBuZXcgc2lnbmFsZXIgdGhhdFxuICogc2F0aXNmaWVzIG5laXRoZXIgd291bGQgbGV0IGEgc3RhbGUgc2lnbmFsIGJlIGFjY2VwdGVkIGFzIGEgZnJlc2hcbiAqIHN1c3BlbnNpb24gb24gYSByZXN1bWVkIHNlc3Npb24uXG4gKlxuICogUXVpZXNjZW5jZSBhc3N1bWVzIHdvcmtmbG93IGNvZGUgc3RheXMgaW5zaWRlIHRoZSBzYW5kYm94J3MgZGV0ZXJtaW5pc21cbiAqIGNvbnRyYWN0LiBFc2NhcGluZyB0byB0aGUgaG9zdCByZWFsbSAoZS5nLiByZWNvdmVyaW5nIHRoZSBob3N0IGBGdW5jdGlvbmBcbiAqIGNvbnN0cnVjdG9yIGZyb20gYW4gZXhwb3NlZCBob3N0IGNsYXNzIHRvIHNjaGVkdWxlIHJlYWwgdGltZXJzKSBtYWtlcyBhXG4gKiB3b3JrZmxvdyBub25kZXRlcm1pbmlzdGljIHVuZGVyIG9yZGluYXJ5IHJlcGxheSB0b28sIGFuZCBpcyBub3QgZGVmZW5kZWRcbiAqIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbihcbiAgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uLFxuICBzdGVwSW5wdXRzU2FmZTogYm9vbGVhbixcbiAgb3Blbkhvb2tXYWl0OiB7IHZhbHVlOiBSZXR1cm5UeXBlPHR5cGVvZiBvcGVuSG9va0FuZFdhaXRTdGF0ZT4gfVxuKTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAhaXNWbVJldGVudGlvbkVuYWJsZWQoKSB8fFxuICAgICFzdGVwSW5wdXRzU2FmZSB8fFxuICAgIHN1c3BlbnNpb24uc3RlcHMubGVuZ3RoID09PSAwIHx8XG4gICAgIXN1c3BlbnNpb24uc3RlcHMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ3N0ZXAnKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeyBvcGVuSG9vaywgb3BlbldhaXQgfSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcbiAgcmV0dXJuICFvcGVuSG9vayAmJiAhb3BlbldhaXQ7XG59XG5cbi8qKlxuICogTWF4aW11bSBpbmxpbmUtZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBhIHNpbmdsZSBoYW5kbGVyIGludm9jYXRpb24uXG4gKlxuICogT3JkZXIgb2YgcHJlY2VkZW5jZTpcbiAqIDEuIGBXT1JLRkxPV19WMl9USU1FT1VUX01TYCBlbnYgdmFyXG4gKiAyLiBUaWVyZWQgYnVkZ2V0IGRlcml2ZWQgZnJvbSBgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lKClgXG4gKiAzLiBEZWZhdWx0IG9mIDIgbWludXRlc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJbmxpbmVEdXJhdGlvbk1zKFxuICB3b3JsZDogV29ybGQsXG4gIGludm9jYXRpb25TdGFydFRpbWU6IG51bWJlclxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcmF3RW52T3ZlcnJpZGUgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TO1xuICBpZiAocmF3RW52T3ZlcnJpZGUgIT09IHVuZGVmaW5lZCAmJiByYXdFbnZPdmVycmlkZSAhPT0gJycpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3RW52T3ZlcnJpZGUpO1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVEZWFkbGluZSA9IGF3YWl0IHdvcmxkLmdldFJ1bnRpbWVEZWFkbGluZT8uKCk7XG4gIGlmIChydW50aW1lRGVhZGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRlYWRsaW5lTXMgPSBydW50aW1lRGVhZGxpbmUuZ2V0VGltZSgpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKGRlYWRsaW5lTXMpKSB7XG4gICAgICBjb25zdCBtYXhEdXJhdGlvbk1zID0gTWF0aC5mbG9vcihkZWFkbGluZU1zIC0gaW52b2NhdGlvblN0YXJ0VGltZSk7XG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMjVtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCcxMG0nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1heER1cmF0aW9uTXMgPj0gbXMoJzEwbScpKSB7XG4gICAgICAgIHJldHVybiBtcygnNW0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbXMoJzJtJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSByb3V0ZSB3aGljaCBoYW5kbGVzIHdvcmtmbG93IGV4ZWN1dGlvbiByZXF1ZXN0cyxcbiAqIGV4ZWN1dGluZyBzdGVwcyBpbmxpbmUgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2UgZnVuY3Rpb24gaW52b2NhdGlvbnNcbiAqIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAqXG4gKiBUaGUgaGFuZGxlciBsb29wczogcmVwbGF5IHdvcmtmbG93IOKGkiBleGVjdXRlIHN0ZXAgaW5saW5lIOKGkiByZXBsYXkg4oaSIC4uLlxuICogdW50aWwgdGhlIHdvcmtmbG93IGNvbXBsZXRlcywgdGltZXMgb3V0LCBvciBlbmNvdW50ZXJzIG5vbi1zdGVwIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvd0NvZGUgLSBUaGUgd29ya2Zsb3cgYnVuZGxlIGNvZGUgY29udGFpbmluZyBhbGwgd29ya2Zsb3cgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBWZXJjZWwgQVBJIHJvdXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0VudHJ5cG9pbnQoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ/OiBudW1iZXI7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIH1cbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgc2V0V29ya2Zsb3dCYXNlUGF0aChvcHRpb25zPy5iYXNlUGF0aCk7XG5cbiAgY29uc3QgbmFtZXNwYWNlID0gcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG9wdGlvbnM/Lm5hbWVzcGFjZSk7XG4gIGNvbnN0IHdvcmtmbG93UHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCBuYW1lc3BhY2UpO1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAod29ybGRIYW5kbGVyczogV29ybGRIYW5kbGVycykgPT5cbiAgICB3b3JsZEhhbmRsZXJzLmNyZWF0ZVF1ZXVlSGFuZGxlcihcbiAgICAgIHdvcmtmbG93UHJlZml4LFxuICAgICAgYXN5bmMgKG1lc3NhZ2VfLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW4g4oCUIGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGNvbnN0IG1heFF1ZXVlRGVsaXZlcmllcyA9IGdldE1heFF1ZXVlRGVsaXZlcmllcygpO1xuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IG1heFF1ZXVlRGVsaXZlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERURcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBXb3JrZmxvdyBoYW5kbGVyIGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGNvdmVycyBvcmNoZXN0cmF0aW9uIHdvcmsgYmV0d2VlbiBzdGVwcywgbm90IGlubGluZVxuICAgICAgICAvLyBzdGVwIGJvZGllcy4gSXQgaXMgY2hlY2tlZCBiZXR3ZWVuIGxvb3AgaXRlcmF0aW9uczsgc3RlcCBib2RpZXMgdXNlXG4gICAgICAgIC8vIHRoZSBwbGF0Zm9ybSB0aW1lb3V0IGFuZCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TIGd1YXJkIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHJlcGxheUJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcblxuICAgICAgICAvLyBJbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIE5PVCByZXN0b3JlZCBhcyB0aGVcbiAgICAgICAgLy8gYWN0aXZlIChwYXJlbnQpIGNvbnRleHQg4oCUIHBhc3NpbmcgYHVuZGVmaW5lZGAgbWFrZXNcbiAgICAgICAgLy8gd2l0aFRyYWNlQ29udGV4dCBhIHBhc3N0aHJvdWdoLCBzbyB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93XG4gICAgICAgIC8vIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0IGFuZCB0aGVcbiAgICAgICAgLy8gcnVuLW9yaWdpbiB0cmF2ZWxzIGFzIGEgc3BhbiBsaW5rIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHBhcmVudFRyYWNlQ2FycmllciA9XG4gICAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uOiBDT05TVU1FUiBraW5kLCBtYXRjaGluZyB0aGVcbiAgICAgICAgLy8gcXVldWUtZGVsaXZlcmVkIHN0ZXAuZXhlY3V0ZSBzcGFuLlxuICAgICAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdDT05TVU1FUicpO1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFdvcmtmbG93QmFnZ2FnZShcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHdvcmtmbG93TmFtZSB9LFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGQnLCBhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFdvcmxkKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQm90aCBjaGVja3MgYmVsb3cgbG9vayBhdCBgcnVuSW5wdXRgLCBzbyBib3RoIGFyZSBuby1vcHMgb24gYVxuICAgICAgICAgICAgICAvLyByZS1lbnF1ZXVlZCBtZXNzYWdlICh3aGljaCBjYXJyaWVzIG5vbmUpIOKAlCB0aGV5IG9ubHkgZXZlciBydW4gb25cbiAgICAgICAgICAgICAgLy8gYSBmaXJzdCBkZWxpdmVyeSwgdGhlIG9uZSB0aGF0IGNvdWxkIGNyZWF0ZSB0aGUgcnVuLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgYWNrcyB0aGUgbWVzc2FnZS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgbWlzbWF0Y2ggaXNcbiAgICAgICAgICAgICAgLy8gYmFrZWQgaW50byB0aGlzIG1lc3NhZ2UsIHNvIGV2ZXJ5IHJlZGVsaXZlcnkgd291bGQgcmVhY2ggdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgdmVyZGljdCwgYW5kIHRocm93aW5nIHdvdWxkIGp1c3QgaG90LWxvb3AgdGhlIGhhbmRsZXIgdW50aWxcbiAgICAgICAgICAgICAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgd2l0aCB0aGUgc2FtZSBlcnJvciBlYWNoIHRpbWUuIEl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgLy8gaG93IHRoZSBydW5fc3RhcnRlZCBwYXRoIGFscmVhZHkgZGlzY2FyZHMgZGVsaXZlcmllcyB3aG9zZVxuICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGNhbm5vdCBjaGFuZ2UgKEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvcikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljIG9ubHkg4oCUIHNlZSB0aGUgaGVscGVyIGZvciB3aHkgdGhpcyB3YXJucyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgIC8vIHJlZnVzaW5nIHRoZSBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICBhd2FpdCB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vSW5saW5lUmVwbGF5QWZ0ZXJNcyA9IGF3YWl0IGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUV2ZW50OiBFdmVudENyZWF0b3IgPSAoZGF0YSwgcGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShwYXJhbXMsIChwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGNhY2hlOiBrZWVwIGxvYWRlZCBldmVudHMgaW4gbWVtb3J5IGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHdlIGRvIGEgZnVsbCBsb2FkOyBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGZldGNoIG9ubHkgZXZlbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZEV2ZW50czogRXZlbnRbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IHdoZW4gYW4gaW5saW5lIHN0ZXAncyB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmV0dXJucyB0aGUgZXZlbnQtbG9nIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciAoYSBzdXBwb3J0aW5nIFdvcmxkIG9ubHkpLCB3ZSBzdGFzaCBpdCBoZXJlIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBjb25zdW1lcyBpdCBpbiBwbGFjZSBvZiB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IHJvdW5kLXRyaXAuIEVhY2ggdmFsdWUgaXMgY29uc3VtZWQgZXhhY3RseSBvbmNlXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjbGVhcmVkLiBOdWxsIG1lYW5zIFwibm8gZGVsdGEgcGVuZGluZyDigJQgZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5XCIuIFNlZSB0aGUgY29uc3VtZSBzaXRlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZSBzaXRlczogYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLCBhbmQgaW5cbiAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRSZXBsYXlJblByb2Nlc3Mgd2hlbiBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgLy8gY2FycmllZCB0aGUgbWlzc2luZyBldmVudHMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgICAgIGxldCBwZW5kaW5nSW5saW5lRGVsdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBzdGF0ZTogc2V0IGJ5IGVpdGhlciB0aGUgYmFja2dyb3VuZCBzdGVwIHBhdGhcbiAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAvLyByZXNwb25zZS4gVW5kZWZpbmVkIOKHkiBubyBlbmZvcmNlbWVudCAob2xkZXIgc2VydmVycywgdHVyYm8pLlxuICAgICAgICAgICAgICAgICAgbGV0IG1heEV2ZW50c0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dTdGFydGVkQXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHM6IEV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBvbmx5IHdoZW4gYHByZWxvYWRlZEV2ZW50c2AgaXMga25vd24gdG8gYmUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDT01QTEVURSBldmVudCBsb2cgKHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgdmFsaWRhdGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlLWZhbHNlIHByZWxvYWQpLiBMZXRzIFF1aWNrSlMgdHJ1c3QgaXQgYXMtaXMg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgb3duIGhldXJpc3RpYyBvbmx5IHJlY29nbml6ZXMgZmlyc3QtaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkpIHByZWxvYWRzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZSDigJQgc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESyDigJQgYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCDigJQgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIHZlcnkgZmlyc3QgZGVsaXZlcnkgb2YgdGhlIHZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSDigJQgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2sgb3Igd2FpdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAodGhleSBpbnRyb2R1Y2UgcmVzdW1lIGludm9jYXRpb25zKSwgc28gdHVyYm8gZXhpdHMgYXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS4gV29ya2Zsb3cgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgaW50cm9kdWNlIG5vIHN1Y2ggaW52b2NhdGlvbiBzb3VyY2Ug4oCUIHRoZXkgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgLy8gdmlhIGFuIGluLXByb2Nlc3MgcmVwbGF5IGFuZCBkb24ndCBlbmQgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWAgaXMgYWxzbyBsb2FkLWJlYXJpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBvd25lcnNoaXA6IG93bmVkLXJlY292ZXJ5IHN0ZXBzIChhIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHN0YW1wZWQgYnkgYSBQUkVWSU9VUyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UpIGNhbiBvbmx5XG4gICAgICAgICAgICAgICAgICAvLyBleGlzdCBvbiBhdHRlbXB0IOKJpSAyLCBzbyB0dXJibyBhbmQgb3duZWQgcmVjb3ZlcnkgYXJlXG4gICAgICAgICAgICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSB0dXJibyBgcmVpbnZva2UoKWAgcGF0aHMgKGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0LCB0aHJvdHRsZSBiYWNrb2ZmKSBhY2sgdGhpcyBtZXNzYWdlIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgc2FmZSBvbmx5IGJlY2F1c2Ugbm9cbiAgICAgICAgICAgICAgICAgIC8vIG5vbi10ZXJtaW5hbCBzdGVwIGNhbiBiZSBpbmxpbmUtb3duZWQgYnkgdGhlIGFja2VkIGlkXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIHR1cmJvIGlzIG9uLiBJZiB0dXJibyBldmVyIGVuZ2FnZXMgb24gcmVkZWxpdmVyaWVzLFxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgcGF0aHMgbXVzdCBmaXJzdCBjaGVjayBmb3Igb3duZWQgcGVuZGluZyBzdGVwcyBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBgeyB0aW1lb3V0U2Vjb25kcyB9YCByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIGludmFyaWFudCBndWFyZDogY29ycmVsYXRpb24gSURzIG9mXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwcyB3aG9zZSBib2RpZXMgdGhpcyBpbnZvY2F0aW9uIGlzIGV4ZWN1dGluZyB1bmRlciBhblxuICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIHN0YW1wIChsYXp5IGlubGluZSArIG93bmVkIHJlY292ZXJ5KSwgd2hpbGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBib2R5IGlzIGluIGZsaWdodC4gQ3Jhc2ggcmVjb3ZlcnkgZGVwZW5kcyBvbiB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIE5PVCBiZWluZyBhY2tlZCB3aGlsZSBzdWNoIGEgc3RlcCBpcyBub24tdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIChhY2sgPSBoYW5kbGVyIHJldHVybiBvciByZWludm9rZSwgd2hpY2ggYWNrcyArIGVucXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkIOKAlCB0aGUgcmVkZWxpdmVyeSBvZiB0aGUgb2xkIGlkIGlzXG4gICAgICAgICAgICAgICAgICAvLyB3aGF0IHJlLWV4ZWN1dGVzIGFuIG9ycGhhbmVkIG93bmVkIHN0ZXApLiBBbGwgZXhlY3V0ZVN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIGFyZSBhd2FpdGVkIGJlZm9yZSBhbnkgYWNrIHBhdGggcnVucywgc28gdGhpcyBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5IGF0IGV2ZXJ5IGFjayBieSBjb25zdHJ1Y3Rpb247IHRoZSBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBicmVhayB0aGF0IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbGlnaHRPd25lZFN0ZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcyA9IChcbiAgICAgICAgICAgICAgICAgICAgYWNrUGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0T3duZWRTdGVwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogYWNraW5nIHRoZSB3b3JrZmxvdyBtZXNzYWdlIHdoaWxlIG93bmVkIGlubGluZSBzdGVwcyBhcmUgc3RpbGwgZXhlY3V0aW5nIOKAlCBjcmFzaCByZWNvdmVyeSBmb3IgdGhlc2Ugc3RlcHMgaXMgYnJva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IFsuLi5pbkZsaWdodE93bmVkU3RlcHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIEEgcGxhaW4gb3JjaGVzdHJhdG9yLXJlcGxheSBtZXNzYWdlLiBPbWl0cyBgcnVuSW5wdXRgIChpdFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5nYWdlcyB0dXJibyBvbiB0aGUgbmV4dCBkZWxpdmVyeSBhbmQgd2VkZ2VzIHRoZSBydW4g4oCUXG4gICAgICAgICAgICAgICAgICAvLyBzZWUgYHJlaW52b2tlYCBiZWxvdykgYW5kIGByZXBsYXlEaXZlcmdlbmNlYCAvXG4gICAgICAgICAgICAgICAgICAvLyBgc2VydmVyRXJyb3JSZXRyeUNvdW50YCAodGhpcyBkZWxpdmVyeSBjaGFpbidzIGJ1ZGdldHMpLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICgpOiBQcm9taXNlPFdvcmtmbG93SW52b2tlUGF5bG9hZD4gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEV4dHJhIGZpZWxkcyB0byBjYXJyeSBvbiB0aGUgbmV3IG1lc3NhZ2UuIE9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogbmV4dCBpbnZvY2F0aW9uIG9uIHRoZSB0dXJibyBwYXRoOiB3aXRob3V0IHR1cmJvIG5vXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaXMgZW5xdWV1ZWQgYXQgYWxsIOKAlCB0aGUgaGFuZGxlciByZXR1cm5zIGFcbiAgICAgICAgICAgICAgICAgICAgICogdmlzaWJpbGl0eSB0aW1lb3V0IGFuZCB0aGUgcXVldWUgcmVkZWxpdmVycyB0aGUgQ1VSUkVOVFxuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlLCB3aG9zZSBib2R5IChhbmQgdGhlcmVmb3JlIGFueSBjb3VudGVyIG9uIGl0KVxuICAgICAgICAgICAgICAgICAgICAgKiBjYW5ub3QgYmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhUGF5bG9hZD86IFBhcnRpYWw8V29ya2Zsb3dJbnZva2VQYXlsb2FkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcygncmVpbnZva2UnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHsgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksIC4uLmV4dHJhUGF5bG9hZCB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24gKDQxMikgcmVjb3Zlcnk6IGhvdyBtYW55IHRpbWVzIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gaGFzIHRocm93biBhd2F5IGl0cyByZXBsYXkgYW5kIHN0YXJ0ZWQgb3ZlciBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRzID0gMDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXZlbnQgaWRzIHRoZSBkaXNjYXJkZWQgcmVwbGF5IGhlbGQsIGtlcHQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAqIGxvYWQgcmVzb2x2ZXMgc28gYSByZXN0YXJ0IGNhbiByZXBvcnQgd2hhdCBpdHMgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgKiBhY3R1YWxseSBmb3VuZC4gV2l0aG91dCB0aGlzIGEgNDEyIG9ubHkgZXZlciB0ZWxscyB5b3UgdGhhdFxuICAgICAgICAgICAgICAgICAgICogYSByZXN0YXJ0IGhhcHBlbmVkLCB3aGljaCBjb25mbGF0ZXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgKiBzaXR1YXRpb25zOiBhIGxvZyB0aGF0IGdyZXcgKGV4cGVjdGVkIOKAlCB0aGUgZmVuY2UgZGlkIGl0c1xuICAgICAgICAgICAgICAgICAgICogam9iKSBhbmQgYSBsb2cgdGhhdCBjYW1lIGJhY2sgaWRlbnRpY2FsLCB3aGljaCBtZWFucyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZW5kIGRpc2FncmVlIGFib3V0IHRoZSBjb3VudCBmb3IgdGhlIHNhbWUgc2V0IG9mXG4gICAgICAgICAgICAgICAgICAgKiBldmVudHMgYW5kIHRoZSByZXN0YXJ0IHdpbGwgcmUtZGVyaXZlIHRoZSBzYW1lIHNuYXBzaG90IGFuZFxuICAgICAgICAgICAgICAgICAgICogYmUgcmVqZWN0ZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdGFydDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW5saW5lLWRlbHRhJyB8ICdmdWxsLXJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlcG9ydCB3aGF0IGEgc3RhbGUtc25hcHNob3QgcmVzdGFydCdzIHJlbG9hZCBmb3VuZCwgb25jZVxuICAgICAgICAgICAgICAgICAgICogdGhlIGxvZyB0aGlzIHJlcGxheSB3aWxsIGFjdHVhbGx5IGNvbnN1bWUgaXMgaW4gaGFuZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBgZ3Jld2AgaXMgdGhlIGV4cGVjdGVkIGNhc2UgYW5kIGdpdmVzIDQxMiB2b2x1bWUgYVxuICAgICAgICAgICAgICAgICAgICogZGVub21pbmF0b3IuIGB1bmNoYW5nZWRgIG1lYW5zIHRoZSByZWxvYWQgZGlzYWdyZWVkIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIHRoZSByZWplY3Rpb24sIHNvIHRoaXMgcmVwbGF5IHJlLWRlcml2ZXMgdGhlIHNhbWUgc25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBpcyByZWplY3RlZCBhZ2FpbiB1bnRpbCB0aGUgYnVkZ2V0IGlzIHNwZW50LiBgc2hyYW5rYFxuICAgICAgICAgICAgICAgICAgICogc2hvdWxkIGJlIGltcG9zc2libGU6IGV2ZXJ5IGxvYWQgcGF0aCBvbmx5IGFkZHMgdG8gYSBydW4nc1xuICAgICAgICAgICAgICAgICAgICogbG9nLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkID0gKFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W11cbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlbGluZSA9IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZGVkSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjb3VudE1pc3NpbmdJZHMocmVsb2FkZWRJZHMsIGJhc2VsaW5lLmlkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3BwZWQgPSBjb3VudE1pc3NpbmdJZHMoYmFzZWxpbmUuaWRzLCByZWxvYWRlZElkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dGNvbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQgPiAwID8gJ3NocmFuaycgOiBhZGRlZCA+IDAgPyAnZ3JldycgOiAndW5jaGFuZ2VkJztcblxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ1Jlc3RhcnRlZCByZXBsYXkgcmVsb2FkZWQgaXRzIGV2ZW50IGxvZyBhZnRlciBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQmVmb3JlOiBiYXNlbGluZS5pZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0FmdGVyOiByZWxvYWRlZElkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHM6IGJhc2VsaW5lLnJlc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGJhc2VsaW5lLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogYmFzZWxpbmUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZWNvdmVyIGZyb20gYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBpbnNpZGUgdGhpcyBpbnZvY2F0aW9uLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHBlci1pbnZvY2F0aW9uIGJ1ZGdldCBpcyBzcGVudCAodGhlIGNhbGxlciB0aGVuIGZhbGxzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAqIHRvIGEgZnJlc2ggaW52b2NhdGlvbikuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogQSA0MTIgbWVhbnMgdGhlIGxvZyB0aGlzIHJlcGxheSBkZXJpdmVkIGl0cyBldmVudHMgZnJvbSB3YXNcbiAgICAgICAgICAgICAgICAgICAqIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgaGFkIGFscmVhZHkgcmVjb3JkZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgd3JpdGUgY2Fubm90IHNpbXBseSBiZSByZXRyaWVkOiBjb3JyZWxhdGlvbiBpZHNcbiAgICAgICAgICAgICAgICAgICAqIGFyZSBwb3NpdGlvbmFsIG9yZGluYWxzIG9mIG9uZSBzZWVkZWQgc2VxdWVuY2UsIHNvIGEgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgKiBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIG1pbnRzIGEgZGlmZmVyZW50IGlkIGZvciB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICogbG9naWNhbCBldmVudCwgYW5kIHJlLXBvc3RpbmcgdGhpcyBvbmUgd291bGQgcGVyc2lzdCBhblxuICAgICAgICAgICAgICAgICAgICogZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgZXZlciBwcm9kdWNlcy4gVGhlIHdob2xlIHJlcGxheSBoYXNcbiAgICAgICAgICAgICAgICAgICAqIHRvIGJlIHJlLWRlcml2ZWQg4oCUIHdoaWNoIHRoZSBsb29wIGRvZXMgYnkgZGlzY2FyZGluZyBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGNhY2hlZCBsb2csIHNpbmNlIGBydW5Xb3JrZmxvd2AgdGhlbiBidWlsZHMgYSBmcmVzaCBWTSxcbiAgICAgICAgICAgICAgICAgICAqIHNlZWQgYW5kIGNvcnJlbGF0aW9uLWlkIHNlcXVlbmNlIGZyb20gdGhlIHJlbG9hZGVkIGV2ZW50cy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdGFydFJlcGxheUluUHJvY2VzcyA9IChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yPzogdW5rbm93bixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFNldCBmYWxzZSB3aGVuIHdyaXRlcyB0aGlzIGludm9jYXRpb24gbWFkZSBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICogd2l0aCB0aGUgcmVqZWN0ZWQgb25lIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIDQxMidzXG4gICAgICAgICAgICAgICAgICAgICAqIGRlbHRhOiB0aGUgV29ybGQgY29tcHV0ZWQgdGhhdCBkZWx0YSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCByZXF1ZXN0J3Mgc25hcHNob3QsIHNvIGl0IGNhbm5vdCBjb250YWluIGFuXG4gICAgICAgICAgICAgICAgICAgICAqIGV2ZW50IGEgc2libGluZyBjb21taXR0ZWQgYWZ0ZXJ3YXJkcywgYW5kIG1lcmdpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgICogd291bGQgcmVzdGFydCB0aGUgcmVwbGF5IG9uIGEgbG9nIHRoYXQgaXMgc3RpbGxcbiAgICAgICAgICAgICAgICAgICAgICogaW5jb21wbGV0ZS4gT25seSBhIGZ1bGwgcmVsb2FkIGlzIGF1dGhvcml0YXRpdmUgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHsgYWxsb3dEZWx0YSA9IHRydWUgfTogeyBhbGxvd0RlbHRhPzogYm9vbGVhbiB9ID0ge31cbiAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMgPj1cbiAgICAgICAgICAgICAgICAgICAgICBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0IGludmFsaWRhdGVzIHRoZSBwYXJrZWQgVk06XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgaXQgY29uc3VtZWQgd2FzIG1pc3NpbmcgZXZlbnRzLCBzbyBvbmx5IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IG92ZXIgdGhlIGNvcnJlY3RlZCBsb2cgaXMgYXV0aG9yaXRhdGl2ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNvdmVycyB0aGUgc3VzcGVuc2lvbi1jcmVhdGUgNDEyLCB3aGljaCBmaXJlc1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJldGVudGlvbiBkZWNpc2lvbiAoa2lsbCBzd2l0Y2ggKyBzdGVwLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIC8vIGdhdGUpIGV2ZXIgcmFuLCBhbmQgdGhlIHJ1bl9jb21wbGV0ZWQgNDEyLCB3aGVyZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzZXNzaW9uIG11c3Qgbm90IGJlIHJlc3VtZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgV29ybGQgTUFZIHJldHVybiB0aGUgZXZlbnRzIHdlIHdlcmUgbWlzc2luZyBvbiB0aGUgNDEyLlxuICAgICAgICAgICAgICAgICAgICAvLyBUcnVzdCBpdCBvbmx5IG9uIHRoZSBGSVJTVCByZXN0YXJ0OiBpdHMgY29tcGxldGVuZXNzIHByb29mXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlYW5zIG9uIHRoZSBiYWNrZW5kJ3Mgb3duIGJvb2trZWVwaW5nLCBzbyBpZiB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyLWNvdW50cywgYSBcImNvbXBsZXRlXCIgZGVsdGEgY2FuIHN0aWxsIGxlYXZlIGEgaG9sZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQm91bmRpbmcgaXQgdG8gb25lIGF0dGVtcHQgY2FwcyB0aGF0IGF0IGEgc2luZ2xlIHdhc3RlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0OyBldmVyeSBsYXRlciByZXN0YXJ0IGRvZXMgdGhlIGF1dGhvcml0YXRpdmUgbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVsdGEgJiYgcHJlY29uZGl0aW9uUmVzdGFydHMgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJlY29uZGl0aW9uRXZlbnREZWx0YShlcnJvciwgcnVuSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgZGVsdGEgaXMgb25seSB1c2FibGUgYXMgYSBkZWx0YSBpZiB0aGVyZSBpcyBhIGNhY2hlZCBsb2dcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gbWVyZ2UgaXQgaW50bzsgd2l0aCBubyBiYXNlIGxvZyB0aGUgcmVzdGFydCBoYXMgdG8gbG9hZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgdGhpbmcgYW55d2F5LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VkRGVsdGEgPSBCb29sZWFuKGRlbHRhICYmIGNhY2hlZEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBjYWNoZWRFdmVudHNcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VkRGVsdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lZCBieSB0aGUgbG9vcCdzIGZpcnN0IGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIChgcGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50c2ApIHdpdGggbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBkZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNVVNUIGJlIGEgZnVsbCwgY3Vyc29yLWxlc3MgcmVsb2FkLiBUaGUgY3Vyc29yIGZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBieSBsZXhpY29ncmFwaGljIGV2ZW50IGlkIHdoaWxlIGEgaG9sZSBpcyBkZWZpbmVkIGJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVUxJRCAqdGltZSo6IGFuIGV2ZW50IGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHNvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIHNpZGUgb2YgdGhlIGN1cnNvciBkZXBlbmRpbmcgb24gaXRzIHJhbmRvbVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCwgYW5kIGFuIGV2ZW50IG1pbnRlZCBpbiBhbiBlYXJsaWVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlsbGlzZWNvbmQgYnV0IGNvbW1pdHRlZCBsYXRlciBhbHdheXMgc29ydHMgYmVsb3cgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQW4gaW5jcmVtZW50YWwgbG9hZCB0aGVyZWZvcmUgaGVhbHMgdGhlIGhvbGUgb25seSBieVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGx1Y2suXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0ZWQgbG9nIGluc2VydHMgdGhlIG1pc3NpbmcgZXZlbnRzIEJFTE9XIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBhbHJlYWR5IHNjYW5uZWQgZm9yIHBheWxvYWQgcHJld2FybWluZywgc2hpZnRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBsYXRlciBwb3NpdGlvbi4gT25seSBhIGZ1bGwgcmVzY2FuIHNlZXMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUucmVzZXRTY2FuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZTsgcmVzdGFydGluZyByZXBsYXkgaW4tcHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVzdGFydHMnOiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFc2NhbGF0ZSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiB0aGF0IHN1cnZpdmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tcHJvY2VzcyByZXN0YXJ0IGJ1ZGdldCB0byBhIGZyZXNoIGludm9jYXRpb24sIG9yIGdpdmUgdXBcbiAgICAgICAgICAgICAgICAgICAqIG9uIHRoZSBydW4gd2hlbiB0aGUgcGVyLXJ1biBidWRnZXQgaXMgYWxzbyBzcGVudC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgYSBjbG9zdXJlIHZhcmlhYmxlIGFuZCB0aGUgcXVldWUnc1xuICAgICAgICAgICAgICAgICAgICogZGVsaXZlcnkgY291bnQgcmVzdGFydHMgYXQgMSB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlZCwgc28gYSBydW4gdGhhdCBpcyBwZXJtYW5lbnRseSB1bmFibGUgdG8gY2F0Y2ggdXBcbiAgICAgICAgICAgICAgICAgICAqIHdpdGggaXRzIG93biBldmVudCBsb2cgd291bGQgb3RoZXJ3aXNlIGN5Y2xlIHJlc3RhcnRzIOKGklxuICAgICAgICAgICAgICAgICAgICogcmUtaW52b2tlIOKGkiByZXN0YXJ0cyB3aXRoIG5vIHJ1bi1sZXZlbCBib3VuZC4gVGhlIGNoYWluIGlzXG4gICAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUgY291bnRlZCBvbiB0aGUgbWVzc2FnZSBpdHNlbGYsIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGRpdmVyZ2VuY2VzIGFyZSwgYW5kIGZhaWxzIHRoZSBydW4gb25jZSBleGhhdXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGNvdW50ZXIgb25seSBhZHZhbmNlcyBvbiBob3BzIHRoYXQgZW5xdWV1ZSBhIG5ldyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgKiAoc2VlIGByZWludm9rZWApLiBBIHJlZGVsaXZlcnktYmFzZWQgaG9wIGtlZXBzIHRoZSBzYW1lIGJvZHlcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBzbyB0aGUgc2FtZSBjb3VudCwgYnV0IGl0IGFsc28ga2VlcHMgYWR2YW5jaW5nXG4gICAgICAgICAgICAgICAgICAgKiBgbWV0YWRhdGEuYXR0ZW1wdGAsIHdoaWNoIHRoZSBtYXgtZGVsaXZlcnkgY2hlY2sgYXQgdGhlIHRvcFxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGhhbmRsZXIgYWxyZWFkeSBib3VuZHMg4oCUIGFuZCB0aGUgZGVsYXkgYmVsb3cgaXMgd2hhdFxuICAgICAgICAgICAgICAgICAgICogbWFrZXMgdGhhdCBidWRnZXQgc3BhbiByZWFsIHRpbWUgcmF0aGVyIHRoYW4gYmVpbmcgYnVybmVkIGluXG4gICAgICAgICAgICAgICAgICAgKiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmtub3duXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogeyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB8IHsgcmVpbnZva2VkOiBmYWxzZTsgZXJyb3I6IEVycm9yIH1cbiAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gKHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWludm9jYXRpb25zID0gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IG1heFJlaW52b2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiB3YXMgcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgJHttYXhSZWludm9jYXRpb25zfSByZS1pbnZvY2F0aW9ucyBvZiAke2dldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKCl9IGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnRzIGVhY2g6IHRoaXMgcnVuIGNhbm5vdCBvYnNlcnZlIGl0cyBvd24gZXZlbnQgbG9nIGNvbXBsZXRlbHkgZW5vdWdoIHRvIG1ha2UgcHJvZ3Jlc3MuIExhc3QgcmVqZWN0aW9uICgke3JlYXNvbn0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZSBhZnRlciBpbi1wcm9jZXNzIHJlc3RhcnRzOyByZS1pbnZva2luZyBydW4gZm9yIGEgZnJlc2ggcmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVpbnZvY2F0aW9ucyc6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkLCB1bmxpa2UgdGhlIG90aGVyIHJlaW52b2tlKCkgY2FsbGVyczogdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVzdGFydHMgYWxyZWFkeSByZWxvYWRlZCB0aGUgbG9nIHNldmVyYWwgdGltZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBjYXRjaGluZyB1cCwgc28gdGhlIHdyaXRlcnMgdGhpcyByZXBsYXkgaXMgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUuIFJldHJ5aW5nIGluc3RhbnRseSBqdXN0IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgZ3VhcmQsIHNoYXJlZCBieSB0aGUgdHdvIHBhdGhzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYSBydW46IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbnMgYW5kIGZsb3cgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRGVwbG95bWVudCA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICdydW5JZCcgfCAnZGVwbG95bWVudElkJyB8ICdzcGVjVmVyc2lvbidcbiAgICAgICAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlUGF5bG9hZDogKCkgPT4gUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wPzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0Y29tZSwgc3BhbkF0dHJpYnV0ZXMgfSA9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50OiBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWVucXVldWU6IGFzeW5jICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH06IFJlZW5xdWV1ZUFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVlbnF1ZXVlUGF5bG9hZCgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRlcGxveW1lbnRJZCwgc3BlY1ZlcnNpb24sIGRlbGF5U2Vjb25kcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkF0dHJpYnV0ZXMpIHNwYW4/LnNldEF0dHJpYnV0ZXMoc3BhbkF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y29tZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybiDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogYmdSdW4uc3RhdHVzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBldmVyeSBxdWV1ZWQgc3RlcCBleGVjdXRpb24g4oCUIGZpcnN0IGRpc3BhdGNoIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcy9yZXRyaWVzIGFsaWtlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoYmdSdW4sIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgIT09ICdjb250aW51ZSdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZyBmb3IgYSBiYWNrZ3JvdW5kZWQgc3RlcC4gYG1ldGFkYXRhLmF0dGVtcHRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCkgaXMgYSBjaGVhcCB1cHBlciBib3VuZCwgYnV0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3Zlci1jb3VudHM6IGEgVGhyb3R0bGVFcnJvciAvIFRvb0Vhcmx5RXJyb3Ig4oCUIG9yIGFueVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgdGhhdCBuZXZlciByYW4gdGhlIGJvZHkg4oCUIHN0aWxsIGFkdmFuY2VzIGl0LCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRydXN0aW5nIGl0IGRpcmVjdGx5IGNvdWxkIGZhaWwgYSBzdGVwIGFzIFwiZXhjZWVkZWQgbWF4XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllc1wiIGJlZm9yZSB0aGUgYm9keSBldmVyIHJhbiAoYSB1c2VyLXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWdyZXNzaW9uIHVuZGVyIHRyYW5zaWVudCBiYWNrZW5kIHByZXNzdXJlKS4gVXNlIGl0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGZhc3QgZ2F0ZTogd2hpbGUgaXQgaXMgYXQgb3IgdW5kZXIgdGhlIGNlaWxpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBjYW5ub3QgYmUgZXhoYXVzdGVkLCBzbyBwcm9jZWVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nLiBPbmx5IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyBkbyB3ZSBsb2FkIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nIGFuZCBkZXJpdmUgdGhlIGF1dGhvcml0YXRpdmUgYXR0ZW1wdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZGVkIGBzdGVwX3N0YXJ0ZWRgIGNvdW50IOKAlCBzY29wZWQgdG8gdGhlIGxpZmVjeWNsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG90YWwgKGJhcmUgc3RhcnRzIHBsdXMgdGhlIGxhcmdlc3Qgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXIncyBzdGFydHMpOiB0aHJvdHRsZS90b28tZWFybHkgcmVkZWxpdmVyaWVzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RhcnQgYXQgYWxsLCByYWNpbmcgaW52b2NhdGlvbnMnIG9uZS1vZmYgc3RhbXBlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZXMgZG9uJ3QgYWNjdW11bGF0ZSAoY291bnRpbmcgdGhlbSBmYWxzZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhoYXVzdGVkIGhlYWx0aHkgc3RlcHMg4oCUIHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXR0ZW1wdHMgYnVybmVkIHVuZGVyIGEgcHJpb3IgaW5saW5lLW93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIHN0aWxsIGNvdW50LCBzbyBhIHN0ZXAgdGhhdCB0aW1lcyBvdXQgdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZCByZWNvdmVyeSBhbmQgdGhlbiB0cmFuc2l0aW9ucyB0byBxdWV1ZWQvYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXMgdHJpcHMgdGhlIGNvbWJpbmVkIGNlaWxpbmcuIFRoaXMgc3RpbGwgYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dHMsIHdoaWNoIHdyaXRlIG5vIGVycm9yIGZvciB0aGUgcG9zdC1ib2R5IGd1YXJkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2guIFRoZSBsb2FkIGFsc28gcHJpbWVzIHRoZSByZXBsYXknc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBjYWNoZWRFdmVudHNgL2BldmVudHNDdXJzb3JgICh0aGUgcG9zdC1zdGVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIGJlbG93IHJlZnJlc2hlcyB0aGVtIG9uY2UgdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50IGxhbmRzKS5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdNYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBGdW5jdGlvbihpbmNvbWluZ1N0ZXBOYW1lKT8ubWF4UmV0cmllcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gYmdNYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoY2FjaGVkRXZlbnRzLCBpbmNvbWluZ1N0ZXBJZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0b3RhbEF0dGVtcHRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzIOKAlCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKGJnUnVuLmF0dHJpYnV0ZXMsIHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGUsIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlY29yZGVkIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIChzZWUgYWJvdmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0g4oCUIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3RlcElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBlbmRpbmcgc3RlcCB0aGF0IFRISVMgbWVzc2FnZSBpbmxpbmUtb3ducyAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2Ugc3RhbXBlZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGFuZCB0aGVuIGNyYXNoZWQgbWlkLWJvZHkpIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmVkIGhlcmU6IG9ubHkgdGhlIG93bmluZyBtZXNzYWdlIG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1leGVjdXRlIGl0IGJlZm9yZSB0aGUgb3duZXJzaGlwIGxlYXNlIGV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3YWtlIHJlcGxheXMgbWVyZWx5IGVuc3VyZSBhIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AuIEZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wLCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0YWJsZSByb3V0ZXMgaXQgdG8gb3duZWQgcmVjb3ZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZTsgZmFsbGluZyB0aHJvdWdoIHRvIHJlY292ZXIgYW4gaW5saW5lIHN0ZXAgb3duZWQgYnkgdGhpcyBtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZyDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBkb25lIGFuZCByZXBsYXkgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgZG9uZSDigJQgZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIHJlcGxheSBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHNoYXJlZCBzdGF0ZSBzbyB0aGUgbG9vcCBjYW4gY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmUgYWZ0ZXIgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gY2FjaGVkRXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheUlucHV0OiB1bmtub3duO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkNyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTGVnYWN5U3BlY1ZlcnNpb24oYmdSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwicnVuX2NyZWF0ZWRcIiBldmVudGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBydW5zIHByZWRhdGUgdGhlIGV2ZW50LXNvdXJjZWQgcnVuX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YXJpYW50LCBzbyByZXRhaW4gdGhlIHJlc29sdmVkIEdFVCBvbmx5IGZvciB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWdhY3lSdW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdhY3lSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBsZWdhY3lSdW4uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmdSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiByZXBsYXlJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gYmdTdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZWRFdmVudHMgYW5kIGV2ZW50c0N1cnNvciBhbHJlYWR5IHNldCBmcm9tIGxvYWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIGVycm9yIHdoaWxlIHByZXBhcmluZyBiYWNrZ3JvdW5kIHdvcmtmbG93IHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gTGF6eSBob29rIHJlc3VtZSBmYXN0IHBhdGggLS0tXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgaG9vayBkZWxpdmVyeSAocmVzdW1lSWQgKyBkaWdlc3Qgb24gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSBob2lzdHMgdGhlIGNvbnN1bWVyJ3MgaWRlbXBvdGVudCBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAvLyByZS1lbnN1cmUgYWJvdmUgcnVuX3N0YXJ0ZWQgYW5kIGFza3MgdGhlIFdvcmxkIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmVwbGF5IGxvZyB3aXRoIHRoZSB3cml0ZSAocHJlbG9hZEV2ZW50cykuIEFcbiAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgYW5zd2VycyB3aXRoIHRoZSByZWNvbnN0cnVjdGVkIHJ1biwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZXBsYXkgbG9nLCBhbmQgdGhlIHJ1bidzIGV2ZW50IGNlaWxpbmcg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHRoZSBnZW5lcmljIHNldHVwIGJlbG93IHdvdWxkIHNwZW5kIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIFBPU1QgYW5kIGFuIGV2ZW50cy5saXN0IG9uLiBBbnkgb3RoZXIgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAvLyAob2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlcyB0aGUgcGFyYW0sIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWQgdGhhdCBmYWlscyB2YWxpZGF0aW9uLCBpbmNsdWRpbmcgYSBib3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlIHBhZ2UpIGZhbGxzIGJhY2sgdG8gdGhhdCBnZW5lcmljIHNldHVwOyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUgaXRzZWxmIGhhcyBzdGlsbCBzdWNjZWVkZWQgZWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXksIHNvIHRoZSByZS1lbnN1cmUgYmxvY2sgYmVsb3cgaXMgc2tpcHBlZCB2aWFcbiAgICAgICAgICAgICAgICAgIC8vIGBob29rRW5zdXJlZGAuIE5ldmVyIHRha2VuIG9uIHR1cmJvICh0dXJibyBkZWxpdmVyaWVzXG4gICAgICAgICAgICAgICAgICAvLyBjYXJyeSBydW5JbnB1dCwgbm90IGhvb2tJbnB1dCkgb3IgYWZ0ZXIgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCBhbHJlYWR5IGxvYWRlZCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgbGV0IGhvb2tFbnN1cmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnBheWxvYWREaWdlc3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tSZXN1bWVJbnB1dCA9IGhvb2tJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZSB0aGUgbWF0ZXJpYWxpemVkIGV2ZW50IHRvIHdoZW4gdGhlIHJlc3VtZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAvLyBvY2N1cnJlZCDigJQgc2FtZSBkZXJpdmF0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3cgKHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWVJZCBpcyBhIFVMSUQgbWludGVkIGJ5IHJlc3VtZUhvb2soKSBhdCByZXN1bWVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGltZSkuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cnJlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWUoaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5wcmVsb2FkX2V2ZW50cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tSZXN1bWVJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rUmVzdW1lSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rUmVzdW1lSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0Vuc3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVubGlrZSB0aGUgcmUtZW5zdXJlIGJlbG93LCB0aGlzIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIE5PVCBzZXQgSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCDigJQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIG9uIGV2ZXJ5IGZhc3QtcGF0aCByZXN1bWUsIGluY2x1ZGluZyB0aGUgY29tbW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3aGVyZSB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGUgYWxyZWFkeSBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBjYWxsIG1lcmVseSBjb252ZXJnZWQgb24gaXQsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWNvdmVyeSBzaWduYWwuIHdvcmtmbG93LnJlc3VtZV9zZXR1cF9zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVsb3cpIGRlc2NyaWJlcyB0aGlzIHBhdGggaW5zdGVhZC5cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIGlzIHVzYWJsZSBhcyByZXBsYXkgaW5wdXQgb25seSB3aGVuIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb25zdHJhYmx5IHRoZSBjb21wbGV0ZSBwaWN0dXJlOiBhIHJlY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCBhIHN0YXJ0IHRpbWUsIGEgbm9uLWVtcHR5IENPTVBMRVRFIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXNNb3JlIGZhbHNlIOKAlCB0aGlzIHBhdGggaGFzIG5vIGN1cnNvci1jb250aW51YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lcnksIHNvIGEgYm91bmRlZCBwYWdlIG11c3Qgbm90IGJlIHRydXN0ZWQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIncyBldmVudCBjZWlsaW5nICh0aGlzIHJlc3BvbnNlIHBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQncyByb2xlLCBzbyBhIG1pc3NpbmcgY2VpbGluZyB3b3VsZCBsZWF2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LWxpbWl0IGVuZm9yY2VtZW50IGRpc2FibGVkIGZvciB0aGUgcnVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHJ1biBsaWZlY3ljbGUgZXZlbnRzLCB0aGUgY2Fub25pY2FsIGV2ZW50IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBjb252ZXJnZWQgb24sIGFuZCB0aGUgaG9va19yZWNlaXZlZCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRISVMgcmVzdW1lIChzbyB3ZSBuZXZlciByZXBsYXkgYWdhaW5zdCBhIGxvZyB0aGF0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlzc2luZyB0aGUgdmVyeSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGRlbGl2ZXJ5KS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2FibGVSZXBsYXlQcmVsb2FkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bi5zdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3Vyc29yICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdC5tYXhFdmVudHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZVJlcGxheVByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4/LnN0YXJ0ZWRBdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlY29uc3RydWN0ZWQgcnVuIGFsd2F5cyByZWFkcyAncnVubmluZycsIGJ1dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBjb21taXR0ZWQgY29uY3VycmVudGx5IHJpZGVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGl0c2VsZi4gVGhlIG5vZGUgcmVwbGF5IGxvb3Agd291bGQgY2F0Y2ggaXQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBkaXNwYXRjaGVzIGJlZm9yZSB0aGF0IGNoZWNrIOKAlCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgaGVyZSwgYmVmb3JlIGFueSBlbmdpbmUgcnVucy4gU2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZSBhcyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCdzIG5vbi1ydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgY2hlY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcmVzdWx0LmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIHN0aWxsIGluaXRpYWxpemVkIHRoaXMgZGVsaXZlcnkgKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGhvdyB0aGUgdGVybWluYWwgc3RhdGUgd2FzIG9ic2VydmVkKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwLXNvdXJjZSBhbmQgdGhlIHJ1bidzIGFjdHVhbCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgYXJlIHJlY29yZGVkIGJlZm9yZSBjb25zdW1pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2FuY2VsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgbGF6eSBob29rIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUyDigJQgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcGxheXMgcnVuX3N0YXJ0ZWQncyByb2xlIG9uIHRoaXMgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsaWRhdGVkIHByZWxvYWQgaXMgdGhlIENPTVBMRVRFIGxvZyAoaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UpLCBzbyBRdWlja0pTIG1heSB0cnVzdCBpdCBhcy1pcyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZldGNoaW5nIOKAlCBpdHMgb3duIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHJlY29nbml6ZXMgcnVuX2NyZWF0ZWQvcnVuX3N0YXJ0ZWQgcHJlbG9hZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzIOKAlCBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50IOKAlCByZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgc2tpcFByZWxvYWQ6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiBza2lwUHJlbG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cyAocHJlbG9hZGVkRXZlbnRzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgdG8gW10gYmVsb3cpLCBzbyB0ZWxsIHRoZSBXb3JsZCB0byBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgZXZlbnQtbG9nIHByZWxvYWQuIFRoYXQgdHJpbXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCByZXF1ZXN0IHRoZSBjaGFpbmVkIGZpcnN0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgb24g4oCUIHNob3J0ZW5pbmcgdGltZS10by1zZWNvbmQtc3RlcCDigJQgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzdGVkIGxpc3QrcmVzb2x2ZSBpdCB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkLCBza2lwUHJlbG9hZDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIgPSBzdGFydGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBiYWNrZ3JvdW5kcyBydW5fc3RhcnRlZCwgc28gdGhlIG5vbi10dXJibyBhc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgbmV2ZXIgcnVucyDigJQgdGhyZWFkIHRoZSBwZXItcnVuIGV2ZW50IGNlaWxpbmcgb2ZmIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCByZXNwb25zZSBoZXJlIGluc3RlYWQuIFRoZSBndWFyZCByZS1jaGVja3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhFdmVudHNMaW1pdCBldmVyeSBsb29wIGl0ZXJhdGlvbiwgc28gYSB2YWx1ZSB0aGF0IGxhbmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnRseSBhZnRlciBzdGFydCBzdGlsbCBlbmZvcmNlcyB3ZWxsIGJlZm9yZSBhIHJ1bmF3YXlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgYXBwcm9hY2hlcyB0aGUgY2VpbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkUHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBjbGFtcE1heEV2ZW50cyhyPy5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCkgbWF4RXZlbnRzTGltaXQgPSBsaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIGEgbm8tb3AgcmVqZWN0aW9uIGhhbmRsZXIgc28gYW4gZWFybHkgZmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZFJlamVjdGlvbiBiZWZvcmUgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChhd2FpdC90aGVuKSBpcyBhdHRhY2hlZDsgY29uc3VtZXJzIHN0aWxsIG9ic2VydmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3Q6IG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgeWV0IG9uIGEgZmlyc3QgZGVsaXZlcnkgKHJ1bl9zdGFydGVkIGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0KS4gQW4gZW1wdHkgcHJlbG9hZGVkIHNldCByb3V0ZXMgaXRlcmF0aW9uIDEgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuby1sb2FkIHByZWxvYWRlZCBicmFuY2g7IGl0ZXJhdGlvbiAyIHRoZW4gdGFrZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcG9zdC1wcmVsb2FkZWQgZnVsbCByZWxvYWQgdG8gcGljayB1cCBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChubyBzcHVyaW91cyBcImN1cnNvciBtaXNzaW5nXCIgd2FybmluZykuIGBbXWAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IHRydXRoeSBoZXJlIOKAlCBkbyBub3QgY2hhbmdlIHRoZSBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYnJhbmNoZXMnIGBpZiAocHJlbG9hZGVkRXZlbnRzKWAgY2hlY2tzIHRvIHRlc3QgbGVuZ3RoLlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzIOKAlCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgYHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXNgIGRlY2xhcmF0aW9uIGFib3ZlOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHN5bnRoZXNpemVzIHRoZSBydW4gYmVmb3JlIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCByZXNwb25zZSBsYW5kcywgc28gYW5jaG9yIFJTRlMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IGFuIGFjdHVhbCByZXNwb25zZSBpbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQocnVuU3RhcnRlZEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gZm9yICdydW5fc3RhcnRlZCcgZGlkIG5vdCByZXR1cm4gdGhlIHJ1biBlbnRpdHkgZm9yIHJ1biBcIiR7cnVuSWR9XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTIOKAlCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpbmNsdWRlcyBldmVudHMsIHVzZSB0aGVtIHRvIHNraXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgYW5kIHJlZHVjZSBUVEZCLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHJlc3VsdC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4uc3RhcnRlZEF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gd2FzIGNvbmN1cnJlbnRseSBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yOiBydW4gd2FzIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZCBkdXJpbmcgc2V0dXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvcjogcnVuIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHNraXAgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgcnVudGltZSBlcnJvciBkdXJpbmcgd29ya2Zsb3cgc2V0dXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHdvcmtmbG93UnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHdvcmtmbG93UnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVybW9yZSwgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBvciBhIHdheSB0byBmb3JjZSBjYW5jZWwgU0lHS0lMTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkg4oCUIGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zIOKAlCBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSwgaW5saW5lIHN0ZXAsIG9yIGV2ZW50IHdyaXRlIGhhcHBlbnMgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJ1biBpcyBub3QgcGlubmVkIGhlcmUgKHNlZSBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBhd2FpdFJ1blJlYWR5YCBvcmRlcnMgdHVyYm8ncyBgcnVuX3N0YXJ0ZWRgIGJlZm9yZSBlaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHN0b3BwaW5nIGFjdGlvbi5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBSdW5zIGFoZWFkIG9mIHRoZSBsYXp5LWhvb2sgcmUtZW5zdXJlIGJlbG93LCBzbyBhIG1pc3JvdXRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdyaXRlcyBub3RoaW5nIGhlcmUg4oCUIHdoaWNoIG1lYW5zIHRoZSByZS1yb3V0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYSByZXN1bWUgd2hvc2UgcHJvZHVjZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZSBsb3N0ICh0aGF0IHJlLWVuc3VyZSBpc1xuICAgICAgICAgICAgICAgICAgLy8gaWRlbXBvdGVudCBwZXIgYHJlc3VtZUlkYCwgc28gdGhlIHBpbm5lZCBkZXBsb3ltZW50IHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZXMgb24gb25lIGV2ZW50KS5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGhvb2sgcmVzdW1lOiB0aGUgcHJvZHVjZXIgKHJlc3VtZUhvb2sgZmFzdCBwYXRoKVxuICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoLCBzbyB0aGUgZXZlbnQgbWF5IG5vdCBiZSBwZXJzaXN0ZWQgeWV0LiBJZGVtcG90ZW50bHlcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCBiZWZvcmUgcmVwbGF5IOKAlCBrZXllZCBieSBgcmVzdW1lSWRgIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcHJvZHVjZXIgd3JpdGUgY29udmVyZ2VzIG9uIGV4YWN0bHkgb25lIGV2ZW50XG4gICAgICAgICAgICAgICAgICAvLyAodGhlIHNlcnZlciByZXNvbHZlcyBhIG1hdGNoaW5nIGNsYWltIGFzIHN1Y2Nlc3MsIG5vdCBhblxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IpLiBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCkg4oCUIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIOKAlCBvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sg4oCUIHNvIHRoaXMgYmxvY2sgKGFuZCB0aGUgc2tpcCBjaGVjaykgbm93IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVzIGhvb2tJbnB1dCBzaGFwZXMgd2l0aG91dCB0aGUgZnVsbCBpZGVtcG90ZW5jeVxuICAgICAgICAgICAgICAgICAgICAvLyBwYWlyLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5UHJlbG9hZGVkID1cbiAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cz8uc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nIOKAlCBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgc2ltcGx5IGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQg4oCUIHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUg4oCUIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlIOKAlCB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciAocHJlbG9hZGVkRXZlbnRzIGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc29ydE9yZGVyOiAnYXNjJ2AgYW5kIGFyZSBub3QgcmUtc29ydGVkIGNsaWVudC1zaWRlKSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpZGVtcG90ZW50IGV2ZW4gaWYgYSBsYXRlciBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgV29ybGQgcmV0dXJucyBubyBldmVudCAob2xkZXIgYmFja2VuZCkgZG8gd2UgZmFsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gZHJvcHBpbmcgdGhlIHByZWxvYWQgc28gYSBmcmVzaCBsaXN0IG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChwcmVsb2FkZWRFdmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChyZS1lbnN1cmUgbmVlZGVkKVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBydW4ncyBkZXBsb3ltZW50LlxuICAgICAgICAgICAgICAgICAgLy8gVXNlZCBlYWdlcmx5IGhlcmUgc2luY2UgYm90aCB3b3JrZmxvdyBleGVjdXRpb24gKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBJbnZvY2F0aW9uLXNjb3BlZCBjYWNoZSBvZiBWTS1pbmRlcGVuZGVudCBwcmVwYXJlZCBwYXlsb2Fkc1xuICAgICAgICAgICAgICAgICAgLy8gYW5kIGltbXV0YWJsZSBmaW5hbCB2YWx1ZXMuIEl0IHN1cnZpdmVzIHRoZSBmcmVzaCB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgLy8gVk0gY3JlYXRlZCBieSBlYWNoIGlubGluZSByZXBsYXksIGJ1dCBuZXZlciBjcm9zc2VzIHJ1bnMgb3JcbiAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlQYXlsb2FkQ2FjaGUgPSBuZXcgUmVwbGF5UGF5bG9hZENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgbGl2ZSBWTSBwYXJrZWQgYXQgdGhlIHByZXZpb3VzIGJvdW5kYXJ5LCB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGtlcHQgaXQuIG51bGwg4oaSIHRoaXMgaXRlcmF0aW9uIGNvbGQtXG4gICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLiBJbnZvY2F0aW9uLXNjb3BlZDogZGllcyB3aXRoIHRoaXMgZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgcmV0YWluZWRTZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3Mvbm9Db25zdGFudENvbmRpdGlvbjogaW50ZW50aW9uYWwgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT24gVmVyY2VsLCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQgYWx3YXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgdGhlIHByb2Nlc3MuIE9uIGxvY2FsIGRldiBpdCByZXR1cm5zOyB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgdGhlIHJlcXVlc3QgZW5kcyBub3JtYWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fZmFpbGVkIGhhcyBiZWVuIHdyaXR0ZW4gYmVzdC1lZmZvcnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBub0lubGluZVJlcGxheUFmdGVyTXNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0gUXVpY2tKUyBWTSBlbmdpbmUgZGlzcGF0Y2ggLS0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFF1aWNrSlMgZW5naW5lIChvcHQtaW4gdmlhIFdPUktGTE9XX1ZNPXF1aWNranNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvciBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0pIGlzIGEgc2VsZi1jb250YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZSB0byB0aGUgbm9kZTp2bSBpbmxpbmUtcmVwbGF5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGZ1bGwgZXZlbnQgcmVwbGF5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSB3b3JrZmxvdyBjb2RlIGluIGEgUXVpY2tKUyBXQVNNIFZNLCBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyB2aWEgdGhlIHNhbWUgY29tYmluZWQgcm91dGUgKHNvIHRoZXkgaGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXAgYmVsb3cgb24gcmUtZW50cnkpLCBhbmQgbWFuYWdlcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQgbGlmZWN5Y2xlIGZvciB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWVzLiBXaGVuIHRoZSBRdWlja0pTIGVuZ2luZSBpcyBpbiBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IElOU0lERSB0aGlzIHRyeTogZW5naW5lIGZhaWx1cmVzIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgdGhlIGVudHJ5cG9pbnQgKE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBXQVNNIE9PTSBhdCB0aGUgbWVtb3J5IGNlaWxpbmcsIGEgYnVuZGxlLWV2YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlKSBtdXN0IHJlYWNoIHRoaXMgbG9vcCdzIGNhdGNoIHNvIHRoZXkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZCBhbmQgcmVjb3JkZWQgYXMgcnVuX2ZhaWxlZCDigJQgb3V0c2lkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhleSB3b3VsZCBuYWNrIHRoZSBtZXNzYWdlIGFuZCBidXJuIGFsbCBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcyBiZWZvcmUgZHlpbmcgYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNQVhfREVMSVZFUklFU19FWENFRURFRC4gVHJhbnNpZW50IHdvcmxkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJldGhyb3cgb3V0IG9mIHRoZSBjYXRjaCBmb3IgcmVkZWxpdmVyeSwgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIG5vZGUtZW5naW5lIHJlcGxheSBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUXVpY2tKU1ZtKHdvcmtmbG93UnVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnVXNpbmcgUXVpY2tKUyBWTSBlbmdpbmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrSlMgZW50cnlwb2ludCBmZXRjaGVzIHRoZSBldmVudCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgZXZlbnRzIGRpcmVjdGx5LCBzbyB3YWl0IGZvciB0aGUgcnVuIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmx5IHN0YXJ0ZWQgZmlyc3Qg4oCUIGl0IGRvZXMgbm90IHRocmVhZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHJ1blJlYWR5QmFycmllciB0aGUgd2F5IGhhbmRsZVN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGltcG9ydDogdGhlIFF1aWNrSlMgZW50cnlwb2ludCdzIGltcG9ydCBjaGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWRzIHRoZSBiYXNlNjQgV0FTTSBiaW5hcnkgKyBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjEuMyBNQiBkZWNvZGVkIGF0IG1vZHVsZSBzY29wZSkuIExvYWRpbmcgaXQgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhhdCBvdXQgb2Ygbm9kZS1lbmdpbmUgZGVwbG95bWVudHMgZW50aXJlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOKAlCBvbmx5IHRoZSBvcHQtaW4gcGF0aCBwYXlzLCBvbiBmaXJzdCBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLi9ydW50aW1lL3F1aWNranMtZW50cnlwb2ludC5qcydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWlja2pzUmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNwYW46IHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpY2tqc1Jlc3VsdD8udGltZW91dFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYHJlaW52b2tlYCByYXRoZXIgdGhhbiByZXR1cm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAgZGlyZWN0bHk6IHVuZGVyIHR1cmJvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIG9uIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHJlcGxheWluZyBhZ2FpbnN0IGEgc3RhbGUgcHJlbG9hZGVkIGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VkZ2luZyB0aGUgcnVuIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSkuIHJlaW52b2tlIGVucXVldWVzIGFuIGV4cGxpY2l0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiB3aXRob3V0IGBydW5JbnB1dGAgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UocXVpY2tqc1Jlc3VsdC50aW1lb3V0U2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMg4oCUIHVzZSBjYWNoZWQgZXZlbnRzIHdpdGggaW5jcmVtZW50YWwgZmV0Y2ggb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgYSBjdXJzb3Igd2hlbiB0aGVyZSBhcmUgZXZlbnRzIChldmVuIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhZ2UpLCBzbyB3ZSBjYW4gcmVsaWFibHkgdXNlIGl0IGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJbmxpbmVEZWx0YSAmJiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogdGhlIHByZXZpb3VzIGl0ZXJhdGlvbidzIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCB0aGUgYXV0aG9yaXRhdGl2ZSBldmVudC1sb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGUgY3Vyc29yLCBzbyB3ZSBjb25zdW1lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWx0YSBpcyBieXRlLWZvci1ieXRlIHdoYXQgZXZlbnRzLmxpc3QoY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgaGF2ZSByZXR1cm5lZCBhdCB3cml0ZSB0aW1lIOKAlCBpdCBpbmNsdWRlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3Mgb3duIHN0ZXAgZXZlbnRzLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXAgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkKSBhbm90aGVyIHdyaXRlciBhcHBlbmRlZCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciDigJQgc28gc2tpcHBpbmcgdGhlIGZldGNoIGNhbm5vdCBkcm9wIGV2ZW50cyBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tldyB0aGUgcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGVuZGluZ0lubGluZURlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhjYWNoZWRFdmVudHMsIGRlbHRhLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBkZWx0YS5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkRXZlbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBpdGVyYXRpb246IHVzZSBwcmVsb2FkZWQgZXZlbnRzIGlmIGF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBkbyBhIGZ1bGwgbG9hZCB3aXRoIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgaXRlcmF0aW9uOiBmZXRjaCBvbmx5IG5ldyBldmVudHMgc2luY2UgbGFzdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZHVwZSBieSBldmVudElkOiBhIHByZXZpb3VzIGl0ZXJhdGlvbiBtYXkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kZWQgYSByZWZyZXNoZWQgd2FpdC1jb21wbGV0aW9uIGRlbHRhIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbG9vcCBvYnNlcnZlcyB0aGUgYWR2YW5jZWQgY3Vyc29yLCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgZmV0Y2ggY2FuIHJldHVybiBldmVudHMgd2UgYWxyZWFkeSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGNhY2hlZEV2ZW50cywgbG9hZGVkLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uIDIgYWZ0ZXIgaXRlcmF0aW9uIDEgdXNlZCBwcmVsb2FkZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggZG9uJ3QgY2FycnkgYSBjdXJzb3IpLiBEbyBhIGZ1bGwgbG9hZCBub3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW55IGV2ZW50cyB3cml0dGVuIHNpbmNlIHRoZSBwcmVsb2FkZWQgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb2J0YWluIGEgY3Vyc29yIGZvciBzdWJzZXF1ZW50IGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcy4gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcGF0aCwgbm90IGEgYnVnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1cnNvciBhZnRlciBwcmVsb2FkZWQtZXZlbnRzIGZpcnN0IGl0ZXJhdGlvbjsgZG9pbmcgZnVsbCByZWxvYWQgdG8gcGljayB1cCBjdXJzb3IuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjdXJzb3IgYXZhaWxhYmxlIGRlc3BpdGUgaGF2aW5nIGNhY2hlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBwcmVsb2FkZWQtZXZlbnRzIGV4cGxhbmF0aW9uLiBBbGwgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcmV0dXJuIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSBldmVudHMsIHNvIHRoaXMgc2lnbmFscyBhIGJ1ZyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkLiBGYWxsIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciBtaXNzaW5nIGFmdGVyIGluaXRpYWwgbG9hZCDigJQgZmFsbGluZyBiYWNrIHRvIGZ1bGwgcmVsb2FkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIFdvcmxkIGltcGxlbWVudGF0aW9uLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaXNoIHRoZSBzbmFwc2hvdCB0byB0aGUgbG9vcC1zY29wZWQgY2FjaGUgYXMgc29vblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGlzIGxvYWRlZCwgbm90IGp1c3QgYXQgdGhlIGVuZCBvZiB0aGUgaXRlcmF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRocm93biBieSB0aGUgd2FpdC1jb21wbGV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGJlbG93IHJlc3RhcnRzIHRoZSByZXBsYXksIGFuZCB0aGF0IHJlc3RhcnQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb25zdW1lIGEgV29ybGQtYXR0YWNoZWQgZXZlbnQgZGVsdGEgd2hlbiB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY2FjaGVkIGFycmF5IHRvIG1lcmdlIGl0IGludG8uIFJlYXNzaWduZWQgYWdhaW4gYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBwYXNzLCB3aGljaCBtYXkgc3dhcCBpbiBhIGZyZXNobHkgbG9hZGVkIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGV2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoZXZlbnRzLCBldmVudHNDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0c1RvQ29tcGxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLiBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yIHNvIGNvbmN1cnJlbnQgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsIGtlZXAgdGhlaXIgb3JkZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsIGJhY2sgdG8gYSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdCBnaXZlIHVzIGEgc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdCBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMoZXZlbnRzLCBsb2FkZWQuZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW5nIGVsYXBzZWQgd2FpdHMgcmVmcmVzaGVzIHRoZSBldmVudCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBtYXkgaGF2ZSB3cml0dGVuIHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBhZnRlciB0aGUgaW5pdGlhbCBzbmFwc2hvdCBidXQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIE9uY2UgdGhlIGV2ZW50IGxvZyByZWNvcmRzIHRoYXQgb3V0Y29tZSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlcyB0aGUgc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcgKHVuZGVmaW5lZCDih5Igbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbmZvcmNlbWVudCkuIFRoZSB0aHJvdyBpcyBjYXVnaHQgYmVsb3cgYW5kIHdyaXR0ZW4gYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fZmFpbGVkIC8gTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHJlZmVyZW5jZSAobWF5IGhhdmUgYmVlbiBzZXQgZm9yIGZpcnN0IHRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBjdXJzb3IgYXMgaXQgc3RhbmRzIGZvciB0aGlzIGl0ZXJhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nLCBiZWZvcmUgYW55IGlubGluZSB3cml0ZXMgKHN0ZXBfY3JlYXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVTdXNwZW5zaW9uLCBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXApIGFkdmFuY2UgaXQuIFRoaXMgaXMgdGhlIGBzaW5jZUN1cnNvcmBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gYSBzdXBwb3J0aW5nIFdvcmxkIG9uIHRoZSBpbmxpbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgc28gaXQgY2FuIHJldHVybiB0aGUgZXZlbnQtbG9nIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG5leHQgaXRlcmF0aW9uIHNraXAgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QuIENhcHR1cmVkIGhlcmUgYmVjYXVzZSBub3RoaW5nIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGFuZCB0aGUgaW5saW5lIGV4ZWN1dGVTdGVwIG11dGF0ZXMgZXZlbnRzQ3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yID0gZXZlbnRzQ3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIHVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgKGFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIHNraXBwZWQpLiBXZWJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDcnlwdG8gd29yayBvdmVybGFwcyBWTSBzZXR1cCBvbiB0aGUgcmVwbGF5IHBhdGggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGVuZGVkIGV2ZW50cycgY29uc3VtcHRpb24gb24gdGhlIHJlc3VtZSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWVycyBzdGlsbCBkZXNlcmlhbGl6ZSBhbmQgcmVzb2x2ZSBpbiBldmVudCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkUHJld2FybSA9IHJlcGxheVBheWxvYWRDYWNoZS5wcmV3YXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1Jlc3VsdDogV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgcmVzdW1lV29ya2Zsb3cocmV0YWluZWRTZXNzaW9uLCBldmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAncmVwbGF5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0ID0gYXdhaXQgcmVwbGF5V29ya2Zsb3coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IHRoZSBlbmQtb2YtcnVuIGRyYWluIGluc2lkZSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24gY29tbWl0cyBmaXJlLWFuZC1mb3JnZXQgYCpfY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSB0aGUgdGVybWluYWwgYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYXlsb2FkUHJld2FybTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAnc3VzcGVuZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyayB0aGUgbGl2ZSBzZXNzaW9uOyB0aGUgc3VzcGVuc2lvbiBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgdGhlIG9uZSByZXRlbnRpb24gZGVjaXNpb24g4oCUIGtlZXAgaXQgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpdGVyYXRpb24gb3IgZGlzY2FyZCBpdCBmb3IgYSBmcmVzaCByZXBsYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSB3b3JrZmxvd1Jlc3VsdC5zZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgd29ya2Zsb3dSZXN1bHQuc3VzcGVuc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB3b3JrZmxvd1Jlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkLiBTZW5kIHRoZSBzbmFwc2hvdCBidXQgZG8gTk9UXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkLWFuZC1yZXRyeSB0aGUgY3JlYXRlIGluIHBsYWNlOiBgcmVzdWx0YCB3YXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBieSB0aGlzIHJlcGxheSwgc28gYSBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgKmZyZXNoIHJlcGxheSogKHdoaWNoIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcHJvZHVjZSBhIGRpZmZlcmVudCByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdC4gVGhlIGNhdGNoIGJlbG93IHJlc3RhcnRzIHRoZSByZXBsYXkgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtcyhldmVudHMsIGV2ZW50c0N1cnNvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIHdvcmtmbG93LWV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBvbmx5IOKAlCBhbmNob3JzIHRoZSBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IGZpZWxkIGJlbG93IChzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXMpLiBUaGlzIGlzIHRoZSBGSU5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHBhc3MsIHRoZSBvbmUgdGhhdCByZWFjaGVkIGFuZCBzY2hlZHVsZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBzdGVwOiB2YWxpZCByc2ZzIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCAoZS5nLiBhIHdvcmtmbG93LWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIHR3aWNlKSwgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5LiBUaGlzIHZhbHVlIGlzIE5PVCBhY2N1bXVsYXRlZCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRob3NlIGVhcmxpZXIgcGFzc2VzLCBzbyBpdCBtdXN0IG5vdCBiZSByZWFkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCIg4oCUIHJzZnMgY292ZXJzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCB3aW5kb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgY292ZXJzIG9ubHkgdGhpcyBsYXN0IHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlZCBoZXJlLCBiZWZvcmUgYGhhbmRsZVN1c3BlbnNpb25gJ3MgYXdhaXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSS9PLCBzbyBpdCBleGNsdWRlcyB0aGF0IEkvTy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGR1cGxpY2F0ZXMgd2hhdCBPVEVMIGFscmVhZHkgY2FwdHVyZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4vaW52b2NhdGlvbiBzcGFuLCBidXQgaXMgY29sbGVjdGVkIGFzIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IHNvIHRoZSBzZXJ2ZXIgY2FuIGVtaXQgaXQgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVOU0FNUExFRCwgZnVsbC1wb3B1bGF0aW9uIG1ldHJpYzogd29ya2Zsb3ctc2VydmVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBzcGFucyBhcmUgaGVhdmlseSBzYW1wbGVkIGluIHByb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+NyUpLCBhbmQgY2xpZW50IHNwYW5zIGNhbid0IGJlIGZpbHRlcmVkIGJ5IFNES1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiwgc28gbmVpdGhlciBjYW4gc2VydmUgYXMgdGhlIGRhc2hib2FyZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCBUVEZTIGRlY29tcG9zaXRpb24uIE9uIGEgcmV0YWluZWQtVk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB0aGlzIG1lYXN1cmVzIHRoZSByZXN1bWUgKHR5cGljYWxseSB+MG1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHJlcGxheSwgc28gdGhlIGZpZWxkJ3MgZGlzdHJpYnV0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW1vZGFsIG9uY2UgcmV0ZW50aW9uIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkg4oCUIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNuYXBzaG90IHJlZnJlc2ggYWJvdmUgYWx3YXlzIHNldHMgY2FjaGVkRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlcGxheSBjYW4gc3VzcGVuZC4gUmUtbmFycm93IGl0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBzY29wZSBpbnN0ZWFkIG9mIGRlZmF1bHRpbmcgdG8gYW4gZW1wdHkgYXJyYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGZhbGxiYWNrIHdvdWxkIHNpbGVudGx5IGRpc2FybSB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBndWFyZCAobm8gc25hcHNob3Qgc2VudCkgYW5kIGxldCBhIG1pZC1zdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgbWVyZ2UgaW50byBhIHRocm93YXdheSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogd29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTG9nOiBMb2FkZWRFdmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRzQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZzogc3VzcGVuc2lvbkxvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBzdXNwZW5zaW9uTG9nLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgbG9nIGFzIGxvYWRlZCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVCBpbiBpdCDigJQgdGhleSBuZXZlciByZWFjaCByZXRlbnRpb24gYW55d2F5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBhIHN1c3BlbnNpb24gY29udGFpbmluZyBhIG5vbi1zdGVwIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxzIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbidzIHR5cGUgY2hlY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2NhbiBpcyBjb25zdWx0ZWQuIENvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXppbHksIGF0IG1vc3Qgb25jZSwgYW5kIHNoYXJlZCBiZXR3ZWVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGhlcmUgYW5kIHRoZSBkZWx0YS90dXJibyBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cg4oCUIHRoZSBhdHRyLWRldG91ciBhbmQgaG9vay1jb25mbGljdCBwYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGUgZ2F0ZXMgYW5kIHVzdWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgYmVmb3JlIGV2ZXIgc2Nhbm5pbmcgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvd2VkIGFsaWFzOiB0aGUgY2xvc3VyZSBiZWxvdyB3b3VsZCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc2UgYGNhY2hlZEV2ZW50c2AncyBub24tbnVsbCBuYXJyb3dpbmcuIE5vdGhpbmcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F0Y2ggc2NvcGUgcmVhc3NpZ25zIHRoZSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25FdmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXQgPSBvbmNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlKHN1c3BlbnNpb25FdmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2luZ2xlIHJldGVudGlvbiBkZWNpc2lvbjoga2VlcCB0aGUgcGFya2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIG9ubHkgYWNyb3NzIGEgcHVyZSBzdGVwIGJvdW5kYXJ5IHdpdGggbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dC1vZi1iYW5kIGNvbnRpbnVhdGlvbiBzb3VyY2UgYW5kIHByb3ZhYmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzaXZlIHN0ZXAgaW5wdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhblJldGFpbldvcmtmbG93U2Vzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5yZXRhaW5lZFN0ZXBJbnB1dHNTYWZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rV2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMgKz0gc3VzcGVuc2lvblJlc3VsdC5ob29rQ3JlYXRpb25NcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPSBwcmVTdGVwQmxvY2tpbmdNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gaGFuZGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25NczogRGF0ZS5ub3coKSAtIHN1c3BlbnNpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzOiBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0Py5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IGJyZWFrIGxvb3AsIHJlLWludm9rZSB2aWEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIGFyZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCByZXBsYXk6IHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHJlbG9hZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgKG5vdyBob2xkaW5nIHRoZSBqdXN0LWNvbW1pdHRlZCBhdHRyX3NldCkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLCByZXNvbHZpbmcgdGhlIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwcm9jZXNzaW5nIGZvciB0aGlzIHBhc3Mgc28gdGhhdCByZXBsYXkgZGVjaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXMgZmlyc3Qg4oCUIGluIFByb21pc2UucmFjZShbc2V0QXR0cmlidXRlcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCgpXSksIHRoZSBkdXJhYmxlIGF0dHJpYnV0ZSBldmVudCBtdXN0IGJlIGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdpbiB3aXRob3V0IGV4ZWN1dGluZyB0aGUgbG9zaW5nIHN0ZXAuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbnMgaW4tcHJvY2VzcyByYXRoZXIgdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBzID0gc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBleGVjdXRpb24gaXMgZ2F0ZWQgb24gb3duZXJzaGlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgdG8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIChgbGF6eUlubGluZVN0ZXBzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBydW4gdGhlbSBpbmxpbmUg4oCUIGluIHBhcmFsbGVsIOKAlCB2aWEgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIHRoYXQgY3JlYXRlIGVhY2ggc3RlcCBvbiB0aGUgZmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gT3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhdG9taWMgYW5kIGV4YWN0bHktb25lIHBlciBzdGVwOiB0aGUgd29ybGQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIHN0ZXBfc3RhcnRlZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKOKGkiBleGVjdXRlU3RlcCBgc2tpcHBlZGApIHRvIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBsb3Nlciwgc28gb25seSBvbmUgaGFuZGxlciBldmVyIHJ1bnMgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gRXZlcnkgb3RoZXIgcGVuZGluZyBzdGVwIGtlZXBzIGl0cyBlYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIChpbiBgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkc2ApIGFuZCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgb25seSBkZXNpZ25hdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF6eUlubGluZVN0ZXBzYCB3aGVuIG5vIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnQuIFRoYXQgYXdhaXRlciBjYXNlIG11c3QgZXhlY3V0ZSBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmU6IGFuIGlubGluZSBgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKWAgYmxvY2tzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sIHNvIHRoZSBhd2FpdGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiAod2hpY2ggb25seSBhZHZhbmNlcyBvbiB0aGUgbmV4dCByZXBsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCBmb3IgcmUtaW52b2NhdGlvbiwgd2hpY2ggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIgd2hpbGUgcXVldWVkIHN0ZXBzIHJ1biBpbiBwYXJhbGxlbCBpbnZvY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBkaXNwYXRjaCBkZWNpc2lvbiB0YWJsZSAocGVyIHBlbmRpbmcgc3RlcCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2lnbmF0ZWQgbGF6eS1pbmxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyID09PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4ZWN1dGUgaW4gVEhJUyBpbnZvY2F0aW9uIChvd25lZCByZWNvdmVyeTogYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIHJlLWV4ZWN1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgaXQgY3Jhc2hlZCBvbiwgdmlhIGEgcGF5bG9hZC1sZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9zdGFydGVkIHJlLXN0YW1wZWQgd2l0aCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvd25lck1lc3NhZ2VJZCDigJQgbm90IGEgYmFyZSBzdGFydCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciAhPT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbnN1cmUgYSBERUxBWUVEIGJhY2tzdG9wIHdha2UgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGRlbGF5U2Vjb25kcyA9IG93bmVyc2hpcCBsZWFzZSByZW1haW5pbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW5zdGVhZCBvZiBlbnF1ZXVlaW5nIHRoZSBzdGVwLiBUaGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW52b2NhdGlvbiBpcyAobGlrZWx5KSBzdGlsbCBydW5uaW5nIHRoZSBib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuIGltbWVkaWF0ZSBzdGVwIG1lc3NhZ2Ugd291bGQgYmFyZS1zdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBydW5uaW5nIHN0ZXAgYW5kIGV4ZWN1dGUgaXQgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh3b3JrZmxvdyMyNzgwKS4gVGhlIGJhY2tzdG9wIGlzIGEgcGxhaW4gcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29udGludWF0aW9uLCBOT1QgYSBzdGVwIG1lc3NhZ2U6IHdoZW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBmaXJlcywgdGhpcyBzYW1lIGRlY2lzaW9uIHRhYmxlIGhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3aGF0ZXZlciBzdGF0ZSB0aGUgc3RlcCBpcyBpbiBieSB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHRlcm1pbmFsIOKGkiBub3RoaW5nIHBlbmRpbmc7IHF1ZXVlLW93bmVkIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9yZXRyeWluZyDihpIgbm9ybWFsIGtleWVkIGRpc3BhdGNoOyBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRlYWQgd2l0aCBsZWFzZSBleHBpcmVkIOKGkiBpbW1lZGlhdGUgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJlc2VydmluZyBzdGVwLWxldmVsIGZhaWx1cmUgc2VtYW50aWNzIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvaXNvbiBzdGVwczsgbGVhc2UgcmVmcmVzaGVkIGJ5IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVjb3Zlcnkg4oaSIHJlLWFybSkuIFRoZSBiYWNrc3RvcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgaXMgc2NvcGVkIHRvIHRoZSBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBFUE9DSCAobGF0ZXN0IHN0ZXBfc3RhcnRlZCB0aW1lc3RhbXApLCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRCwgYW5kIG11c3QgbmV2ZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBtZXNzYWdlJ3Mgb3duIGtleSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSBmb3IgYm90aCBpbnZhcmlhbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGZpeGVkIGtleXMgZWl0aGVyIGFic29yYiB0aGUgcmV0cnkgaGFuZG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9yIGRlZHVwZSB0aGUgcmVmcmVzaGVkLWxlYXNlIHJlLWFybSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGluLWZsaWdodCBiYWNrc3RvcCBpdHNlbGYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIE5vdCBvd25lZCAobmV2ZXIgc3RhbXBlZCAvIGVhZ2VyIC8gb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGFwc2VkIGF0IHN0ZXBfcmV0cnlpbmcgLyBsZWFzZSBleHBpcmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBraWxsLXN3aXRjaGVkKSDihpIgaW1tZWRpYXRlIGVucXVldWUsIGV4YWN0bHkgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZWZvcmUuIFRoaXMgY292ZXJzIGNyYXNoIHJlY292ZXJ5OiBpZiBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlciB3cm90ZSBzdGVwX2NyZWF0ZWQgYnV0IGNyYXNoZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciBxdWV1ZXMgaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZCBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkdW5kYW50IHF1ZXVlcyBhY3Jvc3MgY29uY3VycmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lT3duZXJzaGlwID0gaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaE5vd01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkUmVjb3ZlcnlTdGVwczogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1bXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tzdG9wV2FrZXNBcm1lZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcEFjdGl2ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lZCByZWNvdmVyeTogdGhpcyBkZWxpdmVyeSBJUyB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZTsgcmUtZXhlY3V0ZSB0aGUgc3RlcCBpbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHF1ZXVlaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQgYmFja3N0b3Agd2FrZSB3aGlsZSBhbm90aGVyIGludm9jYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgbGVhc2UgaXMgbGl2ZTsgaW1tZWRpYXRlIHN0ZXAgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgKGxlYXNlIGV4cGlyZWQg4oeSIHJlbWFpbmluZyAwIOKHkiBzYW1lIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZGF5LCB3aGljaCBpcyBhbHNvIHRoZSBkZWdyYWRlZCBtb2RlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCB1bnN0YWJsZSBtZXNzYWdlIElEcyDigJQgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGFib3ZlIG5ldmVyIG1hdGNoZXMgdGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrc3RvcERlbGF5U2Vjb25kcyA9IG93bmVyc2hpcEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyhzdGVwLCBkaXNwYXRjaE5vd01zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tzdG9wRGVsYXlTZWNvbmRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGVuZGluZyBzdGVwIGlzIGlubGluZS1vd25lZCBieSBhIGxpdmUgaW52b2NhdGlvbjsgZW5zdXJpbmcgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGluc3RlYWQgb2YgaW1tZWRpYXRlIHJlcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBzdGVwLm93bmVyTWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGlzcGF0Y2hlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXQgb2Ygc3RlcHMgVEhJUyBpbnZvY2F0aW9uIGV4ZWN1dGVzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIGxhenktaW5saW5lIGJhdGNoIHBsdXMgYW55IG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyAodGhpcyBtZXNzYWdlJ3MgcmVkZWxpdmVyeSByZS1leGVjdXRpbmcgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBpdCBjcmFzaGVkIG9uIOKAlCBubyBsYXp5U3RlcElucHV0OyB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGVzIGZyb20gdGhlIHN0ZXAgZW50aXR5IGxpa2UgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGgsIGFuZCB0aGUgcGF5bG9hZC1sZXNzIHN0ZXBfc3RhcnRlZCByZS1zdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCDigJQgdW5saWtlIHRoZSBiYWNrZ3JvdW5kIHBhdGgncyBzdGFydCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgTk9UIGJhcmU6IGl0IGNhcnJpZXMgdGhpcyBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyTWVzc2FnZUlkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSByZXRyeSBjZWlsaW5nIGNvdW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVFeGVjdXRpb25zOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dD86ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdWydkZWh5ZHJhdGVkSW5wdXQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vd25lZFJlY292ZXJ5U3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCB0ZWxlbWV0cnkgKGRlc2lnbiBkb2MgUGhhc2UgNyk6IHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgc28gcHJvZHVjdGlvbiB0cmFjZXMgc2hvdyB3aGVuIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeSByYW4gb3IgYSB3YWtlIHdhcyBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCwgYW5kIGEgd2FybiAoYWx3YXlzIHByaW50ZWQsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcvaW5mbykgZm9yIG93bmVkIHJlY292ZXJ5IOKAlCBpdCBtZWFucyBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UgZGllZCBtaWQtc3RlcC1ib2R5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd093bmVkUmVjb3ZlcnlTdGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYWNrc3RvcFdha2VzQXJtZWQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd0JhY2tzdG9wV2FrZXNBcm1lZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmUtZXhlY3V0aW5nIGlubGluZSBzdGVwcyBvd25lZCBieSB0aGlzIHF1ZXVlIG1lc3NhZ2Ug4oCUIGEgcHJldmlvdXMgZGVsaXZlcnkgY3Jhc2hlZCBtaWQtYm9keSBhbmQgdGhpcyByZWRlbGl2ZXJ5IGlzIHJlY292ZXJpbmcgdGhlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBvd25lZFJlY292ZXJ5U3RlcHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykgPT4gcy5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGFyZSBjb25zdWx0ZWQgYnkgYWxsIHRocmVlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzsgcmVzb2x2ZSB0aGUgbWVtb2l6ZWQgc2NhbiBvbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXRTdGF0ZSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwcmVJbmxpbmVXcml0ZUN1cnNvcmA7IGEgV29ybGQgbWF5IHJldHVybiBub25lIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdHMgKGBlcnIue3N0ZXAsd2FpdH1Db3VudGApLCB0aGF0IG9uZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbG9uZSBwZW5kaW5nIHN0ZXAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgbG9uZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW4gd2FpdCBpbiB0aGUgY3VtdWxhdGl2ZSBsb2c6IGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHdhaXRfY29tcGxldGVkYCBsYW5kaW5nIGFmdGVyIHRoZSBkZWx0YSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZG9lcyBub3QgYnVtcCB0aGUgb3V0c2lkZS1ldmVudCBtYXJrZXIsIHNvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZlbmNlcyBhIHJlcGxheSBmcm9tIHRoZSBzdGFsZSBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIG9wZW4gKG9yIHRoaXMtc3VzcGVuc2lvbi1jcmVhdGVkKSBob29rIOKAlCBVTkxFU1NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBwcmVjb25kaXRpb24gZ3VhcmQgaXMgZW5hYmxlZCBBTkQgdGhlIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWNsYXJlcyBpdCBhY3R1YWxseSBlbmZvcmNlcyB0aGUgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgY2FwYWJpbGl0aWVzLnByZWNvbmRpdGlvbkd1YXJkYDsgdGhlIGVudiBmbGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbG9uZSBvbmx5IG1ha2VzIHRoZSBydW50aW1lIFNFTkQgc25hcHNob3RzLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW4gdW5zdXBwb3J0aW5nIGJhY2tlbmQgaWdub3JlcyDigJQgbm8gZmVuY2UpLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbHRhIHNuYXBzaG90cyB0aGUgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uIHRoZSBuZXh0IHJlcGxheSwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIGluIHRoYXQgd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhYnNlbnQgZnJvbSB0aGUgZGVsdGEgYW5kIG9ic2VydmVkIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlcmF0aW9uIGxhdGVyIHRoYW4gYSByZWFsIGZldGNoIHdvdWxkIG9ic2VydmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LiBUaGF0IHN0YWxlbmVzcyBpcyBxdWFsaXRhdGl2ZWx5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFkLXRvLXdyaXRlIHJhY2UgdGhlIGZldGNoIHBhdGggYWxyZWFkeSBoYXMgKGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBldmVudCBjYW4gbGFuZCByaWdodCBhZnRlciBgZXZlbnRzLmxpc3RgIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCBiZWZvcmUgdGhlIHN1c3BlbnNpb24ncyB3cml0ZXMpOyB3aXRoIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBlbmZvcmNlZCBndWFyZCBpdCBpcyBhbHNvIGZlbmNlZDogYGhvb2tfcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBidW1wcyB0aGUgcGVyLXJ1biBvdXRzaWRlLWV2ZW50IG1hcmtlciwgc28gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGR1cmFibGUgd3JpdGUgdGhlIHN0YWxlIHJlcGxheSBhdHRlbXB0cyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVqZWN0ZWQgd2l0aCA0MTIg4oCUIGl0cyBndWFyZGVkIHN1c3BlbnNpb24gY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKHJldHJpZWQgb3ZlciB0aGUgcmVsb2FkZWQgbG9nLCBvciBleGhhdXN0ZWQgaW50b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYSBxdWV1ZSByZS1pbnZvY2F0aW9uKSwgQU5EIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY2xhaW0gb2YgaXRzIG5leHQgaW5saW5lIHN0ZXAsIHdoaWNoIGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbmFwc2hvdCB0b28gKHRocmVhZGVkIGJlbG93IHZpYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0YXRlVXBkYXRlZEF0YDsgb24gcmVqZWN0aW9uIHRoZSBiYXRjaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWJhbmRvbmVkIGFuZCByZS1pbnZva2VkIGZvciBhIGZyZXNoIHJlcGxheSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhbGUgdmlldyBjYW4gbmV2ZXIgY29tbWl0IGEgc3RlcCkuIEhvb2tzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ5IFRISVMgc3VzcGVuc2lvbiBhcmUgaW5zaWRlIHRoZSBkZWx0YSAodGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBob29rX2NyZWF0ZWRgIGxhbmRzIGJlZm9yZSB0aGUgc3RlcC10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUpLCBzbyBvbmx5IHRoZWlyIGBob29rX3JlY2VpdmVkYCByZXNwb25zZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIGZlbmNlZCB3aW5kb3cuIFdpdGhvdXQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZm9yY2VkIGd1YXJkIHRoZXJlIGlzIG5vIGZlbmNlLCBzbyBrZWVwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc2VydmF0aXZlIGdhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXaXRoIG5vIGhvb2sgb3Igd2FpdCBvcGVuIGF0IGFsbCwgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHByZWNvbmRpdGlvbiBndWFyZCBpcyBhY3R1YWxseSBpbiBmb3JjZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgYnkgZW52IEFORCBlbmZvcmNlZCBieSB0aGUgV29ybGQuIFRoZSBlbnZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcgYWxvbmUgb25seSBtYWtlcyB0aGUgcnVudGltZSBzZW5kIHNuYXBzaG90cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFuIHVuc3VwcG9ydGluZyBiYWNrZW5kIGlnbm9yZXMgKG5vIGZlbmNlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRW5mb3JjZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8ucHJlY29uZGl0aW9uR3VhcmQgPT09IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcmVJbmxpbmVXcml0ZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VhcmRFbmZvcmNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2spKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCkg4oCUIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZS4gV2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGd1YXJkIGluIGZvcmNlLCB0aGUgZmVuY2UgcmVqZWN0cyBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSdzIGR1cmFibGUgd3JpdGVzIOKAlCBidXQgaXQgY2Fubm90IHVuLXJ1biBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJPRFkgdGhhdCBvcHRpbWlzdGljIHN0YXJ0IGJlZ2FuIGJlZm9yZSB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRsZWQuIFN1cHByZXNzIG9wdGltaXN0aWMgc3RhcnQgZm9yIHRoZXNlIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0YWtlIGF3YWl0LXRoZW4tcnVuKSBzbyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgdXNlciBjb2RlIGF0IGFsbDogdGhlIGZlbmNlIHRoZW4gY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIGVmZmVjdHMsIG5vdCBqdXN0IHRoZSBldmVudCBsb2cuIENvc3RzIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhIGhvb2sgaXMgb3Blbiwgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gZ3VhcmQtZW5mb3JjaW5nIGRlcGxveW1lbnRzLiBXaXRob3V0IHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyA0MTJzLCBzbyBzdXBwcmVzc2lvbiB3b3VsZCBidXkgbm90aGluZyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlLXZpZXcgZXhwb3N1cmUgdGhlcmUgaXMgdGhlIHByZS1leGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYy1zdGFydCBjb250cmFjdCAoaWRlbXBvdGVudCBzaWRlIGVmZmVjdHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZEVuZm9yY2VkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgYGNhY2hlZEV2ZW50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogYFdPUktGTE9XX1NFUVVFTlRJQUxfUkVQTEFZUz0xYCAocGVyLXJ1biBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3BpY3MgY29uc3VtZWQgd2l0aCBgbWF4Q29uY3VycmVuY3k6IDFgKSB3b3VsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbmNpcGxlIHdhaXZlIHRoaXMgbGF0Y2gg4oCUIHNlcmlhbGl6ZWQgb3JjaGVzdHJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyByZXN0b3JlIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGVsaXZlcnkuIFRoZSB3YWl2ZXIgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuOiB0aGUgZW52IHZhciBpcyBhIHJ1bnRpbWUtcHJvY2VzcyBzZXR0aW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBwcm92ZSB0aGUgQlVJTFQgZmxvdyB0cmlnZ2VyIGFjdHVhbGx5IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhDb25jdXJyZW5jeTogMWAgKGl0IG11c3QgYmUgc2V0IGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbywgYW5kIHNvbWUgaW50ZWdyYXRpb25zIHdyaXRlIHRoZWlyIG93biB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcpLCBhbmQgYGNhcGFiaWxpdGllcy5tYXhDb25jdXJyZW5jeWAgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgcXVldWUgc3VwcG9ydCwgbm90IGRlcGxveWVkIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnRpbCB0aGUgYnVpbGQgZW1pdHMgYSB2ZXJpZmlhYmxlIHNpZ25hbCB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95ZWQgdHJpZ2dlciBpcyBzZXJpYWxpemVkLCB0aGUgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRjaCBzdGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCDigJQgc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQg4oCUIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGRlY2lkZSB3aGV0aGVyIHRoaXMgYmF0Y2gncyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMvU1RTTyBtZWFzdXJlbWVudC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoJ3MgZmlyc3Qgc3RlcCBjYXJyaWVzIHRoZSB0cmFja2luZyBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBiYXRjaCBlbWl0cyBvbmUgc2FtcGxlIHBlciBzY2hlZHVsaW5nIGdhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvbmUgcGVyIHNpYmxpbmcuIFR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYSBsb2NhbC1jbG9jayBjcmVhdGVkQXQsIHNvIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBvbmx5IHRoZSBydW4taWQgVUxJRCB0aW1lc3RhbXAgaXMgdHJ1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lUcmFja2luZyA9IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEF0TXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRDcmVhdGVkQXQocnVuSWQpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1cmJvID8gdW5kZWZpbmVkIDogK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbi1ndWFyZCBzbmFwc2hvdCBmb3IgdGhlIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGNsYWltczogdGhlIGxhenkgY2xhaW0gaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGggc3RlcCAoaXRzIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGEgc25hcHNob3QgaXQgd291bGQgYnlwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3VhcmQgZW50aXJlbHkgYW5kIGEgc3RhbGUgcmVwbGF5IGNvdWxkIGNsYWltIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbW1pdCDigJQgYSBzdGVwIHNjaGVkdWxlZCBvZmYgYSB2aWV3IHRoYXQgbWlzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBldmVudCBpdCBuZXZlciBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXNgIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBndWFyZCBlbnYgZmxhZyBpcyBvZmYsIHNvIHRoaXMgaXMgYSBuby1vcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSBndWFyZGVkIGRlcGxveW1lbnRzOyBXb3JsZHMgdGhhdCBkb24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZSB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ2xhaW1TbmFwc2hvdCA9IHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwRXhlY3V0aW9uUHJvbWlzZXMgPSBpbmxpbmVFeGVjdXRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHN0ZXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyDigJQgb3Igbm9uZSDigJQgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxIOKAlCBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvd25lZEJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIG9uIHRoZSBmbHkuIEFic2VudCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcHMsIHdob3NlIGlucHV0IGh5ZHJhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4aXN0aW5nIHN0ZXAgZW50aXR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBvd25lcnNoaXA6IHN0YW1wIChvciByZS1zdGFtcCkgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgcXVldWUgbWVzc2FnZSBJRCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkLCBzbyB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluIGZsaWdodCBoZXJlIGFuZCBzdXBwcmVzcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHJlcXVldWUgKHdvcmtmbG93IzI3ODApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSkuIEJvdGggYXJlIHVuZGVmaW5lZC9mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB3aXRoIGFuIG9wZW4gaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGUgY2xhaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGJvZHksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyIGV4ZWN1dGVzIHVzZXIgY29kZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0IGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc09wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25TbmFwc2hvdDogaW5saW5lQ2xhaW1TbmFwc2hvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBwcmVJbmxpbmVXcml0ZUN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YXJpYW50IGJvb2trZWVwaW5nOiB0aGlzIGludm9jYXRpb24gb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJvZGllcyB1bnRpbCB0aGV5IHNldHRsZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmFkZChzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgc3RlcHMgYXJlIGJyYW5kLW5ldyAodGhlaXIgY3JlYXRlLWNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSwgYnV0IGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3Mg4oCUIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gb2YgYW4gaW5saW5lIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbTogdGhlIGxvYWRlZCB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGlzIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjbGFpbSB3YXMgZmVuY2VkIGJ5IHRoZSBndWFyZCBhbmQgbm8gc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgd2VyZSB3cml0dGVuLiBBYmFuZG9uIHRoZSBiYXRjaCDigJQgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGJ5IGV4ZWN1dGVTdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25jaWxpYXRpb24g4oCUIGFuZCByZXN0YXJ0IHRoZSByZXBsYXkgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIG1pc3NpbmcgZXZlbnQuIFdhaXQgZm9yIHRoZSBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbnMgdG8gc2V0dGxlIGZpcnN0IHNvIG5vIG93bmVkIGJvZHkgaXMgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IHdoZW4gdGhlIHJlc3RhcnQgKG9yIHRoZSBhY2sgcGF0aCkgcnVucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHN0ZXBFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaWJsaW5nIHdob3NlIGNsYWltIHdhcyBhY2NlcHRlZCB3cm90ZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIG9mIGl0cyBvd24sIHBvc3NpYmx5IGFmdGVyIHRoZSBXb3JsZCBidWlsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgNDEyJ3MgZGVsdGEg4oCUIHNvIHRoYXQgZGVsdGEgY2FuIG5vIGxvbmdlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZWQgdG8gY29tcGxldGUgdGhlIGxvZywgYW5kIHRoZSByZXN0YXJ0IGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbG9hZCBpdCBpbiBmdWxsLiBgc2tpcHBlZGAgKHRoZSBzdGVwIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGVkKSwgYGdvbmVgIGFuZCBgdGhyb3R0bGVkYCAoY2xhaW0gcmVqZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5nV3JvdGUgPSBzZXR0bGVkLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ3JldHJ5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ2lubGluZS1jbGFpbScsIHN0ZXBFcnIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YTogIXNpYmxpbmdXcm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoaXMgcmV0dXJuIChvciB0aHJvdykgY29tcGxldGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5saW5lLWNsYWltJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBpbmxpbmVFeGVjdXRpb25zKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVFeGVjdXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzdGVwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGlubGluZUV4ZWN1dGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbklkIHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCBhbHNvIHVzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZGApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHBlbmRpbmcgYmFja2dyb3VuZCBvcGVyYXRpb25zIGZsdXNoIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHJlYWRzIHRoZWlyIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaW5nbGUgaW5saW5lIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIGRlbHRhIChzdXBwb3J0aW5nIFdvcmxkICsgdGhlIHNpbmdsZS1zdGVwIGdhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKSwgc3Rhc2ggaXQgc28gdGhlIG5leHQgaXRlcmF0aW9uJ3MgbG9hZCBjb25zdW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGxldGVkIHBhdGggY2FycmllcyBhIGRlbHRhOyBtdWx0aS1zdGVwIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlcXVlc3Qgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LmlubGluZURlbHRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IG9ubHkuaW5saW5lRGVsdGEuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBvbmx5LmlubGluZURlbHRhLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBvZiBhIGd1YXJkZWQgd3JpdGUgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYnkgdGhlIHJlcGxheSBsb29wIOKAlCB0aGUgcmVzdWx0LWJlYXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fY29tcGxldGVkYCwgb3IgdGhlIGB3YWl0X2NvbXBsZXRlZGAgb2YgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuIEJvdGggcmVhY2ggdGhpcyBvbmUgY2F0Y2ggYW5kIHRoZSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHNheSB3aGljaCwgaGVuY2UgdGhlIG5ldXRyYWwgbGFiZWwuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG1heSBiZSByZS1wb3N0ZWQgaW4gcGxhY2U6IHRoZSBjb3JyZWxhdGlvbiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIChmb3IgcnVuX2NvbXBsZXRlZCkgdGhlIHJlc3VsdCBpdHNlbGYgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcGxheSwgYW5kIGEgY29ycmVjdGVkIGxvZyBtYXkgcHJvZHVjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9uZXMuIERvbid0IGZhaWwgdGhlIHJ1biDigJQgcmVzdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBpbiB0aGlzIGludm9jYXRpb24sIGFuZCBvbmx5IG9uY2UgdGhhdCBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNwZW50IHNjaGVkdWxlIGFuIGV4cGxpY2l0IHJlLWludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRocm93aW5nIGluc3RlYWQgd291bGQgcmVseSBvbiByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBtZXNzYWdlLCB3aGljaCB0aGUgdHVyYm8gcGF0aCBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQg4oCUIGVtcGlyaWNhbGx5IHRoZSBydW4gdGhlbiBzdGFsbHMgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUncyB+MzAwcyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdyZXBsYXktd3JpdGUnLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9IGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGF5LXdyaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50LiBGYWxsIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cgaW5zdGVhZCBvZiByZXRocm93aW5nOiB0aGlzIGNhdGNoIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyB0aGUgcnVuLCBhbmQgYSByZXRocm93IHdvdWxkIGVzY2FwZSB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBhbmQgYmUgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpIOKAlCBhbiBleGhhdXN0ZWQgUmV0cnlBZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWQgNDI5LzUwMyBzdG9ybSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TIGZhaWx1cmUsIG9yIGEgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IOKAlCBtdXN0IE5PVCBmYWlsIHRoZSBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBiYWNrZW5kIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlQ291bnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlEaXZlcmdlbmNlPy5jb3VudCA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlY292ZXJ5UmVwbGF5cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2ZXJnZW5jZUNvdW50IDw9IG1heFJlY292ZXJ5UmVwbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgPSBkaXZlcmdlbmNlQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke21heFJlY292ZXJ5UmVwbGF5c30gcmVjb3ZlcnkgcmVwbGF5czsgbGF0ZXN0IGRpdmVyZ2VudCBldmVudCB3YXMgJHtlcnIuZXZlbnRJZH0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheVN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBzb3VyY2UtbWFwLXJlbWFwcGVkIHN0YWNrIHRvIHRoZSB0aHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXJyb3IgcHJlc2VydmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGBlcnIgaW5zdGFuY2VvZiBFcnJvcmAgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHJ1bnMgaW4gYSBzZXBhcmF0ZSBWTSByZWFsbSDigJQgaXRzIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBob3N0J3MsIHNvIGBpbnN0YW5jZW9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcmAgaXMgYGZhbHNlYCBmb3IgVk0tdGhyb3duIGVycm9ycy4gVGhlIFY4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRhZyB3b3JrcyBhY3Jvc3MgcmVhbG1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IodGVybWluYWxFcnJvcikgJiYgZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGVybWluYWxFcnJvciBhcyBFcnJvcikuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdyBydW4gdmlhIGV2ZW50IChldmVudC1zb3VyY2VkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uLWd1YXJkIGFzeW1tZXRyeTogdW5saWtlIGBydW5fY29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVybWluYWwgYHJ1bl9mYWlsZWRgIHNlbmRzIG5vIGBzdGF0ZVVwZGF0ZWRBdGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90LCBzbyBpdCBpcyBuZXZlciA0MTItcmVqZWN0ZWQgZXZlbiBpZiBhIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmRlZCBtaWQtcmVwbGF5IGFuZCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIHBhdGggdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXcuIFRoaXMgaXMgaW50ZW50aW9uYWwgYW5kIGZhaWwtb3BlbjogYSBzcHVyaW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBpcyByZWNvdmVyYWJsZSAodGhlIHJ1biBjYW4gYmUgcmUtcnVuIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXNoYm9hcmQpLCB3aGVyZWFzIGEgc3B1cmlvdXMgKmNvbXBsZXRpb24qIGNvbW1pdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvbmcgcmVzdWx0LiBHdWFyZGluZyB0aGlzIHdyaXRlIHN5bW1ldHJpY2FsbHkgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gbmVlZCB0aGUgbG9hZGVkIGV2ZW50IGxvZywgd2hpY2ggaXMgc2NvcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGB0cnlgIGFib3ZlIGFuZCBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2F0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5GYWFzSW5zdGFuY2UoQ09NUFVURV9JTlNUQU5DRV9JRCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkKGhhbmRsZXJDYWNoZWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSW52b2NhdGlvbkNvdW50KGludm9jYXRpb25Db3VudCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVFbnRyeXBvaW50QWdlTXMoXG4gICAgICAgICAgICBEYXRlLm5vdygpIC0gZW50cnlwb2ludENyZWF0ZWRBdFxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uKHJvdXRlTW9kdWxlQm9keUluaXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IEF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyhyb3V0ZU1vZHVsZUJvZHlJbml0TXMpKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJlcXVlc3RNZXRob2QocmVxLm1ldGhvZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSb3V0ZSgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICBpZiAoIWNhY2hlZEhhbmRsZXIpIHtcbiAgICAgICAgICBjYWNoZWRIYW5kbGVyID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmluaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZEhhbmRsZXJzKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcih3b3JsZEhhbmRsZXJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkSGFuZGxlcihyZXEpO1xuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICBBdHRyaWJ1dGUuSHR0cFJlc3BvbnNlU3RhdHVzQ29kZShyZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
|