footprintjs 9.4.0 → 9.6.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 (55) hide show
  1. package/CLAUDE.md +2 -0
  2. package/README.md +14 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/builder/FlowChartBuilder.js +15 -2
  5. package/dist/esm/lib/capture/envelope.js +187 -0
  6. package/dist/esm/lib/capture/index.js +2 -2
  7. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +23 -4
  8. package/dist/esm/lib/engine/types.js +1 -1
  9. package/dist/esm/lib/observer-queue/deferredDispatcher.js +226 -0
  10. package/dist/esm/lib/observer-queue/flushDriver.js +163 -0
  11. package/dist/esm/lib/observer-queue/index.js +22 -0
  12. package/dist/esm/lib/observer-queue/mergedQueue.js +91 -0
  13. package/dist/esm/lib/observer-queue/ring.js +122 -0
  14. package/dist/esm/lib/recorder/CombinedRecorder.js +4 -4
  15. package/dist/esm/lib/recorder/invokeHook.js +38 -0
  16. package/dist/esm/lib/runner/DeferredObserverTier.js +366 -0
  17. package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
  18. package/dist/esm/lib/runner/FlowChartExecutor.js +152 -22
  19. package/dist/esm/lib/runner/index.js +1 -1
  20. package/dist/esm/lib/scope/ScopeFacade.js +11 -8
  21. package/dist/index.js +1 -1
  22. package/dist/lib/builder/FlowChartBuilder.js +15 -2
  23. package/dist/lib/capture/envelope.js +192 -0
  24. package/dist/lib/capture/index.js +3 -3
  25. package/dist/lib/engine/handlers/ContinuationResolver.js +23 -4
  26. package/dist/lib/engine/types.js +1 -1
  27. package/dist/lib/observer-queue/deferredDispatcher.js +230 -0
  28. package/dist/lib/observer-queue/flushDriver.js +167 -0
  29. package/dist/lib/observer-queue/index.js +36 -0
  30. package/dist/lib/observer-queue/mergedQueue.js +95 -0
  31. package/dist/lib/observer-queue/ring.js +126 -0
  32. package/dist/lib/recorder/CombinedRecorder.js +8 -8
  33. package/dist/lib/recorder/invokeHook.js +42 -0
  34. package/dist/lib/runner/DeferredObserverTier.js +370 -0
  35. package/dist/lib/runner/ExecutionRuntime.js +1 -1
  36. package/dist/lib/runner/FlowChartExecutor.js +152 -22
  37. package/dist/lib/runner/index.js +1 -1
  38. package/dist/lib/scope/ScopeFacade.js +11 -8
  39. package/dist/types/index.d.ts +24 -0
  40. package/dist/types/lib/capture/envelope.d.ts +169 -0
  41. package/dist/types/lib/capture/index.d.ts +1 -1
  42. package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +15 -2
  43. package/dist/types/lib/engine/types.d.ts +3 -0
  44. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +169 -0
  45. package/dist/types/lib/observer-queue/flushDriver.d.ts +124 -0
  46. package/dist/types/lib/observer-queue/index.d.ts +25 -0
  47. package/dist/types/lib/observer-queue/mergedQueue.d.ts +85 -0
  48. package/dist/types/lib/observer-queue/ring.d.ts +99 -0
  49. package/dist/types/lib/recorder/CombinedRecorder.d.ts +36 -0
  50. package/dist/types/lib/recorder/invokeHook.d.ts +32 -0
  51. package/dist/types/lib/runner/DeferredObserverTier.d.ts +204 -0
  52. package/dist/types/lib/runner/ExecutionRuntime.d.ts +8 -0
  53. package/dist/types/lib/runner/FlowChartExecutor.d.ts +49 -10
  54. package/dist/types/lib/runner/index.d.ts +1 -0
  55. package/package.json +2 -1
