footprintjs 10.1.0 → 10.2.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.
Files changed (64) hide show
  1. package/CLAUDE.md +18 -0
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/attempt/category.d.ts +6 -0
  5. package/dist/esm/lib/attempt/category.js +26 -2
  6. package/dist/esm/lib/attempt/runner.d.ts +3 -1
  7. package/dist/esm/lib/attempt/runner.js +26 -6
  8. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  9. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  10. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  11. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  12. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  13. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  14. package/dist/esm/lib/engine/handlers/stageError.d.ts +2 -0
  15. package/dist/esm/lib/engine/handlers/stageError.js +13 -1
  16. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  17. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  18. package/dist/esm/lib/engine/narrative/types.d.ts +4 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +14 -6
  21. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  22. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  23. package/dist/esm/lib/memory/StageContext.d.ts +14 -0
  24. package/dist/esm/lib/memory/StageContext.js +32 -1
  25. package/dist/esm/lib/memory/attention.d.ts +26 -0
  26. package/dist/esm/lib/memory/attention.js +171 -0
  27. package/dist/esm/lib/memory/frameTypes.d.ts +8 -0
  28. package/dist/esm/lib/memory/frameTypes.js +1 -1
  29. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +14 -0
  30. package/dist/esm/lib/recorder/ControlDepRecorder.js +18 -1
  31. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -0
  32. package/dist/esm/lib/runner/FlowChartExecutor.js +163 -127
  33. package/dist/index.js +1 -1
  34. package/dist/lib/attempt/category.js +27 -2
  35. package/dist/lib/attempt/runner.js +25 -5
  36. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  37. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  38. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  39. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  40. package/dist/lib/engine/handlers/commitStage.js +24 -5
  41. package/dist/lib/engine/handlers/stageError.js +15 -2
  42. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  43. package/dist/lib/engine/narrative/types.js +1 -1
  44. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -4
  45. package/dist/lib/errors/terminalFailure.js +64 -0
  46. package/dist/lib/memory/StageContext.js +32 -1
  47. package/dist/lib/memory/attention.js +175 -0
  48. package/dist/lib/memory/frameTypes.js +1 -1
  49. package/dist/lib/recorder/ControlDepRecorder.js +18 -1
  50. package/dist/lib/runner/FlowChartExecutor.js +163 -127
  51. package/dist/types/index.d.ts +2 -0
  52. package/dist/types/lib/attempt/category.d.ts +6 -0
  53. package/dist/types/lib/attempt/runner.d.ts +3 -1
  54. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  55. package/dist/types/lib/engine/handlers/stageError.d.ts +2 -0
  56. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  57. package/dist/types/lib/engine/narrative/types.d.ts +4 -1
  58. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  59. package/dist/types/lib/memory/StageContext.d.ts +14 -0
  60. package/dist/types/lib/memory/attention.d.ts +26 -0
  61. package/dist/types/lib/memory/frameTypes.d.ts +8 -0
  62. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +14 -0
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -0
  64. package/package.json +6 -6
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StageAttention = void 0;
4
+ const foottrace_1 = require("foottrace");
5
+ const MAX_MARKS = 32;
6
+ const MAX_REFERENCES = 16;
7
+ const MAX_REFERENCE_LENGTH = 512;
8
+ const STOPPED_REASONS = new Set(['exhausted', 'declined', 'no-time-left']);
9
+ const MISSING_ATTENTION = Object.freeze({
10
+ kind: 'not-collected',
11
+ reason: 'EVIDENCE_NOT_COLLECTED',
12
+ evidence: Object.freeze([]),
13
+ });
14
+ function validReference(reference) {
15
+ return (typeof reference === 'string' &&
16
+ reference.length > 0 &&
17
+ reference.length <= MAX_REFERENCE_LENGTH &&
18
+ // eslint-disable-next-line no-control-regex -- Match the shared Foottrace evidence-reference boundary.
19
+ !/[\u0000-\u001f\u007f-\u009f]/.test(reference));
20
+ }
21
+ /** Reuse the one attempt grammar, including nested call addresses; never shorten an unaddressable proof. */
22
+ function attemptReference(record, owner) {
23
+ if (typeof record.series !== 'string' ||
24
+ !Number.isSafeInteger(record.attempt) ||
25
+ record.attempt < 1 ||
26
+ record.series.length + String(record.attempt).length + 1 > MAX_REFERENCE_LENGTH)
27
+ return undefined;
28
+ try {
29
+ const candidate = record.series + '@' + record.attempt;
30
+ const parts = (0, foottrace_1.parseAttemptId)(candidate);
31
+ if (!parts ||
32
+ parts.runtimeStageId !== owner ||
33
+ (record.kind === 'stage' ? parts.call !== undefined : parts.call === undefined))
34
+ return undefined;
35
+ const canonical = (0, foottrace_1.buildAttemptId)(parts.runtimeStageId, parts.attempt, parts.call);
36
+ return canonical === candidate && validReference(canonical) ? canonical : undefined;
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ }
42
+ /** One execution's ownership, pending summary, marks and omission accounting stay in this helper. */
43
+ class StageAttention {
44
+ marks;
45
+ omitted = false;
46
+ retryPossible = false;
47
+ summary;
48
+ terminal;
49
+ /** A new execution starts fresh; an attempt discard never calls this. No collection is reconstructed. */
50
+ begin() {
51
+ this.marks = undefined;
52
+ this.omitted = false;
53
+ this.retryPossible = false;
54
+ this.summary = undefined;
55
+ this.terminal = undefined;
56
+ }
57
+ /** Called only after the frame retained this attempt. Raw error, target and decision payloads are never read. */
58
+ recordAttempt(record, owner) {
59
+ const reference = attemptReference(record, owner);
60
+ if (record.kind === 'stage' && record.series === owner) {
61
+ if (record.retryLoop === undefined && (record.of ?? 1) > 1)
62
+ this.retryPossible = true;
63
+ if (reference && record.next !== 'retry') {
64
+ this.terminal = { next: record.next, reason: record.reason, effect: record.effect, evidence: reference };
65
+ }
66
+ }
67
+ // The runner calls recordSummary before its final attempt. Finish that pending projection now too.
68
+ this.projectSummary();
69
+ const add = (kind, reason) => {
70
+ if (reference)
71
+ this.append({ kind, reason, evidence: [reference] });
72
+ else
73
+ this.missing();
74
+ };
75
+ if (record.effect === 'unknown')
76
+ add('unknown-effect', 'UNKNOWN_EFFECT_RECORDED');
77
+ if (record.outcome === 'timeout')
78
+ add('timeout', 'TIMEOUT_RECORDED');
79
+ // An SDK's suggested next/reason is not its actual policy; only a later ordinal proves its retry.
80
+ const observed = record.kind === 'observed';
81
+ if ((!observed && record.next === 'retry') || record.attempt > 1)
82
+ add('retried', 'RETRY_RECORDED');
83
+ if (!observed &&
84
+ record.next === 'stop' &&
85
+ STOPPED_REASONS.has(record.reason) &&
86
+ (record.of ?? 1) > 1 &&
87
+ record.retryLoop === undefined)
88
+ add('gave-up', 'RETRY_STOP_RECORDED');
89
+ }
90
+ recordSummary(summary) {
91
+ this.summary = summary;
92
+ this.projectSummary();
93
+ }
94
+ /** A summary-only cut wait has no phantom final attempt; use its actual retained summary. */
95
+ projectSummary() {
96
+ const last = this.summary?.last;
97
+ if (!last)
98
+ return;
99
+ const terminal = this.terminal;
100
+ const matching = terminal?.next === last.next && terminal.reason === last.reason;
101
+ const add = (kind, reason, proof) => {
102
+ const reference = proof ?? 'attemptSummary';
103
+ const key = kind + ':' + reason;
104
+ const marks = this.marks;
105
+ const previous = marks?.get(key);
106
+ if (proof && marks && previous?.evidence.includes('attemptSummary')) {
107
+ marks.set(key, { ...previous, evidence: previous.evidence.filter((item) => item !== 'attemptSummary') });
108
+ }
109
+ this.append({ kind, reason, evidence: [reference] });
110
+ };
111
+ if (last.effect === 'unknown')
112
+ add('unknown-effect', 'UNKNOWN_EFFECT_RECORDED', matching && terminal.effect === 'unknown' ? terminal.evidence : undefined);
113
+ if (this.retryPossible && last.next === 'stop' && STOPPED_REASONS.has(last.reason))
114
+ add('gave-up', 'RETRY_STOP_RECORDED', matching ? terminal.evidence : undefined);
115
+ }
116
+ /** Only the explicit retained stage-error path calls this; a diagnostic value never classifies itself. */
117
+ stageFailed(errors) {
118
+ try {
119
+ const descriptor = errors && typeof errors === 'object'
120
+ ? Object.getOwnPropertyDescriptor(errors, 'stageExecutionError')
121
+ : undefined;
122
+ if (descriptor && Object.hasOwn(descriptor, 'value')) {
123
+ this.append({ kind: 'error', reason: 'ERROR_RECORDED', evidence: ['errors:stageExecutionError'] });
124
+ return;
125
+ }
126
+ }
127
+ catch {
128
+ /* A malformed evidence bag is unavailable, never another stage failure. */
129
+ }
130
+ this.missing();
131
+ }
132
+ attemptDropped() {
133
+ this.append({ kind: 'not-collected', reason: 'EVIDENCE_NOT_COLLECTED', evidence: ['attemptsDropped'] });
134
+ }
135
+ /** Keep only bounded exact references; one slot is reserved to disclose omissions. */
136
+ append(attention) {
137
+ const key = attention.kind + ':' + attention.reason;
138
+ const previous = this.marks?.get(key);
139
+ const references = [...(previous?.evidence ?? [])];
140
+ for (const reference of attention.evidence) {
141
+ if (!validReference(reference)) {
142
+ this.omitted = true;
143
+ continue;
144
+ }
145
+ if (references.includes(reference))
146
+ continue;
147
+ if (references.length >= MAX_REFERENCES) {
148
+ this.omitted = true;
149
+ continue;
150
+ }
151
+ references.push(reference);
152
+ }
153
+ if (attention.kind !== 'not-collected' && references.length === 0) {
154
+ this.omitted = true;
155
+ return;
156
+ }
157
+ if (!previous && (this.marks?.size ?? 0) >= MAX_MARKS - 1) {
158
+ this.omitted = true;
159
+ return;
160
+ }
161
+ (this.marks ??= new Map()).set(key, { kind: attention.kind, reason: attention.reason, evidence: references });
162
+ }
163
+ missing() {
164
+ this.omitted = true;
165
+ }
166
+ /** Copy already collected bounded marks, never an attempt array, diagnostic bag or execution tree. */
167
+ snapshot() {
168
+ const result = [...(this.marks?.values() ?? [])].map((attention) => Object.freeze({ ...attention, evidence: Object.freeze([...attention.evidence]) }));
169
+ if (this.omitted && !result.some((attention) => attention.kind === 'not-collected'))
170
+ result.push(MISSING_ATTENTION);
171
+ return Object.freeze(result);
172
+ }
173
+ }
174
+ exports.StageAttention = StageAttention;
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW50aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYXR0ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHlDQUEyRDtBQUkzRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDckIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBQzNFLE1BQU0saUJBQWlCLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxJQUFJLEVBQUUsZUFBZTtJQUNyQixNQUFNLEVBQUUsd0JBQXdCO0lBQ2hDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztDQUM1QixDQUFDLENBQUM7QUFFSCxTQUFTLGNBQWMsQ0FBQyxTQUFrQjtJQUN4QyxPQUFPLENBQ0wsT0FBTyxTQUFTLEtBQUssUUFBUTtRQUM3QixTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDcEIsU0FBUyxDQUFDLE1BQU0sSUFBSSxvQkFBb0I7UUFDeEMsdUdBQXVHO1FBQ3ZHLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUNoRCxDQUFDO0FBQ0osQ0FBQztBQUVELDRHQUE0RztBQUM1RyxTQUFTLGdCQUFnQixDQUFDLE1BQXFCLEVBQUUsS0FBYTtJQUM1RCxJQUNFLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRO1FBQ2pDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQztRQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsb0JBQW9CO1FBRS9FLE9BQU8sU0FBUyxDQUFDO0lBQ25CLElBQUksQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBQSwwQkFBYyxFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQ0UsQ0FBQyxLQUFLO1lBQ04sS0FBSyxDQUFDLGNBQWMsS0FBSyxLQUFLO1lBQzlCLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztZQUUvRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFBLDBCQUFjLEVBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRixPQUFPLFNBQVMsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFJRCxxR0FBcUc7QUFDckcsTUFBYSxjQUFjO0lBQ2pCLEtBQUssQ0FBMEI7SUFDL0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE9BQU8sQ0FBa0I7SUFDekIsUUFBUSxDQUFpQjtJQUVqQyx5R0FBeUc7SUFDekcsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7SUFFRCxpSEFBaUg7SUFDakgsYUFBYSxDQUFDLE1BQXFCLEVBQUUsS0FBYTtRQUNoRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3ZELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDdEYsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUMzRyxDQUFDO1FBQ0gsQ0FBQztRQUNELG1HQUFtRztRQUNuRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUF1QixFQUFFLE1BQTJCLEVBQUUsRUFBRTtZQUNuRSxJQUFJLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztnQkFDL0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDbEYsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDckUsa0dBQWtHO1FBQ2xHLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO1FBQzVDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQztZQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNuRyxJQUNFLENBQUMsUUFBUTtZQUNULE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUN0QixlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbEMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDcEIsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBRTlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQXVCO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsNkZBQTZGO0lBQ3JGLGNBQWM7UUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsUUFBUSxFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNqRixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQXVCLEVBQUUsTUFBMkIsRUFBRSxLQUFjLEVBQUUsRUFBRTtZQUNuRixNQUFNLFNBQVMsR0FBRyxLQUFLLElBQUksZ0JBQWdCLENBQUM7WUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0csQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUMzQixHQUFHLENBQ0QsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDMUUsQ0FBQztRQUNKLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDaEYsR0FBRyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCwwR0FBMEc7SUFDMUcsV0FBVyxDQUFDLE1BQWU7UUFDekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQ2QsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7Z0JBQ2xDLENBQUMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDO2dCQUNoRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkcsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMkVBQTJFO1FBQzdFLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVELHNGQUFzRjtJQUN0RixNQUFNLENBQUMsU0FBb0I7UUFDekIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUFFLFNBQVM7WUFDN0MsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsU0FBUztZQUNYLENBQUM7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssZUFBZSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU87UUFDVCxDQUFDO1FBQ0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLFFBQVE7UUFDTixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ2xGLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBMUlELHdDQTBJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBFbmdpbmUtb3duZWQgYXR0ZW50aW9uIGlzIGNvbGxlY3RlZCB3aXRoIHJldGFpbmVkIGZhY3RzOyBzbmFwc2hvdHMgb25seSBjb3B5IHRoaXMgYm91bmRlZCBwcm9qZWN0aW9uLiAqL1xuaW1wb3J0IHR5cGUgeyBBdHRlbnRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgYnVpbGRBdHRlbXB0SWQsIHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0UmVjb3JkLCBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuXG5jb25zdCBNQVhfTUFSS1MgPSAzMjtcbmNvbnN0IE1BWF9SRUZFUkVOQ0VTID0gMTY7XG5jb25zdCBNQVhfUkVGRVJFTkNFX0xFTkdUSCA9IDUxMjtcbmNvbnN0IFNUT1BQRURfUkVBU09OUyA9IG5ldyBTZXQoWydleGhhdXN0ZWQnLCAnZGVjbGluZWQnLCAnbm8tdGltZS1sZWZ0J10pO1xuY29uc3QgTUlTU0lOR19BVFRFTlRJT046IEF0dGVudGlvbiA9IE9iamVjdC5mcmVlemUoe1xuICBraW5kOiAnbm90LWNvbGxlY3RlZCcsXG4gIHJlYXNvbjogJ0VWSURFTkNFX05PVF9DT0xMRUNURUQnLFxuICBldmlkZW5jZTogT2JqZWN0LmZyZWV6ZShbXSksXG59KTtcblxuZnVuY3Rpb24gdmFsaWRSZWZlcmVuY2UocmVmZXJlbmNlOiB1bmtub3duKTogcmVmZXJlbmNlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHJlZmVyZW5jZSA9PT0gJ3N0cmluZycgJiZcbiAgICByZWZlcmVuY2UubGVuZ3RoID4gMCAmJlxuICAgIHJlZmVyZW5jZS5sZW5ndGggPD0gTUFYX1JFRkVSRU5DRV9MRU5HVEggJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBNYXRjaCB0aGUgc2hhcmVkIEZvb3R0cmFjZSBldmlkZW5jZS1yZWZlcmVuY2UgYm91bmRhcnkuXG4gICAgIS9bXFx1MDAwMC1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXS8udGVzdChyZWZlcmVuY2UpXG4gICk7XG59XG5cbi8qKiBSZXVzZSB0aGUgb25lIGF0dGVtcHQgZ3JhbW1hciwgaW5jbHVkaW5nIG5lc3RlZCBjYWxsIGFkZHJlc3NlczsgbmV2ZXIgc2hvcnRlbiBhbiB1bmFkZHJlc3NhYmxlIHByb29mLiAqL1xuZnVuY3Rpb24gYXR0ZW1wdFJlZmVyZW5jZShyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIG93bmVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgdHlwZW9mIHJlY29yZC5zZXJpZXMgIT09ICdzdHJpbmcnIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlY29yZC5hdHRlbXB0KSB8fFxuICAgIHJlY29yZC5hdHRlbXB0IDwgMSB8fFxuICAgIHJlY29yZC5zZXJpZXMubGVuZ3RoICsgU3RyaW5nKHJlY29yZC5hdHRlbXB0KS5sZW5ndGggKyAxID4gTUFYX1JFRkVSRU5DRV9MRU5HVEhcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcmVjb3JkLnNlcmllcyArICdAJyArIHJlY29yZC5hdHRlbXB0O1xuICAgIGNvbnN0IHBhcnRzID0gcGFyc2VBdHRlbXB0SWQoY2FuZGlkYXRlKTtcbiAgICBpZiAoXG4gICAgICAhcGFydHMgfHxcbiAgICAgIHBhcnRzLnJ1bnRpbWVTdGFnZUlkICE9PSBvd25lciB8fFxuICAgICAgKHJlY29yZC5raW5kID09PSAnc3RhZ2UnID8gcGFydHMuY2FsbCAhPT0gdW5kZWZpbmVkIDogcGFydHMuY2FsbCA9PT0gdW5kZWZpbmVkKVxuICAgIClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2Fub25pY2FsID0gYnVpbGRBdHRlbXB0SWQocGFydHMucnVudGltZVN0YWdlSWQsIHBhcnRzLmF0dGVtcHQsIHBhcnRzLmNhbGwpO1xuICAgIHJldHVybiBjYW5vbmljYWwgPT09IGNhbmRpZGF0ZSAmJiB2YWxpZFJlZmVyZW5jZShjYW5vbmljYWwpID8gY2Fub25pY2FsIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbnR5cGUgVGVybWluYWxQcm9vZiA9IFBpY2s8QXR0ZW1wdFJlY29yZCwgJ25leHQnIHwgJ3JlYXNvbicgfCAnZWZmZWN0Jz4gJiB7IHJlYWRvbmx5IGV2aWRlbmNlOiBzdHJpbmcgfTtcblxuLyoqIE9uZSBleGVjdXRpb24ncyBvd25lcnNoaXAsIHBlbmRpbmcgc3VtbWFyeSwgbWFya3MgYW5kIG9taXNzaW9uIGFjY291bnRpbmcgc3RheSBpbiB0aGlzIGhlbHBlci4gKi9cbmV4cG9ydCBjbGFzcyBTdGFnZUF0dGVudGlvbiB7XG4gIHByaXZhdGUgbWFya3M/OiBNYXA8c3RyaW5nLCBBdHRlbnRpb24+O1xuICBwcml2YXRlIG9taXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeVBvc3NpYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgc3VtbWFyeT86IEF0dGVtcHRTdW1tYXJ5O1xuICBwcml2YXRlIHRlcm1pbmFsPzogVGVybWluYWxQcm9vZjtcblxuICAvKiogQSBuZXcgZXhlY3V0aW9uIHN0YXJ0cyBmcmVzaDsgYW4gYXR0ZW1wdCBkaXNjYXJkIG5ldmVyIGNhbGxzIHRoaXMuIE5vIGNvbGxlY3Rpb24gaXMgcmVjb25zdHJ1Y3RlZC4gKi9cbiAgYmVnaW4oKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9taXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJldHJ5UG9zc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnN1bW1hcnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50ZXJtaW5hbCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgb25seSBhZnRlciB0aGUgZnJhbWUgcmV0YWluZWQgdGhpcyBhdHRlbXB0LiBSYXcgZXJyb3IsIHRhcmdldCBhbmQgZGVjaXNpb24gcGF5bG9hZHMgYXJlIG5ldmVyIHJlYWQuICovXG4gIHJlY29yZEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBvd25lcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXR0ZW1wdFJlZmVyZW5jZShyZWNvcmQsIG93bmVyKTtcbiAgICBpZiAocmVjb3JkLmtpbmQgPT09ICdzdGFnZScgJiYgcmVjb3JkLnNlcmllcyA9PT0gb3duZXIpIHtcbiAgICAgIGlmIChyZWNvcmQucmV0cnlMb29wID09PSB1bmRlZmluZWQgJiYgKHJlY29yZC5vZiA/PyAxKSA+IDEpIHRoaXMucmV0cnlQb3NzaWJsZSA9IHRydWU7XG4gICAgICBpZiAocmVmZXJlbmNlICYmIHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSB7XG4gICAgICAgIHRoaXMudGVybWluYWwgPSB7IG5leHQ6IHJlY29yZC5uZXh0LCByZWFzb246IHJlY29yZC5yZWFzb24sIGVmZmVjdDogcmVjb3JkLmVmZmVjdCwgZXZpZGVuY2U6IHJlZmVyZW5jZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgcnVubmVyIGNhbGxzIHJlY29yZFN1bW1hcnkgYmVmb3JlIGl0cyBmaW5hbCBhdHRlbXB0LiBGaW5pc2ggdGhhdCBwZW5kaW5nIHByb2plY3Rpb24gbm93IHRvby5cbiAgICB0aGlzLnByb2plY3RTdW1tYXJ5KCk7XG4gICAgY29uc3QgYWRkID0gKGtpbmQ6IEF0dGVudGlvblsna2luZCddLCByZWFzb246IEF0dGVudGlvblsncmVhc29uJ10pID0+IHtcbiAgICAgIGlmIChyZWZlcmVuY2UpIHRoaXMuYXBwZW5kKHsga2luZCwgcmVhc29uLCBldmlkZW5jZTogW3JlZmVyZW5jZV0gfSk7XG4gICAgICBlbHNlIHRoaXMubWlzc2luZygpO1xuICAgIH07XG4gICAgaWYgKHJlY29yZC5lZmZlY3QgPT09ICd1bmtub3duJykgYWRkKCd1bmtub3duLWVmZmVjdCcsICdVTktOT1dOX0VGRkVDVF9SRUNPUkRFRCcpO1xuICAgIGlmIChyZWNvcmQub3V0Y29tZSA9PT0gJ3RpbWVvdXQnKSBhZGQoJ3RpbWVvdXQnLCAnVElNRU9VVF9SRUNPUkRFRCcpO1xuICAgIC8vIEFuIFNESydzIHN1Z2dlc3RlZCBuZXh0L3JlYXNvbiBpcyBub3QgaXRzIGFjdHVhbCBwb2xpY3k7IG9ubHkgYSBsYXRlciBvcmRpbmFsIHByb3ZlcyBpdHMgcmV0cnkuXG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSByZWNvcmQua2luZCA9PT0gJ29ic2VydmVkJztcbiAgICBpZiAoKCFvYnNlcnZlZCAmJiByZWNvcmQubmV4dCA9PT0gJ3JldHJ5JykgfHwgcmVjb3JkLmF0dGVtcHQgPiAxKSBhZGQoJ3JldHJpZWQnLCAnUkVUUllfUkVDT1JERUQnKTtcbiAgICBpZiAoXG4gICAgICAhb2JzZXJ2ZWQgJiZcbiAgICAgIHJlY29yZC5uZXh0ID09PSAnc3RvcCcgJiZcbiAgICAgIFNUT1BQRURfUkVBU09OUy5oYXMocmVjb3JkLnJlYXNvbikgJiZcbiAgICAgIChyZWNvcmQub2YgPz8gMSkgPiAxICYmXG4gICAgICByZWNvcmQucmV0cnlMb29wID09PSB1bmRlZmluZWRcbiAgICApXG4gICAgICBhZGQoJ2dhdmUtdXAnLCAnUkVUUllfU1RPUF9SRUNPUkRFRCcpO1xuICB9XG5cbiAgcmVjb3JkU3VtbWFyeShzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuc3VtbWFyeSA9IHN1bW1hcnk7XG4gICAgdGhpcy5wcm9qZWN0U3VtbWFyeSgpO1xuICB9XG5cbiAgLyoqIEEgc3VtbWFyeS1vbmx5IGN1dCB3YWl0IGhhcyBubyBwaGFudG9tIGZpbmFsIGF0dGVtcHQ7IHVzZSBpdHMgYWN0dWFsIHJldGFpbmVkIHN1bW1hcnkuICovXG4gIHByaXZhdGUgcHJvamVjdFN1bW1hcnkoKTogdm9pZCB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuc3VtbWFyeT8ubGFzdDtcbiAgICBpZiAoIWxhc3QpIHJldHVybjtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMudGVybWluYWw7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0ZXJtaW5hbD8ubmV4dCA9PT0gbGFzdC5uZXh0ICYmIHRlcm1pbmFsLnJlYXNvbiA9PT0gbGFzdC5yZWFzb247XG4gICAgY29uc3QgYWRkID0gKGtpbmQ6IEF0dGVudGlvblsna2luZCddLCByZWFzb246IEF0dGVudGlvblsncmVhc29uJ10sIHByb29mPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCByZWZlcmVuY2UgPSBwcm9vZiA/PyAnYXR0ZW1wdFN1bW1hcnknO1xuICAgICAgY29uc3Qga2V5ID0ga2luZCArICc6JyArIHJlYXNvbjtcbiAgICAgIGNvbnN0IG1hcmtzID0gdGhpcy5tYXJrcztcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gbWFya3M/LmdldChrZXkpO1xuICAgICAgaWYgKHByb29mICYmIG1hcmtzICYmIHByZXZpb3VzPy5ldmlkZW5jZS5pbmNsdWRlcygnYXR0ZW1wdFN1bW1hcnknKSkge1xuICAgICAgICBtYXJrcy5zZXQoa2V5LCB7IC4uLnByZXZpb3VzLCBldmlkZW5jZTogcHJldmlvdXMuZXZpZGVuY2UuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSAnYXR0ZW1wdFN1bW1hcnknKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKHsga2luZCwgcmVhc29uLCBldmlkZW5jZTogW3JlZmVyZW5jZV0gfSk7XG4gICAgfTtcbiAgICBpZiAobGFzdC5lZmZlY3QgPT09ICd1bmtub3duJylcbiAgICAgIGFkZChcbiAgICAgICAgJ3Vua25vd24tZWZmZWN0JyxcbiAgICAgICAgJ1VOS05PV05fRUZGRUNUX1JFQ09SREVEJyxcbiAgICAgICAgbWF0Y2hpbmcgJiYgdGVybWluYWwuZWZmZWN0ID09PSAndW5rbm93bicgPyB0ZXJtaW5hbC5ldmlkZW5jZSA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMucmV0cnlQb3NzaWJsZSAmJiBsYXN0Lm5leHQgPT09ICdzdG9wJyAmJiBTVE9QUEVEX1JFQVNPTlMuaGFzKGxhc3QucmVhc29uKSlcbiAgICAgIGFkZCgnZ2F2ZS11cCcsICdSRVRSWV9TVE9QX1JFQ09SREVEJywgbWF0Y2hpbmcgPyB0ZXJtaW5hbC5ldmlkZW5jZSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogT25seSB0aGUgZXhwbGljaXQgcmV0YWluZWQgc3RhZ2UtZXJyb3IgcGF0aCBjYWxscyB0aGlzOyBhIGRpYWdub3N0aWMgdmFsdWUgbmV2ZXIgY2xhc3NpZmllcyBpdHNlbGYuICovXG4gIHN0YWdlRmFpbGVkKGVycm9yczogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID1cbiAgICAgICAgZXJyb3JzICYmIHR5cGVvZiBlcnJvcnMgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVycm9ycywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IGtpbmQ6ICdlcnJvcicsIHJlYXNvbjogJ0VSUk9SX1JFQ09SREVEJywgZXZpZGVuY2U6IFsnZXJyb3JzOnN0YWdlRXhlY3V0aW9uRXJyb3InXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogQSBtYWxmb3JtZWQgZXZpZGVuY2UgYmFnIGlzIHVuYXZhaWxhYmxlLCBuZXZlciBhbm90aGVyIHN0YWdlIGZhaWx1cmUuICovXG4gICAgfVxuICAgIHRoaXMubWlzc2luZygpO1xuICB9XG5cbiAgYXR0ZW1wdERyb3BwZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBlbmQoeyBraW5kOiAnbm90LWNvbGxlY3RlZCcsIHJlYXNvbjogJ0VWSURFTkNFX05PVF9DT0xMRUNURUQnLCBldmlkZW5jZTogWydhdHRlbXB0c0Ryb3BwZWQnXSB9KTtcbiAgfVxuXG4gIC8qKiBLZWVwIG9ubHkgYm91bmRlZCBleGFjdCByZWZlcmVuY2VzOyBvbmUgc2xvdCBpcyByZXNlcnZlZCB0byBkaXNjbG9zZSBvbWlzc2lvbnMuICovXG4gIGFwcGVuZChhdHRlbnRpb246IEF0dGVudGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGF0dGVudGlvbi5raW5kICsgJzonICsgYXR0ZW50aW9uLnJlYXNvbjtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMubWFya3M/LmdldChrZXkpO1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBbLi4uKHByZXZpb3VzPy5ldmlkZW5jZSA/PyBbXSldO1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGF0dGVudGlvbi5ldmlkZW5jZSkge1xuICAgICAgaWYgKCF2YWxpZFJlZmVyZW5jZShyZWZlcmVuY2UpKSB7XG4gICAgICAgIHRoaXMub21pdHRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlZmVyZW5jZXMuaW5jbHVkZXMocmVmZXJlbmNlKSkgY29udGludWU7XG4gICAgICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPj0gTUFYX1JFRkVSRU5DRVMpIHtcbiAgICAgICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgaWYgKGF0dGVudGlvbi5raW5kICE9PSAnbm90LWNvbGxlY3RlZCcgJiYgcmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub21pdHRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcHJldmlvdXMgJiYgKHRoaXMubWFya3M/LnNpemUgPz8gMCkgPj0gTUFYX01BUktTIC0gMSkge1xuICAgICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMubWFya3MgPz89IG5ldyBNYXAoKSkuc2V0KGtleSwgeyBraW5kOiBhdHRlbnRpb24ua2luZCwgcmVhc29uOiBhdHRlbnRpb24ucmVhc29uLCBldmlkZW5jZTogcmVmZXJlbmNlcyB9KTtcbiAgfVxuXG4gIG1pc3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDb3B5IGFscmVhZHkgY29sbGVjdGVkIGJvdW5kZWQgbWFya3MsIG5ldmVyIGFuIGF0dGVtcHQgYXJyYXksIGRpYWdub3N0aWMgYmFnIG9yIGV4ZWN1dGlvbiB0cmVlLiAqL1xuICBzbmFwc2hvdCgpOiByZWFkb25seSBBdHRlbnRpb25bXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gWy4uLih0aGlzLm1hcmtzPy52YWx1ZXMoKSA/PyBbXSldLm1hcCgoYXR0ZW50aW9uKSA9PlxuICAgICAgT2JqZWN0LmZyZWV6ZSh7IC4uLmF0dGVudGlvbiwgZXZpZGVuY2U6IE9iamVjdC5mcmVlemUoWy4uLmF0dGVudGlvbi5ldmlkZW5jZV0pIH0pLFxuICAgICk7XG4gICAgaWYgKHRoaXMub21pdHRlZCAmJiAhcmVzdWx0LnNvbWUoKGF0dGVudGlvbikgPT4gYXR0ZW50aW9uLmtpbmQgPT09ICdub3QtY29sbGVjdGVkJykpIHJlc3VsdC5wdXNoKE1JU1NJTkdfQVRURU5USU9OKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
@@ -14,4 +14,4 @@
14
14
  * `commitStops`, `tagStops` and `keysReadFromExecutionTree` take one.
15
15
  */
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2ZyYW1lVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZyYW1lVHlwZXMudHMg4oCUIHRoZSB0eXBlcyBvZiB0aGUgZW5naW5lJ3MgZnJhbWUgKEw0KTogd2hhdCBvbmUgc3RhZ2UgaW5zaWRlIGEgcnVuIHJlcG9ydHMuXG4gKlxuICogSXRzIHNuYXBzaG90IChgU3RhZ2VTbmFwc2hvdGAsIG9uZSBub2RlIG9mIHRoZSBleGVjdXRpb24gdHJlZSksIGl0cyBmbG93IG1lc3NhZ2VzXG4gKiAoYEZsb3dNZXNzYWdlYCwgYEZsb3dDb250cm9sVHlwZWApIGFuZCB0aGUgdHdvIHJldGVudGlvbiBkaWFscyB0aGF0IHNoYXBlIHdoYXQgdGhlIHNuYXBzaG90XG4gKiBrZWVwcyAoYFJlYWRUcmFja2luZ01vZGVgLCBgV3JpdGVUcmFja2luZ01vZGVgLCBvdmVyIGBjYXB0dXJlL2AncyBgUmV0ZW50aW9uUG9saWN5YCkuIFRoZXkgbGl2ZWRcbiAqIGluIHRoZSByZWNvcmQncyBgdHlwZXMudHNgIHVudGlsIEM2OyB0aGUgcmVjb3JkIG5hbWVzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYgbm93XG4gKiAoYFJFQ09SRF9GSUxFU2AsIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyksIHNvIHRoZXkgc2l0IGJlc2lkZSB0aGUgZnJhbWUgdGhhdCB3cml0ZXMgdGhlbS5cbiAqXG4gKiBBIHJldHJpZWQgc3RhZ2UncyBub2RlIGFsc28gY2FycmllcyBpdHMgYXR0ZW1wdHMgKGBhdHRlbXB0c2AsIGBhdHRlbXB0U3VtbWFyeWAg4oCUIHRoZSBhdHRlbXB0IGxlYWYncyB0eXBlcywgTDApLlxuICpcbiAqIEEgYFN0YWdlU25hcHNob3RgIGlzIGFuIGBFeGVjdXRpb25UcmVlYCAoYHR5cGVzLnRzYCksIHRoZSBzaGFwZSB0aGUgcmVjb3JkJ3MgcmVhZGVycyB3YWxrOlxuICogYGNvbW1pdFN0b3BzYCwgYHRhZ1N0b3BzYCBhbmQgYGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWVgIHRha2Ugb25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlY29yZCwgQXR0ZW1wdFN1bW1hcnksIExhdGVXcml0ZSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3kgfSBmcm9tICcuLi9jYXB0dXJlL3BvbGljaWVzLmpzJztcblxuLy8g4pSA4pSAIEZsb3cgQ29udHJvbCBOYXJyYXRpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBUeXBlcyBvZiBjb250cm9sIGZsb3cgZGVjaXNpb25zIGNhcHR1cmVkIGJ5IHRoZSBleGVjdXRpb24gZW5naW5lLiAqL1xuZXhwb3J0IHR5cGUgRmxvd0NvbnRyb2xUeXBlID0gJ25leHQnIHwgJ2JyYW5jaCcgfCAnY2hpbGRyZW4nIHwgJ3NlbGVjdGVkJyB8ICdzdWJmbG93JyB8ICdsb29wJztcblxuLyoqIEEgc2luZ2xlIGZsb3cgY29udHJvbCBuYXJyYXRpdmUgZW50cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dNZXNzYWdlIHtcbiAgdHlwZTogRmxvd0NvbnRyb2xUeXBlO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICByYXRpb25hbGU/OiBzdHJpbmc7XG4gIGNvdW50PzogbnVtYmVyO1xuICBpdGVyYXRpb24/OiBudW1iZXI7XG4gIHRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFJlYWQgLyBXcml0ZSBUcmFja2luZyAoIzE0LCAjMTNjLUEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFRoZSBwb2xpY3kgZmFtaWx5IGFuZCBtYXJrZXIgc2hhcGVzIGFyZSBvd25lZCBieSBgY2FwdHVyZS9gIChzaGFyZWQgd2l0aFxuLy8gdGhlIGRlZmVycmVkLW9ic2VydmVyIGNhcHR1cmUgdGllcikuXG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYC5cbiAqXG4gKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyByZWFkIHZpZXcuIEJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB0aGlzIGlzXG4gKiAgIHdoYXQgc25hcHNob3QgY29uc3VtZXJzIChsZW5zLCBhZ2VudGZvb3RwcmludCkgc2VlIHRvZGF5LlxuICogLSBgJ3N1bW1hcnknYCDigJQgcmVhZHMgcmVjb3JkIGEgY2hlYXAge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfSAodHlwZSArIHNpemVcbiAqICAgcHJveHkgKyBzaG9ydCBwcmV2aWV3KSBpbnN0ZWFkIG9mIHRoZSBjbG9uZWQgdmFsdWUuIE8oMSktaXNoIHBlciByZWFkIOKAlFxuICogICBubyB2YWx1ZSBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbiBvZiBsYXJnZSBvYmplY3RzLlxuICogLSBgJ29mZidgIOKAlCByZWFkcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlUmVhZHNgIGlzIGFic2VudCBmcm9tIHRoZVxuICogICBzbmFwc2hvdC4gWmVybyBwZXItcmVhZCBjb3N0LiBWYWx1ZXMgYXJlIHN0aWxsIHJlYWRhYmxlLCBhbmQgdGhlXG4gKiAgIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgZXZlbnQgc3RpbGwgZmlyZXMgKGl0IHBhc3NlcyB0aGUgbGl2ZSByZWZlcmVuY2UgYW5kXG4gKiAgIG5ldmVyIGNsb25lZCkg4oCUIHNvIG5hcnJhdGl2ZSBvdXRwdXQgaXMgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuIFRoZSBwb2xpY3lcbiAqICAgc2NvcGVzIE9OTFkgdGhlIHNuYXBzaG90J3MgYHN0YWdlUmVhZHNgIHBheWxvYWQuXG4gKlxuICogU2V0IHZpYSBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHJlYWRUcmFja2luZyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuXG4gKlxuICogQWxpYXMgb2YgdGhlIHNoYXJlZCB7QGxpbmsgUmV0ZW50aW9uUG9saWN5fSBmYW1pbHkgKCMxM2MtQSkg4oCUIGtlcHQgYXMgdGhlXG4gKiBzaGlwcGVkIHB1YmxpYyBuYW1lIGZvciB0aGUgcmVhZCBkaWFsLlxuICovXG5leHBvcnQgdHlwZSBSZWFkVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vKipcbiAqIFBvbGljeSBmb3IgaG93IHRyYWNrZWQgd3JpdGVzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYFxuICogKCMxM2MtQSkg4oCUIHRoZSBzaWJsaW5nIG9mIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfS5cbiAqXG4gKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgdHJhY2tlZCB3cml0ZSBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG9cbiAqICAgdGhlIHN0YWdlJ3Mgd3JpdGUgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCB3cml0ZXMgcmVjb3JkIGEgY2hlYXAge0BsaW5rIFdyaXRlU3VtbWFyeU1hcmtlcn0gaW5zdGVhZCBvZlxuICogICB0aGUgY2xvbmVkIHZhbHVlLlxuICogLSBgJ29mZidgIOKAlCB3cml0ZXMgYXJlIG5vdCByZWNvcmRlZCBhdCBhbGw7IGBzdGFnZVdyaXRlc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBUaGUgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0IHRvIHNoYXJlZCBzdGF0ZSBhbmQgc3RpbGxcbiAqICAgYXBwZWFyIGluIHRoZSBjb21taXQgbG9nIOKAlCBvbmx5IHRoZSBwZXItc3RhZ2Ugc25hcHNob3QgYm9va2tlZXBpbmcgKGFuZFxuICogICB0aGVyZWZvcmUgdGhlIGNvbW1pdCBvYnNlcnZlcidzIG11dGF0aW9ucyBwYXlsb2FkKSBpcyBhZmZlY3RlZC4gKFRoZVxuICogICBjb21taXQgbG9nJ3Mgb3duIHZhbHVlIGVuY29kaW5nIGhhcyBpdHMgb3duIGxvc3NsZXNzIGRpYWwg4oCUXG4gKiAgIHtAbGluayBDb21taXRWYWx1ZXNNb2RlfSwgIzEzYy1CLilcbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCAoYmVmb3JlIGBydW4oKWApLiBTZWVcbiAqIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMud3JpdGVUcmFja2luZ2AgZm9yIHRoZSBmdWxsIG9ic2VydmFibGUtY29uc2VxdWVuY2VcbiAqIGNvbnRyYWN0IChvbkNvbW1pdCBwYXlsb2FkLCByZWRhY3Rpb24gcHJlY2VkZW5jZSwgd2hhdCBpcyBPVVQgb2Ygc2NvcGUpLlxuICovXG5leHBvcnQgdHlwZSBXcml0ZVRyYWNraW5nTW9kZSA9IFJldGVudGlvblBvbGljeTtcblxuLy8g4pSA4pSAIFN0YWdlIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogU2VyaWFsaXNhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhZ2UncyBzdGF0ZSAoZm9yIGRlYnVnZ2luZyAvIHZpc3VhbGlzYXRpb24pLiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VTbmFwc2hvdCA9IHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgc3RhZ2UgZG9lcyAoZnJvbSBidWlsZGVyKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludC4gKi9cbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBpc0RlY2lkZXI/OiBib29sZWFuO1xuICBpc0Zvcms/OiBib29sZWFuO1xuICAvKiogVXNlci1sZXZlbCB3cml0ZXMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcykuXG4gICAqICBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBXcml0ZVRyYWNraW5nTW9kZX06IGNsb25lZCB2YWx1ZXMgdW5kZXIgYCdmdWxsJ2BcbiAgICogIChkZWZhdWx0KSwge0BsaW5rIFdyaXRlU3VtbWFyeU1hcmtlcn1zIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnQgdW5kZXJcbiAgICogIGAnb2ZmJ2AuIFJlZGFjdGVkIHdyaXRlcyBzaG93IGAnW1JFREFDVEVEXSdgIHJlZ2FyZGxlc3Mgb2YgbW9kZS4gKi9cbiAgc3RhZ2VXcml0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFVzZXItbGV2ZWwgcmVhZHMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcyBhdCByZWFkXG4gICAqICB0aW1lKS4gU2hhcGUgZGVwZW5kcyBvbiB7QGxpbmsgUmVhZFRyYWNraW5nTW9kZX06IGNsb25lZCB2YWx1ZXMgdW5kZXJcbiAgICogIGAnZnVsbCdgIChkZWZhdWx0KSwge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudFxuICAgKiAgdW5kZXIgYCdvZmYnYC4gKi9cbiAgc3RhZ2VSZWFkcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsb2dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbWV0cmljczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2YWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmxvd01lc3NhZ2VzPzogRmxvd01lc3NhZ2VbXTtcbiAgLyoqXG4gICAqIEV2ZXJ5IGF0dGVtcHQgb2YgdGhpcyBleGVjdXRpb24sIGluIG9yZGVyIOKAlCB3aGVuIGl0IHN0YXJ0ZWQsIGhvdyBsb25nIGl0IHRvb2ssIGhvdyBpdCBlbmRlZCwgYW5kIHRoZVxuICAgKiByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgKGBBdHRlbXB0UmVjb3JkYCk6IHRoZSBzdGFnZSdzIG93biB1bmRlciBpdHMgcmV0cnkgcG9saWN5LCBhIGB0aW1lb3V0TXNgXG4gICAqIG9yIGEgcnVuIGRlYWRsaW5lICgxMC4xLCBga2luZDogJ3N0YWdlJ2ApLCBhbmQgdGhvc2Ugb2YgdGhlIGNhbGxzIGl0IG1hZGUgdGhyb3VnaCBgc2NvcGUuJGNhbGxgIGFuZCB0aGVcbiAgICogb3V0c2lkZSBhdHRlbXB0cyBpdCByZXBvcnRlZCB0aHJvdWdoIGBvYnNlcnZlZCgpYCAoUDIsIGBraW5kOiAnY2FsbCdgIC8gYCdvYnNlcnZlZCdgLCB0aGUgZmlyc3QgMTAwMCDigJRcbiAgICogYFN0YWdlQ29udGV4dCDCtyBNQVhfQ0FMTF9SRUNPUkRTYCkuIEFic2VudCB3aGVuIHRoZXJlIGFyZSBub25lLiBUaGUgY29tbWl0IGxvZyBuZXZlciBjYXJyaWVzIGF0dGVtcHRzOiBhXG4gICAqIHJldHJpZWQgc3RhZ2UgaXMgc3RpbGwgT05FIGJ1bmRsZS5cbiAgICovXG4gIGF0dGVtcHRzPzogcmVhZG9ubHkgQXR0ZW1wdFJlY29yZFtdO1xuICAvKipcbiAgICogQ2FsbCBhbmQgb2JzZXJ2ZWQgYXR0ZW1wdCByZWNvcmRzIHRoaXMgZXhlY3V0aW9uIG1hZGUgcGFzdCB0aGUgZmlyc3QgMTAwMCDigJQgY291bnRlZCwgbm90IGtlcHQgKGVhY2ggc3RpbGxcbiAgICogZmlyZWQgYG9uQXR0ZW1wdGApLiBBYnNlbnQgd2hlbiBub25lIHdlcmUgZHJvcHBlZC5cbiAgICovXG4gIGF0dGVtcHRzRHJvcHBlZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzZXJpZXMgYXQgYSBnbGFuY2Ug4oCUIGNvdW50cyBwZXIgb3V0Y29tZSwgYW5kIGhvdyBpdCBlbmRlZC4gU3RhbXBlZCB3aGVuIHRoZSBzZXJpZXMgZW5kczogYWJzZW50IHdoaWxlIGl0XG4gICAqIGlzIHN0aWxsIHJ1bm5pbmcgKGEgc25hcHNob3QgdGFrZW4gbWlkLXN0YWdlKSBhbmQgd2l0aG91dCBhIHBvbGljeS5cbiAgICovXG4gIGF0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKlxuICAgKiBXcml0ZXMgKGFuZCBlbWl0cykgYW4gYXR0ZW1wdCB0cmllZCBBRlRFUiBpdCBoYWQgZW5kZWQg4oCUIHRpbWVkIG91dCwgYWJvcnRlZCBvciBmYWlsZWQg4oCUIGluIHRoZSBvcmRlciB0aGV5IGNhbWVcbiAgICogKFAxYikuIEVhY2ggd2FzIGRyb3BwZWQgYXQgdGhlIHNjb3BlLCBzbyBub25lIHJlYWNoZWQgdGhlIHN0YWdlJ3MgYnVmZmVyLCBpdHMgY29tbWl0IG9yIGEgcmVjb3JkZXI7IHRoaXMgaXNcbiAgICogdGhlIHJlY29yZCB0aGF0IHRoZXkgd2VyZSB0cmllZCDigJQgdGhlIGZpcnN0IDEwMCAoYE1BWF9MQVRFX1dSSVRFU2ApLiBBbiBhYmFuZG9uZWQgZnVuY3Rpb24gY2FuIGtlZXAgcnVubmluZ1xuICAgKiBhZnRlciB0aGUgcnVuIGVuZGVkLCBzbyB0aGUgbGlzdCBjYW4gZ3JvdyBhZnRlciBhIHNuYXBzaG90IHdhcyB0YWtlbi4gTmFtZXMgb25seSwgbmV2ZXIgdmFsdWVzLiBBYnNlbnQgd2hlblxuICAgKiB0aGVyZSB3ZXJlIG5vbmUuXG4gICAqL1xuICBsYXRlV3JpdGVzPzogcmVhZG9ubHkgTGF0ZVdyaXRlW107XG4gIG5leHQ/OiBTdGFnZVNuYXBzaG90O1xuICBjaGlsZHJlbj86IFN0YWdlU25hcHNob3RbXTtcbn07XG4iXX0=
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVUeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2ZyYW1lVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZyYW1lVHlwZXMudHMg4oCUIHRoZSB0eXBlcyBvZiB0aGUgZW5naW5lJ3MgZnJhbWUgKEw0KTogd2hhdCBvbmUgc3RhZ2UgaW5zaWRlIGEgcnVuIHJlcG9ydHMuXG4gKlxuICogSXRzIHNuYXBzaG90IChgU3RhZ2VTbmFwc2hvdGAsIG9uZSBub2RlIG9mIHRoZSBleGVjdXRpb24gdHJlZSksIGl0cyBmbG93IG1lc3NhZ2VzXG4gKiAoYEZsb3dNZXNzYWdlYCwgYEZsb3dDb250cm9sVHlwZWApIGFuZCB0aGUgdHdvIHJldGVudGlvbiBkaWFscyB0aGF0IHNoYXBlIHdoYXQgdGhlIHNuYXBzaG90XG4gKiBrZWVwcyAoYFJlYWRUcmFja2luZ01vZGVgLCBgV3JpdGVUcmFja2luZ01vZGVgLCBvdmVyIGBjYXB0dXJlL2AncyBgUmV0ZW50aW9uUG9saWN5YCkuIFRoZXkgbGl2ZWRcbiAqIGluIHRoZSByZWNvcmQncyBgdHlwZXMudHNgIHVudGlsIEM2OyB0aGUgcmVjb3JkIG5hbWVzIG5vdGhpbmcgb3V0c2lkZSBpdHNlbGYgbm93XG4gKiAoYFJFQ09SRF9GSUxFU2AsIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyksIHNvIHRoZXkgc2l0IGJlc2lkZSB0aGUgZnJhbWUgdGhhdCB3cml0ZXMgdGhlbS5cbiAqXG4gKiBBIHJldHJpZWQgc3RhZ2UncyBub2RlIGFsc28gY2FycmllcyBpdHMgYXR0ZW1wdHMgKGBhdHRlbXB0c2AsIGBhdHRlbXB0U3VtbWFyeWAg4oCUIHRoZSBhdHRlbXB0IGxlYWYncyB0eXBlcywgTDApLlxuICpcbiAqIEEgYFN0YWdlU25hcHNob3RgIGlzIGFuIGBFeGVjdXRpb25UcmVlYCAoYHR5cGVzLnRzYCksIHRoZSBzaGFwZSB0aGUgcmVjb3JkJ3MgcmVhZGVycyB3YWxrOlxuICogYGNvbW1pdFN0b3BzYCwgYHRhZ1N0b3BzYCBhbmQgYGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWVgIHRha2Ugb25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXR0ZW50aW9uIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0UmVjb3JkLCBBdHRlbXB0U3VtbWFyeSwgTGF0ZVdyaXRlIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSB9IGZyb20gJy4uL2NhcHR1cmUvcG9saWNpZXMuanMnO1xuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgUmVhZCAvIFdyaXRlIFRyYWNraW5nICgjMTQsICMxM2MtQSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gVGhlIHBvbGljeSBmYW1pbHkgYW5kIG1hcmtlciBzaGFwZXMgYXJlIG93bmVkIGJ5IGBjYXB0dXJlL2AgKHNoYXJlZCB3aXRoXG4vLyB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyKS5cblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyB0cmFja2VkIHJlYWRzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgLlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvXG4gKiAgIHRoZSBzdGFnZSdzIHJlYWQgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHRoaXMgaXNcbiAqICAgd2hhdCBzbmFwc2hvdCBjb25zdW1lcnMgKGxlbnMsIGFnZW50Zm9vdHByaW50KSBzZWUgdG9kYXkuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCByZWFkcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9ICh0eXBlICsgc2l6ZVxuICogICBwcm94eSArIHNob3J0IHByZXZpZXcpIGluc3RlYWQgb2YgdGhlIGNsb25lZCB2YWx1ZS4gTygxKS1pc2ggcGVyIHJlYWQg4oCUXG4gKiAgIG5vIHZhbHVlIGNsb25lLCBubyBzZXJpYWxpemF0aW9uIG9mIGxhcmdlIG9iamVjdHMuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJlYWRzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsOyBgc3RhZ2VSZWFkc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBaZXJvIHBlci1yZWFkIGNvc3QuIFZhbHVlcyBhcmUgc3RpbGwgcmVhZGFibGUsIGFuZCB0aGVcbiAqICAgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBldmVudCBzdGlsbCBmaXJlcyAoaXQgcGFzc2VzIHRoZSBsaXZlIHJlZmVyZW5jZSBhbmRcbiAqICAgbmV2ZXIgY2xvbmVkKSDigJQgc28gbmFycmF0aXZlIG91dHB1dCBpcyBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS4gVGhlIHBvbGljeVxuICogICBzY29wZXMgT05MWSB0aGUgc25hcHNob3QncyBgc3RhZ2VSZWFkc2AgcGF5bG9hZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS5cbiAqXG4gKiBBbGlhcyBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXRlbnRpb25Qb2xpY3l9IGZhbWlseSAoIzEzYy1BKSDigJQga2VwdCBhcyB0aGVcbiAqIHNoaXBwZWQgcHVibGljIG5hbWUgZm9yIHRoZSByZWFkIGRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRUcmFja2luZ01vZGUgPSBSZXRlbnRpb25Qb2xpY3k7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgXG4gKiAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2Yge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyB3cml0ZSB2aWV3LiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHdyaXRlcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfSBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGVcbiAqICAgc25hcHNob3QuIFRoZSB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQgdG8gc2hhcmVkIHN0YXRlIGFuZCBzdGlsbFxuICogICBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cg4oCUIG9ubHkgdGhlIHBlci1zdGFnZSBzbmFwc2hvdCBib29ra2VlcGluZyAoYW5kXG4gKiAgIHRoZXJlZm9yZSB0aGUgY29tbWl0IG9ic2VydmVyJ3MgbXV0YXRpb25zIHBheWxvYWQpIGlzIGFmZmVjdGVkLiAoVGhlXG4gKiAgIGNvbW1pdCBsb2cncyBvd24gdmFsdWUgZW5jb2RpbmcgaGFzIGl0cyBvd24gbG9zc2xlc3MgZGlhbCDigJRcbiAqICAge0BsaW5rIENvbW1pdFZhbHVlc01vZGV9LCAjMTNjLUIuKVxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFNlZVxuICogYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nYCBmb3IgdGhlIGZ1bGwgb2JzZXJ2YWJsZS1jb25zZXF1ZW5jZVxuICogY29udHJhY3QgKG9uQ29tbWl0IHBheWxvYWQsIHJlZGFjdGlvbiBwcmVjZWRlbmNlLCB3aGF0IGlzIE9VVCBvZiBzY29wZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFdyaXRlVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdGFnZSBkb2VzIChmcm9tIGJ1aWxkZXIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciDigJQgcHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzRGVjaWRlcj86IGJvb2xlYW47XG4gIGlzRm9yaz86IGJvb2xlYW47XG4gIC8qKiBVc2VyLWxldmVsIHdyaXRlcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzKS5cbiAgICogIFNoYXBlIGRlcGVuZHMgb24ge0BsaW5rIFdyaXRlVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlciBgJ2Z1bGwnYFxuICAgKiAgKGRlZmF1bHQpLCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgYCdvZmYnYC4gUmVkYWN0ZWQgd3JpdGVzIHNob3cgYCdbUkVEQUNURURdJ2AgcmVnYXJkbGVzcyBvZiBtb2RlLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWRcbiAgICogIHRpbWUpLiBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfTogY2xvbmVkIHZhbHVlcyB1bmRlclxuICAgKiAgYCdmdWxsJ2AgKGRlZmF1bHQpLCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9cyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50XG4gICAqICB1bmRlciBgJ29mZidgLiAqL1xuICBzdGFnZVJlYWRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXZhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmbG93TWVzc2FnZXM/OiBGbG93TWVzc2FnZVtdO1xuICAvKipcbiAgICogRXZlcnkgYXR0ZW1wdCBvZiB0aGlzIGV4ZWN1dGlvbiwgaW4gb3JkZXIg4oCUIHdoZW4gaXQgc3RhcnRlZCwgaG93IGxvbmcgaXQgdG9vaywgaG93IGl0IGVuZGVkLCBhbmQgdGhlXG4gICAqIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gdGhhdCBmb2xsb3dlZCAoYEF0dGVtcHRSZWNvcmRgKTogdGhlIHN0YWdlJ3Mgb3duIHVuZGVyIGl0cyByZXRyeSBwb2xpY3ksIGEgYHRpbWVvdXRNc2BcbiAgICogb3IgYSBydW4gZGVhZGxpbmUgKDEwLjEsIGBraW5kOiAnc3RhZ2UnYCksIGFuZCB0aG9zZSBvZiB0aGUgY2FsbHMgaXQgbWFkZSB0aHJvdWdoIGBzY29wZS4kY2FsbGAgYW5kIHRoZVxuICAgKiBvdXRzaWRlIGF0dGVtcHRzIGl0IHJlcG9ydGVkIHRocm91Z2ggYG9ic2VydmVkKClgIChQMiwgYGtpbmQ6ICdjYWxsJ2AgLyBgJ29ic2VydmVkJ2AsIHRoZSBmaXJzdCAxMDAwIOKAlFxuICAgKiBgU3RhZ2VDb250ZXh0IMK3IE1BWF9DQUxMX1JFQ09SRFNgKS4gQWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vbmUuIFRoZSBjb21taXQgbG9nIG5ldmVyIGNhcnJpZXMgYXR0ZW1wdHM6IGFcbiAgICogcmV0cmllZCBzdGFnZSBpcyBzdGlsbCBPTkUgYnVuZGxlLlxuICAgKi9cbiAgYXR0ZW1wdHM/OiByZWFkb25seSBBdHRlbXB0UmVjb3JkW107XG4gIC8qKlxuICAgKiBDYWxsIGFuZCBvYnNlcnZlZCBhdHRlbXB0IHJlY29yZHMgdGhpcyBleGVjdXRpb24gbWFkZSBwYXN0IHRoZSBmaXJzdCAxMDAwIOKAlCBjb3VudGVkLCBub3Qga2VwdCAoZWFjaCBzdGlsbFxuICAgKiBmaXJlZCBgb25BdHRlbXB0YCkuIEFic2VudCB3aGVuIG5vbmUgd2VyZSBkcm9wcGVkLlxuICAgKi9cbiAgYXR0ZW1wdHNEcm9wcGVkPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHNlcmllcyBhdCBhIGdsYW5jZSDigJQgY291bnRzIHBlciBvdXRjb21lLCBhbmQgaG93IGl0IGVuZGVkLiBTdGFtcGVkIHdoZW4gdGhlIHNlcmllcyBlbmRzOiBhYnNlbnQgd2hpbGUgaXRcbiAgICogaXMgc3RpbGwgcnVubmluZyAoYSBzbmFwc2hvdCB0YWtlbiBtaWQtc3RhZ2UpIGFuZCB3aXRob3V0IGEgcG9saWN5LlxuICAgKi9cbiAgYXR0ZW1wdFN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbiAgLyoqXG4gICAqIFdyaXRlcyAoYW5kIGVtaXRzKSBhbiBhdHRlbXB0IHRyaWVkIEFGVEVSIGl0IGhhZCBlbmRlZCDigJQgdGltZWQgb3V0LCBhYm9ydGVkIG9yIGZhaWxlZCDigJQgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZVxuICAgKiAoUDFiKS4gRWFjaCB3YXMgZHJvcHBlZCBhdCB0aGUgc2NvcGUsIHNvIG5vbmUgcmVhY2hlZCB0aGUgc3RhZ2UncyBidWZmZXIsIGl0cyBjb21taXQgb3IgYSByZWNvcmRlcjsgdGhpcyBpc1xuICAgKiB0aGUgcmVjb3JkIHRoYXQgdGhleSB3ZXJlIHRyaWVkIOKAlCB0aGUgZmlyc3QgMTAwIChgTUFYX0xBVEVfV1JJVEVTYCkuIEFuIGFiYW5kb25lZCBmdW5jdGlvbiBjYW4ga2VlcCBydW5uaW5nXG4gICAqIGFmdGVyIHRoZSBydW4gZW5kZWQsIHNvIHRoZSBsaXN0IGNhbiBncm93IGFmdGVyIGEgc25hcHNob3Qgd2FzIHRha2VuLiBOYW1lcyBvbmx5LCBuZXZlciB2YWx1ZXMuIEFic2VudCB3aGVuXG4gICAqIHRoZXJlIHdlcmUgbm9uZS5cbiAgICovXG4gIGxhdGVXcml0ZXM/OiByZWFkb25seSBMYXRlV3JpdGVbXTtcbiAgLyoqXG4gICAqIEZpeGVkLXJlYXNvbiBtYXJrcyBjb2xsZWN0ZWQgYXMgdGhpcyBleGVjdXRpb24gcnVucy4gQWJzZW50IHdoZW4gbm8gZmFjdCBuZWVkcyBhdHRlbnRpb24uXG4gICAqIEF0dGVtcHQgZXZpZGVuY2UgdXNlcyBjYW5vbmljYWwgRm9vdHRyYWNlIGF0dGVtcHQgSURzLiBTdW1tYXJ5LW9ubHkgYW5kIHN0YWdlLWVycm9yIHByb29mIHJlc29sdmVzIHdpdGhpbiBUSElTIG5vZGVcbiAgICogdGhyb3VnaCBhdHRlbXB0U3VtbWFyeSwgZXJyb3JzOnN0YWdlRXhlY3V0aW9uRXJyb3Igb3IgYXR0ZW1wdHNEcm9wcGVkLiBRdWFsaXR5IG1hcmtzIGFyZSByZWFkLXRpbWUgcmVjb3JkZXIgd29yay5cbiAgICogTWFya3MgcmV0YWluIG5vIGVycm9yIHRleHQsIHZhbHVlcywgdGFyZ2V0cyBvciBpZGVtcG90ZW5jeSBrZXlzOyBvbWl0dGVkIHByb29mIGlzIGRpc2Nsb3NlZCBhcyBub3QtY29sbGVjdGVkLlxuICAgKi9cbiAgYXR0ZW50aW9uPzogcmVhZG9ubHkgQXR0ZW50aW9uW107XG4gIG5leHQ/OiBTdGFnZVNuYXBzaG90O1xuICBjaGlsZHJlbj86IFN0YWdlU25hcHNob3RbXTtcbn07XG4iXX0=
@@ -210,6 +210,23 @@ class ControlDepRecorder {
210
210
  getDecisions() {
211
211
  return [...this.decisions.values()];
212
212
  }
213
+ /**
214
+ * Current-run control evidence for the native snapshot. Project only the
215
+ * stage identities collected during traversal; never walk the execution tree.
216
+ * Parentless roots cannot have a governing control edge.
217
+ */
218
+ toSnapshot() {
219
+ const dependencies = [];
220
+ for (const runtimeStageId of this.parentOf.keys()) {
221
+ const dependency = this.lookup(runtimeStageId);
222
+ if (dependency)
223
+ dependencies.push([runtimeStageId, dependency]);
224
+ }
225
+ return {
226
+ name: 'control-dependencies',
227
+ data: { decisions: this.getDecisions(), controlDeps: Object.fromEntries(dependencies) },
228
+ };
229
+ }
213
230
  /** Reset all state (also happens automatically on runId change). */
214
231
  clear() {
215
232
  this.parentOf.clear();
@@ -262,4 +279,4 @@ function matchedRuleLabel(evidence) {
262
279
  const rule = evidence.rules.find((r) => r.matched && r.branch === evidence.chosen) ?? evidence.rules.find((r) => r.matched);
263
280
  return rule?.label;
264
281
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlFRzs7O0FBYUgseURBQXFEO0FBb0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxVQUFxQyxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDcEIsRUFBRSxDQUFTO0lBRXBCLDBFQUEwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEQsMkRBQTJEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN0RSxzRUFBc0U7SUFDckQscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDbkUsaUVBQWlFO0lBQ3pELE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3hDLHVFQUF1RTtJQUN0RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuRCxnRUFBZ0U7SUFDeEQsU0FBUyxDQUFVO0lBRTNCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxVQUFVLENBQUMsS0FBd0I7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHO1lB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Q0gsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFzQztJQUM5RCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakgsT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyb2xEZXBSZWNvcmRlciDigJQgY29udHJvbC1kZXBlbmRlbmNlIHRyYWNraW5nIGZyb20gZmxvdyBldmVudHMgKFJGQy0wMDMgRDUpLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgVGhlIGJhY2t0cmFja2VyJ3MgYGNvbnRyb2xEZXBzYCBvcHRpb24gKEQzKSBuZWVkcyBhIGBDb250cm9sRGVwTG9va3VwYDpcbiAqICAgXCJ3aGljaCBkZWNpZGVyIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuP1wiIFRoZSBlbmdpbmUga25vd3NcbiAqICAgdGhpcyBkdXJpbmcgdHJhdmVyc2FsIGJ1dCB0aGUgY29tbWl0IGxvZyBkb2Vzbid0IHJlY29yZCBpdCDigJQgY29udHJvbFxuICogICBmbG93IGlzIGEgRmxvd1JlY29yZGVyIGNvbmNlcm4uIFRoaXMgcmVjb3JkZXIgaXMgdGhlIHN0YW5kYXJkIHByb2R1Y2VyOlxuICogICBvbmUgc3Vic2NyaXB0aW9uLCBvbmUgbG9va3VwLCBwbHVnIGl0IHN0cmFpZ2h0IGludG8gYGNhdXNhbENoYWluYC5cbiAqXG4gKiBIb3cgaXQgd29ya3Mg4oCUIHR3byBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIGJ1aWx0IGR1cmluZyB0cmF2ZXJzYWw6XG4gKlxuICogICAxLiBgcGFyZW50T2ZgIOKAlCB0aGUgcnVudGltZSBhbmNlc3RvciBjaGFpbiwgZnJvbSBldmVyeSBzdGFnZSBldmVudCdzXG4gKiAgICAgIGB0cmF2ZXJzYWxDb250ZXh0LnBhcmVudFJ1bnRpbWVTdGFnZUlkYCAoUkZDLTAwMyBEMSkuIENyb3NzZXNcbiAqICAgICAgc3ViZmxvdyBib3VuZGFyaWVzOyBsb29wIHJlLWVudHJpZXMgc3RheSB1bmFtYmlndW91cyBiZWNhdXNlXG4gKiAgICAgIHJ1bnRpbWUgaWRzIGRpZmZlciBwZXIgaXRlcmF0aW9uLlxuICpcbiAqICAgMi4gYGJyYW5jaEVudHJ5VG9EZWNpc2lvbmAg4oCUIG9uIGBvbkRlY2lzaW9uYC9gb25TZWxlY3RlZGAgdGhlIGRlY2lzaW9uXG4gKiAgICAgIGlzIHJlY29yZGVkIGFzIFBFTkRJTkc7IHRoZSBuZXh0IHN0YWdlKHMpIGV4ZWN1dGVkIHdob3NlXG4gKiAgICAgIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgSVMgdGhlIGRlY2lkZXIncyBydW50aW1lU3RhZ2VJZCBhcmUgaXRzXG4gKiAgICAgIGJyYW5jaCBlbnRyaWVzICgxIGZvciBhIGRlY2lkZXIsIE4gPSBzZWxlY3RlZC5sZW5ndGggZm9yIGFcbiAqICAgICAgc2VsZWN0b3IpLiBDb3JyZWxhdGlvbiBpcyBieSBwYXJlbnQtaWQgKyBjb3VudCwgTk9UIGJ5IHN0YWdlIG5hbWUg4oCUXG4gKiAgICAgIHN1YmZsb3ctbW91bnQgZXZlbnRzIGNhcnJ5IHBhdGgtcHJlZml4ZWQgaW5uZXItcm9vdCBuYW1lcyB0aGF0XG4gKiAgICAgIGRvbid0IG1hdGNoIGBGbG93RGVjaXNpb25FdmVudC5jaG9zZW5gLCBhbmQgc2VsZWN0b3JzIGVtaXQgYVxuICogICAgICBzeW50aGV0aWMgZm9yayBldmVudCBzaGFyaW5nIHRoZSBzZWxlY3RvcidzIG93biBydW50aW1lU3RhZ2VJZFxuICogICAgICAoZXhjbHVkZWQgdmlhIHRoZSBzZWxmLWlkIGd1YXJkKS4gQSBicmFuY2ggdGhhdCBUSFJPV1MgYmVmb3JlXG4gKiAgICAgIGNvbXBsZXRpbmcgY29uc3VtZXMgaXRzIHNsb3QgdmlhIGBvbkVycm9yYCwgc28gdGhlIHBvc3QtZmFuLW91dFxuICogICAgICBjb252ZXJnZW5jZSBzdGFnZSBpcyBuZXZlciBtaXNhdHRyaWJ1dGVkIGFzIGEgYnJhbmNoIGVudHJ5LlxuICpcbiAqICAgMy4gYXR0ZW1wdCBzdG9wcyAoMTAuMSkg4oCUIGBvbkF0dGVtcHRgOiBhIHN0YWdlIHdob3NlIHJldHJ5IHNlcmllcyBTVE9QUEVEXG4gKiAgICAgIChpdCBnYXZlIHVwLCBvciBhIGxhdGVyIGF0dGVtcHQgcGF1c2VkIG9yIHdhcyBhYm9ydGVkOyB0aGUgc2hhcmVkXG4gKiAgICAgIHByZWRpY2F0ZSBgcmVjb3JkZXIvYXR0ZW1wdFNlcmllcy50cyDCtyBpc1JldHJ5RXZpZGVuY2VgKSBtYWRlIGEgZGVjaXNpb24gb2YgaXRzXG4gKiAgICAgIG93biDigJQgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24sIGluIHRoZSBzaGFwZSBgZGVjaWRlKClgIHByb2R1Y2VzLiBJdFxuICogICAgICBpcyByZWNvcmRlZCBiZXNpZGUgdGhlIGRlY2lkZXJzIGFzIGBraW5kOiAnYXR0ZW1wdC1zdG9wJ2BcbiAqICAgICAgKGBnZXREZWNpc2lvbnMoKWAsIGBnZXRBdHRlbXB0U3RvcChpZClgKSwgYGNob3NlbjogJ3N0b3AnYCwgdGhlIHN0b3BcbiAqICAgICAgcmVhc29uIGFzIGl0cyBgcnVsZUxhYmVsYC4gSXQgaXMgTk9UIGEgYnJhbmNoIGVudHJ5OiBhIGNvbnRyb2wgZWRnZSBpblxuICogICAgICBgY2F1c2FsQ2hhaW5gIGxpbmtzIGEgc3RhZ2UgdG8gQU5PVEhFUiBleGVjdXRpb24gdGhhdCBnb3Zlcm5lZCBpdCwgYW5kXG4gKiAgICAgIHRoZSBzdG9wIGdvdmVybnMgdGhlIHN0YWdlIGl0c2VsZiDigJQgc28gYGxvb2t1cGAgaXMgdW5jaGFuZ2VkLCBhbmQgYVxuICogICAgICByZWFkZXIgd2Fsa2luZyBhIGZhaWxlZCBzdGFnZSByZWFkcyB0aGUgc3RvcCBvZmYgaXRzIGRlY2lzaW9uIHJlY29yZC5cbiAqXG4gKiAgIGBsb29rdXAocnVudGltZVN0YWdlSWQpYCB0aGVuIHdhbGtzIHRoZSBhbmNlc3RvciBjaGFpbiBmcm9tIHRoZSBzdGFnZVxuICogICB1cHdhcmQ7IHRoZSBmaXJzdCBhbmNlc3RvciAob3IgdGhlIHN0YWdlIGl0c2VsZikgcmVnaXN0ZXJlZCBhcyBhXG4gKiAgIGJyYW5jaCBlbnRyeSB5aWVsZHMgaXRzIGdvdmVybmluZyBkZWNpZGVyIOKAlCB0aGUgTkVBUkVTVCBkZWNpc2lvbi5cbiAqICAgTmVzdGVkIGRlY2lzaW9ucyBjb21wb3NlIG5hdHVyYWxseTogdGhlIGJhY2t0cmFja2VyIGV4cGFuZHMgdGhlXG4gKiAgIGRlY2lkZXIgbm9kZSBhbmQgYXNrcyBhZ2Fpbi5cbiAqXG4gKiBDb252ZW50aW9uIDQ6IHN0YXRlIHJlc2V0cyB3aGVuIGB0cmF2ZXJzYWxDb250ZXh0LnJ1bklkYCBjaGFuZ2VzIOKAlCBlYWNoXG4gKiBydW4gKGFuZCBlYWNoIHJlc3VtZSwgd2hpY2ggbWludHMgYSBmcmVzaCBydW5JZCkgc3RhcnRzIGNsZWFuLiBDb250cm9sXG4gKiBjaGFpbnMgdGhlcmVmb3JlIGRvIE5PVCBzdXJ2aXZlIGEgcGF1c2UvcmVzdW1lIGJvdW5kYXJ5OiBwb3N0LXJlc3VtZVxuICogc3RhZ2VzIGNhbm5vdCByZXNvbHZlIHByZS1wYXVzZSBkZWNpc2lvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNvbnRyb2xEZXBSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbmltcG9ydCB7IGNhdXNhbENoYWluIH0gZnJvbSAnZm9vdHRyYWNlJztcbiAqXG4gKiBjb25zdCBjdHJsID0gY29udHJvbERlcFJlY29yZGVyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGN0cmwpOyAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICpcbiAqIGNvbnN0IGRhZyA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgJ2FwcHJvdmUjMicsIGtleXNSZWFkLCB7XG4gKiAgIGNvbnRyb2xEZXBzOiBjdHJsLmFzTG9va3VwKCksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29udHJvbERlcGVuZGVuY3ksIENvbnRyb2xEZXBMb29rdXAgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IERlY2lzaW9uRXZpZGVuY2UsIFNlbGVjdGlvbkV2aWRlbmNlIH0gZnJvbSAnLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0F0dGVtcHRFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1JldHJ5RXZpZGVuY2UgfSBmcm9tICcuL2F0dGVtcHRTZXJpZXMuanMnO1xuXG4vKiogT25lIHJlY29yZGVkIGRlY2lzaW9uL3NlbGVjdGlvbiBldmVudCAoUkZDLTAwMyBENSkuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZWNpc2lvblJlY29yZCB7XG4gIC8qKlxuICAgKiBgJ2F0dGVtcHQtc3RvcCdgIGZvciBhIHN0YWdlJ3Mgb3duIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gdGhhdCBTVE9QUEVEIGl0cyBzZXJpZXMgKDEwLjEpIOKAlCB0aGVuXG4gICAqIGBkZWNpZGVyUnVudGltZVN0YWdlSWRgIGlzIHRoZSBzdGFnZSdzIGV4ZWN1dGlvbiwgYGNob3NlbmAgaXMgYCdzdG9wJ2AsIGBldmlkZW5jZWAgdGhlIGF0dGVtcHQncyBkZWNpc2lvbiBhbmRcbiAgICogYHJ1bGVMYWJlbGAgdGhlIHN0b3AgcmVhc29uLiBBYnNlbnQgZm9yIGEgZGVjaWRlciAvIHNlbGVjdG9yLlxuICAgKi9cbiAga2luZD86ICdhdHRlbXB0LXN0b3AnO1xuICAvKiogcnVudGltZVN0YWdlSWQgb2YgdGhlIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogQ2hvc2VuIGJyYW5jaCBkaXNwbGF5IG5hbWUgKGRlY2lkZXIpIG9yIHNlbGVjdGVkIG5hbWVzIChzZWxlY3RvcikuICovXG4gIGNob3Nlbjogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTdHJ1Y3R1cmVkIGV2aWRlbmNlIGZyb20gZGVjaWRlKCkvc2VsZWN0KCksIHdoZW4gdGhlIHN0YWdlIHVzZWQgdGhlbS4gKi9cbiAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlIHwgU2VsZWN0aW9uRXZpZGVuY2U7XG4gIC8qKlxuICAgKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbiAoZS5nLiAnR29vZCBjcmVkaXQnKS5cbiAgICogRGVjaWRlcnMgb25seSDigJQgYSBzZWxlY3RvciBwaWNrcyBOIGJyYW5jaGVzIGFuZCBubyBzaW5nbGUgbGFiZWxcbiAgICogYXR0cmlidXRlcyB0byBhbGwgb2YgdGhlbSAoaW5zcGVjdCBgZXZpZGVuY2VgIGluc3RlYWQpLlxuICAgKi9cbiAgcnVsZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMge1xuICAvKiogUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGBjb250cm9sLWRlcHMtTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLyoqIEEgZGVjaXNpb24gYXdhaXRpbmcgYnJhbmNoLWVudHJ5IGNvcnJlbGF0aW9uLiAqL1xuaW50ZXJmYWNlIFBlbmRpbmdEZWNpc2lvbiB7XG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogSG93IG1hbnkgYnJhbmNoIGVudHJpZXMgYXJlIHN0aWxsIGV4cGVjdGVkIChkZWNpZGVyOiAxLCBzZWxlY3RvcjogTikuICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGB0b3BvbG9neVJlY29yZGVyKClgIC8gYGluT3V0UmVjb3JkZXIoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sRGVwUmVjb3JkZXIob3B0aW9uczogQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyA9IHt9KTogQ29udHJvbERlcFJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBDb250cm9sRGVwUmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIGFuc3dlcnNcbiAqIFwid2hpY2ggZGVjaXNpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBBdHRhY2ggdmlhXG4gKiBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIChvciBgYXR0YWNoRmxvd1JlY29yZGVyYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sRGVwUmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBSdW50aW1lIGFuY2VzdG9yIGNoYWluOiBydW50aW1lU3RhZ2VJZCDihpIgcGFyZW50UnVudGltZVN0YWdlSWQgKEQxKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRPZiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBSZWNvcmRlZCBkZWNpc2lvbnMsIGtleWVkIGJ5IGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaXNpb25zID0gbmV3IE1hcDxzdHJpbmcsIENvbnRyb2xEZWNpc2lvblJlY29yZD4oKTtcbiAgLyoqIEJyYW5jaC1lbnRyeSBydW50aW1lU3RhZ2VJZCDihpIgZ292ZXJuaW5nIGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRW50cnlUb0RlY2lzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIERlY2lzaW9ucyB3aG9zZSBicmFuY2ggZW50cmllcyBoYXZlIG5vdCBhbGwgYmVlbiBzZWVuIHlldC4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nOiBQZW5kaW5nRGVjaXNpb25bXSA9IFtdO1xuICAvKiogU3RhZ2UgaWRzIHRoYXQgYWxyZWFkeSBjb25zdW1lZCBhIHBlbmRpbmcgc2xvdCAoZW50cnkgT1IgZXJyb3IpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN1bWVkU2xvdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbnZlbnRpb24gNCDigJQgcnVuSWQgb2YgdGhlIHJ1biBjdXJyZW50bHkgYmVpbmcgcmVjb3JkZWQuICovXG4gIHByaXZhdGUgbGFzdFJ1bklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBjb250cm9sLWRlcHMtJHsrK19jb3VudGVyfWA7XG4gIH1cblxuICAvLyDilIDilIAgRmxvd1JlY29yZGVyIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHJ1bGVMYWJlbCA9IG1hdGNoZWRSdWxlTGFiZWwoZXZlbnQuZXZpZGVuY2UpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICAuLi4oZXZlbnQuZXZpZGVuY2UgJiYgeyBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UgfSksXG4gICAgICAuLi4ocnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBydWxlTGFiZWwgfSksXG4gICAgfSk7XG4gICAgdGhpcy5wZW5kaW5nLnB1c2goeyBkZWNpZGVySWQsIHJlbWFpbmluZzogMSB9KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgY29uc3QgeyByZWNvcmQgfSA9IGV2ZW50O1xuICAgIGlmICghY3R4IHx8IHJlY29yZC5uZXh0ICE9PSAnc3RvcCcgfHwgIWlzUmV0cnlFdmlkZW5jZShyZWNvcmQpKSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG4gICAgdGhpcy5kZWNpc2lvbnMuc2V0KHJlY29yZC5zZXJpZXMsIHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0LXN0b3AnLFxuICAgICAgZGVjaWRlclJ1bnRpbWVTdGFnZUlkOiByZWNvcmQuc2VyaWVzLFxuICAgICAgY2hvc2VuOiAnc3RvcCcsXG4gICAgICBldmlkZW5jZTogcmVjb3JkLmRlY2lzaW9uLFxuICAgICAgcnVsZUxhYmVsOiByZWNvcmQucmVhc29uLFxuICAgIH0pO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG4gICAgaWYgKGV2ZW50LnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHNlbGVjdGVkIOKGkiBub3RoaW5nIGdvdmVybmVkXG5cbiAgICBjb25zdCBkZWNpZGVySWQgPSBjdHgucnVudGltZVN0YWdlSWQ7XG4gICAgdGhpcy5kZWNpc2lvbnMuc2V0KGRlY2lkZXJJZCwge1xuICAgICAgZGVjaWRlclJ1bnRpbWVTdGFnZUlkOiBkZWNpZGVySWQsXG4gICAgICBjaG9zZW46IFsuLi5ldmVudC5zZWxlY3RlZF0sXG4gICAgICAuLi4oZXZlbnQuZXZpZGVuY2UgJiYgeyBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UgfSksXG4gICAgfSk7XG4gICAgdGhpcy5wZW5kaW5nLnB1c2goeyBkZWNpZGVySWQsIHJlbWFpbmluZzogZXZlbnQuc2VsZWN0ZWQubGVuZ3RoIH0pO1xuICB9XG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IHsgcnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkIH0gPSBjdHg7XG4gICAgaWYgKHBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICB0aGlzLnBhcmVudE9mLnNldChydW50aW1lU3RhZ2VJZCwgcGFyZW50UnVudGltZVN0YWdlSWQpO1xuICAgICAgdGhpcy5jb25zdW1lUGVuZGluZ1Nsb3QocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkLCAvKiByZWdpc3RlciAqLyB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBicmFuY2ggdGhhdCB0aHJvd3MgbmV2ZXIgZmlyZXMgYG9uU3RhZ2VFeGVjdXRlZGAg4oCUIHdpdGhvdXQgdGhpcyBob29rXG4gICAqIGl0cyBwZW5kaW5nIHNsb3Qgd291bGQgbGVhayBhbmQgdGhlIHBvc3QtZmFuLW91dCBjb252ZXJnZW5jZSBzdGFnZVxuICAgKiAod2hvc2UgY29udGV4dCBhbHNvIGNoYWlucyB0byB0aGUgc2VsZWN0b3IpIHdvdWxkIGJlIG1pc2F0dHJpYnV0ZWQgYXNcbiAgICogYSBicmFuY2ggZW50cnkgdW5kZXIgYmVzdC1lZmZvcnQgKGBmYWlsRmFzdDogZmFsc2VgKSBmYW4tb3V0cy5cbiAgICovXG4gIG9uRXJyb3IoZXZlbnQ6IEZsb3dFcnJvckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChjdHgucGFyZW50UnVudGltZVN0YWdlSWQpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhaW4gQU5EIGF0dHJpYnV0ZSB0aGUgZmFpbGVkIHN0YWdlIHRvIGl0cyBkZWNpc2lvbiDigJRcbiAgICAgIC8vIHRoZSBzdGFnZSBSQU4gKGFuZCBtYXkgaGF2ZSBjb21taXR0ZWQgcGFydGlhbCB3cml0ZXMpIGJlY2F1c2UgdGhlXG4gICAgICAvLyBkZWNpc2lvbiBjaG9zZSBpdDsgZmFpbGluZyBhZnRlcndhcmRzIGRvZXNuJ3QgdW5kbyB0aGUgZGVwZW5kZW5jeS5cbiAgICAgIHRoaXMucGFyZW50T2Yuc2V0KGN0eC5ydW50aW1lU3RhZ2VJZCwgY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KGN0eC5ydW50aW1lU3RhZ2VJZCwgY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkLCAvKiByZWdpc3RlciAqLyB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgUXVlcmllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgTkVBUkVTVCBnb3Zlcm5pbmcgZGVjaXNpb24gZm9yIGFuIGV4ZWN1dGlvbiBzdGVwOiB3YWxrcyB0aGVcbiAgICogcnVudGltZSBhbmNlc3RvciBjaGFpbiAodGhlIHN0ZXAgaXRzZWxmIGZpcnN0KSB1bnRpbCBpdCBoaXRzIGFcbiAgICogcmVnaXN0ZXJlZCBicmFuY2ggZW50cnkuIGB1bmRlZmluZWRgIHdoZW4gdGhlIHN0ZXAgaXMgbm90IGRvd25zdHJlYW0gb2ZcbiAgICogYW55IHJlY29yZGVkIGRlY2lzaW9uLlxuICAgKi9cbiAgbG9va3VwKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBDb250cm9sRGVwZW5kZW5jeSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBjdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJ1bnRpbWVTdGFnZUlkO1xuICAgIHdoaWxlIChjdXIgIT09IHVuZGVmaW5lZCAmJiAhc2Vlbi5oYXMoY3VyKSkge1xuICAgICAgc2Vlbi5hZGQoY3VyKTtcbiAgICAgIGNvbnN0IGRlY2lkZXJJZCA9IHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLmdldChjdXIpO1xuICAgICAgaWYgKGRlY2lkZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZGVjaXNpb25zLmdldChkZWNpZGVySWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlY2lkZXJJZCxcbiAgICAgICAgICAuLi4ocmVjb3JkPy5ydWxlTGFiZWwgIT09IHVuZGVmaW5lZCAmJiB7IGxhYmVsOiByZWNvcmQucnVsZUxhYmVsIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY3VyID0gdGhpcy5wYXJlbnRPZi5nZXQoY3VyKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgbG9va3VwIGFzIGEgYmFyZSBmdW5jdGlvbiDigJQgcGx1ZyBpbnRvIGBjYXVzYWxDaGFpbiguLi4sIHsgY29udHJvbERlcHMgfSlgLiAqL1xuICBhc0xvb2t1cCgpOiBDb250cm9sRGVwTG9va3VwIHtcbiAgICByZXR1cm4gKHJ1bnRpbWVTdGFnZUlkKSA9PiB0aGlzLmxvb2t1cChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQtc3RvcCBkZWNpc2lvbiBvZiBhIHN0YWdlIGV4ZWN1dGlvbiB3aG9zZSByZXRyeSBzZXJpZXMgc3RvcHBlZCwgaWYgaXQgZGlkLiAqL1xuICBnZXRBdHRlbXB0U3RvcChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlY2lzaW9uUmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIHJldHVybiByZWNvcmQ/LmtpbmQgPT09ICdhdHRlbXB0LXN0b3AnID8gcmVjb3JkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEFsbCBkZWNpc2lvbnMgcmVjb3JkZWQgZm9yIHRoZSBjdXJyZW50IHJ1biwgaW4gZXZlbnQgb3JkZXIg4oCUIGRlY2lkZXJzLCBzZWxlY3RvcnMgYW5kIGF0dGVtcHQgc3RvcHMuICovXG4gIGdldERlY2lzaW9ucygpOiBDb250cm9sRGVjaXNpb25SZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRlY2lzaW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKiogUmVzZXQgYWxsIHN0YXRlIChhbHNvIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiBydW5JZCBjaGFuZ2UpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudE9mLmNsZWFyKCk7XG4gICAgdGhpcy5kZWNpc2lvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5jbGVhcigpO1xuICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgIHRoaXMuY29uc3VtZWRTbG90cy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ29udmVudGlvbiA0OiBhIG5ldyBydW5JZCBtZWFucyBhIG5ldyBydW4g4oCUIHJlc2V0IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZXNldElmTmV3UnVuKHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVuSWQgPT09IHRoaXMubGFzdFJ1bklkKSByZXR1cm47XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBpcyBhIGRlY2lkZXIgd2l0aCBhbiB1bm1hdGNoZWQgcGVuZGluZyBzbG90LFxuICAgKiBjb25zdW1lIG9uZS4gYHJlZ2lzdGVyYCBjb250cm9scyB3aGV0aGVyIHRoZSBzdGFnZSBpcyByZWNvcmRlZCBhcyBhXG4gICAqIGJyYW5jaCBlbnRyeSAoc3RhZ2UgZXhlY3V0ZWQvZXJyb3JlZCkg4oCUIGJvdGggcGF0aHMgY29uc3VtZSB0aGUgc2xvdCBzb1xuICAgKiBjb3VudHMgc3RheSBleGFjdCBldmVuIHdoZW4gYSBzdGFnZSBwcm9kdWNlcyBib3RoIGV2ZW50cy5cbiAgICovXG4gIHByaXZhdGUgY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHBhcmVudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHJlZ2lzdGVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgcmV0dXJuOyAvLyBzeW50aGV0aWMgc2VsZi1ldmVudHNcbiAgICBpZiAodGhpcy5jb25zdW1lZFNsb3RzLmhhcyhydW50aW1lU3RhZ2VJZCkpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wZW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5wZW5kaW5nW2ldO1xuICAgICAgaWYgKHAuZGVjaWRlcklkICE9PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgY29udGludWU7XG5cbiAgICAgIHRoaXMuY29uc3VtZWRTbG90cy5hZGQocnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKHJlZ2lzdGVyKSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5zZXQocnVudGltZVN0YWdlSWQsIHAuZGVjaWRlcklkKTtcbiAgICAgIHAucmVtYWluaW5nLS07XG4gICAgICBpZiAocC5yZW1haW5pbmcgPD0gMCkgdGhpcy5wZW5kaW5nLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbjogdGhlIG1hdGNoZWQgcnVsZVxuICogbWFwcGluZyB0byB0aGUgY2hvc2VuIGJyYW5jaCAoZmlyc3QgbWF0Y2hlZCBydWxlIGFzIGZhbGxiYWNrKS5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlZFJ1bGVMYWJlbChldmlkZW5jZTogRGVjaXNpb25FdmlkZW5jZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXZpZGVuY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJ1bGUgPVxuICAgIGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCAmJiByLmJyYW5jaCA9PT0gZXZpZGVuY2UuY2hvc2VuKSA/PyBldmlkZW5jZS5ydWxlcy5maW5kKChyKSA9PiByLm1hdGNoZWQpO1xuICByZXR1cm4gcnVsZT8ubGFiZWw7XG59XG4iXX0=
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlFRzs7O0FBYUgseURBQXFEO0FBb0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxVQUFxQyxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDcEIsRUFBRSxDQUFTO0lBRXBCLDBFQUEwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEQsMkRBQTJEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN0RSxzRUFBc0U7SUFDckQscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDbkUsaUVBQWlFO0lBQ3pELE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3hDLHVFQUF1RTtJQUN0RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuRCxnRUFBZ0U7SUFDeEQsU0FBUyxDQUFVO0lBRTNCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxVQUFVLENBQUMsS0FBd0I7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHO1lB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QUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLG9CQUFvQjtnQkFBRSxTQUFTO1lBRW5ELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcE1ELGdEQW9NQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBc0M7SUFDOUQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FDUixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pILE9BQU8sSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyBmcm9tIGZsb3cgZXZlbnRzIChSRkMtMDAzIEQ1KS5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIFRoZSBiYWNrdHJhY2tlcidzIGBjb250cm9sRGVwc2Agb3B0aW9uIChEMykgbmVlZHMgYSBgQ29udHJvbERlcExvb2t1cGA6XG4gKiAgIFwid2hpY2ggZGVjaWRlciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBUaGUgZW5naW5lIGtub3dzXG4gKiAgIHRoaXMgZHVyaW5nIHRyYXZlcnNhbCBidXQgdGhlIGNvbW1pdCBsb2cgZG9lc24ndCByZWNvcmQgaXQg4oCUIGNvbnRyb2xcbiAqICAgZmxvdyBpcyBhIEZsb3dSZWNvcmRlciBjb25jZXJuLiBUaGlzIHJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBwcm9kdWNlcjpcbiAqICAgb25lIHN1YnNjcmlwdGlvbiwgb25lIGxvb2t1cCwgcGx1ZyBpdCBzdHJhaWdodCBpbnRvIGBjYXVzYWxDaGFpbmAuXG4gKlxuICogSG93IGl0IHdvcmtzIOKAlCB0d28gY29ycmVsYXRpb24gc3RydWN0dXJlcyBidWlsdCBkdXJpbmcgdHJhdmVyc2FsOlxuICpcbiAqICAgMS4gYHBhcmVudE9mYCDigJQgdGhlIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGZyb20gZXZlcnkgc3RhZ2UgZXZlbnQnc1xuICogICAgICBgdHJhdmVyc2FsQ29udGV4dC5wYXJlbnRSdW50aW1lU3RhZ2VJZGAgKFJGQy0wMDMgRDEpLiBDcm9zc2VzXG4gKiAgICAgIHN1YmZsb3cgYm91bmRhcmllczsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZVxuICogICAgICBydW50aW1lIGlkcyBkaWZmZXIgcGVyIGl0ZXJhdGlvbi5cbiAqXG4gKiAgIDIuIGBicmFuY2hFbnRyeVRvRGVjaXNpb25gIOKAlCBvbiBgb25EZWNpc2lvbmAvYG9uU2VsZWN0ZWRgIHRoZSBkZWNpc2lvblxuICogICAgICBpcyByZWNvcmRlZCBhcyBQRU5ESU5HOyB0aGUgbmV4dCBzdGFnZShzKSBleGVjdXRlZCB3aG9zZVxuICogICAgICBgcGFyZW50UnVudGltZVN0YWdlSWRgIElTIHRoZSBkZWNpZGVyJ3MgcnVudGltZVN0YWdlSWQgYXJlIGl0c1xuICogICAgICBicmFuY2ggZW50cmllcyAoMSBmb3IgYSBkZWNpZGVyLCBOID0gc2VsZWN0ZWQubGVuZ3RoIGZvciBhXG4gKiAgICAgIHNlbGVjdG9yKS4gQ29ycmVsYXRpb24gaXMgYnkgcGFyZW50LWlkICsgY291bnQsIE5PVCBieSBzdGFnZSBuYW1lIOKAlFxuICogICAgICBzdWJmbG93LW1vdW50IGV2ZW50cyBjYXJyeSBwYXRoLXByZWZpeGVkIGlubmVyLXJvb3QgbmFtZXMgdGhhdFxuICogICAgICBkb24ndCBtYXRjaCBgRmxvd0RlY2lzaW9uRXZlbnQuY2hvc2VuYCwgYW5kIHNlbGVjdG9ycyBlbWl0IGFcbiAqICAgICAgc3ludGhldGljIGZvcmsgZXZlbnQgc2hhcmluZyB0aGUgc2VsZWN0b3IncyBvd24gcnVudGltZVN0YWdlSWRcbiAqICAgICAgKGV4Y2x1ZGVkIHZpYSB0aGUgc2VsZi1pZCBndWFyZCkuIEEgYnJhbmNoIHRoYXQgVEhST1dTIGJlZm9yZVxuICogICAgICBjb21wbGV0aW5nIGNvbnN1bWVzIGl0cyBzbG90IHZpYSBgb25FcnJvcmAsIHNvIHRoZSBwb3N0LWZhbi1vdXRcbiAqICAgICAgY29udmVyZ2VuY2Ugc3RhZ2UgaXMgbmV2ZXIgbWlzYXR0cmlidXRlZCBhcyBhIGJyYW5jaCBlbnRyeS5cbiAqXG4gKiAgIDMuIGF0dGVtcHQgc3RvcHMgKDEwLjEpIOKAlCBgb25BdHRlbXB0YDogYSBzdGFnZSB3aG9zZSByZXRyeSBzZXJpZXMgU1RPUFBFRFxuICogICAgICAoaXQgZ2F2ZSB1cCwgb3IgYSBsYXRlciBhdHRlbXB0IHBhdXNlZCBvciB3YXMgYWJvcnRlZDsgdGhlIHNoYXJlZFxuICogICAgICBwcmVkaWNhdGUgYHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMgwrcgaXNSZXRyeUV2aWRlbmNlYCkgbWFkZSBhIGRlY2lzaW9uIG9mIGl0c1xuICogICAgICBvd24g4oCUIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpbiB0aGUgc2hhcGUgYGRlY2lkZSgpYCBwcm9kdWNlcy4gSXRcbiAqICAgICAgaXMgcmVjb3JkZWQgYmVzaWRlIHRoZSBkZWNpZGVycyBhcyBga2luZDogJ2F0dGVtcHQtc3RvcCdgXG4gKiAgICAgIChgZ2V0RGVjaXNpb25zKClgLCBgZ2V0QXR0ZW1wdFN0b3AoaWQpYCksIGBjaG9zZW46ICdzdG9wJ2AsIHRoZSBzdG9wXG4gKiAgICAgIHJlYXNvbiBhcyBpdHMgYHJ1bGVMYWJlbGAuIEl0IGlzIE5PVCBhIGJyYW5jaCBlbnRyeTogYSBjb250cm9sIGVkZ2UgaW5cbiAqICAgICAgYGNhdXNhbENoYWluYCBsaW5rcyBhIHN0YWdlIHRvIEFOT1RIRVIgZXhlY3V0aW9uIHRoYXQgZ292ZXJuZWQgaXQsIGFuZFxuICogICAgICB0aGUgc3RvcCBnb3Zlcm5zIHRoZSBzdGFnZSBpdHNlbGYg4oCUIHNvIGBsb29rdXBgIGlzIHVuY2hhbmdlZCwgYW5kIGFcbiAqICAgICAgcmVhZGVyIHdhbGtpbmcgYSBmYWlsZWQgc3RhZ2UgcmVhZHMgdGhlIHN0b3Agb2ZmIGl0cyBkZWNpc2lvbiByZWNvcmQuXG4gKlxuICogICBgbG9va3VwKHJ1bnRpbWVTdGFnZUlkKWAgdGhlbiB3YWxrcyB0aGUgYW5jZXN0b3IgY2hhaW4gZnJvbSB0aGUgc3RhZ2VcbiAqICAgdXB3YXJkOyB0aGUgZmlyc3QgYW5jZXN0b3IgKG9yIHRoZSBzdGFnZSBpdHNlbGYpIHJlZ2lzdGVyZWQgYXMgYVxuICogICBicmFuY2ggZW50cnkgeWllbGRzIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciDigJQgdGhlIE5FQVJFU1QgZGVjaXNpb24uXG4gKiAgIE5lc3RlZCBkZWNpc2lvbnMgY29tcG9zZSBuYXR1cmFsbHk6IHRoZSBiYWNrdHJhY2tlciBleHBhbmRzIHRoZVxuICogICBkZWNpZGVyIG5vZGUgYW5kIGFza3MgYWdhaW4uXG4gKlxuICogQ29udmVudGlvbiA0OiBzdGF0ZSByZXNldHMgd2hlbiBgdHJhdmVyc2FsQ29udGV4dC5ydW5JZGAgY2hhbmdlcyDigJQgZWFjaFxuICogcnVuIChhbmQgZWFjaCByZXN1bWUsIHdoaWNoIG1pbnRzIGEgZnJlc2ggcnVuSWQpIHN0YXJ0cyBjbGVhbi4gQ29udHJvbFxuICogY2hhaW5zIHRoZXJlZm9yZSBkbyBOT1Qgc3Vydml2ZSBhIHBhdXNlL3Jlc3VtZSBib3VuZGFyeTogcG9zdC1yZXN1bWVcbiAqIHN0YWdlcyBjYW5ub3QgcmVzb2x2ZSBwcmUtcGF1c2UgZGVjaXNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG5pbXBvcnQgeyBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG4gKlxuICogY29uc3QgY3RybCA9IGNvbnRyb2xEZXBSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihjdHJsKTsgLy8gYXV0by1yb3V0ZXMgdG8gRmxvd1JlY29yZGVyIGNoYW5uZWxcbiAqXG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdhcHByb3ZlIzInLCBrZXlzUmVhZCwge1xuICogICBjb250cm9sRGVwczogY3RybC5hc0xvb2t1cCgpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xEZXBlbmRlbmN5LCBDb250cm9sRGVwTG9va3VwIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeUV2aWRlbmNlIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKipcbiAgICogYCdhdHRlbXB0LXN0b3AnYCBmb3IgYSBzdGFnZSdzIG93biByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgU1RPUFBFRCBpdHMgc2VyaWVzICgxMC4xKSDigJQgdGhlblxuICAgKiBgZGVjaWRlclJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgc3RhZ2UncyBleGVjdXRpb24sIGBjaG9zZW5gIGlzIGAnc3RvcCdgLCBgZXZpZGVuY2VgIHRoZSBhdHRlbXB0J3MgZGVjaXNpb24gYW5kXG4gICAqIGBydWxlTGFiZWxgIHRoZSBzdG9wIHJlYXNvbi4gQWJzZW50IGZvciBhIGRlY2lkZXIgLyBzZWxlY3Rvci5cbiAgICovXG4gIGtpbmQ/OiAnYXR0ZW1wdC1zdG9wJztcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENob3NlbiBicmFuY2ggZGlzcGxheSBuYW1lIChkZWNpZGVyKSBvciBzZWxlY3RlZCBuYW1lcyAoc2VsZWN0b3IpLiAqL1xuICBjaG9zZW46IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU3RydWN0dXJlZCBldmlkZW5jZSBmcm9tIGRlY2lkZSgpL3NlbGVjdCgpLCB3aGVuIHRoZSBzdGFnZSB1c2VkIHRoZW0uICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSB8IFNlbGVjdGlvbkV2aWRlbmNlO1xuICAvKipcbiAgICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24gKGUuZy4gJ0dvb2QgY3JlZGl0JykuXG4gICAqIERlY2lkZXJzIG9ubHkg4oCUIGEgc2VsZWN0b3IgcGlja3MgTiBicmFuY2hlcyBhbmQgbm8gc2luZ2xlIGxhYmVsXG4gICAqIGF0dHJpYnV0ZXMgdG8gYWxsIG9mIHRoZW0gKGluc3BlY3QgYGV2aWRlbmNlYCBpbnN0ZWFkKS5cbiAgICovXG4gIHJ1bGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgY29udHJvbC1kZXBzLU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGRlY2lzaW9uIGF3YWl0aW5nIGJyYW5jaC1lbnRyeSBjb3JyZWxhdGlvbi4gKi9cbmludGVyZmFjZSBQZW5kaW5nRGVjaXNpb24ge1xuICBkZWNpZGVySWQ6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGJyYW5jaCBlbnRyaWVzIGFyZSBzdGlsbCBleHBlY3RlZCAoZGVjaWRlcjogMSwgc2VsZWN0b3I6IE4pLiAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBpbk91dFJlY29yZGVyKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbERlcFJlY29yZGVyKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSk6IENvbnRyb2xEZXBSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgQ29udHJvbERlcFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBhbnN3ZXJzXG4gKiBcIndoaWNoIGRlY2lzaW9uIGFsbG93ZWQgdGhpcyBzdGFnZSB0byBydW4/XCIgQXR0YWNoIHZpYVxuICogYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCAob3IgYGF0dGFjaEZsb3dSZWNvcmRlcmApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbERlcFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogUnVudGltZSBhbmNlc3RvciBjaGFpbjogcnVudGltZVN0YWdlSWQg4oaSIHBhcmVudFJ1bnRpbWVTdGFnZUlkIChEMSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50T2YgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogUmVjb3JkZWQgZGVjaXNpb25zLCBrZXllZCBieSBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDb250cm9sRGVjaXNpb25SZWNvcmQ+KCk7XG4gIC8qKiBCcmFuY2gtZW50cnkgcnVudGltZVN0YWdlSWQg4oaSIGdvdmVybmluZyBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaEVudHJ5VG9EZWNpc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBEZWNpc2lvbnMgd2hvc2UgYnJhbmNoIGVudHJpZXMgaGF2ZSBub3QgYWxsIGJlZW4gc2VlbiB5ZXQuICovXG4gIHByaXZhdGUgcGVuZGluZzogUGVuZGluZ0RlY2lzaW9uW10gPSBbXTtcbiAgLyoqIFN0YWdlIGlkcyB0aGF0IGFscmVhZHkgY29uc3VtZWQgYSBwZW5kaW5nIHNsb3QgKGVudHJ5IE9SIGVycm9yKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lZFNsb3RzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb252ZW50aW9uIDQg4oCUIHJ1bklkIG9mIHRoZSBydW4gY3VycmVudGx5IGJlaW5nIHJlY29yZGVkLiAqL1xuICBwcml2YXRlIGxhc3RSdW5JZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBgY29udHJvbC1kZXBzLSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IGRlY2lkZXJJZCA9IGN0eC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBydWxlTGFiZWwgPSBtYXRjaGVkUnVsZUxhYmVsKGV2ZW50LmV2aWRlbmNlKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5zZXQoZGVjaWRlcklkLCB7XG4gICAgICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IGRlY2lkZXJJZCxcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgICAgLi4uKHJ1bGVMYWJlbCAhPT0gdW5kZWZpbmVkICYmIHsgcnVsZUxhYmVsIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IDEgfSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBpZiAoIWN0eCB8fCByZWNvcmQubmV4dCAhPT0gJ3N0b3AnIHx8ICFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBraW5kOiAnYXR0ZW1wdC1zdG9wJyxcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogcmVjb3JkLnNlcmllcyxcbiAgICAgIGNob3NlbjogJ3N0b3AnLFxuICAgICAgZXZpZGVuY2U6IHJlY29yZC5kZWNpc2lvbixcbiAgICAgIHJ1bGVMYWJlbDogcmVjb3JkLnJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0LXN0b3AgZGVjaXNpb24gb2YgYSBzdGFnZSBleGVjdXRpb24gd2hvc2UgcmV0cnkgc2VyaWVzIHN0b3BwZWQsIGlmIGl0IGRpZC4gKi9cbiAgZ2V0QXR0ZW1wdFN0b3AocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IENvbnRyb2xEZWNpc2lvblJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5kZWNpc2lvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4gcmVjb3JkPy5raW5kID09PSAnYXR0ZW1wdC1zdG9wJyA/IHJlY29yZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBbGwgZGVjaXNpb25zIHJlY29yZGVkIGZvciB0aGUgY3VycmVudCBydW4sIGluIGV2ZW50IG9yZGVyIOKAlCBkZWNpZGVycywgc2VsZWN0b3JzIGFuZCBhdHRlbXB0IHN0b3BzLiAqL1xuICBnZXREZWNpc2lvbnMoKTogQ29udHJvbERlY2lzaW9uUmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kZWNpc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQtcnVuIGNvbnRyb2wgZXZpZGVuY2UgZm9yIHRoZSBuYXRpdmUgc25hcHNob3QuIFByb2plY3Qgb25seSB0aGVcbiAgICogc3RhZ2UgaWRlbnRpdGllcyBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbDsgbmV2ZXIgd2FsayB0aGUgZXhlY3V0aW9uIHRyZWUuXG4gICAqIFBhcmVudGxlc3Mgcm9vdHMgY2Fubm90IGhhdmUgYSBnb3Zlcm5pbmcgY29udHJvbCBlZGdlLlxuICAgKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFtzdHJpbmcsIENvbnRyb2xEZXBlbmRlbmN5XVtdID0gW107XG4gICAgZm9yIChjb25zdCBydW50aW1lU3RhZ2VJZCBvZiB0aGlzLnBhcmVudE9mLmtleXMoKSkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMubG9va3VwKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMucHVzaChbcnVudGltZVN0YWdlSWQsIGRlcGVuZGVuY3ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdjb250cm9sLWRlcGVuZGVuY2llcycsXG4gICAgICBkYXRhOiB7IGRlY2lzaW9uczogdGhpcy5nZXREZWNpc2lvbnMoKSwgY29udHJvbERlcHM6IE9iamVjdC5mcm9tRW50cmllcyhkZXBlbmRlbmNpZXMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgc3RhdGUgKGFsc28gaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIHJ1bklkIGNoYW5nZSkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50T2YuY2xlYXIoKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgdGhpcy5jb25zdW1lZFNsb3RzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDb252ZW50aW9uIDQ6IGEgbmV3IHJ1bklkIG1lYW5zIGEgbmV3IHJ1biDigJQgcmVzZXQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlc2V0SWZOZXdSdW4ocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW5JZCA9PT0gdGhpcy5sYXN0UnVuSWQpIHJldHVybjtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0UnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgcGFyZW50UnVudGltZVN0YWdlSWRgIGlzIGEgZGVjaWRlciB3aXRoIGFuIHVubWF0Y2hlZCBwZW5kaW5nIHNsb3QsXG4gICAqIGNvbnN1bWUgb25lLiBgcmVnaXN0ZXJgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHN0YWdlIGlzIHJlY29yZGVkIGFzIGFcbiAgICogYnJhbmNoIGVudHJ5IChzdGFnZSBleGVjdXRlZC9lcnJvcmVkKSDigJQgYm90aCBwYXRocyBjb25zdW1lIHRoZSBzbG90IHNvXG4gICAqIGNvdW50cyBzdGF5IGV4YWN0IGV2ZW4gd2hlbiBhIHN0YWdlIHByb2R1Y2VzIGJvdGggZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUGVuZGluZ1Nsb3QocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcGFyZW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgcmVnaXN0ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSByZXR1cm47IC8vIHN5bnRoZXRpYyBzZWxmLWV2ZW50c1xuICAgIGlmICh0aGlzLmNvbnN1bWVkU2xvdHMuaGFzKHJ1bnRpbWVTdGFnZUlkKSkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnBlbmRpbmdbaV07XG4gICAgICBpZiAocC5kZWNpZGVySWQgIT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5jb25zdW1lZFNsb3RzLmFkZChydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAocmVnaXN0ZXIpIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLnNldChydW50aW1lU3RhZ2VJZCwgcC5kZWNpZGVySWQpO1xuICAgICAgcC5yZW1haW5pbmctLTtcbiAgICAgIGlmIChwLnJlbWFpbmluZyA8PSAwKSB0aGlzLnBlbmRpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWNpZGUoKSBydWxlIGxhYmVsIHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uOiB0aGUgbWF0Y2hlZCBydWxlXG4gKiBtYXBwaW5nIHRvIHRoZSBjaG9zZW4gYnJhbmNoIChmaXJzdCBtYXRjaGVkIHJ1bGUgYXMgZmFsbGJhY2spLlxuICovXG5mdW5jdGlvbiBtYXRjaGVkUnVsZUxhYmVsKGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFldmlkZW5jZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcnVsZSA9XG4gICAgZXZpZGVuY2UucnVsZXMuZmluZCgocikgPT4gci5tYXRjaGVkICYmIHIuYnJhbmNoID09PSBldmlkZW5jZS5jaG9zZW4pID8/IGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCk7XG4gIHJldHVybiBydWxlPy5sYWJlbDtcbn1cbiJdfQ==