footprintjs 10.3.0 → 10.4.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/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
- package/dist/esm/lib/capture/absentEntries.js +81 -0
- package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/esm/lib/capture/checkpointCapture.js +104 -0
- package/dist/esm/lib/capture/historyData.d.ts +9 -0
- package/dist/esm/lib/capture/historyData.js +79 -0
- package/dist/esm/lib/capture/historyNote.d.ts +4 -0
- package/dist/esm/lib/capture/historyNote.js +52 -0
- package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
- package/dist/esm/lib/capture/historyTarget.js +35 -0
- package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
- package/dist/esm/lib/capture/historyTypes.js +4 -0
- package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/esm/lib/capture/nativeCoverage.js +50 -12
- package/dist/esm/lib/capture/noteShape.d.ts +10 -0
- package/dist/esm/lib/capture/noteShape.js +93 -0
- package/dist/esm/lib/capture/readSources.d.ts +43 -0
- package/dist/esm/lib/capture/readSources.js +78 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/esm/lib/engine/types.d.ts +3 -0
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +8 -0
- package/dist/esm/lib/memory/StageContext.js +84 -9
- package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
- package/dist/esm/lib/memory/runPolicy.js +2 -1
- package/dist/esm/lib/pause/record.js +8 -2
- package/dist/esm/lib/pause/types.d.ts +2 -0
- package/dist/esm/lib/pause/types.js +1 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +17 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +33 -4
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +48 -10
- package/dist/esm/lib/runner/attach.js +3 -1
- package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
- package/dist/esm/lib/runner/captureHistory.js +106 -0
- package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/index.d.ts +1 -0
- package/dist/esm/lib/runner/index.js +1 -1
- package/dist/esm/lib/runner/options.js +42 -3
- package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/esm/lib/runner/readStoredCapture.js +36 -0
- package/dist/esm/lib/runner/recordSink.d.ts +11 -0
- package/dist/esm/lib/runner/recordSink.js +47 -4
- package/dist/esm/lib/runner/snapshot.js +2 -2
- package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
- package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
- package/dist/esm/lib/sinks/fileSink.js +8 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/absentEntries.js +86 -0
- package/dist/lib/capture/checkpointCapture.js +110 -0
- package/dist/lib/capture/historyData.js +85 -0
- package/dist/lib/capture/historyNote.js +56 -0
- package/dist/lib/capture/historyTarget.js +40 -0
- package/dist/lib/capture/historyTypes.js +7 -0
- package/dist/lib/capture/nativeCoverage.js +52 -13
- package/dist/lib/capture/noteShape.js +103 -0
- package/dist/lib/capture/readSources.js +83 -0
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +84 -9
- package/dist/lib/memory/runPolicy.js +2 -1
- package/dist/lib/pause/record.js +8 -2
- package/dist/lib/pause/types.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +32 -3
- package/dist/lib/runner/FlowChartExecutor.js +48 -10
- package/dist/lib/runner/attach.js +3 -1
- package/dist/lib/runner/captureHistory.js +110 -0
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/index.js +1 -1
- package/dist/lib/runner/options.js +42 -3
- package/dist/lib/runner/readStoredCapture.js +40 -0
- package/dist/lib/runner/recordSink.js +47 -4
- package/dist/lib/runner/snapshot.js +2 -2
- package/dist/lib/runner/storedCaptureAdmission.js +101 -0
- package/dist/lib/sinks/fileSink.js +8 -2
- package/dist/trace.js +4 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/capture/absentEntries.d.ts +7 -0
- package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/types/lib/capture/historyData.d.ts +9 -0
- package/dist/types/lib/capture/historyNote.d.ts +4 -0
- package/dist/types/lib/capture/historyTarget.d.ts +5 -0
- package/dist/types/lib/capture/historyTypes.d.ts +39 -0
- package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/types/lib/capture/noteShape.d.ts +10 -0
- package/dist/types/lib/capture/readSources.d.ts +43 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/types/lib/engine/types.d.ts +3 -0
- package/dist/types/lib/memory/StageContext.d.ts +8 -0
- package/dist/types/lib/memory/runPolicy.d.ts +5 -1
- package/dist/types/lib/pause/types.d.ts +2 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +17 -3
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/types/lib/runner/captureHistory.d.ts +8 -0
- package/dist/types/lib/runner/checkpoint.d.ts +2 -0
- package/dist/types/lib/runner/index.d.ts +1 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/types/lib/runner/recordSink.d.ts +11 -0
- package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/types/lib/sinks/fileSink.d.ts +2 -1
- package/dist/types/trace.d.ts +2 -0
- package/package.json +2 -2
|
@@ -14,9 +14,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.ExecutionRuntime = void 0;
|
|
15
15
|
const write_1 = require("foottrace/write");
|
|
16
16
|
const nativeCoverage_js_1 = require("../capture/nativeCoverage.js");
|
|
17
|
+
const readSources_js_1 = require("../capture/readSources.js");
|
|
17
18
|
const runPolicy_js_1 = require("../memory/runPolicy.js");
|
|
18
19
|
const StageContext_js_1 = require("../memory/StageContext.js");
|
|
19
20
|
class ExecutionRuntime {
|
|
21
|
+
readSources;
|
|
20
22
|
/** Present only for the current opted-in root leg. Never inherited by a subflow runtime. */
|
|
21
23
|
capture;
|
|
22
24
|
beginCapture(runId) {
|
|
@@ -28,6 +30,18 @@ class ExecutionRuntime {
|
|
|
28
30
|
this.rootStageContext.capture = capture;
|
|
29
31
|
return capture;
|
|
30
32
|
}
|
|
33
|
+
/** A reused log cannot be retrofitted or relabelled as the new leg's base. */
|
|
34
|
+
resumeReadSources(runId) {
|
|
35
|
+
this.readSources?.retire();
|
|
36
|
+
this.readSources = this.policy.readSources
|
|
37
|
+
? new readSources_js_1.EngineReadSourceCapture(runId, undefined, 'resumed-source-ownership', this.executionHistory.length)
|
|
38
|
+
: undefined;
|
|
39
|
+
this.rootStageContext.readSources = this.readSources;
|
|
40
|
+
}
|
|
41
|
+
captureSnapshot(to, control = 'unknown', redact = false) {
|
|
42
|
+
const note = this.capture?.snapshot(to, control, redact);
|
|
43
|
+
return note && this.readSources ? (0, readSources_js_1.withReadSources)(note, this.readSources.snapshot(to, redact)) : note;
|
|
44
|
+
}
|
|
31
45
|
globalStore;
|
|
32
46
|
/**
|
|
33
47
|
* Parallel redacted mirror of `globalStore`. Populated by every commit that
|
|
@@ -59,7 +73,7 @@ class ExecutionRuntime {
|
|
|
59
73
|
* every frame after inherits the same reference. Default: every dial at
|
|
60
74
|
* its default, no rule, no mirror.
|
|
61
75
|
*/
|
|
62
|
-
constructor(rootName, rootId, defaultValues, initialState, policy = runPolicy_js_1.DEFAULT_RUN_POLICY, record) {
|
|
76
|
+
constructor(rootName, rootId, defaultValues, initialState, policy = runPolicy_js_1.DEFAULT_RUN_POLICY, record, source) {
|
|
63
77
|
this._initialState = initialState;
|
|
64
78
|
this._defaultValues = defaultValues;
|
|
65
79
|
this.globalStore = new write_1.SharedMemory(defaultValues, initialState);
|
|
@@ -69,7 +83,18 @@ class ExecutionRuntime {
|
|
|
69
83
|
// left `defaultValues` out of every replay, so a fold could not reproduce
|
|
70
84
|
// the state a stage actually saw. `getState()` is the live context; the
|
|
71
85
|
// EventLog constructor clones it, so the base stays detached.
|
|
72
|
-
|
|
86
|
+
if (policy.readSources && source?.runId && !source.unavailable && !record) {
|
|
87
|
+
// The record owns origin selection, first-touch fallback, staging and commit admission.
|
|
88
|
+
// Open once, before any frame exists. Constructor/clone errors keep their original identity.
|
|
89
|
+
const book = (0, write_1.createReadSourceRecord)(this.globalStore, { logRunId: source.runId, drillPath: [] }, typeof policy.readSources === 'object' ? policy.readSources : undefined);
|
|
90
|
+
this.executionHistory = book.log;
|
|
91
|
+
this.readSources = new readSources_js_1.EngineReadSourceCapture(source.runId, book);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.executionHistory = openLog(this.globalStore.getState(), record);
|
|
95
|
+
if (policy.readSources && source?.runId)
|
|
96
|
+
this.readSources = new readSources_js_1.EngineReadSourceCapture(source.runId, undefined, source.unavailable ?? 'sink-source-unsupported');
|
|
97
|
+
}
|
|
73
98
|
if (record && this.executionHistory.address !== undefined)
|
|
74
99
|
this.recordSink = record.sink;
|
|
75
100
|
this.policy = policy;
|
|
@@ -108,6 +133,7 @@ class ExecutionRuntime {
|
|
|
108
133
|
*/
|
|
109
134
|
installPolicy(root) {
|
|
110
135
|
root.usePolicy(this.policy);
|
|
136
|
+
root.readSources = this.readSources;
|
|
111
137
|
if (!this.policy.mirror)
|
|
112
138
|
return;
|
|
113
139
|
if (!this.redactedStore) {
|
|
@@ -225,6 +251,9 @@ class ExecutionRuntime {
|
|
|
225
251
|
...(this.executionHistory.address === undefined ? {} : { logAddress: this.executionHistory.address }),
|
|
226
252
|
commitValues: this.policy.commitValues,
|
|
227
253
|
writeProvenance: this.policy.writeProvenance,
|
|
254
|
+
...(this.readSources && {
|
|
255
|
+
readSources: this.readSources.snapshot(this.executionHistory.length, options?.redact === true),
|
|
256
|
+
}),
|
|
228
257
|
};
|
|
229
258
|
}
|
|
230
259
|
}
|
|
@@ -253,4 +282,4 @@ function openLog(base, record) {
|
|
|
253
282
|
return new write_1.EventLog(base);
|
|
254
283
|
}
|
|
255
284
|
}
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUlILDJDQUF3RjtBQUl4RixvRUFBNkQ7QUFHN0QseURBQTREO0FBQzVELCtEQUF5RDtBQTBKekQsTUFBYSxnQkFBZ0I7SUFDM0IsNEZBQTRGO0lBQzVGLE9BQU8sQ0FBaUI7SUFFeEIsWUFBWSxDQUFDLEtBQWE7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUksaUNBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLFdBQVcsQ0FBZTtJQUNqQzs7Ozs7Ozs7T0FRRztJQUNJLGFBQWEsQ0FBZ0I7SUFDN0IsZ0JBQWdCLENBQWU7SUFDL0IsZ0JBQWdCLENBQVc7SUFDbEMsc0dBQXNHO0lBQzlGLFVBQVUsQ0FBYztJQUNoQyxvRkFBb0Y7SUFDNUUsYUFBYSxDQUFnQjtJQUM3QixhQUFhLENBQVU7SUFDdkIsY0FBYyxDQUFVO0lBQ2hDO21GQUMrRTtJQUN2RSxNQUFNLENBQVk7SUFFMUIsNEVBQTRFO0lBQ3BFLFNBQVMsQ0FBMkI7SUFFNUM7Ozs7OztPQU1HO0lBQ0gsWUFDRSxRQUFnQixFQUNoQixNQUFjLEVBQ2QsYUFBdUIsRUFDdkIsWUFBc0IsRUFDdEIsU0FBb0IsaUNBQWtCLEVBQ3RDLE1BQXNCO1FBRXRCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxvQkFBWSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxJQUFZLEVBQUUsRUFBVTtRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLDhCQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxNQUFpQjtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssYUFBYSxDQUFDLElBQWtCO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLG9CQUFZLENBQ25DLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLHVCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFDbkYsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsdUJBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUNsRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssV0FBVztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUEsb0JBQVksRUFBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBNEIsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLG1CQUEyQixFQUFFLElBQVc7UUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUM5QyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0UsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsRUFBRTtZQUMvRixHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3hDLENBQUM7SUFDSixDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLFdBQVcsQ0FBQyxPQUFtQixFQUFFLElBQVc7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELG1IQUFtSDtJQUNuSCxVQUFVLENBQUMsSUFBWSxFQUFFLElBQVU7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtDRztJQUNILFdBQVcsQ0FBQyxPQUE4QjtRQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQztRQUNqRixPQUFPO1lBQ0wsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDdkYsYUFBYSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUU7WUFDekMsc0VBQXNFO1lBQ3RFLHNFQUFzRTtZQUN0RSxtRUFBbUU7WUFDbkUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxvRUFBb0U7WUFDcEUsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUscUVBQXFFO1lBQ3JFLCtEQUErRDtZQUMvRCxrRUFBa0U7WUFDbEUsMEVBQTBFO1lBQzFFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBbUI7WUFDNUUsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQ3RDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWU7U0FDN0MsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXhPRCw0Q0F3T0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQUMsSUFBNkIsRUFBRSxNQUFpQztJQUMvRSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLGdCQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLGdCQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ3BGLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaUdBQWlHO1FBQ25HLENBQUM7UUFDRCxPQUFPLElBQUksZ0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhlY3V0aW9uUnVudGltZSDigJQgVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBDb21taXRWYWx1ZXNNb2RlLCBMb2dBZGRyZXNzLCBMb2dPdXRjb21lLCBNZXRhIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkU2luaywgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBFdmVudExvZywgZnJlZXplUmVjb3JkLCBMT0dfUExBQ0VIT0xERVIsIFNoYXJlZE1lbW9yeSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZU5vdGUsIFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIE9wdGlvbmFsIGN1cnJlbnQtcnVuIGNhcHR1cmUgYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHJlY29yZGVyIGNvbnRyYWN0LiAqL1xuICBjYXB0dXJlPzogUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50O1xufVxuXG5leHBvcnQgdHlwZSBSdW50aW1lU25hcHNob3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgc25hcHNob3QgYmVsb25ncyB0byDigJQgdGhlIHNhbWUgYHJ1bklkYCBzdGFtcGVkIG9uIGV2ZXJ5XG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0YCAoYW5kIHRodXMgZXZlcnkgcmVjb3JkZXIgZXZlbnQpIG9mIHRoZSBydW4sIHNvIGFcbiAgICogc25hcHNob3QgY2FuIGJlIGpvaW5lZCBhZ2FpbnN0IGFuIGV2ZW50IHN0cmVhbSBvciBhbiBleHRlcm5hbFxuICAgKiBjb3JyZWxhdGlvbiB0YWJsZS4gUmVhZC1vbmx5IGJ5IGNvbnRyYWN0OiBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIChgcnVubmVyL3J1bklkLnRzYCksIG5ldmVyIGRlcml2ZWQgZnJvbSBzbmFwc2hvdCBjb250ZW50cy5cbiAgICpcbiAgICogTGlmZWN5Y2xlIChtYXRjaGVzIHRoZSBldmVudCBtb2RlbCk6IGZyZXNoIHBlciBgcnVuKClgIEFORCBwZXJcbiAgICogYHJlc3VtZSgpYCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1biwgc28gYSBwb3N0LXJlc3VtZVxuICAgKiBzbmFwc2hvdCBjYXJyaWVzIGEgRElGRkVSRU5UIHJ1bklkIHRoYW4gdGhlIHBhdXNlZCBydW4ncyBzbmFwc2hvdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBPcHQtaW4gbmF0aXZlIG9ic2VydmF0aW9uOyByb290IGxvZyBhbmQgY3VycmVudCBsZWcgb25seSwgbmV2ZXIgZHVyYWJsZSBzdG9yYWdlLiAqL1xuICByZWFkb25seSBjYXB0dXJlPzogTmF0aXZlQ2FwdHVyZU5vdGU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24gKDEwLjEpIOKAlCBgZW52LnRyYWNlcGFyZW50YCwgb3IgYGVudi50cmFjZUlkYCArIGBlbnYub3BlcmF0aW9uSWRgLCByZXNvbHZlZCBvbmNlIHBlclxuICAgKiBsZWc7IHRoZSBzYW1lIGZyb3plbiBvYmplY3QgZXZlcnkgZXZlbnQgb2YgdGhlIGxlZyBjYXJyaWVzIChgVHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAsIGEgc2NvcGUgZXZlbnQnc1xuICAgKiBgY29ycmVsYXRpb25gKS4gTGlrZSBgcnVuSWRgLCBwZXIgbGVnOiBhIHJlc3VtZSBjYXJyaWVzIElUUyBlbnYncywgbmV2ZXIgdGhlIHBhdXNlZCBsZWcncy4gQWJzZW50IOKAlCBub1xuICAgKiBrZXkg4oCUIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uXG4gICAqL1xuICByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3R0cmFjZWAg4oCUIHJlcHJvZHVjZSB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuXG4gICAqXG4gICAqIE9QVElPTkFMIEJZIFRZUEUsIGFuZCBhYnNlbnQgaW4gZXhhY3RseSB0d28gY2FzZXMuIEEgcGxhaW4gYGdldFNuYXBzaG90KClgXG4gICAqIGFsd2F5cyBjYXJyaWVzIGl0LCBzbyBhIGxpdmUgZm9sZCByZXBvcnRzIGBiYXNpczogJ2luaXRpYWwrbG9nJ2AuIFVuZGVyXG4gICAqIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaXQgaXMgT01JVFRFRCDigJQgdGhlIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuXG4gICAqIHNlZWQgYW5kIHRoZSByZWRhY3Rpb24gcG9saWN5IGlzIG5vdCBwbHVtYmVkIGludG8gdGhlIGZvbGQg4oCUIHNvIGEgZm9sZCBvZlxuICAgKiBhIHJlZGFjdGVkIHNuYXBzaG90IGRlZ3JhZGVzIGhvbmVzdGx5IHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuIEFuZCBpdCBpc1xuICAgKiBkZWNsYXJlZCBvcHRpb25hbCBzbyB0aGF0IGNvZGUgd3JpdHRlbiBhZ2FpbnN0IDkuMTYueCDigJQgYSB0ZXN0IGZpeHR1cmUgb3JcbiAgICogYSBVSSBtb2NrIHRoYXQgQ09OU1RSVUNUUyBhIGBSdW50aW1lU25hcHNob3RgIGxpdGVyYWwg4oCUIHN0aWxsIGNvbXBpbGVzLlxuICAgKiBgc3RhdGVBdGAgaGFuZGxlcyBhYnNlbmNlIGJ5IHNheWluZyBzbywgbmV2ZXIgYnkgZm9sZGluZyBhIGxpZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvbW1pdCBidW5kbGVzLCBvbmUgcGVyIGV4ZWN1dGVkIHN0YWdlLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUXG4gICAqIGEgREVUQUNIRUQsIGZyb3plbiBjb3B5IG9mIHRoZSBlbmdpbmUncyBsaXZlIGxvZyAoYSBzbmFwc2hvdCBpcyBhIGZvbGRcbiAgICogcmVzdWx0OiBpdCBtdXN0IG5vdCBrZWVwIGNoYW5naW5nIHVuZGVyIHRoZSBjb25zdW1lciB0aGF0IGhvbGRzIGl0KS5cbiAgICogVGhlIGJ1bmRsZXMgaW5zaWRlIGFyZSB0aGUgZW5naW5lJ3Mgb3duIG9iamVjdHMsIGltbXV0YWJsZSBhZnRlciByZWNvcmQuXG4gICAqL1xuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdO1xuICAvKiogSWRlbnRpdHkgb2YgdGhpcyBsb2csIHN0YWJsZSBhY3Jvc3Mgc2FtZS1leGVjdXRvciByZXN1bWUuIEFic2VudCBiZWZvcmUgYmluZGluZyBvciBpbiBvbGRlciBzb3VyY2VzLiAqL1xuICByZWFkb25seSBsb2dBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgLyoqXG4gICAqIEVuY29kaW5nIGRpc2NyaW1pbmFudCBmb3IgYGNvbW1pdExvZ2AgKCMxM2MtQik6IGAnZnVsbCdgIOKAlCBldmVyeSBgc2V0YFxuICAgKiBidW5kbGUgc3RvcmVzIHRoZSBmdWxsIGZpbmFsIHZhbHVlIChoaXN0b3JpY2FsKTsgYCdkZWx0YSdgIOKAlCBidW5kbGVzIG1heVxuICAgKiBjYXJyeSBgYXBwZW5kYC9gZGVsZXRlYCB0cmFjZSB2ZXJicyB3aXRoIHZlcmItcXVhbGlmaWVkIGBvdmVyd3JpdGVgXG4gICAqIHBheWxvYWRzICh0YWlscykuIE9mZmxpbmUgdG9vbGluZyBrZXlzIG9uIHRoaXMgZmllbGQ7IGEgYnVuZGxlIHN0cmVhbVxuICAgKiB3aXRob3V0IGNvbnRleHQgcmVtYWlucyBzZWxmLWRlc2NyaWJpbmcgdmlhIHRoZSB2ZXJicyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBkaWFsICgjUDEpIHRoZSBydW4gZXhlY3V0ZWQgdW5kZXIg4oCUIHRoZVxuICAgKiAgb2ZmbGluZS10b29saW5nIGRpc2NyaW1pbmFudCBmb3IgYFRyYWNlRW50cnkucmVhZEtleXNgIGF2YWlsYWJpbGl0eS4gKi9cbiAgd3JpdGVQcm92ZW5hbmNlOiBXcml0ZVByb3ZlbmFuY2VNb2RlO1xuICAvKipcbiAgICogUGVyLXN1YmZsb3cgZXhlY3V0aW9uIHJlc3VsdHMsIERVQUwtS0VZRUQgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCk6XG4gICAqICAgLSBieSBzdWJmbG93IFBBVEggKGBzdWJmbG93SWRgLCBlLmcuIGAnc2YtcGF5J2ApIOKGkiB0aGUgTEFTVCBpdGVyYXRpb24gKGJhY2stY29tcGF0KTsgdGhpc1xuICAgKiAgICAgaXMgd2hhdCBgZ2V0U3VidHJlZVNuYXBzaG90KHBhdGgpYCBhbmQgYGxpc3RTdWJmbG93UGF0aHMoKWAgcmVzb2x2ZS5cbiAgICogICAtIGJ5IHBlci1leGVjdXRpb24gbW91bnQgYHJ1bnRpbWVTdGFnZUlkYCAoZS5nLiBgJ3NmLXBheSM1J2ApIOKGkiBUSEFUIGl0ZXJhdGlvbidzIHJlc3VsdCwgc29cbiAgICogICAgIGEgTE9PUElORyBzdWJmbG93IHJldGFpbnMgRVZFUlkgaXRlcmF0aW9uIChub3QganVzdCB0aGUgbGFzdCkuIExvb2sgdXAgYSBzcGVjaWZpY1xuICAgKiAgICAgaXRlcmF0aW9uIGFzIGBzdWJmbG93UmVzdWx0c1tub2RlLnJ1bnRpbWVTdGFnZUlkXSA/PyBzdWJmbG93UmVzdWx0c1tub2RlLnN1YmZsb3dJZF1gLlxuICAgKiBCb3RoIGtleXMgcG9pbnQgYXQgdGhlIHNhbWUgb2JqZWN0IGZvciBhIHNpbmdsZSBtb3VudDsgaXRlcmF0ZSB3aXRoIGNhcmUgKGNvdW50IHZpYSB0aGVcbiAgICogcGF0aCBrZXlzIOKAlCB0aG9zZSB3aXRob3V0IGAnIydgKS4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgY2FycmllcyBvbmx5IHRoZSBwYXRoIGtleXMsIGxlYW4uXG4gICAqXG4gICAqIFVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgZWFjaCBlbnRyeSdzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBpcyB0aGF0XG4gICAqIHN1YmZsb3cncyBPV04gcmVkYWN0ZWQgbWlycm9yICg5LjIwLjApIOKAlCB0aGUgZm9sZCBvZiBpdHMgc2NydWJiZWQgYGhpc3RvcnlgIOKAlCBzZXJ2ZWQgYXNcbiAgICogb25lIHN1YnN0aXR1dGVkIG9iamVjdCBwZXIgbW91bnQgKGJvdGgga2V5cyBzdGlsbCBhZ3JlZSkg4oCUIHRoZSB3cmFwcGVyIGlzIGZyZXNoIHBlclxuICAgKiBgZ2V0U25hcHNob3RgIGNhbGwsIHRoZSBgZ2xvYmFsQ29udGV4dGAgaW5zaWRlIGl0IGlzIHRoZSBzdGFibGUgbWlycm9yOyBwbGFpbiwgaXQgaXMgdGhlIHN1YmZsb3cnc1xuICAgKiBsaXZlIGhlYXAuIFdpdGhvdXQgYSBwb2xpY3kgdGhlcmUgaXMgbm8gbWlycm9yIGFuZCB0aGUgdHdvIHZpZXdzIGFyZSB0aGUgc2FtZSBvYmplY3RzLlxuICAgKi9cbiAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpLiAqL1xuICByZWNvcmRlcnM/OiBSZWNvcmRlclNuYXBzaG90W107XG4gIC8qKlxuICAgKiBEZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIChSRkMtMDAxIEJsb2NrIDkpIOKAlCBxdWV1ZSBkZXB0aCwgZHJvcHMsXG4gICAqIGZsdXNoL2J1ZGdldCBjb3VudGVycywgcGVyLWxpc3RlbmVyIHRpbWUgYXR0cmlidXRpb24sIGFuZCB0aGVcbiAgICogdGVybWluYWwtZmx1c2ggc3RyYW5kaW5nIGNvdW50LiBBQlNFTlQgdW5sZXNzIGEgcmVjb3JkZXIgd2FzIGF0dGFjaGVkXG4gICAqIHdpdGggYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgb24gdGhpcyBleGVjdXRvciAoemVyby1jb3N0IGRpc2NpcGxpbmUpLlxuICAgKi9cbiAgb2JzZXJ2ZXJTdGF0cz86IE9ic2VydmVyU3RhdHM7XG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQncyBhY2NvdW50aW5nICgxMC4xLCBQNikg4oCUIGhvdyBtYW55IGVudHJpZXMgdGhlIHJ1biBoYW5kZWQgaXRzIHNpbmsgYW5kIGhvdyBtYW55IHRoZSBzaW5rXG4gICAqIGRpZCBub3QgdGFrZS4gQUJTRU5UIHVubGVzcyB0aGUgZXhlY3V0b3Igd2FzIGJ1aWx0IHdpdGggYSBgc2lua2AgYW5kIGEgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICBzaW5rPzogUmVjb3JkU2lua1N0YXRzO1xufTtcblxuLyoqIGBnZXRTbmFwc2hvdCgpLnNpbmtgIOKAlCB3aGF0IHRoZSBydW4gaGFuZGVkIGl0cyBzaW5rLCBhbmQgd2hhdCB0aGUgc2luayBkaWQgbm90IHRha2UgKDEwLjEsIFA2KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkU2lua1N0YXRzIHtcbiAgLyoqIEVudHJpZXMgaGFuZGVkIHRvIHRoZSBhZGFwdGVyIChlYWNoIGBvcGVuZWRgLCBgY29tbWl0YCwgYG5vdGVgLCBgY2xvc2VkYCBjYWxsKS4gKi9cbiAgcmVhZG9ubHkgZW50cmllczogbnVtYmVyO1xuICAvKipcbiAgICogTG9zc2VzIOKAlCBhIG1ldGhvZCB0aGF0IHRocmV3IG9yIHJlamVjdGVkLCBhbiBlbnRyeSB0aGUgbG9nIHJlZnVzZWQgdG8gc2VuZCwgYSBgbWV0YWAgdGhlIGxvZyBjb3VsZCBub3QgY29weVxuICAgKiAodGhhdCBlbnRyeSB3YXMgc3RpbGwgc3RvcmVkLCB3aXRob3V0IGl0KSwgYW5kIGZhaWxlZCBvciB0aW1lZC1vdXQgZmx1c2hlcy4gQSByZWplY3Rpb24gdGhhdCBzZXR0bGVzIGFmdGVyIHRoZVxuICAgKiBydW4gZmluaXNoZWQgaXMgY291bnRlZCB3aGVuIGl0IHNldHRsZXMuXG4gICAqL1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGxvc3MncyBlcnJvciwgYXMgdGV4dC4gQWJzZW50IHdoaWxlIG5vdGhpbmcgd2FzIGxvc3QuICovXG4gIHJlYWRvbmx5IGxhc3RFcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGVyZSBhIHJ1bnRpbWUncyBsb2cgd3JpdGVzIGFzIGl0IGxhbmRzICgxMC4xLCBQNik6IHRoZSBydW4ncyBzaW5rLCB0aGUgbG9nJ3MgYWRkcmVzcyBhbmQgd2hhdCB0aGUgd3JpdGVyIHB1dHMgb25cbiAqIGl0cyBgb3BlbmVkYCBlbnRyeS4gQWJzZW50IOKGkiB0aGUgbG9nIGlzIHRoZSBwbGFpbiBvbmUtYXJndW1lbnQgYEV2ZW50TG9nYCwgYnl0ZS1pZGVudGljYWwgdG8gMTAuMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lUmVjb3JkIHtcbiAgcmVhZG9ubHkgc2luazogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgYWRkcmVzczogTG9nQWRkcmVzcztcbiAgcmVhZG9ubHkgbWV0YT86IE1ldGE7XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgLyoqIFByZXNlbnQgb25seSBmb3IgdGhlIGN1cnJlbnQgb3B0ZWQtaW4gcm9vdCBsZWcuIE5ldmVyIGluaGVyaXRlZCBieSBhIHN1YmZsb3cgcnVudGltZS4gKi9cbiAgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmU7XG5cbiAgYmVnaW5DYXB0dXJlKHJ1bklkOiBzdHJpbmcpOiBOYXRpdmVDYXB0dXJlIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgPz8gdGhpcy5jYXB0dXJlPy5sb2dBZGRyZXNzID8/IHsgbG9nUnVuSWQ6IHJ1bklkLCBkcmlsbFBhdGg6IFtdIH07XG4gICAgY29uc3QgY2FwdHVyZSA9IG5ldyBOYXRpdmVDYXB0dXJlKHJ1bklkLCBhZGRyZXNzLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoLCB0aGlzLnBvbGljeSk7XG4gICAgaWYgKHRoaXMuY2FwdHVyZSkgY2FwdHVyZS5saW1pdCgncmVzdW1lZC1zZWdtZW50Jyk7XG4gICAgdGhpcy5jYXB0dXJlID0gY2FwdHVyZTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQuY2FwdHVyZSA9IGNhcHR1cmU7XG4gICAgcmV0dXJuIGNhcHR1cmU7XG4gIH1cblxuICBwdWJsaWMgZ2xvYmFsU3RvcmU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgLiBQb3B1bGF0ZWQgYnkgZXZlcnkgY29tbWl0IHRoYXRcbiAgICogc3RhZ2VkIGEgd3JpdGUgKGBtZW1vcnkvcmVjb3JkQ29tbWl0LnRzIMK3IHJlY29yZENvbW1pdGApLCB3aXRoIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMuXG4gICAqIE9ubHkgZXhpc3RzIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvciAoYFJ1blBvbGljeS5taXJyb3JgIOKAlFxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHNldHMgaXQgd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBPdGhlcndpc2UgdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogVGhlIHJ1bidzIHNpbmssIHdoZW4gdGhpcyBydW50aW1lJ3MgbG9nIHdyaXRlcyB0byBvbmUg4oCUIGhhbmRlZCBvbiB0byBldmVyeSBtb3VudCAoYHJlY29yZEZvcmApLiAqL1xuICBwcml2YXRlIHJlY29yZFNpbms/OiBSZWNvcmRTaW5rO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgKGBtZW1vcnkvcnVuUG9saWN5LnRzYCkg4oCUIGluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZTtcbiAgICogIGl0cyBgY29tbWl0VmFsdWVzYCBhbmQgYHdyaXRlUHJvdmVuYW5jZWAgYXJlIHRoZSBzbmFwc2hvdCBkaXNjcmltaW5hbnRzLiAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5O1xuXG4gIC8qKiBNZW1vaXplZCBmcm96ZW4gZm9sZCBiYXNlIOKAlCBzZWUge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LiAqL1xuICBwcml2YXRlIF9mb2xkQmFzZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcG9saWN5IFRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgLCBGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGVcbiAgICogICByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnLiBJbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWUgaGVyZSwgc29cbiAgICogICB0aGUgRklSU1QgY29tbWl0IChhIHN1YmZsb3cncyBzZWVkLCBgaGlzdG9yeVswXWApIGFscmVhZHkgcnVucyB1bmRlciBpdDtcbiAgICogICBldmVyeSBmcmFtZSBhZnRlciBpbmhlcml0cyB0aGUgc2FtZSByZWZlcmVuY2UuIERlZmF1bHQ6IGV2ZXJ5IGRpYWwgYXRcbiAgICogICBpdHMgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICByb290SWQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbiAgICBpbml0aWFsU3RhdGU/OiB1bmtub3duLFxuICAgIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZLFxuICAgIHJlY29yZD86IFJ1bnRpbWVSZWNvcmQsXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICB0aGlzLmdsb2JhbFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShkZWZhdWx0VmFsdWVzLCBpbml0aWFsU3RhdGUpO1xuICAgIC8vIFRoZSBldmVudCBsb2cncyBmb2xkIGJhc2UgbXVzdCBiZSB0aGUgU0FNRSBzdGF0ZSB0aGUgc3RvcmUgc3RhcnRzIGZyb21cbiAgICAvLyDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gYFNoYXJlZE1lbW9yeWAgY29tcHV0ZWQgYWJvdmUuIFNlZWRpbmcgdGhlIGxvZyBmcm9tIGBpbml0aWFsU3RhdGVgIGFsb25lXG4gICAgLy8gbGVmdCBgZGVmYXVsdFZhbHVlc2Agb3V0IG9mIGV2ZXJ5IHJlcGxheSwgc28gYSBmb2xkIGNvdWxkIG5vdCByZXByb2R1Y2VcbiAgICAvLyB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuIGBnZXRTdGF0ZSgpYCBpcyB0aGUgbGl2ZSBjb250ZXh0OyB0aGVcbiAgICAvLyBFdmVudExvZyBjb25zdHJ1Y3RvciBjbG9uZXMgaXQsIHNvIHRoZSBiYXNlIHN0YXlzIGRldGFjaGVkLlxuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSA9IG9wZW5Mb2codGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLCByZWNvcmQpO1xuICAgIGlmIChyZWNvcmQgJiYgdGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmRTaW5rID0gcmVjb3JkLnNpbms7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0ID0gdGhpcy5uZXdSb290KHJvb3ROYW1lLCByb290SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBmb3IgdGhpcyBydW50aW1lIOKAlCBgZ2xvYmFsU3RvcmVgLCBgZXhlY3V0aW9uSGlzdG9yeWAsXG4gICAqIHRoZSBydW4ncyBwb2xpY3kgYW5kICh3aGVuIGtlcHQpIHRoZSBtaXJyb3IuIEFsc28gaG93IGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHJlcGxhY2VzIGEgc3ViZmxvdydzIHNlZWQgZnJhbWUgd2l0aCB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24uXG4gICAqL1xuICBuZXdSb290KG5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgY29uc3Qgcm9vdCA9IG5ldyBTdGFnZUNvbnRleHQoJycsIG5hbWUsIGlkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kocm9vdCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IG9uIHRoZSBDVVJSRU5UIHJvb3QgZnJhbWUg4oCUIGEgc2FtZS1leGVjdXRvclxuICAgKiByZXN1bWUsIHdob3NlIGNvbnRpbnVhdGlvbiByb290IChgbGVhZi5jcmVhdGVOZXh0YCkgaXMgYWR2YW5jZWQgYmVmb3JlXG4gICAqIHRoZSBleGVjdXRvciBidWlsZHMgdGhpcyBsZWcncyBwb2xpY3kgKGEgZnJlc2ggcnVsZSBwZXIgbGVnKS4gRXZlcnlcbiAgICogZGVzY2VuZGFudCB0YWtlcyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlcmUuXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kodGhpcy5yb290U3RhZ2VDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IG9uIGByb290YCwgYW5kIHRoZSBtaXJyb3Igc3RvcmUgd2hlbiB0aGUgcG9saWN5IGtlZXBzIG9uZS5cbiAgICogVGhlIG1pcnJvciBpcyBhIFNFUlZFRCBzdXJmYWNlLCBzbyBpdHMgc2VlZCBtdXN0IGFscmVhZHkgYmUgdGhlIHBvbGljeSdzXG4gICAqIHZpZXcgb2YgdGhlIHN0YXJ0aW5nIHN0YXRlOiBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IGBpbml0aWFsQ29udGV4dGBcbiAgICogLyBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIChvciwgb24gYSBjcm9zcy1leGVjdXRvciByZXN1bWUsIGJ5IHRoZVxuICAgKiBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCkgYW5kIGlzIG5ldmVyIHJlLXdyaXR0ZW4gd291bGQgb3RoZXJ3aXNlIHNpdFxuICAgKiBpbiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGluIHBsYWludGV4dCDigJQgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgTE9HJ3MgcGxhY2Vob2xkZXIsIHRoZSBzYW1lIHN0cmluZyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBjYXJyeS5cbiAgICogQ3JlYXRlZCBvbmNlIHBlciBydW50aW1lIChhIHN1YmZsb3cncyBydW50aW1lIGtlZXBzIGl0cyBvd247IGl0cyBzZWVkIGlzXG4gICAqIGVtcHR5IOKAlCB0aGUgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQb2xpY3kocm9vdDogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgcm9vdC51c2VQb2xpY3kodGhpcy5wb2xpY3kpO1xuICAgIGlmICghdGhpcy5wb2xpY3kubWlycm9yKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnJlZGFjdGVkU3RvcmUpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgICB0aGlzLnJlZGFjdGVkU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9kZWZhdWx0VmFsdWVzLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5fZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5faW5pdGlhbFN0YXRlLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5faW5pdGlhbFN0YXRlLFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC51c2VSZWRhY3RlZE1pcnJvcih0aGlzLnJlZGFjdGVkU3RvcmUpO1xuICB9XG5cbiAgLyoqIFByZXNlcnZlIHRoZSBjdXJyZW50IHJvb3RTdGFnZUNvbnRleHQgZm9yIHNuYXBzaG90cyBiZWZvcmUgY2hhbmdpbmcgaXQgZm9yIHJlc3VtZS4gKi9cbiAgcHJlc2VydmVTbmFwc2hvdFJvb3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zbmFwc2hvdFJvb3QpIHtcbiAgICAgIHRoaXMuX3NuYXBzaG90Um9vdCA9IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyb3plbiwgZGV0YWNoZWQgZm9sZCBiYXNlIHNlcnZlZCBhcyB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uXG4gICAqIENvbXB1dGVkIG9uY2UgKHRoZSBiYXNlIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY29uc3RydWN0aW9uKSBhbmQgc2hhcmVkIOKAlFxuICAgKiBzYWZlIGJlY2F1c2UgaXQgaXMgZGVlcGx5IGZyb3plbiwgc28gbm8gaG9sZGVyIGNhbiBtdXRhdGUgaXQgb3IgcmVhY2ggdGhlXG4gICAqIGVuZ2luZSB0aHJvdWdoIGl0OyBhIGJhc2UgaG9sZGluZyBhIERhdGUsIE1hcCwgYnVmZmVyIOKApiAod2hhdCBmcmVlemluZ1xuICAgKiBjYW5ub3Qgc2VhbCkgaXMgc2VydmVkIGJ5IHRoZSBwdWJsaWMgc25hcHNob3QgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzXG4gICAqIChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCwgYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCxcbiAgICogOS40NC4yKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGZyZWV6ZVJlY29yZChiYXNlICYmIHR5cGVvZiBiYXNlID09PSAnb2JqZWN0JyA/IGJhc2UgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb2xkQmFzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBhIG1vdW50J3MgbG9nIHdyaXRlcyAoMTAuMSwgUDYpOiB0aGUgc2FtZSBzaW5rLCBhdCB0aGlzIGxvZydzIGFkZHJlc3MgcGx1cyB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgXG4gICAqIChgZHJpbGxQYXRoOiBbLi4ucGFyZW50LCBtb3VudF1gLCB0aGUgYWRkcmVzcyBsYXcgYFJ1bnRpbWVTbmFwc2hvdC5sb2dBZGRyZXNzYCBzdGF0ZXMpLiBBYnNlbnQgd2hlbiB0aGlzIGxvZ1xuICAgKiB3cml0ZXMgdG8gbm8gc2luayDigJQgYSBtb3VudCBvZiBhIHBsYWluIGxvZyBpcyBwbGFpbiB0b28uXG4gICAqL1xuICByZWNvcmRGb3IobW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nLCBtZXRhPzogTWV0YSk6IFJ1bnRpbWVSZWNvcmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcztcbiAgICBpZiAodGhpcy5yZWNvcmRTaW5rID09PSB1bmRlZmluZWQgfHwgYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaW5rOiB0aGlzLnJlY29yZFNpbmssXG4gICAgICBhZGRyZXNzOiB7IGxvZ1J1bklkOiBhZGRyZXNzLmxvZ1J1bklkLCBkcmlsbFBhdGg6IFsuLi5hZGRyZXNzLmRyaWxsUGF0aCwgbW91bnRSdW50aW1lU3RhZ2VJZF0gfSxcbiAgICAgIC4uLihtZXRhID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbWV0YSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRlbGwgdGhlIHNpbmsgdGhpcyBydW50aW1lJ3MgbG9nIGVuZGVkLiBOb3RoaW5nIGhhcHBlbnMgd2l0aG91dCBhIHNpbms7IG5ldmVyIHRocm93cy4gKi9cbiAgY2xvc2VSZWNvcmQob3V0Y29tZTogTG9nT3V0Y29tZSwgbWV0YT86IE1ldGEpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuY2xvc2Uob3V0Y29tZSwgbWV0YSk7XG4gIH1cblxuICAvKiogTm90ZSBzb21ldGhpbmcgYmVzaWRlIHRoaXMgcnVudGltZSdzIGxvZywgaW4gaXRzIHNpbmsgKGEgcmVzdW1lZCBsZWcpLiBOb3RoaW5nIHdpdGhvdXQgYSBzaW5rOyBuZXZlciB0aHJvd3MuICovXG4gIG5vdGVSZWNvcmQoa2luZDogc3RyaW5nLCBkYXRhOiBNZXRhKTogdm9pZCB7XG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5Lm5vdGUoa2luZCwgZGF0YSk7XG4gIH1cblxuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBzdGF0ZS5waXBlbGluZXMgPyBPYmplY3Qua2V5cyhzdGF0ZS5waXBlbGluZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQuc2V0T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgcmV0dXJucyBgc2hhcmVkU3RhdGVgIGZyb20gdGhlXG4gICAqICAgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIChpZiBvbmUgd2FzIGVuYWJsZWQpLiBUaGlzIGlzIHRoZSBzYWZlIHZpZXdcbiAgICogICBmb3Igc2hhcmluZyB0cmFjZXMgZXh0ZXJuYWxseSDigJQgcGFzdGUgaW50byBhIHZpZXdlciwgc2hpcCB0byBzdXBwb3J0LFxuICAgKiAgIGV0Yy4gV2hlbiB0aGUgbWlycm9yIHdhcyBuZXZlciBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHJhdyBgZ2xvYmFsU3RvcmVgXG4gICAqICAgYW5kIGEgZGV2LW1vZGUgd2FybmluZyBpcyBlbWl0dGVkIChzaWxlbnQgaW4gcHJvZHVjdGlvbikuXG4gICAqXG4gICAqICAgRGVmYXVsdCBgZmFsc2VgIHByZXNlcnZlcyB0aGUgcnVudGltZSB2aWV3IOKAlCBuZWNlc3NhcnkgZm9yIHBhdXNlIC9cbiAgICogICByZXN1bWUgKHJlc3VtcHRpb24gbXVzdCByZXBsYXkgYWdhaW5zdCB0aGUgcmVhbCB2YWx1ZXMsIG5vdFxuICAgKiAgICdbUkVEQUNURURdJykuXG4gICAqXG4gICAqIE90aGVyIGZpZWxkcyAoYGV4ZWN1dGlvblRyZWVgLCBgY29tbWl0TG9nYCkgYXJlIHRoZSBzYW1lIGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSwgYW5kIHRoZSBleGVjdXRpb25cbiAgICogdHJlZSBvbmx5IGNhcnJpZXMgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogYGluaXRpYWxTdGF0ZWAgKHRoZSBmb2xkIGJhc2UpIGlzIE9NSVRURUQgdW5kZXIgYHJlZGFjdDogdHJ1ZWAuIEl0IGlzIHRoZVxuICAgKiBydW4ncyByYXcgcHJlLXJ1biBzZWVkIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoXG4gICAqIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAg4oCUIGFuZCBpdCBuZXZlciBwYXNzZWQgdGhyb3VnaCBhIHJlZGFjdGlvblxuICAgKiBwb2xpY3k6IHRoZSBwb2xpY3kgc2NydWJzIFdSSVRFUyBhdCB0aGUgc2NvcGUgZmFjYWRlLCBhbmQgdGhlIGJhc2Ugd2FzXG4gICAqIG5ldmVyIHdyaXR0ZW4gYnkgYSBzdGFnZS4gU2VydmluZyBpdCBvbiB0aGUgcmVkYWN0ZWQgc3VyZmFjZSB3b3VsZCBoYW5kXG4gICAqIGJhY2sgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgc2VlZGVkIHNlY3JldCB0aGF0IGEgbGF0ZXIgY29tbWl0IGhhZFxuICAgKiBzY3J1YmJlZC4gQSBjb25zdW1lciBmb2xkaW5nIHdpdGhvdXQgaXQgZ2V0cyBgYmFzaXM6ICdsb2ctb25seSdgIGZyb21cbiAgICogYHN0YXRlQXRgLCB3aGljaCBpcyB0aGUgaG9uZXN0IHNpZ25hbCB0aGF0IHRoZSBiYXNlIGRpZCBub3QgdHJhdmVsIHdpdGhcbiAgICogdGhpcyBsb2cg4oCUIGEgcGFydGlhbCBhbnN3ZXIgdGhhdCBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAgICpcbiAgICogUmV0dXJucyBgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCcgfCAnY29ycmVsYXRpb24nPmA6IHRoZSBydW50aW1lIGlzIHRoZSBtZW1vcnlcbiAgICogY29udGFpbmVyIGFuZCBkb2Vzbid0IGtub3cgd2hpY2ggcnVuIGl0IHNlcnZlcyDigJQgYHJ1bklkYCBpcyBwZXItcnVuXG4gICAqIGV4ZWN1dG9yIHN0YXRlLCBzdGFtcGVkIGJ5IGBGbG93Y2hhcnRUcmF2ZXJzZXIuZ2V0U25hcHNob3QoKWAgKHdoaWNoXG4gICAqIG93bnMgdGhlIHJ1bidzIGlkIGFuZCBhbHJlYWR5IHN0YW1wcyBpdCBvbiBldmVyeSBldmVudCkuIFN1YmZsb3dzJ1xuICAgKiBuZXN0ZWQgcnVudGltZXMgZGVsaWJlcmF0ZWx5IGhhdmUgTk8gcnVuSWQgb2YgdGhlaXIgb3duIChhIHN1YmZsb3cgaXNcbiAgICogcGFydCBvZiB0aGUgcGFyZW50J3MgbG9naWNhbCBydW4pLiBgY29ycmVsYXRpb25gIGlzIHRoZSB0cmF2ZXJzZXIncyBmb3JcbiAgICogdGhlIHNhbWUgcmVhc29uLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCcgfCAnY29ycmVsYXRpb24nPiB7XG4gICAgY29uc3Qgc25hcHNob3RSb290ID0gdGhpcy5fc25hcHNob3RSb290ID8/IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICBjb25zdCB1c2VSZWRhY3RlZCA9IG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSAmJiB0aGlzLnJlZGFjdGVkU3RvcmUgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2hhcmVkU3RhdGU6IHVzZVJlZGFjdGVkID8gdGhpcy5yZWRhY3RlZFN0b3JlIS5nZXRTdGF0ZSgpIDogdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3RSb290LmdldFNuYXBzaG90KCksXG4gICAgICAvLyBSRURBQ1RJT046IHRoZSBmb2xkIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuIHNlZWQgYW5kIG5vIHBvbGljeSBldmVyXG4gICAgICAvLyB0b3VjaGVkIGl0IChwb2xpY2llcyBzY3J1YiB3cml0ZXM7IG5vdGhpbmcgd3JvdGUgdGhlIGJhc2UpLiBPbWl0IGl0XG4gICAgICAvLyByYXRoZXIgdGhhbiBsZWFrIGl0IOKAlCBgc3RhdGVBdGAgZGVncmFkZXMgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC5cbiAgICAgIC4uLih1c2VSZWRhY3RlZCA/IHt9IDogeyBpbml0aWFsU3RhdGU6IHRoaXMuZ2V0Rm9sZEJhc2UoKSB9KSxcbiAgICAgIC8vIERFVEFDSEVEOiB0aGUgZW5naW5lIGtlZXBzIGl0cyBsaXZlIEV2ZW50TG9nOyB0aGUgc25hcHNob3QgZ2V0cyBhXG4gICAgICAvLyBmcm96ZW4gYXJyYXkgb2YgaXRzIG93biAoYHJlY29yZGVkKClgIGJ1aWxkcyBhIG5ldyBvbmUpLiBTZXJ2aW5nIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgYXJyYXkgYWxpYXNlZCBpdCwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZ1xuICAgICAgLy8gdW5kZXIgaXRzIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LlxuICAgICAgLy8gVGhlIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYFxuICAgICAgLy8gKEYzKS4gVGhlIHB1YmxpYyBzbmFwc2hvdCBzZXJ2ZXMgdGhlbSAoYHJ1bm5lci9zbmFwc2hvdC50cyDCt1xuICAgICAgLy8gc2VydmVkU25hcHNob3RgLCA5LjQ0LjIpOyB0aGlzIG9uZSBpcyBhbHNvIHRoZSBlbmdpbmUncyBvd24g4oCUIGFcbiAgICAgIC8vIHN1YmZsb3cgbW91bnQgdGFrZXMgaXQgb25jZSBwZXIgbW91bnQg4oCUIHNvIHRoZSBydW4gcGF0aCBzZXJ2ZXMgbm90aGluZy5cbiAgICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZSh0aGlzLmV4ZWN1dGlvbkhpc3RvcnkucmVjb3JkZWQoKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgICAuLi4odGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dBZGRyZXNzOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyB9KSxcbiAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlOiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBydW50aW1lJ3MgbG9nOiB3aXRoIGEgcmVjb3JkLCB0aGUgbG9nIHRoYXQgd3JpdGVzIHRvIHRoZSBzaW5rIGFzIGl0IGxhbmRzLiBBIGJhc2UgdGhlIHNpbmsgY2Fubm90IGNhcnJ5IChpdFxuICogbXVzdCBiZSBhIHBsYWluIG9iamVjdCkgaXMgdGhlIHNpbmsncyBsb3NzLCBuZXZlciB0aGUgcnVuJ3Mg4oCUIHRoZSBsb2cgaXMgdGhlbiB0aGUgcGxhaW4gb25lLCBhbmQgdGhlIGxvc3MgaXNcbiAqIHJlcG9ydGVkIHRvIHRoZSBzaW5rIGxpa2UgYW55IG90aGVyIChgUmVjb3JkU2luay5vbkZhaWx1cmVgKSwgc28gdGhlIHJ1bidzIGFjY291bnRpbmcgbmFtZXMgaXQuXG4gKi9cbmZ1bmN0aW9uIG9wZW5Mb2coYmFzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlY29yZDogUnVudGltZVJlY29yZCB8IHVuZGVmaW5lZCk6IEV2ZW50TG9nIHtcbiAgaWYgKHJlY29yZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IEV2ZW50TG9nKGJhc2UpO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXZlbnRMb2coYmFzZSwgcmVjb3JkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkLnNpbmsub25GYWlsdXJlPy4oe1xuICAgICAgICBlbnRyeTogeyBraW5kOiAnb3BlbmVkJywgYWRkcmVzczogcmVjb3JkLmFkZHJlc3MsIGF0OiBEYXRlLm5vdygpLCBpbml0aWFsU3RhdGU6IHt9IH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgcnVuJ3Mgb3duIHNpbmsgaXNvbGF0ZXMgaXRzIGxpc3RlbmVyOyBhbiBhcHAncyByYXcgYWRhcHRlciBoZXJlIGlzIHRvbGQgb25jZSwgYmVzdCBlZmZvcnQuXG4gICAgfVxuICAgIHJldHVybiBuZXcgRXZlbnRMb2coYmFzZSk7XG4gIH1cbn1cbiJdfQ==
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUlILDJDQUFnSDtBQVNoSCxvRUFBNkQ7QUFFN0QsOERBQXFGO0FBR3JGLHlEQUE0RDtBQUM1RCwrREFBeUQ7QUE4SnpELE1BQWEsZ0JBQWdCO0lBQzNCLFdBQVcsQ0FBMkI7SUFDdEMsNEZBQTRGO0lBQzVGLE9BQU8sQ0FBaUI7SUFFeEIsWUFBWSxDQUFDLEtBQWE7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUksaUNBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdGLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFDeEMsQ0FBQyxDQUFDLElBQUksd0NBQXVCLENB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QU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQzthQUMvRixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxSRCw0Q0FrUkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQUMsSUFBNkIsRUFBRSxNQUFpQztJQUMvRSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLGdCQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLGdCQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ3BGLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaUdBQWlHO1FBQ25HLENBQUM7UUFDRCxPQUFPLElBQUksZ0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhlY3V0aW9uUnVudGltZSDigJQgVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBDb21taXRWYWx1ZXNNb2RlLCBMb2dBZGRyZXNzLCBMb2dPdXRjb21lLCBNZXRhIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkU2luaywgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBjcmVhdGVSZWFkU291cmNlUmVjb3JkLCBFdmVudExvZywgZnJlZXplUmVjb3JkLCBMT0dfUExBQ0VIT0xERVIsIFNoYXJlZE1lbW9yeSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUhpc3RvcnlTdGF0dXMgfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENhcHR1cmVDaGFubmVsU3RhdHVzLFxuICBOYXRpdmVDYXB0dXJlTm90ZSxcbiAgUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50LFxufSBmcm9tICcuLi9jYXB0dXJlL25hdGl2ZUNvdmVyYWdlLmpzJztcbmltcG9ydCB7IE5hdGl2ZUNhcHR1cmUgfSBmcm9tICcuLi9jYXB0dXJlL25hdGl2ZUNvdmVyYWdlLmpzJztcbmltcG9ydCB0eXBlIHsgRW5naW5lUmVhZFNvdXJjZXMsIE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbiwgU291cmNlTGltaXRhdGlvbiB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUsIHdpdGhSZWFkU291cmNlcyB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIE9wdGlvbmFsIGN1cnJlbnQtcnVuIGNhcHR1cmUgYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHJlY29yZGVyIGNvbnRyYWN0LiAqL1xuICBjYXB0dXJlPzogUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50O1xufVxuXG5leHBvcnQgdHlwZSBSdW50aW1lU25hcHNob3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgc25hcHNob3QgYmVsb25ncyB0byDigJQgdGhlIHNhbWUgYHJ1bklkYCBzdGFtcGVkIG9uIGV2ZXJ5XG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0YCAoYW5kIHRodXMgZXZlcnkgcmVjb3JkZXIgZXZlbnQpIG9mIHRoZSBydW4sIHNvIGFcbiAgICogc25hcHNob3QgY2FuIGJlIGpvaW5lZCBhZ2FpbnN0IGFuIGV2ZW50IHN0cmVhbSBvciBhbiBleHRlcm5hbFxuICAgKiBjb3JyZWxhdGlvbiB0YWJsZS4gUmVhZC1vbmx5IGJ5IGNvbnRyYWN0OiBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIChgcnVubmVyL3J1bklkLnRzYCksIG5ldmVyIGRlcml2ZWQgZnJvbSBzbmFwc2hvdCBjb250ZW50cy5cbiAgICpcbiAgICogTGlmZWN5Y2xlIChtYXRjaGVzIHRoZSBldmVudCBtb2RlbCk6IGZyZXNoIHBlciBgcnVuKClgIEFORCBwZXJcbiAgICogYHJlc3VtZSgpYCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1biwgc28gYSBwb3N0LXJlc3VtZVxuICAgKiBzbmFwc2hvdCBjYXJyaWVzIGEgRElGRkVSRU5UIHJ1bklkIHRoYW4gdGhlIHBhdXNlZCBydW4ncyBzbmFwc2hvdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBPcHQtaW4gbmF0aXZlIG9ic2VydmF0aW9uOyByb290IGxvZyBhbmQgY3VycmVudCBsZWcgb25seSwgbmV2ZXIgZHVyYWJsZSBzdG9yYWdlLiAqL1xuICByZWFkb25seSBjYXB0dXJlPzogTmF0aXZlQ2FwdHVyZU9ic2VydmF0aW9uO1xuICAvKiogT3B0LWluIG9yZGVyZWQgbmF0aXZlIG9jY3VycmVuY2VzLiBVbmtub3duIG93bmVyc2hpcCBoYXMgbm8gcmVjb3JkOyBuZXZlciBpbmZlciBvYnNlcnZlZC1lbXB0eS4gKi9cbiAgcmVhZG9ubHkgcmVhZFNvdXJjZXM/OiBFbmdpbmVSZWFkU291cmNlcztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSkg4oCUIGBlbnYudHJhY2VwYXJlbnRgLCBvciBgZW52LnRyYWNlSWRgICsgYGVudi5vcGVyYXRpb25JZGAsIHJlc29sdmVkIG9uY2UgcGVyXG4gICAqIGxlZzsgdGhlIHNhbWUgZnJvemVuIG9iamVjdCBldmVyeSBldmVudCBvZiB0aGUgbGVnIGNhcnJpZXMgKGBUcmF2ZXJzYWxDb250ZXh0LmNvcnJlbGF0aW9uYCwgYSBzY29wZSBldmVudCdzXG4gICAqIGBjb3JyZWxhdGlvbmApLiBMaWtlIGBydW5JZGAsIHBlciBsZWc6IGEgcmVzdW1lIGNhcnJpZXMgSVRTIGVudidzLCBuZXZlciB0aGUgcGF1c2VkIGxlZydzLiBBYnNlbnQg4oCUIG5vXG4gICAqIGtleSDigJQgd2hlbiBub25lIHdhcyBnaXZlbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb247XG4gIHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXhlY3V0aW9uVHJlZTogU3RhZ2VTbmFwc2hvdDtcbiAgLyoqXG4gICAqIFRoZSBjb21taXQgbG9nJ3MgZm9sZCBCQVNFIOKAlCB0aGUgcnVuJ3Mgc3RhdGUgYmVmb3JlIGl0cyBmaXJzdCBjb21taXRcbiAgICogKGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YDsgb24gYSByZXN1bWUsIHRoZVxuICAgKiBjaGVja3BvaW50J3Mgc3RhdGUpLiBEZWVwbHkgZnJvemVuIGFuZCBmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIENvbW1pdCBidW5kbGVzIGFyZSBESUZGUywgc28gdGhlIGxvZyBhbG9uZSBjYW5ub3QgcmVidWlsZCBhIHZhbHVlIHRoYXRcbiAgICogd2FzIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBhbmQgb25seSBldmVyIG1lcmdlZCBhZnRlcndhcmRzLiBTaGlwcGluZyB0aGVcbiAgICogYmFzZSBXSVRIIHRoZSBsb2cgaXMgd2hhdCBtYWtlcyBhbiBvZmZsaW5lIGZvbGQg4oCUIGBzdGF0ZUF0KHNuYXBzaG90LCBpKWBcbiAgICogZnJvbSBgZm9vdHRyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGlzIGxvZywgc3RhYmxlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIHJlc3VtZS4gQWJzZW50IGJlZm9yZSBiaW5kaW5nIG9yIGluIG9sZGVyIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbiAgLyoqXG4gICAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCdzIGFjY291bnRpbmcgKDEwLjEsIFA2KSDigJQgaG93IG1hbnkgZW50cmllcyB0aGUgcnVuIGhhbmRlZCBpdHMgc2luayBhbmQgaG93IG1hbnkgdGhlIHNpbmtcbiAgICogZGlkIG5vdCB0YWtlLiBBQlNFTlQgdW5sZXNzIHRoZSBleGVjdXRvciB3YXMgYnVpbHQgd2l0aCBhIGBzaW5rYCBhbmQgYSBydW4gc3RhcnRlZC5cbiAgICovXG4gIHNpbms/OiBSZWNvcmRTaW5rU3RhdHM7XG59O1xuXG4vKiogYGdldFNuYXBzaG90KCkuc2lua2Ag4oCUIHdoYXQgdGhlIHJ1biBoYW5kZWQgaXRzIHNpbmssIGFuZCB3aGF0IHRoZSBzaW5rIGRpZCBub3QgdGFrZSAoMTAuMSwgUDYpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRTaW5rU3RhdHMge1xuICAvKiogUHJlc2VudCBvbmx5IHdoZW4gZXhwbGljaXQgY2FwdHVyZSBwZXJzaXN0ZW5jZSB3YXMgcmVxdWVzdGVkLiBOZXZlciBpbmZlcnJlZCBmcm9tIGFuIG9yZGluYXJ5IGZsdXNoLiAqL1xuICByZWFkb25seSBjYXB0dXJlPzogQ2FwdHVyZUhpc3RvcnlTdGF0dXM7XG4gIC8qKiBFbnRyaWVzIGhhbmRlZCB0byB0aGUgYWRhcHRlciAoZWFjaCBgb3BlbmVkYCwgYGNvbW1pdGAsIGBub3RlYCwgYGNsb3NlZGAgY2FsbCkuICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIExvc3NlcyDigJQgYSBtZXRob2QgdGhhdCB0aHJldyBvciByZWplY3RlZCwgYW4gZW50cnkgdGhlIGxvZyByZWZ1c2VkIHRvIHNlbmQsIGEgYG1ldGFgIHRoZSBsb2cgY291bGQgbm90IGNvcHlcbiAgICogKHRoYXQgZW50cnkgd2FzIHN0aWxsIHN0b3JlZCwgd2l0aG91dCBpdCksIGFuZCBmYWlsZWQgb3IgdGltZWQtb3V0IGZsdXNoZXMuIEEgcmVqZWN0aW9uIHRoYXQgc2V0dGxlcyBhZnRlciB0aGVcbiAgICogcnVuIGZpbmlzaGVkIGlzIGNvdW50ZWQgd2hlbiBpdCBzZXR0bGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBUaGUgbGFzdCBsb3NzJ3MgZXJyb3IsIGFzIHRleHQuIEFic2VudCB3aGlsZSBub3RoaW5nIHdhcyBsb3N0LiAqL1xuICByZWFkb25seSBsYXN0RXJyb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hlcmUgYSBydW50aW1lJ3MgbG9nIHdyaXRlcyBhcyBpdCBsYW5kcyAoMTAuMSwgUDYpOiB0aGUgcnVuJ3Mgc2luaywgdGhlIGxvZydzIGFkZHJlc3MgYW5kIHdoYXQgdGhlIHdyaXRlciBwdXRzIG9uXG4gKiBpdHMgYG9wZW5lZGAgZW50cnkuIEFic2VudCDihpIgdGhlIGxvZyBpcyB0aGUgcGxhaW4gb25lLWFyZ3VtZW50IGBFdmVudExvZ2AsIGJ5dGUtaWRlbnRpY2FsIHRvIDEwLjAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlY29yZCB7XG4gIHJlYWRvbmx5IHNpbms6IFJlY29yZFNpbms7XG4gIHJlYWRvbmx5IGFkZHJlc3M6IExvZ0FkZHJlc3M7XG4gIHJlYWRvbmx5IG1ldGE/OiBNZXRhO1xufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uUnVudGltZSB7XG4gIHJlYWRTb3VyY2VzPzogRW5naW5lUmVhZFNvdXJjZUNhcHR1cmU7XG4gIC8qKiBQcmVzZW50IG9ubHkgZm9yIHRoZSBjdXJyZW50IG9wdGVkLWluIHJvb3QgbGVnLiBOZXZlciBpbmhlcml0ZWQgYnkgYSBzdWJmbG93IHJ1bnRpbWUuICovXG4gIGNhcHR1cmU/OiBOYXRpdmVDYXB0dXJlO1xuXG4gIGJlZ2luQ2FwdHVyZShydW5JZDogc3RyaW5nKTogTmF0aXZlQ2FwdHVyZSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzID8/IHRoaXMuY2FwdHVyZT8ubG9nQWRkcmVzcyA/PyB7IGxvZ1J1bklkOiBydW5JZCwgZHJpbGxQYXRoOiBbXSB9O1xuICAgIGNvbnN0IGNhcHR1cmUgPSBuZXcgTmF0aXZlQ2FwdHVyZShydW5JZCwgYWRkcmVzcywgdGhpcy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCwgdGhpcy5wb2xpY3kpO1xuICAgIGlmICh0aGlzLmNhcHR1cmUpIGNhcHR1cmUubGltaXQoJ3Jlc3VtZWQtc2VnbWVudCcpO1xuICAgIHRoaXMuY2FwdHVyZSA9IGNhcHR1cmU7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LmNhcHR1cmUgPSBjYXB0dXJlO1xuICAgIHJldHVybiBjYXB0dXJlO1xuICB9XG5cbiAgLyoqIEEgcmV1c2VkIGxvZyBjYW5ub3QgYmUgcmV0cm9maXR0ZWQgb3IgcmVsYWJlbGxlZCBhcyB0aGUgbmV3IGxlZydzIGJhc2UuICovXG4gIHJlc3VtZVJlYWRTb3VyY2VzKHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzPy5yZXRpcmUoKTtcbiAgICB0aGlzLnJlYWRTb3VyY2VzID0gdGhpcy5wb2xpY3kucmVhZFNvdXJjZXNcbiAgICAgID8gbmV3IEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlKHJ1bklkLCB1bmRlZmluZWQsICdyZXN1bWVkLXNvdXJjZS1vd25lcnNoaXAnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnJlYWRTb3VyY2VzID0gdGhpcy5yZWFkU291cmNlcztcbiAgfVxuXG4gIGNhcHR1cmVTbmFwc2hvdChcbiAgICB0bzogbnVtYmVyLFxuICAgIGNvbnRyb2w6IENhcHR1cmVDaGFubmVsU3RhdHVzID0gJ3Vua25vd24nLFxuICAgIHJlZGFjdCA9IGZhbHNlLFxuICApOiBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vdGUgPSB0aGlzLmNhcHR1cmU/LnNuYXBzaG90KHRvLCBjb250cm9sLCByZWRhY3QpO1xuICAgIHJldHVybiBub3RlICYmIHRoaXMucmVhZFNvdXJjZXMgPyB3aXRoUmVhZFNvdXJjZXMobm90ZSwgdGhpcy5yZWFkU291cmNlcy5zbmFwc2hvdCh0bywgcmVkYWN0KSkgOiBub3RlO1xuICB9XG5cbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGJ5IGV2ZXJ5IGNvbW1pdCB0aGF0XG4gICAqIHN0YWdlZCBhIHdyaXRlIChgbWVtb3J5L3JlY29yZENvbW1pdC50cyDCtyByZWNvcmRDb21taXRgKSwgd2l0aCB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IgKGBSdW5Qb2xpY3kubWlycm9yYCDigJRcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCBzZXRzIGl0IHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKS5cbiAgICogT3RoZXJ3aXNlIHVuZGVmaW5lZCBhbmQgemVybyBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpYSBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLlxuICAgKi9cbiAgcHVibGljIHJlZGFjdGVkU3RvcmU/OiBTaGFyZWRNZW1vcnk7XG4gIHB1YmxpYyByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBleGVjdXRpb25IaXN0b3J5OiBFdmVudExvZztcbiAgLyoqIFRoZSBydW4ncyBzaW5rLCB3aGVuIHRoaXMgcnVudGltZSdzIGxvZyB3cml0ZXMgdG8gb25lIOKAlCBoYW5kZWQgb24gdG8gZXZlcnkgbW91bnQgKGByZWNvcmRGb3JgKS4gKi9cbiAgcHJpdmF0ZSByZWNvcmRTaW5rPzogUmVjb3JkU2luaztcbiAgLyoqIE9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkg4oCUIHNldCBiZWZvcmUgcmVzdW1lIGNoYW5nZXMgcm9vdFN0YWdlQ29udGV4dC4gKi9cbiAgcHJpdmF0ZSBfc25hcHNob3RSb290PzogU3RhZ2VDb250ZXh0O1xuICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IHVua25vd247XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IHVua25vd247XG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IChgbWVtb3J5L3J1blBvbGljeS50c2ApIOKAlCBpbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWU7XG4gICAqICBpdHMgYGNvbW1pdFZhbHVlc2AgYW5kIGB3cml0ZVByb3ZlbmFuY2VgIGFyZSB0aGUgc25hcHNob3QgZGlzY3JpbWluYW50cy4gKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeTtcblxuICAvKiogTWVtb2l6ZWQgZnJvemVuIGZvbGQgYmFzZSDigJQgc2VlIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS4gKi9cbiAgcHJpdmF0ZSBfZm9sZEJhc2U/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCwgRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlXG4gICAqICAgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZy4gSW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lIGhlcmUsIHNvXG4gICAqICAgdGhlIEZJUlNUIGNvbW1pdCAoYSBzdWJmbG93J3Mgc2VlZCwgYGhpc3RvcnlbMF1gKSBhbHJlYWR5IHJ1bnMgdW5kZXIgaXQ7XG4gICAqICAgZXZlcnkgZnJhbWUgYWZ0ZXIgaW5oZXJpdHMgdGhlIHNhbWUgcmVmZXJlbmNlLiBEZWZhdWx0OiBldmVyeSBkaWFsIGF0XG4gICAqICAgaXRzIGRlZmF1bHQsIG5vIHJ1bGUsIG5vIG1pcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgcm9vdElkOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4gICAgaW5pdGlhbFN0YXRlPzogdW5rbm93bixcbiAgICBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWSxcbiAgICByZWNvcmQ/OiBSdW50aW1lUmVjb3JkLFxuICAgIHNvdXJjZT86IHsgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZzsgcmVhZG9ubHkgdW5hdmFpbGFibGU/OiBTb3VyY2VMaW1pdGF0aW9uIH0sXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICB0aGlzLmdsb2JhbFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShkZWZhdWx0VmFsdWVzLCBpbml0aWFsU3RhdGUpO1xuICAgIC8vIFRoZSBldmVudCBsb2cncyBmb2xkIGJhc2UgbXVzdCBiZSB0aGUgU0FNRSBzdGF0ZSB0aGUgc3RvcmUgc3RhcnRzIGZyb21cbiAgICAvLyDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gYFNoYXJlZE1lbW9yeWAgY29tcHV0ZWQgYWJvdmUuIFNlZWRpbmcgdGhlIGxvZyBmcm9tIGBpbml0aWFsU3RhdGVgIGFsb25lXG4gICAgLy8gbGVmdCBgZGVmYXVsdFZhbHVlc2Agb3V0IG9mIGV2ZXJ5IHJlcGxheSwgc28gYSBmb2xkIGNvdWxkIG5vdCByZXByb2R1Y2VcbiAgICAvLyB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuIGBnZXRTdGF0ZSgpYCBpcyB0aGUgbGl2ZSBjb250ZXh0OyB0aGVcbiAgICAvLyBFdmVudExvZyBjb25zdHJ1Y3RvciBjbG9uZXMgaXQsIHNvIHRoZSBiYXNlIHN0YXlzIGRldGFjaGVkLlxuICAgIGlmIChwb2xpY3kucmVhZFNvdXJjZXMgJiYgc291cmNlPy5ydW5JZCAmJiAhc291cmNlLnVuYXZhaWxhYmxlICYmICFyZWNvcmQpIHtcbiAgICAgIC8vIFRoZSByZWNvcmQgb3ducyBvcmlnaW4gc2VsZWN0aW9uLCBmaXJzdC10b3VjaCBmYWxsYmFjaywgc3RhZ2luZyBhbmQgY29tbWl0IGFkbWlzc2lvbi5cbiAgICAgIC8vIE9wZW4gb25jZSwgYmVmb3JlIGFueSBmcmFtZSBleGlzdHMuIENvbnN0cnVjdG9yL2Nsb25lIGVycm9ycyBrZWVwIHRoZWlyIG9yaWdpbmFsIGlkZW50aXR5LlxuICAgICAgY29uc3QgYm9vayA9IGNyZWF0ZVJlYWRTb3VyY2VSZWNvcmQoXG4gICAgICAgIHRoaXMuZ2xvYmFsU3RvcmUsXG4gICAgICAgIHsgbG9nUnVuSWQ6IHNvdXJjZS5ydW5JZCwgZHJpbGxQYXRoOiBbXSB9LFxuICAgICAgICB0eXBlb2YgcG9saWN5LnJlYWRTb3VyY2VzID09PSAnb2JqZWN0JyA/IHBvbGljeS5yZWFkU291cmNlcyA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkgPSBib29rLmxvZztcbiAgICAgIHRoaXMucmVhZFNvdXJjZXMgPSBuZXcgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUoc291cmNlLnJ1bklkLCBib29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gb3BlbkxvZyh0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksIHJlY29yZCk7XG4gICAgICBpZiAocG9saWN5LnJlYWRTb3VyY2VzICYmIHNvdXJjZT8ucnVuSWQpXG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXMgPSBuZXcgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUoXG4gICAgICAgICAgc291cmNlLnJ1bklkLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzb3VyY2UudW5hdmFpbGFibGUgPz8gJ3Npbmstc291cmNlLXVuc3VwcG9ydGVkJyxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlY29yZCAmJiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZFNpbmsgPSByZWNvcmQuc2luaztcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSB0aGlzLm5ld1Jvb3Qocm9vdE5hbWUsIHJvb3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmcmVzaCByb290IGZyYW1lIGZvciB0aGlzIHJ1bnRpbWUg4oCUIGBnbG9iYWxTdG9yZWAsIGBleGVjdXRpb25IaXN0b3J5YCxcbiAgICogdGhlIHJ1bidzIHBvbGljeSBhbmQgKHdoZW4ga2VwdCkgdGhlIG1pcnJvci4gQWxzbyBob3cgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogcmVwbGFjZXMgYSBzdWJmbG93J3Mgc2VlZCBmcmFtZSB3aXRoIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbi5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICBjb25zdCByb290ID0gbmV3IFN0YWdlQ29udGV4dCgnJywgbmFtZSwgaWQsIHRoaXMuZ2xvYmFsU3RvcmUsICcnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkpO1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeShyb290KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgb24gdGhlIENVUlJFTlQgcm9vdCBmcmFtZSDigJQgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSwgd2hvc2UgY29udGludWF0aW9uIHJvb3QgKGBsZWFmLmNyZWF0ZU5leHRgKSBpcyBhZHZhbmNlZCBiZWZvcmVcbiAgICogdGhlIGV4ZWN1dG9yIGJ1aWxkcyB0aGlzIGxlZydzIHBvbGljeSAoYSBmcmVzaCBydWxlIHBlciBsZWcpLiBFdmVyeVxuICAgKiBkZXNjZW5kYW50IHRha2VzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGVyZS5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeSh0aGlzLnJvb3RTdGFnZUNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgb24gYHJvb3RgLCBhbmQgdGhlIG1pcnJvciBzdG9yZSB3aGVuIHRoZSBwb2xpY3kga2VlcHMgb25lLlxuICAgKiBUaGUgbWlycm9yIGlzIGEgU0VSVkVEIHN1cmZhY2UsIHNvIGl0cyBzZWVkIG11c3QgYWxyZWFkeSBiZSB0aGUgcG9saWN5J3NcbiAgICogdmlldyBvZiB0aGUgc3RhcnRpbmcgc3RhdGU6IGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgYGluaXRpYWxDb250ZXh0YFxuICAgKiAvIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAgKG9yLCBvbiBhIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSwgYnkgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgKSBhbmQgaXMgbmV2ZXIgcmUtd3JpdHRlbiB3b3VsZCBvdGhlcndpc2Ugc2l0XG4gICAqIGluIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaW4gcGxhaW50ZXh0IOKAlCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBMT0cncyBwbGFjZWhvbGRlciwgdGhlIHNhbWUgc3RyaW5nIHRoZSByZWRhY3RlZCBwYXRjaGVzIGNhcnJ5LlxuICAgKiBDcmVhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgKGEgc3ViZmxvdydzIHJ1bnRpbWUga2VlcHMgaXRzIG93bjsgaXRzIHNlZWQgaXNcbiAgICogZW1wdHkg4oCUIHRoZSBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvbGljeShyb290OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICByb290LnVzZVBvbGljeSh0aGlzLnBvbGljeSk7XG4gICAgcm9vdC5yZWFkU291cmNlcyA9IHRoaXMucmVhZFNvdXJjZXM7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5taXJyb3IpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVkYWN0ZWRTdG9yZSkge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICAgIHRoaXMucmVkYWN0ZWRTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2RlZmF1bHRWYWx1ZXMsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnVzZVJlZGFjdGVkTWlycm9yKHRoaXMucmVkYWN0ZWRTdG9yZSk7XG4gIH1cblxuICAvKiogUHJlc2VydmUgdGhlIGN1cnJlbnQgcm9vdFN0YWdlQ29udGV4dCBmb3Igc25hcHNob3RzIGJlZm9yZSBjaGFuZ2luZyBpdCBmb3IgcmVzdW1lLiAqL1xuICBwcmVzZXJ2ZVNuYXBzaG90Um9vdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NuYXBzaG90Um9vdCkge1xuICAgICAgdGhpcy5fc25hcHNob3RSb290ID0gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJvemVuLCBkZXRhY2hlZCBmb2xkIGJhc2Ugc2VydmVkIGFzIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS5cbiAgICogQ29tcHV0ZWQgb25jZSAodGhlIGJhc2UgbmV2ZXIgY2hhbmdlcyBhZnRlciBjb25zdHJ1Y3Rpb24pIGFuZCBzaGFyZWQg4oCUXG4gICAqIHNhZmUgYmVjYXVzZSBpdCBpcyBkZWVwbHkgZnJvemVuLCBzbyBubyBob2xkZXIgY2FuIG11dGF0ZSBpdCBvciByZWFjaCB0aGVcbiAgICogZW5naW5lIHRocm91Z2ggaXQ7IGEgYmFzZSBob2xkaW5nIGEgRGF0ZSwgTWFwLCBidWZmZXIg4oCmICh3aGF0IGZyZWV6aW5nXG4gICAqIGNhbm5vdCBzZWFsKSBpcyBzZXJ2ZWQgYnkgdGhlIHB1YmxpYyBzbmFwc2hvdCBhcyBhIGNvcHkgb2YgaXRzIG9wZW4gcGF0aHNcbiAgICogKGBydW5uZXIvc25hcHNob3QudHMgwrcgc2VydmVkU25hcHNob3RgLCBgY2FwdHVyZS9mcmVlemUudHMgwrcgc2VydmVSZWNvcmRgLFxuICAgKiA5LjQ0LjIpLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb2xkQmFzZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLl9mb2xkQmFzZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIHRoaXMuX2ZvbGRCYXNlID0gZnJlZXplUmVjb3JkKGJhc2UgJiYgdHlwZW9mIGJhc2UgPT09ICdvYmplY3QnID8gYmFzZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvbGRCYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgbW91bnQncyBsb2cgd3JpdGVzICgxMC4xLCBQNik6IHRoZSBzYW1lIHNpbmssIGF0IHRoaXMgbG9nJ3MgYWRkcmVzcyBwbHVzIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogKGBkcmlsbFBhdGg6IFsuLi5wYXJlbnQsIG1vdW50XWAsIHRoZSBhZGRyZXNzIGxhdyBgUnVudGltZVNuYXBzaG90LmxvZ0FkZHJlc3NgIHN0YXRlcykuIEFic2VudCB3aGVuIHRoaXMgbG9nXG4gICAqIHdyaXRlcyB0byBubyBzaW5rIOKAlCBhIG1vdW50IG9mIGEgcGxhaW4gbG9nIGlzIHBsYWluIHRvby5cbiAgICovXG4gIHJlY29yZEZvcihtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIG1ldGE/OiBNZXRhKTogUnVudGltZVJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzO1xuICAgIGlmICh0aGlzLnJlY29yZFNpbmsgPT09IHVuZGVmaW5lZCB8fCBhZGRyZXNzID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpbms6IHRoaXMucmVjb3JkU2luayxcbiAgICAgIGFkZHJlc3M6IHsgbG9nUnVuSWQ6IGFkZHJlc3MubG9nUnVuSWQsIGRyaWxsUGF0aDogWy4uLmFkZHJlc3MuZHJpbGxQYXRoLCBtb3VudFJ1bnRpbWVTdGFnZUlkXSB9LFxuICAgICAgLi4uKG1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGVsbCB0aGUgc2luayB0aGlzIHJ1bnRpbWUncyBsb2cgZW5kZWQuIE5vdGhpbmcgaGFwcGVucyB3aXRob3V0IGEgc2luazsgbmV2ZXIgdGhyb3dzLiAqL1xuICBjbG9zZVJlY29yZChvdXRjb21lOiBMb2dPdXRjb21lLCBtZXRhPzogTWV0YSk6IHZvaWQge1xuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5jbG9zZShvdXRjb21lLCBtZXRhKTtcbiAgfVxuXG4gIC8qKiBOb3RlIHNvbWV0aGluZyBiZXNpZGUgdGhpcyBydW50aW1lJ3MgbG9nLCBpbiBpdHMgc2luayAoYSByZXN1bWVkIGxlZykuIE5vdGhpbmcgd2l0aG91dCBhIHNpbms7IG5ldmVyIHRocm93cy4gKi9cbiAgbm90ZVJlY29yZChraW5kOiBzdHJpbmcsIGRhdGE6IE1ldGEpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3Rvcnkubm90ZShraW5kLCBkYXRhKTtcbiAgfVxuXG4gIGdldFBpcGVsaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHN0YXRlLnBpcGVsaW5lcyA/IE9iamVjdC5rZXlzKHN0YXRlLnBpcGVsaW5lcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCByZXR1cm5zIGBzaGFyZWRTdGF0ZWAgZnJvbSB0aGVcbiAgICogICBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIG9uZSB3YXMgZW5hYmxlZCkuIFRoaXMgaXMgdGhlIHNhZmUgdmlld1xuICAgKiAgIGZvciBzaGFyaW5nIHRyYWNlcyBleHRlcm5hbGx5IOKAlCBwYXN0ZSBpbnRvIGEgdmlld2VyLCBzaGlwIHRvIHN1cHBvcnQsXG4gICAqICAgZXRjLiBXaGVuIHRoZSBtaXJyb3Igd2FzIG5ldmVyIGVuYWJsZWQsIGZhbGxzIGJhY2sgdG8gcmF3IGBnbG9iYWxTdG9yZWBcbiAgICogICBhbmQgYSBkZXYtbW9kZSB3YXJuaW5nIGlzIGVtaXR0ZWQgKHNpbGVudCBpbiBwcm9kdWN0aW9uKS5cbiAgICpcbiAgICogICBEZWZhdWx0IGBmYWxzZWAgcHJlc2VydmVzIHRoZSBydW50aW1lIHZpZXcg4oCUIG5lY2Vzc2FyeSBmb3IgcGF1c2UgL1xuICAgKiAgIHJlc3VtZSAocmVzdW1wdGlvbiBtdXN0IHJlcGxheSBhZ2FpbnN0IHRoZSByZWFsIHZhbHVlcywgbm90XG4gICAqICAgJ1tSRURBQ1RFRF0nKS5cbiAgICpcbiAgICogT3RoZXIgZmllbGRzIChgZXhlY3V0aW9uVHJlZWAsIGBjb21taXRMb2dgKSBhcmUgdGhlIHNhbWUgZWl0aGVyIHdheSDigJRcbiAgICogdGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lLCBhbmQgdGhlIGV4ZWN1dGlvblxuICAgKiB0cmVlIG9ubHkgY2FycmllcyBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiBgaW5pdGlhbFN0YXRlYCAodGhlIGZvbGQgYmFzZSkgaXMgT01JVFRFRCB1bmRlciBgcmVkYWN0OiB0cnVlYC4gSXQgaXMgdGhlXG4gICAqIHJ1bidzIHJhdyBwcmUtcnVuIHNlZWQg4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGhcbiAgICogYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCDigJQgYW5kIGl0IG5ldmVyIHBhc3NlZCB0aHJvdWdoIGEgcmVkYWN0aW9uXG4gICAqIHBvbGljeTogdGhlIHBvbGljeSBzY3J1YnMgV1JJVEVTIGF0IHRoZSBzY29wZSBmYWNhZGUsIGFuZCB0aGUgYmFzZSB3YXNcbiAgICogbmV2ZXIgd3JpdHRlbiBieSBhIHN0YWdlLiBTZXJ2aW5nIGl0IG9uIHRoZSByZWRhY3RlZCBzdXJmYWNlIHdvdWxkIGhhbmRcbiAgICogYmFjayB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSBzZWVkZWQgc2VjcmV0IHRoYXQgYSBsYXRlciBjb21taXQgaGFkXG4gICAqIHNjcnViYmVkLiBBIGNvbnN1bWVyIGZvbGRpbmcgd2l0aG91dCBpdCBnZXRzIGBiYXNpczogJ2xvZy1vbmx5J2AgZnJvbVxuICAgKiBgc3RhdGVBdGAsIHdoaWNoIGlzIHRoZSBob25lc3Qgc2lnbmFsIHRoYXQgdGhlIGJhc2UgZGlkIG5vdCB0cmF2ZWwgd2l0aFxuICAgKiB0aGlzIGxvZyDigJQgYSBwYXJ0aWFsIGFuc3dlciB0aGF0IHNheXMgaXQgaXMgcGFydGlhbCwgbmV2ZXIgYSBzaWxlbnQgb25lLlxuICAgKlxuICAgKiBSZXR1cm5zIGBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJyB8ICdjb3JyZWxhdGlvbic+YDogdGhlIHJ1bnRpbWUgaXMgdGhlIG1lbW9yeVxuICAgKiBjb250YWluZXIgYW5kIGRvZXNuJ3Qga25vdyB3aGljaCBydW4gaXQgc2VydmVzIOKAlCBgcnVuSWRgIGlzIHBlci1ydW5cbiAgICogZXhlY3V0b3Igc3RhdGUsIHN0YW1wZWQgYnkgYEZsb3djaGFydFRyYXZlcnNlci5nZXRTbmFwc2hvdCgpYCAod2hpY2hcbiAgICogb3ducyB0aGUgcnVuJ3MgaWQgYW5kIGFscmVhZHkgc3RhbXBzIGl0IG9uIGV2ZXJ5IGV2ZW50KS4gU3ViZmxvd3MnXG4gICAqIG5lc3RlZCBydW50aW1lcyBkZWxpYmVyYXRlbHkgaGF2ZSBOTyBydW5JZCBvZiB0aGVpciBvd24gKGEgc3ViZmxvdyBpc1xuICAgKiBwYXJ0IG9mIHRoZSBwYXJlbnQncyBsb2dpY2FsIHJ1bikuIGBjb3JyZWxhdGlvbmAgaXMgdGhlIHRyYXZlcnNlcidzIGZvclxuICAgKiB0aGUgc2FtZSByZWFzb24uXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJyB8ICdjb3JyZWxhdGlvbic+IHtcbiAgICBjb25zdCBzbmFwc2hvdFJvb3QgPSB0aGlzLl9zbmFwc2hvdFJvb3QgPz8gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHVzZVJlZGFjdGVkID0gb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlICYmIHRoaXMucmVkYWN0ZWRTdG9yZSAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFyZWRTdGF0ZTogdXNlUmVkYWN0ZWQgPyB0aGlzLnJlZGFjdGVkU3RvcmUhLmdldFN0YXRlKCkgOiB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdFJvb3QuZ2V0U25hcHNob3QoKSxcbiAgICAgIC8vIFJFREFDVElPTjogdGhlIGZvbGQgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW4gc2VlZCBhbmQgbm8gcG9saWN5IGV2ZXJcbiAgICAgIC8vIHRvdWNoZWQgaXQgKHBvbGljaWVzIHNjcnViIHdyaXRlczsgbm90aGluZyB3cm90ZSB0aGUgYmFzZSkuIE9taXQgaXRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGxlYWsgaXQg4oCUIGBzdGF0ZUF0YCBkZWdyYWRlcyB0byBgYmFzaXM6ICdsb2ctb25seSdgLlxuICAgICAgLi4uKHVzZVJlZGFjdGVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogdGhpcy5nZXRGb2xkQmFzZSgpIH0pLFxuICAgICAgLy8gREVUQUNIRUQ6IHRoZSBlbmdpbmUga2VlcHMgaXRzIGxpdmUgRXZlbnRMb2c7IHRoZSBzbmFwc2hvdCBnZXRzIGFcbiAgICAgIC8vIGZyb3plbiBhcnJheSBvZiBpdHMgb3duIChgcmVjb3JkZWQoKWAgYnVpbGRzIGEgbmV3IG9uZSkuIFNlcnZpbmcgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSBhbGlhc2VkIGl0LCBzbyBhIHNuYXBzaG90IHRha2VuIG1pZC1ydW4ga2VwdCBncm93aW5nXG4gICAgICAvLyB1bmRlciBpdHMgaG9sZGVyIGFuZCBhIGNvbnN1bWVyIGNvdWxkIHNwbGljZSB0aGUgZW5naW5lJ3Mgb3duIGhpc3RvcnkuXG4gICAgICAvLyBUaGUgYnVuZGxlcyBpbiBpdCBhcmUgdGhlIGxvZydzIG93biwgZnJvemVuIGF0IGBFdmVudExvZyDCtyByZWNvcmRgXG4gICAgICAvLyAoRjMpLiBUaGUgcHVibGljIHNuYXBzaG90IHNlcnZlcyB0aGVtIChgcnVubmVyL3NuYXBzaG90LnRzIMK3XG4gICAgICAvLyBzZXJ2ZWRTbmFwc2hvdGAsIDkuNDQuMik7IHRoaXMgb25lIGlzIGFsc28gdGhlIGVuZ2luZSdzIG93biDigJQgYVxuICAgICAgLy8gc3ViZmxvdyBtb3VudCB0YWtlcyBpdCBvbmNlIHBlciBtb3VudCDigJQgc28gdGhlIHJ1biBwYXRoIHNlcnZlcyBub3RoaW5nLlxuICAgICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5yZWNvcmRlZCgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIC4uLih0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzIH0pLFxuICAgICAgY29tbWl0VmFsdWVzOiB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2U6IHRoaXMucG9saWN5LndyaXRlUHJvdmVuYW5jZSxcbiAgICAgIC4uLih0aGlzLnJlYWRTb3VyY2VzICYmIHtcbiAgICAgICAgcmVhZFNvdXJjZXM6IHRoaXMucmVhZFNvdXJjZXMuc25hcHNob3QodGhpcy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCwgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSdzIGxvZzogd2l0aCBhIHJlY29yZCwgdGhlIGxvZyB0aGF0IHdyaXRlcyB0byB0aGUgc2luayBhcyBpdCBsYW5kcy4gQSBiYXNlIHRoZSBzaW5rIGNhbm5vdCBjYXJyeSAoaXRcbiAqIG11c3QgYmUgYSBwbGFpbiBvYmplY3QpIGlzIHRoZSBzaW5rJ3MgbG9zcywgbmV2ZXIgdGhlIHJ1bidzIOKAlCB0aGUgbG9nIGlzIHRoZW4gdGhlIHBsYWluIG9uZSwgYW5kIHRoZSBsb3NzIGlzXG4gKiByZXBvcnRlZCB0byB0aGUgc2luayBsaWtlIGFueSBvdGhlciAoYFJlY29yZFNpbmsub25GYWlsdXJlYCksIHNvIHRoZSBydW4ncyBhY2NvdW50aW5nIG5hbWVzIGl0LlxuICovXG5mdW5jdGlvbiBvcGVuTG9nKGJhc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6IFJ1bnRpbWVSZWNvcmQgfCB1bmRlZmluZWQpOiBFdmVudExvZyB7XG4gIGlmIChyZWNvcmQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBFdmVudExvZyhiYXNlKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEV2ZW50TG9nKGJhc2UsIHJlY29yZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZC5zaW5rLm9uRmFpbHVyZT8uKHtcbiAgICAgICAgZW50cnk6IHsga2luZDogJ29wZW5lZCcsIGFkZHJlc3M6IHJlY29yZC5hZGRyZXNzLCBhdDogRGF0ZS5ub3coKSwgaW5pdGlhbFN0YXRlOiB7fSB9LFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHJ1bidzIG93biBzaW5rIGlzb2xhdGVzIGl0cyBsaXN0ZW5lcjsgYW4gYXBwJ3MgcmF3IGFkYXB0ZXIgaGVyZSBpcyB0b2xkIG9uY2UsIGJlc3QgZWZmb3J0LlxuICAgIH1cbiAgICByZXR1cm4gbmV3IEV2ZW50TG9nKGJhc2UpO1xuICB9XG59XG4iXX0=
|