footprintjs 6.1.2 → 7.0.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 (45) hide show
  1. package/CLAUDE.md +31 -26
  2. package/README.md +1 -1
  3. package/dist/advanced.js +2 -6
  4. package/dist/esm/advanced.js +1 -3
  5. package/dist/esm/lib/builder/structure/StructureRecorder.js +2 -2
  6. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +59 -24
  7. package/dist/esm/lib/recorder/InOutRecorder.js +31 -15
  8. package/dist/esm/lib/recorder/QualityRecorder.js +40 -13
  9. package/dist/esm/lib/recorder/RecorderOperation.js +3 -3
  10. package/dist/esm/lib/recorder/index.js +1 -8
  11. package/dist/esm/lib/recorder/qualityTrace.js +1 -1
  12. package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
  13. package/dist/esm/lib/scope/recorders/MetricRecorder.js +37 -9
  14. package/dist/esm/trace.js +1 -12
  15. package/dist/lib/builder/structure/StructureRecorder.js +2 -2
  16. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +59 -24
  17. package/dist/lib/recorder/InOutRecorder.js +31 -15
  18. package/dist/lib/recorder/QualityRecorder.js +40 -13
  19. package/dist/lib/recorder/RecorderOperation.js +3 -3
  20. package/dist/lib/recorder/index.js +2 -12
  21. package/dist/lib/recorder/qualityTrace.js +1 -1
  22. package/dist/lib/runner/ExecutionRuntime.js +1 -1
  23. package/dist/lib/scope/recorders/MetricRecorder.js +37 -9
  24. package/dist/trace.js +2 -16
  25. package/dist/types/advanced.d.ts +0 -2
  26. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  27. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +26 -5
  28. package/dist/types/lib/recorder/InOutRecorder.d.ts +17 -6
  29. package/dist/types/lib/recorder/QualityRecorder.d.ts +17 -3
  30. package/dist/types/lib/recorder/RecorderOperation.d.ts +2 -2
  31. package/dist/types/lib/recorder/index.d.ts +0 -3
  32. package/dist/types/lib/recorder/qualityTrace.d.ts +5 -2
  33. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -1
  34. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +18 -3
  35. package/dist/types/trace.d.ts +0 -3
  36. package/package.json +1 -1
  37. package/dist/esm/lib/recorder/BoundaryStateTracker.js +0 -260
  38. package/dist/esm/lib/recorder/KeyedRecorder.js +0 -94
  39. package/dist/esm/lib/recorder/SequenceRecorder.js +0 -193
  40. package/dist/lib/recorder/BoundaryStateTracker.js +0 -264
  41. package/dist/lib/recorder/KeyedRecorder.js +0 -98
  42. package/dist/lib/recorder/SequenceRecorder.js +0 -197
  43. package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +0 -212
  44. package/dist/types/lib/recorder/KeyedRecorder.d.ts +0 -56
  45. package/dist/types/lib/recorder/SequenceRecorder.d.ts +0 -112
@@ -60,7 +60,7 @@
60
60
  * .filter((b) => b.subflowPath[1] === 'sf-agent'); // path[0] is the root