@@ -0,0 +1,122 @@
1
+ /**
2
+ * observer-queue/ring.ts — RFC-001 Block 2: bounded ring with overflow policies.
3
+ *
4
+ * Pattern: Fixed-capacity circular buffer with explicit, COUNTED overflow
5
+ * behavior. The deferred-observer queue must never grow without
6
+ * bound (a slow consumer cannot OOM the producer), and must never
7
+ * lose an event silently (every loss increments `drops`).
8
+ * Role: Storage primitive under the merged queue (Block 3). Pure data
9
+ * structure — zero imports, zero engine knowledge, generic over T.
10
+ *
11
+ * Overflow policies (RFC-001 §5, with the accepted 'block' resolution):
12
+ * - `'drop-oldest'` — evict the oldest queued item to admit the new one.
13
+ * The evicted item is LOST (`drops`++) and returned on the push result
14
+ * so the caller can account for it. Sequence stamps on surviving items
15
+ * keep loss visible as seq gaps (honest loss accounting). DEFAULT
16
+ * posture for telemetry-grade delivery.
17
+ * - `'sample'` — while saturated, admit 1 in `sampleEvery` arrivals
18
+ * (evicting the oldest to make room — that eviction is also a counted
19
+ * loss); refuse the rest (each a counted loss). Keeps a thinned,
20
+ * still-fresh stream under sustained overload. The saturation counter
21
+ * is episode-scoped: it resets whenever a push succeeds through the
22
+ * non-full path.
23
+ * - `'block'` — the ring REFUSES the new item (`accepted: false`,
24
+ * `rejections`++) and drops NOTHING. In a single-threaded runtime a
25
+ * queue cannot literally block its producer; the dispatcher (Block 5)
26
+ * interprets a refusal as "deliver this event synchronously inline" —
27
+ * re-introducing blocking delivery by the consumer's EXPLICIT choice.
28
+ * Rejections are NOT losses: the event is still delivered (inline), so
29
+ * `drops` stays untouched.
30
+ *
31
+ * Conservation invariant (property-tested):
32
+ * pushes === delivered + drops + rejections + size
33
+ *
34
+ * CURSOR-READY (amendment A2): v1 consumes destructively through ONE cursor
35
+ * (`shift()` advances `head`). The designed v1.1 path keeps items in the
36
+ * ring and gives each listener its own read cursor; `head` then advances to
37
+ * `min(cursors)` (the reclaim watermark) instead of on read. The storage
38
+ * layout (contiguous circular window, `head` + `count`) already supports
39
+ * that — only the consumption surface changes. Documented, not implemented.
40
+ */
41
+ const DEFAULT_SAMPLE_EVERY = 10;
42
+ export class BoundedRing {
43
+ buffer;
44
+ policy;
45
+ sampleEvery;
46
+ /** Index of the oldest queued item — the single v1 cursor (see header). */
47
+ head = 0;
48
+ count = 0;
49
+ /** Arrivals seen while saturated in the current episode (`'sample'`). */
50
+ saturatedArrivals = 0;
51
+ pushes = 0;
52
+ delivered = 0;
53
+ drops = 0;
54
+ rejections = 0;
55
+ constructor(opts) {
56
+ if (!Number.isInteger(opts.capacity) || opts.capacity <= 0) {
57
+ throw new RangeError(`BoundedRing capacity must be a positive integer (got ${opts.capacity})`);
58
+ }
59
+ const sampleEvery = opts.sampleEvery ?? DEFAULT_SAMPLE_EVERY;
60
+ if (!Number.isInteger(sampleEvery) || sampleEvery <= 0) {
61
+ throw new RangeError(`BoundedRing sampleEvery must be a positive integer (got ${opts.sampleEvery})`);
62
+ }
63
+ this.buffer = new Array(opts.capacity);
64
+ this.policy = opts.policy;
65
+ this.sampleEvery = sampleEvery;
66
+ }
67
+ get size() {
68
+ return this.count;
69
+ }
70
+ get capacity() {
71
+ return this.buffer.length;
72
+ }
73
+ /** Lifetime counters — see {@link RingCounters}. */
74
+ getCounters() {
75
+ return { pushes: this.pushes, delivered: this.delivered, drops: this.drops, rejections: this.rejections };
76
+ }
77
+ /** Admit, evict-and-admit, refuse, or sample per policy — never throws. */
78
+ push(item) {
79
+ this.pushes += 1;
80
+ if (this.count < this.buffer.length) {
81
+ this.saturatedArrivals = 0; // new saturation episode starts fresh
82
+ this.store(item);
83
+ return { accepted: true };
84
+ }
85
+ if (this.policy === 'block') {
86
+ this.rejections += 1;
87
+ return { accepted: false };
88
+ }
89
+ if (this.policy === 'sample') {
90
+ this.saturatedArrivals += 1;
91
+ if (this.saturatedArrivals % this.sampleEvery !== 0) {
92
+ this.drops += 1; // the incoming item is sampled out — lost
93
+ return { accepted: false };
94
+ }
95
+ // The 1-in-N admission falls through to evict-and-store.
96
+ }
97
+ // 'drop-oldest' (and the 'sample' admission): evict the oldest — lost.
98
+ const evicted = this.buffer[this.head];
99
+ this.buffer[this.head] = undefined;
100
+ this.head = (this.head + 1) % this.buffer.length;
101
+ this.count -= 1;
102
+ this.drops += 1;
103
+ this.store(item);
104
+ return { accepted: true, evicted };
105
+ }
106
+ /** Pop the oldest queued item (FIFO). `undefined` when empty. */
107
+ shift() {
108
+ if (this.count === 0)
109
+ return undefined;
110
+ const item = this.buffer[this.head];
111
+ this.buffer[this.head] = undefined; // release the reference for GC
112
+ this.head = (this.head + 1) % this.buffer.length;
113
+ this.count -= 1;
114
+ this.delivered += 1;
115
+ return item;
116
+ }
117
+ store(item) {
118
+ this.buffer[(this.head + this.count) % this.buffer.length] = item;
119
+ this.count += 1;
120
+ }
121
+ }
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb2JzZXJ2ZXItcXVldWUvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBeUNILE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRWhDLE1BQU0sT0FBTyxXQUFXO0lBQ0wsTUFBTSxDQUF1QjtJQUM3QixNQUFNLENBQWlCO0lBQ3ZCLFdBQVcsQ0FBUztJQUNyQywyRUFBMkU7SUFDbkUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNULEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbEIseUVBQXlFO0lBQ2pFLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUV0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDVixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRXZCLFlBQVksSUFBaUI7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLFVBQVUsQ0FBQyx3REFBd0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxVQUFVLENBQUMsMkRBQTJELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxXQUFXO1FBQ1QsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUcsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxJQUFJLENBQUMsSUFBTztRQUNWLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7WUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDckIsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7Z0JBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELHlEQUF5RDtRQUMzRCxDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsK0JBQStCO1FBQ25FLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFPO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG9ic2VydmVyLXF1ZXVlL3JpbmcudHMg4oCUIFJGQy0wMDEgQmxvY2sgMjogYm91bmRlZCByaW5nIHdpdGggb3ZlcmZsb3cgcG9saWNpZXMuXG4gKlxuICogUGF0dGVybjogIEZpeGVkLWNhcGFjaXR5IGNpcmN1bGFyIGJ1ZmZlciB3aXRoIGV4cGxpY2l0LCBDT1VOVEVEIG92ZXJmbG93XG4gKiAgICAgICAgICAgYmVoYXZpb3IuIFRoZSBkZWZlcnJlZC1vYnNlcnZlciBxdWV1ZSBtdXN0IG5ldmVyIGdyb3cgd2l0aG91dFxuICogICAgICAgICAgIGJvdW5kIChhIHNsb3cgY29uc3VtZXIgY2Fubm90IE9PTSB0aGUgcHJvZHVjZXIpLCBhbmQgbXVzdCBuZXZlclxuICogICAgICAgICAgIGxvc2UgYW4gZXZlbnQgc2lsZW50bHkgKGV2ZXJ5IGxvc3MgaW5jcmVtZW50cyBgZHJvcHNgKS5cbiAqIFJvbGU6ICAgICBTdG9yYWdlIHByaW1pdGl2ZSB1bmRlciB0aGUgbWVyZ2VkIHF1ZXVlIChCbG9jayAzKS4gUHVyZSBkYXRhXG4gKiAgICAgICAgICAgc3RydWN0dXJlIOKAlCB6ZXJvIGltcG9ydHMsIHplcm8gZW5naW5lIGtub3dsZWRnZSwgZ2VuZXJpYyBvdmVyIFQuXG4gKlxuICogT3ZlcmZsb3cgcG9saWNpZXMgKFJGQy0wMDEgwqc1LCB3aXRoIHRoZSBhY2NlcHRlZCAnYmxvY2snIHJlc29sdXRpb24pOlxuICogICAtIGAnZHJvcC1vbGRlc3QnYCDigJQgZXZpY3QgdGhlIG9sZGVzdCBxdWV1ZWQgaXRlbSB0byBhZG1pdCB0aGUgbmV3IG9uZS5cbiAqICAgICBUaGUgZXZpY3RlZCBpdGVtIGlzIExPU1QgKGBkcm9wc2ArKykgYW5kIHJldHVybmVkIG9uIHRoZSBwdXNoIHJlc3VsdFxuICogICAgIHNvIHRoZSBjYWxsZXIgY2FuIGFjY291bnQgZm9yIGl0LiBTZXF1ZW5jZSBzdGFtcHMgb24gc3Vydml2aW5nIGl0ZW1zXG4gKiAgICAga2VlcCBsb3NzIHZpc2libGUgYXMgc2VxIGdhcHMgKGhvbmVzdCBsb3NzIGFjY291bnRpbmcpLiBERUZBVUxUXG4gKiAgICAgcG9zdHVyZSBmb3IgdGVsZW1ldHJ5LWdyYWRlIGRlbGl2ZXJ5LlxuICogICAtIGAnc2FtcGxlJ2Ag4oCUIHdoaWxlIHNhdHVyYXRlZCwgYWRtaXQgMSBpbiBgc2FtcGxlRXZlcnlgIGFycml2YWxzXG4gKiAgICAgKGV2aWN0aW5nIHRoZSBvbGRlc3QgdG8gbWFrZSByb29tIOKAlCB0aGF0IGV2aWN0aW9uIGlzIGFsc28gYSBjb3VudGVkXG4gKiAgICAgbG9zcyk7IHJlZnVzZSB0aGUgcmVzdCAoZWFjaCBhIGNvdW50ZWQgbG9zcykuIEtlZXBzIGEgdGhpbm5lZCxcbiAqICAgICBzdGlsbC1mcmVzaCBzdHJlYW0gdW5kZXIgc3VzdGFpbmVkIG92ZXJsb2FkLiBUaGUgc2F0dXJhdGlvbiBjb3VudGVyXG4gKiAgICAgaXMgZXBpc29kZS1zY29wZWQ6IGl0IHJlc2V0cyB3aGVuZXZlciBhIHB1c2ggc3VjY2VlZHMgdGhyb3VnaCB0aGVcbiAqICAgICBub24tZnVsbCBwYXRoLlxuICogICAtIGAnYmxvY2snYCDigJQgdGhlIHJpbmcgUkVGVVNFUyB0aGUgbmV3IGl0ZW0gKGBhY2NlcHRlZDogZmFsc2VgLFxuICogICAgIGByZWplY3Rpb25zYCsrKSBhbmQgZHJvcHMgTk9USElORy4gSW4gYSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZSBhXG4gKiAgICAgcXVldWUgY2Fubm90IGxpdGVyYWxseSBibG9jayBpdHMgcHJvZHVjZXI7IHRoZSBkaXNwYXRjaGVyIChCbG9jayA1KVxuICogICAgIGludGVycHJldHMgYSByZWZ1c2FsIGFzIFwiZGVsaXZlciB0aGlzIGV2ZW50IHN5bmNocm9ub3VzbHkgaW5saW5lXCIg4oCUXG4gKiAgICAgcmUtaW50cm9kdWNpbmcgYmxvY2tpbmcgZGVsaXZlcnkgYnkgdGhlIGNvbnN1bWVyJ3MgRVhQTElDSVQgY2hvaWNlLlxuICogICAgIFJlamVjdGlvbnMgYXJlIE5PVCBsb3NzZXM6IHRoZSBldmVudCBpcyBzdGlsbCBkZWxpdmVyZWQgKGlubGluZSksIHNvXG4gKiAgICAgYGRyb3BzYCBzdGF5cyB1bnRvdWNoZWQuXG4gKlxuICogQ29uc2VydmF0aW9uIGludmFyaWFudCAocHJvcGVydHktdGVzdGVkKTpcbiAqICAgcHVzaGVzID09PSBkZWxpdmVyZWQgKyBkcm9wcyArIHJlamVjdGlvbnMgKyBzaXplXG4gKlxuICogQ1VSU09SLVJFQURZIChhbWVuZG1lbnQgQTIpOiB2MSBjb25zdW1lcyBkZXN0cnVjdGl2ZWx5IHRocm91Z2ggT05FIGN1cnNvclxuICogKGBzaGlmdCgpYCBhZHZhbmNlcyBgaGVhZGApLiBUaGUgZGVzaWduZWQgdjEuMSBwYXRoIGtlZXBzIGl0ZW1zIGluIHRoZVxuICogcmluZyBhbmQgZ2l2ZXMgZWFjaCBsaXN0ZW5lciBpdHMgb3duIHJlYWQgY3Vyc29yOyBgaGVhZGAgdGhlbiBhZHZhbmNlcyB0b1xuICogYG1pbihjdXJzb3JzKWAgKHRoZSByZWNsYWltIHdhdGVybWFyaykgaW5zdGVhZCBvZiBvbiByZWFkLiBUaGUgc3RvcmFnZVxuICogbGF5b3V0IChjb250aWd1b3VzIGNpcmN1bGFyIHdpbmRvdywgYGhlYWRgICsgYGNvdW50YCkgYWxyZWFkeSBzdXBwb3J0c1xuICogdGhhdCDigJQgb25seSB0aGUgY29uc3VtcHRpb24gc3VyZmFjZSBjaGFuZ2VzLiBEb2N1bWVudGVkLCBub3QgaW1wbGVtZW50ZWQuXG4gKi9cblxuLyoqIEhvdyB0aGUgcmluZyB0cmVhdHMgYSBwdXNoIHdoZW4gaXQgaXMgYXQgY2FwYWNpdHkgKFJGQy0wMDEgwqc1KS4gKi9cbmV4cG9ydCB0eXBlIE92ZXJmbG93UG9saWN5ID0gJ2Jsb2NrJyB8ICdkcm9wLW9sZGVzdCcgfCAnc2FtcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBSaW5nT3B0aW9ucyB7XG4gIC8qKiBNYXggcXVldWVkIGl0ZW1zLiBQb3NpdGl2ZSBpbnRlZ2VyLiAqL1xuICByZWFkb25seSBjYXBhY2l0eTogbnVtYmVyO1xuICAvKiogT3ZlcmZsb3cgYmVoYXZpb3IgYXQgY2FwYWNpdHkg4oCUIHNlZSB0aGUgbW9kdWxlIGhlYWRlci4gKi9cbiAgcmVhZG9ubHkgcG9saWN5OiBPdmVyZmxvd1BvbGljeTtcbiAgLyoqXG4gICAqIGAnc2FtcGxlJ2Agb25seTogYWRtaXQgMSBpbiB0aGlzIG1hbnkgYXJyaXZhbHMgd2hpbGUgc2F0dXJhdGVkLlxuICAgKiBQb3NpdGl2ZSBpbnRlZ2VyOyBkZWZhdWx0IDEwLlxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnk/OiBudW1iZXI7XG59XG5cbi8qKiBPdXRjb21lIG9mIG9uZSB7QGxpbmsgQm91bmRlZFJpbmcucHVzaH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJpbmdQdXNoUmVzdWx0PFQ+IHtcbiAgLyoqIFRydWUgd2hlbiB0aGUgcHVzaGVkIGl0ZW0gaXMgbm93IHF1ZXVlZC4gKi9cbiAgcmVhZG9ubHkgYWNjZXB0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGl0ZW0sIHdoZW4gYWRtaXR0aW5nIHRoZSBuZXcgb25lIGV2aWN0ZWQgaXRcbiAgICogKGAnZHJvcC1vbGRlc3QnYCwgb3IgYSBgJ3NhbXBsZSdgIGFkbWlzc2lvbikuIEFscmVhZHkgY291bnRlZCBpblxuICAgKiBgZHJvcHNgIOKAlCBzdXJmYWNlZCBzbyBjYWxsZXJzIGNhbiBkbyB0aGVpciBvd24gbG9zcyBhY2NvdW50aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZpY3RlZD86IFQ7XG59XG5cbi8qKiBNb25vdG9uaWMgY291bnRlcnMg4oCUIG5ldmVyIHJlc2V0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpbmdDb3VudGVycyB7XG4gIC8qKiBUb3RhbCBgcHVzaCgpYCBjYWxscy4gKi9cbiAgcmVhZG9ubHkgcHVzaGVzOiBudW1iZXI7XG4gIC8qKiBgc2hpZnQoKWAgY2FsbHMgdGhhdCByZXR1cm5lZCBhbiBpdGVtLiAqL1xuICByZWFkb25seSBkZWxpdmVyZWQ6IG51bWJlcjtcbiAgLyoqIEl0ZW1zIExPU1Qg4oCUIGV2aWN0aW9ucyBwbHVzIHNhbXBsZWQtb3V0IHJlZnVzYWxzLiBOZXZlciBzaWxlbnQuICovXG4gIHJlYWRvbmx5IGRyb3BzOiBudW1iZXI7XG4gIC8qKiBgJ2Jsb2NrJ2AgcmVmdXNhbHMg4oCUIE5PVCBsb3NzZXM7IHRoZSBjYWxsZXIgZGVsaXZlcnMgdGhlc2UgaW5saW5lLiAqL1xuICByZWFkb25seSByZWplY3Rpb25zOiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfU0FNUExFX0VWRVJZID0gMTA7XG5cbmV4cG9ydCBjbGFzcyBCb3VuZGVkUmluZzxUPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBBcnJheTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3k6IE92ZXJmbG93UG9saWN5O1xuICBwcml2YXRlIHJlYWRvbmx5IHNhbXBsZUV2ZXJ5OiBudW1iZXI7XG4gIC8qKiBJbmRleCBvZiB0aGUgb2xkZXN0IHF1ZXVlZCBpdGVtIOKAlCB0aGUgc2luZ2xlIHYxIGN1cnNvciAoc2VlIGhlYWRlcikuICovXG4gIHByaXZhdGUgaGVhZCA9IDA7XG4gIHByaXZhdGUgY291bnQgPSAwO1xuICAvKiogQXJyaXZhbHMgc2VlbiB3aGlsZSBzYXR1cmF0ZWQgaW4gdGhlIGN1cnJlbnQgZXBpc29kZSAoYCdzYW1wbGUnYCkuICovXG4gIHByaXZhdGUgc2F0dXJhdGVkQXJyaXZhbHMgPSAwO1xuXG4gIHByaXZhdGUgcHVzaGVzID0gMDtcbiAgcHJpdmF0ZSBkZWxpdmVyZWQgPSAwO1xuICBwcml2YXRlIGRyb3BzID0gMDtcbiAgcHJpdmF0ZSByZWplY3Rpb25zID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBSaW5nT3B0aW9ucykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvcHRzLmNhcGFjaXR5KSB8fCBvcHRzLmNhcGFjaXR5IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBCb3VuZGVkUmluZyBjYXBhY2l0eSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290ICR7b3B0cy5jYXBhY2l0eX0pYCk7XG4gICAgfVxuICAgIGNvbnN0IHNhbXBsZUV2ZXJ5ID0gb3B0cy5zYW1wbGVFdmVyeSA/PyBERUZBVUxUX1NBTVBMRV9FVkVSWTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc2FtcGxlRXZlcnkpIHx8IHNhbXBsZUV2ZXJ5IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBCb3VuZGVkUmluZyBzYW1wbGVFdmVyeSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290ICR7b3B0cy5zYW1wbGVFdmVyeX0pYCk7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5PFQgfCB1bmRlZmluZWQ+KG9wdHMuY2FwYWNpdHkpO1xuICAgIHRoaXMucG9saWN5ID0gb3B0cy5wb2xpY3k7XG4gICAgdGhpcy5zYW1wbGVFdmVyeSA9IHNhbXBsZUV2ZXJ5O1xuICB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudDtcbiAgfVxuXG4gIGdldCBjYXBhY2l0eSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gIH1cblxuICAvKiogTGlmZXRpbWUgY291bnRlcnMg4oCUIHNlZSB7QGxpbmsgUmluZ0NvdW50ZXJzfS4gKi9cbiAgZ2V0Q291bnRlcnMoKTogUmluZ0NvdW50ZXJzIHtcbiAgICByZXR1cm4geyBwdXNoZXM6IHRoaXMucHVzaGVzLCBkZWxpdmVyZWQ6IHRoaXMuZGVsaXZlcmVkLCBkcm9wczogdGhpcy5kcm9wcywgcmVqZWN0aW9uczogdGhpcy5yZWplY3Rpb25zIH07XG4gIH1cblxuICAvKiogQWRtaXQsIGV2aWN0LWFuZC1hZG1pdCwgcmVmdXNlLCBvciBzYW1wbGUgcGVyIHBvbGljeSDigJQgbmV2ZXIgdGhyb3dzLiAqL1xuICBwdXNoKGl0ZW06IFQpOiBSaW5nUHVzaFJlc3VsdDxUPiB7XG4gICAgdGhpcy5wdXNoZXMgKz0gMTtcblxuICAgIGlmICh0aGlzLmNvdW50IDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNhdHVyYXRlZEFycml2YWxzID0gMDsgLy8gbmV3IHNhdHVyYXRpb24gZXBpc29kZSBzdGFydHMgZnJlc2hcbiAgICAgIHRoaXMuc3RvcmUoaXRlbSk7XG4gICAgICByZXR1cm4geyBhY2NlcHRlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGljeSA9PT0gJ2Jsb2NrJykge1xuICAgICAgdGhpcy5yZWplY3Rpb25zICs9IDE7XG4gICAgICByZXR1cm4geyBhY2NlcHRlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb2xpY3kgPT09ICdzYW1wbGUnKSB7XG4gICAgICB0aGlzLnNhdHVyYXRlZEFycml2YWxzICs9IDE7XG4gICAgICBpZiAodGhpcy5zYXR1cmF0ZWRBcnJpdmFscyAlIHRoaXMuc2FtcGxlRXZlcnkgIT09IDApIHtcbiAgICAgICAgdGhpcy5kcm9wcyArPSAxOyAvLyB0aGUgaW5jb21pbmcgaXRlbSBpcyBzYW1wbGVkIG91dCDigJQgbG9zdFxuICAgICAgICByZXR1cm4geyBhY2NlcHRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSAxLWluLU4gYWRtaXNzaW9uIGZhbGxzIHRocm91Z2ggdG8gZXZpY3QtYW5kLXN0b3JlLlxuICAgIH1cblxuICAgIC8vICdkcm9wLW9sZGVzdCcgKGFuZCB0aGUgJ3NhbXBsZScgYWRtaXNzaW9uKTogZXZpY3QgdGhlIG9sZGVzdCDigJQgbG9zdC5cbiAgICBjb25zdCBldmljdGVkID0gdGhpcy5idWZmZXJbdGhpcy5oZWFkXSBhcyBUO1xuICAgIHRoaXMuYnVmZmVyW3RoaXMuaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oZWFkID0gKHRoaXMuaGVhZCArIDEpICUgdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgIHRoaXMuY291bnQgLT0gMTtcbiAgICB0aGlzLmRyb3BzICs9IDE7XG4gICAgdGhpcy5zdG9yZShpdGVtKTtcbiAgICByZXR1cm4geyBhY2NlcHRlZDogdHJ1ZSwgZXZpY3RlZCB9O1xuICB9XG5cbiAgLyoqIFBvcCB0aGUgb2xkZXN0IHF1ZXVlZCBpdGVtIChGSUZPKS4gYHVuZGVmaW5lZGAgd2hlbiBlbXB0eS4gKi9cbiAgc2hpZnQoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY291bnQgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuYnVmZmVyW3RoaXMuaGVhZF0gYXMgVDtcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLmhlYWRdID0gdW5kZWZpbmVkOyAvLyByZWxlYXNlIHRoZSByZWZlcmVuY2UgZm9yIEdDXG4gICAgdGhpcy5oZWFkID0gKHRoaXMuaGVhZCArIDEpICUgdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgIHRoaXMuY291bnQgLT0gMTtcbiAgICB0aGlzLmRlbGl2ZXJlZCArPSAxO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yZShpdGVtOiBUKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJbKHRoaXMuaGVhZCArIHRoaXMuY291bnQpICUgdGhpcy5idWZmZXIubGVuZ3RoXSA9IGl0ZW07XG4gICAgdGhpcy5jb3VudCArPSAxO1xuICB9XG59XG4iXX0=
@@ -100,7 +100,7 @@ export function isFlowEvent(event) {
100
100
  * in sync with the interface. If a method is added to `ScopeRecorder`, adding it
101
101
  * here is the ONLY change required to route combined-recorders correctly.
102
102
  */
103
- const RECORDER_EVENT_METHODS = [
103
+ export const RECORDER_EVENT_METHODS = [
104
104
  'onRead',
105
105
  'onWrite',
106
106
  'onCommit',
@@ -120,7 +120,7 @@ const RECORDER_EVENT_METHODS = [
120
120
  * care about the distinction discriminate with `isFlowEvent()` (explicit
121
121
  * `channel` discriminant, legacy pipelineId-absence fallback).
122
122
  */
123
- const FLOW_RECORDER_EVENT_METHODS = [
123
+ export const FLOW_RECORDER_EVENT_METHODS = [
124
124
  'onStageExecuted',
125
125
  'onNext',
126
126
  'onDecision',
@@ -147,7 +147,7 @@ const FLOW_RECORDER_EVENT_METHODS = [
147
147
  * interface. Same convention as the other two arrays above — kept as
148
148
  * the single source of truth for duck-type detection.
149
149
  */
150
- const EMIT_RECORDER_EVENT_METHODS = ['onEmit'];
150
+ export const EMIT_RECORDER_EVENT_METHODS = ['onEmit'];
151
151
  /**
152
152
  * True iff the recorder declares a method named `m` either as an own
153
153
  * property OR on its class-prototype chain — but NOT inherited from
@@ -225,4 +225,4 @@ export function hasFlowRecorderMethods(r) {
225
225
  export function hasEmitRecorderMethods(r) {
226
226
  return EMIT_RECORDER_EVENT_METHODS.some((m) => hasOwnOrClassMethod(r, m));
227
227
  }
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQXFGSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQVE7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxNQUFNLENBQUMsR0FBRyxLQUFnQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QyxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRztJQUNsQyxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1Ysc0VBQXNFO0lBQ3RFLDREQUE0RDtJQUM1RCx1RUFBdUU7SUFDdkUscUVBQXFFO0lBQ3JFLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtDQUNMLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLFFBQVEsQ0FBVSxDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxDQUFVLEVBQUUsQ0FBUztJQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sT0FBUSxDQUE2QixDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7UUFDckUsQ0FBQztRQUNELEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBbUI7SUFDcEQsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsQ0FBbUI7SUFDeEQsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZFJlY29yZGVyIOKAlCBhIHNpbmdsZSBvYnNlcnZlciB0aGF0IGNhbiBob29rIGludG8gTVVMVElQTEUgZXZlbnRcbiAqIHN0cmVhbXMgKGN1cnJlbnRseTogc2NvcGUgZGF0YS1mbG93ICsgY29udHJvbC1mbG93KS4gT25lIG9iamVjdCwgb25lIGBpZGAsXG4gKiBvbmUgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBleGVjdXRpb24uXG4gKlxuICogIyMgV2h5IHRoaXMgZXhpc3RzXG4gKlxuICogQmVmb3JlIGBDb21iaW5lZFJlY29yZGVyYCwgYSBjb25zdW1lciB3aG8gd2FudGVkIHRvIG9ic2VydmUgYm90aCBzdHJlYW1zXG4gKiBoYWQgdG86XG4gKiAgIDEuIEltcGxlbWVudCBib3RoIGBTY29wZVJlY29yZGVyYCAoOCBtZXRob2RzKSBhbmQgYEZsb3dSZWNvcmRlcmAgKDEyIG1ldGhvZHMpXG4gKiAgICAgIGZ1bGx5IOKAlCBzdHViYmluZyBldmVyeSBldmVudCB0aGV5IGRpZG4ndCBjYXJlIGFib3V0LlxuICogICAyLiBSZW1lbWJlciB0byBjYWxsIEJPVEggYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIEFORCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYC5cbiAqICAgICAgRm9yZ2V0dGluZyB0aGUgc2Vjb25kIGNhbGwgc2lsZW50bHkgZHJvcHBlZCBoYWxmIHRoZWlyIGV2ZW50cyDigJQgbm9cbiAqICAgICAgd2FybmluZywgbm8gcnVudGltZSBlcnJvci5cbiAqICAgMy4gUmUtaW1wbGVtZW50IGNvb3JkaW5hdGlvbiBsb2dpYyAoYnVmZmVyaW5nLCBvcmRlcmluZykgdGhlbXNlbHZlcy5cbiAqXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgY29sbGFwc2VzIHRoYXQgaW50byBhIHNpbmdsZSB0eXBlIGFuZCBhIHNpbmdsZSBhdHRhY2hcbiAqIGNhbGwgKGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCksIHdpdGggdGhlIGxpYnJhcnkgaGFuZGxpbmcgdGhlXG4gKiByb3V0aW5nIGludGVybmFsbHkuIENvbnN1bWVycyBpbXBsZW1lbnQgb25seSB0aGUgZXZlbnRzIHRoZXkgY2FyZSBhYm91dFxuICogKGBQYXJ0aWFsPC4uLj5gKSBhbmQgdGhlIGF0dGFjaCBtZXRob2QgZHVjay10eXBlcyBhdCBydW50aW1lIHRvIGRpc3BhdGNoXG4gKiB0byB0aGUgcmVsZXZhbnQgY2hhbm5lbHMuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgaXMgYWRkZWQgKGUuZy4gYW4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZVxuICogYENvbWJpbmVkUmVjb3JkZXJgIHR5cGUgZ2FpbnMgYW4gYCYgUGFydGlhbDxPcGVyYXRpb25SZWNvcmRlcj5gIGNsYXVzZSBhbmRcbiAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCBnYWlucyBvbmUgbW9yZSBydW50aW1lIGJyYW5jaCBpbiBpdHMgZGlzcGF0Y2guXG4gKiBDb25zdW1lcnMgd3JpdGluZyBhIGBDb21iaW5lZFJlY29yZGVyYCB0b2RheSBhcmUgTk9UIGFmZmVjdGVkIOKAlCB0aGVpclxuICogY29kZSBrZWVwcyBjb21waWxpbmcgYW5kIGF0dGFjaGluZyBjb3JyZWN0bHksIGJlY2F1c2UgZXZlcnkgbmV3IGxheWVyIGlzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMnO1xuICpcbiAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICogICBpZDogJ2F1ZGl0JyxcbiAqICAgb25Xcml0ZTogKGUpID0+IGxvZ1dyaXRlKGUua2V5LCBlLnZhbHVlKSwgICAgICAgIC8vIFNjb3BlUmVjb3JkZXIgbWV0aG9kXG4gKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2dEZWNpc2lvbihlLmNob3NlbiksICAgICAgICAvLyBGbG93UmVjb3JkZXIgbWV0aG9kXG4gKiB9O1xuICpcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICogLy8gXiBpbnRlcm5hbGx5OiBkZXRlY3RzIGJvdGggc2V0cyBvZiBtZXRob2RzLCByb3V0ZXMgdG8gYm90aCBjaGFubmVscy5cbiAqIGBgYFxuICpcbiAqICMjIENvbnRyYWN0IHdpdGggZXhpc3RpbmcgQVBJc1xuICpcbiAqIC0gYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYCByZW1haW4gdW5jaGFuZ2VkLlxuICogICBDb25zdW1lcnMgd2hvIHdhbnQgb25seSBPTkUgY2hhbm5lbCBrZWVwIHVzaW5nIHRoZW0g4oCUIGV4cGxpY2l0IGlzIGdvb2QuXG4gKiAtIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCBpcyB0aGUgT05MWSB3YXkgdG8gZ3VhcmFudGVlIGFuIG9iamVjdCBpc1xuICogICBob29rZWQgaW50byBldmVyeSBzdHJlYW0gaXQgaGFzIG1ldGhvZHMgZm9yLCB3aXRob3V0IG1haW50YWluaW5nIHR3b1xuICogICBhdHRhY2ggY2FsbHMgYXQgdGhlIGNhbGwgc2l0ZS5cbiAqIC0gSWRlbXBvdGVuY3kgYnkgYGlkYCBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGNoYW5uZWxzOiByZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAqICAgc2FtZSBgaWRgIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvbiBCT1RIIGNoYW5uZWxzLCBub3QganVzdCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93RXJyb3JFdmVudCwgRmxvd1BhdXNlRXZlbnQsIEZsb3dSZWNvcmRlciwgRmxvd1Jlc3VtZUV2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlc3VtZUV2ZW50LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIHRoYXQgYXBwZWFyIG9uIEJPVEggYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBidXQgd2l0aFxuICogZGlmZmVyZW50IGV2ZW50IHBheWxvYWQgdHlwZXMuIEZvciB0aGVzZSwgYSBgQ29tYmluZWRSZWNvcmRlcmAgZGVjbGFyZXNcbiAqIE9ORSBoYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIHVuaW9uIG9mIGJvdGggcGF5bG9hZHMg4oCUIGNvbnN1bWVyc1xuICogZGlzY3JpbWluYXRlIHdpdGggdGhlIGV4cG9ydGVkIGBpc0Zsb3dFdmVudCgpYCBoZWxwZXIgKGV4cGxpY2l0IGBjaGFubmVsYFxuICogZGlzY3JpbWluYW50LCB3aXRoIGEgbGVnYWN5IHBpcGVsaW5lSWQtYWJzZW5jZSBmYWxsYmFjaykuXG4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCA9ICdvbkVycm9yJyB8ICdvblBhdXNlJyB8ICdvblJlc3VtZSc7XG5cbi8qKiBMaWZlY3ljbGUgaG9va3MgKG5vdCBldmVudC1zcGVjaWZpYykgdGhhdCBib3RoIGludGVyZmFjZXMgc2hhcmUgaWRlbnRpY2FsbHkuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZSA9ICdpZCcgfCAnY2xlYXInIHwgJ3RvU25hcHNob3QnO1xuXG4vKipcbiAqIEEgcmVjb3JkZXIgdGhhdCBNQVkgb2JzZXJ2ZSBhbnkgY29tYmluYXRpb24gb2Ygc3VwcG9ydGVkIGV2ZW50IHN0cmVhbXMuXG4gKlxuICogVG9kYXkncyBzdHJlYW1zOlxuICogICAtIFNjb3BlIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgOiBvblJlYWQvb25Xcml0ZS9vbkNvbW1pdC9vblN0YWdlU3RhcnQv4oCmKVxuICogICAtIENvbnRyb2wtZmxvdyAoYEZsb3dSZWNvcmRlcmA6IG9uRGVjaXNpb24vb25TdWJmbG93RW50cnkvb25Mb29wL+KApilcbiAqXG4gKiBBbGwgZXZlbnQgaGFuZGxlcnMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LlxuICogYGlkYCBpcyByZXF1aXJlZCBzbyB0aGUgbGlicmFyeSBjYW4gZGVkdXBsaWNhdGUgcmUtYXR0YWNoZXMuXG4gKlxuICogIyMgU2hhcmVkIG1ldGhvZCBuYW1lcyAob25FcnJvciAvIG9uUGF1c2UgLyBvblJlc3VtZSlcbiAqXG4gKiBCb3RoIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgZGVjbGFyZSB0aGVzZSB3aXRoIERJRkZFUkVOVCBwYXlsb2FkXG4gKiBzaGFwZXMuIEluIGEgY29tYmluZWQgcmVjb3JkZXIsIGVhY2ggc3VjaCBoYW5kbGVyIGlzIGNhbGxlZCBieSBCT1RIXG4gKiBjaGFubmVscyB3aXRoIGl0cyBvd24gdmFyaWFudC4gVGhlIHBhcmFtZXRlciB0eXBlIGlzIGEgdW5pb24g4oCUIGNvbnN1bWVyc1xuICogY2FuIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cyB1bmlmb3JtbHksIG9yIGRpc2NyaW1pbmF0ZSB3aXRoXG4gKiBgaXNGbG93RXZlbnQoKWAgKGV4cGxpY2l0IGBjaGFubmVsYCBkaXNjcmltaW5hbnQgc3RhbXBlZCBieSB0aGUgZW5naW5lKS5cbiAqXG4gKiAjIyBGb3J3YXJkIGNvbXBhdGliaWxpdHlcbiAqXG4gKiBXaGVuIGEgdGhpcmQgb2JzZXJ2ZXIgdHlwZSBzaGlwcyAoZS5nLiBgT3BlcmF0aW9uUmVjb3JkZXJgKSwgdGhlIHR5cGVcbiAqIGdhaW5zIGFub3RoZXIgYCYgUGFydGlhbDzigKY+YCBjbGF1c2UuIEJlY2F1c2UgZXZlcnkgY2xhdXNlIGlzIGBQYXJ0aWFsYCxcbiAqIGV4aXN0aW5nIGBDb21iaW5lZFJlY29yZGVyYCBpbXBsZW1lbnRhdGlvbnMgcmVtYWluIHR5cGUtdmFsaWQuXG4gKi9cbmV4cG9ydCB0eXBlIENvbWJpbmVkUmVjb3JkZXIgPSBQYXJ0aWFsPE9taXQ8U2NvcGVSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgUGFydGlhbDxPbWl0PEZsb3dSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgLy8gRW1pdCBjaGFubmVsIOKAlCBuZXcgdGhpcmQgc3RyZWFtIChQaGFzZSAzKS4gTm8gbWV0aG9kLW5hbWUgb3ZlcmxhcCB3aXRoXG4gIC8vIHRoZSBvdGhlciB0d28gaW50ZXJmYWNlcywgc28gYSBwbGFpbiBpbnRlcnNlY3Rpb24gaXMgc291bmQg4oCUIG5vXG4gIC8vIHVuaW9uLXBheWxvYWQgZGlzY3JpbWluYXRvciBuZWVkZWQuXG4gIFBhcnRpYWw8T21pdDxFbWl0UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZT4+ICYge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvLyBTaGFyZWQgbGlmZWN5Y2xlIGhvb2tzIOKAlCBzYW1lIG9uIGJvdGggaW50ZXJmYWNlcywgc2hhcGUgY29tcGF0aWJsZS5cbiAgICBjbGVhcj8oKTogdm9pZDtcbiAgICB0b1NuYXBzaG90PygpOiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gICAgICBkYXRhOiB1bmtub3duO1xuICAgIH07XG5cbiAgICAvLyBTaGFyZWQgZXZlbnQgbWV0aG9kIG5hbWVzIHdpdGggRElWRVJHRU5UIHBheWxvYWRzIOKAlCBkZWNsYXJlZCBhcyB1bmlvbnMuXG4gICAgLy8gQ29uc3VtZXJzIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cywgb3IgZGlzY3JpbWluYXRlIHVzaW5nIHRoZVxuICAgIC8vIGV4cG9ydGVkIGhlbHBlciBgaXNGbG93RXZlbnQoKWAgKHdoaWNoIGNoZWNrcyB0aGUgZXhwbGljaXQgYGNoYW5uZWxgXG4gICAgLy8gZGlzY3JpbWluYW50IHN0YW1wZWQgYnkgdGhlIGVuZ2luZSwgZmFsbGluZyBiYWNrIHRvIHBpcGVsaW5lSWRcbiAgICAvLyBhYnNlbmNlIGZvciB1bnN0YW1wZWQgZXZlbnRzKS5cbiAgICAvL1xuICAgIC8vIEBleGFtcGxlXG4gICAgLy8gYGBgdHNcbiAgICAvLyBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICAvLyAgIGlkOiAnYXVkaXQnLFxuICAgIC8vICAgb25FcnJvcjogKGUpID0+IHtcbiAgICAvLyAgICAgaWYgKGlzRmxvd0V2ZW50KGUpKSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBGbG93RXJyb3JFdmVudCDigJQgaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gICAgLy8gICAgICAgbG9nKCdmbG93IGVycm9yIGluIHN0YWdlJywgZS5zdGFnZU5hbWUpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRXJyb3JFdmVudCDigJQgaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAgICAvLyAgICAgICBsb2coJ3Njb3BlIGVycm9yIGR1cmluZycsIGUub3BlcmF0aW9uLCBlLmVycm9yLm1lc3NhZ2UpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH07XG4gICAgLy8gYGBgXG4gICAgb25FcnJvcj8oZXZlbnQ6IEVycm9yRXZlbnQgfCBGbG93RXJyb3JFdmVudCk6IHZvaWQ7XG4gICAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQgfCBGbG93UGF1c2VFdmVudCk6IHZvaWQ7XG4gICAgb25SZXN1bWU/KGV2ZW50OiBSZXN1bWVFdmVudCB8IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQ7XG4gIH07XG5cbi8qKlxuICogRGlzY3JpbWluYXRvciBmb3IgdGhlIHVuaW9uIHBheWxvYWQgdHlwZXMgb24gYENvbWJpbmVkUmVjb3JkZXJgJ3Mgc2hhcmVkXG4gKiBtZXRob2RzIChgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCkuIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudFxuICogd2FzIGVtaXR0ZWQgZnJvbSB0aGUgY29udHJvbC1mbG93IGNoYW5uZWwgKEZsb3dSZWNvcmRlcikuXG4gKlxuICogIyMgSG93IGl0IGRpc2NyaW1pbmF0ZXNcbiAqXG4gKiAxLiAqKkV4cGxpY2l0IGBjaGFubmVsYCBmaWVsZCBmaXJzdCoqIChiYWNrbG9nIEIzKTogZXZlcnkgZW5naW5lLWRpc3BhdGNoZWRcbiAqICAgIHNoYXJlZC1tZXRob2QgZXZlbnQgaXMgc3RhbXBlZCBgY2hhbm5lbDogJ2Zsb3cnYCAoY29udHJvbC1mbG93KSBvclxuICogICAgYGNoYW5uZWw6ICdzY29wZSdgIChkYXRhLWZsb3cpIGF0IGNvbnN0cnVjdGlvbi4gVGhpcyBpcyB0aGUgcG9zaXRpdmUsXG4gKiAgICBzY2hlbWEtcm9idXN0IHNpZ25hbCDigJQgaXQgc3Vydml2ZXMgd3JhcHBlcnMgdGhhdCBhZGQvc3RyaXAgZmllbGRzLlxuICogMi4gKipMZWdhY3kgZmFsbGJhY2sqKiBmb3IgdW5zdGFtcGVkIGV2ZW50cyAoY29uc3VtZXItZmFicmljYXRlZCB0ZXN0cyxcbiAqICAgIHBlcnNpc3RlZCB0cmFjZXMgZnJvbSA8OS4yKTogc2NvcGUtY2hhbm5lbCBldmVudHMgZXh0ZW5kXG4gKiAgICBgUmVjb3JkZXJDb250ZXh0YCwgd2hpY2ggY2FycmllcyBgcGlwZWxpbmVJZGA7IGZsb3ctY2hhbm5lbCBldmVudHMgZG9cbiAqICAgIG5vdC4gVGhlIGZsb3cgdmFyaWFudCBpcyBkZXRlY3RlZCBieSB0aGUgQUJTRU5DRSBvZiBgcGlwZWxpbmVJZGAg4oCUXG4gKiAgICBzY2hlbWEtc3RhYmxlIGFzIGxvbmcgYXMgc2NvcGUgZXZlbnRzIGNvbnRpbnVlIHRvIGV4dGVuZFxuICogICAgYFJlY29yZGVyQ29udGV4dGAsIGJ1dCBmcmFnaWxlIGFnYWluc3QgZmllbGQtc3RyaXBwaW5nIHdyYXBwZXJzLCB3aGljaFxuICogICAgaXMgd2h5IHRoZSBleHBsaWNpdCBkaXNjcmltaW5hbnQgbm93IGV4aXN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG9uRXJyb3I6IChlKSA9PiB7XG4gKiAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEZsb3dFcnJvckV2ZW50OiBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAqICAgfSBlbHNlIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBFcnJvckV2ZW50OiBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd0V2ZW50PFQ+KGV2ZW50OiBUKTogZXZlbnQgaXMgRXhjbHVkZTxULCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB9PiB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGUgPSBldmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGUuY2hhbm5lbCA9PT0gJ2Zsb3cnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGUuY2hhbm5lbCA9PT0gJ3Njb3BlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZS5waXBlbGluZUlkID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYFNjb3BlUmVjb3JkZXJgIChkYXRhLWZsb3cpIGludGVyZmFjZS5cbiAqIEtlcHQgYXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNvIHRoZSBydW50aW1lIGR1Y2stdHlwZSBkZXRlY3RvciBzdGF5c1xuICogaW4gc3luYyB3aXRoIHRoZSBpbnRlcmZhY2UuIElmIGEgbWV0aG9kIGlzIGFkZGVkIHRvIGBTY29wZVJlY29yZGVyYCwgYWRkaW5nIGl0XG4gKiBoZXJlIGlzIHRoZSBPTkxZIGNoYW5nZSByZXF1aXJlZCB0byByb3V0ZSBjb21iaW5lZC1yZWNvcmRlcnMgY29ycmVjdGx5LlxuICovXG5jb25zdCBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25SZWFkJyxcbiAgJ29uV3JpdGUnLFxuICAnb25Db21taXQnLFxuICAnb25FcnJvcicsXG4gICdvblN0YWdlU3RhcnQnLFxuICAnb25TdGFnZUVuZCcsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYEZsb3dSZWNvcmRlcmAgKGNvbnRyb2wtZmxvdykgaW50ZXJmYWNlLlxuICogU2VlIHRoZSBub3RlIG9uIGBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTYC5cbiAqXG4gKiBOT1RFOiB0aGUgYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWAgbWV0aG9kcyBleGlzdCBvbiBCT1RIIGludGVyZmFjZXNcbiAqIHdpdGggRElGRkVSRU5UIGV2ZW50IHBheWxvYWQgc2hhcGVzLiBBIGBDb21iaW5lZFJlY29yZGVyYCB0aGF0IGltcGxlbWVudHNcbiAqIGFueSBvZiB0aGVzZSByZWNlaXZlcyBib3RoIHZhcmlhbnRzIChvbmUgZnJvbSBlYWNoIGNoYW5uZWwpLiBDb25zdW1lcnMgd2hvXG4gKiBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbiBkaXNjcmltaW5hdGUgd2l0aCBgaXNGbG93RXZlbnQoKWAgKGV4cGxpY2l0XG4gKiBgY2hhbm5lbGAgZGlzY3JpbWluYW50LCBsZWdhY3kgcGlwZWxpbmVJZC1hYnNlbmNlIGZhbGxiYWNrKS5cbiAqL1xuY29uc3QgRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25TdGFnZUV4ZWN1dGVkJyxcbiAgJ29uTmV4dCcsXG4gICdvbkRlY2lzaW9uJyxcbiAgJ29uRm9yaycsXG4gICdvblNlbGVjdGVkJyxcbiAgJ29uU3ViZmxvd0VudHJ5JyxcbiAgJ29uU3ViZmxvd0V4aXQnLFxuICAnb25TdWJmbG93UmVnaXN0ZXJlZCcsXG4gICdvbkxvb3AnLFxuICAnb25CcmVhaycsXG4gICdvbkVycm9yJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuICAvLyBSdW4tYm91bmRhcnkgbWV0aG9kcyDigJQgaW5jbHVkZWQgc28gYSByZWNvcmRlciB3aG9zZSBPTkxZIGV2ZW50IGhvb2tcbiAgLy8gaXMgYSBydW4gYm91bmRhcnkgKGUuZy4gYW4gZXJyb3IgYnJpZGdlIGltcGxlbWVudGluZyBqdXN0XG4gIC8vIGBvblJ1bkZhaWxlZGApIGlzIHN0aWxsIGRldGVjdGVkIGFzIGEgRmxvd1JlY29yZGVyIGFuZCByb3V0ZWQgdG8gdGhlXG4gIC8vIGZsb3cgY2hhbm5lbC4gUHJldmlvdXNseSBhIHJ1bi1vbmx5IHJlY29yZGVyIHdhcyBzaWxlbnRseSBkcm9wcGVkLlxuICAnb25SdW5TdGFydCcsXG4gICdvblJ1bkVuZCcsXG4gICdvblJ1bkZhaWxlZCcsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBFbWl0UmVjb3JkZXJgICh1c2VyLWVtaXR0ZWQgZXZlbnRzKVxuICogaW50ZXJmYWNlLiBTYW1lIGNvbnZlbnRpb24gYXMgdGhlIG90aGVyIHR3byBhcnJheXMgYWJvdmUg4oCUIGtlcHQgYXNcbiAqIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkdWNrLXR5cGUgZGV0ZWN0aW9uLlxuICovXG5jb25zdCBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbJ29uRW1pdCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBkZWNsYXJlcyBhIG1ldGhvZCBuYW1lZCBgbWAgZWl0aGVyIGFzIGFuIG93blxuICogcHJvcGVydHkgT1Igb24gaXRzIGNsYXNzLXByb3RvdHlwZSBjaGFpbiDigJQgYnV0IE5PVCBpbmhlcml0ZWQgZnJvbVxuICogYE9iamVjdC5wcm90b3R5cGVgLlxuICpcbiAqICMjIFdoeSB0aGlzIGxheWVyZWQgY2hlY2tcbiAqXG4gKiBBIGBDb21iaW5lZFJlY29yZGVyYCBjYW4gYmUgZWl0aGVyIGEgcGxhaW4gb2JqZWN0IGxpdGVyYWwgKGhhbmRsZXJzIGFzXG4gKiBvd24gcHJvcGVydGllcykgT1IgYSBjbGFzcyBpbnN0YW5jZSAoaGFuZGxlcnMgYXMgY2xhc3MtcHJvdG90eXBlXG4gKiBtZXRob2RzKS4gQm90aCBhcmUgbGVnaXRpbWF0ZSBjb25zdW1lciBwYXR0ZXJucyBhbmQgYm90aCBNVVNUIGF0dGFjaC5cbiAqXG4gKiBCdXQgaGFuZGxlcnMgaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBBTFdBWVMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIChub2JvZHkgbGVnaXRpbWF0ZWx5IGF0dGFjaGVzIHJlY29yZGVyIG1ldGhvZHMgdGhlcmUpLiBTbyB3ZVxuICogd2FsayB0aGUgcHJvdG90eXBlIGNoYWluLCBTVE9QUElORyBiZWZvcmUgYE9iamVjdC5wcm90b3R5cGVgLiBUaGlzXG4gKiBhY2NlcHRzIGNsYXNzIG1ldGhvZHMgd2hpbGUgc3RpbGwgYmxvY2tpbmcgYE9iamVjdC5wcm90b3R5cGVgXG4gKiBwb2xsdXRpb24gYXR0YWNrcy5cbiAqL1xuZnVuY3Rpb24gaGFzT3duT3JDbGFzc01ldGhvZChyOiB1bmtub3duLCBtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHIgPT09IG51bGwgfHwgdHlwZW9mIHIgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbSkpIHtcbiAgICByZXR1cm4gdHlwZW9mIChyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuICBsZXQgcHJvdG86IHVua25vd24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIG0pKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIChwcm90byBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGRhdGEtZmxvdyBldmVudCBtZXRob2QuXG4gKiBVc2VkIGJ5IGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0byBkZWNpZGUgd2hldGhlciB0byBob29rIGludG9cbiAqIHRoZSBzY29wZSBkYXRhLWZsb3cgY2hhbm5lbC5cbiAqXG4gKiAjIyBEZXRlY3Rpb24gcnVsZVxuICpcbiAqIEFjY2VwdHMgYm90aCBvYmplY3QtbGl0ZXJhbCByZWNvcmRlcnMgKG93bi1wcm9wZXJ0eSBoYW5kbGVycykgQU5EIGNsYXNzXG4gKiBpbnN0YW5jZXMgKGhhbmRsZXJzIGRlY2xhcmVkIG9uIHRoZSBjbGFzcyBwcm90b3R5cGUpLiBSZWplY3RzIGhhbmRsZXJzXG4gKiBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAg4oCUIHRoYXQncyBhbHdheXMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIHBvbGx1dGlvbiwgbmV2ZXIgYSBsZWdpdGltYXRlIHJlY29yZGVyLlxuICpcbiAqICMjIExpZmVjeWNsZSBleGNsdXNpb25zXG4gKlxuICogYGNsZWFyYCBhbmQgYHRvU25hcHNob3RgIGFyZSBOT1QgY291bnRlZCBhcyBldmVudCBtZXRob2RzIOKAlCBhIHJlY29yZGVyXG4gKiB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aG9zZSBoYXMgbm90aGluZyB0byBvYnNlcnZlIGFuZCB3b3VsZCBiZSBhIG5vLW9wXG4gKiBvbiBlaXRoZXIgY2hhbm5lbC5cbiAqXG4gKiAjIyBSZXR1cm4gdHlwZVxuICpcbiAqIFJldHVybnMgcGxhaW4gYGJvb2xlYW5gIChub3QgYSB0eXBlIHByZWRpY2F0ZSkuIFRoZSBmdWxsIGBTY29wZVJlY29yZGVyYFxuICogaW50ZXJmYWNlIGhhcyBwYXlsb2FkIHR5cGVzIHRoYXQgZGl2ZXJnZSBmcm9tIGBDb21iaW5lZFJlY29yZGVyYCdzIHVuaW9uXG4gKiB2YXJpYW50cyBmb3Igc2hhcmVkIG1ldGhvZHMsIHNvIGEgbmFycm93aW5nIHByZWRpY2F0ZSB3b3VsZCBiZSB1bnNvdW5kLlxuICogQ2FsbGVycyB0aGF0IG5lZWQgdG8gdHJlYXQgdGhlIHJlY29yZGVyIGFzIGEgYFNjb3BlUmVjb3JkZXJgIGRvIHNvIGV4cGxpY2l0bHlcbiAqIGF0IHRoZSBhdHRhY2ggc2l0ZSDigJQgdGhlIGNhc3QgaXMgdGhlIGNvbnRyYWN0IHRoYXQgZWFjaCBjaGFubmVsIHBhc3Nlc1xuICogaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgY29udHJvbC1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBlbWl0LWNoYW5uZWwgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgIGZvciB0aGUgb3duZXJzaGlwLWRldGVjdGlvbiBydWxlcyAob3duIG9yXG4gKiBjbGFzcy1wcm90b3R5cGUgbWV0aG9kcyBjb3VudDsgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBkb2VzIG5vdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cbiJdfQ==
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQWtHSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQVE7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxNQUFNLENBQUMsR0FBRyxLQUFnQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QyxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFNBQVM7SUFDVCxVQUFVO0NBQ0YsQ0FBQztBQUVYOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHO0lBQ3pDLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixzRUFBc0U7SUFDdEUsNERBQTREO0lBQzVELHVFQUF1RTtJQUN2RSxxRUFBcUU7SUFDckUsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0NBQ0wsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLFFBQVEsQ0FBVSxDQUFDO0FBRS9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxDQUFVLEVBQUUsQ0FBUztJQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sT0FBUSxDQUE2QixDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7UUFDckUsQ0FBQztRQUNELEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBbUI7SUFDcEQsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsQ0FBbUI7SUFDeEQsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZFJlY29yZGVyIOKAlCBhIHNpbmdsZSBvYnNlcnZlciB0aGF0IGNhbiBob29rIGludG8gTVVMVElQTEUgZXZlbnRcbiAqIHN0cmVhbXMgKGN1cnJlbnRseTogc2NvcGUgZGF0YS1mbG93ICsgY29udHJvbC1mbG93KS4gT25lIG9iamVjdCwgb25lIGBpZGAsXG4gKiBvbmUgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBleGVjdXRpb24uXG4gKlxuICogIyMgV2h5IHRoaXMgZXhpc3RzXG4gKlxuICogQmVmb3JlIGBDb21iaW5lZFJlY29yZGVyYCwgYSBjb25zdW1lciB3aG8gd2FudGVkIHRvIG9ic2VydmUgYm90aCBzdHJlYW1zXG4gKiBoYWQgdG86XG4gKiAgIDEuIEltcGxlbWVudCBib3RoIGBTY29wZVJlY29yZGVyYCAoOCBtZXRob2RzKSBhbmQgYEZsb3dSZWNvcmRlcmAgKDEyIG1ldGhvZHMpXG4gKiAgICAgIGZ1bGx5IOKAlCBzdHViYmluZyBldmVyeSBldmVudCB0aGV5IGRpZG4ndCBjYXJlIGFib3V0LlxuICogICAyLiBSZW1lbWJlciB0byBjYWxsIEJPVEggYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIEFORCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYC5cbiAqICAgICAgRm9yZ2V0dGluZyB0aGUgc2Vjb25kIGNhbGwgc2lsZW50bHkgZHJvcHBlZCBoYWxmIHRoZWlyIGV2ZW50cyDigJQgbm9cbiAqICAgICAgd2FybmluZywgbm8gcnVudGltZSBlcnJvci5cbiAqICAgMy4gUmUtaW1wbGVtZW50IGNvb3JkaW5hdGlvbiBsb2dpYyAoYnVmZmVyaW5nLCBvcmRlcmluZykgdGhlbXNlbHZlcy5cbiAqXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgY29sbGFwc2VzIHRoYXQgaW50byBhIHNpbmdsZSB0eXBlIGFuZCBhIHNpbmdsZSBhdHRhY2hcbiAqIGNhbGwgKGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCksIHdpdGggdGhlIGxpYnJhcnkgaGFuZGxpbmcgdGhlXG4gKiByb3V0aW5nIGludGVybmFsbHkuIENvbnN1bWVycyBpbXBsZW1lbnQgb25seSB0aGUgZXZlbnRzIHRoZXkgY2FyZSBhYm91dFxuICogKGBQYXJ0aWFsPC4uLj5gKSBhbmQgdGhlIGF0dGFjaCBtZXRob2QgZHVjay10eXBlcyBhdCBydW50aW1lIHRvIGRpc3BhdGNoXG4gKiB0byB0aGUgcmVsZXZhbnQgY2hhbm5lbHMuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgaXMgYWRkZWQgKGUuZy4gYW4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZVxuICogYENvbWJpbmVkUmVjb3JkZXJgIHR5cGUgZ2FpbnMgYW4gYCYgUGFydGlhbDxPcGVyYXRpb25SZWNvcmRlcj5gIGNsYXVzZSBhbmRcbiAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCBnYWlucyBvbmUgbW9yZSBydW50aW1lIGJyYW5jaCBpbiBpdHMgZGlzcGF0Y2guXG4gKiBDb25zdW1lcnMgd3JpdGluZyBhIGBDb21iaW5lZFJlY29yZGVyYCB0b2RheSBhcmUgTk9UIGFmZmVjdGVkIOKAlCB0aGVpclxuICogY29kZSBrZWVwcyBjb21waWxpbmcgYW5kIGF0dGFjaGluZyBjb3JyZWN0bHksIGJlY2F1c2UgZXZlcnkgbmV3IGxheWVyIGlzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMnO1xuICpcbiAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICogICBpZDogJ2F1ZGl0JyxcbiAqICAgb25Xcml0ZTogKGUpID0+IGxvZ1dyaXRlKGUua2V5LCBlLnZhbHVlKSwgICAgICAgIC8vIFNjb3BlUmVjb3JkZXIgbWV0aG9kXG4gKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2dEZWNpc2lvbihlLmNob3NlbiksICAgICAgICAvLyBGbG93UmVjb3JkZXIgbWV0aG9kXG4gKiB9O1xuICpcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICogLy8gXiBpbnRlcm5hbGx5OiBkZXRlY3RzIGJvdGggc2V0cyBvZiBtZXRob2RzLCByb3V0ZXMgdG8gYm90aCBjaGFubmVscy5cbiAqIGBgYFxuICpcbiAqICMjIENvbnRyYWN0IHdpdGggZXhpc3RpbmcgQVBJc1xuICpcbiAqIC0gYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYCByZW1haW4gdW5jaGFuZ2VkLlxuICogICBDb25zdW1lcnMgd2hvIHdhbnQgb25seSBPTkUgY2hhbm5lbCBrZWVwIHVzaW5nIHRoZW0g4oCUIGV4cGxpY2l0IGlzIGdvb2QuXG4gKiAtIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCBpcyB0aGUgT05MWSB3YXkgdG8gZ3VhcmFudGVlIGFuIG9iamVjdCBpc1xuICogICBob29rZWQgaW50byBldmVyeSBzdHJlYW0gaXQgaGFzIG1ldGhvZHMgZm9yLCB3aXRob3V0IG1haW50YWluaW5nIHR3b1xuICogICBhdHRhY2ggY2FsbHMgYXQgdGhlIGNhbGwgc2l0ZS5cbiAqIC0gSWRlbXBvdGVuY3kgYnkgYGlkYCBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGNoYW5uZWxzOiByZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAqICAgc2FtZSBgaWRgIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvbiBCT1RIIGNoYW5uZWxzLCBub3QganVzdCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93RXJyb3JFdmVudCwgRmxvd1BhdXNlRXZlbnQsIEZsb3dSZWNvcmRlciwgRmxvd1Jlc3VtZUV2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlc3VtZUV2ZW50LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIHRoYXQgYXBwZWFyIG9uIEJPVEggYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBidXQgd2l0aFxuICogZGlmZmVyZW50IGV2ZW50IHBheWxvYWQgdHlwZXMuIEZvciB0aGVzZSwgYSBgQ29tYmluZWRSZWNvcmRlcmAgZGVjbGFyZXNcbiAqIE9ORSBoYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIHVuaW9uIG9mIGJvdGggcGF5bG9hZHMg4oCUIGNvbnN1bWVyc1xuICogZGlzY3JpbWluYXRlIHdpdGggdGhlIGV4cG9ydGVkIGBpc0Zsb3dFdmVudCgpYCBoZWxwZXIgKGV4cGxpY2l0IGBjaGFubmVsYFxuICogZGlzY3JpbWluYW50LCB3aXRoIGEgbGVnYWN5IHBpcGVsaW5lSWQtYWJzZW5jZSBmYWxsYmFjaykuXG4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCA9ICdvbkVycm9yJyB8ICdvblBhdXNlJyB8ICdvblJlc3VtZSc7XG5cbi8qKiBMaWZlY3ljbGUgaG9va3MgKG5vdCBldmVudC1zcGVjaWZpYykgdGhhdCBib3RoIGludGVyZmFjZXMgc2hhcmUgaWRlbnRpY2FsbHkuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZSA9ICdpZCcgfCAnY2xlYXInIHwgJ3RvU25hcHNob3QnO1xuXG4vKipcbiAqIEEgcmVjb3JkZXIgdGhhdCBNQVkgb2JzZXJ2ZSBhbnkgY29tYmluYXRpb24gb2Ygc3VwcG9ydGVkIGV2ZW50IHN0cmVhbXMuXG4gKlxuICogVG9kYXkncyBzdHJlYW1zOlxuICogICAtIFNjb3BlIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgOiBvblJlYWQvb25Xcml0ZS9vbkNvbW1pdC9vblN0YWdlU3RhcnQv4oCmKVxuICogICAtIENvbnRyb2wtZmxvdyAoYEZsb3dSZWNvcmRlcmA6IG9uRGVjaXNpb24vb25TdWJmbG93RW50cnkvb25Mb29wL+KApilcbiAqXG4gKiBBbGwgZXZlbnQgaGFuZGxlcnMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LlxuICogYGlkYCBpcyByZXF1aXJlZCBzbyB0aGUgbGlicmFyeSBjYW4gZGVkdXBsaWNhdGUgcmUtYXR0YWNoZXMuXG4gKlxuICogIyMgU2hhcmVkIG1ldGhvZCBuYW1lcyAob25FcnJvciAvIG9uUGF1c2UgLyBvblJlc3VtZSlcbiAqXG4gKiBCb3RoIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgZGVjbGFyZSB0aGVzZSB3aXRoIERJRkZFUkVOVCBwYXlsb2FkXG4gKiBzaGFwZXMuIEluIGEgY29tYmluZWQgcmVjb3JkZXIsIGVhY2ggc3VjaCBoYW5kbGVyIGlzIGNhbGxlZCBieSBCT1RIXG4gKiBjaGFubmVscyB3aXRoIGl0cyBvd24gdmFyaWFudC4gVGhlIHBhcmFtZXRlciB0eXBlIGlzIGEgdW5pb24g4oCUIGNvbnN1bWVyc1xuICogY2FuIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cyB1bmlmb3JtbHksIG9yIGRpc2NyaW1pbmF0ZSB3aXRoXG4gKiBgaXNGbG93RXZlbnQoKWAgKGV4cGxpY2l0IGBjaGFubmVsYCBkaXNjcmltaW5hbnQgc3RhbXBlZCBieSB0aGUgZW5naW5lKS5cbiAqXG4gKiAjIyBGb3J3YXJkIGNvbXBhdGliaWxpdHlcbiAqXG4gKiBXaGVuIGEgdGhpcmQgb2JzZXJ2ZXIgdHlwZSBzaGlwcyAoZS5nLiBgT3BlcmF0aW9uUmVjb3JkZXJgKSwgdGhlIHR5cGVcbiAqIGdhaW5zIGFub3RoZXIgYCYgUGFydGlhbDzigKY+YCBjbGF1c2UuIEJlY2F1c2UgZXZlcnkgY2xhdXNlIGlzIGBQYXJ0aWFsYCxcbiAqIGV4aXN0aW5nIGBDb21iaW5lZFJlY29yZGVyYCBpbXBsZW1lbnRhdGlvbnMgcmVtYWluIHR5cGUtdmFsaWQuXG4gKi9cbmV4cG9ydCB0eXBlIENvbWJpbmVkUmVjb3JkZXIgPSBQYXJ0aWFsPE9taXQ8U2NvcGVSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgUGFydGlhbDxPbWl0PEZsb3dSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgLy8gRW1pdCBjaGFubmVsIOKAlCBuZXcgdGhpcmQgc3RyZWFtIChQaGFzZSAzKS4gTm8gbWV0aG9kLW5hbWUgb3ZlcmxhcCB3aXRoXG4gIC8vIHRoZSBvdGhlciB0d28gaW50ZXJmYWNlcywgc28gYSBwbGFpbiBpbnRlcnNlY3Rpb24gaXMgc291bmQg4oCUIG5vXG4gIC8vIHVuaW9uLXBheWxvYWQgZGlzY3JpbWluYXRvciBuZWVkZWQuXG4gIFBhcnRpYWw8T21pdDxFbWl0UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZT4+ICYge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBEZWxpdmVyeSB0aWVyIGZvciB0aGlzIHJlY29yZGVyIChSRkMtMDAxKSDigJQgdGhlIEZJRUxEIGZvcm0gb2YgdGhlXG4gICAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIociwgeyBkZWxpdmVyeSB9KWAgb3B0aW9ucyBiYWcsIHNvIGEgcmVjb3JkZXJcbiAgICAgKiBjYW4gREVDTEFSRSBpdHMgdGllciAoYHsgaWQsIGRlbGl2ZXJ5OiAnZGVmZXJyZWQnLCAuLi5ob29rcyB9YCkgYW5kXG4gICAgICogZXZlcnkgYXR0YWNoIHNpdGUgaG9ub3JzIGl0LiBgJ2RlZmVycmVkJ2Agcm91dGVzIHRoZSByZWNvcmRlcidzXG4gICAgICogZXZlbnRzIHRocm91Z2ggdGhlIGV4ZWN1dG9yJ3MgYm91bmRlZCBjYXB0dXJlIHF1ZXVlIChcIm9uZSBiZWF0XG4gICAgICogYmVoaW5kXCIpOyBhYnNlbnQgLyBgJ2lubGluZSdgIGtlZXBzIHRoZSBoaXN0b3JpY2FsIHN5bmNocm9ub3VzIGNhbGwuXG4gICAgICogTk9UIGFuIGV2ZW50IG1ldGhvZCDigJQgY2hhbm5lbCByb3V0aW5nIGRldGVjdGlvbiBjb3VudHMgZXZlbnQtTUVUSE9EXG4gICAgICogcHJvcGVydGllcyBvbmx5LCBzbyB0aGlzIHN0cmluZyBmaWVsZCBuZXZlciBhZmZlY3RzIHdoaWNoIGNoYW5uZWxzXG4gICAgICogdGhlIHJlY29yZGVyIGxhbmRzIG9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlbGl2ZXJ5PzogJ2lubGluZScgfCAnZGVmZXJyZWQnO1xuXG4gICAgLy8gU2hhcmVkIGxpZmVjeWNsZSBob29rcyDigJQgc2FtZSBvbiBib3RoIGludGVyZmFjZXMsIHNoYXBlIGNvbXBhdGlibGUuXG4gICAgY2xlYXI/KCk6IHZvaWQ7XG4gICAgdG9TbmFwc2hvdD8oKToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICAgICAgZGF0YTogdW5rbm93bjtcbiAgICB9O1xuXG4gICAgLy8gU2hhcmVkIGV2ZW50IG1ldGhvZCBuYW1lcyB3aXRoIERJVkVSR0VOVCBwYXlsb2FkcyDigJQgZGVjbGFyZWQgYXMgdW5pb25zLlxuICAgIC8vIENvbnN1bWVycyBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMsIG9yIGRpc2NyaW1pbmF0ZSB1c2luZyB0aGVcbiAgICAvLyBleHBvcnRlZCBoZWxwZXIgYGlzRmxvd0V2ZW50KClgICh3aGljaCBjaGVja3MgdGhlIGV4cGxpY2l0IGBjaGFubmVsYFxuICAgIC8vIGRpc2NyaW1pbmFudCBzdGFtcGVkIGJ5IHRoZSBlbmdpbmUsIGZhbGxpbmcgYmFjayB0byBwaXBlbGluZUlkXG4gICAgLy8gYWJzZW5jZSBmb3IgdW5zdGFtcGVkIGV2ZW50cykuXG4gICAgLy9cbiAgICAvLyBAZXhhbXBsZVxuICAgIC8vIGBgYHRzXG4gICAgLy8gY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAgLy8gICBpZDogJ2F1ZGl0JyxcbiAgICAvLyAgIG9uRXJyb3I6IChlKSA9PiB7XG4gICAgLy8gICAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRmxvd0Vycm9yRXZlbnQg4oCUIGhhcyBzdGFnZU5hbWUsIG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvclxuICAgIC8vICAgICAgIGxvZygnZmxvdyBlcnJvciBpbiBzdGFnZScsIGUuc3RhZ2VOYW1lKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEVycm9yRXZlbnQg4oCUIGhhcyBlcnJvciwgb3BlcmF0aW9uLCBrZXk/XG4gICAgLy8gICAgICAgbG9nKCdzY29wZSBlcnJvciBkdXJpbmcnLCBlLm9wZXJhdGlvbiwgZS5lcnJvci5tZXNzYWdlKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSxcbiAgICAvLyB9O1xuICAgIC8vIGBgYFxuICAgIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkO1xuICAgIG9uUGF1c2U/KGV2ZW50OiBQYXVzZUV2ZW50IHwgRmxvd1BhdXNlRXZlbnQpOiB2b2lkO1xuICAgIG9uUmVzdW1lPyhldmVudDogUmVzdW1lRXZlbnQgfCBGbG93UmVzdW1lRXZlbnQpOiB2b2lkO1xuICB9O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0b3IgZm9yIHRoZSB1bmlvbiBwYXlsb2FkIHR5cGVzIG9uIGBDb21iaW5lZFJlY29yZGVyYCdzIHNoYXJlZFxuICogbWV0aG9kcyAoYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWApLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXZlbnRcbiAqIHdhcyBlbWl0dGVkIGZyb20gdGhlIGNvbnRyb2wtZmxvdyBjaGFubmVsIChGbG93UmVjb3JkZXIpLlxuICpcbiAqICMjIEhvdyBpdCBkaXNjcmltaW5hdGVzXG4gKlxuICogMS4gKipFeHBsaWNpdCBgY2hhbm5lbGAgZmllbGQgZmlyc3QqKiAoYmFja2xvZyBCMyk6IGV2ZXJ5IGVuZ2luZS1kaXNwYXRjaGVkXG4gKiAgICBzaGFyZWQtbWV0aG9kIGV2ZW50IGlzIHN0YW1wZWQgYGNoYW5uZWw6ICdmbG93J2AgKGNvbnRyb2wtZmxvdykgb3JcbiAqICAgIGBjaGFubmVsOiAnc2NvcGUnYCAoZGF0YS1mbG93KSBhdCBjb25zdHJ1Y3Rpb24uIFRoaXMgaXMgdGhlIHBvc2l0aXZlLFxuICogICAgc2NoZW1hLXJvYnVzdCBzaWduYWwg4oCUIGl0IHN1cnZpdmVzIHdyYXBwZXJzIHRoYXQgYWRkL3N0cmlwIGZpZWxkcy5cbiAqIDIuICoqTGVnYWN5IGZhbGxiYWNrKiogZm9yIHVuc3RhbXBlZCBldmVudHMgKGNvbnN1bWVyLWZhYnJpY2F0ZWQgdGVzdHMsXG4gKiAgICBwZXJzaXN0ZWQgdHJhY2VzIGZyb20gPDkuMik6IHNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZFxuICogICAgYFJlY29yZGVyQ29udGV4dGAsIHdoaWNoIGNhcnJpZXMgYHBpcGVsaW5lSWRgOyBmbG93LWNoYW5uZWwgZXZlbnRzIGRvXG4gKiAgICBub3QuIFRoZSBmbG93IHZhcmlhbnQgaXMgZGV0ZWN0ZWQgYnkgdGhlIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlFxuICogICAgc2NoZW1hLXN0YWJsZSBhcyBsb25nIGFzIHNjb3BlIGV2ZW50cyBjb250aW51ZSB0byBleHRlbmRcbiAqICAgIGBSZWNvcmRlckNvbnRleHRgLCBidXQgZnJhZ2lsZSBhZ2FpbnN0IGZpZWxkLXN0cmlwcGluZyB3cmFwcGVycywgd2hpY2hcbiAqICAgIGlzIHdoeSB0aGUgZXhwbGljaXQgZGlzY3JpbWluYW50IG5vdyBleGlzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBvbkVycm9yOiAoZSkgPT4ge1xuICogICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBGbG93RXJyb3JFdmVudDogaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgLy8gTmFycm93ZWQgdG8gRXJyb3JFdmVudDogaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dFdmVudDxUPihldmVudDogVCk6IGV2ZW50IGlzIEV4Y2x1ZGU8VCwgeyBwaXBlbGluZUlkOiBzdHJpbmcgfT4ge1xuICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fCBldmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChlLmNoYW5uZWwgPT09ICdmbG93JykgcmV0dXJuIHRydWU7XG4gIGlmIChlLmNoYW5uZWwgPT09ICdzY29wZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGUucGlwZWxpbmVJZCA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBTY29wZVJlY29yZGVyYCAoZGF0YS1mbG93KSBpbnRlcmZhY2UuXG4gKiBLZXB0IGFzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBzbyB0aGUgcnVudGltZSBkdWNrLXR5cGUgZGV0ZWN0b3Igc3RheXNcbiAqIGluIHN5bmMgd2l0aCB0aGUgaW50ZXJmYWNlLiBJZiBhIG1ldGhvZCBpcyBhZGRlZCB0byBgU2NvcGVSZWNvcmRlcmAsIGFkZGluZyBpdFxuICogaGVyZSBpcyB0aGUgT05MWSBjaGFuZ2UgcmVxdWlyZWQgdG8gcm91dGUgY29tYmluZWQtcmVjb3JkZXJzIGNvcnJlY3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbXG4gICdvblJlYWQnLFxuICAnb25Xcml0ZScsXG4gICdvbkNvbW1pdCcsXG4gICdvbkVycm9yJyxcbiAgJ29uU3RhZ2VTdGFydCcsXG4gICdvblN0YWdlRW5kJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRmxvd1JlY29yZGVyYCAoY29udHJvbC1mbG93KSBpbnRlcmZhY2UuXG4gKiBTZWUgdGhlIG5vdGUgb24gYFJFQ09SREVSX0VWRU5UX01FVEhPRFNgLlxuICpcbiAqIE5PVEU6IHRoZSBgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCBtZXRob2RzIGV4aXN0IG9uIEJPVEggaW50ZXJmYWNlc1xuICogd2l0aCBESUZGRVJFTlQgZXZlbnQgcGF5bG9hZCBzaGFwZXMuIEEgYENvbWJpbmVkUmVjb3JkZXJgIHRoYXQgaW1wbGVtZW50c1xuICogYW55IG9mIHRoZXNlIHJlY2VpdmVzIGJvdGggdmFyaWFudHMgKG9uZSBmcm9tIGVhY2ggY2hhbm5lbCkuIENvbnN1bWVycyB3aG9cbiAqIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGRpc2NyaW1pbmF0ZSB3aXRoIGBpc0Zsb3dFdmVudCgpYCAoZXhwbGljaXRcbiAqIGBjaGFubmVsYCBkaXNjcmltaW5hbnQsIGxlZ2FjeSBwaXBlbGluZUlkLWFic2VuY2UgZmFsbGJhY2spLlxuICovXG5leHBvcnQgY29uc3QgRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25TdGFnZUV4ZWN1dGVkJyxcbiAgJ29uTmV4dCcsXG4gICdvbkRlY2lzaW9uJyxcbiAgJ29uRm9yaycsXG4gICdvblNlbGVjdGVkJyxcbiAgJ29uU3ViZmxvd0VudHJ5JyxcbiAgJ29uU3ViZmxvd0V4aXQnLFxuICAnb25TdWJmbG93UmVnaXN0ZXJlZCcsXG4gICdvbkxvb3AnLFxuICAnb25CcmVhaycsXG4gICdvbkVycm9yJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuICAvLyBSdW4tYm91bmRhcnkgbWV0aG9kcyDigJQgaW5jbHVkZWQgc28gYSByZWNvcmRlciB3aG9zZSBPTkxZIGV2ZW50IGhvb2tcbiAgLy8gaXMgYSBydW4gYm91bmRhcnkgKGUuZy4gYW4gZXJyb3IgYnJpZGdlIGltcGxlbWVudGluZyBqdXN0XG4gIC8vIGBvblJ1bkZhaWxlZGApIGlzIHN0aWxsIGRldGVjdGVkIGFzIGEgRmxvd1JlY29yZGVyIGFuZCByb3V0ZWQgdG8gdGhlXG4gIC8vIGZsb3cgY2hhbm5lbC4gUHJldmlvdXNseSBhIHJ1bi1vbmx5IHJlY29yZGVyIHdhcyBzaWxlbnRseSBkcm9wcGVkLlxuICAnb25SdW5TdGFydCcsXG4gICdvblJ1bkVuZCcsXG4gICdvblJ1bkZhaWxlZCcsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBFbWl0UmVjb3JkZXJgICh1c2VyLWVtaXR0ZWQgZXZlbnRzKVxuICogaW50ZXJmYWNlLiBTYW1lIGNvbnZlbnRpb24gYXMgdGhlIG90aGVyIHR3byBhcnJheXMgYWJvdmUg4oCUIGtlcHQgYXNcbiAqIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkdWNrLXR5cGUgZGV0ZWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gWydvbkVtaXQnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgYG1gIGVpdGhlciBhcyBhbiBvd25cbiAqIHByb3BlcnR5IE9SIG9uIGl0cyBjbGFzcy1wcm90b3R5cGUgY2hhaW4g4oCUIGJ1dCBOT1QgaW5oZXJpdGVkIGZyb21cbiAqIGBPYmplY3QucHJvdG90eXBlYC5cbiAqXG4gKiAjIyBXaHkgdGhpcyBsYXllcmVkIGNoZWNrXG4gKlxuICogQSBgQ29tYmluZWRSZWNvcmRlcmAgY2FuIGJlIGVpdGhlciBhIHBsYWluIG9iamVjdCBsaXRlcmFsIChoYW5kbGVycyBhc1xuICogb3duIHByb3BlcnRpZXMpIE9SIGEgY2xhc3MgaW5zdGFuY2UgKGhhbmRsZXJzIGFzIGNsYXNzLXByb3RvdHlwZVxuICogbWV0aG9kcykuIEJvdGggYXJlIGxlZ2l0aW1hdGUgY29uc3VtZXIgcGF0dGVybnMgYW5kIGJvdGggTVVTVCBhdHRhY2guXG4gKlxuICogQnV0IGhhbmRsZXJzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhcmUgQUxXQVlTIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyAobm9ib2R5IGxlZ2l0aW1hdGVseSBhdHRhY2hlcyByZWNvcmRlciBtZXRob2RzIHRoZXJlKS4gU28gd2VcbiAqIHdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiwgU1RPUFBJTkcgYmVmb3JlIGBPYmplY3QucHJvdG90eXBlYC4gVGhpc1xuICogYWNjZXB0cyBjbGFzcyBtZXRob2RzIHdoaWxlIHN0aWxsIGJsb2NraW5nIGBPYmplY3QucHJvdG90eXBlYFxuICogcG9sbHV0aW9uIGF0dGFja3MuXG4gKi9cbmZ1bmN0aW9uIGhhc093bk9yQ2xhc3NNZXRob2QocjogdW5rbm93biwgbTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChyID09PSBudWxsIHx8IHR5cGVvZiByICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG0pKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAociBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gIH1cbiAgbGV0IHByb3RvOiB1bmtub3duID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO1xuICB3aGlsZSAocHJvdG8gIT09IG51bGwgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBtKSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAocHJvdG8gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBkYXRhLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogVXNlZCBieSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaG9vayBpbnRvXG4gKiB0aGUgc2NvcGUgZGF0YS1mbG93IGNoYW5uZWwuXG4gKlxuICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAqXG4gKiBBY2NlcHRzIGJvdGggb2JqZWN0LWxpdGVyYWwgcmVjb3JkZXJzIChvd24tcHJvcGVydHkgaGFuZGxlcnMpIEFORCBjbGFzc1xuICogaW5zdGFuY2VzIChoYW5kbGVycyBkZWNsYXJlZCBvbiB0aGUgY2xhc3MgcHJvdG90eXBlKS4gUmVqZWN0cyBoYW5kbGVyc1xuICogaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIOKAlCB0aGF0J3MgYWx3YXlzIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyBwb2xsdXRpb24sIG5ldmVyIGEgbGVnaXRpbWF0ZSByZWNvcmRlci5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgZXhjbHVzaW9uc1xuICpcbiAqIGBjbGVhcmAgYW5kIGB0b1NuYXBzaG90YCBhcmUgTk9UIGNvdW50ZWQgYXMgZXZlbnQgbWV0aG9kcyDigJQgYSByZWNvcmRlclxuICogdGhhdCBvbmx5IGltcGxlbWVudHMgdGhvc2UgaGFzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBhbmQgd291bGQgYmUgYSBuby1vcFxuICogb24gZWl0aGVyIGNoYW5uZWwuXG4gKlxuICogIyMgUmV0dXJuIHR5cGVcbiAqXG4gKiBSZXR1cm5zIHBsYWluIGBib29sZWFuYCAobm90IGEgdHlwZSBwcmVkaWNhdGUpLiBUaGUgZnVsbCBgU2NvcGVSZWNvcmRlcmBcbiAqIGludGVyZmFjZSBoYXMgcGF5bG9hZCB0eXBlcyB0aGF0IGRpdmVyZ2UgZnJvbSBgQ29tYmluZWRSZWNvcmRlcmAncyB1bmlvblxuICogdmFyaWFudHMgZm9yIHNoYXJlZCBtZXRob2RzLCBzbyBhIG5hcnJvd2luZyBwcmVkaWNhdGUgd291bGQgYmUgdW5zb3VuZC5cbiAqIENhbGxlcnMgdGhhdCBuZWVkIHRvIHRyZWF0IHRoZSByZWNvcmRlciBhcyBhIGBTY29wZVJlY29yZGVyYCBkbyBzbyBleHBsaWNpdGx5XG4gKiBhdCB0aGUgYXR0YWNoIHNpdGUg4oCUIHRoZSBjYXN0IGlzIHRoZSBjb250cmFjdCB0aGF0IGVhY2ggY2hhbm5lbCBwYXNzZXNcbiAqIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGNvbnRyb2wtZmxvdyBldmVudCBtZXRob2QuXG4gKiBTZWUgYGhhc1JlY29yZGVyTWV0aG9kc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZW1pdC1jaGFubmVsIGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCBmb3IgdGhlIG93bmVyc2hpcC1kZXRlY3Rpb24gcnVsZXMgKG93biBvclxuICogY2xhc3MtcHJvdG90eXBlIG1ldGhvZHMgY291bnQ7IGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gZG9lcyBub3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ /**
2
+ * recorder/invokeHook.ts — the ONE per-listener invoke helper (RFC-001 §9 mitigation).
3
+ *
4
+ * Pattern: Single shared "look up the hook, bind `this`, call it" primitive
5
+ * used by BOTH delivery tiers:
6
+ * - inline: `ScopeFacade._invokeHook` / `ScopeFacade.emitEvent`
7
+ * call it per recorder per event (the historical direct call);
8
+ * - deferred: `DeferredObserverTier`'s dispatcher listener calls
9
+ * it per envelope at the flush checkpoint.
10
+ * Because both tiers route through the SAME lookup + `.call(this)`
11
+ * semantics, the two paths cannot drift: a recorder that works
12
+ * inline is invoked identically one beat behind.
13
+ * Role: Invocation primitive only. NO error handling here — the two
14
+ * tiers isolate failures differently by design (inline routes a
15
+ * throw to sibling recorders' `onError` at the dispatch site;
16
+ * deferred routes sync throws AND async rejections through
17
+ * `DeferredDispatcher`'s injected error callback).
18
+ *
19
+ * Lookup semantics: NORMAL property lookup (prototype chain included), the
20
+ * same as the historical `recorder[hook]` read in `ScopeFacade._invokeHook` —
21
+ * class-based recorders declare hooks on their prototype. (The own-property
22
+ * restriction in `hasRecorderMethods` applies only to CHANNEL ROUTING
23
+ * detection, not to invocation.)
24
+ */
25
+ /**
26
+ * Invoke `recorder[method](event)` with `this` bound to the recorder, iff
27
+ * `method` resolves to a function. Returns the hook's return value (a
28
+ * deferred listener may return a Promise the dispatcher tracks); returns
29
+ * `undefined` when the hook is absent. Throws whatever the hook throws —
30
+ * callers own error isolation.
31
+ */
32
+ export function invokeRecorderHook(recorder, method, event) {
33
+ const hook = recorder[method];
34
+ if (typeof hook !== 'function')
35
+ return undefined;
36
+ return hook.call(recorder, event);
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvaW52b2tlSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYztJQUNqRixNQUFNLElBQUksR0FBSSxRQUFvQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksT0FBTyxJQUFJLEtBQUssVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE9BQVEsSUFBZ0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlY29yZGVyL2ludm9rZUhvb2sudHMg4oCUIHRoZSBPTkUgcGVyLWxpc3RlbmVyIGludm9rZSBoZWxwZXIgKFJGQy0wMDEgwqc5IG1pdGlnYXRpb24pLlxuICpcbiAqIFBhdHRlcm46ICBTaW5nbGUgc2hhcmVkIFwibG9vayB1cCB0aGUgaG9vaywgYmluZCBgdGhpc2AsIGNhbGwgaXRcIiBwcmltaXRpdmVcbiAqICAgICAgICAgICB1c2VkIGJ5IEJPVEggZGVsaXZlcnkgdGllcnM6XG4gKiAgICAgICAgICAgICAtIGlubGluZTogICBgU2NvcGVGYWNhZGUuX2ludm9rZUhvb2tgIC8gYFNjb3BlRmFjYWRlLmVtaXRFdmVudGBcbiAqICAgICAgICAgICAgICAgY2FsbCBpdCBwZXIgcmVjb3JkZXIgcGVyIGV2ZW50ICh0aGUgaGlzdG9yaWNhbCBkaXJlY3QgY2FsbCk7XG4gKiAgICAgICAgICAgICAtIGRlZmVycmVkOiBgRGVmZXJyZWRPYnNlcnZlclRpZXJgJ3MgZGlzcGF0Y2hlciBsaXN0ZW5lciBjYWxsc1xuICogICAgICAgICAgICAgICBpdCBwZXIgZW52ZWxvcGUgYXQgdGhlIGZsdXNoIGNoZWNrcG9pbnQuXG4gKiAgICAgICAgICAgQmVjYXVzZSBib3RoIHRpZXJzIHJvdXRlIHRocm91Z2ggdGhlIFNBTUUgbG9va3VwICsgYC5jYWxsKHRoaXMpYFxuICogICAgICAgICAgIHNlbWFudGljcywgdGhlIHR3byBwYXRocyBjYW5ub3QgZHJpZnQ6IGEgcmVjb3JkZXIgdGhhdCB3b3Jrc1xuICogICAgICAgICAgIGlubGluZSBpcyBpbnZva2VkIGlkZW50aWNhbGx5IG9uZSBiZWF0IGJlaGluZC5cbiAqIFJvbGU6ICAgICBJbnZvY2F0aW9uIHByaW1pdGl2ZSBvbmx5LiBOTyBlcnJvciBoYW5kbGluZyBoZXJlIOKAlCB0aGUgdHdvXG4gKiAgICAgICAgICAgdGllcnMgaXNvbGF0ZSBmYWlsdXJlcyBkaWZmZXJlbnRseSBieSBkZXNpZ24gKGlubGluZSByb3V0ZXMgYVxuICogICAgICAgICAgIHRocm93IHRvIHNpYmxpbmcgcmVjb3JkZXJzJyBgb25FcnJvcmAgYXQgdGhlIGRpc3BhdGNoIHNpdGU7XG4gKiAgICAgICAgICAgZGVmZXJyZWQgcm91dGVzIHN5bmMgdGhyb3dzIEFORCBhc3luYyByZWplY3Rpb25zIHRocm91Z2hcbiAqICAgICAgICAgICBgRGVmZXJyZWREaXNwYXRjaGVyYCdzIGluamVjdGVkIGVycm9yIGNhbGxiYWNrKS5cbiAqXG4gKiBMb29rdXAgc2VtYW50aWNzOiBOT1JNQUwgcHJvcGVydHkgbG9va3VwIChwcm90b3R5cGUgY2hhaW4gaW5jbHVkZWQpLCB0aGVcbiAqIHNhbWUgYXMgdGhlIGhpc3RvcmljYWwgYHJlY29yZGVyW2hvb2tdYCByZWFkIGluIGBTY29wZUZhY2FkZS5faW52b2tlSG9va2Ag4oCUXG4gKiBjbGFzcy1iYXNlZCByZWNvcmRlcnMgZGVjbGFyZSBob29rcyBvbiB0aGVpciBwcm90b3R5cGUuIChUaGUgb3duLXByb3BlcnR5XG4gKiByZXN0cmljdGlvbiBpbiBgaGFzUmVjb3JkZXJNZXRob2RzYCBhcHBsaWVzIG9ubHkgdG8gQ0hBTk5FTCBST1VUSU5HXG4gKiBkZXRlY3Rpb24sIG5vdCB0byBpbnZvY2F0aW9uLilcbiAqL1xuXG4vKipcbiAqIEludm9rZSBgcmVjb3JkZXJbbWV0aG9kXShldmVudClgIHdpdGggYHRoaXNgIGJvdW5kIHRvIHRoZSByZWNvcmRlciwgaWZmXG4gKiBgbWV0aG9kYCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBob29rJ3MgcmV0dXJuIHZhbHVlIChhXG4gKiBkZWZlcnJlZCBsaXN0ZW5lciBtYXkgcmV0dXJuIGEgUHJvbWlzZSB0aGUgZGlzcGF0Y2hlciB0cmFja3MpOyByZXR1cm5zXG4gKiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBob29rIGlzIGFic2VudC4gVGhyb3dzIHdoYXRldmVyIHRoZSBob29rIHRocm93cyDigJRcbiAqIGNhbGxlcnMgb3duIGVycm9yIGlzb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlcjogb2JqZWN0LCBtZXRob2Q6IHN0cmluZywgZXZlbnQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgY29uc3QgaG9vayA9IChyZWNvcmRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbWV0aG9kXTtcbiAgaWYgKHR5cGVvZiBob29rICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKGhvb2sgYXMgKGU6IHVua25vd24pID0+IHVua25vd24pLmNhbGwocmVjb3JkZXIsIGV2ZW50KTtcbn1cbiJdfQ==