@workflow/world-local 5.0.0-beta.14 → 5.0.0-beta.16
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/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -6
- package/dist/queue.d.ts +2 -2
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +33 -11
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +523 -47
- package/dist/storage/helpers.d.ts +13 -0
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +23 -1
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +9 -3
- package/dist/test-helpers.d.ts +1 -0
- package/dist/test-helpers.d.ts.map +1 -1
- package/dist/test-helpers.js +1 -1
- package/package.json +2 -2
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { EntityConflictError, HookNotFoundError, RunExpiredError, RunNotSupportedError, TooEarlyError, WorkflowRunNotFoundError, WorkflowWorldError, } from '@workflow/errors';
|
|
4
|
-
import { EventSchema, HookSchema, isLegacySpecVersion, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
|
|
4
|
+
import { applyAttributeChanges, EventSchema, HookSchema, isLegacySpecVersion, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, ulidToDate, validateAttributeChanges, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
|
|
7
7
|
import { assertSafeEntityId, deleteJSON, jsonReplacer, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, resolveWithinBase, taggedPath, writeExclusive, writeJSON, } from '../fs.js';
|
|
8
8
|
import { stripEventDataRefs } from './filters.js';
|
|
9
|
-
import { getObjectCreatedAt, hashToken, monotonicUlid } from './helpers.js';
|
|
9
|
+
import { getObjectCreatedAt, hashToken, hookRecoveryMarkerPath, monotonicUlid, } from './helpers.js';
|
|
10
10
|
import { deleteAllHooksForRun } from './hooks-storage.js';
|
|
11
11
|
import { handleLegacyEvent } from './legacy.js';
|
|
12
12
|
import { withRunFileLock } from './runs-storage.js';
|
|
@@ -22,9 +22,54 @@ import { withRunFileLock } from './runs-storage.js';
|
|
|
22
22
|
* (retries legitimately re-start a step), only writes to an already-terminal
|
|
23
23
|
* step are rejected.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
// `stepLocks` and `hookLocks` are now instantiated per
|
|
26
|
+
// `createEventsStorage` call (see inside the function) rather than
|
|
27
|
+
// being module-level. The on-disk constraint / claim files remain
|
|
28
|
+
// the durable source of truth across processes; the in-process
|
|
29
|
+
// mutex is a per-instance optimization that closes a short race
|
|
30
|
+
// window in the dedup-recovery path. Per-instance scoping lets
|
|
31
|
+
// tests simulate cross-process behavior with two storage instances
|
|
32
|
+
// sharing one data directory (each instance has independent locks
|
|
33
|
+
// but a shared filesystem), exactly matching the cross-process
|
|
34
|
+
// semantics without spawning subprocesses.
|
|
26
35
|
const HookTokenClaimSchema = z.object({
|
|
36
|
+
// The token-claim writer below has always persisted `hookId`, but
|
|
37
|
+
// this read schema previously omitted it, which is the bug fixed
|
|
38
|
+
// by https://github.com/vercel/workflow/issues/2283. `optional()`
|
|
39
|
+
// is defensive: any claim file that somehow lacks the field still
|
|
40
|
+
// parses (yielding `undefined`) and falls through to the cross-
|
|
41
|
+
// hook conflict branch, matching pre-fix behavior.
|
|
42
|
+
hookId: z.string().optional(),
|
|
27
43
|
runId: z.string(),
|
|
44
|
+
// `eventId` is the canonical hook_created event ID the claiming
|
|
45
|
+
// worker committed to publishing. Persisting it here turns the
|
|
46
|
+
// claim file into a durable convergence key for cross-worker /
|
|
47
|
+
// cross-process retries (see comment on the hook_created branch).
|
|
48
|
+
// `optional()` for backward compatibility: a legacy claim file
|
|
49
|
+
// written before this field existed falls through to the recovery-
|
|
50
|
+
// marker upgrade path, which atomically pins a canonical eventId
|
|
51
|
+
// via a sidecar marker (also a `writeExclusive`).
|
|
52
|
+
eventId: z.string().optional(),
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Sidecar recovery marker that pins a canonical `hook_created`
|
|
56
|
+
* eventId for a legacy token claim — one written by a version of
|
|
57
|
+
* this storage that did not yet persist `eventId` inline in the
|
|
58
|
+
* claim file. Without this marker, two cross-process retries
|
|
59
|
+
* reading a legacy claim each generate their own eventId, land
|
|
60
|
+
* their `writeExclusive(eventPath)` calls at different paths, and
|
|
61
|
+
* append two `hook_created` events for the same `(runId, hookId)`.
|
|
62
|
+
*
|
|
63
|
+
* The marker is written via `writeExclusive` — the first retry to
|
|
64
|
+
* land it pins its candidate eventId as canonical, and every
|
|
65
|
+
* subsequent retry reads and adopts that eventId before the common
|
|
66
|
+
* event publish. Schema is just `{ eventId }` because identity is
|
|
67
|
+
* already encoded in the marker's filename hash, so different token
|
|
68
|
+
* lifetimes can never share one marker (see
|
|
69
|
+
* `hookRecoveryMarkerPath`).
|
|
70
|
+
*/
|
|
71
|
+
const HookRecoveryMarkerSchema = z.object({
|
|
72
|
+
eventId: z.string(),
|
|
28
73
|
});
|
|
29
74
|
async function readHookTokenClaim(constraintPath) {
|
|
30
75
|
try {
|
|
@@ -37,8 +82,138 @@ async function readHookTokenClaim(constraintPath) {
|
|
|
37
82
|
throw error;
|
|
38
83
|
}
|
|
39
84
|
}
|
|
40
|
-
function
|
|
41
|
-
|
|
85
|
+
async function readHookRecoveryMarker(markerPath) {
|
|
86
|
+
try {
|
|
87
|
+
return await readJSON(markerPath, HookRecoveryMarkerSchema);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error instanceof SyntaxError || error instanceof z.ZodError) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Probe the run's event log for an existing `hook_created` event
|
|
98
|
+
* with the given correlationId. Used by the legacy-claim recovery
|
|
99
|
+
* path to detect "already published by a pre-upgrade write" before
|
|
100
|
+
* pinning a canonical eventId — without this check, a post-upgrade
|
|
101
|
+
* retry encountering a legacy claim whose `hook_created` was
|
|
102
|
+
* already written (with the pre-upgrade writer's own eventId) would
|
|
103
|
+
* pin a *different* eventId via the marker and publish a duplicate
|
|
104
|
+
* event at the marker's path.
|
|
105
|
+
*
|
|
106
|
+
* The inline-`eventId` fast path does NOT need this probe: the
|
|
107
|
+
* canonical eventId is durable in the claim file, so the existing
|
|
108
|
+
* publish (`writeExclusive(eventPath)`) will fail iff the event
|
|
109
|
+
* already exists at that exact path — which is the correct
|
|
110
|
+
* "already-published" semantic.
|
|
111
|
+
*/
|
|
112
|
+
async function findExistingHookCreatedEventId(basedir, runId, correlationId) {
|
|
113
|
+
const result = await paginatedFileSystemQuery({
|
|
114
|
+
directory: path.join(basedir, 'events'),
|
|
115
|
+
schema: EventSchema,
|
|
116
|
+
filePrefix: `${runId}-`,
|
|
117
|
+
filter: (event) => event.eventType === 'hook_created' &&
|
|
118
|
+
event.correlationId === correlationId,
|
|
119
|
+
limit: 1,
|
|
120
|
+
getCreatedAt: getObjectCreatedAt('evnt'),
|
|
121
|
+
getId: (event) => event.eventId,
|
|
122
|
+
});
|
|
123
|
+
return result.data[0]?.eventId ?? null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Repair an "event-first orphan": the hook entity write is deferred
|
|
127
|
+
* until after the `hook_created` event publish commits (so a failed
|
|
128
|
+
* publish cannot mutate already-committed state — see the comment on
|
|
129
|
+
* the deferred write), which opens the inverse crash window — a
|
|
130
|
+
* crash AFTER the event publish but BEFORE the deferred entity write
|
|
131
|
+
* leaves the event in the log with the hook entity missing. A retry
|
|
132
|
+
* then collides at the event publish and throws
|
|
133
|
+
* `EntityConflictError` (correct — the event IS committed), but
|
|
134
|
+
* without this repair the entity would stay missing forever and the
|
|
135
|
+
* hook would be unresolvable.
|
|
136
|
+
*
|
|
137
|
+
* The entity MUST be reconstructed from the persisted canonical
|
|
138
|
+
* event's payload — NOT the retry's `eventData` — otherwise a retry
|
|
139
|
+
* carrying different `metadata` / `isWebhook` would silently change
|
|
140
|
+
* committed state. The write uses `writeExclusive` (create-if-absent)
|
|
141
|
+
* so a concurrent writer racing this repair cannot be overwritten;
|
|
142
|
+
* whichever write lands first, the content is identical because both
|
|
143
|
+
* derive from the same persisted event.
|
|
144
|
+
*/
|
|
145
|
+
async function repairHookEntityFromPersistedEvent(basedir, runId, hookId, persistedEventId, tag) {
|
|
146
|
+
const compositeKey = `${runId}-${persistedEventId}`;
|
|
147
|
+
const persistedEvent = await readJSONWithFallback(basedir, 'events', compositeKey, EventSchema, tag);
|
|
148
|
+
if (!persistedEvent ||
|
|
149
|
+
persistedEvent.eventType !== 'hook_created' ||
|
|
150
|
+
persistedEvent.correlationId !== hookId) {
|
|
151
|
+
// Nothing trustworthy to repair from.
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const existingHook = await readJSONWithFallback(basedir, 'hooks', hookId, HookSchema, tag);
|
|
155
|
+
if (existingHook) {
|
|
156
|
+
// Entity already present — not an orphan, leave it untouched.
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const eventData = (persistedEvent.eventData ?? {});
|
|
160
|
+
if (typeof eventData.token !== 'string') {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const hook = {
|
|
164
|
+
runId,
|
|
165
|
+
hookId,
|
|
166
|
+
token: eventData.token,
|
|
167
|
+
metadata: eventData.metadata,
|
|
168
|
+
ownerId: 'local-owner',
|
|
169
|
+
projectId: 'local-project',
|
|
170
|
+
environment: 'local',
|
|
171
|
+
createdAt: persistedEvent.createdAt,
|
|
172
|
+
specVersion: persistedEvent.specVersion,
|
|
173
|
+
isWebhook: eventData.isWebhook ?? false,
|
|
174
|
+
isSystem: eventData.isSystem ?? false,
|
|
175
|
+
};
|
|
176
|
+
await writeExclusive(taggedPath(basedir, 'hooks', hookId, tag), JSON.stringify(hook, jsonReplacer, 2));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Atomically pin a canonical `hook_created` eventId for a legacy
|
|
180
|
+
* claim (one without an inline `eventId`). The first retry to
|
|
181
|
+
* `writeExclusive` the recovery marker wins; its `candidateEventId`
|
|
182
|
+
* becomes canonical. Subsequent retries read the marker and adopt
|
|
183
|
+
* its `eventId`. Together with the `writeExclusive(eventPath)` in
|
|
184
|
+
* the outer event publish, this gives the legacy-fallback path the
|
|
185
|
+
* same single-event convergence guarantee as the inline-`eventId`
|
|
186
|
+
* fast path.
|
|
187
|
+
*
|
|
188
|
+
* Returns the canonical eventId for the caller to adopt, or `null`
|
|
189
|
+
* if we lost the marker race AND the resulting marker file is
|
|
190
|
+
* unreadable (extremely rare; corrupted disk). Callers treat `null`
|
|
191
|
+
* as "give up, throw `EntityConflictError`" so the runtime's
|
|
192
|
+
* concurrent-replay catch path swallows this attempt and lets
|
|
193
|
+
* another one through.
|
|
194
|
+
*/
|
|
195
|
+
async function pinCanonicalEventIdForLegacyClaim(basedir, token, runId, hookId, candidateEventId) {
|
|
196
|
+
const markerPath = hookRecoveryMarkerPath(basedir, token, runId, hookId);
|
|
197
|
+
const markerContent = JSON.stringify({ eventId: candidateEventId });
|
|
198
|
+
const won = await writeExclusive(markerPath, markerContent);
|
|
199
|
+
if (won) {
|
|
200
|
+
return candidateEventId;
|
|
201
|
+
}
|
|
202
|
+
const existing = await readHookRecoveryMarker(markerPath);
|
|
203
|
+
return existing?.eventId ?? null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* In-process per-key async mutex backed by a caller-supplied `Map`.
|
|
207
|
+
* Used by `createEventsStorage` to serialize same-key event writes
|
|
208
|
+
* (`step_*` for the same step, `hook_created` for the same hook).
|
|
209
|
+
* The map is instantiated per-storage-instance — different
|
|
210
|
+
* instances do NOT share locks, so two instances sharing one data
|
|
211
|
+
* directory behave exactly like two separate OS processes from the
|
|
212
|
+
* locking standpoint. Cross-instance / cross-process arbitration
|
|
213
|
+
* relies on the on-disk constraint / claim files instead.
|
|
214
|
+
*/
|
|
215
|
+
function withInProcessLock(locks, key, fn) {
|
|
216
|
+
const prev = locks.get(key);
|
|
42
217
|
const taskBox = {};
|
|
43
218
|
const task = (async () => {
|
|
44
219
|
if (prev) {
|
|
@@ -49,13 +224,13 @@ function withStepLock(key, fn) {
|
|
|
49
224
|
return await fn();
|
|
50
225
|
}
|
|
51
226
|
finally {
|
|
52
|
-
if (
|
|
53
|
-
|
|
227
|
+
if (locks.get(key) === taskBox.task) {
|
|
228
|
+
locks.delete(key);
|
|
54
229
|
}
|
|
55
230
|
}
|
|
56
231
|
})();
|
|
57
232
|
taskBox.task = task;
|
|
58
|
-
|
|
233
|
+
locks.set(key, task);
|
|
59
234
|
return task;
|
|
60
235
|
}
|
|
61
236
|
/**
|
|
@@ -106,6 +281,24 @@ async function writeRunUnderLifecycleLock(basedir, runId, tag, proposed) {
|
|
|
106
281
|
* Implements the Storage['events'] interface with create, list, and listByCorrelationId operations.
|
|
107
282
|
*/
|
|
108
283
|
export function createEventsStorage(basedir, tag) {
|
|
284
|
+
// Per-instance in-process mutexes. Two storage instances sharing
|
|
285
|
+
// one data directory get independent lock maps, which makes them
|
|
286
|
+
// behave like two separate OS processes from the locking
|
|
287
|
+
// standpoint — cross-instance arbitration relies on the on-disk
|
|
288
|
+
// `writeExclusive` constraint / claim files instead. Tests use
|
|
289
|
+
// this to exercise cross-process convergence without spawning
|
|
290
|
+
// subprocesses.
|
|
291
|
+
//
|
|
292
|
+
// `stepLocks` serializes step lifecycle events for the same
|
|
293
|
+
// (runId, correlationId): see comment further down in the
|
|
294
|
+
// `isStepEvent` branch.
|
|
295
|
+
//
|
|
296
|
+
// `hookLocks` serializes `hook_created` calls for the same
|
|
297
|
+
// (runId, correlationId) so the "claim token, then write hook
|
|
298
|
+
// entity + event" sequence runs to completion before another
|
|
299
|
+
// in-process invocation enters the dedup branch.
|
|
300
|
+
const stepLocks = new Map();
|
|
301
|
+
const hookLocks = new Map();
|
|
109
302
|
return {
|
|
110
303
|
async create(runId, data, params) {
|
|
111
304
|
// Validate request-supplied IDs before they're concatenated into
|
|
@@ -139,11 +332,31 @@ export function createEventsStorage(basedir, tag) {
|
|
|
139
332
|
const lockKey = tag
|
|
140
333
|
? `${runId}-${data.correlationId}.${tag}`
|
|
141
334
|
: `${runId}-${data.correlationId}`;
|
|
142
|
-
return
|
|
335
|
+
return withInProcessLock(stepLocks, lockKey, () => createImpl());
|
|
336
|
+
}
|
|
337
|
+
// `hook_created` is serialized per-(runId, hookId) so the
|
|
338
|
+
// "claim token, write hook entity, write event" sequence runs to
|
|
339
|
+
// completion before another in-process invocation enters the
|
|
340
|
+
// same-hook dedup branch. Without this, two same-tick concurrent
|
|
341
|
+
// callers can race between the winner's `writeExclusive(claim)`
|
|
342
|
+
// and `writeJSON(hook)`, making the second caller momentarily
|
|
343
|
+
// observe a claim with no matching hook entity — which the
|
|
344
|
+
// crash-recovery path below would misinterpret as a prior crash
|
|
345
|
+
// and incorrectly fall through to a second hook entity write.
|
|
346
|
+
if (data.eventType === 'hook_created' && runId && data.correlationId) {
|
|
347
|
+
const lockKey = tag
|
|
348
|
+
? `${runId}-${data.correlationId}.hook.${tag}`
|
|
349
|
+
: `${runId}-${data.correlationId}.hook`;
|
|
350
|
+
return withInProcessLock(hookLocks, lockKey, () => createImpl());
|
|
143
351
|
}
|
|
144
352
|
return createImpl();
|
|
145
353
|
async function createImpl() {
|
|
146
|
-
|
|
354
|
+
// Most paths use the freshly-generated candidate eventId. The
|
|
355
|
+
// hook_created dedup-recovery path below may reassign it to
|
|
356
|
+
// the canonical eventId persisted in the durable token claim
|
|
357
|
+
// so concurrent / cross-process workers converge on a single
|
|
358
|
+
// event in the log.
|
|
359
|
+
let eventId = `evnt_${monotonicUlid()}`;
|
|
147
360
|
const now = new Date();
|
|
148
361
|
// For run_created events, use client-provided runId or generate one server-side
|
|
149
362
|
let effectiveRunId;
|
|
@@ -189,6 +402,9 @@ export function createEventsStorage(basedir, tag) {
|
|
|
189
402
|
if (runInputData.deploymentId &&
|
|
190
403
|
runInputData.workflowName &&
|
|
191
404
|
runInputData.input !== undefined) {
|
|
405
|
+
validateAttributeChanges(Object.entries(runInputData.attributes ?? {}).map(([key, value]) => ({ key, value })), {
|
|
406
|
+
allowReservedAttributes: runInputData.allowReservedAttributes === true,
|
|
407
|
+
});
|
|
192
408
|
// Atomically try to publish the run entity so only the first
|
|
193
409
|
// writer wins, preventing a TOCTOU race where a concurrent
|
|
194
410
|
// run_created from start() could overwrite a run that was
|
|
@@ -205,7 +421,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
205
421
|
error: undefined,
|
|
206
422
|
startedAt: undefined,
|
|
207
423
|
completedAt: undefined,
|
|
208
|
-
attributes: {},
|
|
424
|
+
attributes: runInputData.attributes ?? {},
|
|
209
425
|
createdAt: now,
|
|
210
426
|
updatedAt: now,
|
|
211
427
|
};
|
|
@@ -225,6 +441,8 @@ export function createEventsStorage(basedir, tag) {
|
|
|
225
441
|
workflowName: runInputData.workflowName,
|
|
226
442
|
input: runInputData.input,
|
|
227
443
|
executionContext: runInputData.executionContext,
|
|
444
|
+
attributes: runInputData.attributes,
|
|
445
|
+
allowReservedAttributes: runInputData.allowReservedAttributes,
|
|
228
446
|
},
|
|
229
447
|
};
|
|
230
448
|
const createdCompositeKey = `${effectiveRunId}-${runCreatedEventId}`;
|
|
@@ -246,6 +464,9 @@ export function createEventsStorage(basedir, tag) {
|
|
|
246
464
|
if (data.eventType === 'run_failed' && !currentRun) {
|
|
247
465
|
throw new WorkflowRunNotFoundError(effectiveRunId);
|
|
248
466
|
}
|
|
467
|
+
if (data.eventType === 'attr_set' && !currentRun) {
|
|
468
|
+
throw new WorkflowRunNotFoundError(effectiveRunId);
|
|
469
|
+
}
|
|
249
470
|
// ============================================================
|
|
250
471
|
// VERSION COMPATIBILITY: Check run spec version
|
|
251
472
|
// ============================================================
|
|
@@ -306,6 +527,9 @@ export function createEventsStorage(basedir, tag) {
|
|
|
306
527
|
data.eventType === 'wait_created') {
|
|
307
528
|
throw new EntityConflictError(`Cannot create new entities on run in terminal state "${currentRun.status}"`);
|
|
308
529
|
}
|
|
530
|
+
if (data.eventType === 'attr_set') {
|
|
531
|
+
throw new EntityConflictError(`Cannot set attributes on run in terminal state "${currentRun.status}"`);
|
|
532
|
+
}
|
|
309
533
|
}
|
|
310
534
|
// Step-related event validation (ordering and terminal state)
|
|
311
535
|
// Store existingStep so we can reuse it later (avoid double read)
|
|
@@ -343,7 +567,12 @@ export function createEventsStorage(basedir, tag) {
|
|
|
343
567
|
throw new HookNotFoundError(data.correlationId);
|
|
344
568
|
}
|
|
345
569
|
}
|
|
346
|
-
|
|
570
|
+
// `event` may be reassigned later in the `hook_created`
|
|
571
|
+
// dedup-recovery branch to swap in a canonical eventId /
|
|
572
|
+
// createdAt persisted in the durable token claim so
|
|
573
|
+
// concurrent / cross-process workers converge on a single
|
|
574
|
+
// event in the log.
|
|
575
|
+
let event = {
|
|
347
576
|
...data,
|
|
348
577
|
runId: effectiveRunId,
|
|
349
578
|
eventId,
|
|
@@ -359,10 +588,25 @@ export function createEventsStorage(basedir, tag) {
|
|
|
359
588
|
let step;
|
|
360
589
|
let hook;
|
|
361
590
|
let wait;
|
|
591
|
+
// For `hook_created`, the hook entity write is deferred until
|
|
592
|
+
// AFTER the outer event publish succeeds, so a retry that
|
|
593
|
+
// collides with an already-published `hook_created` does not
|
|
594
|
+
// mutate the durable hook entity with the retry's payload.
|
|
595
|
+
// `hookEntityWriteOptions` carries the `{ overwrite }` mode
|
|
596
|
+
// chosen by the dedup-recovery branch above (undefined for
|
|
597
|
+
// first writers, `{ overwrite: true }` for retries that may
|
|
598
|
+
// be repairing an orphaned partial write).
|
|
599
|
+
let hookEntityWriteOptions;
|
|
362
600
|
// Create/update entity based on event type (event-sourced architecture)
|
|
363
601
|
// Run lifecycle events
|
|
364
602
|
if (data.eventType === 'run_created' && 'eventData' in data) {
|
|
365
603
|
const runData = data.eventData;
|
|
604
|
+
validateAttributeChanges(Object.entries(runData.attributes ?? {}).map(([key, value]) => ({
|
|
605
|
+
key,
|
|
606
|
+
value,
|
|
607
|
+
})), {
|
|
608
|
+
allowReservedAttributes: runData.allowReservedAttributes === true,
|
|
609
|
+
});
|
|
366
610
|
run = {
|
|
367
611
|
runId: effectiveRunId,
|
|
368
612
|
deploymentId: runData.deploymentId,
|
|
@@ -376,7 +620,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
376
620
|
error: undefined,
|
|
377
621
|
startedAt: undefined,
|
|
378
622
|
completedAt: undefined,
|
|
379
|
-
attributes: {},
|
|
623
|
+
attributes: runData.attributes ?? {},
|
|
380
624
|
createdAt: now,
|
|
381
625
|
updatedAt: now,
|
|
382
626
|
};
|
|
@@ -504,6 +748,42 @@ export function createEventsStorage(basedir, tag) {
|
|
|
504
748
|
]);
|
|
505
749
|
}
|
|
506
750
|
}
|
|
751
|
+
else if (data.eventType === 'attr_set' && currentRun) {
|
|
752
|
+
run = await withRunFileLock(effectiveRunId, async () => {
|
|
753
|
+
const fresh = await readJSON(taggedPath(basedir, 'runs', effectiveRunId, tag), WorkflowRunSchema);
|
|
754
|
+
if (!fresh) {
|
|
755
|
+
throw new WorkflowRunNotFoundError(effectiveRunId);
|
|
756
|
+
}
|
|
757
|
+
validateAttributeChanges(data.eventData.changes, {
|
|
758
|
+
existingKeys: Object.keys(fresh.attributes),
|
|
759
|
+
allowReservedAttributes: data.eventData.allowReservedAttributes === true,
|
|
760
|
+
});
|
|
761
|
+
// Claim the correlation dedup lock only after validation: a
|
|
762
|
+
// validation failure must leave the correlationId unclaimed so
|
|
763
|
+
// the runtime's retry of the same event is not misreported as
|
|
764
|
+
// "already exists" while the event was never written (the
|
|
765
|
+
// dispatcher would then wait forever for an event that is not
|
|
766
|
+
// in the log).
|
|
767
|
+
if (data.correlationId &&
|
|
768
|
+
data.eventData.writer.type === 'workflow') {
|
|
769
|
+
const attrLockName = tag
|
|
770
|
+
? `${effectiveRunId}-${data.correlationId}.created.${tag}`
|
|
771
|
+
: `${effectiveRunId}-${data.correlationId}.created`;
|
|
772
|
+
const attrLockPath = resolveWithinBase(basedir, '.locks', 'attributes', attrLockName);
|
|
773
|
+
const attrClaimed = await writeExclusive(attrLockPath, '');
|
|
774
|
+
if (!attrClaimed) {
|
|
775
|
+
throw new EntityConflictError(`Attribute event "${data.correlationId}" already exists`);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
const next = {
|
|
779
|
+
...fresh,
|
|
780
|
+
attributes: applyAttributeChanges(fresh.attributes, data.eventData.changes),
|
|
781
|
+
updatedAt: now,
|
|
782
|
+
};
|
|
783
|
+
await writeJSON(taggedPath(basedir, 'runs', effectiveRunId, tag), next, { overwrite: true });
|
|
784
|
+
return next;
|
|
785
|
+
});
|
|
786
|
+
}
|
|
507
787
|
else if (
|
|
508
788
|
// Step lifecycle events
|
|
509
789
|
data.eventType === 'step_created' &&
|
|
@@ -660,42 +940,185 @@ export function createEventsStorage(basedir, tag) {
|
|
|
660
940
|
// Atomically claim the token using an exclusive-create constraint file.
|
|
661
941
|
// This avoids the TOCTOU race of the previous read-all-then-check approach.
|
|
662
942
|
const constraintPath = path.join(basedir, 'hooks', 'tokens', `${hashToken(hookData.token)}.json`);
|
|
943
|
+
// Persist `eventId` in the claim so concurrent / cross-
|
|
944
|
+
// process retries can converge on a single canonical
|
|
945
|
+
// `hook_created` event path. See the recovery comment
|
|
946
|
+
// below.
|
|
663
947
|
const tokenClaimed = await writeExclusive(constraintPath, JSON.stringify({
|
|
664
948
|
token: hookData.token,
|
|
665
949
|
hookId: data.correlationId,
|
|
666
950
|
runId: effectiveRunId,
|
|
951
|
+
eventId,
|
|
667
952
|
}));
|
|
953
|
+
// Recovery shape: the durable record of a successful hook
|
|
954
|
+
// creation is the `hook_created` event in the event log. The
|
|
955
|
+
// claim file and hook entity are written before the event,
|
|
956
|
+
// and the three writes are NOT atomic, so a crash at any
|
|
957
|
+
// point can leave one or two of them on disk without the
|
|
958
|
+
// event. Treating those as "completed" would have the
|
|
959
|
+
// suspension handler swallow the retry and permanently lose
|
|
960
|
+
// the `hook_created` event from the log.
|
|
961
|
+
//
|
|
962
|
+
// When the dedup branch fires for the same `(runId, hookId)`,
|
|
963
|
+
// we converge on the canonical `eventId` persisted in the
|
|
964
|
+
// claim file by the original (winning) `writeExclusive`. By
|
|
965
|
+
// adopting that eventId for this retry's event write — and
|
|
966
|
+
// letting the outer no-overwrite `writeJSON` for the event
|
|
967
|
+
// throw `EntityConflictError` on collision — concurrent /
|
|
968
|
+
// cross-process workers either:
|
|
969
|
+
// - publish the same event at the same path exactly once
|
|
970
|
+
// (the loser's `writeJSON` throws EntityConflictError,
|
|
971
|
+
// which the runtime's existing concurrent-replay catch
|
|
972
|
+
// path at suspension-handler.ts:142 swallows), or
|
|
973
|
+
// - converge on a single recovery write when the prior
|
|
974
|
+
// claim was orphaned by a crash before the event landed.
|
|
975
|
+
//
|
|
976
|
+
// The legacy fallback (`existingClaim.eventId` undefined)
|
|
977
|
+
// is for claim files written before this field was added —
|
|
978
|
+
// those probe the event log directly and fall through to a
|
|
979
|
+
// fresh-eventId recovery write. The legacy path does not
|
|
980
|
+
// converge across workers but cannot regress behavior for
|
|
981
|
+
// freshly-written claims.
|
|
982
|
+
//
|
|
983
|
+
// The `withHookLock` in-process mutex above keeps two same-
|
|
984
|
+
// tick in-process callers from racing into this branch with
|
|
985
|
+
// the winner mid-write, but is not sufficient across
|
|
986
|
+
// processes — the durable convergence key (`claim.eventId`)
|
|
987
|
+
// is what closes the cross-process race.
|
|
988
|
+
let writeHookEntityWithOverwrite = false;
|
|
668
989
|
if (!tokenClaimed) {
|
|
669
990
|
const existingClaim = await readHookTokenClaim(constraintPath);
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
eventId
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
991
|
+
if (existingClaim?.runId === effectiveRunId &&
|
|
992
|
+
existingClaim.hookId === data.correlationId) {
|
|
993
|
+
// Adopt a canonical eventId for the recovery write. The
|
|
994
|
+
// outer event publish (`writeExclusive(eventPath)`)
|
|
995
|
+
// either succeeds (we publish the canonical event,
|
|
996
|
+
// repairing a partial write left by the original
|
|
997
|
+
// claimant) or returns `false` and we throw
|
|
998
|
+
// `EntityConflictError` (the event was already
|
|
999
|
+
// published — a real duplicate). Either way the log
|
|
1000
|
+
// ends with exactly one `hook_created` event for this
|
|
1001
|
+
// `(runId, hookId)`.
|
|
1002
|
+
//
|
|
1003
|
+
// The canonical eventId comes from one of two places:
|
|
1004
|
+
//
|
|
1005
|
+
// - `existingClaim.eventId` for claims written by
|
|
1006
|
+
// this version (the writer above persists the
|
|
1007
|
+
// candidate eventId atomically with the claim).
|
|
1008
|
+
// The eventId is durable, so the outer
|
|
1009
|
+
// `writeExclusive(eventPath)` alone is enough to
|
|
1010
|
+
// arbitrate publication: it fails iff the event
|
|
1011
|
+
// was already published at that exact path.
|
|
1012
|
+
//
|
|
1013
|
+
// - The recovery-marker sidecar for legacy claims
|
|
1014
|
+
// written before `eventId` was persisted inline
|
|
1015
|
+
// in the claim. The marker is itself a
|
|
1016
|
+
// `writeExclusive`, so the first retry pins its
|
|
1017
|
+
// candidate eventId as canonical and subsequent
|
|
1018
|
+
// retries adopt it. Without this, two processes
|
|
1019
|
+
// both reading the same legacy claim would each
|
|
1020
|
+
// generate their own eventId, land their
|
|
1021
|
+
// `writeExclusive(eventPath)` calls at different
|
|
1022
|
+
// paths, and append two events.
|
|
1023
|
+
//
|
|
1024
|
+
// For legacy claims we also must probe the event
|
|
1025
|
+
// log for an existing `hook_created` event BEFORE
|
|
1026
|
+
// pinning a canonical eventId: the pre-upgrade
|
|
1027
|
+
// writer may have already published the event
|
|
1028
|
+
// with its own eventId, and the marker has no way
|
|
1029
|
+
// of knowing that eventId after the fact. Without
|
|
1030
|
+
// this probe, a post-upgrade retry would pin a
|
|
1031
|
+
// different eventId, write a hook entity, and
|
|
1032
|
+
// publish a duplicate event at the marker's path.
|
|
1033
|
+
let canonicalEventId;
|
|
1034
|
+
if (existingClaim.eventId) {
|
|
1035
|
+
canonicalEventId = existingClaim.eventId;
|
|
1036
|
+
}
|
|
1037
|
+
else {
|
|
1038
|
+
const alreadyPublishedEventId = await findExistingHookCreatedEventId(basedir, effectiveRunId, data.correlationId);
|
|
1039
|
+
if (alreadyPublishedEventId !== null) {
|
|
1040
|
+
// The pre-upgrade writer may have crashed between
|
|
1041
|
+
// its event publish and its hook entity write —
|
|
1042
|
+
// repair the entity from the persisted event's
|
|
1043
|
+
// payload before surfacing the benign duplicate.
|
|
1044
|
+
await repairHookEntityFromPersistedEvent(basedir, effectiveRunId, data.correlationId, alreadyPublishedEventId, tag);
|
|
1045
|
+
throw new EntityConflictError(`Hook "${data.correlationId}" already created`);
|
|
1046
|
+
}
|
|
1047
|
+
const pinned = await pinCanonicalEventIdForLegacyClaim(basedir, hookData.token, effectiveRunId, data.correlationId, eventId);
|
|
1048
|
+
if (pinned === null) {
|
|
1049
|
+
// Lost the marker race and the marker file is
|
|
1050
|
+
// unreadable (extremely rare; corrupted disk).
|
|
1051
|
+
// Treat as a real duplicate so the runtime's
|
|
1052
|
+
// concurrent-replay catch path swallows this
|
|
1053
|
+
// attempt instead of risking divergent
|
|
1054
|
+
// publication.
|
|
1055
|
+
throw new EntityConflictError(`Hook "${data.correlationId}" already created`);
|
|
1056
|
+
}
|
|
1057
|
+
canonicalEventId = pinned;
|
|
1058
|
+
}
|
|
1059
|
+
// Rebuild `event` with the canonical eventId and a
|
|
1060
|
+
// deterministic `createdAt` derived from the eventId
|
|
1061
|
+
// (a ULID) so two workers writing the same event
|
|
1062
|
+
// produce byte-identical content.
|
|
1063
|
+
eventId = canonicalEventId;
|
|
1064
|
+
const canonicalCreatedAt = ulidToDate(eventId.replace(/^evnt_/, '')) ?? now;
|
|
1065
|
+
event = {
|
|
1066
|
+
...data,
|
|
1067
|
+
runId: effectiveRunId,
|
|
1068
|
+
eventId,
|
|
1069
|
+
createdAt: canonicalCreatedAt,
|
|
1070
|
+
specVersion: effectiveSpecVersion,
|
|
1071
|
+
};
|
|
1072
|
+
writeHookEntityWithOverwrite = true;
|
|
1073
|
+
}
|
|
1074
|
+
else {
|
|
1075
|
+
// Cross-hook / cross-run conflict: a different
|
|
1076
|
+
// (runId, hookId) holds this token. Create a
|
|
1077
|
+
// hook_conflict event so the workflow can fail
|
|
1078
|
+
// gracefully when the hook is awaited.
|
|
1079
|
+
const conflictEvent = {
|
|
1080
|
+
eventType: 'hook_conflict',
|
|
1081
|
+
correlationId: data.correlationId,
|
|
1082
|
+
eventData: {
|
|
1083
|
+
token: hookData.token,
|
|
1084
|
+
...(existingClaim
|
|
1085
|
+
? { conflictingRunId: existingClaim.runId }
|
|
1086
|
+
: {}),
|
|
1087
|
+
},
|
|
1088
|
+
runId: effectiveRunId,
|
|
1089
|
+
eventId,
|
|
1090
|
+
createdAt: now,
|
|
1091
|
+
specVersion: effectiveSpecVersion,
|
|
1092
|
+
};
|
|
1093
|
+
const compositeKey = `${effectiveRunId}-${eventId}`;
|
|
1094
|
+
await writeJSON(taggedPath(basedir, 'events', compositeKey, tag), conflictEvent);
|
|
1095
|
+
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
1096
|
+
const filteredEvent = stripEventDataRefs(conflictEvent, resolveData);
|
|
1097
|
+
// Return EventResult with conflict event (no hook entity created)
|
|
1098
|
+
return {
|
|
1099
|
+
event: filteredEvent,
|
|
1100
|
+
run,
|
|
1101
|
+
step,
|
|
1102
|
+
hook: undefined,
|
|
1103
|
+
};
|
|
1104
|
+
}
|
|
698
1105
|
}
|
|
1106
|
+
// Compute the hook entity now, but defer its write until
|
|
1107
|
+
// AFTER the outer event publish at the bottom of this
|
|
1108
|
+
// function commits. The retry path can reach this branch
|
|
1109
|
+
// for a hook whose `hook_created` event was already
|
|
1110
|
+
// published successfully (an "already-committed
|
|
1111
|
+
// duplicate"); in that case the outer `writeExclusive`
|
|
1112
|
+
// for the event will return false and we will throw
|
|
1113
|
+
// `EntityConflictError`. Writing the hook entity here
|
|
1114
|
+
// first would mutate already-committed durable state with
|
|
1115
|
+
// the retry's payload (e.g. different `metadata` or
|
|
1116
|
+
// `isWebhook`) before the event publish proved which
|
|
1117
|
+
// outcome we are in — leaving the entity and event log
|
|
1118
|
+
// inconsistent. By deferring, the entity is only written
|
|
1119
|
+
// when the publish actually succeeds (first writer or
|
|
1120
|
+
// orphan recovery). See pranaygp's review on PR #2295 for
|
|
1121
|
+
// the karthikscale3 repro.
|
|
699
1122
|
hook = {
|
|
700
1123
|
runId: effectiveRunId,
|
|
701
1124
|
hookId: data.correlationId,
|
|
@@ -704,13 +1127,18 @@ export function createEventsStorage(basedir, tag) {
|
|
|
704
1127
|
ownerId: 'local-owner',
|
|
705
1128
|
projectId: 'local-project',
|
|
706
1129
|
environment: 'local',
|
|
707
|
-
createdAt
|
|
1130
|
+
// Use the (possibly canonical) event's createdAt so two
|
|
1131
|
+
// workers writing the same hook entity produce byte-
|
|
1132
|
+
// identical content during convergence.
|
|
1133
|
+
createdAt: event.createdAt,
|
|
708
1134
|
// Propagate specVersion from the event to the hook entity
|
|
709
1135
|
specVersion: effectiveSpecVersion,
|
|
710
1136
|
isWebhook: hookData.isWebhook ?? false,
|
|
711
1137
|
isSystem: hookData.isSystem ?? false,
|
|
712
1138
|
};
|
|
713
|
-
|
|
1139
|
+
hookEntityWriteOptions = writeHookEntityWithOverwrite
|
|
1140
|
+
? { overwrite: true }
|
|
1141
|
+
: undefined;
|
|
714
1142
|
}
|
|
715
1143
|
else if (data.eventType === 'hook_disposed') {
|
|
716
1144
|
// hook_disposed: Deletes hook entity, rejects duplicates.
|
|
@@ -728,9 +1156,15 @@ export function createEventsStorage(basedir, tag) {
|
|
|
728
1156
|
const hookPath = taggedPath(basedir, 'hooks', data.correlationId, tag);
|
|
729
1157
|
const existingHook = await readJSONWithFallback(basedir, 'hooks', data.correlationId, HookSchema, tag);
|
|
730
1158
|
if (existingHook) {
|
|
731
|
-
// Delete the token constraint file to free up the token
|
|
1159
|
+
// Delete the token constraint file to free up the token
|
|
1160
|
+
// for reuse, and delete this hook's recovery marker (if
|
|
1161
|
+
// any) for disk hygiene. The marker's filename hash
|
|
1162
|
+
// includes `(token, runId, hookId)` so different
|
|
1163
|
+
// lifetimes never collide, but cleaning up reduces disk
|
|
1164
|
+
// leak for hooks that go through the recovery path.
|
|
732
1165
|
const disposedConstraintPath = path.join(basedir, 'hooks', 'tokens', `${hashToken(existingHook.token)}.json`);
|
|
733
1166
|
await deleteJSON(disposedConstraintPath);
|
|
1167
|
+
await deleteJSON(hookRecoveryMarkerPath(basedir, existingHook.token, existingHook.runId, existingHook.hookId));
|
|
734
1168
|
}
|
|
735
1169
|
await deleteJSON(hookPath);
|
|
736
1170
|
}
|
|
@@ -793,9 +1227,51 @@ export function createEventsStorage(basedir, tag) {
|
|
|
793
1227
|
}
|
|
794
1228
|
// Note: hook_received events are stored in the event log but don't
|
|
795
1229
|
// modify the Hook entity (which doesn't have a payload field)
|
|
796
|
-
// Store event using composite key {runId}-{eventId}
|
|
1230
|
+
// Store event using composite key {runId}-{eventId}.
|
|
1231
|
+
//
|
|
1232
|
+
// `writeExclusive` (O_CREAT|O_EXCL via temp-file + hard-link)
|
|
1233
|
+
// is the cross-process atomic publish primitive: if the file
|
|
1234
|
+
// already exists, returns false instead of overwriting. This
|
|
1235
|
+
// is critical for the hook_created dedup-recovery convergence
|
|
1236
|
+
// (above) — two workers that adopt the same canonical eventId
|
|
1237
|
+
// race here; whoever links the file first wins, the loser
|
|
1238
|
+
// throws EntityConflictError, and the runtime's existing
|
|
1239
|
+
// concurrent-replay catch path at suspension-handler.ts:142
|
|
1240
|
+
// swallows it. For all other event types, eventIds are
|
|
1241
|
+
// monotonic ULIDs (globally unique by construction) so a
|
|
1242
|
+
// collision indicates a real bug and EntityConflictError is
|
|
1243
|
+
// also the right surface — same shape as step_created's
|
|
1244
|
+
// claim-file behavior.
|
|
797
1245
|
const compositeKey = `${effectiveRunId}-${eventId}`;
|
|
798
|
-
await
|
|
1246
|
+
const eventPublished = await writeExclusive(taggedPath(basedir, 'events', compositeKey, tag), JSON.stringify(event, jsonReplacer, 2));
|
|
1247
|
+
if (!eventPublished) {
|
|
1248
|
+
// For `hook_created`, losing the event publish means the
|
|
1249
|
+
// event was already committed at this exact (canonical)
|
|
1250
|
+
// path. The original publisher may have crashed between
|
|
1251
|
+
// its event publish and its deferred hook-entity write
|
|
1252
|
+
// (the inverse of the crash window the deferral closes),
|
|
1253
|
+
// leaving an event-first orphan: the event is in the log
|
|
1254
|
+
// but the entity is missing and the hook is unresolvable.
|
|
1255
|
+
// Repair the entity from the PERSISTED event's payload
|
|
1256
|
+
// (never the retry's — different retry metadata must not
|
|
1257
|
+
// change committed state) before surfacing the benign
|
|
1258
|
+
// duplicate to the runtime's concurrent-replay catch path.
|
|
1259
|
+
if (data.eventType === 'hook_created' && data.correlationId) {
|
|
1260
|
+
await repairHookEntityFromPersistedEvent(basedir, effectiveRunId, data.correlationId, eventId, tag);
|
|
1261
|
+
}
|
|
1262
|
+
throw new EntityConflictError(`Event "${eventId}" already exists for run "${effectiveRunId}"`);
|
|
1263
|
+
}
|
|
1264
|
+
// Write the hook entity ONLY now that the event publish has
|
|
1265
|
+
// committed. Doing this earlier (in the `hook_created`
|
|
1266
|
+
// branch above) would mutate an already-committed hook
|
|
1267
|
+
// entity with the retry's payload before the event publish
|
|
1268
|
+
// proved whether this attempt was repairing a missing event
|
|
1269
|
+
// or just colliding with an already-published `hook_created`.
|
|
1270
|
+
// The branch sets `hookEntityWriteOptions` iff this event
|
|
1271
|
+
// type writes an entity.
|
|
1272
|
+
if (hook && data.eventType === 'hook_created') {
|
|
1273
|
+
await writeJSON(taggedPath(basedir, 'hooks', hook.hookId, tag), hook, hookEntityWriteOptions);
|
|
1274
|
+
}
|
|
799
1275
|
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
800
1276
|
const filteredEvent = stripEventDataRefs(event, resolveData);
|
|
801
1277
|
// For run_started: preload one page of events so the runtime can skip
|
|
@@ -894,4 +1370,4 @@ export function createEventsStorage(basedir, tag) {
|
|
|
894
1370
|
},
|
|
895
1371
|
};
|
|
896
1372
|
}
|
|
897
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUs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QUFDLENBQUM7WUFFSCx5REFBeUQ7WUFDekQsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE9BQU87b0JBQ0wsR0FBRyxNQUFNO29CQUNULElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzlCLGtCQUFrQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FDdkM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgUnVuTm90U3VwcG9ydGVkRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBFdmVudFNjaGVtYSxcbiAgSG9va1NjaGVtYSxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgcmVxdWlyZXNOZXdlcldvcmxkLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU3RlcFNjaGVtYSxcbiAgdmFsaWRhdGVVbGlkVGltZXN0YW1wLFxuICBXYWl0U2NoZW1hLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAganNvblJlcGxhY2VyLFxuICBsaXN0SlNPTkZpbGVzLFxuICBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnksXG4gIHJlYWRKU09OLFxuICByZWFkSlNPTldpdGhGYWxsYmFjayxcbiAgcmVzb2x2ZVdpdGhpbkJhc2UsXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlRXhjbHVzaXZlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4uL2ZzLmpzJztcbmltcG9ydCB7IHN0cmlwRXZlbnREYXRhUmVmcyB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5pbXBvcnQgeyBnZXRPYmplY3RDcmVhdGVkQXQsIGhhc2hUb2tlbiwgbW9ub3RvbmljVWxpZCB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBkZWxldGVBbGxIb29rc0ZvclJ1biB9IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbmNvbnN0IHN0ZXBMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG59KTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tUb2tlbkNsYWltKFxuICBjb25zdHJhaW50UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpTT04oY29uc3RyYWludFBhdGgsIEhvb2tUb2tlbkNsYWltU2NoZW1hKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aXRoU3RlcExvY2s8VD4oa2V5OiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHByZXYgPSBzdGVwTG9ja3MuZ2V0KGtleSk7XG4gIGNvbnN0IHRhc2tCb3g6IHsgdGFzaz86IFByb21pc2U8VD4gfSA9IHt9O1xuICBjb25zdCB0YXNrID0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAocHJldikge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHRhc2sgdG8gc2V0dGxlOyBkb24ndCBpbmhlcml0IGl0cyBlcnJvcnMuXG4gICAgICBhd2FpdCBwcmV2LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHN0ZXBMb2Nrcy5nZXQoa2V5KSA9PT0gdGFza0JveC50YXNrKSB7XG4gICAgICAgIHN0ZXBMb2Nrcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIHRhc2tCb3gudGFzayA9IHRhc2s7XG4gIHN0ZXBMb2Nrcy5zZXQoa2V5LCB0YXNrKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgd2FpdHMgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBbGxXYWl0c0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd2FpdHNEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3dhaXRzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyh3YWl0c0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgLy8gZmlsZUlkcyBtYXkgY29udGFpbiB0YWcgc3VmZml4ZXMgKGUuZy4sIFwid3J1bl9BQkMtY29ycklkLnZpdGVzdC0wXCIpXG4gICAgLy8gYnV0IHN0YXJ0c1dpdGggc3RpbGwgbWF0Y2hlcyBjb3JyZWN0bHkgc2luY2UgdGhlIHRhZyBpcyBhIHN1ZmZpeC5cbiAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3J1bklkfS1gKSkge1xuICAgICAgY29uc3Qgd2FpdFBhdGggPSBwYXRoLmpvaW4od2FpdHNEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04od2FpdFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgYSBsaWZlY3ljbGUtZHJpdmVuIHJ1biB1cGRhdGUgKHJ1bl9zdGFydGVkIC8gcnVuX2NvbXBsZXRlZCAvXG4gKiBydW5fZmFpbGVkIC8gcnVuX2NhbmNlbGxlZCkgdW5kZXIgdGhlIHNoYXJlZCBwZXItcnVuIGZpbGUgbG9jayxcbiAqIHJlLXJlYWRpbmcgdGhlIG9uLWRpc2sgcnVuIGluc2lkZSB0aGUgbG9jayBzbyBhbnkgYXR0cmlidXRlIHdyaXRlc1xuICogdGhhdCBsYW5kZWQgYmV0d2VlbiB0aGUgcHJlLXZhbGlkYXRpb24gYGN1cnJlbnRSdW5gIHJlYWQgYW5kIHRoaXNcbiAqIHdyaXRlIGFyZSBwcmVzZXJ2ZWQuIFdpdGhvdXQgdGhlIHJlLXJlYWQsIGFuIGBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzYFxuICogY2FsbCBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIGxpZmVjeWNsZSByZWFkIGFuZCB3cml0ZSB3b3VsZCBiZVxuICogc2lsZW50bHkgb3ZlcndyaXR0ZW4gYnkgdGhlIGxpZmVjeWNsZSB3cml0ZSdzIHN0YWxlIGF0dHJpYnV0ZSBzbmFwc2hvdC5cbiAqXG4gKiBgcHJvcG9zZWRgIGlzIHRoZSBmdWxseS1jb25zdHJ1Y3RlZCBydW4gcm93IHRoZSBjYWxsZXIgd2FudHMgdG9cbiAqIHdyaXRlICh3aXRoIHRoZSBjb3JyZWN0IGRpc2NyaW1pbmF0ZWQtdW5pb24gc3RhdHVzIGJyYW5jaCkuIE9ubHkgdGhlXG4gKiBgYXR0cmlidXRlc2AgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZnJlc2hlc3QgdmVyc2lvbiBpbnNpZGUgdGhlXG4gKiBsb2NrLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jazxUIGV4dGVuZHMgV29ya2Zsb3dSdW4+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwcm9wb3NlZDogVFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB3aXRoUnVuRmlsZUxvY2socnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLFxuICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICApO1xuICAgIGNvbnN0IG5leHQ6IFQgPSB7XG4gICAgICAuLi5wcm9wb3NlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGZyZXNoPy5hdHRyaWJ1dGVzID8/IHByb3Bvc2VkLmF0dHJpYnV0ZXMsXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUpTT04odGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLCBuZXh0LCB7XG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGV2ZW50cyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnZXZlbnRzJ10gaW50ZXJmYWNlIHdpdGggY3JlYXRlLCBsaXN0LCBhbmQgbGlzdEJ5Q29ycmVsYXRpb25JZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2V2ZW50cyddIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjcmVhdGUocnVuSWQsIGRhdGEsIHBhcmFtcyk6IFByb21pc2U8RXZlbnRSZXN1bHQ+IHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVlc3Qtc3VwcGxpZWQgSURzIGJlZm9yZSB0aGV5J3JlIGNvbmNhdGVuYXRlZCBpbnRvXG4gICAgICAvLyBmaWxlc3lzdGVtIHBhdGhzLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoIHRyYXZlcnNhbFxuICAgICAgLy8gYXR0YWNrcyB3aGVyZSBhIGNsaWVudCBzdXBwbGllcyBydW5JZCAvIGNvcnJlbGF0aW9uSWQgdmFsdWVzIGxpa2VcbiAgICAgIC8vIFwiLi4vLi4vLi4vcGFja2FnZVwiIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICAgICAgLy8gUnVuIGJlZm9yZSB0YWtpbmcgdGhlIHBlci1zdGVwIG11dGV4IHNvIG1hbGZvcm1lZCBpbnB1dHMgZmFpbCBmYXN0LlxuICAgICAgLy9cbiAgICAgIC8vIEVtcHR5IGBjb3JyZWxhdGlvbklkYCB2YWx1ZXMgYXJlIGFsc28gcmVqZWN0ZWQgaGVyZTogdGhlIGV2ZW50XG4gICAgICAvLyBzY2hlbWFzIG9ubHkgcmVxdWlyZSBgei5zdHJpbmcoKWAsIHNvIHdpdGhvdXQgdGhpcyBjaGVjayBhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgLyBob29rX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgcmVxdWVzdCB3aXRoXG4gICAgICAvLyBgY29ycmVsYXRpb25JZDogJydgIHdvdWxkIHNpbGVudGx5IGJlIHdyaXR0ZW4gdW5kZXIgYSBtYWxmb3JtZWRcbiAgICAgIC8vIGNvbXBvc2l0ZSBrZXkgbGlrZSBgJHtydW5JZH0tYC5cbiAgICAgIGlmIChydW5JZCAhPSBudWxsICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCdjb3JyZWxhdGlvbklkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmNvcnJlbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnY29ycmVsYXRpb25JZCcsIGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgc2VyaWFsaXplZCBwZXItc3RlcCB2aWEgYW4gaW4tcHJvY2VzcyBtdXRleFxuICAgICAgLy8gc28gdGhhdCB0aGUgXCJjaGVjayBzdGF0ZSwgdGhlbiB3cml0ZVwiIHNlcXVlbmNlIGluIHN0ZXBfc3RhcnRlZCAvXG4gICAgICAvLyBzdGVwX2NvbXBsZXRlZCAvIHN0ZXBfZmFpbGVkIC8gc3RlcF9yZXRyeWluZyBpcyBhdG9taWMuIHN0ZXBfY3JlYXRlZFxuICAgICAgLy8gaXMgYWxzbyBzZXJpYWxpemVkIHNvIGR1cGxpY2F0ZS1jcmVhdGUgcmFjZXMgZG9uJ3QgbGVhdmUgZXh0cmFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgaW4gdGhlIGxvZy5cbiAgICAgIGNvbnN0IGlzU3RlcEV2ZW50ID1cbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnO1xuICAgICAgaWYgKGlzU3RlcEV2ZW50ICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LiR7dGFnfWBcbiAgICAgICAgICA6IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICByZXR1cm4gd2l0aFN0ZXBMb2NrKGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1wbCgpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVJbXBsKCk6IFByb21pc2U8RXZlbnRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgZXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgLy8gRm9yIHJ1bl9jcmVhdGVkIGV2ZW50cywgdXNlIGNsaWVudC1wcm92aWRlZCBydW5JZCBvciBnZW5lcmF0ZSBvbmUgc2VydmVyLXNpZGVcbiAgICAgICAgbGV0IGVmZmVjdGl2ZVJ1bklkOiBzdHJpbmc7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiAoIXJ1bklkIHx8IHJ1bklkID09PSAnJykpIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IGB3cnVuXyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdydW5JZCBpcyByZXF1aXJlZCBmb3Igbm9uLXJ1bl9jcmVhdGVkIGV2ZW50cycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gcnVuSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgdGltZXN0YW1wIGlzIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZFxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgcnVuSWQgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVVbGlkVGltZXN0YW1wKFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAnd3J1bl8nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3BlY1ZlcnNpb24gaXMgYWx3YXlzIHNlbnQgYnkgdGhlIHJ1bnRpbWUsIGJ1dCB3ZSBwcm92aWRlIGEgZmFsbGJhY2sgZm9yIHNhZmV0eVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVTcGVjVmVyc2lvbiA9IGRhdGEuc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQ7XG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIHJ1biBpcyBpbiB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICBjb25zdCBpc1J1blRlcm1pbmFsID0gKHN0YXR1czogc3RyaW5nKSA9PlxuICAgICAgICAgIFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXS5pbmNsdWRlcyhzdGF0dXMpO1xuXG4gICAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBzdGVwIGlzIGluIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgIGNvbnN0IGlzU3RlcFRlcm1pbmFsID0gKHN0YXR1czogc3RyaW5nKSA9PlxuICAgICAgICAgIFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXS5pbmNsdWRlcyhzdGF0dXMpO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJ1biBzdGF0ZSBmb3IgdmFsaWRhdGlvbiAoaWYgbm90IGNyZWF0aW5nIGEgbmV3IHJ1bilcbiAgICAgICAgLy8gU2tpcCBydW4gdmFsaWRhdGlvbiBmb3Igc3RlcF9jb21wbGV0ZWQgYW5kIHN0ZXBfcmV0cnlpbmcgLSB0aGV5IG9ubHkgb3BlcmF0ZVxuICAgICAgICAvLyBvbiBydW5uaW5nIHN0ZXBzLCBhbmQgcnVubmluZyBzdGVwcyBhcmUgYWx3YXlzIGFsbG93ZWQgdG8gbW9kaWZ5IHJlZ2FyZGxlc3NcbiAgICAgICAgLy8gb2YgcnVuIHN0YXRlLiBUaGlzIG9wdGltaXphdGlvbiBzYXZlcyBmaWxlc3lzdGVtIHJlYWRzIHBlciBzdGVwIGV2ZW50LlxuICAgICAgICBsZXQgY3VycmVudFJ1bjogV29ya2Zsb3dSdW4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2tpcFJ1blZhbGlkYXRpb25FdmVudHMgPSBbJ3N0ZXBfY29tcGxldGVkJywgJ3N0ZXBfcmV0cnlpbmcnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlICE9PSAncnVuX2NyZWF0ZWQnICYmXG4gICAgICAgICAgIXNraXBSdW5WYWxpZGF0aW9uRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNpbGllbnQgc3RhcnQ6IHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4gd2l0aCBldmVudERhdGFcbiAgICAgICAgICAvLyBjcmVhdGVzIHRoZSBydW4gZmlyc3QsIHNvIHRoZSBxdWV1ZSBjYW4gYm9vdHN0cmFwIGEgcnVuIHRoYXRcbiAgICAgICAgICAvLyBmYWlsZWQgdG8gY3JlYXRlIGR1cmluZyBzdGFydCgpLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmXG4gICAgICAgICAgICAhY3VycmVudFJ1biAmJlxuICAgICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YSAmJlxuICAgICAgICAgICAgZGF0YS5ldmVudERhdGFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bklucHV0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0PzogYW55O1xuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEF0b21pY2FsbHkgdHJ5IHRvIHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgc28gb25seSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgLy8gd3JpdGVyIHdpbnMsIHByZXZlbnRpbmcgYSBUT0NUT1UgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gcnVuX2NyZWF0ZWQgZnJvbSBzdGFydCgpIGNvdWxkIG92ZXJ3cml0ZSBhIHJ1biB0aGF0IHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byAncnVubmluZycuXG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRSdW46IFdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3JlYXRlZFJ1biwganNvblJlcGxhY2VyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlZCB0aGUgcnVuIOKAlCBhbHNvIHdyaXRlIHRoZSBydW5fY3JlYXRlZCBldmVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHJ1bkNyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtydW5DcmVhdGVkRXZlbnRJZH1gO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNyZWF0ZWRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgICAgICBydW5DcmVhdGVkRXZlbnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSdW4gPSBjcmVhdGVkUnVuO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBydW5fY3JlYXRlZCB3b24gdGhlXG4gICAgICAgICAgICAgICAgLy8gcmFjZSkuIFJlLXJlYWQgaXQgc28gZG93bnN0cmVhbSBsb2dpYyBzZWVzIHRoZSByZWFsIHN0YXRlLlxuICAgICAgICAgICAgICAgIGN1cnJlbnRSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAncnVucycsXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJ1bl9mYWlsZWQgb24gYSBub24tZXhpc3RlbnQgcnVuIGlzIHJlamVjdGVkIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBwb3N0Z3JlcyBhbmQgdmVyY2VsIHdvcmxkcywgd2hpY2ggYm90aCBzdXJmYWNlIHRoaXMgYXMgYVxuICAgICAgICAvLyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgcmF0aGVyIHRoYW4gc2lsZW50bHkgcGVyc2lzdGluZyBhblxuICAgICAgICAvLyBldmVudCBmb3IgYSBydW4gdGhhdCB3YXMgbmV2ZXIgY3JlYXRlZC5cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgJiYgIWN1cnJlbnRSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yKGVmZmVjdGl2ZVJ1bklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWRVJTSU9OIENPTVBBVElCSUxJVFk6IENoZWNrIHJ1biBzcGVjIHZlcnNpb25cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIEZvciBldmVudHMgdGhhdCBoYXZlIGZldGNoZWQgdGhlIHJ1biwgY2hlY2sgdmVyc2lvbiBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvLyBTa2lwIGZvciBydW5fY3JlYXRlZCAobm8gZXhpc3RpbmcgcnVuKSBhbmQgcnVudGltZSBldmVudHMgKHN0ZXBfY29tcGxldGVkLCBzdGVwX3JldHJ5aW5nKS5cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBydW4gcmVxdWlyZXMgYSBuZXdlciB3b3JsZCB2ZXJzaW9uXG4gICAgICAgICAgaWYgKHJlcXVpcmVzTmV3ZXJXb3JsZChjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bk5vdFN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLnNwZWNWZXJzaW9uISxcbiAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX0NVUlJFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUm91dGUgdG8gbGVnYWN5IGhhbmRsZXIgZm9yIHByZS1ldmVudC1zb3VyY2luZyBydW5zXG4gICAgICAgICAgaWYgKGlzTGVnYWN5U3BlY1ZlcnNpb24oY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVMZWdhY3lFdmVudChcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4sXG4gICAgICAgICAgICAgIHBhcmFtc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkFMSURBVElPTjogVGVybWluYWwgc3RhdGUgYW5kIGV2ZW50IG9yZGVyaW5nIGNoZWNrc1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgICAvLyBSdW4gdGVybWluYWwgc3RhdGUgdmFsaWRhdGlvblxuICAgICAgICBpZiAoY3VycmVudFJ1biAmJiBpc1J1blRlcm1pbmFsKGN1cnJlbnRSdW4uc3RhdHVzKSkge1xuICAgICAgICAgIGNvbnN0IHJ1blRlcm1pbmFsRXZlbnRzID0gW1xuICAgICAgICAgICAgJ3J1bl9zdGFydGVkJyxcbiAgICAgICAgICAgICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICdydW5fZmFpbGVkJyxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gSWRlbXBvdGVudCBvcGVyYXRpb246IHJ1bl9jYW5jZWxsZWQgb24gYWxyZWFkeSBjYW5jZWxsZWQgcnVuIGlzIGFsbG93ZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnICYmXG4gICAgICAgICAgICBjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJldHVybiBleGlzdGluZyBzdGF0ZSAoaWRlbXBvdGVudClcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBldmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID1cbiAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBldmVudDogc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSksXG4gICAgICAgICAgICAgIHJ1bjogY3VycmVudFJ1bixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkIG9uIHRlcm1pbmFsIHJ1bnMsIHVzZSBSdW5FeHBpcmVkRXJyb3Igc28gdGhlXG4gICAgICAgICAgLy8gcnVudGltZSBrbm93cyB0byBleGl0IHdpdGhvdXQgcmV0cnlpbmcuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBpcyBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXIgcnVuIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiB0ZXJtaW5hbCBydW5zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcnVuVGVybWluYWxFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCB0cmFuc2l0aW9uIHJ1biBmcm9tIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRpbmcgbmV3IGVudGl0aWVzIG9uIHRlcm1pbmFsIHJ1bnMgaXMgbm90IGFsbG93ZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgbmV3IGVudGl0aWVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAtcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZyBhbmQgdGVybWluYWwgc3RhdGUpXG4gICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nU3RlcCBzbyB3ZSBjYW4gcmV1c2UgaXQgbGF0ZXIgKGF2b2lkIGRvdWJsZSByZWFkKVxuICAgICAgICBsZXQgdmFsaWRhdGVkU3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBzdGVwRXZlbnRzID0gW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzdGVwRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFdmVudCBvcmRlcmluZzogc3RlcCBtdXN0IGV4aXN0IGJlZm9yZSB0aGVzZSBldmVudHNcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGVwIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgICBpZiAoaXNTdGVwVGVybWluYWwodmFsaWRhdGVkU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7dmFsaWRhdGVkU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9uIHRlcm1pbmFsIHJ1bnM6IG9ubHkgYWxsb3cgY29tcGxldGluZy9mYWlsaW5nIGluLXByb2dyZXNzIHN0ZXBzXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgbm9uLXJ1bm5pbmcgc3RlcCBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhvb2stcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZylcbiAgICAgICAgY29uc3QgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZSA9IFsnaG9va19kaXNwb3NlZCcsICdob29rX3JlY2VpdmVkJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBob29rRXZlbnRzUmVxdWlyaW5nRXhpc3RlbmNlLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJlxuICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICBldmVudElkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU3RyaXAgZXZlbnREYXRhIGZyb20gcnVuX3N0YXJ0ZWQg4oCUIGl0IGJlbG9uZ3Mgb24gcnVuX2NyZWF0ZWQgb25seS5cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmICdldmVudERhdGEnIGluIGV2ZW50KSB7XG4gICAgICAgICAgZGVsZXRlIChldmVudCBhcyBhbnkpLmV2ZW50RGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIGVudGl0eSBjcmVhdGVkL3VwZGF0ZWQgZm9yIEV2ZW50UmVzdWx0XG4gICAgICAgIGxldCBydW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RlcDogU3RlcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2sgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB3YWl0OiBXYWl0IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENyZWF0ZS91cGRhdGUgZW50aXR5IGJhc2VkIG9uIGV2ZW50IHR5cGUgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAvLyBSdW4gbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgfTtcbiAgICAgICAgICBydW4gPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bkRhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bkRhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBydW4gZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5EYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICBpbnB1dDogcnVuRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQ6IENyZWF0ZXMgc3RlcCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3BlbmRpbmcnLCBhdHRlbXB0PTAsIGNyZWF0ZWRBdCBzZXQuXG4gICAgICAgICAgLy8gVHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgd2l0aCBpZGVudGljYWwgY29ycmVsYXRpb25JZHMgKGUuZy4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgcnVudGltZSdzIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHMgYWNyb3NzIHJlcGxheXMpXG4gICAgICAgICAgLy8gbXVzdCBiZSBkZWR1cGVkIOKAlCBvdGhlcndpc2UgYm90aCB3cml0ZXMgc3VjY2VlZCBhbmQgdGhlIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGVuZHMgdXAgd2l0aCBkdXBsaWNhdGUgc3RlcF9jcmVhdGVkIGVudHJpZXMuIFRoZSBvdXRlclxuICAgICAgICAgIC8vIHdpdGhTdGVwTG9jayBtdXRleCBzZXJpYWxpemVzIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzOyB0aGlzXG4gICAgICAgICAgLy8gVGhlIGV4Y2x1c2l2ZSBjb25zdHJhaW50IGZpbGUgYWRkaXRpb25hbGx5IHByb3RlY3RzIGFnYWluc3RcbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHJhY2VzICh0d28gcG5wbSB3b3JrZXJzLCByZWRlbGl2ZXJlZCBxdWV1ZSBtZXNzYWdlcyxcbiAgICAgICAgICAvLyBldGMuKS4gVGhlIGxvc2VyIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGlzdGluZyBjYXRjaCBwYXRoIGNhbiBzd2FsbG93IGl0IGFuZCBhdm9pZCBkb3VibGUtcXVldWluZyB0aGVcbiAgICAgICAgICAvLyBzdGVwLlxuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdGVwRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICAgIH07XG4gICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXBEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICBpbnB1dDogc3RlcERhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQ6IEluY3JlbWVudHMgYXR0ZW1wdCwgc2V0cyBzdGF0dXMgdG8gJ3J1bm5pbmcnXG4gICAgICAgICAgLy8gU2V0cyBzdGFydGVkQXQgb25seSBvbiB0aGUgZmlyc3Qgc3RhcnQgKG5vdCB1cGRhdGVkIG9uIHJldHJpZXMpXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzbid0IGJlZW4gcmVhY2hlZCB5ZXRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgPiBEYXRlLm5vdygpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb0Vhcmx5RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBzdGFydCBzdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCI6IHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldGAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGd1YXJkOiByZS1yZWFkIHRoZSBzdGVwIGVudGl0eSB0byBjaGVjayBpZiBpdFxuICAgICAgICAgICAgLy8gcmVhY2hlZCB0ZXJtaW5hbCBzdGF0ZSBiZXR3ZWVuIHRoZSB2YWxpZGF0aW9uIHJlYWQgYW5kIG5vdy5cbiAgICAgICAgICAgIC8vIFRoaXMgbmFycm93cyB0aGUgVE9DVE9VIHdpbmRvdyBidXQgZG9lcyBub3QgZnVsbHkgZWxpbWluYXRlIGl0XG4gICAgICAgICAgICAvLyAodGhlIGxvY2FsIHdvcmxkIGlzIHNpbmdsZS1wcm9jZXNzIC8gZGV2LW9ubHk7IHRoZSBwb3N0Z3Jlc1xuICAgICAgICAgICAgLy8gd29ybGQgdXNlcyBTUUwtbGV2ZWwgYXRvbWljIGd1YXJkcyBmb3IgcHJvZHVjdGlvbikuXG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBmcmVzaFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZyZXNoU3RlcCAmJiBpc1N0ZXBUZXJtaW5hbChmcmVzaFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtmcmVzaFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgLy8gT25seSBzZXQgc3RhcnRlZEF0IG9uIHRoZSBmaXJzdCBzdGFydFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IHZhbGlkYXRlZFN0ZXAuc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGF0dGVtcHQgY291bnRlciBvbiBldmVyeSBzdGFydFxuICAgICAgICAgICAgICBhdHRlbXB0OiB2YWxpZGF0ZWRTdGVwLmF0dGVtcHQgKyAxLFxuICAgICAgICAgICAgICAvLyBDbGVhciByZXRyeUFmdGVyIG5vdyB0aGF0IHRoZSBzdGVwIGhhcyBzdGFydGVkXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZDogVGVybWluYWwgc3RhdGUgd2l0aCBvdXRwdXRcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IHJlc3VsdDogYW55IH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLnJlc3VsdCxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2ZhaWxlZDogVGVybWluYWwgc3RhdGUgd2l0aCBlcnJvclxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZmFpbGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlU3RlcEVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9yZXRyeWluZzogU2V0cyBzdGF0dXMgYmFjayB0byAncGVuZGluZycsIHJlY29yZHMgZXJyb3JcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGNvbnN0IHJldHJ5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgcmV0cnlBZnRlcj86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgIGVycm9yOiByZXRyeURhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlEYXRhLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBIb29rIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgICAgIG1ldGFkYXRhPzogYW55O1xuICAgICAgICAgICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICAgICAgICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXRvbWljYWxseSBjbGFpbSB0aGUgdG9rZW4gdXNpbmcgYW4gZXhjbHVzaXZlLWNyZWF0ZSBjb25zdHJhaW50IGZpbGUuXG4gICAgICAgICAgLy8gVGhpcyBhdm9pZHMgdGhlIFRPQ1RPVSByYWNlIG9mIHRoZSBwcmV2aW91cyByZWFkLWFsbC10aGVuLWNoZWNrIGFwcHJvYWNoLlxuICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgIGAke2hhc2hUb2tlbihob29rRGF0YS50b2tlbil9Lmpzb25gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXRva2VuQ2xhaW1lZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDbGFpbSA9IGF3YWl0IHJlYWRIb29rVG9rZW5DbGFpbShjb25zdHJhaW50UGF0aCk7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBob29rX2NvbmZsaWN0IGV2ZW50IGluc3RlYWQgb2YgaG9va19jcmVhdGVkXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgd29ya2Zsb3cgdG8gY29udGludWUgYW5kIGZhaWwgZ3JhY2VmdWxseSB3aGVuIHRoZSBob29rIGlzIGF3YWl0ZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nQ2xhaW1cbiAgICAgICAgICAgICAgICAgID8geyBjb25mbGljdGluZ1J1bklkOiBleGlzdGluZ0NsYWltLnJ1bklkIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgY29uZmxpY3QgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBjb25mbGljdEV2ZW50XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRFdmVudCA9IHN0cmlwRXZlbnREYXRhUmVmcyhcbiAgICAgICAgICAgICAgY29uZmxpY3RFdmVudCxcbiAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGNvbmZsaWN0IGV2ZW50IChubyBob29rIGVudGl0eSBjcmVhdGVkKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGZpbHRlcmVkRXZlbnQsXG4gICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaG9vazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBob29rID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgaG9va0lkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICBtZXRhZGF0YTogaG9va0RhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgICAgICAgICAgcHJvamVjdElkOiAnbG9jYWwtcHJvamVjdCcsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBob29rIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rRGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICBpc1N5c3RlbTogaG9va0RhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdob29rcycsIGRhdGEuY29ycmVsYXRpb25JZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2tcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgICAvLyBob29rX2Rpc3Bvc2VkOiBEZWxldGVzIGhvb2sgZW50aXR5LCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBkaXNwb3NpbmcgdGhlIHNhbWUgaG9vayAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGhvb2tMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZGF0YS5jb3JyZWxhdGlvbklkfS5kaXNwb3NlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBob29rTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBkaXNwb3NlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlYWQgdGhlIGhvb2sgdG8gZ2V0IGl0cyB0b2tlbiBiZWZvcmUgZGVsZXRpbmdcbiAgICAgICAgICBjb25zdCBob29rUGF0aCA9IHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdG9rZW4gY29uc3RyYWludCBmaWxlIHRvIGZyZWUgdXAgdGhlIHRva2VuIGZvciByZXVzZVxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICBldmVudFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID0gYWxsRXZlbnRzLmRhdGE7XG4gICAgICAgICAgY3Vyc29yID0gYWxsRXZlbnRzLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gYWxsRXZlbnRzLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
1373
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsYUFBYSxHQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFB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LEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUs7Z0JBQy9CLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU07Z0JBQ2pDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU87YUFDaEMsQ0FBQyxDQUFDO1lBRUgseURBQXlEO1lBQ3pELElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixPQUFPO29CQUNMLEdBQUcsTUFBTTtvQkFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM5QixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQ3ZDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFJ1bk5vdFN1cHBvcnRlZEVycm9yLFxuICBUb29FYXJseUVycm9yLFxuICBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV2ZW50LFxuICBFdmVudFJlc3VsdCxcbiAgSG9vayxcbiAgU2VyaWFsaXplZERhdGEsXG4gIFN0ZXAsXG4gIFN0b3JhZ2UsXG4gIFdhaXQsXG4gIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzLFxuICBFdmVudFNjaGVtYSxcbiAgSG9va1NjaGVtYSxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgcmVxdWlyZXNOZXdlcldvcmxkLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU3RlcFNjaGVtYSxcbiAgdWxpZFRvRGF0ZSxcbiAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzLFxuICB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAsXG4gIFdhaXRTY2hlbWEsXG4gIFdvcmtmbG93UnVuU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT04gfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkLFxuICBkZWxldGVKU09OLFxuICBqc29uUmVwbGFjZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICByZXNvbHZlV2l0aGluQmFzZSxcbiAgdGFnZ2VkUGF0aCxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7XG4gIGdldE9iamVjdENyZWF0ZWRBdCxcbiAgaGFzaFRva2VuLFxuICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoLFxuICBtb25vdG9uaWNVbGlkLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgZGVsZXRlQWxsSG9va3NGb3JSdW4gfSBmcm9tICcuL2hvb2tzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgaGFuZGxlTGVnYWN5RXZlbnQgfSBmcm9tICcuL2xlZ2FjeS5qcyc7XG5pbXBvcnQgeyB3aXRoUnVuRmlsZUxvY2sgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogUGVyLXN0ZXAgaW4tcHJvY2VzcyBhc3luYyBtdXRleC4gU2VyaWFsaXplcyBjb25jdXJyZW50IGBldmVudHMuY3JlYXRlYCBjYWxsc1xuICogdGhhdCB0YXJnZXQgdGhlIHNhbWUgc3RlcCwgc28gdGhhdCB0aGUgXCJjaGVjayB0ZXJtaW5hbCBzdGF0ZSwgdGhlbiB3cml0ZSBzdGVwXG4gKiBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIGlzIGF0b21pYy4gV2l0aG91dCB0aGlzLCB0d28gY29uY3VycmVudCBzdGVwX3N0YXJ0ZWRcbiAqIGNhbGxzIGNhbiBib3RoIHBhc3MgdGhlIG5vdC10ZXJtaW5hbCBjaGVjayBhbmQgYm90aCB3cml0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzXG4gKiDigJQgb3IgYSBzdGVwX3N0YXJ0ZWQgY2FuIGxhbmQgaW4gdGhlIGxvZyBhZnRlciBzdGVwX2NvbXBsZXRlZCBoYXMgYWxyZWFkeVxuICogd3JpdHRlbiwgcHJvZHVjaW5nIHVuY29uc3VtZWQgZXZlbnRzIG9uIHJlcGxheS5cbiAqXG4gKiBEdXBsaWNhdGUgc3RlcF9zdGFydGVkIGV2ZW50cyBmb3IgYSBub24tdGVybWluYWwgc3RlcCBhcmUgc3RpbGwgYWxsb3dlZFxuICogKHJldHJpZXMgbGVnaXRpbWF0ZWx5IHJlLXN0YXJ0IGEgc3RlcCksIG9ubHkgd3JpdGVzIHRvIGFuIGFscmVhZHktdGVybWluYWxcbiAqIHN0ZXAgYXJlIHJlamVjdGVkLlxuICovXG4vLyBgc3RlcExvY2tzYCBhbmQgYGhvb2tMb2Nrc2AgYXJlIG5vdyBpbnN0YW50aWF0ZWQgcGVyXG4vLyBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgY2FsbCAoc2VlIGluc2lkZSB0aGUgZnVuY3Rpb24pIHJhdGhlciB0aGFuXG4vLyBiZWluZyBtb2R1bGUtbGV2ZWwuIFRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyByZW1haW5cbi8vIHRoZSBkdXJhYmxlIHNvdXJjZSBvZiB0cnV0aCBhY3Jvc3MgcHJvY2Vzc2VzOyB0aGUgaW4tcHJvY2Vzc1xuLy8gbXV0ZXggaXMgYSBwZXItaW5zdGFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgY2xvc2VzIGEgc2hvcnQgcmFjZVxuLy8gd2luZG93IGluIHRoZSBkZWR1cC1yZWNvdmVyeSBwYXRoLiBQZXItaW5zdGFuY2Ugc2NvcGluZyBsZXRzXG4vLyB0ZXN0cyBzaW11bGF0ZSBjcm9zcy1wcm9jZXNzIGJlaGF2aW9yIHdpdGggdHdvIHN0b3JhZ2UgaW5zdGFuY2VzXG4vLyBzaGFyaW5nIG9uZSBkYXRhIGRpcmVjdG9yeSAoZWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnQgbG9ja3Ncbi8vIGJ1dCBhIHNoYXJlZCBmaWxlc3lzdGVtKSwgZXhhY3RseSBtYXRjaGluZyB0aGUgY3Jvc3MtcHJvY2Vzc1xuLy8gc2VtYW50aWNzIHdpdGhvdXQgc3Bhd25pbmcgc3VicHJvY2Vzc2VzLlxuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gVGhlIHRva2VuLWNsYWltIHdyaXRlciBiZWxvdyBoYXMgYWx3YXlzIHBlcnNpc3RlZCBgaG9va0lkYCwgYnV0XG4gIC8vIHRoaXMgcmVhZCBzY2hlbWEgcHJldmlvdXNseSBvbWl0dGVkIGl0LCB3aGljaCBpcyB0aGUgYnVnIGZpeGVkXG4gIC8vIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIyODMuIGBvcHRpb25hbCgpYFxuICAvLyBpcyBkZWZlbnNpdmU6IGFueSBjbGFpbSBmaWxlIHRoYXQgc29tZWhvdyBsYWNrcyB0aGUgZmllbGQgc3RpbGxcbiAgLy8gcGFyc2VzICh5aWVsZGluZyBgdW5kZWZpbmVkYCkgYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGNyb3NzLVxuICAvLyBob29rIGNvbmZsaWN0IGJyYW5jaCwgbWF0Y2hpbmcgcHJlLWZpeCBiZWhhdmlvci5cbiAgaG9va0lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJ1bklkOiB6LnN0cmluZygpLFxuICAvLyBgZXZlbnRJZGAgaXMgdGhlIGNhbm9uaWNhbCBob29rX2NyZWF0ZWQgZXZlbnQgSUQgdGhlIGNsYWltaW5nXG4gIC8vIHdvcmtlciBjb21taXR0ZWQgdG8gcHVibGlzaGluZy4gUGVyc2lzdGluZyBpdCBoZXJlIHR1cm5zIHRoZVxuICAvLyBjbGFpbSBmaWxlIGludG8gYSBkdXJhYmxlIGNvbnZlcmdlbmNlIGtleSBmb3IgY3Jvc3Mtd29ya2VyIC9cbiAgLy8gY3Jvc3MtcHJvY2VzcyByZXRyaWVzIChzZWUgY29tbWVudCBvbiB0aGUgaG9va19jcmVhdGVkIGJyYW5jaCkuXG4gIC8vIGBvcHRpb25hbCgpYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYSBsZWdhY3kgY2xhaW0gZmlsZVxuICAvLyB3cml0dGVuIGJlZm9yZSB0aGlzIGZpZWxkIGV4aXN0ZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnktXG4gIC8vIG1hcmtlciB1cGdyYWRlIHBhdGgsIHdoaWNoIGF0b21pY2FsbHkgcGlucyBhIGNhbm9uaWNhbCBldmVudElkXG4gIC8vIHZpYSBhIHNpZGVjYXIgbWFya2VyIChhbHNvIGEgYHdyaXRlRXhjbHVzaXZlYCkuXG4gIGV2ZW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFNpZGVjYXIgcmVjb3ZlcnkgbWFya2VyIHRoYXQgcGlucyBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYFxuICogZXZlbnRJZCBmb3IgYSBsZWdhY3kgdG9rZW4gY2xhaW0g4oCUIG9uZSB3cml0dGVuIGJ5IGEgdmVyc2lvbiBvZlxuICogdGhpcyBzdG9yYWdlIHRoYXQgZGlkIG5vdCB5ZXQgcGVyc2lzdCBgZXZlbnRJZGAgaW5saW5lIGluIHRoZVxuICogY2xhaW0gZmlsZS4gV2l0aG91dCB0aGlzIG1hcmtlciwgdHdvIGNyb3NzLXByb2Nlc3MgcmV0cmllc1xuICogcmVhZGluZyBhIGxlZ2FjeSBjbGFpbSBlYWNoIGdlbmVyYXRlIHRoZWlyIG93biBldmVudElkLCBsYW5kXG4gKiB0aGVpciBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgY2FsbHMgYXQgZGlmZmVyZW50IHBhdGhzLCBhbmRcbiAqIGFwcGVuZCB0d28gYGhvb2tfY3JlYXRlZGAgZXZlbnRzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYC5cbiAqXG4gKiBUaGUgbWFya2VyIGlzIHdyaXR0ZW4gdmlhIGB3cml0ZUV4Y2x1c2l2ZWAg4oCUIHRoZSBmaXJzdCByZXRyeSB0b1xuICogbGFuZCBpdCBwaW5zIGl0cyBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwsIGFuZCBldmVyeVxuICogc3Vic2VxdWVudCByZXRyeSByZWFkcyBhbmQgYWRvcHRzIHRoYXQgZXZlbnRJZCBiZWZvcmUgdGhlIGNvbW1vblxuICogZXZlbnQgcHVibGlzaC4gU2NoZW1hIGlzIGp1c3QgYHsgZXZlbnRJZCB9YCBiZWNhdXNlIGlkZW50aXR5IGlzXG4gKiBhbHJlYWR5IGVuY29kZWQgaW4gdGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2gsIHNvIGRpZmZlcmVudCB0b2tlblxuICogbGlmZXRpbWVzIGNhbiBuZXZlciBzaGFyZSBvbmUgbWFya2VyIChzZWVcbiAqIGBob29rUmVjb3ZlcnlNYXJrZXJQYXRoYCkuXG4gKi9cbmNvbnN0IEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnRJZDogei5zdHJpbmcoKSxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1Rva2VuQ2xhaW0oXG4gIGNvbnN0cmFpbnRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1Rva2VuQ2xhaW1TY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihjb25zdHJhaW50UGF0aCwgSG9va1Rva2VuQ2xhaW1TY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIoXG4gIG1hcmtlclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihtYXJrZXJQYXRoLCBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJvYmUgdGhlIHJ1bidzIGV2ZW50IGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnRcbiAqIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uSWQuIFVzZWQgYnkgdGhlIGxlZ2FjeS1jbGFpbSByZWNvdmVyeVxuICogcGF0aCB0byBkZXRlY3QgXCJhbHJlYWR5IHB1Ymxpc2hlZCBieSBhIHByZS11cGdyYWRlIHdyaXRlXCIgYmVmb3JlXG4gKiBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQg4oCUIHdpdGhvdXQgdGhpcyBjaGVjaywgYSBwb3N0LXVwZ3JhZGVcbiAqIHJldHJ5IGVuY291bnRlcmluZyBhIGxlZ2FjeSBjbGFpbSB3aG9zZSBgaG9va19jcmVhdGVkYCB3YXNcbiAqIGFscmVhZHkgd3JpdHRlbiAod2l0aCB0aGUgcHJlLXVwZ3JhZGUgd3JpdGVyJ3Mgb3duIGV2ZW50SWQpIHdvdWxkXG4gKiBwaW4gYSAqZGlmZmVyZW50KiBldmVudElkIHZpYSB0aGUgbWFya2VyIGFuZCBwdWJsaXNoIGEgZHVwbGljYXRlXG4gKiBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAqXG4gKiBUaGUgaW5saW5lLWBldmVudElkYCBmYXN0IHBhdGggZG9lcyBOT1QgbmVlZCB0aGlzIHByb2JlOiB0aGVcbiAqIGNhbm9uaWNhbCBldmVudElkIGlzIGR1cmFibGUgaW4gdGhlIGNsYWltIGZpbGUsIHNvIHRoZSBleGlzdGluZ1xuICogcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKSB3aWxsIGZhaWwgaWZmIHRoZSBldmVudFxuICogYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBleGFjdCBwYXRoIOKAlCB3aGljaCBpcyB0aGUgY29ycmVjdFxuICogXCJhbHJlYWR5LXB1Ymxpc2hlZFwiIHNlbWFudGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRXhpc3RpbmdIb29rQ3JlYXRlZEV2ZW50SWQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICBmaWx0ZXI6IChldmVudCkgPT5cbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgbGltaXQ6IDEsXG4gICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdC5kYXRhWzBdPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVwYWlyIGFuIFwiZXZlbnQtZmlyc3Qgb3JwaGFuXCI6IHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZFxuICogdW50aWwgYWZ0ZXIgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHB1Ymxpc2ggY29tbWl0cyAoc28gYSBmYWlsZWRcbiAqIHB1Ymxpc2ggY2Fubm90IG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBzdGF0ZSDigJQgc2VlIHRoZSBjb21tZW50IG9uXG4gKiB0aGUgZGVmZXJyZWQgd3JpdGUpLCB3aGljaCBvcGVucyB0aGUgaW52ZXJzZSBjcmFzaCB3aW5kb3cg4oCUIGFcbiAqIGNyYXNoIEFGVEVSIHRoZSBldmVudCBwdWJsaXNoIGJ1dCBCRUZPUkUgdGhlIGRlZmVycmVkIGVudGl0eSB3cml0ZVxuICogbGVhdmVzIHRoZSBldmVudCBpbiB0aGUgbG9nIHdpdGggdGhlIGhvb2sgZW50aXR5IG1pc3NpbmcuIEEgcmV0cnlcbiAqIHRoZW4gY29sbGlkZXMgYXQgdGhlIGV2ZW50IHB1Ymxpc2ggYW5kIHRocm93c1xuICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIChjb3JyZWN0IOKAlCB0aGUgZXZlbnQgSVMgY29tbWl0dGVkKSwgYnV0XG4gKiB3aXRob3V0IHRoaXMgcmVwYWlyIHRoZSBlbnRpdHkgd291bGQgc3RheSBtaXNzaW5nIGZvcmV2ZXIgYW5kIHRoZVxuICogaG9vayB3b3VsZCBiZSB1bnJlc29sdmFibGUuXG4gKlxuICogVGhlIGVudGl0eSBNVVNUIGJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgcGVyc2lzdGVkIGNhbm9uaWNhbFxuICogZXZlbnQncyBwYXlsb2FkIOKAlCBOT1QgdGhlIHJldHJ5J3MgYGV2ZW50RGF0YWAg4oCUIG90aGVyd2lzZSBhIHJldHJ5XG4gKiBjYXJyeWluZyBkaWZmZXJlbnQgYG1ldGFkYXRhYCAvIGBpc1dlYmhvb2tgIHdvdWxkIHNpbGVudGx5IGNoYW5nZVxuICogY29tbWl0dGVkIHN0YXRlLiBUaGUgd3JpdGUgdXNlcyBgd3JpdGVFeGNsdXNpdmVgIChjcmVhdGUtaWYtYWJzZW50KVxuICogc28gYSBjb25jdXJyZW50IHdyaXRlciByYWNpbmcgdGhpcyByZXBhaXIgY2Fubm90IGJlIG92ZXJ3cml0dGVuO1xuICogd2hpY2hldmVyIHdyaXRlIGxhbmRzIGZpcnN0LCB0aGUgY29udGVudCBpcyBpZGVudGljYWwgYmVjYXVzZSBib3RoXG4gKiBkZXJpdmUgZnJvbSB0aGUgc2FtZSBwZXJzaXN0ZWQgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIHBlcnNpc3RlZEV2ZW50SWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtydW5JZH0tJHtwZXJzaXN0ZWRFdmVudElkfWA7XG4gIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnZXZlbnRzJyxcbiAgICBjb21wb3NpdGVLZXksXG4gICAgRXZlbnRTY2hlbWEsXG4gICAgdGFnXG4gICk7XG4gIGlmIChcbiAgICAhcGVyc2lzdGVkRXZlbnQgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5ldmVudFR5cGUgIT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgcGVyc2lzdGVkRXZlbnQuY29ycmVsYXRpb25JZCAhPT0gaG9va0lkXG4gICkge1xuICAgIC8vIE5vdGhpbmcgdHJ1c3R3b3J0aHkgdG8gcmVwYWlyIGZyb20uXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ2hvb2tzJyxcbiAgICBob29rSWQsXG4gICAgSG9va1NjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgIC8vIEVudGl0eSBhbHJlYWR5IHByZXNlbnQg4oCUIG5vdCBhbiBvcnBoYW4sIGxlYXZlIGl0IHVudG91Y2hlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXZlbnREYXRhID0gKHBlcnNpc3RlZEV2ZW50LmV2ZW50RGF0YSA/PyB7fSkgYXMge1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogU2VyaWFsaXplZERhdGE7XG4gICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIH07XG4gIGlmICh0eXBlb2YgZXZlbnREYXRhLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBob29rOiBIb29rID0ge1xuICAgIHJ1bklkLFxuICAgIGhvb2tJZCxcbiAgICB0b2tlbjogZXZlbnREYXRhLnRva2VuLFxuICAgIG1ldGFkYXRhOiBldmVudERhdGEubWV0YWRhdGEsXG4gICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICBzcGVjVmVyc2lvbjogcGVyc2lzdGVkRXZlbnQuc3BlY1ZlcnNpb24sXG4gICAgaXNXZWJob29rOiBldmVudERhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgIGlzU3lzdGVtOiBldmVudERhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gIH07XG4gIGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgaG9va0lkLCB0YWcpLFxuICAgIEpTT04uc3RyaW5naWZ5KGhvb2ssIGpzb25SZXBsYWNlciwgMilcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHBpbiBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYCBldmVudElkIGZvciBhIGxlZ2FjeVxuICogY2xhaW0gKG9uZSB3aXRob3V0IGFuIGlubGluZSBgZXZlbnRJZGApLiBUaGUgZmlyc3QgcmV0cnkgdG9cbiAqIGB3cml0ZUV4Y2x1c2l2ZWAgdGhlIHJlY292ZXJ5IG1hcmtlciB3aW5zOyBpdHMgYGNhbmRpZGF0ZUV2ZW50SWRgXG4gKiBiZWNvbWVzIGNhbm9uaWNhbC4gU3Vic2VxdWVudCByZXRyaWVzIHJlYWQgdGhlIG1hcmtlciBhbmQgYWRvcHRcbiAqIGl0cyBgZXZlbnRJZGAuIFRvZ2V0aGVyIHdpdGggdGhlIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBpblxuICogdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2gsIHRoaXMgZ2l2ZXMgdGhlIGxlZ2FjeS1mYWxsYmFjayBwYXRoIHRoZVxuICogc2FtZSBzaW5nbGUtZXZlbnQgY29udmVyZ2VuY2UgZ3VhcmFudGVlIGFzIHRoZSBpbmxpbmUtYGV2ZW50SWRgXG4gKiBmYXN0IHBhdGguXG4gKlxuICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgZm9yIHRoZSBjYWxsZXIgdG8gYWRvcHQsIG9yIGBudWxsYFxuICogaWYgd2UgbG9zdCB0aGUgbWFya2VyIHJhY2UgQU5EIHRoZSByZXN1bHRpbmcgbWFya2VyIGZpbGUgaXNcbiAqIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuIENhbGxlcnMgdHJlYXQgYG51bGxgXG4gKiBhcyBcImdpdmUgdXAsIHRocm93IGBFbnRpdHlDb25mbGljdEVycm9yYFwiIHNvIHRoZSBydW50aW1lJ3NcbiAqIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpcyBhdHRlbXB0IGFuZCBsZXRzXG4gKiBhbm90aGVyIG9uZSB0aHJvdWdoLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdG9rZW46IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIGNhbmRpZGF0ZUV2ZW50SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IG1hcmtlclBhdGggPSBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKGJhc2VkaXIsIHRva2VuLCBydW5JZCwgaG9va0lkKTtcbiAgY29uc3QgbWFya2VyQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHsgZXZlbnRJZDogY2FuZGlkYXRlRXZlbnRJZCB9KTtcbiAgY29uc3Qgd29uID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobWFya2VyUGF0aCwgbWFya2VyQ29udGVudCk7XG4gIGlmICh3b24pIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlRXZlbnRJZDtcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIobWFya2VyUGF0aCk7XG4gIHJldHVybiBleGlzdGluZz8uZXZlbnRJZCA/PyBudWxsO1xufVxuXG4vKipcbiAqIEluLXByb2Nlc3MgcGVyLWtleSBhc3luYyBtdXRleCBiYWNrZWQgYnkgYSBjYWxsZXItc3VwcGxpZWQgYE1hcGAuXG4gKiBVc2VkIGJ5IGBjcmVhdGVFdmVudHNTdG9yYWdlYCB0byBzZXJpYWxpemUgc2FtZS1rZXkgZXZlbnQgd3JpdGVzXG4gKiAoYHN0ZXBfKmAgZm9yIHRoZSBzYW1lIHN0ZXAsIGBob29rX2NyZWF0ZWRgIGZvciB0aGUgc2FtZSBob29rKS5cbiAqIFRoZSBtYXAgaXMgaW5zdGFudGlhdGVkIHBlci1zdG9yYWdlLWluc3RhbmNlIOKAlCBkaWZmZXJlbnRcbiAqIGluc3RhbmNlcyBkbyBOT1Qgc2hhcmUgbG9ja3MsIHNvIHR3byBpbnN0YW5jZXMgc2hhcmluZyBvbmUgZGF0YVxuICogZGlyZWN0b3J5IGJlaGF2ZSBleGFjdGx5IGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZVxuICogbG9ja2luZyBzdGFuZHBvaW50LiBDcm9zcy1pbnN0YW5jZSAvIGNyb3NzLXByb2Nlc3MgYXJiaXRyYXRpb25cbiAqIHJlbGllcyBvbiB0aGUgb24tZGlzayBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gd2l0aEluUHJvY2Vzc0xvY2s8VD4oXG4gIGxvY2tzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PixcbiAga2V5OiBzdHJpbmcsXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IGxvY2tzLmdldChrZXkpO1xuICBjb25zdCB0YXNrQm94OiB7IHRhc2s/OiBQcm9taXNlPFQ+IH0gPSB7fTtcbiAgY29uc3QgdGFzayA9IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBwcmV2aW91cyB0YXNrIHRvIHNldHRsZTsgZG9uJ3QgaW5oZXJpdCBpdHMgZXJyb3JzLlxuICAgICAgYXdhaXQgcHJldi5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChsb2Nrcy5nZXQoa2V5KSA9PT0gdGFza0JveC50YXNrKSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgdGFza0JveC50YXNrID0gdGFzaztcbiAgbG9ja3Muc2V0KGtleSwgdGFzayk7XG4gIHJldHVybiB0YXNrO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIHdhaXRzIGFzc29jaWF0ZWQgd2l0aCBhIHdvcmtmbG93IHJ1bi5cbiAqIENhbGxlZCB3aGVuIGEgcnVuIHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsV2FpdHNGb3JSdW4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdhaXRzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICd3YWl0cycpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMod2FpdHNEaXIpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIC8vIGZpbGVJZHMgbWF5IGNvbnRhaW4gdGFnIHN1ZmZpeGVzIChlLmcuLCBcIndydW5fQUJDLWNvcnJJZC52aXRlc3QtMFwiKVxuICAgIC8vIGJ1dCBzdGFydHNXaXRoIHN0aWxsIG1hdGNoZXMgY29ycmVjdGx5IHNpbmNlIHRoZSB0YWcgaXMgYSBzdWZmaXguXG4gICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtydW5JZH0tYCkpIHtcbiAgICAgIGNvbnN0IHdhaXRQYXRoID0gcGF0aC5qb2luKHdhaXRzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgICBhd2FpdCBkZWxldGVKU09OKHdhaXRQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEgbGlmZWN5Y2xlLWRyaXZlbiBydW4gdXBkYXRlIChydW5fc3RhcnRlZCAvIHJ1bl9jb21wbGV0ZWQgL1xuICogcnVuX2ZhaWxlZCAvIHJ1bl9jYW5jZWxsZWQpIHVuZGVyIHRoZSBzaGFyZWQgcGVyLXJ1biBmaWxlIGxvY2ssXG4gKiByZS1yZWFkaW5nIHRoZSBvbi1kaXNrIHJ1biBpbnNpZGUgdGhlIGxvY2sgc28gYW55IGF0dHJpYnV0ZSB3cml0ZXNcbiAqIHRoYXQgbGFuZGVkIGJldHdlZW4gdGhlIHByZS12YWxpZGF0aW9uIGBjdXJyZW50UnVuYCByZWFkIGFuZCB0aGlzXG4gKiB3cml0ZSBhcmUgcHJlc2VydmVkLiBXaXRob3V0IHRoZSByZS1yZWFkLCBhbiBgZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlc2BcbiAqIGNhbGwgc2FuZHdpY2hlZCBiZXR3ZWVuIHRoZSBsaWZlY3ljbGUgcmVhZCBhbmQgd3JpdGUgd291bGQgYmVcbiAqIHNpbGVudGx5IG92ZXJ3cml0dGVuIGJ5IHRoZSBsaWZlY3ljbGUgd3JpdGUncyBzdGFsZSBhdHRyaWJ1dGUgc25hcHNob3QuXG4gKlxuICogYHByb3Bvc2VkYCBpcyB0aGUgZnVsbHktY29uc3RydWN0ZWQgcnVuIHJvdyB0aGUgY2FsbGVyIHdhbnRzIHRvXG4gKiB3cml0ZSAod2l0aCB0aGUgY29ycmVjdCBkaXNjcmltaW5hdGVkLXVuaW9uIHN0YXR1cyBicmFuY2gpLiBPbmx5IHRoZVxuICogYGF0dHJpYnV0ZXNgIGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZyZXNoZXN0IHZlcnNpb24gaW5zaWRlIHRoZVxuICogbG9jay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2s8VCBleHRlbmRzIFdvcmtmbG93UnVuPihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHJvcG9zZWQ6IFRcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gd2l0aFJ1bkZpbGVMb2NrKHJ1bklkLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSxcbiAgICAgIFdvcmtmbG93UnVuU2NoZW1hXG4gICAgKTtcbiAgICBjb25zdCBuZXh0OiBUID0ge1xuICAgICAgLi4ucHJvcG9zZWQsXG4gICAgICBhdHRyaWJ1dGVzOiBmcmVzaD8uYXR0cmlidXRlcyA/PyBwcm9wb3NlZC5hdHRyaWJ1dGVzLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVKU09OKHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSwgbmV4dCwge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBldmVudHMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZmlsZXN5c3RlbS5cbiAqIEltcGxlbWVudHMgdGhlIFN0b3JhZ2VbJ2V2ZW50cyddIGludGVyZmFjZSB3aXRoIGNyZWF0ZSwgbGlzdCwgYW5kIGxpc3RCeUNvcnJlbGF0aW9uSWQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50c1N0b3JhZ2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBTdG9yYWdlWydldmVudHMnXSB7XG4gIC8vIFBlci1pbnN0YW5jZSBpbi1wcm9jZXNzIG11dGV4ZXMuIFR3byBzdG9yYWdlIGluc3RhbmNlcyBzaGFyaW5nXG4gIC8vIG9uZSBkYXRhIGRpcmVjdG9yeSBnZXQgaW5kZXBlbmRlbnQgbG9jayBtYXBzLCB3aGljaCBtYWtlcyB0aGVtXG4gIC8vIGJlaGF2ZSBsaWtlIHR3byBzZXBhcmF0ZSBPUyBwcm9jZXNzZXMgZnJvbSB0aGUgbG9ja2luZ1xuICAvLyBzdGFuZHBvaW50IOKAlCBjcm9zcy1pbnN0YW5jZSBhcmJpdHJhdGlvbiByZWxpZXMgb24gdGhlIG9uLWRpc2tcbiAgLy8gYHdyaXRlRXhjbHVzaXZlYCBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC4gVGVzdHMgdXNlXG4gIC8vIHRoaXMgdG8gZXhlcmNpc2UgY3Jvc3MtcHJvY2VzcyBjb252ZXJnZW5jZSB3aXRob3V0IHNwYXduaW5nXG4gIC8vIHN1YnByb2Nlc3Nlcy5cbiAgLy9cbiAgLy8gYHN0ZXBMb2Nrc2Agc2VyaWFsaXplcyBzdGVwIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCk6IHNlZSBjb21tZW50IGZ1cnRoZXIgZG93biBpbiB0aGVcbiAgLy8gYGlzU3RlcEV2ZW50YCBicmFuY2guXG4gIC8vXG4gIC8vIGBob29rTG9ja3NgIHNlcmlhbGl6ZXMgYGhvb2tfY3JlYXRlZGAgY2FsbHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCkgc28gdGhlIFwiY2xhaW0gdG9rZW4sIHRoZW4gd3JpdGUgaG9va1xuICAvLyBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG8gY29tcGxldGlvbiBiZWZvcmUgYW5vdGhlclxuICAvLyBpbi1wcm9jZXNzIGludm9jYXRpb24gZW50ZXJzIHRoZSBkZWR1cCBicmFuY2guXG4gIGNvbnN0IHN0ZXBMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuICBjb25zdCBob29rTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNyZWF0ZShydW5JZCwgZGF0YSwgcGFyYW1zKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWVzdC1zdXBwbGllZCBJRHMgYmVmb3JlIHRoZXkncmUgY29uY2F0ZW5hdGVkIGludG9cbiAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBhdHRhY2tzIHdoZXJlIGEgY2xpZW50IHN1cHBsaWVzIHJ1bklkIC8gY29ycmVsYXRpb25JZCB2YWx1ZXMgbGlrZVxuICAgICAgLy8gXCIuLi8uLi8uLi9wYWNrYWdlXCIgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gICAgICAvLyBSdW4gYmVmb3JlIHRha2luZyB0aGUgcGVyLXN0ZXAgbXV0ZXggc28gbWFsZm9ybWVkIGlucHV0cyBmYWlsIGZhc3QuXG4gICAgICAvL1xuICAgICAgLy8gRW1wdHkgYGNvcnJlbGF0aW9uSWRgIHZhbHVlcyBhcmUgYWxzbyByZWplY3RlZCBoZXJlOiB0aGUgZXZlbnRcbiAgICAgIC8vIHNjaGVtYXMgb25seSByZXF1aXJlIGB6LnN0cmluZygpYCwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCByZXF1ZXN0IHdpdGhcbiAgICAgIC8vIGBjb3JyZWxhdGlvbklkOiAnJ2Agd291bGQgc2lsZW50bHkgYmUgd3JpdHRlbiB1bmRlciBhIG1hbGZvcm1lZFxuICAgICAgLy8gY29tcG9zaXRlIGtleSBsaWtlIGAke3J1bklkfS1gLlxuICAgICAgaWYgKHJ1bklkICE9IG51bGwgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBpZiAoJ2NvcnJlbGF0aW9uSWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBzZXJpYWxpemVkIHBlci1zdGVwIHZpYSBhbiBpbi1wcm9jZXNzIG11dGV4XG4gICAgICAvLyBzbyB0aGF0IHRoZSBcImNoZWNrIHN0YXRlLCB0aGVuIHdyaXRlXCIgc2VxdWVuY2UgaW4gc3RlcF9zdGFydGVkIC9cbiAgICAgIC8vIHN0ZXBfY29tcGxldGVkIC8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIGlzIGF0b21pYy4gc3RlcF9jcmVhdGVkXG4gICAgICAvLyBpcyBhbHNvIHNlcmlhbGl6ZWQgc28gZHVwbGljYXRlLWNyZWF0ZSByYWNlcyBkb24ndCBsZWF2ZSBleHRyYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgbG9nLlxuICAgICAgY29uc3QgaXNTdGVwRXZlbnQgPVxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZyc7XG4gICAgICBpZiAoaXNTdGVwRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgIHJldHVybiB3aXRoSW5Qcm9jZXNzTG9jayhzdGVwTG9ja3MsIGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICAvLyBgaG9va19jcmVhdGVkYCBpcyBzZXJpYWxpemVkIHBlci0ocnVuSWQsIGhvb2tJZCkgc28gdGhlXG4gICAgICAvLyBcImNsYWltIHRva2VuLCB3cml0ZSBob29rIGVudGl0eSwgd3JpdGUgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvXG4gICAgICAvLyBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlXG4gICAgICAvLyBzYW1lLWhvb2sgZGVkdXAgYnJhbmNoLiBXaXRob3V0IHRoaXMsIHR3byBzYW1lLXRpY2sgY29uY3VycmVudFxuICAgICAgLy8gY2FsbGVycyBjYW4gcmFjZSBiZXR3ZWVuIHRoZSB3aW5uZXIncyBgd3JpdGVFeGNsdXNpdmUoY2xhaW0pYFxuICAgICAgLy8gYW5kIGB3cml0ZUpTT04oaG9vaylgLCBtYWtpbmcgdGhlIHNlY29uZCBjYWxsZXIgbW9tZW50YXJpbHlcbiAgICAgIC8vIG9ic2VydmUgYSBjbGFpbSB3aXRoIG5vIG1hdGNoaW5nIGhvb2sgZW50aXR5IOKAlCB3aGljaCB0aGVcbiAgICAgIC8vIGNyYXNoLXJlY292ZXJ5IHBhdGggYmVsb3cgd291bGQgbWlzaW50ZXJwcmV0IGFzIGEgcHJpb3IgY3Jhc2hcbiAgICAgIC8vIGFuZCBpbmNvcnJlY3RseSBmYWxsIHRocm91Z2ggdG8gYSBzZWNvbmQgaG9vayBlbnRpdHkgd3JpdGUuXG4gICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2suJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5ob29rYDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKGhvb2tMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbXBsKCk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltcGwoKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgICAvLyBNb3N0IHBhdGhzIHVzZSB0aGUgZnJlc2hseS1nZW5lcmF0ZWQgY2FuZGlkYXRlIGV2ZW50SWQuIFRoZVxuICAgICAgICAvLyBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgcGF0aCBiZWxvdyBtYXkgcmVhc3NpZ24gaXQgdG9cbiAgICAgICAgLy8gdGhlIGNhbm9uaWNhbCBldmVudElkIHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbVxuICAgICAgICAvLyBzbyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAvLyBGb3IgcnVuX2NyZWF0ZWQgZXZlbnRzLCB1c2UgY2xpZW50LXByb3ZpZGVkIHJ1bklkIG9yIGdlbmVyYXRlIG9uZSBzZXJ2ZXItc2lkZVxuICAgICAgICBsZXQgZWZmZWN0aXZlUnVuSWQ6IHN0cmluZztcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICghcnVuSWQgfHwgcnVuSWQgPT09ICcnKSkge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gYHdydW5fJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J1bklkIGlzIHJlcXVpcmVkIGZvciBub24tcnVuX2NyZWF0ZWQgZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBydW5JZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNsaWVudC1wcm92aWRlZCBydW5JZCB0aW1lc3RhbXAgaXMgd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiBydW5JZCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAoXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICd3cnVuXydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjVmVyc2lvbiBpcyBhbHdheXMgc2VudCBieSB0aGUgcnVudGltZSwgYnV0IHdlIHByb3ZpZGUgYSBmYWxsYmFjayBmb3Igc2FmZXR5XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNwZWNWZXJzaW9uID0gZGF0YS5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVDtcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgcnVuIGlzIGluIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgIGNvbnN0IGlzUnVuVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIHN0ZXAgaXMgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTdGVwVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgcnVuIHN0YXRlIGZvciB2YWxpZGF0aW9uIChpZiBub3QgY3JlYXRpbmcgYSBuZXcgcnVuKVxuICAgICAgICAvLyBTa2lwIHJ1biB2YWxpZGF0aW9uIGZvciBzdGVwX2NvbXBsZXRlZCBhbmQgc3RlcF9yZXRyeWluZyAtIHRoZXkgb25seSBvcGVyYXRlXG4gICAgICAgIC8vIG9uIHJ1bm5pbmcgc3RlcHMsIGFuZCBydW5uaW5nIHN0ZXBzIGFyZSBhbHdheXMgYWxsb3dlZCB0byBtb2RpZnkgcmVnYXJkbGVzc1xuICAgICAgICAvLyBvZiBydW4gc3RhdGUuIFRoaXMgb3B0aW1pemF0aW9uIHNhdmVzIGZpbGVzeXN0ZW0gcmVhZHMgcGVyIHN0ZXAgZXZlbnQuXG4gICAgICAgIGxldCBjdXJyZW50UnVuOiBXb3JrZmxvd1J1biB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBza2lwUnVuVmFsaWRhdGlvbkV2ZW50cyA9IFsnc3RlcF9jb21wbGV0ZWQnLCAnc3RlcF9yZXRyeWluZyddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgIT09ICdydW5fY3JlYXRlZCcgJiZcbiAgICAgICAgICAhc2tpcFJ1blZhbGlkYXRpb25FdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIGN1cnJlbnRSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAncnVucycsXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGFydDogcnVuX3N0YXJ0ZWQgb24gbm9uLWV4aXN0ZW50IHJ1biB3aXRoIGV2ZW50RGF0YVxuICAgICAgICAgIC8vIGNyZWF0ZXMgdGhlIHJ1biBmaXJzdCwgc28gdGhlIHF1ZXVlIGNhbiBib290c3RyYXAgYSBydW4gdGhhdFxuICAgICAgICAgIC8vIGZhaWxlZCB0byBjcmVhdGUgZHVyaW5nIHN0YXJ0KCkuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiZcbiAgICAgICAgICAgICFjdXJyZW50UnVuICYmXG4gICAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmV2ZW50RGF0YVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcnVuSW5wdXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgaW5wdXQ/OiBhbnk7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzID8/IHt9KS5tYXAoXG4gICAgICAgICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiAoeyBrZXksIHZhbHVlIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQXRvbWljYWxseSB0cnkgdG8gcHVibGlzaCB0aGUgcnVuIGVudGl0eSBzbyBvbmx5IHRoZSBmaXJzdFxuICAgICAgICAgICAgICAvLyB3cml0ZXIgd2lucywgcHJldmVudGluZyBhIFRPQ1RPVSByYWNlIHdoZXJlIGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBydW5fY3JlYXRlZCBmcm9tIHN0YXJ0KCkgY291bGQgb3ZlcndyaXRlIGEgcnVuIHRoYXQgd2FzXG4gICAgICAgICAgICAgIC8vIGFscmVhZHkgdHJhbnNpdGlvbmVkIHRvICdydW5uaW5nJy5cbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFJ1bjogV29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICAgICAgcnVuUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjcmVhdGVkUnVuLCBqc29uUmVwbGFjZXIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjcmVhdGVkIHRoZSBydW4g4oCUIGFsc28gd3JpdGUgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50LlxuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgZXZlbnRJZDogcnVuQ3JlYXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke3J1bkNyZWF0ZWRFdmVudElkfWA7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY3JlYXRlZENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRFdmVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGNyZWF0ZWRSdW47XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZXhpc3RzIChjb25jdXJyZW50IHJ1bl9jcmVhdGVkIHdvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyByYWNlKS4gUmUtcmVhZCBpdCBzbyBkb3duc3RyZWFtIGxvZ2ljIHNlZXMgdGhlIHJlYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcnVuX2ZhaWxlZCBvbiBhIG5vbi1leGlzdGVudCBydW4gaXMgcmVqZWN0ZWQgdG8gbWF0Y2ggdGhlXG4gICAgICAgIC8vIHBvc3RncmVzIGFuZCB2ZXJjZWwgd29ybGRzLCB3aGljaCBib3RoIHN1cmZhY2UgdGhpcyBhcyBhXG4gICAgICAgIC8vIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciByYXRoZXIgdGhhbiBzaWxlbnRseSBwZXJzaXN0aW5nIGFuXG4gICAgICAgIC8vIGV2ZW50IGZvciBhIHJ1biB0aGF0IHdhcyBuZXZlciBjcmVhdGVkLlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZFUlNJT04gQ09NUEFUSUJJTElUWTogQ2hlY2sgcnVuIHNwZWMgdmVyc2lvblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRm9yIGV2ZW50cyB0aGF0IGhhdmUgZmV0Y2hlZCB0aGUgcnVuLCBjaGVjayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vIFNraXAgZm9yIHJ1bl9jcmVhdGVkIChubyBleGlzdGluZyBydW4pIGFuZCBydW50aW1lIGV2ZW50cyAoc3RlcF9jb21wbGV0ZWQsIHN0ZXBfcmV0cnlpbmcpLlxuICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJ1biByZXF1aXJlcyBhIG5ld2VyIHdvcmxkIHZlcnNpb25cbiAgICAgICAgICBpZiAocmVxdWlyZXNOZXdlcldvcmxkKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuTm90U3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24hLFxuICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fQ1VSUkVOVFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSb3V0ZSB0byBsZWdhY3kgaGFuZGxlciBmb3IgcHJlLWV2ZW50LXNvdXJjaW5nIHJ1bnNcbiAgICAgICAgICBpZiAoaXNMZWdhY3lTcGVjVmVyc2lvbihjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUxlZ2FjeUV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY3VycmVudFJ1bixcbiAgICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWQUxJREFUSU9OOiBUZXJtaW5hbCBzdGF0ZSBhbmQgZXZlbnQgb3JkZXJpbmcgY2hlY2tzXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAgIC8vIFJ1biB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzUnVuVGVybWluYWwoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgY29uc3QgcnVuVGVybWluYWxFdmVudHMgPSBbXG4gICAgICAgICAgICAncnVuX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBJZGVtcG90ZW50IG9wZXJhdGlvbjogcnVuX2NhbmNlbGxlZCBvbiBhbHJlYWR5IGNhbmNlbGxlZCBydW4gaXMgYWxsb3dlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRSdW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGV4aXN0aW5nIHN0YXRlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIGV2ZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGV2ZW50OiBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKSxcbiAgICAgICAgICAgICAgcnVuOiBjdXJyZW50UnVuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQgb24gdGVybWluYWwgcnVucywgdXNlIFJ1bkV4cGlyZWRFcnJvciBzbyB0aGVcbiAgICAgICAgICAvLyBydW50aW1lIGtub3dzIHRvIGV4aXQgd2l0aG91dCByZXRyeWluZy5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGlzIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlciBydW4gc3RhdGUgdHJhbnNpdGlvbnMgYXJlIG5vdCBhbGxvd2VkIG9uIHRlcm1pbmFsIHJ1bnNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBydW5UZXJtaW5hbEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHRyYW5zaXRpb24gcnVuIGZyb20gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGluZyBuZXcgZW50aXRpZXMgb24gdGVybWluYWwgcnVucyBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IGNyZWF0ZSBuZXcgZW50aXRpZXMgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBzZXQgYXR0cmlidXRlcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcgYW5kIHRlcm1pbmFsIHN0YXRlKVxuICAgICAgICAvLyBTdG9yZSBleGlzdGluZ1N0ZXAgc28gd2UgY2FuIHJldXNlIGl0IGxhdGVyIChhdm9pZCBkb3VibGUgcmVhZClcbiAgICAgICAgbGV0IHZhbGlkYXRlZFN0ZXA6IFN0ZXAgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc3RlcEV2ZW50cyA9IFtcbiAgICAgICAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc3RlcEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRXZlbnQgb3JkZXJpbmc6IHN0ZXAgbXVzdCBleGlzdCBiZWZvcmUgdGhlc2UgZXZlbnRzXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgICAgaWYgKGlzU3RlcFRlcm1pbmFsKHZhbGlkYXRlZFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzUnVuVGVybWluYWwoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcC5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IG5vbi1ydW5uaW5nIHN0ZXAgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBgZXZlbnRgIG1heSBiZSByZWFzc2lnbmVkIGxhdGVyIGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBkZWR1cC1yZWNvdmVyeSBicmFuY2ggdG8gc3dhcCBpbiBhIGNhbm9uaWNhbCBldmVudElkIC9cbiAgICAgICAgLy8gY3JlYXRlZEF0IHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbSBzb1xuICAgICAgICAvLyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIGV2ZW50RGF0YSBmcm9tIHJ1bl9zdGFydGVkIOKAlCBpdCBiZWxvbmdzIG9uIHJ1bl9jcmVhdGVkIG9ubHkuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiAnZXZlbnREYXRhJyBpbiBldmVudCkge1xuICAgICAgICAgIGRlbGV0ZSAoZXZlbnQgYXMgYW55KS5ldmVudERhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBlbnRpdHkgY3JlYXRlZC91cGRhdGVkIGZvciBFdmVudFJlc3VsdFxuICAgICAgICBsZXQgcnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0ZXA6IFN0ZXAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob29rOiBIb29rIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd2FpdDogV2FpdCB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCB0aGUgaG9vayBlbnRpdHkgd3JpdGUgaXMgZGVmZXJyZWQgdW50aWxcbiAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggc3VjY2VlZHMsIHNvIGEgcmV0cnkgdGhhdFxuICAgICAgICAvLyBjb2xsaWRlcyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgIGRvZXMgbm90XG4gICAgICAgIC8vIG11dGF0ZSB0aGUgZHVyYWJsZSBob29rIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQuXG4gICAgICAgIC8vIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBjYXJyaWVzIHRoZSBgeyBvdmVyd3JpdGUgfWAgbW9kZVxuICAgICAgICAvLyBjaG9zZW4gYnkgdGhlIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCBhYm92ZSAodW5kZWZpbmVkIGZvclxuICAgICAgICAvLyBmaXJzdCB3cml0ZXJzLCBgeyBvdmVyd3JpdGU6IHRydWUgfWAgZm9yIHJldHJpZXMgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVwYWlyaW5nIGFuIG9ycGhhbmVkIHBhcnRpYWwgd3JpdGUpLlxuICAgICAgICBsZXQgaG9va0VudGl0eVdyaXRlT3B0aW9uczogeyBvdmVyd3JpdGU6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBDcmVhdGUvdXBkYXRlIGVudGl0eSBiYXNlZCBvbiBldmVudCB0eXBlIChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgLy8gUnVuIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBydW5EYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogcnVuRGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1biA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuRGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuRGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHJ1biBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bkRhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgIGlucHV0OiBydW5EYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0cmlidXRlczogcnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgJiYgY3VycmVudFJ1bikge1xuICAgICAgICAgIHJ1biA9IGF3YWl0IHdpdGhSdW5GaWxlTG9jayhlZmZlY3RpdmVSdW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZnJlc2gpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoZGF0YS5ldmVudERhdGEuY2hhbmdlcywge1xuICAgICAgICAgICAgICBleGlzdGluZ0tleXM6IE9iamVjdC5rZXlzKGZyZXNoLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xhaW0gdGhlIGNvcnJlbGF0aW9uIGRlZHVwIGxvY2sgb25seSBhZnRlciB2YWxpZGF0aW9uOiBhXG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUgbXVzdCBsZWF2ZSB0aGUgY29ycmVsYXRpb25JZCB1bmNsYWltZWQgc29cbiAgICAgICAgICAgIC8vIHRoZSBydW50aW1lJ3MgcmV0cnkgb2YgdGhlIHNhbWUgZXZlbnQgaXMgbm90IG1pc3JlcG9ydGVkIGFzXG4gICAgICAgICAgICAvLyBcImFscmVhZHkgZXhpc3RzXCIgd2hpbGUgdGhlIGV2ZW50IHdhcyBuZXZlciB3cml0dGVuICh0aGVcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoZXIgd291bGQgdGhlbiB3YWl0IGZvcmV2ZXIgZm9yIGFuIGV2ZW50IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAvLyBpbiB0aGUgbG9nKS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnd29ya2Zsb3cnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycsXG4gICAgICAgICAgICAgICAgYXR0ckxvY2tOYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoYXR0ckxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICAgIGlmICghYXR0ckNsYWltZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBBdHRyaWJ1dGUgZXZlbnQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAgICAgICAuLi5mcmVzaCxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczogYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIGZyZXNoLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuY2hhbmdlc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH0gYXMgV29ya2Zsb3dSdW47XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkOiBDcmVhdGVzIHN0ZXAgZW50aXR5IHdpdGggc3RhdHVzICdwZW5kaW5nJywgYXR0ZW1wdD0wLCBjcmVhdGVkQXQgc2V0LlxuICAgICAgICAgIC8vIFR3byBjb25jdXJyZW50IGludm9jYXRpb25zIHdpdGggaWRlbnRpY2FsIGNvcnJlbGF0aW9uSWRzIChlLmcuIHRoZVxuICAgICAgICAgIC8vIHNuYXBzaG90IHJ1bnRpbWUncyBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzIGFjcm9zcyByZXBsYXlzKVxuICAgICAgICAgIC8vIG11c3QgYmUgZGVkdXBlZCDigJQgb3RoZXJ3aXNlIGJvdGggd3JpdGVzIHN1Y2NlZWQgYW5kIHRoZSBldmVudCBsb2dcbiAgICAgICAgICAvLyBlbmRzIHVwIHdpdGggZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBlbnRyaWVzLiBUaGUgb3V0ZXJcbiAgICAgICAgICAvLyB3aXRoU3RlcExvY2sgbXV0ZXggc2VyaWFsaXplcyB3aXRoaW4gYSBzaW5nbGUgcHJvY2VzczsgdGhpc1xuICAgICAgICAgIC8vIFRoZSBleGNsdXNpdmUgY29uc3RyYWludCBmaWxlIGFkZGl0aW9uYWxseSBwcm90ZWN0cyBhZ2FpbnN0XG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyByYWNlcyAodHdvIHBucG0gd29ya2VycywgcmVkZWxpdmVyZWQgcXVldWUgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gZXRjLikuIFRoZSBsb3NlciB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgLy8gZXhpc3RpbmcgY2F0Y2ggcGF0aCBjYW4gc3dhbGxvdyBpdCBhbmQgYXZvaWQgZG91YmxlLXF1ZXVpbmcgdGhlXG4gICAgICAgICAgLy8gc3RlcC5cbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RlcERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwRGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgaW5wdXQ6IHN0ZXBEYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkOiBJbmNyZW1lbnRzIGF0dGVtcHQsIHNldHMgc3RhdHVzIHRvICdydW5uaW5nJ1xuICAgICAgICAgIC8vIFNldHMgc3RhcnRlZEF0IG9ubHkgb24gdGhlIGZpcnN0IHN0YXJ0IChub3QgdXBkYXRlZCBvbiByZXRyaWVzKVxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhc24ndCBiZWVuIHJlYWNoZWQgeWV0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlciAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpID4gRGF0ZS5ub3coKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29FYXJseUVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3Qgc3RhcnQgc3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiOiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXRgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDBcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBndWFyZDogcmUtcmVhZCB0aGUgc3RlcCBlbnRpdHkgdG8gY2hlY2sgaWYgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgdGVybWluYWwgc3RhdGUgYmV0d2VlbiB0aGUgdmFsaWRhdGlvbiByZWFkIGFuZCBub3cuXG4gICAgICAgICAgICAvLyBUaGlzIG5hcnJvd3MgdGhlIFRPQ1RPVSB3aW5kb3cgYnV0IGRvZXMgbm90IGZ1bGx5IGVsaW1pbmF0ZSBpdFxuICAgICAgICAgICAgLy8gKHRoZSBsb2NhbCB3b3JsZCBpcyBzaW5nbGUtcHJvY2VzcyAvIGRldi1vbmx5OyB0aGUgcG9zdGdyZXNcbiAgICAgICAgICAgIC8vIHdvcmxkIHVzZXMgU1FMLWxldmVsIGF0b21pYyBndWFyZHMgZm9yIHByb2R1Y3Rpb24pLlxuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgZnJlc2hTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmcmVzaFN0ZXAgJiYgaXNTdGVwVGVybWluYWwoZnJlc2hTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7ZnJlc2hTdGVwLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHN0YXJ0ZWRBdCBvbiB0aGUgZmlyc3Qgc3RhcnRcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiB2YWxpZGF0ZWRTdGVwLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCBhdHRlbXB0IGNvdW50ZXIgb24gZXZlcnkgc3RhcnRcbiAgICAgICAgICAgICAgYXR0ZW1wdDogdmFsaWRhdGVkU3RlcC5hdHRlbXB0ICsgMSxcbiAgICAgICAgICAgICAgLy8gQ2xlYXIgcmV0cnlBZnRlciBub3cgdGhhdCB0aGUgc3RlcCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9jb21wbGV0ZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggb3V0cHV0XG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyByZXN1bHQ6IGFueSB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5yZXN1bHQsXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9mYWlsZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggZXJyb3JcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGZhaWxpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVN0ZXBFcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVN0ZXBFcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmc6IFNldHMgc3RhdHVzIGJhY2sgdG8gJ3BlbmRpbmcnLCByZWNvcmRzIGVycm9yXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBjb25zdCByZXRyeURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXI/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBlcnJvcjogcmV0cnlEYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5RGF0YS5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gSG9vayBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob29rRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXRhZGF0YT86IGFueTtcbiAgICAgICAgICAgIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gICAgICAgICAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEF0b21pY2FsbHkgY2xhaW0gdGhlIHRva2VuIHVzaW5nIGFuIGV4Y2x1c2l2ZS1jcmVhdGUgY29uc3RyYWludCBmaWxlLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBUT0NUT1UgcmFjZSBvZiB0aGUgcHJldmlvdXMgcmVhZC1hbGwtdGhlbi1jaGVjayBhcHByb2FjaC5cbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICBgJHtoYXNoVG9rZW4oaG9va0RhdGEudG9rZW4pfS5qc29uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gUGVyc2lzdCBgZXZlbnRJZGAgaW4gdGhlIGNsYWltIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1cbiAgICAgICAgICAvLyBwcm9jZXNzIHJldHJpZXMgY2FuIGNvbnZlcmdlIG9uIGEgc2luZ2xlIGNhbm9uaWNhbFxuICAgICAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGV2ZW50IHBhdGguIFNlZSB0aGUgcmVjb3ZlcnkgY29tbWVudFxuICAgICAgICAgIC8vIGJlbG93LlxuICAgICAgICAgIGNvbnN0IHRva2VuQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgY29uc3RyYWludFBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgaG9va0lkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlY292ZXJ5IHNoYXBlOiB0aGUgZHVyYWJsZSByZWNvcmQgb2YgYSBzdWNjZXNzZnVsIGhvb2tcbiAgICAgICAgICAvLyBjcmVhdGlvbiBpcyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBhbmQgaG9vayBlbnRpdHkgYXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBldmVudCxcbiAgICAgICAgICAvLyBhbmQgdGhlIHRocmVlIHdyaXRlcyBhcmUgTk9UIGF0b21pYywgc28gYSBjcmFzaCBhdCBhbnlcbiAgICAgICAgICAvLyBwb2ludCBjYW4gbGVhdmUgb25lIG9yIHR3byBvZiB0aGVtIG9uIGRpc2sgd2l0aG91dCB0aGVcbiAgICAgICAgICAvLyBldmVudC4gVHJlYXRpbmcgdGhvc2UgYXMgXCJjb21wbGV0ZWRcIiB3b3VsZCBoYXZlIHRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBzd2FsbG93IHRoZSByZXRyeSBhbmQgcGVybWFuZW50bHkgbG9zZVxuICAgICAgICAgIC8vIHRoZSBgaG9va19jcmVhdGVkYCBldmVudCBmcm9tIHRoZSBsb2cuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXaGVuIHRoZSBkZWR1cCBicmFuY2ggZmlyZXMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLFxuICAgICAgICAgIC8vIHdlIGNvbnZlcmdlIG9uIHRoZSBjYW5vbmljYWwgYGV2ZW50SWRgIHBlcnNpc3RlZCBpbiB0aGVcbiAgICAgICAgICAvLyBjbGFpbSBmaWxlIGJ5IHRoZSBvcmlnaW5hbCAod2lubmluZykgYHdyaXRlRXhjbHVzaXZlYC4gQnlcbiAgICAgICAgICAvLyBhZG9wdGluZyB0aGF0IGV2ZW50SWQgZm9yIHRoaXMgcmV0cnkncyBldmVudCB3cml0ZSDigJQgYW5kXG4gICAgICAgICAgLy8gbGV0dGluZyB0aGUgb3V0ZXIgbm8tb3ZlcndyaXRlIGB3cml0ZUpTT05gIGZvciB0aGUgZXZlbnRcbiAgICAgICAgICAvLyB0aHJvdyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgb24gY29sbGlzaW9uIOKAlCBjb25jdXJyZW50IC9cbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgZWl0aGVyOlxuICAgICAgICAgIC8vICAgLSBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIHBhdGggZXhhY3RseSBvbmNlXG4gICAgICAgICAgLy8gICAgICh0aGUgbG9zZXIncyBgd3JpdGVKU09OYCB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgICAgICAgICAvLyAgICAgd2hpY2ggdGhlIHJ1bnRpbWUncyBleGlzdGluZyBjb25jdXJyZW50LXJlcGxheSBjYXRjaFxuICAgICAgICAgIC8vICAgICBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDIgc3dhbGxvd3MpLCBvclxuICAgICAgICAgIC8vICAgLSBjb252ZXJnZSBvbiBhIHNpbmdsZSByZWNvdmVyeSB3cml0ZSB3aGVuIHRoZSBwcmlvclxuICAgICAgICAgIC8vICAgICBjbGFpbSB3YXMgb3JwaGFuZWQgYnkgYSBjcmFzaCBiZWZvcmUgdGhlIGV2ZW50IGxhbmRlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBsZWdhY3kgZmFsbGJhY2sgKGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBpcyBmb3IgY2xhaW0gZmlsZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyBmaWVsZCB3YXMgYWRkZWQg4oCUXG4gICAgICAgICAgLy8gdGhvc2UgcHJvYmUgdGhlIGV2ZW50IGxvZyBkaXJlY3RseSBhbmQgZmFsbCB0aHJvdWdoIHRvIGFcbiAgICAgICAgICAvLyBmcmVzaC1ldmVudElkIHJlY292ZXJ5IHdyaXRlLiBUaGUgbGVnYWN5IHBhdGggZG9lcyBub3RcbiAgICAgICAgICAvLyBjb252ZXJnZSBhY3Jvc3Mgd29ya2VycyBidXQgY2Fubm90IHJlZ3Jlc3MgYmVoYXZpb3IgZm9yXG4gICAgICAgICAgLy8gZnJlc2hseS13cml0dGVuIGNsYWltcy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBgd2l0aEhvb2tMb2NrYCBpbi1wcm9jZXNzIG11dGV4IGFib3ZlIGtlZXBzIHR3byBzYW1lLVxuICAgICAgICAgIC8vIHRpY2sgaW4tcHJvY2VzcyBjYWxsZXJzIGZyb20gcmFjaW5nIGludG8gdGhpcyBicmFuY2ggd2l0aFxuICAgICAgICAgIC8vIHRoZSB3aW5uZXIgbWlkLXdyaXRlLCBidXQgaXMgbm90IHN1ZmZpY2llbnQgYWNyb3NzXG4gICAgICAgICAgLy8gcHJvY2Vzc2VzIOKAlCB0aGUgZHVyYWJsZSBjb252ZXJnZW5jZSBrZXkgKGBjbGFpbS5ldmVudElkYClcbiAgICAgICAgICAvLyBpcyB3aGF0IGNsb3NlcyB0aGUgY3Jvc3MtcHJvY2VzcyByYWNlLlxuICAgICAgICAgIGxldCB3cml0ZUhvb2tFbnRpdHlXaXRoT3ZlcndyaXRlID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoIXRva2VuQ2xhaW1lZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDbGFpbSA9IGF3YWl0IHJlYWRIb29rVG9rZW5DbGFpbShjb25zdHJhaW50UGF0aCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbT8ucnVuSWQgPT09IGVmZmVjdGl2ZVJ1bklkICYmXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0uaG9va0lkID09PSBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZG9wdCBhIGNhbm9uaWNhbCBldmVudElkIGZvciB0aGUgcmVjb3Zlcnkgd3JpdGUuIFRoZVxuICAgICAgICAgICAgICAvLyBvdXRlciBldmVudCBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApXG4gICAgICAgICAgICAgIC8vIGVpdGhlciBzdWNjZWVkcyAod2UgcHVibGlzaCB0aGUgY2Fub25pY2FsIGV2ZW50LFxuICAgICAgICAgICAgICAvLyByZXBhaXJpbmcgYSBwYXJ0aWFsIHdyaXRlIGxlZnQgYnkgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgIC8vIGNsYWltYW50KSBvciByZXR1cm5zIGBmYWxzZWAgYW5kIHdlIHRocm93XG4gICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAodGhlIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAgIC8vIHB1Ymxpc2hlZCDigJQgYSByZWFsIGR1cGxpY2F0ZSkuIEVpdGhlciB3YXkgdGhlIGxvZ1xuICAgICAgICAgICAgICAvLyBlbmRzIHdpdGggZXhhY3RseSBvbmUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgLy8gYChydW5JZCwgaG9va0lkKWAuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnRJZCBjb21lcyBmcm9tIG9uZSBvZiB0d28gcGxhY2VzOlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gYGV4aXN0aW5nQ2xhaW0uZXZlbnRJZGAgZm9yIGNsYWltcyB3cml0dGVuIGJ5XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHZlcnNpb24gKHRoZSB3cml0ZXIgYWJvdmUgcGVyc2lzdHMgdGhlXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhdG9taWNhbGx5IHdpdGggdGhlIGNsYWltKS5cbiAgICAgICAgICAgICAgLy8gICAgIFRoZSBldmVudElkIGlzIGR1cmFibGUsIHNvIHRoZSBvdXRlclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGFsb25lIGlzIGVub3VnaCB0b1xuICAgICAgICAgICAgICAvLyAgICAgYXJiaXRyYXRlIHB1YmxpY2F0aW9uOiBpdCBmYWlscyBpZmYgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICB3YXMgYWxyZWFkeSBwdWJsaXNoZWQgYXQgdGhhdCBleGFjdCBwYXRoLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gVGhlIHJlY292ZXJ5LW1hcmtlciBzaWRlY2FyIGZvciBsZWdhY3kgY2xhaW1zXG4gICAgICAgICAgICAgIC8vICAgICB3cml0dGVuIGJlZm9yZSBgZXZlbnRJZGAgd2FzIHBlcnNpc3RlZCBpbmxpbmVcbiAgICAgICAgICAgICAgLy8gICAgIGluIHRoZSBjbGFpbS4gVGhlIG1hcmtlciBpcyBpdHNlbGYgYVxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlYCwgc28gdGhlIGZpcnN0IHJldHJ5IHBpbnMgaXRzXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwgYW5kIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHJldHJpZXMgYWRvcHQgaXQuIFdpdGhvdXQgdGhpcywgdHdvIHByb2Nlc3Nlc1xuICAgICAgICAgICAgICAvLyAgICAgYm90aCByZWFkaW5nIHRoZSBzYW1lIGxlZ2FjeSBjbGFpbSB3b3VsZCBlYWNoXG4gICAgICAgICAgICAgIC8vICAgICBnZW5lcmF0ZSB0aGVpciBvd24gZXZlbnRJZCwgbGFuZCB0aGVpclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGNhbGxzIGF0IGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAgICAgcGF0aHMsIGFuZCBhcHBlbmQgdHdvIGV2ZW50cy5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAgIEZvciBsZWdhY3kgY2xhaW1zIHdlIGFsc28gbXVzdCBwcm9iZSB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnQgQkVGT1JFXG4gICAgICAgICAgICAgIC8vICAgICBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQ6IHRoZSBwcmUtdXBncmFkZVxuICAgICAgICAgICAgICAvLyAgICAgd3JpdGVyIG1heSBoYXZlIGFscmVhZHkgcHVibGlzaGVkIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2l0aCBpdHMgb3duIGV2ZW50SWQsIGFuZCB0aGUgbWFya2VyIGhhcyBubyB3YXlcbiAgICAgICAgICAgICAgLy8gICAgIG9mIGtub3dpbmcgdGhhdCBldmVudElkIGFmdGVyIHRoZSBmYWN0LiBXaXRob3V0XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHByb2JlLCBhIHBvc3QtdXBncmFkZSByZXRyeSB3b3VsZCBwaW4gYVxuICAgICAgICAgICAgICAvLyAgICAgZGlmZmVyZW50IGV2ZW50SWQsIHdyaXRlIGEgaG9vayBlbnRpdHksIGFuZFxuICAgICAgICAgICAgICAvLyAgICAgcHVibGlzaCBhIGR1cGxpY2F0ZSBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAgICAgICAgICAgICAgbGV0IGNhbm9uaWNhbEV2ZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xhaW0uZXZlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBleGlzdGluZ0NsYWltLmV2ZW50SWQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgZmluZEV4aXN0aW5nSG9va0NyZWF0ZWRFdmVudElkKFxuICAgICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHVibGlzaGVkRXZlbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZS11cGdyYWRlIHdyaXRlciBtYXkgaGF2ZSBjcmFzaGVkIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgaG9vayBlbnRpdHkgd3JpdGUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyByZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBwZXJzaXN0ZWQgZXZlbnQnc1xuICAgICAgICAgICAgICAgICAgLy8gcGF5bG9hZCBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ24gZHVwbGljYXRlLlxuICAgICAgICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgZXZlbnRJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHBpbm5lZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gTG9zdCB0aGUgbWFya2VyIHJhY2UgYW5kIHRoZSBtYXJrZXIgZmlsZSBpc1xuICAgICAgICAgICAgICAgICAgLy8gdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS5cbiAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGFzIGEgcmVhbCBkdXBsaWNhdGUgc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IGluc3RlYWQgb2Ygcmlza2luZyBkaXZlcmdlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHB1YmxpY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsRXZlbnRJZCA9IHBpbm5lZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlYnVpbGQgYGV2ZW50YCB3aXRoIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBhbmQgYVxuICAgICAgICAgICAgICAvLyBkZXRlcm1pbmlzdGljIGBjcmVhdGVkQXRgIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnRJZFxuICAgICAgICAgICAgICAvLyAoYSBVTElEKSBzbyB0d28gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGV2ZW50XG4gICAgICAgICAgICAgIC8vIHByb2R1Y2UgYnl0ZS1pZGVudGljYWwgY29udGVudC5cbiAgICAgICAgICAgICAgZXZlbnRJZCA9IGNhbm9uaWNhbEV2ZW50SWQ7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbENyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICAgdWxpZFRvRGF0ZShldmVudElkLnJlcGxhY2UoL15ldm50Xy8sICcnKSkgPz8gbm93O1xuICAgICAgICAgICAgICBldmVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY2Fub25pY2FsQ3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDcm9zcy1ob29rIC8gY3Jvc3MtcnVuIGNvbmZsaWN0OiBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAocnVuSWQsIGhvb2tJZCkgaG9sZHMgdGhpcyB0b2tlbi4gQ3JlYXRlIGFcbiAgICAgICAgICAgICAgLy8gaG9va19jb25mbGljdCBldmVudCBzbyB0aGUgd29ya2Zsb3cgY2FuIGZhaWxcbiAgICAgICAgICAgICAgLy8gZ3JhY2VmdWxseSB3aGVuIHRoZSBob29rIGlzIGF3YWl0ZWQuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY29uZmxpY3QnLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ0NsYWltXG4gICAgICAgICAgICAgICAgICAgID8geyBjb25mbGljdGluZ1J1bklkOiBleGlzdGluZ0NsYWltLnJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnRcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoXG4gICAgICAgICAgICAgICAgY29uZmxpY3RFdmVudCxcbiAgICAgICAgICAgICAgICByZXNvbHZlRGF0YVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGNvbmZsaWN0IGV2ZW50IChubyBob29rIGVudGl0eSBjcmVhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIGhvb2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBob29rIGVudGl0eSBub3csIGJ1dCBkZWZlciBpdHMgd3JpdGUgdW50aWxcbiAgICAgICAgICAvLyBBRlRFUiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCBhdCB0aGUgYm90dG9tIG9mIHRoaXNcbiAgICAgICAgICAvLyBmdW5jdGlvbiBjb21taXRzLiBUaGUgcmV0cnkgcGF0aCBjYW4gcmVhY2ggdGhpcyBicmFuY2hcbiAgICAgICAgICAvLyBmb3IgYSBob29rIHdob3NlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSAoYW4gXCJhbHJlYWR5LWNvbW1pdHRlZFxuICAgICAgICAgIC8vIGR1cGxpY2F0ZVwiKTsgaW4gdGhhdCBjYXNlIHRoZSBvdXRlciBgd3JpdGVFeGNsdXNpdmVgXG4gICAgICAgICAgLy8gZm9yIHRoZSBldmVudCB3aWxsIHJldHVybiBmYWxzZSBhbmQgd2Ugd2lsbCB0aHJvd1xuICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYC4gV3JpdGluZyB0aGUgaG9vayBlbnRpdHkgaGVyZVxuICAgICAgICAgIC8vIGZpcnN0IHdvdWxkIG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBkdXJhYmxlIHN0YXRlIHdpdGhcbiAgICAgICAgICAvLyB0aGUgcmV0cnkncyBwYXlsb2FkIChlLmcuIGRpZmZlcmVudCBgbWV0YWRhdGFgIG9yXG4gICAgICAgICAgLy8gYGlzV2ViaG9va2ApIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaCBwcm92ZWQgd2hpY2hcbiAgICAgICAgICAvLyBvdXRjb21lIHdlIGFyZSBpbiDigJQgbGVhdmluZyB0aGUgZW50aXR5IGFuZCBldmVudCBsb2dcbiAgICAgICAgICAvLyBpbmNvbnNpc3RlbnQuIEJ5IGRlZmVycmluZywgdGhlIGVudGl0eSBpcyBvbmx5IHdyaXR0ZW5cbiAgICAgICAgICAvLyB3aGVuIHRoZSBwdWJsaXNoIGFjdHVhbGx5IHN1Y2NlZWRzIChmaXJzdCB3cml0ZXIgb3JcbiAgICAgICAgICAvLyBvcnBoYW4gcmVjb3ZlcnkpLiBTZWUgcHJhbmF5Z3AncyByZXZpZXcgb24gUFIgIzIyOTUgZm9yXG4gICAgICAgICAgLy8gdGhlIGthcnRoaWtzY2FsZTMgcmVwcm8uXG4gICAgICAgICAgaG9vayA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tEYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgICAgICAgICAvLyBVc2UgdGhlIChwb3NzaWJseSBjYW5vbmljYWwpIGV2ZW50J3MgY3JlYXRlZEF0IHNvIHR3b1xuICAgICAgICAgICAgLy8gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGhvb2sgZW50aXR5IHByb2R1Y2UgYnl0ZS1cbiAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjb250ZW50IGR1cmluZyBjb252ZXJnZW5jZS5cbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBob29rIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rRGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICBpc1N5c3RlbTogaG9va0RhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zID0gd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZVxuICAgICAgICAgICAgPyB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgICAgLy8gaG9va19kaXNwb3NlZDogRGVsZXRlcyBob29rIGVudGl0eSwgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZGlzcG9zaW5nIHRoZSBzYW1lIGhvb2sgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBob29rTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZGF0YS5jb3JyZWxhdGlvbklkfS5kaXNwb3NlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgaG9va0xvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZGlzcG9zZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWFkIHRoZSBob29rIHRvIGdldCBpdHMgdG9rZW4gYmVmb3JlIGRlbGV0aW5nXG4gICAgICAgICAgY29uc3QgaG9va1BhdGggPSB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICAvLyBEZWxldGUgdGhlIHRva2VuIGNvbnN0cmFpbnQgZmlsZSB0byBmcmVlIHVwIHRoZSB0b2tlblxuICAgICAgICAgICAgLy8gZm9yIHJldXNlLCBhbmQgZGVsZXRlIHRoaXMgaG9vaydzIHJlY292ZXJ5IG1hcmtlciAoaWZcbiAgICAgICAgICAgIC8vIGFueSkgZm9yIGRpc2sgaHlnaWVuZS4gVGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2hcbiAgICAgICAgICAgIC8vIGluY2x1ZGVzIGAodG9rZW4sIHJ1bklkLCBob29rSWQpYCBzbyBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIGxpZmV0aW1lcyBuZXZlciBjb2xsaWRlLCBidXQgY2xlYW5pbmcgdXAgcmVkdWNlcyBkaXNrXG4gICAgICAgICAgICAvLyBsZWFrIGZvciBob29rcyB0aGF0IGdvIHRocm91Z2ggdGhlIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICBjb25zdCBkaXNwb3NlZENvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgICAgYCR7aGFzaFRva2VuKGV4aXN0aW5nSG9vay50b2tlbil9Lmpzb25gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihkaXNwb3NlZENvbnN0cmFpbnRQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnJ1bklkLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ob29rSWRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihob29rUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyB3YWl0X2NyZWF0ZWQ6IENyZWF0ZXMgd2FpdCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3dhaXRpbmcnLlxuICAgICAgICAgIC8vIEF0b21pYyBjbGFpbSBvbiBhIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIGNvbnN0cmFpbnQgZmlsZVxuICAgICAgICAgIC8vIGVuc3VyZXMgZHVwbGljYXRlIHdhaXRfY3JlYXRlZCBmcm9tIGNvbmN1cnJlbnQgaW52b2NhdGlvbnNcbiAgICAgICAgICAvLyBzdXJmYWNlcyBhcyBFbnRpdHlDb25mbGljdEVycm9yIChyZXBsYWNlcyBhIHByaW9yIFRPQ1RPVVxuICAgICAgICAgIC8vIHJlYWQtdGhlbi1jaGVjayB0aGF0IGNvdWxkIGxldCBib3RoIHdyaXRlcnMgdGhyb3VnaCkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWRgO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF3YWl0Q3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd2FpdERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICByZXN1bWVBdD86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgd2FpdElkOiB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgICAgICAgICByZXN1bWVBdDogd2FpdERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQ6IFRyYW5zaXRpb25zIHdhaXQgdG8gJ2NvbXBsZXRlZCcsIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgd2FpdCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0TG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNvbXBsZXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nV2FpdCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgV2FpdFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFleGlzdGluZ1dhaXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBsb2NrIGZpbGUgd2UganVzdCBjbGFpbWVkIOKAlCB0aGUgd2FpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9ja1BhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGxvY2sgZmlsZSAod3JpdGVFeGNsdXNpdmUgYWJvdmUpIGFscmVhZHkgcHJldmVudHMgY29uY3VycmVudFxuICAgICAgICAgIC8vIGNvbXBsZXRpb25zIOKAlCBubyBhZGRpdGlvbmFsIHN0YXR1cyBjaGVjayBuZWVkZWQuXG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nV2FpdCxcbiAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0LFxuICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogaG9va19yZWNlaXZlZCBldmVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZXZlbnQgbG9nIGJ1dCBkb24ndFxuICAgICAgICAvLyBtb2RpZnkgdGhlIEhvb2sgZW50aXR5ICh3aGljaCBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkIGZpZWxkKVxuXG4gICAgICAgIC8vIFN0b3JlIGV2ZW50IHVzaW5nIGNvbXBvc2l0ZSBrZXkge3J1bklkfS17ZXZlbnRJZH0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGB3cml0ZUV4Y2x1c2l2ZWAgKE9fQ1JFQVR8T19FWENMIHZpYSB0ZW1wLWZpbGUgKyBoYXJkLWxpbmspXG4gICAgICAgIC8vIGlzIHRoZSBjcm9zcy1wcm9jZXNzIGF0b21pYyBwdWJsaXNoIHByaW1pdGl2ZTogaWYgdGhlIGZpbGVcbiAgICAgICAgLy8gYWxyZWFkeSBleGlzdHMsIHJldHVybnMgZmFsc2UgaW5zdGVhZCBvZiBvdmVyd3JpdGluZy4gVGhpc1xuICAgICAgICAvLyBpcyBjcml0aWNhbCBmb3IgdGhlIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBjb252ZXJnZW5jZVxuICAgICAgICAvLyAoYWJvdmUpIOKAlCB0d28gd29ya2VycyB0aGF0IGFkb3B0IHRoZSBzYW1lIGNhbm9uaWNhbCBldmVudElkXG4gICAgICAgIC8vIHJhY2UgaGVyZTsgd2hvZXZlciBsaW5rcyB0aGUgZmlsZSBmaXJzdCB3aW5zLCB0aGUgbG9zZXJcbiAgICAgICAgLy8gdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsIGFuZCB0aGUgcnVudGltZSdzIGV4aXN0aW5nXG4gICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggYXQgc3VzcGVuc2lvbi1oYW5kbGVyLnRzOjE0MlxuICAgICAgICAvLyBzd2FsbG93cyBpdC4gRm9yIGFsbCBvdGhlciBldmVudCB0eXBlcywgZXZlbnRJZHMgYXJlXG4gICAgICAgIC8vIG1vbm90b25pYyBVTElEcyAoZ2xvYmFsbHkgdW5pcXVlIGJ5IGNvbnN0cnVjdGlvbikgc28gYVxuICAgICAgICAvLyBjb2xsaXNpb24gaW5kaWNhdGVzIGEgcmVhbCBidWcgYW5kIEVudGl0eUNvbmZsaWN0RXJyb3IgaXNcbiAgICAgICAgLy8gYWxzbyB0aGUgcmlnaHQgc3VyZmFjZSDigJQgc2FtZSBzaGFwZSBhcyBzdGVwX2NyZWF0ZWQnc1xuICAgICAgICAvLyBjbGFpbS1maWxlIGJlaGF2aW9yLlxuICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgIGNvbnN0IGV2ZW50UHVibGlzaGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBqc29uUmVwbGFjZXIsIDIpXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID0gYWxsRXZlbnRzLmRhdGE7XG4gICAgICAgICAgY3Vyc29yID0gYWxsRXZlbnRzLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gYWxsRXZlbnRzLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|