61
61
  * ```
62
62
  */
63
- import { SequenceRecorder } from './SequenceRecorder.js';
63
+ import { SequenceStore } from './SequenceStore.js';
64
64
  /** Synthetic id for the top-level run's boundary pair. */
65
65
  export const ROOT_SUBFLOW_ID = '__root__';
66
66
  /** Synthetic runtimeStageId for the top-level run boundary pair. */
@@ -74,46 +74,46 @@ export function inOutRecorder(options = {}) {
74
74
  }
75
75
  /**
76
76
  * Stateful accumulator that watches `FlowRecorder` chart-boundary events
77
- * (run start/end + subflow entry/exit) and emits `InOutEntry` records to
78
- * its underlying `SequenceRecorder` storage.
77
+ * (run start/end + subflow entry/exit) and pushes `InOutEntry` records to
78
+ * its composed `SequenceStore` (Convention 1 — one purpose per recorder).
79
79
  *
80
80
  * Attach via `executor.attachCombinedRecorder(recorder)` — footprintjs
81
81
  * detects the `FlowRecorder` method shape and routes events.
82
82
  */
83
- export class InOutRecorder extends SequenceRecorder {
83
+ export class InOutRecorder {
84
84
  id;
85
+ /** 1:N ordered storage with per-step index (Convention 1 — composed). */
86
+ store = new SequenceStore();
85
87
  constructor(options = {}) {
86
- super();
87
88
  this.id = options.id ?? `inout-${++_counter}`;
88
89
  }
89
90
  // ── FlowRecorder hooks ────────────────────────────────────────────────
90
91
  onRunStart(event) {
91
- this.emit(buildRootEntry('entry', event.payload));
92
+ this.store.push(buildRootEntry('entry', event.payload));
92
93
  }
93
94
  onRunEnd(event) {
94
- this.emit(buildRootEntry('exit', event.payload));
95
+ this.store.push(buildRootEntry('exit', event.payload));
95
96
  }
96
97
  onSubflowEntry(event) {
97
98
  const entry = buildSubflowEntry(event, 'entry');
98
99
  if (entry)
99
- this.emit(entry);
100
+ this.store.push(entry);
100
101
  }
101
102
  onSubflowExit(event) {
102
103
  const entry = buildSubflowEntry(event, 'exit');
103
104
  if (entry)
104
- this.emit(entry);
105
+ this.store.push(entry);
105
106
  }
106
107
  // ── Query API ─────────────────────────────────────────────────────────
107
- /** All entries in execution order (entry+exit interleaved).
108
- * Alias for `getEntries()` with domain-clearer naming. */
108
+ /** All entries in execution order (entry+exit interleaved). */
109
109
  getBoundaries() {
110
- return this.getEntries();
110
+ return this.store.getAll();
111
111
  }
112
112
  /** Entry/exit pair for one chart execution.
113
113
  * Returns `{ entry, exit }` — `exit` is `undefined` for in-progress / paused
114
114
  * charts or if `runtimeStageId` is unknown. */
115
115
  getBoundary(runtimeStageId) {
116
- const entries = this.getEntriesForStep(runtimeStageId);
116
+ const entries = this.store.getByKey(runtimeStageId);
117
117
  return {
118
118
  entry: entries.find((e) => e.phase === 'entry'),
119
119
  exit: entries.find((e) => e.phase === 'exit'),
@@ -125,12 +125,28 @@ export class InOutRecorder extends SequenceRecorder {
125
125
  * step (depth 0). */
126
126
  getSteps() {
127
127
  const steps = [];
128
- for (const b of this.getEntries()) {
128
+ for (const b of this.store.getAll()) {
129
129
  if (b.phase === 'entry')
130
130
  steps.push(b);
131
131
  }
132
132
  return steps;
133
133
  }
134
+ /** O(1) lookup: all boundary entries (both phases) for one runtimeStageId. */
135
+ getEntriesForStep(runtimeStageId) {
136
+ return this.store.getByKey(runtimeStageId);
137
+ }
138
+ /** Pre-built per-step range index — O(1) lookups for time-travel scrubbing. */
139
+ getEntryRanges() {
140
+ return this.store.getEntryRanges();
141
+ }
142
+ /** Progressive reveal: boundaries whose runtimeStageId is in the visible set. */
143
+ getEntriesUpTo(visibleIds) {
144
+ return this.store.getEntriesUpTo(visibleIds);
145
+ }
146
+ /** Clear all stored boundaries — called by the executor before each run(). */
147
+ clear() {
148
+ this.store.clear();
149
+ }
134
150
  /** The root run's entry/exit pair, if the run has started.
135
151
  * Convenience for consumers that want to bracket the timeline by the
136
152
  * outermost in/out. */
@@ -202,4 +218,4 @@ function buildSubflowEntry(event, phase) {
202
218
  isRoot: false,
203
219
  };
204
220
  }
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZERztBQUdILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTXpELDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBRTFDLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUM7QUFtRGxELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQjs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBZ0MsRUFBRTtJQUM5RCxPQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxnQkFBNEI7SUFDcEQsRUFBRSxDQUFTO0lBRXBCLFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxVQUFVLENBQUMsS0FBbUI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxRQUFRLENBQUMsS0FBbUI7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFD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QUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFFMUUsT0FBTztRQUNMLGNBQWM7UUFDZCxTQUFTO1FBQ1QsY0FBYztRQUNkLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSTtRQUN2QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsV0FBVztRQUNYLEtBQUs7UUFDTCxLQUFLO1FBQ0wsT0FBTztRQUNQLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluT3V0UmVjb3JkZXIg4oCUIGNhcHR1cmVzIGV2ZXJ5IGNoYXJ0J3MgaW5wdXQvb3V0cHV0IGFzIGVudHJ5L2V4aXQgcGFpcnMuXG4gKlxuICogVGhlIGdhcCB0aGlzIGZpbGxzOlxuICogICBFdmVyeSBjaGFydCBpbiBmb290cHJpbnRqcyBoYXMgdHdvIG5hdHVyYWwgZGF0YSBib3VuZGFyaWVzOlxuICogICAgIC0gdGhlICoqaW5wdXQqKiB0aGF0IGZsb3dlZCBpbiAodG9wLWxldmVsOiBgcnVuKHtpbnB1dH0pYDtcbiAqICAgICAgIHN1YmZsb3c6IGBpbnB1dE1hcHBlcmAgcmVzdWx0KVxuICogICAgIC0gdGhlICoqb3V0cHV0KiogdGhhdCBmbG93ZWQgb3V0ICh0b3AtbGV2ZWw6IGNoYXJ0IHJldHVybiB2YWx1ZTtcbiAqICAgICAgIHN1YmZsb3c6IHNoYXJlZCBzdGF0ZSBhdCBleGl0IC8gYG91dHB1dE1hcHBlcmAgcmVzdWx0KVxuICpcbiAqICAgVG9nZXRoZXIgd2l0aCBgVG9wb2xvZ3lSZWNvcmRlcmAgKGNvbXBvc2l0aW9uIHNoYXBlKSB0aGlzIGlzIHRoZVxuICogICB1bml2ZXJzYWwgXCJzdGVwXCIgcHJpbWl0aXZlIHRoYXQgZG93bnN0cmVhbSBsYXllcnMgcHJvamVjdCDigJQgYSBMZW5zXG4gKiAgIFN0ZXBHcmFwaCwgYSBUcmFjZSB2aWV3LCBjdXN0b20gZGFzaGJvYXJkcy4gQWxsIGJpbmQgYnkgYHJ1bnRpbWVTdGFnZUlkYC5cbiAqXG4gKiAgIFRoZSByb290IGNoYXJ0IGlzIHRyZWF0ZWQgaWRlbnRpY2FsbHkgdG8gYW55IHN1YmZsb3c6IGFuIGBlbnRyeWBcbiAqICAgYm91bmRhcnkgb24gYG9uUnVuU3RhcnRgIGFuZCBhbiBgZXhpdGAgYm91bmRhcnkgb24gYG9uUnVuRW5kYCwgd2l0aFxuICogICBgc3ViZmxvd0lkOiAnX19yb290X18nYC4gU28gY29uc3VtZXJzIGJ1aWxkaW5nIFwiZXZlcnkgc3RlcCBoYXMgYW5cbiAqICAgaW4vb3V0IGFycm93XCIgdmlld3MgY2FuIGNsb3NlIHRoZSBjaGFpbiBhdCB0aGUgdG9wIGxldmVsIOKAlCBub1xuICogICBzcGVjaWFsLWNhc2UgcmVuZGVyaW5nIHJlcXVpcmVkLlxuICpcbiAqIFR3byBib3VuZGFyeSBwaGFzZXMgcGVyIGNoYXJ0IGV4ZWN1dGlvbjpcbiAqICAgMS4gYHBoYXNlOiAnZW50cnknYCDigJQgcGF5bG9hZCA9IHRoZSBpbnB1dCBjcm9zc2luZyB0aGUgYm91bmRhcnkgSU5cbiAqICAgMi4gYHBoYXNlOiAnZXhpdCdgICDigJQgcGF5bG9hZCA9IHRoZSBvdXRwdXQgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IE9VVFxuICpcbiAqICAgTG9vcHMgcmUtZW50ZXJpbmcgdGhlIHNhbWUgc3ViZmxvdyBnZXQgZGlzdGluY3QgYHJ1bnRpbWVTdGFnZUlkYHNcbiAqICAgYXV0b21hdGljYWxseSAocGFyZW50IHN0YWdlJ3MgZXhlY3V0aW9uSW5kZXggaW5jcmVtZW50cyBwZXIgaXRlcmF0aW9uKS5cbiAqXG4gKiBQYXVzZSBzZW1hbnRpY3M6XG4gKiAgIFdoZW4gYSBzdGFnZSBwYXVzZXMgaW5zaWRlIGEgc3ViZmxvdywgdGhlIGVuZ2luZSByZS10aHJvd3MgdGhlIHBhdXNlXG4gKiAgIHNpZ25hbCB3aXRob3V0IGZpcmluZyBgb25TdWJmbG93RXhpdGAgKG9yIGBvblJ1bkVuZGApLiBUaGUgc3ViZmxvd1xuICogICBoYXMgYW4gYGVudHJ5YCB3aXRoIG5vIG1hdGNoaW5nIGBleGl0YCB1bnRpbCB0aGUgcnVuIHJlc3VtZXMgYW5kXG4gKiAgIGV4aXRzIGNsZWFubHkuIENvbnN1bWVycyBzaG91bGQgaGFuZGxlIGVudHJ5LXdpdGhvdXQtZXhpdCBncmFjZWZ1bGx5XG4gKiAgIChpdCBtZWFucyBcImluIHByb2dyZXNzXCIgb3IgXCJwYXVzZWRcIikuIFRoZSBgZ2V0Qm91bmRhcnkoKWAgaGVscGVyXG4gKiAgIHJldHVybnMgYHsgZW50cnksIGV4aXQ6IHVuZGVmaW5lZCB9YCBpbiB0aGF0IGNhc2UuXG4gKlxuICogUmVkYWN0aW9uOlxuICogICBQYXlsb2FkIHJlZGFjdGlvbiBpcyB0aGUgZW5naW5lJ3MgcmVzcG9uc2liaWxpdHkgKGBSZWRhY3Rpb25Qb2xpY3lgKS5cbiAqICAgQnkgdGhlIHRpbWUgcGF5bG9hZHMgcmVhY2ggdGhpcyByZWNvcmRlciB2aWEgYEZsb3dTdWJmbG93RXZlbnRgIG9yXG4gKiAgIGBGbG93UnVuRXZlbnRgLCByZWRhY3RhYmxlIHZhbHVlcyBhcmUgYWxyZWFkeSBzY3J1YmJlZC4gVGhlIHJlY29yZGVyXG4gKiAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgcmUtcmVkYWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBpbk91dFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGluT3V0ID0gaW5PdXRSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihpbk91dCk7XG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBpbk91dC5nZXRTdGVwcygpOyAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgYm91bmRhcmllcyDigJQgdGltZWxpbmUgcHJvamVjdGlvblxuICogaW5PdXQuZ2V0Qm91bmRhcnkocnVudGltZVN0YWdlSWQpOyAgIC8vIHsgZW50cnksIGV4aXQgfSBwYWlyIGZvciBvbmUgZXhlY3V0aW9uXG4gKiBpbk91dC5nZXRCb3VuZGFyaWVzKCk7ICAgICAgICAgICAgICAgLy8gZmxhdCBsaXN0IChlbnRyeStleGl0IGludGVybGVhdmVkKVxuICogaW5PdXQuZ2V0Um9vdEJvdW5kYXJ5KCk7ICAgICAgICAgICAgIC8vIHsgZW50cnksIGV4aXQgfSBmb3IgdGhlIHRvcC1sZXZlbCBydW5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZpbHRlcmluZyBieSBzdWJmbG93IHBhdGhcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGFnZW50U3RlcHMgPSBpbk91dFxuICogICAuZ2V0U3RlcHMoKVxuICogICAuZmlsdGVyKChiKSA9PiBiLnN1YmZsb3dQYXRoWzFdID09PSAnc2YtYWdlbnQnKTsgIC8vIHBhdGhbMF0gaXMgdGhlIHJvb3RcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyLCBGbG93UnVuRXZlbnQsIEZsb3dTdWJmbG93RXZlbnQgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IFNlcXVlbmNlUmVjb3JkZXIgfSBmcm9tICcuL1NlcXVlbmNlUmVjb3JkZXIuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIEluT3V0UGhhc2UgPSAnZW50cnknIHwgJ2V4aXQnO1xuXG4vKiogU3ludGhldGljIGlkIGZvciB0aGUgdG9wLWxldmVsIHJ1bidzIGJvdW5kYXJ5IHBhaXIuICovXG5leHBvcnQgY29uc3QgUk9PVF9TVUJGTE9XX0lEID0gJ19fcm9vdF9fJztcblxuLyoqIFN5bnRoZXRpYyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHRvcC1sZXZlbCBydW4gYm91bmRhcnkgcGFpci4gKi9cbmV4cG9ydCBjb25zdCBST09UX1JVTlRJTUVfU1RBR0VfSUQgPSAnX19yb290X18jMCc7XG5cbi8qKlxuICogT25lIGhhbGYgb2YgYSBjaGFydCBleGVjdXRpb24gYm91bmRhcnkuIEVudHJ5L2V4aXQgcGFpcnMgc2hhcmUgYHJ1bnRpbWVTdGFnZUlkYC5cbiAqXG4gKiBOYW1pbmcgZm9sbG93cyB0aGUgZW5naW5lOiBgc3ViZmxvd0lkYCBpcyB0aGUgcGF0aC1wcmVmaXhlZCBpZGVudGlmaWVyIHRoZVxuICogZW5naW5lIGVtaXRzIChlLmcuIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYCBmb3IgbmVzdGVkIHN1YmZsb3dzKS4gRm9yIHRoZVxuICogdG9wLWxldmVsIHJ1biwgaXQncyB0aGUgc3ludGhldGljIGAnX19yb290X18nYC4gYHN1YmZsb3dQYXRoYCBpcyB0aGVcbiAqIGRlY29tcG9zaXRpb24gaW50byBzZWdtZW50cyDigJQgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBiZWNhdXNlIGNvbnN1bWVyc1xuICogb2Z0ZW4gcXVlcnkgLyBncm91cCBieSB0aGUgcGF0aCB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluT3V0RW50cnkge1xuICAvKiogcnVudGltZVN0YWdlSWQg4oCUIHNhbWUgdmFsdWUgZm9yIHRoZSBlbnRyeS9leGl0IHBhaXIgb2Ygb25lIGV4ZWN1dGlvbi5cbiAgICogIFRvcC1sZXZlbCBydW4gdXNlcyB0aGUgc3ludGhldGljIGBST09UX1JVTlRJTUVfU1RBR0VfSURgLiAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogUGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkZW50aWZpZXIgKG1hdGNoZXMgdGhlIGVuZ2luZSdzIGBGbG93U3ViZmxvd0V2ZW50LnN1YmZsb3dJZGApLlxuICAgKiAgVG9wLWxldmVsIOKGkiBgJ19fcm9vdF9fJ2AuIFN1YmZsb3cg4oaSIGAnc2Ytb3V0ZXInYCBvciBgJ3NmLW91dGVyL3NmLWlubmVyJ2AuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogTGFzdCBzZWdtZW50IG9mIGBzdWJmbG93SWRgIOKAlCBjb252ZW5pZW5jZSBmb3IgY29uc3VtZXJzIHRoYXQgZ3JvdXAgYnkgbGVhZiBuYW1lLlxuICAgKiAgVG9wLWxldmVsIOKGkiBgJ19fcm9vdF9fJ2AuICovXG4gIHJlYWRvbmx5IGxvY2FsU3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IG5hbWUgKGZyb20gdGhlIGJ1aWxkZXI7IGAnUnVuJ2AgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuKS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd05hbWU6IHN0cmluZztcbiAgLyoqIEJ1aWxkLXRpbWUgZGVzY3JpcHRpb24gZnJvbSB0aGUgc3ViZmxvdydzIHJvb3Qgc3RhZ2UuXG4gICAqICBDYXJyaWVzIHRheG9ub215IG1hcmtlcnMgKGUuZy4gYCdBZ2VudDogUmVBY3QgbG9vcCdgKS4gVW5kZWZpbmVkIGZvciByb290LiAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIERlY29tcG9zaXRpb24gb2YgYHN1YmZsb3dJZGAgaW50byBzZWdtZW50cy4gVG9wLWxldmVsIOKGkiBgWydfX3Jvb3RfXyddYC5cbiAgICogIFN1YmZsb3dzIGxpdmUgVU5ERVIgdGhlIHJvb3Q6IGEgdG9wLWxldmVsIHN1YmZsb3cgaGFzIHBhdGggYFsnX19yb290X18nLCAnc2YteCddYC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogRGVwdGggaW4gdGhlIHN1YmZsb3cgdHJlZS4gUm9vdCDihpIgMC4gRmlyc3QtbGV2ZWwgc3ViZmxvdyDihpIgMS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIFdoaWNoIHNpZGUgb2YgdGhlIGJvdW5kYXJ5IHRoaXMgZW50cnkgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEluT3V0UGhhc2U7XG4gIC8qKiBEYXRhIGNyb3NzaW5nIHRoZSBib3VuZGFyeS5cbiAgICogIC0gYHBoYXNlOiAnZW50cnknYCDihpIgYGlucHV0TWFwcGVyYCByZXN1bHQgKHN1YmZsb3cpIG9yIGBydW4oe2lucHV0fSlgIChyb290KVxuICAgKiAgLSBgcGhhc2U6ICdleGl0J2AgIOKGkiBzdWJmbG93IHNoYXJlZCBzdGF0ZSBhdCBleGl0IChzdWJmbG93KSBvciBjaGFydCByZXR1cm4gdmFsdWUgKHJvb3QpXG4gICAqXG4gICAqICBVbmRlZmluZWQgd2hlbiBubyBtYXBwZXIgLyBubyBpbnB1dCB3YXMgcHJvdmlkZWQuICovXG4gIHJlYWRvbmx5IHBheWxvYWQ/OiB1bmtub3duO1xuICAvKiogVHJ1ZSB3aGVuIHRoaXMgZW50cnkgY2FtZSBmcm9tIHRoZSB0b3AtbGV2ZWwgcnVuIChgb25SdW5TdGFydGAgLyBgb25SdW5FbmRgKVxuICAgKiAgcmF0aGVyIHRoYW4gZnJvbSBhIHN1YmZsb3cgKGBvblN1YmZsb3dFbnRyeWAgLyBgb25TdWJmbG93RXhpdGApLlxuICAgKiAgTGVucyB1c2VzIHRoaXMgdG8gcmVuZGVyIHRoZSByb290IHBhaXIgYXMgYHVzZXIg4oaSIHJ1biDihpIgdXNlcmAgaW5zdGVhZCBvZlxuICAgKiAgdGhlIHJlZ3VsYXIgc3ViZmxvdyBzaGFwZS4gKi9cbiAgcmVhZG9ubHkgaXNSb290OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluT3V0UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGBpbm91dC1OYCAoYXV0by1pbmNyZW1lbnRlZCkuICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGB0b3BvbG9neVJlY29yZGVyKClgIC8gYG5hcnJhdGl2ZSgpYCBzdHlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluT3V0UmVjb3JkZXIob3B0aW9uczogSW5PdXRSZWNvcmRlck9wdGlvbnMgPSB7fSk6IEluT3V0UmVjb3JkZXIge1xuICByZXR1cm4gbmV3IEluT3V0UmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIGBGbG93UmVjb3JkZXJgIGNoYXJ0LWJvdW5kYXJ5IGV2ZW50c1xuICogKHJ1biBzdGFydC9lbmQgKyBzdWJmbG93IGVudHJ5L2V4aXQpIGFuZCBlbWl0cyBgSW5PdXRFbnRyeWAgcmVjb3JkcyB0b1xuICogaXRzIHVuZGVybHlpbmcgYFNlcXVlbmNlUmVjb3JkZXJgIHN0b3JhZ2UuXG4gKlxuICogQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlCBmb290cHJpbnRqc1xuICogZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgSW5PdXRSZWNvcmRlciBleHRlbmRzIFNlcXVlbmNlUmVjb3JkZXI8SW5PdXRFbnRyeT4gaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEluT3V0UmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBpbm91dC0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25SdW5TdGFydChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbWl0KGJ1aWxkUm9vdEVudHJ5KCdlbnRyeScsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoYnVpbGRSb290RW50cnkoJ2V4aXQnLCBldmVudC5wYXlsb2FkKSk7XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQsICdlbnRyeScpO1xuICAgIGlmIChlbnRyeSkgdGhpcy5lbWl0KGVudHJ5KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IGJ1aWxkU3ViZmxvd0VudHJ5KGV2ZW50LCAnZXhpdCcpO1xuICAgIGlmIChlbnRyeSkgdGhpcy5lbWl0KGVudHJ5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBRdWVyeSBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEFsbCBlbnRyaWVzIGluIGV4ZWN1dGlvbiBvcmRlciAoZW50cnkrZXhpdCBpbnRlcmxlYXZlZCkuXG4gICAqICBBbGlhcyBmb3IgYGdldEVudHJpZXMoKWAgd2l0aCBkb21haW4tY2xlYXJlciBuYW1pbmcuICovXG4gIGdldEJvdW5kYXJpZXMoKTogSW5PdXRFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFbnRyaWVzKCk7XG4gIH1cblxuICAvKiogRW50cnkvZXhpdCBwYWlyIGZvciBvbmUgY2hhcnQgZXhlY3V0aW9uLlxuICAgKiAgUmV0dXJucyBgeyBlbnRyeSwgZXhpdCB9YCDigJQgYGV4aXRgIGlzIGB1bmRlZmluZWRgIGZvciBpbi1wcm9ncmVzcyAvIHBhdXNlZFxuICAgKiAgY2hhcnRzIG9yIGlmIGBydW50aW1lU3RhZ2VJZGAgaXMgdW5rbm93bi4gKi9cbiAgZ2V0Qm91bmRhcnkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHsgZW50cnk/OiBJbk91dEVudHJ5OyBleGl0PzogSW5PdXRFbnRyeSB9IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5nZXRFbnRyaWVzRm9yU3RlcChydW50aW1lU3RhZ2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJ5OiBlbnRyaWVzLmZpbmQoKGUpID0+IGUucGhhc2UgPT09ICdlbnRyeScpLFxuICAgICAgZXhpdDogZW50cmllcy5maW5kKChlKSA9PiBlLnBoYXNlID09PSAnZXhpdCcpLFxuICAgIH07XG4gIH1cblxuICAvKiogSnVzdCB0aGUgYGVudHJ5YC1waGFzZSBib3VuZGFyaWVzIOKAlCB0aGUgXCJzdGVwIGxpc3RcIiBwcm9qZWN0aW9uIGluXG4gICAqICBleGVjdXRpb24gb3JkZXIuIFRoaXMgaXMgdGhlIG5hdHVyYWwgdGltZWxpbmUgb2YgY2hhcnQgZXhlY3V0aW9uc1xuICAgKiAgZm9yIHNsaWRlciAvIHNjcnViYmluZyBVSXMuIFRoZSB0b3AtbGV2ZWwgcnVuJ3MgZW50cnkgaXMgdGhlIGZpcnN0XG4gICAqICBzdGVwIChkZXB0aCAwKS4gKi9cbiAgZ2V0U3RlcHMoKTogSW5PdXRFbnRyeVtdIHtcbiAgICBjb25zdCBzdGVwczogSW5PdXRFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMuZ2V0RW50cmllcygpKSB7XG4gICAgICBpZiAoYi5waGFzZSA9PT0gJ2VudHJ5Jykgc3RlcHMucHVzaChiKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqIFRoZSByb290IHJ1bidzIGVudHJ5L2V4aXQgcGFpciwgaWYgdGhlIHJ1biBoYXMgc3RhcnRlZC5cbiAgICogIENvbnZlbmllbmNlIGZvciBjb25zdW1lcnMgdGhhdCB3YW50IHRvIGJyYWNrZXQgdGhlIHRpbWVsaW5lIGJ5IHRoZVxuICAgKiAgb3V0ZXJtb3N0IGluL291dC4gKi9cbiAgZ2V0Um9vdEJvdW5kYXJ5KCk6IHsgZW50cnk/OiBJbk91dEVudHJ5OyBleGl0PzogSW5PdXRFbnRyeSB9IHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb3VuZGFyeShST09UX1JVTlRJTUVfU1RBR0VfSUQpO1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IGJ1bmRsZSBmb3IgaW5jbHVzaW9uIGluIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYC4gKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ0luT3V0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2hhcnQgaW4vb3V0IHN0cmVhbSDigJQgZW50cnkvZXhpdCBwYWlycyBhdCBldmVyeSBjaGFydCBib3VuZGFyeSAocm9vdCArIHN1YmZsb3dzKScsXG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb246ICd0cmFuc2xhdGUnIGFzIGNvbnN0LFxuICAgICAgZGF0YTogdGhpcy5nZXRCb3VuZGFyaWVzKCksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIAgSW50ZXJuYWwgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBCdWlsZCB0aGUgc3ludGhldGljIHJvb3QgZW50cnkvZXhpdC4gRGVwdGggaXMgYDBgIGFuZCB0aGUgcGF0aCBpc1xuICogYFtST09UX1NVQkZMT1dfSURdYCBzbyBjb25zdW1lcnMgZ3JvdXBpbmcgYnkgcGF0aCBzZWUgdGhlIHJvb3QgYXMgYVxuICogcmVndWxhciB0b3AtbGV2ZWwgY29udGFpbmVyLlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RFbnRyeShwaGFzZTogSW5PdXRQaGFzZSwgcGF5bG9hZDogdW5rbm93bik6IEluT3V0RW50cnkge1xuICByZXR1cm4ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBST09UX1JVTlRJTUVfU1RBR0VfSUQsXG4gICAgc3ViZmxvd0lkOiBST09UX1NVQkZMT1dfSUQsXG4gICAgbG9jYWxTdWJmbG93SWQ6IFJPT1RfU1VCRkxPV19JRCxcbiAgICBzdWJmbG93TmFtZTogJ1J1bicsXG4gICAgc3ViZmxvd1BhdGg6IFtST09UX1NVQkZMT1dfSURdLFxuICAgIGRlcHRoOiAwLFxuICAgIHBoYXNlLFxuICAgIHBheWxvYWQsXG4gICAgaXNSb290OiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc3ViZmxvdyBgSW5PdXRFbnRyeWAgZnJvbSBhIGBGbG93U3ViZmxvd0V2ZW50YC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGV2ZW50IGxhY2tzIGEgYHN1YmZsb3dJZGAgKGFub255bW91cyAvXG4gKiBtYWxmb3JtZWQgc3ViZmxvdyBldmVudHMg4oCUIHNhbWUgZGVmZW5zaXZlIHBvbGljeSBhcyBgVG9wb2xvZ3lSZWNvcmRlcmApLlxuICpcbiAqIFBhdGggZGVyaXZhdGlvbjogdGhlIGVuZ2luZSBlbWl0cyBgc3ViZmxvd0lkYCBhbHJlYWR5IHByZWZpeGVkIHdpdGggdGhlXG4gKiBmdWxsIHBhdGggb2YgcGFyZW50IHN1YmZsb3dzIChlLmcuIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYCkuIFdlIGRlY29tcG9zZVxuICogdGhhdCBpbnRvIHNlZ21lbnRzIHRvIHBvcHVsYXRlIGBzdWJmbG93UGF0aGAgYW5kIGNvbXB1dGUgYGRlcHRoYC5cbiAqXG4gKiBTdWJmbG93cyBuZXN0IFVOREVSIHRoZSBzeW50aGV0aWMgcm9vdCBpbiBgc3ViZmxvd1BhdGhgIHNvIHRoZSB0cmVlIGlzXG4gKiBjb21wbGV0ZTogYSB0b3AtbGV2ZWwgc3ViZmxvdyBoYXMgcGF0aCBgWydfX3Jvb3RfXycsICdzZi14J11gIGFuZCBkZXB0aCAxLlxuICovXG5mdW5jdGlvbiBidWlsZFN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCwgcGhhc2U6IEluT3V0UGhhc2UpOiBJbk91dEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3ViZmxvd0lkID0gZXZlbnQuc3ViZmxvd0lkO1xuICBpZiAoIXN1YmZsb3dJZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICBjb25zdCBzZWdtZW50cyA9IHN1YmZsb3dJZC5zcGxpdCgnLycpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcbiAgY29uc3Qgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JPT1RfU1VCRkxPV19JRCwgLi4uc2VnbWVudHNdO1xuICBjb25zdCBkZXB0aCA9IHN1YmZsb3dQYXRoLmxlbmd0aCAtIDE7XG4gIGNvbnN0IGxvY2FsU3ViZmxvd0lkID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gPz8gc3ViZmxvd0lkO1xuICBjb25zdCBwYXlsb2FkID0gcGhhc2UgPT09ICdlbnRyeScgPyBldmVudC5tYXBwZWRJbnB1dCA6IGV2ZW50Lm91dHB1dFN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgcnVudGltZVN0YWdlSWQsXG4gICAgc3ViZmxvd0lkLFxuICAgIGxvY2FsU3ViZmxvd0lkLFxuICAgIHN1YmZsb3dOYW1lOiBldmVudC5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICBzdWJmbG93UGF0aCxcbiAgICBkZXB0aCxcbiAgICBwaGFzZSxcbiAgICBwYXlsb2FkLFxuICAgIGlzUm9vdDogZmFsc2UsXG4gIH07XG59XG4iXX0=
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZERztBQUdILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1uRCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUUxQyxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDO0FBbURsRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFVBQWdDLEVBQUU7SUFDOUQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2YsRUFBRSxDQUFTO0lBQ3BCLHlFQUF5RTtJQUN4RCxLQUFLLEdBQUcsSUFBSSxhQUFhLEVBQWMsQ0FBQztJQUV6RCxZQUFZLFVBQWdDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFLFVBQVUsQ0FBQyxLQUFtQjtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRLENBQUMsS0FBbUI7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0s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KiBJbk91dFJlY29yZGVyIOKAlCBjYXB0dXJlcyBldmVyeSBjaGFydCdzIGlucHV0L291dHB1dCBhcyBlbnRyeS9leGl0IHBhaXJzLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgRXZlcnkgY2hhcnQgaW4gZm9vdHByaW50anMgaGFzIHR3byBuYXR1cmFsIGRhdGEgYm91bmRhcmllczpcbiAqICAgICAtIHRoZSAqKmlucHV0KiogdGhhdCBmbG93ZWQgaW4gKHRvcC1sZXZlbDogYHJ1bih7aW5wdXR9KWA7XG4gKiAgICAgICBzdWJmbG93OiBgaW5wdXRNYXBwZXJgIHJlc3VsdClcbiAqICAgICAtIHRoZSAqKm91dHB1dCoqIHRoYXQgZmxvd2VkIG91dCAodG9wLWxldmVsOiBjaGFydCByZXR1cm4gdmFsdWU7XG4gKiAgICAgICBzdWJmbG93OiBzaGFyZWQgc3RhdGUgYXQgZXhpdCAvIGBvdXRwdXRNYXBwZXJgIHJlc3VsdClcbiAqXG4gKiAgIFRvZ2V0aGVyIHdpdGggYFRvcG9sb2d5UmVjb3JkZXJgIChjb21wb3NpdGlvbiBzaGFwZSkgdGhpcyBpcyB0aGVcbiAqICAgdW5pdmVyc2FsIFwic3RlcFwiIHByaW1pdGl2ZSB0aGF0IGRvd25zdHJlYW0gbGF5ZXJzIHByb2plY3Qg4oCUIGEgTGVuc1xuICogICBTdGVwR3JhcGgsIGEgVHJhY2UgdmlldywgY3VzdG9tIGRhc2hib2FyZHMuIEFsbCBiaW5kIGJ5IGBydW50aW1lU3RhZ2VJZGAuXG4gKlxuICogICBUaGUgcm9vdCBjaGFydCBpcyB0cmVhdGVkIGlkZW50aWNhbGx5IHRvIGFueSBzdWJmbG93OiBhbiBgZW50cnlgXG4gKiAgIGJvdW5kYXJ5IG9uIGBvblJ1blN0YXJ0YCBhbmQgYW4gYGV4aXRgIGJvdW5kYXJ5IG9uIGBvblJ1bkVuZGAsIHdpdGhcbiAqICAgYHN1YmZsb3dJZDogJ19fcm9vdF9fJ2AuIFNvIGNvbnN1bWVycyBidWlsZGluZyBcImV2ZXJ5IHN0ZXAgaGFzIGFuXG4gKiAgIGluL291dCBhcnJvd1wiIHZpZXdzIGNhbiBjbG9zZSB0aGUgY2hhaW4gYXQgdGhlIHRvcCBsZXZlbCDigJQgbm9cbiAqICAgc3BlY2lhbC1jYXNlIHJlbmRlcmluZyByZXF1aXJlZC5cbiAqXG4gKiBUd28gYm91bmRhcnkgcGhhc2VzIHBlciBjaGFydCBleGVjdXRpb246XG4gKiAgIDEuIGBwaGFzZTogJ2VudHJ5J2Ag4oCUIHBheWxvYWQgPSB0aGUgaW5wdXQgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IElOXG4gKiAgIDIuIGBwaGFzZTogJ2V4aXQnYCAg4oCUIHBheWxvYWQgPSB0aGUgb3V0cHV0IGNyb3NzaW5nIHRoZSBib3VuZGFyeSBPVVRcbiAqXG4gKiAgIExvb3BzIHJlLWVudGVyaW5nIHRoZSBzYW1lIHN1YmZsb3cgZ2V0IGRpc3RpbmN0IGBydW50aW1lU3RhZ2VJZGBzXG4gKiAgIGF1dG9tYXRpY2FsbHkgKHBhcmVudCBzdGFnZSdzIGV4ZWN1dGlvbkluZGV4IGluY3JlbWVudHMgcGVyIGl0ZXJhdGlvbikuXG4gKlxuICogUGF1c2Ugc2VtYW50aWNzOlxuICogICBXaGVuIGEgc3RhZ2UgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBlbmdpbmUgcmUtdGhyb3dzIHRoZSBwYXVzZVxuICogICBzaWduYWwgd2l0aG91dCBmaXJpbmcgYG9uU3ViZmxvd0V4aXRgIChvciBgb25SdW5FbmRgKS4gVGhlIHN1YmZsb3dcbiAqICAgaGFzIGFuIGBlbnRyeWAgd2l0aCBubyBtYXRjaGluZyBgZXhpdGAgdW50aWwgdGhlIHJ1biByZXN1bWVzIGFuZFxuICogICBleGl0cyBjbGVhbmx5LiBDb25zdW1lcnMgc2hvdWxkIGhhbmRsZSBlbnRyeS13aXRob3V0LWV4aXQgZ3JhY2VmdWxseVxuICogICAoaXQgbWVhbnMgXCJpbiBwcm9ncmVzc1wiIG9yIFwicGF1c2VkXCIpLiBUaGUgYGdldEJvdW5kYXJ5KClgIGhlbHBlclxuICogICByZXR1cm5zIGB7IGVudHJ5LCBleGl0OiB1bmRlZmluZWQgfWAgaW4gdGhhdCBjYXNlLlxuICpcbiAqIFJlZGFjdGlvbjpcbiAqICAgUGF5bG9hZCByZWRhY3Rpb24gaXMgdGhlIGVuZ2luZSdzIHJlc3BvbnNpYmlsaXR5IChgUmVkYWN0aW9uUG9saWN5YCkuXG4gKiAgIEJ5IHRoZSB0aW1lIHBheWxvYWRzIHJlYWNoIHRoaXMgcmVjb3JkZXIgdmlhIGBGbG93U3ViZmxvd0V2ZW50YCBvclxuICogICBgRmxvd1J1bkV2ZW50YCwgcmVkYWN0YWJsZSB2YWx1ZXMgYXJlIGFscmVhZHkgc2NydWJiZWQuIFRoZSByZWNvcmRlclxuICogICBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QpIHJlLXJlZGFjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgaW5PdXRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBpbk91dCA9IGluT3V0UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoaW5PdXQpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogaW5PdXQuZ2V0U3RlcHMoKTsgICAgICAgICAgICAgICAgICAgIC8vIGVudHJ5IGJvdW5kYXJpZXMg4oCUIHRpbWVsaW5lIHByb2plY3Rpb25cbiAqIGluT3V0LmdldEJvdW5kYXJ5KHJ1bnRpbWVTdGFnZUlkKTsgICAvLyB7IGVudHJ5LCBleGl0IH0gcGFpciBmb3Igb25lIGV4ZWN1dGlvblxuICogaW5PdXQuZ2V0Qm91bmRhcmllcygpOyAgICAgICAgICAgICAgIC8vIGZsYXQgbGlzdCAoZW50cnkrZXhpdCBpbnRlcmxlYXZlZClcbiAqIGluT3V0LmdldFJvb3RCb3VuZGFyeSgpOyAgICAgICAgICAgICAvLyB7IGVudHJ5LCBleGl0IH0gZm9yIHRoZSB0b3AtbGV2ZWwgcnVuXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBGaWx0ZXJpbmcgYnkgc3ViZmxvdyBwYXRoXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhZ2VudFN0ZXBzID0gaW5PdXRcbiAqICAgLmdldFN0ZXBzKClcbiAqICAgLmZpbHRlcigoYikgPT4gYi5zdWJmbG93UGF0aFsxXSA9PT0gJ3NmLWFnZW50Jyk7ICAvLyBwYXRoWzBdIGlzIHRoZSByb290XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciwgRmxvd1J1bkV2ZW50LCBGbG93U3ViZmxvd0V2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi9TZXF1ZW5jZVN0b3JlLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBJbk91dFBoYXNlID0gJ2VudHJ5JyB8ICdleGl0JztcblxuLyoqIFN5bnRoZXRpYyBpZCBmb3IgdGhlIHRvcC1sZXZlbCBydW4ncyBib3VuZGFyeSBwYWlyLiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfU1VCRkxPV19JRCA9ICdfX3Jvb3RfXyc7XG5cbi8qKiBTeW50aGV0aWMgcnVudGltZVN0YWdlSWQgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuIGJvdW5kYXJ5IHBhaXIuICovXG5leHBvcnQgY29uc3QgUk9PVF9SVU5USU1FX1NUQUdFX0lEID0gJ19fcm9vdF9fIzAnO1xuXG4vKipcbiAqIE9uZSBoYWxmIG9mIGEgY2hhcnQgZXhlY3V0aW9uIGJvdW5kYXJ5LiBFbnRyeS9leGl0IHBhaXJzIHNoYXJlIGBydW50aW1lU3RhZ2VJZGAuXG4gKlxuICogTmFtaW5nIGZvbGxvd3MgdGhlIGVuZ2luZTogYHN1YmZsb3dJZGAgaXMgdGhlIHBhdGgtcHJlZml4ZWQgaWRlbnRpZmllciB0aGVcbiAqIGVuZ2luZSBlbWl0cyAoZS5nLiBgJ3NmLW91dGVyL3NmLWlubmVyJ2AgZm9yIG5lc3RlZCBzdWJmbG93cykuIEZvciB0aGVcbiAqIHRvcC1sZXZlbCBydW4sIGl0J3MgdGhlIHN5bnRoZXRpYyBgJ19fcm9vdF9fJ2AuIGBzdWJmbG93UGF0aGAgaXMgdGhlXG4gKiBkZWNvbXBvc2l0aW9uIGludG8gc2VnbWVudHMg4oCUIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYmVjYXVzZSBjb25zdW1lcnNcbiAqIG9mdGVuIHF1ZXJ5IC8gZ3JvdXAgYnkgdGhlIHBhdGggdHJlZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbk91dEVudHJ5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIOKAlCBzYW1lIHZhbHVlIGZvciB0aGUgZW50cnkvZXhpdCBwYWlyIG9mIG9uZSBleGVjdXRpb24uXG4gICAqICBUb3AtbGV2ZWwgcnVuIHVzZXMgdGhlIHN5bnRoZXRpYyBgUk9PVF9SVU5USU1FX1NUQUdFX0lEYC4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFBhdGgtcHJlZml4ZWQgc3ViZmxvdyBpZGVudGlmaWVyIChtYXRjaGVzIHRoZSBlbmdpbmUncyBgRmxvd1N1YmZsb3dFdmVudC5zdWJmbG93SWRgKS5cbiAgICogIFRvcC1sZXZlbCDihpIgYCdfX3Jvb3RfXydgLiBTdWJmbG93IOKGkiBgJ3NmLW91dGVyJ2Agb3IgYCdzZi1vdXRlci9zZi1pbm5lcidgLiAqL1xuICByZWFkb25seSBzdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIExhc3Qgc2VnbWVudCBvZiBgc3ViZmxvd0lkYCDigJQgY29udmVuaWVuY2UgZm9yIGNvbnN1bWVycyB0aGF0IGdyb3VwIGJ5IGxlYWYgbmFtZS5cbiAgICogIFRvcC1sZXZlbCDihpIgYCdfX3Jvb3RfXydgLiAqL1xuICByZWFkb25seSBsb2NhbFN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIChmcm9tIHRoZSBidWlsZGVyOyBgJ1J1bidgIGZvciB0aGUgdG9wLWxldmVsIHJ1bikuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIC8qKiBCdWlsZC10aW1lIGRlc2NyaXB0aW9uIGZyb20gdGhlIHN1YmZsb3cncyByb290IHN0YWdlLlxuICAgKiAgQ2FycmllcyB0YXhvbm9teSBtYXJrZXJzIChlLmcuIGAnQWdlbnQ6IFJlQWN0IGxvb3AnYCkuIFVuZGVmaW5lZCBmb3Igcm9vdC4gKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBEZWNvbXBvc2l0aW9uIG9mIGBzdWJmbG93SWRgIGludG8gc2VnbWVudHMuIFRvcC1sZXZlbCDihpIgYFsnX19yb290X18nXWAuXG4gICAqICBTdWJmbG93cyBsaXZlIFVOREVSIHRoZSByb290OiBhIHRvcC1sZXZlbCBzdWJmbG93IGhhcyBwYXRoIGBbJ19fcm9vdF9fJywgJ3NmLXgnXWAuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIERlcHRoIGluIHRoZSBzdWJmbG93IHRyZWUuIFJvb3Qg4oaSIDAuIEZpcnN0LWxldmVsIHN1YmZsb3cg4oaSIDEuICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIC8qKiBXaGljaCBzaWRlIG9mIHRoZSBib3VuZGFyeSB0aGlzIGVudHJ5IHJlcHJlc2VudHMuICovXG4gIHJlYWRvbmx5IHBoYXNlOiBJbk91dFBoYXNlO1xuICAvKiogRGF0YSBjcm9zc2luZyB0aGUgYm91bmRhcnkuXG4gICAqICAtIGBwaGFzZTogJ2VudHJ5J2Ag4oaSIGBpbnB1dE1hcHBlcmAgcmVzdWx0IChzdWJmbG93KSBvciBgcnVuKHtpbnB1dH0pYCAocm9vdClcbiAgICogIC0gYHBoYXNlOiAnZXhpdCdgICDihpIgc3ViZmxvdyBzaGFyZWQgc3RhdGUgYXQgZXhpdCAoc3ViZmxvdykgb3IgY2hhcnQgcmV0dXJuIHZhbHVlIChyb290KVxuICAgKlxuICAgKiAgVW5kZWZpbmVkIHdoZW4gbm8gbWFwcGVyIC8gbm8gaW5wdXQgd2FzIHByb3ZpZGVkLiAqL1xuICByZWFkb25seSBwYXlsb2FkPzogdW5rbm93bjtcbiAgLyoqIFRydWUgd2hlbiB0aGlzIGVudHJ5IGNhbWUgZnJvbSB0aGUgdG9wLWxldmVsIHJ1biAoYG9uUnVuU3RhcnRgIC8gYG9uUnVuRW5kYClcbiAgICogIHJhdGhlciB0aGFuIGZyb20gYSBzdWJmbG93IChgb25TdWJmbG93RW50cnlgIC8gYG9uU3ViZmxvd0V4aXRgKS5cbiAgICogIExlbnMgdXNlcyB0aGlzIHRvIHJlbmRlciB0aGUgcm9vdCBwYWlyIGFzIGB1c2VyIOKGkiBydW4g4oaSIHVzZXJgIGluc3RlYWQgb2ZcbiAgICogIHRoZSByZWd1bGFyIHN1YmZsb3cgc2hhcGUuICovXG4gIHJlYWRvbmx5IGlzUm9vdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbk91dFJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgaW5vdXQtTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBuYXJyYXRpdmUoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbk91dFJlY29yZGVyKG9wdGlvbnM6IEluT3V0UmVjb3JkZXJPcHRpb25zID0ge30pOiBJbk91dFJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBJbk91dFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBgRmxvd1JlY29yZGVyYCBjaGFydC1ib3VuZGFyeSBldmVudHNcbiAqIChydW4gc3RhcnQvZW5kICsgc3ViZmxvdyBlbnRyeS9leGl0KSBhbmQgcHVzaGVzIGBJbk91dEVudHJ5YCByZWNvcmRzIHRvXG4gKiBpdHMgY29tcG9zZWQgYFNlcXVlbmNlU3RvcmVgIChDb252ZW50aW9uIDEg4oCUIG9uZSBwdXJwb3NlIHBlciByZWNvcmRlcikuXG4gKlxuICogQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlCBmb290cHJpbnRqc1xuICogZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgSW5PdXRSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiAxOk4gb3JkZXJlZCBzdG9yYWdlIHdpdGggcGVyLXN0ZXAgaW5kZXggKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8SW5PdXRFbnRyeT4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk91dFJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gYGlub3V0LSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnB1c2goYnVpbGRSb290RW50cnkoJ2VudHJ5JywgZXZlbnQucGF5bG9hZCkpO1xuICB9XG5cbiAgb25SdW5FbmQoZXZlbnQ6IEZsb3dSdW5FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucHVzaChidWlsZFJvb3RFbnRyeSgnZXhpdCcsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2VudHJ5Jyk7XG4gICAgaWYgKGVudHJ5KSB0aGlzLnN0b3JlLnB1c2goZW50cnkpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQsICdleGl0Jyk7XG4gICAgaWYgKGVudHJ5KSB0aGlzLnN0b3JlLnB1c2goZW50cnkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJ5IEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQWxsIGVudHJpZXMgaW4gZXhlY3V0aW9uIG9yZGVyIChlbnRyeStleGl0IGludGVybGVhdmVkKS4gKi9cbiAgZ2V0Qm91bmRhcmllcygpOiBJbk91dEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEFsbCgpO1xuICB9XG5cbiAgLyoqIEVudHJ5L2V4aXQgcGFpciBmb3Igb25lIGNoYXJ0IGV4ZWN1dGlvbi5cbiAgICogIFJldHVybnMgYHsgZW50cnksIGV4aXQgfWAg4oCUIGBleGl0YCBpcyBgdW5kZWZpbmVkYCBmb3IgaW4tcHJvZ3Jlc3MgLyBwYXVzZWRcbiAgICogIGNoYXJ0cyBvciBpZiBgcnVudGltZVN0YWdlSWRgIGlzIHVua25vd24uICovXG4gIGdldEJvdW5kYXJ5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiB7IGVudHJ5PzogSW5PdXRFbnRyeTsgZXhpdD86IEluT3V0RW50cnkgfSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuc3RvcmUuZ2V0QnlLZXkocnVudGltZVN0YWdlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyeTogZW50cmllcy5maW5kKChlKSA9PiBlLnBoYXNlID09PSAnZW50cnknKSxcbiAgICAgIGV4aXQ6IGVudHJpZXMuZmluZCgoZSkgPT4gZS5waGFzZSA9PT0gJ2V4aXQnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEp1c3QgdGhlIGBlbnRyeWAtcGhhc2UgYm91bmRhcmllcyDigJQgdGhlIFwic3RlcCBsaXN0XCIgcHJvamVjdGlvbiBpblxuICAgKiAgZXhlY3V0aW9uIG9yZGVyLiBUaGlzIGlzIHRoZSBuYXR1cmFsIHRpbWVsaW5lIG9mIGNoYXJ0IGV4ZWN1dGlvbnNcbiAgICogIGZvciBzbGlkZXIgLyBzY3J1YmJpbmcgVUlzLiBUaGUgdG9wLWxldmVsIHJ1bidzIGVudHJ5IGlzIHRoZSBmaXJzdFxuICAgKiAgc3RlcCAoZGVwdGggMCkuICovXG4gIGdldFN0ZXBzKCk6IEluT3V0RW50cnlbXSB7XG4gICAgY29uc3Qgc3RlcHM6IEluT3V0RW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLnN0b3JlLmdldEFsbCgpKSB7XG4gICAgICBpZiAoYi5waGFzZSA9PT0gJ2VudHJ5Jykgc3RlcHMucHVzaChiKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG5cbiAgLyoqIE8oMSkgbG9va3VwOiBhbGwgYm91bmRhcnkgZW50cmllcyAoYm90aCBwaGFzZXMpIGZvciBvbmUgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEVudHJpZXNGb3JTdGVwKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBJbk91dEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBQcmUtYnVpbHQgcGVyLXN0ZXAgcmFuZ2UgaW5kZXgg4oCUIE8oMSkgbG9va3VwcyBmb3IgdGltZS10cmF2ZWwgc2NydWJiaW5nLiAqL1xuICBnZXRFbnRyeVJhbmdlcygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgZmlyc3RJZHg6IG51bWJlcjsgcmVhZG9ubHkgZW5kSWR4OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEVudHJ5UmFuZ2VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcmV2ZWFsOiBib3VuZGFyaWVzIHdob3NlIHJ1bnRpbWVTdGFnZUlkIGlzIGluIHRoZSB2aXNpYmxlIHNldC4gKi9cbiAgZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cmllc1VwVG8odmlzaWJsZUlkcyk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0b3JlZCBib3VuZGFyaWVzIOKAlCBjYWxsZWQgYnkgdGhlIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhlIHJvb3QgcnVuJ3MgZW50cnkvZXhpdCBwYWlyLCBpZiB0aGUgcnVuIGhhcyBzdGFydGVkLlxuICAgKiAgQ29udmVuaWVuY2UgZm9yIGNvbnN1bWVycyB0aGF0IHdhbnQgdG8gYnJhY2tldCB0aGUgdGltZWxpbmUgYnkgdGhlXG4gICAqICBvdXRlcm1vc3QgaW4vb3V0LiAqL1xuICBnZXRSb290Qm91bmRhcnkoKTogeyBlbnRyeT86IEluT3V0RW50cnk7IGV4aXQ/OiBJbk91dEVudHJ5IH0ge1xuICAgIHJldHVybiB0aGlzLmdldEJvdW5kYXJ5KFJPT1RfUlVOVElNRV9TVEFHRV9JRCk7XG4gIH1cblxuICAvKiogU25hcHNob3QgYnVuZGxlIGZvciBpbmNsdXNpb24gaW4gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgLiAqL1xuICB0b1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnSW5PdXQnLFxuICAgICAgZGVzY3JpcHRpb246ICdDaGFydCBpbi9vdXQgc3RyZWFtIOKAlCBlbnRyeS9leGl0IHBhaXJzIGF0IGV2ZXJ5IGNoYXJ0IGJvdW5kYXJ5IChyb290ICsgc3ViZmxvd3MpJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldEJvdW5kYXJpZXMoKSxcbiAgICB9O1xuICB9XG59XG5cbi8vIOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzeW50aGV0aWMgcm9vdCBlbnRyeS9leGl0LiBEZXB0aCBpcyBgMGAgYW5kIHRoZSBwYXRoIGlzXG4gKiBgW1JPT1RfU1VCRkxPV19JRF1gIHNvIGNvbnN1bWVycyBncm91cGluZyBieSBwYXRoIHNlZSB0aGUgcm9vdCBhcyBhXG4gKiByZWd1bGFyIHRvcC1sZXZlbCBjb250YWluZXIuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEVudHJ5KHBoYXNlOiBJbk91dFBoYXNlLCBwYXlsb2FkOiB1bmtub3duKTogSW5PdXRFbnRyeSB7XG4gIHJldHVybiB7XG4gICAgcnVudGltZVN0YWdlSWQ6IFJPT1RfUlVOVElNRV9TVEFHRV9JRCxcbiAgICBzdWJmbG93SWQ6IFJPT1RfU1VCRkxPV19JRCxcbiAgICBsb2NhbFN1YmZsb3dJZDogUk9PVF9TVUJGTE9XX0lELFxuICAgIHN1YmZsb3dOYW1lOiAnUnVuJyxcbiAgICBzdWJmbG93UGF0aDogW1JPT1RfU1VCRkxPV19JRF0sXG4gICAgZGVwdGg6IDAsXG4gICAgcGhhc2UsXG4gICAgcGF5bG9hZCxcbiAgICBpc1Jvb3Q6IHRydWUsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBzdWJmbG93IGBJbk91dEVudHJ5YCBmcm9tIGEgYEZsb3dTdWJmbG93RXZlbnRgLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgZXZlbnQgbGFja3MgYSBgc3ViZmxvd0lkYCAoYW5vbnltb3VzIC9cbiAqIG1hbGZvcm1lZCBzdWJmbG93IGV2ZW50cyDigJQgc2FtZSBkZWZlbnNpdmUgcG9saWN5IGFzIGBUb3BvbG9neVJlY29yZGVyYCkuXG4gKlxuICogUGF0aCBkZXJpdmF0aW9uOiB0aGUgZW5naW5lIGVtaXRzIGBzdWJmbG93SWRgIGFscmVhZHkgcHJlZml4ZWQgd2l0aCB0aGVcbiAqIGZ1bGwgcGF0aCBvZiBwYXJlbnQgc3ViZmxvd3MgKGUuZy4gYCdzZi1vdXRlci9zZi1pbm5lcidgKS4gV2UgZGVjb21wb3NlXG4gKiB0aGF0IGludG8gc2VnbWVudHMgdG8gcG9wdWxhdGUgYHN1YmZsb3dQYXRoYCBhbmQgY29tcHV0ZSBgZGVwdGhgLlxuICpcbiAqIFN1YmZsb3dzIG5lc3QgVU5ERVIgdGhlIHN5bnRoZXRpYyByb290IGluIGBzdWJmbG93UGF0aGAgc28gdGhlIHRyZWUgaXNcbiAqIGNvbXBsZXRlOiBhIHRvcC1sZXZlbCBzdWJmbG93IGhhcyBwYXRoIGBbJ19fcm9vdF9fJywgJ3NmLXgnXWAgYW5kIGRlcHRoIDEuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50LCBwaGFzZTogSW5PdXRQaGFzZSk6IEluT3V0RW50cnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdWJmbG93SWQgPSBldmVudC5zdWJmbG93SWQ7XG4gIGlmICghc3ViZmxvd0lkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3ViZmxvd0lkLnNwbGl0KCcvJykuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xuICBjb25zdCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10gPSBbUk9PVF9TVUJGTE9XX0lELCAuLi5zZWdtZW50c107XG4gIGNvbnN0IGRlcHRoID0gc3ViZmxvd1BhdGgubGVuZ3RoIC0gMTtcbiAgY29uc3QgbG9jYWxTdWJmbG93SWQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA/PyBzdWJmbG93SWQ7XG4gIGNvbnN0IHBheWxvYWQgPSBwaGFzZSA9PT0gJ2VudHJ5JyA/IGV2ZW50Lm1hcHBlZElucHV0IDogZXZlbnQub3V0cHV0U3RhdGU7XG5cbiAgcmV0dXJuIHtcbiAgICBydW50aW1lU3RhZ2VJZCxcbiAgICBzdWJmbG93SWQsXG4gICAgbG9jYWxTdWJmbG93SWQsXG4gICAgc3ViZmxvd05hbWU6IGV2ZW50Lm5hbWUsXG4gICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgIHN1YmZsb3dQYXRoLFxuICAgIGRlcHRoLFxuICAgIHBoYXNlLFxuICAgIHBheWxvYWQsXG4gICAgaXNSb290OiBmYWxzZSxcbiAgfTtcbn1cbiJdfQ==
@@ -4,7 +4,8 @@
4
4
  * Collects quality scores during traversal (accumulate pattern).
5
5
  * After execution, use qualityTrace() to backtrack from any low-scoring step.
6
6
  *
7
- * Extends KeyedRecorder<QualityEntry> for O(1) lookup and standard operations:
7
+ * Composes a `KeyedStore<QualityEntry>` for O(1) lookup and standard operations
8
+ * (Convention 1 — one purpose per recorder):
8
9
  * - **Translate**: `getByKey('call-llm#5')` — quality at this step
9
10
  * - **Accumulate**: progressive quality up to slider position
10
11
  * - **Aggregate**: overall pipeline quality score
@@ -29,11 +30,13 @@
29
30
  * quality.getLowest(); // { runtimeStageId: 'call-llm#5', entry: { score: 0.7, ... } }
30
31
  * ```
