footprintjs 9.19.1 → 9.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +12 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +51 -11
- package/dist/esm/lib/engine/handlers/servedSubflowResults.d.ts +29 -0
- package/dist/esm/lib/engine/handlers/servedSubflowResults.js +49 -0
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +7 -4
- package/dist/esm/lib/engine/types.d.ts +21 -0
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +6 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +9 -2
- package/dist/lib/engine/handlers/SubflowExecutor.js +51 -11
- package/dist/lib/engine/handlers/servedSubflowResults.js +54 -0
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +7 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/lib/runner/FlowChartExecutor.js +9 -2
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +12 -0
- package/dist/types/lib/engine/handlers/servedSubflowResults.d.ts +29 -0
- package/dist/types/lib/engine/types.d.ts +21 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +6 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -63,7 +63,7 @@ run: executor.run (FlowChartExecutor.ts:1455): re-entrancy guard → fresh runId
|
|
|
63
63
|
per stage: executeNodeStep stamps runtimeStageId (:818) → StageRunner.run: scopeFactory → onStageStart → stage fn (writes stage into TransactionBuffer via StageContext.setObject; onWrite fires live) → onStageEnd → traverser calls context.commit() (:1094) → onCommit → onStageExecuted (narrative flushes buffered ops here).
|
|
64
64
|
decider: DeciderHandler.prepareDispatch (:89) — runs stage, **commits BEFORE branch resolution** (:124), matches branchId, fires onDecision(+evidence) → onStageExecuted('decider') → flat hop with InvokerStamp.
|
|
65
65
|
loop: Phase 6 sees isLoopRef → ContinuationResolver.resolveTarget (:107): id-map lookup, iteration guard (max 1000), onLoop → hop; zero stack, state carries forward (never rewound).
|
|
66
|
-
end: onRunEnd (throw → onRunFailed; pause → neither) → deferred terminalFlush → getSnapshot() = {sharedState (LIVE view; dev-mode frozen clone), initialState (the fold base), commitLog (detached+frozen), executionTree, subflowResults (dual-keyed), recorders}.
|
|
66
|
+
end: onRunEnd (throw → onRunFailed; pause → neither) → deferred terminalFlush → getSnapshot() = {sharedState (LIVE view; dev-mode frozen clone), initialState (the fold base), commitLog (detached+frozen), executionTree, subflowResults (dual-keyed; `globalContext` = the subflow's LIVE heap, or under `redact: true` its own nested mirror — 9.20.0, `servedSubflowResults`), recorders}.
|
|
67
67
|
|
|
68
68
|
## Backtracking
|
|
69
69
|
Seven mechanisms, no state rollback anywhere: **M1** TransactionBuffer staging + net-change commit — commit-on-error by design, explicitly NOT rollback (TransactionBuffer.ts:13-18; error path commits then rethrows). **M2** Pause/Resume checkpointing — the only resume-from-prior-point; TWO raise shapes, ONE checkpoint: `addPausableFunction` (resume runs `resumeFn`) and `interrupt(scope, payload)` (resume RE-RUNS THE STAGE FUNCTION FROM ITS TOP — stages are atomic; the answer returns out of the `interrupt()` call via a WeakMap keyed by the scope), discriminated by `checkpoint.pausedBy`; checkpoint is one detached structuredClone; resume rebuilds the cursor from pausedStageId+subflowPath and only overrides the LEAF subflow root (2+-deep pause re-executes outer pre-mount stages). **M3** commit-log replay (EventLog.materialise, commitValueAt — required under delta mode). **M4** loopTo re-entry — forward execution over accumulated state, bounded by maxIterations + dynamicNextHops. **M5** causalChain backward slicing (read-only analysis; honesty flags for untracked reads; `edgeAttribution: 'per-write'` refines edges via `TraceEntry.readKeys` when the writeProvenance dial recorded them — worklist, subset-of-ceiling safe). **M6 (query layer)** slice/ — variable-first triage: sliceForKey + append-fold element provenance + the ONLY safe serializations (sliceToJSON/formatSlice — never JSON.stringify a slice root). **M7 (read-time cursor)** time-travel/ — `timeTravel(snapshot)` walks stops over the finished log with `stateAt()` folding M3's replay at each one (base = `RuntimeSnapshot.initialState`, which now travels with the log); it is a READER, never a second live cursor, and `drill(mount)` opens a separate cursor over a subflow's own isolated log. 9.18.0: `timeTravel([paused, resumed])` chains a cross-executor M2 resume into ONE axis — the resumed leg's `initialState` (= the state at the pause) restarts the fold, commit indices stay run-local (`Stop.sourceIdx` names the leg), and the chain is refused unless the never-reset execution counter is monotonic across legs. Deep dive + step tables: [.claude/rules/backtracking.md](.claude/rules/backtracking.md).
|
|
@@ -31,4 +31,16 @@ export declare class SubflowExecutor<TOut = any, TScope = any> {
|
|
|
31
31
|
* 5. Stores execution data for debugging/visualization
|
|
32
32
|
*/
|
|
33
33
|
executeSubflow(node: StageNode<TOut, TScope>, parentContext: StageContext, breakFlag: BreakFlag, branchPath: string | undefined, subflowResultsMap: Map<string, SubflowResult>, parentTraversalContext?: TraversalContext): Promise<any>;
|
|
34
|
+
/**
|
|
35
|
+
* Push the run's redaction into a nested root the way the dials are pushed
|
|
36
|
+
* — the triplicated propagation (root install · createNext/createChild ·
|
|
37
|
+
* this hop). Called TWICE on purpose: on the runtime's first root, so the
|
|
38
|
+
* SEED commit (`history[0]`) retains and mirrors under the policy, and on
|
|
39
|
+
* the FINAL root after the seeding block replaces it. Rule before mirror,
|
|
40
|
+
* as the executor orders them (the mirror's seed is scrubbed with the rule;
|
|
41
|
+
* for a nested runtime that seed is empty — its input arrives as a commit).
|
|
42
|
+
* `enableRedactedMirror` is idempotent, so the second call only re-installs
|
|
43
|
+
* the ONE mirror on the fresh root.
|
|
44
|
+
*/
|
|
45
|
+
private inheritRedaction;
|
|
34
46
|
}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* and abort signals all work inside subflows automatically.
|
|
14
14
|
*/
|
|
15
15
|
import { isPauseSignal } from '../../pause/types.js';
|
|
16
|
+
import { rememberRedactedSubflowState } from './servedSubflowResults.js';
|
|
16
17
|
import { applyOutputMapping, getInitialScopeValues, seedSubflowGlobalStore } from './SubflowInputMapper.js';
|
|
17
18
|
export class SubflowExecutor {
|
|
18
19
|
deps;
|
|
@@ -67,6 +68,14 @@ export class SubflowExecutor {
|
|
|
67
68
|
// the seed COMMITTED below both retain under it; the subflow's stages
|
|
68
69
|
// still compute on the real `mappedInput` (their frozen args).
|
|
69
70
|
const redactionRule = parentContext.getRedactionRule?.();
|
|
71
|
+
// The run's redacted mirror (9.20.0): the parent-mount context carries it
|
|
72
|
+
// exactly when the root enabled one (`ExecutionRuntime.enableRedactedMirror`
|
|
73
|
+
// under a policy, inherited by createNext/createChild) — read the way the
|
|
74
|
+
// dials are. When it does, the nested runtime keeps a mirror of its own,
|
|
75
|
+
// so the subflow's SERVED state is a mirror too — the fold of its own
|
|
76
|
+
// scrubbed log — and never a second scrub. No policy: no mirror, no
|
|
77
|
+
// allocation, and the served state is the raw heap it always was.
|
|
78
|
+
const keepsMirror = parentContext.getRedactedSharedMemory?.() !== undefined;
|
|
70
79
|
// Narrative receives the RETAINED form of the mapped input — an
|
|
71
80
|
// inputMapper may inject values from anywhere, so the seed is scrubbed
|
|
72
81
|
// under the policy before any recorder sees it. Same object when nothing
|
|
@@ -96,10 +105,10 @@ export class SubflowExecutor {
|
|
|
96
105
|
const seedValues = isResumeForThisSubflow ? resumeCapture : mappedInput;
|
|
97
106
|
if (Object.keys(seedValues).length > 0) {
|
|
98
107
|
// The seed is committed as the subflow's `history[0]` by its root
|
|
99
|
-
// context, not by a facade — install the rule
|
|
100
|
-
// the seed commit retains under the policy like every
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
// context, not by a facade — install the rule (and the mirror) on THAT
|
|
109
|
+
// context first so the seed commit retains under the policy like every
|
|
110
|
+
// other write, and lands in the mirror as the placeholder.
|
|
111
|
+
this.inheritRedaction(nestedRuntime, nestedRootContext, redactionRule, keepsMirror);
|
|
103
112
|
seedSubflowGlobalStore(nestedRuntime, seedValues);
|
|
104
113
|
// Refresh rootStageContext so WriteBuffer sees committed data
|
|
105
114
|
const StageContextClass = nestedRootContext.constructor;
|
|
@@ -119,11 +128,10 @@ export class SubflowExecutor {
|
|
|
119
128
|
if (parentReadTracking !== undefined && parentReadTracking !== 'full') {
|
|
120
129
|
nestedRootContext.useReadTracking(parentReadTracking);
|
|
121
130
|
}
|
|
122
|
-
// Redaction rule (9.19.0): same hop as the dials,
|
|
123
|
-
// nested root (the seeding block above may have
|
|
124
|
-
// stage context the subflow creates inherits
|
|
125
|
-
|
|
126
|
-
nestedRootContext.useRedactionRule(redactionRule);
|
|
131
|
+
// Redaction rule (9.19.0) and mirror (9.20.0): same hop as the dials,
|
|
132
|
+
// applied to the FINAL nested root (the seeding block above may have
|
|
133
|
+
// replaced it) so every stage context the subflow creates inherits both.
|
|
134
|
+
this.inheritRedaction(nestedRuntime, nestedRootContext, redactionRule, keepsMirror);
|
|
127
135
|
// Write-tracking policy (#13c-A): same inheritance hop as readTracking
|
|
128
136
|
// above — subflow runtimes are isolated, so the parent-mount context's
|
|
129
137
|
// mode is pushed into the FINAL nested root with the same duck-type
|
|
@@ -296,6 +304,18 @@ export class SubflowExecutor {
|
|
|
296
304
|
if (subflowDef && subflowDef.buildTimeStructure) {
|
|
297
305
|
subflowResult.pipelineStructure = subflowDef.buildTimeStructure;
|
|
298
306
|
}
|
|
307
|
+
// The served state (9.20.0): the nested mirror's final state, remembered
|
|
308
|
+
// BESIDE the result — `treeContext.globalContext` stays the live heap for
|
|
309
|
+
// the plain snapshot and the checkpoint; `getSnapshot({ redact: true })`
|
|
310
|
+
// substitutes the mirror through `servedSubflowResults`. Absent without
|
|
311
|
+
// a policy. The exit event below carries the same served view; without a
|
|
312
|
+
// mirror it carries the heap retained under the rule (per-call marks
|
|
313
|
+
// alone keep no mirror) — the same object when nothing is redacted.
|
|
314
|
+
const rawState = subflowResult.treeContext.globalContext;
|
|
315
|
+
const mirrorState = nestedRuntime.redactedStore?.getState();
|
|
316
|
+
if (mirrorState !== undefined)
|
|
317
|
+
rememberRedactedSubflowState(subflowResult, mirrorState);
|
|
318
|
+
const exitState = mirrorState ?? (redactionRule ? redactionRule.retainRecord(rawState) : rawState);
|
|
299
319
|
subflowResultsMap.set(subflowId, subflowResult);
|
|
300
320
|
// Additive per-execution key (design: docs/design/subflow-commit-visibility.md). A LOOPING
|
|
301
321
|
// subflow re-enters with the SAME subflowId, so the path key above is OVERWRITTEN each
|
|
@@ -312,12 +332,32 @@ export class SubflowExecutor {
|
|
|
312
332
|
parentContext.addFlowDebugMessage('subflow', `Exiting ${subflowName} subflow`, {
|
|
313
333
|
targetStage: subflowId,
|
|
314
334
|
});
|
|
315
|
-
this.deps.narrativeGenerator.onSubflowExit(subflowName, subflowId, parentTraversalContext,
|
|
335
|
+
this.deps.narrativeGenerator.onSubflowExit(subflowName, subflowId, parentTraversalContext, exitState);
|
|
316
336
|
parentContext.commit();
|
|
317
337
|
if (subflowError) {
|
|
318
338
|
throw subflowError;
|
|
319
339
|
}
|
|
320
340
|
return subflowOutput;
|
|
321
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* Push the run's redaction into a nested root the way the dials are pushed
|
|
344
|
+
* — the triplicated propagation (root install · createNext/createChild ·
|
|
345
|
+
* this hop). Called TWICE on purpose: on the runtime's first root, so the
|
|
346
|
+
* SEED commit (`history[0]`) retains and mirrors under the policy, and on
|
|
347
|
+
* the FINAL root after the seeding block replaces it. Rule before mirror,
|
|
348
|
+
* as the executor orders them (the mirror's seed is scrubbed with the rule;
|
|
349
|
+
* for a nested runtime that seed is empty — its input arrives as a commit).
|
|
350
|
+
* `enableRedactedMirror` is idempotent, so the second call only re-installs
|
|
351
|
+
* the ONE mirror on the fresh root.
|
|
352
|
+
*/
|
|
353
|
+
inheritRedaction(runtime, root, rule, keepsMirror) {
|
|
354
|
+
if (rule)
|
|
355
|
+
root.useRedactionRule(rule);
|
|
356
|
+
if (!keepsMirror)
|
|
357
|
+
return;
|
|
358
|
+
runtime.enableRedactedMirror?.();
|
|
359
|
+
if (runtime.redactedStore)
|
|
360
|
+
root.useRedactedMirror(runtime.redactedStore);
|
|
361
|
+
}
|
|
322
362
|
}
|
|
323
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUcsTUFBTSxPQUFPLGVBQWU7SUFFaEI7SUFDQTtJQUZWLFlBQ1UsSUFBK0IsRUFDL0IsZ0JBQXVEO1FBRHZELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBdUM7SUFDOUQsQ0FBQztJQUVKOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsSUFBNkIsRUFDN0IsYUFBMkIsRUFDM0IsU0FBb0IsRUFDcEIsVUFBOEIsRUFDOUIsaUJBQTZDLEVBQzdDLHNCQUF5QztRQUV6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUVsRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFlBQVksV0FBVyxVQUFVLEVBQUU7WUFDOUUsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLEVBQUU7UUFDRixpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLCtEQUErRDtRQUMvRCx5REFBeUQ7UUFDekQsbUVBQW1FO1FBQ25FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUM5QyxJQUFJLFdBQVcsR0FBNEIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sYUFB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QUFXLEVBQ1gsU0FBUyxFQUNULHNCQUFzQixFQUN0QixhQUFhLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FDekMsQ0FBQztRQUVGLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV2QixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBSRVNVTUUgUEFUSCBOT1RFOiB3aGVuIGBkZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWVgIGNhcnJpZXMgYVxuICAgIC8vIGNhcHR1cmUgZm9yIFRISVMgc3ViZmxvdyBpZCwgd2UgU0tJUCB0aGUgaW5wdXRNYXBwZXIgZW50aXJlbHkuXG4gICAgLy8gVGhlIGNhcHR1cmUgaXMgdGhlIHBvc3QtaW5wdXQgcHJlLXBhdXNlIG1lbW9yeSDigJQgcnVubmluZyB0aGVcbiAgICAvLyBtYXBwZXIgYWdhaW4gd291bGQgY2xvYmJlciBwb3N0LWlucHV0IHdyaXRlcyAoaGlzdG9yeSxcbiAgICAvLyBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBwYXJlbnQncyBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gdGhpcy5kZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU/LltzdWJmbG93SWRdO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW91bnRPcHRpb25zICYmICFpc1Jlc3VtZUZvclRoaXNTdWJmbG93KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgbWFwcGVkSW5wdXQgPSBnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucyk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIG1hcHBlZElucHV0IGlzIGNhcHR1cmVkIGluIFN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQgZm9yIGRlYnVnZ2luZ1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ2lucHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJ1bidzIHJlZGFjdGlvbiBydWxlICg5LjE5LjApLCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGNvbnRleHRcbiAgICAvLyB0aGUgd2F5IHRoZSBkaWFscyBhcmUgKGR1Y2stdHlwZWQ6IHRoaXMgc2VjdGlvbiBjb25zdHJ1Y3RzIGl0cyBydW50aW1lXG4gICAgLy8gZHluYW1pY2FsbHkgdG8gYXZvaWQgdGhlIGNpcmN1bGFyIGltcG9ydCkuIFRoZSBzZWVkIG5hcnJhdGVkIGJlbG93IGFuZFxuICAgIC8vIHRoZSBzZWVkIENPTU1JVFRFRCBiZWxvdyBib3RoIHJldGFpbiB1bmRlciBpdDsgdGhlIHN1YmZsb3cncyBzdGFnZXNcbiAgICAvLyBzdGlsbCBjb21wdXRlIG9uIHRoZSByZWFsIGBtYXBwZWRJbnB1dGAgKHRoZWlyIGZyb3plbiBhcmdzKS5cbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcGFyZW50Q29udGV4dC5nZXRSZWRhY3Rpb25SdWxlPy4oKTtcbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydClcbiAgICBjb25zdCBFeGVjdXRpb25SdW50aW1lQ2xhc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5jb25zdHJ1Y3RvciBhcyBuZXcgKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgaWQ6IHN0cmluZyxcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKG5vZGUubmFtZSwgbm9kZS5pZCk7XG4gICAgbGV0IG5lc3RlZFJvb3RDb250ZXh0ID0gbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgaW5zdGFsbCB0aGUgcnVsZSBvbiBUSEFUIGNvbnRleHQgZmlyc3Qgc29cbiAgICAgIC8vIHRoZSBzZWVkIGNvbW1pdCByZXRhaW5zIHVuZGVyIHRoZSBwb2xpY3kgbGlrZSBldmVyeSBvdGhlciB3cml0ZS5cbiAgICAgIGlmIChyZWRhY3Rpb25SdWxlKSBuZXN0ZWRSb290Q29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHJlZGFjdGlvblJ1bGUpO1xuICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzKTtcbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhXG4gICAgICBjb25zdCBTdGFnZUNvbnRleHRDbGFzcyA9IG5lc3RlZFJvb3RDb250ZXh0LmNvbnN0cnVjdG9yIGFzIG5ldyAoLi4uYXJnczogYW55W10pID0+IFN0YWdlQ29udGV4dDtcbiAgICAgIG5lc3RlZFJvb3RDb250ZXh0ID0gbmV3IFN0YWdlQ29udGV4dENsYXNzKFxuICAgICAgICAnJyxcbiAgICAgICAgbmVzdGVkUm9vdENvbnRleHQuc3RhZ2VOYW1lLFxuICAgICAgICBuZXN0ZWRSb290Q29udGV4dC5zdGFnZUlkLFxuICAgICAgICBuZXN0ZWRSdW50aW1lLmdsb2JhbFN0b3JlLFxuICAgICAgICAnJyxcbiAgICAgICAgbmVzdGVkUnVudGltZS5leGVjdXRpb25IaXN0b3J5LFxuICAgICAgKTtcbiAgICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IG5lc3RlZFJvb3RDb250ZXh0O1xuICAgIH1cblxuICAgIC8vIFJlYWQtdHJhY2tpbmcgcG9saWN5ICgjMTQpOiBzdWJmbG93cyBnZXQgYW4gSVNPTEFURUQgcnVudGltZSwgc28gdGhlXG4gICAgLy8gZXhlY3V0b3ItbGV2ZWwgcG9saWN5IGRvZXNuJ3QgcmVhY2ggdGhlbSB2aWEgdGhlIHJvb3QgY29udGV4dCBjaGFpbi5cbiAgICAvLyBJbmhlcml0IGl0IGZyb20gdGhlIHBhcmVudC1tb3VudCBjb250ZXh0ICh3aGljaCBpbmhlcml0ZWQgaXQgZnJvbSBJVFNcbiAgICAvLyByb290IHZpYSBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkKSDigJQgYXBwbGllZCB0byB0aGUgRklOQUwgbmVzdGVkIHJvb3QsXG4gICAgLy8gYWZ0ZXIgdGhlIHNlZWRpbmcgYmxvY2sgYWJvdmUgbWF5IGhhdmUgcmVwbGFjZWQgaXQuIE5lc3RlZCBzdWJmbG93c1xuICAgIC8vIGNoYWluIHRoZSBzYW1lIHdheSwgb25lIGhvcCBwZXIgbW91bnQuIE9wdGlvbmFsLWNoYWluZWQgYmVjYXVzZSB0aGlzXG4gICAgLy8gc2VjdGlvbiBpcyBkdWNrLXR5cGVkIGJ5IGRlc2lnbiAoZHluYW1pYyBjb25zdHJ1Y3Rpb24gdG8gYXZvaWQgdGhlXG4gICAgLy8gY2lyY3VsYXIgaW1wb3J0KSDigJQgYW5kIHNraXBwZWQgYXQgdGhlIGRlZmF1bHQgJ2Z1bGwnLCB3aGVyZSB0aGUgZnJlc2hcbiAgICAvLyBuZXN0ZWQgY29udGV4dCBpcyBhbHJlYWR5IGNvcnJlY3QsIHNvIHRoZSBkZWZhdWx0IHBhdGggZG9lcyB6ZXJvIHdvcmsuXG4gICAgY29uc3QgcGFyZW50UmVhZFRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRSZWFkVHJhY2tpbmc/LigpO1xuICAgIGlmIChwYXJlbnRSZWFkVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRSZWFkVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlUmVhZFRyYWNraW5nKHBhcmVudFJlYWRUcmFja2luZyk7XG4gICAgfVxuXG4gICAgLy8gUmVkYWN0aW9uIHJ1bGUgKDkuMTkuMCk6IHNhbWUgaG9wIGFzIHRoZSBkaWFscywgYXBwbGllZCB0byB0aGUgRklOQUxcbiAgICAvLyBuZXN0ZWQgcm9vdCAodGhlIHNlZWRpbmcgYmxvY2sgYWJvdmUgbWF5IGhhdmUgcmVwbGFjZWQgaXQpIHNvIGV2ZXJ5XG4gICAgLy8gc3RhZ2UgY29udGV4dCB0aGUgc3ViZmxvdyBjcmVhdGVzIGluaGVyaXRzIHRoZSBydW4ncyBydWxlLlxuICAgIGlmIChyZWRhY3Rpb25SdWxlKSBuZXN0ZWRSb290Q29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHJlZGFjdGlvblJ1bGUpO1xuXG4gICAgLy8gV3JpdGUtdHJhY2tpbmcgcG9saWN5ICgjMTNjLUEpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyByZWFkVHJhY2tpbmdcbiAgICAvLyBhYm92ZSDigJQgc3ViZmxvdyBydW50aW1lcyBhcmUgaXNvbGF0ZWQsIHNvIHRoZSBwYXJlbnQtbW91bnQgY29udGV4dCdzXG4gICAgLy8gbW9kZSBpcyBwdXNoZWQgaW50byB0aGUgRklOQUwgbmVzdGVkIHJvb3Qgd2l0aCB0aGUgc2FtZSBkdWNrLXR5cGVcbiAgICAvLyBndWFyZCBhbmQgdGhlIHNhbWUgc2tpcC1hdC1kZWZhdWx0IGZhc3QgcGF0aC5cbiAgICBjb25zdCBwYXJlbnRXcml0ZVRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVRyYWNraW5nPy4oKTtcbiAgICBpZiAocGFyZW50V3JpdGVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFdyaXRlVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlV3JpdGVUcmFja2luZyhwYXJlbnRXcml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXQtdmFsdWVzIGVuY29kaW5nICgjMTNjLUIpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyB0aGUgdHdvXG4gICAgLy8gdHJhY2tpbmcgZGlhbHMgYWJvdmUg4oCUIHN1YmZsb3cgcnVudGltZXMgYXJlIGlzb2xhdGVkLCBzbyB0aGVcbiAgICAvLyBwYXJlbnQtbW91bnQgY29udGV4dCdzIG1vZGUgaXMgcHVzaGVkIGludG8gdGhlIEZJTkFMIG5lc3RlZCByb290IHdpdGhcbiAgICAvLyB0aGUgc2FtZSBkdWNrLXR5cGUgZ3VhcmQgYW5kIHRoZSBzYW1lIHNraXAtYXQtZGVmYXVsdCBmYXN0IHBhdGgsIHNvXG4gICAgLy8gbmVzdGVkIGNoYXJ0cyBjb21taXQgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHBhcmVudC5cbiAgICBjb25zdCBwYXJlbnRDb21taXRWYWx1ZXMgPSBwYXJlbnRDb250ZXh0LmdldENvbW1pdFZhbHVlcz8uKCk7XG4gICAgaWYgKHBhcmVudENvbW1pdFZhbHVlcyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudENvbW1pdFZhbHVlcyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VDb21taXRWYWx1ZXMocGFyZW50Q29tbWl0VmFsdWVzKTtcbiAgICB9XG5cbiAgICAvLyBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpOiBmb3VydGggZGlhbCwgc2FtZSBpbmhlcml0YW5jZSBob3Ag4oCUXG4gICAgLy8gZHVjay10eXBlIGd1YXJkLCBza2lwLWF0LWRlZmF1bHQgKCdvZmYnKSBmYXN0IHBhdGgsIHNvIG5lc3RlZCBjaGFydHNcbiAgICAvLyBzdGFtcCBUcmFjZUVudHJ5LnJlYWRLZXlzIGV4YWN0bHkgd2hlbiB0aGUgcGFyZW50IGRvZXMuXG4gICAgY29uc3QgcGFyZW50V3JpdGVQcm92ZW5hbmNlID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVByb3ZlbmFuY2U/LigpO1xuICAgIGlmIChwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09ICdvZmYnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VXcml0ZVByb3ZlbmFuY2UocGFyZW50V3JpdGVQcm92ZW5hbmNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgbGV0IHN1YmZsb3dFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBzbmFwc2hvdCB0aGUgbmVzdGVkIHJ1bnRpbWUncyBgc2hhcmVkU3RhdGVgXG4gICAgICAvLyBvbnRvIHRoZSBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LFxuICAgICAgLy8gdGhlIG91dGVyIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT25cbiAgICAgIC8vIHJlc3VtZSwgd2UnbGwgcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlXG4gICAgICAvLyBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzbmFwID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuICAgICAgICAgIC8vIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZVxuICAgICAgICAgIC8vIHRpbWUgKGFmdGVyIGV2ZXJ5IGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLiBDYXN0XG4gICAgICAgICAgLy8gaXMgc2FmZSDigJQgU2hhcmVkTWVtb3J5IHNuYXBzaG90IHJldHVybnMgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIHNuYXAuc2hhcmVkU3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBTbmFwc2hvdCBmYWlsdXJlIHNob3VsZG4ndCBtYXNrIHRoZSBwYXVzZSDigJQgbGV0IHRoZSBwYXVzZVxuICAgICAgICAgIC8vIGJ1YmJsZSB1cDsgcmVzdW1lIHdpbGwgZmFsbCBiYWNrIHRvIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVcbiAgICAgICAgICAvLyAodGhlIHBhcmVudCBzY29wZSkgZm9yIHRoaXMgc3ViZmxvdydzIGtleXMuXG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSBlcnJvcjtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LmJyYW5jaElkICE9PSAnJyAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKGVmZmVjdGl2ZU91dHB1dCwgcGFyZW50U2NvcGUsIG91dHB1dENvbnRleHQsIG1vdW50T3B0aW9ucyk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KHN1YmZsb3dJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgLy8gQWRkaXRpdmUgcGVyLWV4ZWN1dGlvbiBrZXkgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIEEgTE9PUElOR1xuICAgIC8vIHN1YmZsb3cgcmUtZW50ZXJzIHdpdGggdGhlIFNBTUUgc3ViZmxvd0lkLCBzbyB0aGUgcGF0aCBrZXkgYWJvdmUgaXMgT1ZFUldSSVRURU4gZWFjaFxuICAgIC8vIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQ6IGl0IGhvbGRzIHRoZSBMQVNUIGl0ZXJhdGlvbiDigJQgd2hhdCBnZXRTdWJ0cmVlU25hcHNob3QvbGlzdFN1YmZsb3dQYXRoc1xuICAgIC8vIGFuZCB0aGUgZXVpIGZhbGxiYWNrIHNlZSwgdW5jaGFuZ2VkKS4gQUxTTyBrZXkgYnkgdGhlIG1vdW50J3MgVU5JUVVFIHJ1bnRpbWVTdGFnZUlkIHNvIEVWRVJZXG4gICAgLy8gaXRlcmF0aW9uJ3MgcmVzdWx0IGlzIHJldGFpbmVkIGFuZCBhZGRyZXNzYWJsZSAoZXVpIHBlci1sb29wIGRyaWxsLWRvd24sIHBlci1zY29wZSBsb2NhbGl6YXRpb24pLlxuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGFsd2F5cyBjb250YWlucyAnIyc7IHN1YmZsb3dJZCBuZXZlciBkb2VzIOKAlCBzbyB0aGV5IG5ldmVyIGNvbGxpZGUsIGFuZFxuICAgIC8vIGxpc3RTdWJmbG93UGF0aHMgZmlsdGVycyAnIycga2V5cyB0byBrZWVwIGl0cyBwYXRoLW9ubHkgY29udHJhY3QuIFRoZSBwYXVzZSBjaGVja3BvaW50IGZpbHRlcnNcbiAgICAvLyB0aGVzZSBvdXQgKGJ1aWxkUGF1c2VDaGVja3BvaW50KSBzbyBpdCBzdGF5cyBsZWFuLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBzdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0Py5nbG9iYWxDb250ZXh0LFxuICAgICk7XG5cbiAgICBwYXJlbnRDb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG59XG4iXX0=
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUcsTUFBTSxPQUFPLGVBQWU7SUFFaEI7SUFDQTtJQUZWLFlBQ1UsSUFBK0IsRUFDL0IsZ0JBQXVEO1FBRHZELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBdUM7SUFDOUQsQ0FBQztJQUVKOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsSUFBNkIsRUFDN0IsYUFBMkIsRUFDM0IsU0FBb0IsRUFDcEIsVUFBOEIsRUFDOUIsaUJBQTZDLEVBQzdDLHNCQUF5QztRQUV6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUVsRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFlBQVksV0FBVyxVQUFVLEVBQUU7WUFDOUUsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLEVBQUU7UUFDRixpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLCtEQUErRDtRQUMvRCx5REFBeUQ7UUFDekQsbUVBQW1FO1FBQ25FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztR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QUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUN6QixPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3ViZmxvd0V4ZWN1dG9yIOKAlCBJc29sYXRpb24gYm91bmRhcnkgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENyZWF0ZSBpc29sYXRlZCBFeGVjdXRpb25SdW50aW1lIGZvciBlYWNoIHN1YmZsb3dcbiAqIC0gQXBwbHkgaW5wdXQvb3V0cHV0IG1hcHBpbmcgdmlhIFN1YmZsb3dJbnB1dE1hcHBlclxuICogLSBEZWxlZ2F0ZSB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gKiAtIFRyYWNrIHN1YmZsb3cgcmVzdWx0cyBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAqXG4gKiBFYWNoIHN1YmZsb3cgZ2V0cyBpdHMgb3duIEdsb2JhbFN0b3JlIGZvciBpc29sYXRpb24uXG4gKiBUcmF2ZXJzYWwgdXNlcyB0aGUgU0FNRSA3LXBoYXNlIGFsZ29yaXRobSBhcyB0aGUgdG9wLWxldmVsIHRyYXZlcnNlclxuICogKHZpYSBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSksIHNvIGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBsYXp5IHN1YmZsb3dzLFxuICogYW5kIGFib3J0IHNpZ25hbHMgYWxsIHdvcmsgaW5zaWRlIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGFwcGx5T3V0cHV0TWFwcGluZywgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLCBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlIH0gZnJvbSAnLi9TdWJmbG93SW5wdXRNYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgdHJhdmVyc2VyRmFjdG9yeTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViZmxvdyB3aXRoIGlzb2xhdGVkIGNvbnRleHQuXG4gICAqXG4gICAqIDEuIENyZWF0ZXMgYSBmcmVzaCBFeGVjdXRpb25SdW50aW1lIGZvciB0aGUgc3ViZmxvd1xuICAgKiAyLiBBcHBsaWVzIGlucHV0IG1hcHBpbmcgdG8gc2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlXG4gICAqIDMuIERlbGVnYXRlcyB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gICAqIDQuIEFwcGxpZXMgb3V0cHV0IG1hcHBpbmcgdG8gd3JpdGUgcmVzdWx0cyBiYWNrIHRvIHBhcmVudCBzY29wZVxuICAgKiA1LiBTdG9yZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU3ViZmxvdyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1YmZsb3dSZXN1bHRzTWFwOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZCE7XG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lID8/IG5vZGUubmFtZTtcblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFbnRlcmluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBJbnB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gUkVTVU1FIFBBVEggTk9URTogd2hlbiBgZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lYCBjYXJyaWVzIGFcbiAgICAvLyBjYXB0dXJlIGZvciBUSElTIHN1YmZsb3cgaWQsIHdlIFNLSVAgdGhlIGlucHV0TWFwcGVyIGVudGlyZWx5LlxuICAgIC8vIFRoZSBjYXB0dXJlIGlzIHRoZSBwb3N0LWlucHV0IHByZS1wYXVzZSBtZW1vcnkg4oCUIHJ1bm5pbmcgdGhlXG4gICAgLy8gbWFwcGVyIGFnYWluIHdvdWxkIGNsb2JiZXIgcG9zdC1pbnB1dCB3cml0ZXMgKGhpc3RvcnksXG4gICAgLy8gcGF1c2VkVG9vbENhbGxJZCwgZXRjLikgd2l0aCB0aGUgcGFyZW50J3Mgc3RhcnQtb2Ytc3ViZmxvdyB2aWV3LlxuICAgIGNvbnN0IG1vdW50T3B0aW9ucyA9IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICBsZXQgbWFwcGVkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3QgcmVzdW1lQ2FwdHVyZSA9IHRoaXMuZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lPy5bc3ViZmxvd0lkXTtcbiAgICBjb25zdCBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID0gcmVzdW1lQ2FwdHVyZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG1vdW50T3B0aW9ucyAmJiAhaXNSZXN1bWVGb3JUaGlzU3ViZmxvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBwYXJlbnRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIG1hcHBlZElucHV0ID0gZ2V0SW5pdGlhbFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBtb3VudE9wdGlvbnMpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGlucHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSwgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBjb250ZXh0XG4gICAgLy8gdGhlIHdheSB0aGUgZGlhbHMgYXJlIChkdWNrLXR5cGVkOiB0aGlzIHNlY3Rpb24gY29uc3RydWN0cyBpdHMgcnVudGltZVxuICAgIC8vIGR5bmFtaWNhbGx5IHRvIGF2b2lkIHRoZSBjaXJjdWxhciBpbXBvcnQpLiBUaGUgc2VlZCBuYXJyYXRlZCBiZWxvdyBhbmRcbiAgICAvLyB0aGUgc2VlZCBDT01NSVRURUQgYmVsb3cgYm90aCByZXRhaW4gdW5kZXIgaXQ7IHRoZSBzdWJmbG93J3Mgc3RhZ2VzXG4gICAgLy8gc3RpbGwgY29tcHV0ZSBvbiB0aGUgcmVhbCBgbWFwcGVkSW5wdXRgICh0aGVpciBmcm96ZW4gYXJncykuXG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBhcmVudENvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZT8uKCk7XG4gICAgLy8gVGhlIHJ1bidzIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKTogdGhlIHBhcmVudC1tb3VudCBjb250ZXh0IGNhcnJpZXMgaXRcbiAgICAvLyBleGFjdGx5IHdoZW4gdGhlIHJvb3QgZW5hYmxlZCBvbmUgKGBFeGVjdXRpb25SdW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yYFxuICAgIC8vIHVuZGVyIGEgcG9saWN5LCBpbmhlcml0ZWQgYnkgY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCkg4oCUIHJlYWQgdGhlIHdheSB0aGVcbiAgICAvLyBkaWFscyBhcmUuIFdoZW4gaXQgZG9lcywgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24sXG4gICAgLy8gc28gdGhlIHN1YmZsb3cncyBTRVJWRUQgc3RhdGUgaXMgYSBtaXJyb3IgdG9vIOKAlCB0aGUgZm9sZCBvZiBpdHMgb3duXG4gICAgLy8gc2NydWJiZWQgbG9nIOKAlCBhbmQgbmV2ZXIgYSBzZWNvbmQgc2NydWIuIE5vIHBvbGljeTogbm8gbWlycm9yLCBub1xuICAgIC8vIGFsbG9jYXRpb24sIGFuZCB0aGUgc2VydmVkIHN0YXRlIGlzIHRoZSByYXcgaGVhcCBpdCBhbHdheXMgd2FzLlxuICAgIGNvbnN0IGtlZXBzTWlycm9yID0gcGFyZW50Q29udGV4dC5nZXRSZWRhY3RlZFNoYXJlZE1lbW9yeT8uKCkgIT09IHVuZGVmaW5lZDtcbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydClcbiAgICBjb25zdCBFeGVjdXRpb25SdW50aW1lQ2xhc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5jb25zdHJ1Y3RvciBhcyBuZXcgKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgaWQ6IHN0cmluZyxcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKG5vZGUubmFtZSwgbm9kZS5pZCk7XG4gICAgbGV0IG5lc3RlZFJvb3RDb250ZXh0ID0gbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgaW5zdGFsbCB0aGUgcnVsZSAoYW5kIHRoZSBtaXJyb3IpIG9uIFRIQVRcbiAgICAgIC8vIGNvbnRleHQgZmlyc3Qgc28gdGhlIHNlZWQgY29tbWl0IHJldGFpbnMgdW5kZXIgdGhlIHBvbGljeSBsaWtlIGV2ZXJ5XG4gICAgICAvLyBvdGhlciB3cml0ZSwgYW5kIGxhbmRzIGluIHRoZSBtaXJyb3IgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgICAgdGhpcy5pbmhlcml0UmVkYWN0aW9uKG5lc3RlZFJ1bnRpbWUsIG5lc3RlZFJvb3RDb250ZXh0LCByZWRhY3Rpb25SdWxlLCBrZWVwc01pcnJvcik7XG4gICAgICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlKG5lc3RlZFJ1bnRpbWUsIHNlZWRWYWx1ZXMpO1xuICAgICAgLy8gUmVmcmVzaCByb290U3RhZ2VDb250ZXh0IHNvIFdyaXRlQnVmZmVyIHNlZXMgY29tbWl0dGVkIGRhdGFcbiAgICAgIGNvbnN0IFN0YWdlQ29udGV4dENsYXNzID0gbmVzdGVkUm9vdENvbnRleHQuY29uc3RydWN0b3IgYXMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU3RhZ2VDb250ZXh0O1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQgPSBuZXcgU3RhZ2VDb250ZXh0Q2xhc3MoXG4gICAgICAgICcnLFxuICAgICAgICBuZXN0ZWRSb290Q29udGV4dC5zdGFnZU5hbWUsXG4gICAgICAgIG5lc3RlZFJvb3RDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUsXG4gICAgICAgICcnLFxuICAgICAgICBuZXN0ZWRSdW50aW1lLmV4ZWN1dGlvbkhpc3RvcnksXG4gICAgICApO1xuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUm9vdENvbnRleHQ7XG4gICAgfVxuXG4gICAgLy8gUmVhZC10cmFja2luZyBwb2xpY3kgKCMxNCk6IHN1YmZsb3dzIGdldCBhbiBJU09MQVRFRCBydW50aW1lLCBzbyB0aGVcbiAgICAvLyBleGVjdXRvci1sZXZlbCBwb2xpY3kgZG9lc24ndCByZWFjaCB0aGVtIHZpYSB0aGUgcm9vdCBjb250ZXh0IGNoYWluLlxuICAgIC8vIEluaGVyaXQgaXQgZnJvbSB0aGUgcGFyZW50LW1vdW50IGNvbnRleHQgKHdoaWNoIGluaGVyaXRlZCBpdCBmcm9tIElUU1xuICAgIC8vIHJvb3QgdmlhIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQpIOKAlCBhcHBsaWVkIHRvIHRoZSBGSU5BTCBuZXN0ZWQgcm9vdCxcbiAgICAvLyBhZnRlciB0aGUgc2VlZGluZyBibG9jayBhYm92ZSBtYXkgaGF2ZSByZXBsYWNlZCBpdC4gTmVzdGVkIHN1YmZsb3dzXG4gICAgLy8gY2hhaW4gdGhlIHNhbWUgd2F5LCBvbmUgaG9wIHBlciBtb3VudC4gT3B0aW9uYWwtY2hhaW5lZCBiZWNhdXNlIHRoaXNcbiAgICAvLyBzZWN0aW9uIGlzIGR1Y2stdHlwZWQgYnkgZGVzaWduIChkeW5hbWljIGNvbnN0cnVjdGlvbiB0byBhdm9pZCB0aGVcbiAgICAvLyBjaXJjdWxhciBpbXBvcnQpIOKAlCBhbmQgc2tpcHBlZCBhdCB0aGUgZGVmYXVsdCAnZnVsbCcsIHdoZXJlIHRoZSBmcmVzaFxuICAgIC8vIG5lc3RlZCBjb250ZXh0IGlzIGFscmVhZHkgY29ycmVjdCwgc28gdGhlIGRlZmF1bHQgcGF0aCBkb2VzIHplcm8gd29yay5cbiAgICBjb25zdCBwYXJlbnRSZWFkVHJhY2tpbmcgPSBwYXJlbnRDb250ZXh0LmdldFJlYWRUcmFja2luZz8uKCk7XG4gICAgaWYgKHBhcmVudFJlYWRUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VSZWFkVHJhY2tpbmcocGFyZW50UmVhZFRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBSZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSBhbmQgbWlycm9yICg5LjIwLjApOiBzYW1lIGhvcCBhcyB0aGUgZGlhbHMsXG4gICAgLy8gYXBwbGllZCB0byB0aGUgRklOQUwgbmVzdGVkIHJvb3QgKHRoZSBzZWVkaW5nIGJsb2NrIGFib3ZlIG1heSBoYXZlXG4gICAgLy8gcmVwbGFjZWQgaXQpIHNvIGV2ZXJ5IHN0YWdlIGNvbnRleHQgdGhlIHN1YmZsb3cgY3JlYXRlcyBpbmhlcml0cyBib3RoLlxuICAgIHRoaXMuaW5oZXJpdFJlZGFjdGlvbihuZXN0ZWRSdW50aW1lLCBuZXN0ZWRSb290Q29udGV4dCwgcmVkYWN0aW9uUnVsZSwga2VlcHNNaXJyb3IpO1xuXG4gICAgLy8gV3JpdGUtdHJhY2tpbmcgcG9saWN5ICgjMTNjLUEpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyByZWFkVHJhY2tpbmdcbiAgICAvLyBhYm92ZSDigJQgc3ViZmxvdyBydW50aW1lcyBhcmUgaXNvbGF0ZWQsIHNvIHRoZSBwYXJlbnQtbW91bnQgY29udGV4dCdzXG4gICAgLy8gbW9kZSBpcyBwdXNoZWQgaW50byB0aGUgRklOQUwgbmVzdGVkIHJvb3Qgd2l0aCB0aGUgc2FtZSBkdWNrLXR5cGVcbiAgICAvLyBndWFyZCBhbmQgdGhlIHNhbWUgc2tpcC1hdC1kZWZhdWx0IGZhc3QgcGF0aC5cbiAgICBjb25zdCBwYXJlbnRXcml0ZVRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVRyYWNraW5nPy4oKTtcbiAgICBpZiAocGFyZW50V3JpdGVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFdyaXRlVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlV3JpdGVUcmFja2luZyhwYXJlbnRXcml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXQtdmFsdWVzIGVuY29kaW5nICgjMTNjLUIpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyB0aGUgdHdvXG4gICAgLy8gdHJhY2tpbmcgZGlhbHMgYWJvdmUg4oCUIHN1YmZsb3cgcnVudGltZXMgYXJlIGlzb2xhdGVkLCBzbyB0aGVcbiAgICAvLyBwYXJlbnQtbW91bnQgY29udGV4dCdzIG1vZGUgaXMgcHVzaGVkIGludG8gdGhlIEZJTkFMIG5lc3RlZCByb290IHdpdGhcbiAgICAvLyB0aGUgc2FtZSBkdWNrLXR5cGUgZ3VhcmQgYW5kIHRoZSBzYW1lIHNraXAtYXQtZGVmYXVsdCBmYXN0IHBhdGgsIHNvXG4gICAgLy8gbmVzdGVkIGNoYXJ0cyBjb21taXQgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHBhcmVudC5cbiAgICBjb25zdCBwYXJlbnRDb21taXRWYWx1ZXMgPSBwYXJlbnRDb250ZXh0LmdldENvbW1pdFZhbHVlcz8uKCk7XG4gICAgaWYgKHBhcmVudENvbW1pdFZhbHVlcyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudENvbW1pdFZhbHVlcyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VDb21taXRWYWx1ZXMocGFyZW50Q29tbWl0VmFsdWVzKTtcbiAgICB9XG5cbiAgICAvLyBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpOiBmb3VydGggZGlhbCwgc2FtZSBpbmhlcml0YW5jZSBob3Ag4oCUXG4gICAgLy8gZHVjay10eXBlIGd1YXJkLCBza2lwLWF0LWRlZmF1bHQgKCdvZmYnKSBmYXN0IHBhdGgsIHNvIG5lc3RlZCBjaGFydHNcbiAgICAvLyBzdGFtcCBUcmFjZUVudHJ5LnJlYWRLZXlzIGV4YWN0bHkgd2hlbiB0aGUgcGFyZW50IGRvZXMuXG4gICAgY29uc3QgcGFyZW50V3JpdGVQcm92ZW5hbmNlID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVByb3ZlbmFuY2U/LigpO1xuICAgIGlmIChwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09ICdvZmYnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VXcml0ZVByb3ZlbmFuY2UocGFyZW50V3JpdGVQcm92ZW5hbmNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgbGV0IHN1YmZsb3dFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBzbmFwc2hvdCB0aGUgbmVzdGVkIHJ1bnRpbWUncyBgc2hhcmVkU3RhdGVgXG4gICAgICAvLyBvbnRvIHRoZSBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LFxuICAgICAgLy8gdGhlIG91dGVyIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT25cbiAgICAgIC8vIHJlc3VtZSwgd2UnbGwgcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlXG4gICAgICAvLyBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzbmFwID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuICAgICAgICAgIC8vIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZVxuICAgICAgICAgIC8vIHRpbWUgKGFmdGVyIGV2ZXJ5IGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLiBDYXN0XG4gICAgICAgICAgLy8gaXMgc2FmZSDigJQgU2hhcmVkTWVtb3J5IHNuYXBzaG90IHJldHVybnMgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIHNuYXAuc2hhcmVkU3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBTbmFwc2hvdCBmYWlsdXJlIHNob3VsZG4ndCBtYXNrIHRoZSBwYXVzZSDigJQgbGV0IHRoZSBwYXVzZVxuICAgICAgICAgIC8vIGJ1YmJsZSB1cDsgcmVzdW1lIHdpbGwgZmFsbCBiYWNrIHRvIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVcbiAgICAgICAgICAvLyAodGhlIHBhcmVudCBzY29wZSkgZm9yIHRoaXMgc3ViZmxvdydzIGtleXMuXG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSBlcnJvcjtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LmJyYW5jaElkICE9PSAnJyAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKGVmZmVjdGl2ZU91dHB1dCwgcGFyZW50U2NvcGUsIG91dHB1dENvbnRleHQsIG1vdW50T3B0aW9ucyk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgY29uc3QgZXhpdFN0YXRlID0gbWlycm9yU3RhdGUgPz8gKHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChyYXdTdGF0ZSkgOiByYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgY29uc3QgbW91bnRSdW50aW1lU3RhZ2VJZCA9IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmIChtb3VudFJ1bnRpbWVTdGFnZUlkICYmIG1vdW50UnVudGltZVN0YWdlSWQgIT09IHN1YmZsb3dJZCkge1xuICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KG1vdW50UnVudGltZVN0YWdlSWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFeGl0aW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RXhpdChzdWJmbG93TmFtZSwgc3ViZmxvd0lkLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBleGl0U3RhdGUpO1xuXG4gICAgcGFyZW50Q29udGV4dC5jb21taXQoKTtcblxuICAgIGlmIChzdWJmbG93RXJyb3IpIHtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIHRoZSBydW4ncyByZWRhY3Rpb24gaW50byBhIG5lc3RlZCByb290IHRoZSB3YXkgdGhlIGRpYWxzIGFyZSBwdXNoZWRcbiAgICog4oCUIHRoZSB0cmlwbGljYXRlZCBwcm9wYWdhdGlvbiAocm9vdCBpbnN0YWxsIMK3IGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQgwrdcbiAgICogdGhpcyBob3ApLiBDYWxsZWQgVFdJQ0Ugb24gcHVycG9zZTogb24gdGhlIHJ1bnRpbWUncyBmaXJzdCByb290LCBzbyB0aGVcbiAgICogU0VFRCBjb21taXQgKGBoaXN0b3J5WzBdYCkgcmV0YWlucyBhbmQgbWlycm9ycyB1bmRlciB0aGUgcG9saWN5LCBhbmQgb25cbiAgICogdGhlIEZJTkFMIHJvb3QgYWZ0ZXIgdGhlIHNlZWRpbmcgYmxvY2sgcmVwbGFjZXMgaXQuIFJ1bGUgYmVmb3JlIG1pcnJvcixcbiAgICogYXMgdGhlIGV4ZWN1dG9yIG9yZGVycyB0aGVtICh0aGUgbWlycm9yJ3Mgc2VlZCBpcyBzY3J1YmJlZCB3aXRoIHRoZSBydWxlO1xuICAgKiBmb3IgYSBuZXN0ZWQgcnVudGltZSB0aGF0IHNlZWQgaXMgZW1wdHkg4oCUIGl0cyBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICogYGVuYWJsZVJlZGFjdGVkTWlycm9yYCBpcyBpZGVtcG90ZW50LCBzbyB0aGUgc2Vjb25kIGNhbGwgb25seSByZS1pbnN0YWxsc1xuICAgKiB0aGUgT05FIG1pcnJvciBvbiB0aGUgZnJlc2ggcm9vdC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJlZGFjdGlvbihcbiAgICBydW50aW1lOiBJRXhlY3V0aW9uUnVudGltZSxcbiAgICByb290OiBTdGFnZUNvbnRleHQsXG4gICAgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgICBrZWVwc01pcnJvcjogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHJ1bGUpIHJvb3QudXNlUmVkYWN0aW9uUnVsZShydWxlKTtcbiAgICBpZiAoIWtlZXBzTWlycm9yKSByZXR1cm47XG4gICAgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcj8uKCk7XG4gICAgaWYgKHJ1bnRpbWUucmVkYWN0ZWRTdG9yZSkgcm9vdC51c2VSZWRhY3RlZE1pcnJvcihydW50aW1lLnJlZGFjdGVkU3RvcmUpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* servedSubflowResults — the ONE place that decides which state a subflow's
|
|
3
|
+
* result serves under `getSnapshot({ redact: true })` (9.20.0).
|
|
4
|
+
*
|
|
5
|
+
* A `SubflowResult` is built once by `SubflowExecutor` with the subflow's raw
|
|
6
|
+
* heap as `treeContext.globalContext` — the live view the plain snapshot and
|
|
7
|
+
* the checkpoint keep. When the run keeps a redacted mirror, the nested
|
|
8
|
+
* runtime keeps one too (enabled by `SubflowExecutor` the way the root does),
|
|
9
|
+
* and its final state is REMEMBERED here beside the result — never written
|
|
10
|
+
* into the result, so the plain snapshot stays byte-identical, and never
|
|
11
|
+
* scrubbed a second time: the mirror already holds exactly what the subflow's
|
|
12
|
+
* log holds (`stateAt` over `treeContext.history` folds to it).
|
|
13
|
+
*
|
|
14
|
+
* The association is by object identity, so it survives the upward merge of
|
|
15
|
+
* nested traversers' result maps and keeps the dual keying honest: the path
|
|
16
|
+
* key and the `#n` twin of one mount point at ONE raw result and are served
|
|
17
|
+
* as ONE substituted result.
|
|
18
|
+
*/
|
|
19
|
+
import type { SubflowResult } from '../types.js';
|
|
20
|
+
/** Remember the served (mirror) state of a subflow result. Absent without a policy. */
|
|
21
|
+
export declare function rememberRedactedSubflowState(result: SubflowResult, state: Record<string, unknown>): void;
|
|
22
|
+
/**
|
|
23
|
+
* The `subflowResults` record a snapshot serves. Plain: the traverser's own
|
|
24
|
+
* records, as they are. Redacted: each result that remembers a mirror is
|
|
25
|
+
* served as a copy whose `globalContext` IS that mirror — one copy per raw
|
|
26
|
+
* result, so a mount's two keys still point at one object — and a result
|
|
27
|
+
* without a mirror (no policy) is served as itself.
|
|
28
|
+
*/
|
|
29
|
+
export declare function servedSubflowResults(results: ReadonlyMap<string, SubflowResult>, redact: boolean): Record<string, SubflowResult>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* servedSubflowResults — the ONE place that decides which state a subflow's
|
|
3
|
+
* result serves under `getSnapshot({ redact: true })` (9.20.0).
|
|
4
|
+
*
|
|
5
|
+
* A `SubflowResult` is built once by `SubflowExecutor` with the subflow's raw
|
|
6
|
+
* heap as `treeContext.globalContext` — the live view the plain snapshot and
|
|
7
|
+
* the checkpoint keep. When the run keeps a redacted mirror, the nested
|
|
8
|
+
* runtime keeps one too (enabled by `SubflowExecutor` the way the root does),
|
|
9
|
+
* and its final state is REMEMBERED here beside the result — never written
|
|
10
|
+
* into the result, so the plain snapshot stays byte-identical, and never
|
|
11
|
+
* scrubbed a second time: the mirror already holds exactly what the subflow's
|
|
12
|
+
* log holds (`stateAt` over `treeContext.history` folds to it).
|
|
13
|
+
*
|
|
14
|
+
* The association is by object identity, so it survives the upward merge of
|
|
15
|
+
* nested traversers' result maps and keeps the dual keying honest: the path
|
|
16
|
+
* key and the `#n` twin of one mount point at ONE raw result and are served
|
|
17
|
+
* as ONE substituted result.
|
|
18
|
+
*/
|
|
19
|
+
/** The nested mirror's final state, keyed by the raw result it belongs to. */
|
|
20
|
+
const redactedStates = new WeakMap();
|
|
21
|
+
/** Remember the served (mirror) state of a subflow result. Absent without a policy. */
|
|
22
|
+
export function rememberRedactedSubflowState(result, state) {
|
|
23
|
+
redactedStates.set(result, state);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The `subflowResults` record a snapshot serves. Plain: the traverser's own
|
|
27
|
+
* records, as they are. Redacted: each result that remembers a mirror is
|
|
28
|
+
* served as a copy whose `globalContext` IS that mirror — one copy per raw
|
|
29
|
+
* result, so a mount's two keys still point at one object — and a result
|
|
30
|
+
* without a mirror (no policy) is served as itself.
|
|
31
|
+
*/
|
|
32
|
+
export function servedSubflowResults(results, redact) {
|
|
33
|
+
if (!redact)
|
|
34
|
+
return Object.fromEntries(results);
|
|
35
|
+
const servedByRaw = new Map();
|
|
36
|
+
const served = {};
|
|
37
|
+
for (const [key, result] of results) {
|
|
38
|
+
let entry = servedByRaw.get(result);
|
|
39
|
+
if (entry === undefined) {
|
|
40
|
+
const mirror = redactedStates.get(result);
|
|
41
|
+
entry =
|
|
42
|
+
mirror === undefined ? result : { ...result, treeContext: { ...result.treeContext, globalContext: mirror } };
|
|
43
|
+
servedByRaw.set(result, entry);
|
|
44
|
+
}
|
|
45
|
+
served[key] = entry;
|
|
46
|
+
}
|
|
47
|
+
return served;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSCw4RUFBOEU7QUFDOUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQTBDLENBQUM7QUFFN0UsdUZBQXVGO0FBQ3ZGLE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxNQUFxQixFQUFFLEtBQThCO0lBQ2hHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLE9BQTJDLEVBQzNDLE1BQWU7SUFFZixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBa0MsRUFBRSxDQUFDO0lBQ2pELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsS0FBSztnQkFDSCxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQy9HLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyDigJQgdGhlIE9ORSBwbGFjZSB0aGF0IGRlY2lkZXMgd2hpY2ggc3RhdGUgYSBzdWJmbG93J3NcbiAqIHJlc3VsdCBzZXJ2ZXMgdW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCAoOS4yMC4wKS5cbiAqXG4gKiBBIGBTdWJmbG93UmVzdWx0YCBpcyBidWlsdCBvbmNlIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHdpdGggdGhlIHN1YmZsb3cncyByYXdcbiAqIGhlYXAgYXMgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIOKAlCB0aGUgbGl2ZSB2aWV3IHRoZSBwbGFpbiBzbmFwc2hvdCBhbmRcbiAqIHRoZSBjaGVja3BvaW50IGtlZXAuIFdoZW4gdGhlIHJ1biBrZWVwcyBhIHJlZGFjdGVkIG1pcnJvciwgdGhlIG5lc3RlZFxuICogcnVudGltZSBrZWVwcyBvbmUgdG9vIChlbmFibGVkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRoZSB3YXkgdGhlIHJvb3QgZG9lcyksXG4gKiBhbmQgaXRzIGZpbmFsIHN0YXRlIGlzIFJFTUVNQkVSRUQgaGVyZSBiZXNpZGUgdGhlIHJlc3VsdCDigJQgbmV2ZXIgd3JpdHRlblxuICogaW50byB0aGUgcmVzdWx0LCBzbyB0aGUgcGxhaW4gc25hcHNob3Qgc3RheXMgYnl0ZS1pZGVudGljYWwsIGFuZCBuZXZlclxuICogc2NydWJiZWQgYSBzZWNvbmQgdGltZTogdGhlIG1pcnJvciBhbHJlYWR5IGhvbGRzIGV4YWN0bHkgd2hhdCB0aGUgc3ViZmxvdydzXG4gKiBsb2cgaG9sZHMgKGBzdGF0ZUF0YCBvdmVyIGB0cmVlQ29udGV4dC5oaXN0b3J5YCBmb2xkcyB0byBpdCkuXG4gKlxuICogVGhlIGFzc29jaWF0aW9uIGlzIGJ5IG9iamVjdCBpZGVudGl0eSwgc28gaXQgc3Vydml2ZXMgdGhlIHVwd2FyZCBtZXJnZSBvZlxuICogbmVzdGVkIHRyYXZlcnNlcnMnIHJlc3VsdCBtYXBzIGFuZCBrZWVwcyB0aGUgZHVhbCBrZXlpbmcgaG9uZXN0OiB0aGUgcGF0aFxuICoga2V5IGFuZCB0aGUgYCNuYCB0d2luIG9mIG9uZSBtb3VudCBwb2ludCBhdCBPTkUgcmF3IHJlc3VsdCBhbmQgYXJlIHNlcnZlZFxuICogYXMgT05FIHN1YnN0aXR1dGVkIHJlc3VsdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN1YmZsb3dSZXN1bHQgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKiBUaGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCBrZXllZCBieSB0aGUgcmF3IHJlc3VsdCBpdCBiZWxvbmdzIHRvLiAqL1xuY29uc3QgcmVkYWN0ZWRTdGF0ZXMgPSBuZXcgV2Vha01hcDxTdWJmbG93UmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcblxuLyoqIFJlbWVtYmVyIHRoZSBzZXJ2ZWQgKG1pcnJvcikgc3RhdGUgb2YgYSBzdWJmbG93IHJlc3VsdC4gQWJzZW50IHdpdGhvdXQgYSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShyZXN1bHQ6IFN1YmZsb3dSZXN1bHQsIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICByZWRhY3RlZFN0YXRlcy5zZXQocmVzdWx0LCBzdGF0ZSk7XG59XG5cbi8qKlxuICogVGhlIGBzdWJmbG93UmVzdWx0c2AgcmVjb3JkIGEgc25hcHNob3Qgc2VydmVzLiBQbGFpbjogdGhlIHRyYXZlcnNlcidzIG93blxuICogcmVjb3JkcywgYXMgdGhleSBhcmUuIFJlZGFjdGVkOiBlYWNoIHJlc3VsdCB0aGF0IHJlbWVtYmVycyBhIG1pcnJvciBpc1xuICogc2VydmVkIGFzIGEgY29weSB3aG9zZSBgZ2xvYmFsQ29udGV4dGAgSVMgdGhhdCBtaXJyb3Ig4oCUIG9uZSBjb3B5IHBlciByYXdcbiAqIHJlc3VsdCwgc28gYSBtb3VudCdzIHR3byBrZXlzIHN0aWxsIHBvaW50IGF0IG9uZSBvYmplY3Qg4oCUIGFuZCBhIHJlc3VsdFxuICogd2l0aG91dCBhIG1pcnJvciAobm8gcG9saWN5KSBpcyBzZXJ2ZWQgYXMgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVkU3ViZmxvd1Jlc3VsdHMoXG4gIHJlc3VsdHM6IFJlYWRvbmx5TWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4sXG4gIHJlZGFjdDogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgaWYgKCFyZWRhY3QpIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMocmVzdWx0cyk7XG4gIGNvbnN0IHNlcnZlZEJ5UmF3ID0gbmV3IE1hcDxTdWJmbG93UmVzdWx0LCBTdWJmbG93UmVzdWx0PigpO1xuICBjb25zdCBzZXJ2ZWQ6IFJlY29yZDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcmVzdWx0XSBvZiByZXN1bHRzKSB7XG4gICAgbGV0IGVudHJ5ID0gc2VydmVkQnlSYXcuZ2V0KHJlc3VsdCk7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1pcnJvciA9IHJlZGFjdGVkU3RhdGVzLmdldChyZXN1bHQpO1xuICAgICAgZW50cnkgPVxuICAgICAgICBtaXJyb3IgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHsgLi4ucmVzdWx0LCB0cmVlQ29udGV4dDogeyAuLi5yZXN1bHQudHJlZUNvbnRleHQsIGdsb2JhbENvbnRleHQ6IG1pcnJvciB9IH07XG4gICAgICBzZXJ2ZWRCeVJhdy5zZXQocmVzdWx0LCBlbnRyeSk7XG4gICAgfVxuICAgIHNlcnZlZFtrZXldID0gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHNlcnZlZDtcbn1cbiJdfQ==
|