31
32
  */
32
- import { KeyedRecorder } from './KeyedRecorder.js';
33
- export class QualityRecorder extends KeyedRecorder {
33
+ import { KeyedStore } from './KeyedStore.js';
34
+ export class QualityRecorder {
34
35
  static _counter = 0;
35
36
  id;
36
37
  preferredOperation;
38
+ /** 1:1 per-step storage (Convention 1 — composed, not inherited). */
39
+ store = new KeyedStore();
37
40
  scoringFn;
38
41
  // Per-stage buffers (reset on each stageStart)
39
42
  currentRuntimeStageId = '';
@@ -42,7 +45,6 @@ export class QualityRecorder extends KeyedRecorder {
42
45
  currentKeysRead = [];
43
46
  currentKeysWritten = [];
44
47
  constructor(scoringFn, options) {
45
- super();
46
48
  this.scoringFn = scoringFn;
47
49
  this.id = options?.id ?? `quality-${++QualityRecorder._counter}`;
48
50
  this.preferredOperation = options?.preferredOperation ?? 'accumulate';
@@ -69,7 +71,7 @@ export class QualityRecorder extends KeyedRecorder {
69
71
  keysWritten: this.currentKeysWritten,
70
72
  duration: event.duration,
71
73
  });
72
- this.store(this.currentRuntimeStageId, {
74
+ this.store.set(this.currentRuntimeStageId, {
73
75
  stageName: this.currentStageName,
74
76
  stageId: this.currentStageId,
75
77
  score: Math.max(0, Math.min(1, score)),
@@ -78,17 +80,42 @@ export class QualityRecorder extends KeyedRecorder {
78
80
  keysWritten: [...this.currentKeysWritten],
79
81
  });
80
82
  }
83
+ // ── Per-step query API (delegates to the composed store) ───────────────
84
+ /** Translate: quality entry for a specific runtimeStageId. */
85
+ getByKey(runtimeStageId) {
86
+ return this.store.get(runtimeStageId);
87
+ }
88
+ /** All per-step quality entries as a read-only Map (insertion-ordered). */
89
+ getMap() {
90
+ return this.store.getMap();
91
+ }
92
+ /** All per-step quality entries (insertion-ordered). */
93
+ values() {
94
+ return this.store.values();
95
+ }
96
+ /** Number of scored steps. */
97
+ get size() {
98
+ return this.store.size;
99
+ }
100
+ /** Aggregate: reduce ALL scored steps to a single value. */
101
+ aggregate(fn, initial) {
102
+ return this.store.aggregate(fn, initial);
103
+ }
104
+ /** Accumulate: reduce scored steps up to a slider position. */
105
+ accumulate(fn, initial, keys) {
106
+ return this.store.accumulate(fn, initial, keys);
107
+ }
81
108
  /** Overall quality score — average of all step scores. */
82
109
  getOverallScore() {
83
- if (this.size === 0)
110
+ if (this.store.size === 0)
84
111
  return 1.0;
85
- const total = this.aggregate((sum, e) => sum + e.score, 0);
86
- return total / this.size;
112
+ const total = this.store.aggregate((sum, e) => sum + e.score, 0);
113
+ return total / this.store.size;
87
114
  }
88
115
  /** Find the lowest-scoring step. */
89
116
  getLowest() {
90
117
  let lowest;
91
- for (const [key, entry] of this.getMap()) {
118
+ for (const [key, entry] of this.store.getMap()) {
92
119
  if (!lowest || entry.score < lowest.entry.score) {
93
120
  lowest = { runtimeStageId: key, entry };
94
121
  }
@@ -98,7 +125,7 @@ export class QualityRecorder extends KeyedRecorder {
98
125
  /** Progressive quality score up to a slider position. */
99
126
  getScoreUpTo(visibleKeys) {
100
127
  let count = 0;
101
- const total = this.accumulate((sum, e) => {
128
+ const total = this.store.accumulate((sum, e) => {
102
129
  count++;
103
130
  return sum + e.score;
104
131
  }, 0, visibleKeys);
@@ -106,7 +133,7 @@ export class QualityRecorder extends KeyedRecorder {
106
133
  }
107
134
  toSnapshot() {
108
135
  const steps = {};
109
- for (const [key, value] of this.getMap()) {
136
+ for (const [key, value] of this.store.getMap()) {
110
137
  steps[key] = value;
111
138
  }
112
139
  return {
@@ -122,7 +149,7 @@ export class QualityRecorder extends KeyedRecorder {
122
149
  };
123
150
  }
124
151
  clear() {
125
- super.clear();
152
+ this.store.clear();
126
153
  this.currentRuntimeStageId = '';
127
154
  this.currentStageId = '';
128
155
  this.currentStageName = '';
@@ -130,4 +157,4 @@ export class QualityRecorder extends KeyedRecorder {
130
157
  this.currentKeysWritten = [];
131
158
  }
132
159
  }
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUdILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTJDbkQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBMkI7SUFDdEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFbkIsRUFBRSxDQUFTO0lBQ1gsa0JBQWtCLENBQW9CO0lBQzlCLFNBQVMsQ0FBbUI7SUFFN0MsK0NBQStDO0lBQ3ZDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztJQUMzQixjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN0QixlQUFlLEdBQWEsRUFBRSxDQUFDO0lBQy9CLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUUxQyxZQUFZLFNBQTJCLEVBQUUsT0FBZ0M7UUFDdkUsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxFQUFFLGtCQUFrQixJQUFJLFlBQVksQ0FBQztJQUN4RSxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWlCO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJ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O0lBQzNDLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztRQUMxQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUFFLDZEQUE2RDtZQUMxRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLElBQUksRUFBRTtnQkFDSixZQUFZLEVBQUUsT0FBTztnQkFDckIsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsY0FBYztnQkFDNUMsS0FBSzthQUNOO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFUSxLQUFLO1FBQ1osS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVhbGl0eVJlY29yZGVyIOKAlCBwZXItc3RlcCBxdWFsaXR5IHNjb3Jpbmcga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQ29sbGVjdHMgcXVhbGl0eSBzY29yZXMgZHVyaW5nIHRyYXZlcnNhbCAoYWNjdW11bGF0ZSBwYXR0ZXJuKS5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgdXNlIHF1YWxpdHlUcmFjZSgpIHRvIGJhY2t0cmFjayBmcm9tIGFueSBsb3ctc2NvcmluZyBzdGVwLlxuICpcbiAqIEV4dGVuZHMgS2V5ZWRSZWNvcmRlcjxRdWFsaXR5RW50cnk+IGZvciBPKDEpIGxvb2t1cCBhbmQgc3RhbmRhcmQgb3BlcmF0aW9uczpcbiAqICAgLSAqKlRyYW5zbGF0ZSoqOiBgZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKWAg4oCUIHF1YWxpdHkgYXQgdGhpcyBzdGVwXG4gKiAgIC0gKipBY2N1bXVsYXRlKio6IHByb2dyZXNzaXZlIHF1YWxpdHkgdXAgdG8gc2xpZGVyIHBvc2l0aW9uXG4gKiAgIC0gKipBZ2dyZWdhdGUqKjogb3ZlcmFsbCBwaXBlbGluZSBxdWFsaXR5IHNjb3JlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1YWxpdHkgPSBuZXcgUXVhbGl0eVJlY29yZGVyKChydW50aW1lU3RhZ2VJZCwgY29udGV4dCkgPT4ge1xuICogICAvLyBDdXN0b20gc2NvcmluZyBmdW5jdGlvbiDigJQgcmV0dXJuIHsgc2NvcmU6IDAuMOKAkzEuMCwgZmFjdG9ycz8gfVxuICogICBpZiAoY29udGV4dC5zdGFnZU5hbWUuaW5jbHVkZXMoJ2xsbScpKSByZXR1cm4geyBzY29yZTogMC43LCBmYWN0b3JzOiBbJ2xsbSBzdGFnZSddIH07XG4gKiAgIHJldHVybiB7IHNjb3JlOiAxLjAgfTtcbiAqIH0pO1xuICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihxdWFsaXR5KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIC8vIFBlci1zdGVwIHNjb3JlXG4gKiBxdWFsaXR5LmdldEJ5S2V5KCdjYWxsLWxsbSM1Jyk7ICAvLyB7IHNjb3JlOiAwLjcsIHN0YWdlTmFtZTogJ0NhbGxMTE0nLCBmYWN0b3JzOiBbLi4uXSB9XG4gKlxuICogLy8gT3ZlcmFsbCBxdWFsaXR5XG4gKiBxdWFsaXR5LmdldE92ZXJhbGxTY29yZSgpOyAgLy8gMC44NVxuICpcbiAqIC8vIExvd2VzdC1zY29yaW5nIHN0ZXBcbiAqIHF1YWxpdHkuZ2V0TG93ZXN0KCk7ICAvLyB7IHJ1bnRpbWVTdGFnZUlkOiAnY2FsbC1sbG0jNScsIGVudHJ5OiB7IHNjb3JlOiAwLjcsIC4uLiB9IH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBTY29wZVJlY29yZGVyLCBTdGFnZUV2ZW50LCBXcml0ZUV2ZW50IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgS2V5ZWRSZWNvcmRlciB9IGZyb20gJy4vS2V5ZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9SZWNvcmRlck9wZXJhdGlvbi5qcyc7XG5cbi8qKiBQZXItc3RlcCBxdWFsaXR5IGRhdGEgc3RvcmVkIGJ5IFF1YWxpdHlSZWNvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eUVudHJ5IHtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFF1YWxpdHkgc2NvcmUgZm9yIHRoaXMgc3RlcCAoMC4wID0gd29yc3QsIDEuMCA9IGJlc3QpLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICAvKiogV2hhdCBjb250cmlidXRlZCB0byB0aGlzIHNjb3JlLiAqL1xuICBmYWN0b3JzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgcmVhZCBkdXJpbmcgdGhpcyBzdGVwIChmb3IgYmFja3RyYWNraW5nKS4gKi9cbiAga2V5c1JlYWQ6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3cml0dGVuIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2NvcmluZyBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHN0YWdlLlxuICogUmVjZWl2ZXMgdGhlIHJ1bnRpbWVTdGFnZUlkLCBzdGFnZSBldmVudCwgYW5kIGEgc3VtbWFyeSBvZiByZWFkcy93cml0ZXMuXG4gKiBSZXR1cm4gYSBzY29yZSAoMC4w4oCTMS4wKSBhbmQgb3B0aW9uYWwgZmFjdG9ycyBleHBsYWluaW5nIHRoZSBzY29yZS5cbiAqL1xuZXhwb3J0IHR5cGUgUXVhbGl0eVNjb3JpbmdGbiA9IChcbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZyxcbiAgY29udGV4dDoge1xuICAgIHN0YWdlTmFtZTogc3RyaW5nO1xuICAgIHN0YWdlSWQ6IHN0cmluZztcbiAgICBrZXlzUmVhZDogc3RyaW5nW107XG4gICAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICB9LFxuKSA9PiB7IHNjb3JlOiBudW1iZXI7IGZhY3RvcnM/OiBzdHJpbmdbXSB9O1xuXG4vKiogT3B0aW9ucyBmb3IgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgSUQuIERlZmF1bHRzIHRvIGF1dG8taW5jcmVtZW50LiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCBVSSBvcGVyYXRpb24uIERlZmF1bHRzIHRvICdhY2N1bXVsYXRlJyAocHJvZ3Jlc3NpdmUgcXVhbGl0eSkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86IFJlY29yZGVyT3BlcmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUXVhbGl0eVJlY29yZGVyIGV4dGVuZHMgS2V5ZWRSZWNvcmRlcjxRdWFsaXR5RW50cnk+IGltcGxlbWVudHMgU2NvcGVSZWNvcmRlciB7XG4gIHByaXZhdGUgc3RhdGljIF9jb3VudGVyID0gMDtcblxuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBwcmVmZXJyZWRPcGVyYXRpb246IFJlY29yZGVyT3BlcmF0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjb3JpbmdGbjogUXVhbGl0eVNjb3JpbmdGbjtcblxuICAvLyBQZXItc3RhZ2UgYnVmZmVycyAocmVzZXQgb24gZWFjaCBzdGFnZVN0YXJ0KVxuICBwcml2YXRlIGN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRTdGFnZUlkID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFN0YWdlTmFtZSA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRLZXlzUmVhZDogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBjdXJyZW50S2V5c1dyaXR0ZW46IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcmluZ0ZuOiBRdWFsaXR5U2NvcmluZ0ZuLCBvcHRpb25zPzogUXVhbGl0eVJlY29yZGVyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zY29yaW5nRm4gPSBzY29yaW5nRm47XG4gICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkID8/IGBxdWFsaXR5LSR7KytRdWFsaXR5UmVjb3JkZXIuX2NvdW50ZXJ9YDtcbiAgICB0aGlzLnByZWZlcnJlZE9wZXJhdGlvbiA9IG9wdGlvbnM/LnByZWZlcnJlZE9wZXJhdGlvbiA/PyAnYWNjdW11bGF0ZSc7XG4gIH1cblxuICBvblN0YWdlU3RhcnQoZXZlbnQ6IFN0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9IGV2ZW50LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlSWQgPSBldmVudC5zdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlTmFtZSA9IGV2ZW50LnN0YWdlTmFtZTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzUmVhZCA9IFtdO1xuICAgIHRoaXMuY3VycmVudEtleXNXcml0dGVuID0gW107XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkpIHRoaXMuY3VycmVudEtleXNSZWFkLnB1c2goZXZlbnQua2V5KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbi5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvblN0YWdlRW5kKGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29yZSwgZmFjdG9ycyB9ID0gdGhpcy5zY29yaW5nRm4odGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5jdXJyZW50U3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5jdXJyZW50U3RhZ2VJZCxcbiAgICAgIGtleXNSZWFkOiB0aGlzLmN1cnJlbnRLZXlzUmVhZCxcbiAgICAgIGtleXNXcml0dGVuOiB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbixcbiAgICAgIGR1cmF0aW9uOiBldmVudC5kdXJhdGlvbixcbiAgICB9KTtcblxuICAgIHRoaXMuc3RvcmUodGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5jdXJyZW50U3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5jdXJyZW50U3RhZ2VJZCxcbiAgICAgIHNjb3JlOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBzY29yZSkpLFxuICAgICAgZmFjdG9yczogZmFjdG9ycyA/PyBbXSxcbiAgICAgIGtleXNSZWFkOiBbLi4udGhpcy5jdXJyZW50S2V5c1JlYWRdLFxuICAgICAga2V5c1dyaXR0ZW46IFsuLi50aGlzLmN1cnJlbnRLZXlzV3JpdHRlbl0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogT3ZlcmFsbCBxdWFsaXR5IHNjb3JlIOKAlCBhdmVyYWdlIG9mIGFsbCBzdGVwIHNjb3Jlcy4gKi9cbiAgZ2V0T3ZlcmFsbFNjb3JlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgcmV0dXJuIDEuMDtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuYWdncmVnYXRlKChzdW0sIGUpID0+IHN1bSArIGUuc2NvcmUsIDApO1xuICAgIHJldHVybiB0b3RhbCAvIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsb3dlc3Qtc2NvcmluZyBzdGVwLiAqL1xuICBnZXRMb3dlc3QoKTogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBlbnRyeTogUXVhbGl0eUVudHJ5IH0gfCB1bmRlZmluZWQge1xuICAgIGxldCBsb3dlc3Q6IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgZW50cnk6IFF1YWxpdHlFbnRyeSB9IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZ2V0TWFwKCkpIHtcbiAgICAgIGlmICghbG93ZXN0IHx8IGVudHJ5LnNjb3JlIDwgbG93ZXN0LmVudHJ5LnNjb3JlKSB7XG4gICAgICAgIGxvd2VzdCA9IHsgcnVudGltZVN0YWdlSWQ6IGtleSwgZW50cnkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvd2VzdDtcbiAgfVxuXG4gIC8qKiBQcm9ncmVzc2l2ZSBxdWFsaXR5IHNjb3JlIHVwIHRvIGEgc2xpZGVyIHBvc2l0aW9uLiAqL1xuICBnZXRTY29yZVVwVG8odmlzaWJsZUtleXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmFjY3VtdWxhdGUoXG4gICAgICAoc3VtLCBlKSA9PiB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiBzdW0gKyBlLnNjb3JlO1xuICAgICAgfSxcbiAgICAgIDAsXG4gICAgICB2aXNpYmxlS2V5cyxcbiAgICApO1xuICAgIHJldHVybiBjb3VudCA9PT0gMCA/IDEuMCA6IHRvdGFsIC8gY291bnQ7XG4gIH1cblxuICB0b1NuYXBzaG90KCkge1xuICAgIGNvbnN0IHN0ZXBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZ2V0TWFwKCkpIHtcbiAgICAgIHN0ZXBzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdRdWFsaXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUXVhbGl0eSBzY29yZXMgcGVyIGV4ZWN1dGlvbiBzdGVwIHdpdGggYmFja3RyYWNraW5nIHN1cHBvcnQnLFxuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiB0aGlzLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbnVtZXJpY0ZpZWxkOiAnc2NvcmUnLFxuICAgICAgICBvdmVyYWxsU2NvcmU6IHRoaXMuZ2V0T3ZlcmFsbFNjb3JlKCksXG4gICAgICAgIGxvd2VzdFN0ZXA6IHRoaXMuZ2V0TG93ZXN0KCk/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzdGVwcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsZWFyKCk6IHZvaWQge1xuICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGFnZUlkID0gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhZ2VOYW1lID0gJyc7XG4gICAgdGhpcy5jdXJyZW50S2V5c1JlYWQgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbiA9IFtdO1xuICB9XG59XG4iXX0=
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFHSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUEyQzdDLE1BQU0sT0FBTyxlQUFlO0lBQ2xCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLEVBQUUsQ0FBUztJQUNYLGtCQUFrQixDQUFvQjtJQUMvQyxxRUFBcUU7SUFDcEQsS0FBSyxHQUFHLElBQUksVUFBVSxFQUFnQixDQUFDO0lBQ3ZDLFNBQVMsQ0FBbUI7SUFFN0MsK0NBQStDO0lBQ3ZDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztJQUMzQixjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN0QixlQUFlLEdBQWEsRUFBRSxDQUFDO0lBQy9CLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUUxQyxZQUFZLFNBQTJCLEVBQUUsT0FBZ0M7UUFDdkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUM7SUFDeEUsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFpQjtRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FB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QUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSw2REFBNkQ7WUFDMUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxJQUFJLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGNBQWM7Z0JBQzVDLEtBQUs7YUFDTjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVhbGl0eVJlY29yZGVyIOKAlCBwZXItc3RlcCBxdWFsaXR5IHNjb3Jpbmcga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuXG4gKlxuICogQ29sbGVjdHMgcXVhbGl0eSBzY29yZXMgZHVyaW5nIHRyYXZlcnNhbCAoYWNjdW11bGF0ZSBwYXR0ZXJuKS5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgdXNlIHF1YWxpdHlUcmFjZSgpIHRvIGJhY2t0cmFjayBmcm9tIGFueSBsb3ctc2NvcmluZyBzdGVwLlxuICpcbiAqIENvbXBvc2VzIGEgYEtleWVkU3RvcmU8UXVhbGl0eUVudHJ5PmAgZm9yIE8oMSkgbG9va3VwIGFuZCBzdGFuZGFyZCBvcGVyYXRpb25zXG4gKiAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpOlxuICogICAtICoqVHJhbnNsYXRlKio6IGBnZXRCeUtleSgnY2FsbC1sbG0jNScpYCDigJQgcXVhbGl0eSBhdCB0aGlzIHN0ZXBcbiAqICAgLSAqKkFjY3VtdWxhdGUqKjogcHJvZ3Jlc3NpdmUgcXVhbGl0eSB1cCB0byBzbGlkZXIgcG9zaXRpb25cbiAqICAgLSAqKkFnZ3JlZ2F0ZSoqOiBvdmVyYWxsIHBpcGVsaW5lIHF1YWxpdHkgc2NvcmVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVhbGl0eSA9IG5ldyBRdWFsaXR5UmVjb3JkZXIoKHJ1bnRpbWVTdGFnZUlkLCBjb250ZXh0KSA9PiB7XG4gKiAgIC8vIEN1c3RvbSBzY29yaW5nIGZ1bmN0aW9uIOKAlCByZXR1cm4geyBzY29yZTogMC4w4oCTMS4wLCBmYWN0b3JzPyB9XG4gKiAgIGlmIChjb250ZXh0LnN0YWdlTmFtZS5pbmNsdWRlcygnbGxtJykpIHJldHVybiB7IHNjb3JlOiAwLjcsIGZhY3RvcnM6IFsnbGxtIHN0YWdlJ10gfTtcbiAqICAgcmV0dXJuIHsgc2NvcmU6IDEuMCB9O1xuICogfSk7XG4gKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHF1YWxpdHkpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gKlxuICogLy8gUGVyLXN0ZXAgc2NvcmVcbiAqIHF1YWxpdHkuZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKTsgIC8vIHsgc2NvcmU6IDAuNywgc3RhZ2VOYW1lOiAnQ2FsbExMTScsIGZhY3RvcnM6IFsuLi5dIH1cbiAqXG4gKiAvLyBPdmVyYWxsIHF1YWxpdHlcbiAqIHF1YWxpdHkuZ2V0T3ZlcmFsbFNjb3JlKCk7ICAvLyAwLjg1XG4gKlxuICogLy8gTG93ZXN0LXNjb3Jpbmcgc3RlcFxuICogcXVhbGl0eS5nZXRMb3dlc3QoKTsgIC8vIHsgcnVudGltZVN0YWdlSWQ6ICdjYWxsLWxsbSM1JywgZW50cnk6IHsgc2NvcmU6IDAuNywgLi4uIH0gfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWFkRXZlbnQsIFNjb3BlUmVjb3JkZXIsIFN0YWdlRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9LZXllZFN0b3JlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL1JlY29yZGVyT3BlcmF0aW9uLmpzJztcblxuLyoqIFBlci1zdGVwIHF1YWxpdHkgZGF0YSBzdG9yZWQgYnkgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RW50cnkge1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogUXVhbGl0eSBzY29yZSBmb3IgdGhpcyBzdGVwICgwLjAgPSB3b3JzdCwgMS4wID0gYmVzdCkuICovXG4gIHNjb3JlOiBudW1iZXI7XG4gIC8qKiBXaGF0IGNvbnRyaWJ1dGVkIHRvIHRoaXMgc2NvcmUuICovXG4gIGZhY3RvcnM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyByZWFkIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzUmVhZDogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdyaXR0ZW4gZHVyaW5nIHRoaXMgc3RlcCAoZm9yIGJhY2t0cmFja2luZykuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTY29yaW5nIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhZ2UuXG4gKiBSZWNlaXZlcyB0aGUgcnVudGltZVN0YWdlSWQsIHN0YWdlIGV2ZW50LCBhbmQgYSBzdW1tYXJ5IG9mIHJlYWRzL3dyaXRlcy5cbiAqIFJldHVybiBhIHNjb3JlICgwLjDigJMxLjApIGFuZCBvcHRpb25hbCBmYWN0b3JzIGV4cGxhaW5pbmcgdGhlIHNjb3JlLlxuICovXG5leHBvcnQgdHlwZSBRdWFsaXR5U2NvcmluZ0ZuID0gKFxuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nLFxuICBjb250ZXh0OiB7XG4gICAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gICAgc3RhZ2VJZDogc3RyaW5nO1xuICAgIGtleXNSZWFkOiBzdHJpbmdbXTtcbiAgICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gICAgZHVyYXRpb24/OiBudW1iZXI7XG4gIH0sXG4pID0+IHsgc2NvcmU6IG51bWJlcjsgZmFjdG9ycz86IHN0cmluZ1tdIH07XG5cbi8qKiBPcHRpb25zIGZvciBRdWFsaXR5UmVjb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1YWxpdHlSZWNvcmRlck9wdGlvbnMge1xuICAvKiogU2NvcGVSZWNvcmRlciBJRC4gRGVmYXVsdHMgdG8gYXV0by1pbmNyZW1lbnQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogUHJlZmVycmVkIFVJIG9wZXJhdGlvbi4gRGVmYXVsdHMgdG8gJ2FjY3VtdWxhdGUnIChwcm9ncmVzc2l2ZSBxdWFsaXR5KS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogUmVjb3JkZXJPcGVyYXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBRdWFsaXR5UmVjb3JkZXIgaW1wbGVtZW50cyBTY29wZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2NvdW50ZXIgPSAwO1xuXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZlcnJlZE9wZXJhdGlvbjogUmVjb3JkZXJPcGVyYXRpb247XG4gIC8qKiAxOjEgcGVyLXN0ZXAgc3RvcmFnZSAoQ29udmVudGlvbiAxIOKAlCBjb21wb3NlZCwgbm90IGluaGVyaXRlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBuZXcgS2V5ZWRTdG9yZTxRdWFsaXR5RW50cnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcmluZ0ZuOiBRdWFsaXR5U2NvcmluZ0ZuO1xuXG4gIC8vIFBlci1zdGFnZSBidWZmZXJzIChyZXNldCBvbiBlYWNoIHN0YWdlU3RhcnQpXG4gIHByaXZhdGUgY3VycmVudFJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFN0YWdlSWQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50U3RhZ2VOYW1lID0gJyc7XG4gIHByaXZhdGUgY3VycmVudEtleXNSZWFkOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRLZXlzV3JpdHRlbjogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29yaW5nRm46IFF1YWxpdHlTY29yaW5nRm4sIG9wdGlvbnM/OiBRdWFsaXR5UmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5zY29yaW5nRm4gPSBzY29yaW5nRm47XG4gICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkID8/IGBxdWFsaXR5LSR7KytRdWFsaXR5UmVjb3JkZXIuX2NvdW50ZXJ9YDtcbiAgICB0aGlzLnByZWZlcnJlZE9wZXJhdGlvbiA9IG9wdGlvbnM/LnByZWZlcnJlZE9wZXJhdGlvbiA/PyAnYWNjdW11bGF0ZSc7XG4gIH1cblxuICBvblN0YWdlU3RhcnQoZXZlbnQ6IFN0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9IGV2ZW50LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlSWQgPSBldmVudC5zdGFnZUlkO1xuICAgIHRoaXMuY3VycmVudFN0YWdlTmFtZSA9IGV2ZW50LnN0YWdlTmFtZTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzUmVhZCA9IFtdO1xuICAgIHRoaXMuY3VycmVudEtleXNXcml0dGVuID0gW107XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkpIHRoaXMuY3VycmVudEtleXNSZWFkLnB1c2goZXZlbnQua2V5KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbi5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvblN0YWdlRW5kKGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29yZSwgZmFjdG9ycyB9ID0gdGhpcy5zY29yaW5nRm4odGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5jdXJyZW50U3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5jdXJyZW50U3RhZ2VJZCxcbiAgICAgIGtleXNSZWFkOiB0aGlzLmN1cnJlbnRLZXlzUmVhZCxcbiAgICAgIGtleXNXcml0dGVuOiB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbixcbiAgICAgIGR1cmF0aW9uOiBldmVudC5kdXJhdGlvbixcbiAgICB9KTtcblxuICAgIHRoaXMuc3RvcmUuc2V0KHRoaXMuY3VycmVudFJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuY3VycmVudFN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuY3VycmVudFN0YWdlSWQsXG4gICAgICBzY29yZTogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2NvcmUpKSxcbiAgICAgIGZhY3RvcnM6IGZhY3RvcnMgPz8gW10sXG4gICAgICBrZXlzUmVhZDogWy4uLnRoaXMuY3VycmVudEtleXNSZWFkXSxcbiAgICAgIGtleXNXcml0dGVuOiBbLi4udGhpcy5jdXJyZW50S2V5c1dyaXR0ZW5dLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlci1zdGVwIHF1ZXJ5IEFQSSAoZGVsZWdhdGVzIHRvIHRoZSBjb21wb3NlZCBzdG9yZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRyYW5zbGF0ZTogcXVhbGl0eSBlbnRyeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0QnlLZXkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFF1YWxpdHlFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBBbGwgcGVyLXN0ZXAgcXVhbGl0eSBlbnRyaWVzIGFzIGEgcmVhZC1vbmx5IE1hcCAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICBnZXRNYXAoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBRdWFsaXR5RW50cnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRNYXAoKTtcbiAgfVxuXG4gIC8qKiBBbGwgcGVyLXN0ZXAgcXVhbGl0eSBlbnRyaWVzIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIHZhbHVlcygpOiBRdWFsaXR5RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUudmFsdWVzKCk7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIHNjb3JlZCBzdGVwcy4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqIEFnZ3JlZ2F0ZTogcmVkdWNlIEFMTCBzY29yZWQgc3RlcHMgdG8gYSBzaW5nbGUgdmFsdWUuICovXG4gIGFnZ3JlZ2F0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFF1YWxpdHlFbnRyeSwga2V5OiBzdHJpbmcpID0+IFIsIGluaXRpYWw6IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5hZ2dyZWdhdGUoZm4sIGluaXRpYWwpO1xuICB9XG5cbiAgLyoqIEFjY3VtdWxhdGU6IHJlZHVjZSBzY29yZWQgc3RlcHMgdXAgdG8gYSBzbGlkZXIgcG9zaXRpb24uICovXG4gIGFjY3VtdWxhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBRdWFsaXR5RW50cnksIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSLCBrZXlzPzogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmFjY3VtdWxhdGUoZm4sIGluaXRpYWwsIGtleXMpO1xuICB9XG5cbiAgLyoqIE92ZXJhbGwgcXVhbGl0eSBzY29yZSDigJQgYXZlcmFnZSBvZiBhbGwgc3RlcCBzY29yZXMuICovXG4gIGdldE92ZXJhbGxTY29yZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnN0b3JlLnNpemUgPT09IDApIHJldHVybiAxLjA7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnN0b3JlLmFnZ3JlZ2F0ZSgoc3VtLCBlKSA9PiBzdW0gKyBlLnNjb3JlLCAwKTtcbiAgICByZXR1cm4gdG90YWwgLyB0aGlzLnN0b3JlLnNpemU7XG4gIH1cblxuICAvKiogRmluZCB0aGUgbG93ZXN0LXNjb3Jpbmcgc3RlcC4gKi9cbiAgZ2V0TG93ZXN0KCk6IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgZW50cnk6IFF1YWxpdHlFbnRyeSB9IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG93ZXN0OiB7IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7IGVudHJ5OiBRdWFsaXR5RW50cnkgfSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLnN0b3JlLmdldE1hcCgpKSB7XG4gICAgICBpZiAoIWxvd2VzdCB8fCBlbnRyeS5zY29yZSA8IGxvd2VzdC5lbnRyeS5zY29yZSkge1xuICAgICAgICBsb3dlc3QgPSB7IHJ1bnRpbWVTdGFnZUlkOiBrZXksIGVudHJ5IH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3dlc3Q7XG4gIH1cblxuICAvKiogUHJvZ3Jlc3NpdmUgcXVhbGl0eSBzY29yZSB1cCB0byBhIHNsaWRlciBwb3NpdGlvbi4gKi9cbiAgZ2V0U2NvcmVVcFRvKHZpc2libGVLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogbnVtYmVyIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5zdG9yZS5hY2N1bXVsYXRlKFxuICAgICAgKHN1bSwgZSkgPT4ge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gc3VtICsgZS5zY29yZTtcbiAgICAgIH0sXG4gICAgICAwLFxuICAgICAgdmlzaWJsZUtleXMsXG4gICAgKTtcbiAgICByZXR1cm4gY291bnQgPT09IDAgPyAxLjAgOiB0b3RhbCAvIGNvdW50O1xuICB9XG5cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBzdGVwczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnN0b3JlLmdldE1hcCgpKSB7XG4gICAgICBzdGVwc1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnUXVhbGl0eScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1F1YWxpdHkgc2NvcmVzIHBlciBleGVjdXRpb24gc3RlcCB3aXRoIGJhY2t0cmFja2luZyBzdXBwb3J0JyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogdGhpcy5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG51bWVyaWNGaWVsZDogJ3Njb3JlJyxcbiAgICAgICAgb3ZlcmFsbFNjb3JlOiB0aGlzLmdldE92ZXJhbGxTY29yZSgpLFxuICAgICAgICBsb3dlc3RTdGVwOiB0aGlzLmdldExvd2VzdCgpPy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGFnZUlkID0gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhZ2VOYW1lID0gJyc7XG4gICAgdGhpcy5jdXJyZW50S2V5c1JlYWQgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbiA9IFtdO1xuICB9XG59XG4iXX0=
@@ -4,9 +4,9 @@
4
4
  * Data is collected during the single DFS traversal. The consumer chooses the
5
5
  * operation at READ time:
6
6
  *
7
- * | Operation | KeyedRecorder method | SequenceRecorder method | Use case |
7
+ * | Operation | KeyedStore method | SequenceStore method | Use case |
8
8
  * |-------------|--------------------------|--------------------------------|-----------------------------|
9
- * | Translate | `getByKey(id)` | `getEntriesForStep(id)` | Per-step detail |
9
+ * | Translate | `get(id)` | `getByKey(id)` | Per-step detail |
10
10
  * | Accumulate | `accumulate(fn, init, k)` | `accumulate(fn, init, k)` | Running total up to slider |
11
11
  * | Aggregate | `aggregate(fn, init)` | `aggregate(fn, init)` | Grand total for dashboards |
12
12
  *
@@ -32,4 +32,4 @@ export const RecorderOperation = {
32
32
  /** Grand total across all steps — dashboard / export summary. */
33
33
  Aggregate: 'aggregate',
34
34
  };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkZXJPcGVyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL1JlY29yZGVyT3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsOERBQThEO0lBQzlELFNBQVMsRUFBRSxXQUFXO0lBQ3RCLDRFQUE0RTtJQUM1RSxVQUFVLEVBQUUsWUFBWTtJQUN4QixpRUFBaUU7SUFDakUsU0FBUyxFQUFFLFdBQVc7Q0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWNvcmRlck9wZXJhdGlvbiDigJQgdGhlIHRocmVlIHN0YW5kYXJkIG9wZXJhdGlvbnMgb24gYXV0by1jb2xsZWN0ZWQgdHJhdmVyc2FsIGRhdGEuXG4gKlxuICogRGF0YSBpcyBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBzaW5nbGUgREZTIHRyYXZlcnNhbC4gVGhlIGNvbnN1bWVyIGNob29zZXMgdGhlXG4gKiBvcGVyYXRpb24gYXQgUkVBRCB0aW1lOlxuICpcbiAqIHwgT3BlcmF0aW9uICAgfCBLZXllZFJlY29yZGVyIG1ldGhvZCAgICAgfCBTZXF1ZW5jZVJlY29yZGVyIG1ldGhvZCAgICAgICAgfCBVc2UgY2FzZSAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IFRyYW5zbGF0ZSAgIHwgYGdldEJ5S2V5KGlkKWAgICAgICAgICAgIHwgYGdldEVudHJpZXNGb3JTdGVwKGlkKWAgICAgICAgIHwgUGVyLXN0ZXAgZGV0YWlsICAgICAgICAgICAgIHxcbiAqIHwgQWNjdW11bGF0ZSAgfCBgYWNjdW11bGF0ZShmbiwgaW5pdCwgaylgIHwgYGFjY3VtdWxhdGUoZm4sIGluaXQsIGspYCAgICAgfCBSdW5uaW5nIHRvdGFsIHVwIHRvIHNsaWRlciAgfFxuICogfCBBZ2dyZWdhdGUgICB8IGBhZ2dyZWdhdGUoZm4sIGluaXQpYCAgICB8IGBhZ2dyZWdhdGUoZm4sIGluaXQpYCAgICAgICAgICB8IEdyYW5kIHRvdGFsIGZvciBkYXNoYm9hcmRzICB8XG4gKlxuICogUmVjb3JkZXJzIGRlY2xhcmUgYSBgcHJlZmVycmVkT3BlcmF0aW9uYCB0byBoaW50IHRoZSBVSSBhYm91dCB3aGljaCBvcGVyYXRpb25cbiAqIHRvIHNob3cgcHJvbWluZW50bHkuIFRoZSBjb25zdW1lciBjYW4gb3ZlcnJpZGUgdmlhIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE1ldHJpY1JlY29yZGVyLCBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiAvLyBVc2UgbmFtZWQgY29uc3RhbnQgKGF1dG9jb21wbGV0ZSlcbiAqIG5ldyBNZXRyaWNSZWNvcmRlcih7IHByZWZlcnJlZE9wZXJhdGlvbjogUmVjb3JkZXJPcGVyYXRpb24uQWdncmVnYXRlIH0pO1xuICpcbiAqIC8vIE9yIGlubGluZSBzdHJpbmcgKHNhbWUgdHlwZSlcbiAqIG5ldyBNZXRyaWNSZWNvcmRlcih7IHByZWZlcnJlZE9wZXJhdGlvbjogJ2FjY3VtdWxhdGUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBSZWNvcmRlck9wZXJhdGlvbiA9IHtcbiAgLyoqIFBlci1zdGVwIGRldGFpbCDigJQgd2hhdCBoYXBwZW5lZCBhdCB0aGlzIGV4ZWN1dGlvbiBzdGVwPyAqL1xuICBUcmFuc2xhdGU6ICd0cmFuc2xhdGUnLFxuICAvKiogUHJvZ3Jlc3NpdmUgcnVubmluZyB0b3RhbCDigJQgdmFsdWUgZ3Jvd3MgYXMgdGhlIHNsaWRlciBzY3J1YnMgZm9yd2FyZC4gKi9cbiAgQWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICAvKiogR3JhbmQgdG90YWwgYWNyb3NzIGFsbCBzdGVwcyDigJQgZGFzaGJvYXJkIC8gZXhwb3J0IHN1bW1hcnkuICovXG4gIEFnZ3JlZ2F0ZTogJ2FnZ3JlZ2F0ZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZWNvcmRlck9wZXJhdGlvbiA9ICh0eXBlb2YgUmVjb3JkZXJPcGVyYXRpb24pW2tleW9mIHR5cGVvZiBSZWNvcmRlck9wZXJhdGlvbl07XG4iXX0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkZXJPcGVyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL1JlY29yZGVyT3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsOERBQThEO0lBQzlELFNBQVMsRUFBRSxXQUFXO0lBQ3RCLDRFQUE0RTtJQUM1RSxVQUFVLEVBQUUsWUFBWTtJQUN4QixpRUFBaUU7SUFDakUsU0FBUyxFQUFFLFdBQVc7Q0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWNvcmRlck9wZXJhdGlvbiDigJQgdGhlIHRocmVlIHN0YW5kYXJkIG9wZXJhdGlvbnMgb24gYXV0by1jb2xsZWN0ZWQgdHJhdmVyc2FsIGRhdGEuXG4gKlxuICogRGF0YSBpcyBjb2xsZWN0ZWQgZHVyaW5nIHRoZSBzaW5nbGUgREZTIHRyYXZlcnNhbC4gVGhlIGNvbnN1bWVyIGNob29zZXMgdGhlXG4gKiBvcGVyYXRpb24gYXQgUkVBRCB0aW1lOlxuICpcbiAqIHwgT3BlcmF0aW9uICAgfCBLZXllZFN0b3JlIG1ldGhvZCAgICAgICAgfCBTZXF1ZW5jZVN0b3JlIG1ldGhvZCAgICAgICAgICAgfCBVc2UgY2FzZSAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IFRyYW5zbGF0ZSAgIHwgYGdldChpZClgICAgICAgICAgICAgICAgIHwgYGdldEJ5S2V5KGlkKWAgICAgICAgICAgICAgICAgIHwgUGVyLXN0ZXAgZGV0YWlsICAgICAgICAgICAgIHxcbiAqIHwgQWNjdW11bGF0ZSAgfCBgYWNjdW11bGF0ZShmbiwgaW5pdCwgaylgIHwgYGFjY3VtdWxhdGUoZm4sIGluaXQsIGspYCAgICAgfCBSdW5uaW5nIHRvdGFsIHVwIHRvIHNsaWRlciAgfFxuICogfCBBZ2dyZWdhdGUgICB8IGBhZ2dyZWdhdGUoZm4sIGluaXQpYCAgICB8IGBhZ2dyZWdhdGUoZm4sIGluaXQpYCAgICAgICAgICB8IEdyYW5kIHRvdGFsIGZvciBkYXNoYm9hcmRzICB8XG4gKlxuICogUmVjb3JkZXJzIGRlY2xhcmUgYSBgcHJlZmVycmVkT3BlcmF0aW9uYCB0byBoaW50IHRoZSBVSSBhYm91dCB3aGljaCBvcGVyYXRpb25cbiAqIHRvIHNob3cgcHJvbWluZW50bHkuIFRoZSBjb25zdW1lciBjYW4gb3ZlcnJpZGUgdmlhIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE1ldHJpY1JlY29yZGVyLCBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiAvLyBVc2UgbmFtZWQgY29uc3RhbnQgKGF1dG9jb21wbGV0ZSlcbiAqIG5ldyBNZXRyaWNSZWNvcmRlcih7IHByZWZlcnJlZE9wZXJhdGlvbjogUmVjb3JkZXJPcGVyYXRpb24uQWdncmVnYXRlIH0pO1xuICpcbiAqIC8vIE9yIGlubGluZSBzdHJpbmcgKHNhbWUgdHlwZSlcbiAqIG5ldyBNZXRyaWNSZWNvcmRlcih7IHByZWZlcnJlZE9wZXJhdGlvbjogJ2FjY3VtdWxhdGUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBSZWNvcmRlck9wZXJhdGlvbiA9IHtcbiAgLyoqIFBlci1zdGVwIGRldGFpbCDigJQgd2hhdCBoYXBwZW5lZCBhdCB0aGlzIGV4ZWN1dGlvbiBzdGVwPyAqL1xuICBUcmFuc2xhdGU6ICd0cmFuc2xhdGUnLFxuICAvKiogUHJvZ3Jlc3NpdmUgcnVubmluZyB0b3RhbCDigJQgdmFsdWUgZ3Jvd3MgYXMgdGhlIHNsaWRlciBzY3J1YnMgZm9yd2FyZC4gKi9cbiAgQWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICAvKiogR3JhbmQgdG90YWwgYWNyb3NzIGFsbCBzdGVwcyDigJQgZGFzaGJvYXJkIC8gZXhwb3J0IHN1bW1hcnkuICovXG4gIEFnZ3JlZ2F0ZTogJ2FnZ3JlZ2F0ZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZWNvcmRlck9wZXJhdGlvbiA9ICh0eXBlb2YgUmVjb3JkZXJPcGVyYXRpb24pW2tleW9mIHR5cGVvZiBSZWNvcmRlck9wZXJhdGlvbl07XG4iXX0=
@@ -4,14 +4,7 @@
4
4
  export { BoundaryStateStore } from './BoundaryStateStore.js';
5
5
  export { KeyedStore } from './KeyedStore.js';
6
6
  export { SequenceStore } from './SequenceStore.js';
7
- // ── Abstract bases (DEPRECATED — slated for removal in 5.0 final) ─────
8
- // Kept during the v5 migration window for downstream consumers (agentfootprint,
9
- // agentfootprint-lens) that still extend them. New code should compose Stores
10
- // instead. See `docs/design/v5-recorder-redesign.md`.
11
- export { BoundaryStateTracker } from './BoundaryStateTracker.js';
12
- export { KeyedRecorder } from './KeyedRecorder.js';
13
- export { SequenceRecorder } from './SequenceRecorder.js';
14
7
  export { hasEmitRecorderMethods, hasFlowRecorderMethods, hasRecorderMethods, isFlowEvent } from './CombinedRecorder.js';
15
8
  export { CompositeRecorder } from './CompositeRecorder.js';
16
9
  export { RecorderOperation } from './RecorderOperation.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlFQUF5RTtBQUN6RSx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDilIDilIAgU3RvcmVzIChjb25jcmV0ZSwgY29tcG9zYWJsZSDigJQgdjUgcHJpbWFyeSBBUEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tcG9zZSB0aGVzZSB2aWEgYG5ldyBTdG9yZTxUPigpYCBhcyBhIGZpZWxkIG9uIHlvdXIgcmVjb3JkZXIgY2xhc3MuXG4vLyBPbmUgcHVycG9zZSBwZXIgcmVjb3JkZXI6IHN0b3JlcyBhcmUgc3RvcmFnZTsgcmVjb3JkZXJzIGFyZSBldmVudCBob29rcy5cbmV4cG9ydCB7IEJvdW5kYXJ5U3RhdGVTdG9yZSB9IGZyb20gJy4vQm91bmRhcnlTdGF0ZVN0b3JlLmpzJztcbmV4cG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL0tleWVkU3RvcmUuanMnO1xuZXhwb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4vU2VxdWVuY2VTdG9yZS5qcyc7XG5cbi8vIOKUgOKUgCBBYnN0cmFjdCBiYXNlcyAoREVQUkVDQVRFRCDigJQgc2xhdGVkIGZvciByZW1vdmFsIGluIDUuMCBmaW5hbCkg4pSA4pSA4pSA4pSA4pSAXG4vLyBLZXB0IGR1cmluZyB0aGUgdjUgbWlncmF0aW9uIHdpbmRvdyBmb3IgZG93bnN0cmVhbSBjb25zdW1lcnMgKGFnZW50Zm9vdHByaW50LFxuLy8gYWdlbnRmb290cHJpbnQtbGVucykgdGhhdCBzdGlsbCBleHRlbmQgdGhlbS4gTmV3IGNvZGUgc2hvdWxkIGNvbXBvc2UgU3RvcmVzXG4vLyBpbnN0ZWFkLiBTZWUgYGRvY3MvZGVzaWduL3Y1LXJlY29yZGVyLXJlZGVzaWduLm1kYC5cbmV4cG9ydCB7IEJvdW5kYXJ5U3RhdGVUcmFja2VyIH0gZnJvbSAnLi9Cb3VuZGFyeVN0YXRlVHJhY2tlci5qcyc7XG5leHBvcnQgeyBLZXllZFJlY29yZGVyIH0gZnJvbSAnLi9LZXllZFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFNlcXVlbmNlUmVjb3JkZXIgfSBmcm9tICcuL1NlcXVlbmNlUmVjb3JkZXIuanMnO1xuXG4vLyDilIDilIAgSW50ZXJmYWNlcyAoZXZlbnQgaG9va3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi9Db21iaW5lZFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IGhhc0VtaXRSZWNvcmRlck1ldGhvZHMsIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMsIGhhc1JlY29yZGVyTWV0aG9kcywgaXNGbG93RXZlbnQgfSBmcm9tICcuL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vQ29tcG9zaXRlUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgRW1pdEV2ZW50LCBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vUmVjb3JkZXJPcGVyYXRpb24uanMnO1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlFQUF5RTtBQUN6RSx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8g4pSA4pSAIFN0b3JlcyAoY29uY3JldGUsIGNvbXBvc2FibGUg4oCUIHY1IHByaW1hcnkgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENvbXBvc2UgdGhlc2UgdmlhIGBuZXcgU3RvcmU8VD4oKWAgYXMgYSBmaWVsZCBvbiB5b3VyIHJlY29yZGVyIGNsYXNzLlxuLy8gT25lIHB1cnBvc2UgcGVyIHJlY29yZGVyOiBzdG9yZXMgYXJlIHN0b3JhZ2U7IHJlY29yZGVycyBhcmUgZXZlbnQgaG9va3MuXG5leHBvcnQgeyBCb3VuZGFyeVN0YXRlU3RvcmUgfSBmcm9tICcuL0JvdW5kYXJ5U3RhdGVTdG9yZS5qcyc7XG5leHBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9LZXllZFN0b3JlLmpzJztcbmV4cG9ydCB7IFNlcXVlbmNlU3RvcmUgfSBmcm9tICcuL1NlcXVlbmNlU3RvcmUuanMnO1xuXG4vLyDilIDilIAgSW50ZXJmYWNlcyAoZXZlbnQgaG9va3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi9Db21iaW5lZFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IGhhc0VtaXRSZWNvcmRlck1ldGhvZHMsIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMsIGhhc1JlY29yZGVyTWV0aG9kcywgaXNGbG93RXZlbnQgfSBmcm9tICcuL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vQ29tcG9zaXRlUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgRW1pdEV2ZW50LCBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vUmVjb3JkZXJPcGVyYXRpb24uanMnO1xuIl19
@@ -88,4 +88,4 @@ export function formatQualityTrace(trace) {
88
88
  }
89
89
  return lines.join('\n');
90
90
  }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eVRyYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9xdWFsaXR5VHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUEyQnZFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUF5QixFQUN6QixlQUE0QyxFQUM1QyxPQUFlLEVBQ2YsUUFBUSxHQUFHLEVBQUU7SUFFYixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUVqSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFtQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDaEQsTUFB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QUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEtBQUssQ0FBQyxJQUFJLENBQ1Isa0NBQWtDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRztZQUN2RSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUN6QyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBxdWFsaXR5VHJhY2UoKSDigJQgUXVhbGl0eSBTdGFjayBUcmFjZSBidWlsdCBvbiBjYXVzYWxDaGFpbigpLlxuICpcbiAqIFRoaW4gbGF5ZXIgb3ZlciBgbWVtb3J5L2JhY2t0cmFjay5jYXVzYWxDaGFpbigpYCB0aGF0IGRlY29yYXRlc1xuICogZWFjaCBjYXVzYWwgbm9kZSB3aXRoIHF1YWxpdHkgc2NvcmVzIGZyb20gYSBRdWFsaXR5UmVjb3JkZXIuXG4gKlxuICogYGBgXG4gKiBRdWFsaXR5IFRyYWNlIChzY29yZTogMC4zIGF0IGNhbGwtbGxtIzUpOlxuICogICBhdCBjYWxsLWxsbSM1ICAgICBzY29yZT0wLjMgIOKGkCBxdWFsaXR5IGRyb3BwZWQgaGVyZVxuICogICBhdCBzeXN0ZW0tcHJvbXB0IzEgc2NvcmU9MC44ICDihpAgc3lzdGVtUHJvbXB0IHdhcyBnb29kXG4gKiAgIGF0IHNlZWQjMCAgICAgICAgICBzY29yZT0xLjAgIOKGkCBpbnB1dCB3YXMgY2xlYW5cbiAqXG4gKiBSb290IGNhdXNlOiBxdWFsaXR5IGRyb3BwZWQgYXQgY2FsbC1sbG0jNSAoMC44IOKGkiAwLjMsIM6UMC41KVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcgfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgS2V5ZWRSZWNvcmRlciB9IGZyb20gJy4vS2V5ZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1YWxpdHlFbnRyeSB9IGZyb20gJy4vUXVhbGl0eVJlY29yZGVyLmpzJztcblxuLyoqIEEgc2luZ2xlIGZyYW1lIGluIHRoZSBxdWFsaXR5IHN0YWNrIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RnJhbWUge1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc2NvcmU6IG51bWJlcjtcbiAgZmFjdG9yczogc3RyaW5nW107XG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgZnVsbCBxdWFsaXR5IHN0YWNrIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5U3RhY2tUcmFjZSB7XG4gIHN0YXJ0SWQ6IHN0cmluZztcbiAgc3RhcnRTY29yZTogbnVtYmVyO1xuICBmcmFtZXM6IFF1YWxpdHlGcmFtZVtdO1xuICByb290Q2F1c2U/OiB7XG4gICAgZnJhbWU6IFF1YWxpdHlGcmFtZTtcbiAgICBwcmV2aW91c0ZyYW1lOiBRdWFsaXR5RnJhbWU7XG4gICAgZHJvcDogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgcXVhbGl0eSBzdGFjayB0cmFjZSBieSBkZWNvcmF0aW5nIGEgY2F1c2FsIGNoYWluIHdpdGggc2NvcmVzLlxuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgICAgICAgIEZyb20gZXhlY3V0b3IuZ2V0U25hcHNob3QoKS5jb21taXRMb2dcbiAqIEBwYXJhbSBxdWFsaXR5UmVjb3JkZXIgIFF1YWxpdHlSZWNvcmRlciBhdHRhY2hlZCBkdXJpbmcgZXhlY3V0aW9uXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgICAgICBydW50aW1lU3RhZ2VJZCB0byBzdGFydCBmcm9tXG4gKiBAcGFyYW0gbWF4RGVwdGggICAgICAgICBNYXhpbXVtIGJhY2t0cmFja2luZyBkZXB0aCAoZGVmYXVsdDogMjApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWFsaXR5VHJhY2UoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHF1YWxpdHlSZWNvcmRlcjogS2V5ZWRSZWNvcmRlcjxRdWFsaXR5RW50cnk+LFxuICBzdGFydElkOiBzdHJpbmcsXG4gIG1heERlcHRoID0gMjAsXG4pOiBRdWFsaXR5U3RhY2tUcmFjZSB7XG4gIGNvbnN0IHN0YXJ0RW50cnkgPSBxdWFsaXR5UmVjb3JkZXIuZ2V0QnlLZXkoc3RhcnRJZCk7XG4gIGlmICghc3RhcnRFbnRyeSkge1xuICAgIHJldHVybiB7IHN0YXJ0SWQsIHN0YXJ0U2NvcmU6IC0xLCBmcmFtZXM6IFtdIH07XG4gIH1cblxuICAvLyBVc2UgY2F1c2FsQ2hhaW4gdG8gYnVpbGQgdGhlIERBRywgcHJvdmlkaW5nIGtleXNSZWFkIGZyb20gdGhlIFF1YWxpdHlSZWNvcmRlclxuICBjb25zdCByb290ID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCBzdGFydElkLCAoaWQpID0+IHF1YWxpdHlSZWNvcmRlci5nZXRCeUtleShpZCk/LmtleXNSZWFkID8/IFtdLCB7IG1heERlcHRoIH0pO1xuXG4gIGlmICghcm9vdCkge1xuICAgIHJldHVybiB7IHN0YXJ0SWQsIHN0YXJ0U2NvcmU6IHN0YXJ0RW50cnkuc2NvcmUsIGZyYW1lczogW10gfTtcbiAgfVxuXG4gIC8vIEZsYXR0ZW4gREFHIHRvIEJGUy1vcmRlcmVkIGZyYW1lcywgZGVjb3JhdGUgd2l0aCBxdWFsaXR5IHNjb3Jlc1xuICBjb25zdCBub2RlcyA9IGZsYXR0ZW5DYXVzYWxEQUcocm9vdCk7XG4gIGNvbnN0IGZyYW1lczogUXVhbGl0eUZyYW1lW10gPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IHF1YWxpdHlSZWNvcmRlci5nZXRCeUtleShub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgcnVudGltZVN0YWdlSWQ6IG5vZGUucnVudGltZVN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUuc3RhZ2VOYW1lLFxuICAgICAgc2NvcmU6IGVudHJ5Py5zY29yZSA/PyAtMSxcbiAgICAgIGZhY3RvcnM6IGVudHJ5Py5mYWN0b3JzID8/IFtdLFxuICAgICAgbGlua2VkQnk6IG5vZGUubGlua2VkQnksXG4gICAgICBkZXB0aDogbm9kZS5kZXB0aCxcbiAgICB9O1xuICB9KTtcblxuICAvLyBGaW5kIHJvb3QgY2F1c2U6IGJpZ2dlc3QgcXVhbGl0eSBkcm9wIGJldHdlZW4gYWRqYWNlbnQgZnJhbWVzIChCRlMgb3JkZXIpXG4gIGxldCByb290Q2F1c2U6IFF1YWxpdHlTdGFja1RyYWNlWydyb290Q2F1c2UnXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmcmFtZSA9IGZyYW1lc1tpXTtcbiAgICAvLyBMb29rIGF0IGVhY2ggcGFyZW50IChmcmFtZXMgYXQgZGVwdGggKyAxKVxuICAgIGZvciAoY29uc3QgcGFyZW50RnJhbWUgb2YgZnJhbWVzLmZpbHRlcigoZikgPT4gZi5kZXB0aCA9PT0gZnJhbWUuZGVwdGggKyAxKSkge1xuICAgICAgaWYgKHBhcmVudEZyYW1lLnNjb3JlIDwgMCkgY29udGludWU7XG4gICAgICBjb25zdCBkcm9wID0gcGFyZW50RnJhbWUuc2NvcmUgLSBmcmFtZS5zY29yZTtcbiAgICAgIGlmIChkcm9wID4gMCAmJiAoIXJvb3RDYXVzZSB8fCBkcm9wID4gcm9vdENhdXNlLmRyb3ApKSB7XG4gICAgICAgIHJvb3RDYXVzZSA9IHsgZnJhbWUsIHByZXZpb3VzRnJhbWU6IHBhcmVudEZyYW1lLCBkcm9wIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydElkLFxuICAgIHN0YXJ0U2NvcmU6IHN0YXJ0RW50cnkuc2NvcmUsXG4gICAgZnJhbWVzLFxuICAgIHJvb3RDYXVzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBRdWFsaXR5U3RhY2tUcmFjZSBhcyBodW1hbi1yZWFkYWJsZSB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UXVhbGl0eVRyYWNlKHRyYWNlOiBRdWFsaXR5U3RhY2tUcmFjZSk6IHN0cmluZyB7XG4gIGlmICh0cmFjZS5mcmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGBRdWFsaXR5IFRyYWNlOiBubyBkYXRhIGZvciAke3RyYWNlLnN0YXJ0SWR9YDtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgUXVhbGl0eSBUcmFjZSAoc2NvcmU6ICR7dHJhY2Uuc3RhcnRTY29yZS50b0ZpeGVkKDIpfSBhdCAke3RyYWNlLnN0YXJ0SWR9KTpgXTtcblxuICBmb3IgKGNvbnN0IGZyYW1lIG9mIHRyYWNlLmZyYW1lcykge1xuICAgIGNvbnN0IHNjb3JlU3RyID0gZnJhbWUuc2NvcmUgPj0gMCA/IGZyYW1lLnNjb3JlLnRvRml4ZWQoMikgOiAnPyc7XG4gICAgY29uc3QgbGluayA9IGZyYW1lLmxpbmtlZEJ5ID8gYCAodmlhICR7ZnJhbWUubGlua2VkQnl9KWAgOiAnJztcbiAgICBjb25zdCBmYWN0b3JzID0gZnJhbWUuZmFjdG9ycy5sZW5ndGggPiAwID8gYCDigJQgJHtmcmFtZS5mYWN0b3JzLmpvaW4oJywgJyl9YCA6ICcnO1xuICAgIGxpbmVzLnB1c2goYCAgYXQgJHtmcmFtZS5ydW50aW1lU3RhZ2VJZC5wYWRFbmQoMzApfSBzY29yZT0ke3Njb3JlU3RyfSR7bGlua30ke2ZhY3RvcnN9YCk7XG4gIH1cblxuICBpZiAodHJhY2Uucm9vdENhdXNlKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIGBSb290IGNhdXNlOiBxdWFsaXR5IGRyb3BwZWQgYXQgJHt0cmFjZS5yb290Q2F1c2UuZnJhbWUucnVudGltZVN0YWdlSWR9IGAgK1xuICAgICAgICBgKCR7dHJhY2Uucm9vdENhdXNlLnByZXZpb3VzRnJhbWUuc2NvcmUudG9GaXhlZCgyKX0g4oaSICR7dHJhY2Uucm9vdENhdXNlLmZyYW1lLnNjb3JlLnRvRml4ZWQoMil9LCBgICtcbiAgICAgICAgYM6UJHt0cmFjZS5yb290Q2F1c2UuZHJvcC50b0ZpeGVkKDIpfSlgLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG4iXX0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eVRyYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9xdWFsaXR5VHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUErQnZFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUF5QixFQUN6QixlQUE4QixFQUM5QixPQUFlLEVBQ2YsUUFBUSxHQUFHLEVBQUU7SUFFYixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUVqSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFtQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDaEQsTUFB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QUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEtBQUssQ0FBQyxJQUFJLENBQ1Isa0NBQWtDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRztZQUN2RSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUN6QyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBxdWFsaXR5VHJhY2UoKSDigJQgUXVhbGl0eSBTdGFjayBUcmFjZSBidWlsdCBvbiBjYXVzYWxDaGFpbigpLlxuICpcbiAqIFRoaW4gbGF5ZXIgb3ZlciBgbWVtb3J5L2JhY2t0cmFjay5jYXVzYWxDaGFpbigpYCB0aGF0IGRlY29yYXRlc1xuICogZWFjaCBjYXVzYWwgbm9kZSB3aXRoIHF1YWxpdHkgc2NvcmVzIGZyb20gYSBRdWFsaXR5UmVjb3JkZXIuXG4gKlxuICogYGBgXG4gKiBRdWFsaXR5IFRyYWNlIChzY29yZTogMC4zIGF0IGNhbGwtbGxtIzUpOlxuICogICBhdCBjYWxsLWxsbSM1ICAgICBzY29yZT0wLjMgIOKGkCBxdWFsaXR5IGRyb3BwZWQgaGVyZVxuICogICBhdCBzeXN0ZW0tcHJvbXB0IzEgc2NvcmU9MC44ICDihpAgc3lzdGVtUHJvbXB0IHdhcyBnb29kXG4gKiAgIGF0IHNlZWQjMCAgICAgICAgICBzY29yZT0xLjAgIOKGkCBpbnB1dCB3YXMgY2xlYW5cbiAqXG4gKiBSb290IGNhdXNlOiBxdWFsaXR5IGRyb3BwZWQgYXQgY2FsbC1sbG0jNSAoMC44IOKGkiAwLjMsIM6UMC41KVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcgfSBmcm9tICcuLi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUXVhbGl0eUVudHJ5IH0gZnJvbSAnLi9RdWFsaXR5UmVjb3JkZXIuanMnO1xuXG4vKiogTWluaW1hbCBwZXItc3RlcCBxdWFsaXR5IGxvb2t1cCDigJQgc2F0aXNmaWVkIGJ5IGBRdWFsaXR5UmVjb3JkZXJgIChzdHJ1Y3R1cmFsLCBkZWNvdXBsZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5TG9va3VwIHtcbiAgZ2V0QnlLZXkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFF1YWxpdHlFbnRyeSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgc2luZ2xlIGZyYW1lIGluIHRoZSBxdWFsaXR5IHN0YWNrIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RnJhbWUge1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc2NvcmU6IG51bWJlcjtcbiAgZmFjdG9yczogc3RyaW5nW107XG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgZnVsbCBxdWFsaXR5IHN0YWNrIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5U3RhY2tUcmFjZSB7XG4gIHN0YXJ0SWQ6IHN0cmluZztcbiAgc3RhcnRTY29yZTogbnVtYmVyO1xuICBmcmFtZXM6IFF1YWxpdHlGcmFtZVtdO1xuICByb290Q2F1c2U/OiB7XG4gICAgZnJhbWU6IFF1YWxpdHlGcmFtZTtcbiAgICBwcmV2aW91c0ZyYW1lOiBRdWFsaXR5RnJhbWU7XG4gICAgZHJvcDogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgcXVhbGl0eSBzdGFjayB0cmFjZSBieSBkZWNvcmF0aW5nIGEgY2F1c2FsIGNoYWluIHdpdGggc2NvcmVzLlxuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgICAgICAgIEZyb20gZXhlY3V0b3IuZ2V0U25hcHNob3QoKS5jb21taXRMb2dcbiAqIEBwYXJhbSBxdWFsaXR5UmVjb3JkZXIgIFF1YWxpdHlSZWNvcmRlciBhdHRhY2hlZCBkdXJpbmcgZXhlY3V0aW9uXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgICAgICBydW50aW1lU3RhZ2VJZCB0byBzdGFydCBmcm9tXG4gKiBAcGFyYW0gbWF4RGVwdGggICAgICAgICBNYXhpbXVtIGJhY2t0cmFja2luZyBkZXB0aCAoZGVmYXVsdDogMjApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWFsaXR5VHJhY2UoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIHF1YWxpdHlSZWNvcmRlcjogUXVhbGl0eUxvb2t1cCxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBtYXhEZXB0aCA9IDIwLFxuKTogUXVhbGl0eVN0YWNrVHJhY2Uge1xuICBjb25zdCBzdGFydEVudHJ5ID0gcXVhbGl0eVJlY29yZGVyLmdldEJ5S2V5KHN0YXJ0SWQpO1xuICBpZiAoIXN0YXJ0RW50cnkpIHtcbiAgICByZXR1cm4geyBzdGFydElkLCBzdGFydFNjb3JlOiAtMSwgZnJhbWVzOiBbXSB9O1xuICB9XG5cbiAgLy8gVXNlIGNhdXNhbENoYWluIHRvIGJ1aWxkIHRoZSBEQUcsIHByb3ZpZGluZyBrZXlzUmVhZCBmcm9tIHRoZSBRdWFsaXR5UmVjb3JkZXJcbiAgY29uc3Qgcm9vdCA9IGNhdXNhbENoYWluKGNvbW1pdExvZywgc3RhcnRJZCwgKGlkKSA9PiBxdWFsaXR5UmVjb3JkZXIuZ2V0QnlLZXkoaWQpPy5rZXlzUmVhZCA/PyBbXSwgeyBtYXhEZXB0aCB9KTtcblxuICBpZiAoIXJvb3QpIHtcbiAgICByZXR1cm4geyBzdGFydElkLCBzdGFydFNjb3JlOiBzdGFydEVudHJ5LnNjb3JlLCBmcmFtZXM6IFtdIH07XG4gIH1cblxuICAvLyBGbGF0dGVuIERBRyB0byBCRlMtb3JkZXJlZCBmcmFtZXMsIGRlY29yYXRlIHdpdGggcXVhbGl0eSBzY29yZXNcbiAgY29uc3Qgbm9kZXMgPSBmbGF0dGVuQ2F1c2FsREFHKHJvb3QpO1xuICBjb25zdCBmcmFtZXM6IFF1YWxpdHlGcmFtZVtdID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBxdWFsaXR5UmVjb3JkZXIuZ2V0QnlLZXkobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBub2RlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBub2RlLnN0YWdlTmFtZSxcbiAgICAgIHNjb3JlOiBlbnRyeT8uc2NvcmUgPz8gLTEsXG4gICAgICBmYWN0b3JzOiBlbnRyeT8uZmFjdG9ycyA/PyBbXSxcbiAgICAgIGxpbmtlZEJ5OiBub2RlLmxpbmtlZEJ5LFxuICAgICAgZGVwdGg6IG5vZGUuZGVwdGgsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gRmluZCByb290IGNhdXNlOiBiaWdnZXN0IHF1YWxpdHkgZHJvcCBiZXR3ZWVuIGFkamFjZW50IGZyYW1lcyAoQkZTIG9yZGVyKVxuICBsZXQgcm9vdENhdXNlOiBRdWFsaXR5U3RhY2tUcmFjZVsncm9vdENhdXNlJ107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZnJhbWUgPSBmcmFtZXNbaV07XG4gICAgLy8gTG9vayBhdCBlYWNoIHBhcmVudCAoZnJhbWVzIGF0IGRlcHRoICsgMSlcbiAgICBmb3IgKGNvbnN0IHBhcmVudEZyYW1lIG9mIGZyYW1lcy5maWx0ZXIoKGYpID0+IGYuZGVwdGggPT09IGZyYW1lLmRlcHRoICsgMSkpIHtcbiAgICAgIGlmIChwYXJlbnRGcmFtZS5zY29yZSA8IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZHJvcCA9IHBhcmVudEZyYW1lLnNjb3JlIC0gZnJhbWUuc2NvcmU7XG4gICAgICBpZiAoZHJvcCA+IDAgJiYgKCFyb290Q2F1c2UgfHwgZHJvcCA+IHJvb3RDYXVzZS5kcm9wKSkge1xuICAgICAgICByb290Q2F1c2UgPSB7IGZyYW1lLCBwcmV2aW91c0ZyYW1lOiBwYXJlbnRGcmFtZSwgZHJvcCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnRJZCxcbiAgICBzdGFydFNjb3JlOiBzdGFydEVudHJ5LnNjb3JlLFxuICAgIGZyYW1lcyxcbiAgICByb290Q2F1c2UsXG4gIH07XG59XG5cbi8qKlxuICogRm9ybWF0IGEgUXVhbGl0eVN0YWNrVHJhY2UgYXMgaHVtYW4tcmVhZGFibGUgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFF1YWxpdHlUcmFjZSh0cmFjZTogUXVhbGl0eVN0YWNrVHJhY2UpOiBzdHJpbmcge1xuICBpZiAodHJhY2UuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUXVhbGl0eSBUcmFjZTogbm8gZGF0YSBmb3IgJHt0cmFjZS5zdGFydElkfWA7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbYFF1YWxpdHkgVHJhY2UgKHNjb3JlOiAke3RyYWNlLnN0YXJ0U2NvcmUudG9GaXhlZCgyKX0gYXQgJHt0cmFjZS5zdGFydElkfSk6YF07XG5cbiAgZm9yIChjb25zdCBmcmFtZSBvZiB0cmFjZS5mcmFtZXMpIHtcbiAgICBjb25zdCBzY29yZVN0ciA9IGZyYW1lLnNjb3JlID49IDAgPyBmcmFtZS5zY29yZS50b0ZpeGVkKDIpIDogJz8nO1xuICAgIGNvbnN0IGxpbmsgPSBmcmFtZS5saW5rZWRCeSA/IGAgKHZpYSAke2ZyYW1lLmxpbmtlZEJ5fSlgIDogJyc7XG4gICAgY29uc3QgZmFjdG9ycyA9IGZyYW1lLmZhY3RvcnMubGVuZ3RoID4gMCA/IGAg4oCUICR7ZnJhbWUuZmFjdG9ycy5qb2luKCcsICcpfWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAgIGF0ICR7ZnJhbWUucnVudGltZVN0YWdlSWQucGFkRW5kKDMwKX0gc2NvcmU9JHtzY29yZVN0cn0ke2xpbmt9JHtmYWN0b3JzfWApO1xuICB9XG5cbiAgaWYgKHRyYWNlLnJvb3RDYXVzZSkge1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgUm9vdCBjYXVzZTogcXVhbGl0eSBkcm9wcGVkIGF0ICR7dHJhY2Uucm9vdENhdXNlLmZyYW1lLnJ1bnRpbWVTdGFnZUlkfSBgICtcbiAgICAgICAgYCgke3RyYWNlLnJvb3RDYXVzZS5wcmV2aW91c0ZyYW1lLnNjb3JlLnRvRml4ZWQoMil9IOKGkiAke3RyYWNlLnJvb3RDYXVzZS5mcmFtZS5zY29yZS50b0ZpeGVkKDIpfSwgYCArXG4gICAgICAgIGDOlCR7dHJhY2Uucm9vdENhdXNlLmRyb3AudG9GaXhlZCgyKX0pYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuIl19
@@ -98,4 +98,4 @@ export class ExecutionRuntime {
98
98
  };
99
99
  }
100
100
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBd0J6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3BCLFdBQVcsQ0FBZTtJQUNqQzs7Ozs7Ozs7T0FRRztJQUNJLGFBQWEsQ0FBZ0I7SUFDN0IsZ0JBQWdCLENBQWU7SUFDL0IsZ0JBQWdCLENBQVc7SUFDbEMsb0ZBQW9GO0lBQzVFLGFBQWEsQ0FBZ0I7SUFDN0IsYUFBYSxDQUFVO0lBQ3ZCLGNBQWMsQ0FBVTtJQUVoQyxZQUFZLFFBQWdCLEVBQUUsTUFBYyxFQUFFLGFBQXVCLEVBQUUsWUFBc0I7UUFDM0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxDQUFDLGFBQWE7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FDbkMsSUFBSSxDQUFDLGNBQWM7UUFDbkIsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILFdBQVcsQ0FBQyxPQUE4QjtRQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQztRQUNqRixPQUFPO1lBQ0wsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDdkYsYUFBYSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUU7WUFDekMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7U0FDeEMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhlY3V0aW9uUnVudGltZSDigJQgVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB7IEV2ZW50TG9nIH0gZnJvbSAnLi4vbWVtb3J5L0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5cbi8qKiBTbmFwc2hvdCBvZiBhIHNpbmdsZSByZWNvcmRlcidzIGNvbGxlY3RlZCBkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlclNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2NvcGVSZWNvcmRlciB0eXBlIGFuZCBwYXR0ZXJuIGRlc2NyaXB0aW9uIChlLmcuLCBcIlRyYW5zbGF0b3IgKEtleWVkUmVjb3JkZXIpIOKAlCBwZXItc3RlcCB0b2tlbiB1c2FnZVwiKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBQcmVmZXJyZWQgcmVhZC10aW1lIG9wZXJhdGlvbiDigJQgaGludHMgdGhlIFVJIGFib3V0IHdoaWNoIHZpZXcgdG8gc2hvdyBwcm9taW5lbnRseS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgZGF0YTogdW5rbm93bjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cyAoa2V5ZWQgYnkgc3ViZmxvd0lkKS4gKi9cbiAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpLiAqL1xuICByZWNvcmRlcnM/OiBSZWNvcmRlclNuYXBzaG90W107XG59O1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uUnVudGltZSB7XG4gIHB1YmxpYyBnbG9iYWxTdG9yZTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAuIFBvcHVsYXRlZCBkdXJpbmcgdHJhdmVyc2FsIHZpYVxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdCgpYCB1c2luZyB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIGBlbmFibGVSZWRhY3RlZE1pcnJvcigpYCBoYXMgYmVlbiBjYWxsZWQg4oCUIHR5cGljYWxseSBieVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLiBPdGhlcndpc2VcbiAgICogdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcblxuICBjb25zdHJ1Y3Rvcihyb290TmFtZTogc3RyaW5nLCByb290SWQ6IHN0cmluZywgZGVmYXVsdFZhbHVlcz86IHVua25vd24sIGluaXRpYWxTdGF0ZT86IHVua25vd24pIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gbmV3IEV2ZW50TG9nKGluaXRpYWxTdGF0ZSk7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSBuZXcgU3RhZ2VDb250ZXh0KCcnLCByb290TmFtZSwgcm9vdElkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHQgaW4gdG8gbWFpbnRhaW5pbmcgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gQWZ0ZXJcbiAgICogdGhpcyBjYWxsLCBldmVyeSBgU3RhZ2VDb250ZXh0LmNvbW1pdCgpYCBpbiB0aGUgcnVuIHdyaXRlcyB0aGUgcmVkYWN0ZWRcbiAgICogcGF0Y2hlcyAodGhlIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZykgaW50byBgcmVkYWN0ZWRTdG9yZWAgaW5cbiAgICogYWRkaXRpb24gdG8gdGhlIHJhdyBvbmVzIHdyaXR0ZW4gdG8gYGdsb2JhbFN0b3JlYC5cbiAgICpcbiAgICogVGhlIG1pcnJvciBpcyBjcmVhdGVkIGxhemlseSBhbmQgcHJvcGFnYXRlZCBpbnRvIGFsbCBjaGlsZCAvIG5leHRcbiAgICogY29udGV4dHMsIHNvIGl0IGNvcnJlY3RseSByZWZsZWN0cyBzdWJmbG93LXNjb3BlIHdyaXRlcy4gV2hlbiBub1xuICAgKiBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLCBjYWxsZXJzIHNob3VsZCBza2lwIHRoaXMg4oCUIHVudXNlZFxuICAgKiBhbGxvY2F0aW9uLCBubyBmdW5jdGlvbmFsIGRpZmZlcmVuY2UgaW4gdGhlIHNuYXBzaG90LlxuICAgKi9cbiAgZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTdG9yZSkgcmV0dXJuOyAvLyBpZGVtcG90ZW50XG4gICAgdGhpcy5yZWRhY3RlZFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShcbiAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMsXG4gICAgICAvLyBTZWVkIHdpdGggdGhlIHNhbWUgaW5pdGlhbCBzdGF0ZSBhcyB0aGUgcmF3IHN0b3JlIHNvIHRoZSBtaXJyb3JcbiAgICAgIC8vIHN0YXJ0cyBmcm9tIGEgc2NydWJiZWQtbm90aGluZyBiYXNlbGluZTsgc3Vic2VxdWVudCBjb21taXRzIGFwcGx5XG4gICAgICAvLyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBvbiB0b3AuXG4gICAgICB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgKTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQudXNlUmVkYWN0ZWRNaXJyb3IodGhpcy5yZWRhY3RlZFN0b3JlKTtcbiAgfVxuXG4gIC8qKiBQcmVzZXJ2ZSB0aGUgY3VycmVudCByb290U3RhZ2VDb250ZXh0IGZvciBzbmFwc2hvdHMgYmVmb3JlIGNoYW5naW5nIGl0IGZvciByZXN1bWUuICovXG4gIHByZXNlcnZlU25hcHNob3RSb290KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc25hcHNob3RSb290KSB7XG4gICAgICB0aGlzLl9zbmFwc2hvdFJvb3QgPSB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90Um9vdCA9IHRoaXMuX3NuYXBzaG90Um9vdCA/PyB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgdXNlUmVkYWN0ZWQgPSBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUgJiYgdGhpcy5yZWRhY3RlZFN0b3JlICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZFN0YXRlOiB1c2VSZWRhY3RlZCA/IHRoaXMucmVkYWN0ZWRTdG9yZSEuZ2V0U3RhdGUoKSA6IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90Um9vdC5nZXRTbmFwc2hvdCgpLFxuICAgICAgY29tbWl0TG9nOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkubGlzdCgpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBd0J6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3BCLFdBQVcsQ0FBZTtJQUNqQzs7Ozs7Ozs7T0FRRztJQUNJLGFBQWEsQ0FBZ0I7SUFDN0IsZ0JBQWdCLENBQWU7SUFDL0IsZ0JBQWdCLENBQVc7SUFDbEMsb0ZBQW9GO0lBQzVFLGFBQWEsQ0FBZ0I7SUFDN0IsYUFBYSxDQUFVO0lBQ3ZCLGNBQWMsQ0FBVTtJQUVoQyxZQUFZLFFBQWdCLEVBQUUsTUFBYyxFQUFFLGFBQXVCLEVBQUUsWUFBc0I7UUFDM0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxDQUFDLGFBQWE7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FDbkMsSUFBSSxDQUFDLGNBQWM7UUFDbkIsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILFdBQVcsQ0FBQyxPQUE4QjtRQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQztRQUNqRixPQUFPO1lBQ0wsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDdkYsYUFBYSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUU7WUFDekMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7U0FDeEMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhlY3V0aW9uUnVudGltZSDigJQgVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB7IEV2ZW50TG9nIH0gZnJvbSAnLi4vbWVtb3J5L0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5cbi8qKiBTbmFwc2hvdCBvZiBhIHNpbmdsZSByZWNvcmRlcidzIGNvbGxlY3RlZCBkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlclNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2NvcGVSZWNvcmRlciB0eXBlIGFuZCBwYXR0ZXJuIGRlc2NyaXB0aW9uIChlLmcuLCBcIlRyYW5zbGF0b3IgKEtleWVkU3RvcmUpIOKAlCBwZXItc3RlcCB0b2tlbiB1c2FnZVwiKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBQcmVmZXJyZWQgcmVhZC10aW1lIG9wZXJhdGlvbiDigJQgaGludHMgdGhlIFVJIGFib3V0IHdoaWNoIHZpZXcgdG8gc2hvdyBwcm9taW5lbnRseS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgZGF0YTogdW5rbm93bjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cyAoa2V5ZWQgYnkgc3ViZmxvd0lkKS4gKi9cbiAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpLiAqL1xuICByZWNvcmRlcnM/OiBSZWNvcmRlclNuYXBzaG90W107XG59O1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uUnVudGltZSB7XG4gIHB1YmxpYyBnbG9iYWxTdG9yZTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAuIFBvcHVsYXRlZCBkdXJpbmcgdHJhdmVyc2FsIHZpYVxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdCgpYCB1c2luZyB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIGBlbmFibGVSZWRhY3RlZE1pcnJvcigpYCBoYXMgYmVlbiBjYWxsZWQg4oCUIHR5cGljYWxseSBieVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLiBPdGhlcndpc2VcbiAgICogdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcblxuICBjb25zdHJ1Y3Rvcihyb290TmFtZTogc3RyaW5nLCByb290SWQ6IHN0cmluZywgZGVmYXVsdFZhbHVlcz86IHVua25vd24sIGluaXRpYWxTdGF0ZT86IHVua25vd24pIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gbmV3IEV2ZW50TG9nKGluaXRpYWxTdGF0ZSk7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSBuZXcgU3RhZ2VDb250ZXh0KCcnLCByb290TmFtZSwgcm9vdElkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHQgaW4gdG8gbWFpbnRhaW5pbmcgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gQWZ0ZXJcbiAgICogdGhpcyBjYWxsLCBldmVyeSBgU3RhZ2VDb250ZXh0LmNvbW1pdCgpYCBpbiB0aGUgcnVuIHdyaXRlcyB0aGUgcmVkYWN0ZWRcbiAgICogcGF0Y2hlcyAodGhlIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZykgaW50byBgcmVkYWN0ZWRTdG9yZWAgaW5cbiAgICogYWRkaXRpb24gdG8gdGhlIHJhdyBvbmVzIHdyaXR0ZW4gdG8gYGdsb2JhbFN0b3JlYC5cbiAgICpcbiAgICogVGhlIG1pcnJvciBpcyBjcmVhdGVkIGxhemlseSBhbmQgcHJvcGFnYXRlZCBpbnRvIGFsbCBjaGlsZCAvIG5leHRcbiAgICogY29udGV4dHMsIHNvIGl0IGNvcnJlY3RseSByZWZsZWN0cyBzdWJmbG93LXNjb3BlIHdyaXRlcy4gV2hlbiBub1xuICAgKiBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLCBjYWxsZXJzIHNob3VsZCBza2lwIHRoaXMg4oCUIHVudXNlZFxuICAgKiBhbGxvY2F0aW9uLCBubyBmdW5jdGlvbmFsIGRpZmZlcmVuY2UgaW4gdGhlIHNuYXBzaG90LlxuICAgKi9cbiAgZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTdG9yZSkgcmV0dXJuOyAvLyBpZGVtcG90ZW50XG4gICAgdGhpcy5yZWRhY3RlZFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShcbiAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMsXG4gICAgICAvLyBTZWVkIHdpdGggdGhlIHNhbWUgaW5pdGlhbCBzdGF0ZSBhcyB0aGUgcmF3IHN0b3JlIHNvIHRoZSBtaXJyb3JcbiAgICAgIC8vIHN0YXJ0cyBmcm9tIGEgc2NydWJiZWQtbm90aGluZyBiYXNlbGluZTsgc3Vic2VxdWVudCBjb21taXRzIGFwcGx5XG4gICAgICAvLyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBvbiB0b3AuXG4gICAgICB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgKTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQudXNlUmVkYWN0ZWRNaXJyb3IodGhpcy5yZWRhY3RlZFN0b3JlKTtcbiAgfVxuXG4gIC8qKiBQcmVzZXJ2ZSB0aGUgY3VycmVudCByb290U3RhZ2VDb250ZXh0IGZvciBzbmFwc2hvdHMgYmVmb3JlIGNoYW5naW5nIGl0IGZvciByZXN1bWUuICovXG4gIHByZXNlcnZlU25hcHNob3RSb290KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc25hcHNob3RSb290KSB7XG4gICAgICB0aGlzLl9zbmFwc2hvdFJvb3QgPSB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90Um9vdCA9IHRoaXMuX3NuYXBzaG90Um9vdCA/PyB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgdXNlUmVkYWN0ZWQgPSBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUgJiYgdGhpcy5yZWRhY3RlZFN0b3JlICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZFN0YXRlOiB1c2VSZWRhY3RlZCA/IHRoaXMucmVkYWN0ZWRTdG9yZSEuZ2V0U3RhdGUoKSA6IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90Um9vdC5nZXRTbmFwc2hvdCgpLFxuICAgICAgY29tbWl0TG9nOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkubGlzdCgpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==