footprintjs 9.3.0 → 9.5.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 (61) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +2 -1
  3. package/dist/advanced.js +1 -1
  4. package/dist/esm/advanced.js +1 -1
  5. package/dist/esm/index.js +1 -1
  6. package/dist/esm/lib/builder/FlowChartBuilder.js +15 -2
  7. package/dist/esm/lib/capture/envelope.js +187 -0
  8. package/dist/esm/lib/capture/index.js +16 -0
  9. package/dist/esm/lib/capture/policies.js +29 -0
  10. package/dist/esm/lib/capture/summarize.js +58 -0
  11. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +23 -4
  12. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +9 -1
  13. package/dist/esm/lib/engine/types.js +1 -1
  14. package/dist/esm/lib/memory/StageContext.js +62 -44
  15. package/dist/esm/lib/memory/index.js +2 -2
  16. package/dist/esm/lib/memory/types.js +7 -4
  17. package/dist/esm/lib/observer-queue/deferredDispatcher.js +226 -0
  18. package/dist/esm/lib/observer-queue/flushDriver.js +163 -0
  19. package/dist/esm/lib/observer-queue/index.js +22 -0
  20. package/dist/esm/lib/observer-queue/mergedQueue.js +91 -0
  21. package/dist/esm/lib/observer-queue/ring.js +122 -0
  22. package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
  23. package/dist/esm/lib/runner/FlowChartExecutor.js +20 -1
  24. package/dist/index.js +1 -1
  25. package/dist/lib/builder/FlowChartBuilder.js +15 -2
  26. package/dist/lib/capture/envelope.js +192 -0
  27. package/dist/lib/capture/index.js +23 -0
  28. package/dist/lib/capture/policies.js +30 -0
  29. package/dist/lib/capture/summarize.js +63 -0
  30. package/dist/lib/engine/handlers/ContinuationResolver.js +23 -4
  31. package/dist/lib/engine/handlers/SubflowExecutor.js +9 -1
  32. package/dist/lib/engine/types.js +1 -1
  33. package/dist/lib/memory/StageContext.js +63 -45
  34. package/dist/lib/memory/index.js +3 -2
  35. package/dist/lib/memory/types.js +10 -5
  36. package/dist/lib/observer-queue/deferredDispatcher.js +230 -0
  37. package/dist/lib/observer-queue/flushDriver.js +167 -0
  38. package/dist/lib/observer-queue/index.js +36 -0
  39. package/dist/lib/observer-queue/mergedQueue.js +95 -0
  40. package/dist/lib/observer-queue/ring.js +126 -0
  41. package/dist/lib/runner/ExecutionRuntime.js +13 -1
  42. package/dist/lib/runner/FlowChartExecutor.js +20 -1
  43. package/dist/types/advanced.d.ts +1 -1
  44. package/dist/types/index.d.ts +13 -0
  45. package/dist/types/lib/capture/envelope.d.ts +169 -0
  46. package/dist/types/lib/capture/index.d.ts +16 -0
  47. package/dist/types/lib/capture/policies.d.ts +42 -0
  48. package/dist/types/lib/capture/summarize.d.ts +65 -0
  49. package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +15 -2
  50. package/dist/types/lib/engine/types.d.ts +3 -0
  51. package/dist/types/lib/memory/StageContext.d.ts +38 -1
  52. package/dist/types/lib/memory/index.d.ts +2 -2
  53. package/dist/types/lib/memory/types.d.ts +33 -22
  54. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +169 -0
  55. package/dist/types/lib/observer-queue/flushDriver.d.ts +124 -0
  56. package/dist/types/lib/observer-queue/index.d.ts +25 -0
  57. package/dist/types/lib/observer-queue/mergedQueue.d.ts +85 -0
  58. package/dist/types/lib/observer-queue/ring.d.ts +99 -0
  59. package/dist/types/lib/runner/ExecutionRuntime.d.ts +11 -1
  60. package/dist/types/lib/runner/FlowChartExecutor.d.ts +43 -1
  61. package/package.json +1 -1
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ /**
3
+ * capture/envelope.ts — RFC-001 Block 1: capture envelopes + payload summarizer.
4
+ *
5
+ * Pattern: Point-in-time capture. An observer event is snapshotted into a
6
+ * self-contained, immutable envelope at the moment it happens, so
7
+ * DELIVERY can be deferred (RFC-001 "one beat behind") without the
8
+ * payload drifting under later engine mutations.
9
+ * Role: The capture tier of the deferred-observer pipeline
10
+ * (`src/lib/observer-queue/`). Pure module — ZERO engine imports
11
+ * (only `capture/` internals); the engine wiring is RFC-001
12
+ * Blocks 6–10.
13
+ *
14
+ * Capture policies (RFC-001 §5):
15
+ * - `'summary'` — bounded, reference-free summarization via
16
+ * {@link summarizePayload}. Built on the SAME classification path as the
17
+ * retention markers in `summarize.ts` (#14 / #13c-A), extended with
18
+ * bounded structural descent. Structured-clone-safe by construction.
19
+ * - `'clone'` — `structuredClone` at capture time (the capture-tier
20
+ * spelling of retention `'full'` — see the mapping notes in
21
+ * `policies.ts`). If the payload is not clonable (functions, symbols,
22
+ * live handles), capture DEGRADES to `'summary'` and reports through the
23
+ * `warn` hook — a capture must never throw into the producer.
24
+ * - `'ref'` — pass-through of the live reference. The CALLER asserts
25
+ * immutability for the delivery window (safe e.g. for committed-state
26
+ * reads, proven immutable-after-swap in #13/#13b). Exempt from the
27
+ * clone-safety guarantee — see the dev-warn seam below.
28
+ *
29
+ * Dev-warn seam (resolves the isDevMode-would-be-an-engine-import problem):
30
+ * This module must not import `scope/detectCircular` (engine territory).
31
+ * Instead, `capture()` accepts {@link CaptureHooks} with an optional
32
+ * `warn` callback and invokes it on every `'ref'` capture and every
33
+ * `'clone'` degradation. The WIRING layer (Block 6) binds `warn` to an
34
+ * `isDevMode()`-gated, deduplicated console warner; the pure module stays
35
+ * engine-free and silent by default (no hooks ⇒ no warning, zero cost).
36
+ *
37
+ * Summarizer bounds (documented contract, exported as constants):
38
+ * - depth ≤ {@link PAYLOAD_SUMMARY_MAX_DEPTH} (3) — deeper structure
39
+ * collapses to a classified leaf with `depthClipped: true`.
40
+ * - breadth ≤ {@link PAYLOAD_SUMMARY_MAX_ENTRIES} (16) per object/array —
41
+ * the remainder is dropped and flagged `truncated: true` (the honest
42
+ * `size` still reports the real count).
43
+ * - total ≤ {@link PAYLOAD_SUMMARY_MAX_NODES} (128) summary nodes per
44
+ * payload — a global budget so wide×deep payloads stay O(1)-bounded.
45
+ * - string previews ≤ `SUMMARY_PREVIEW_LENGTH` (80) chars.
46
+ * Cycles are detected (ancestor set) and flagged `circular: true`;
47
+ * throwing getters yield a `'unreadable'` leaf; symbol-keyed properties
48
+ * are ignored (same as JSON / `Object.keys`); `Map`/`Set` are leaves with
49
+ * their REAL entry count (no descent — matches `summarize.ts`).
50
+ */
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.capture = exports.summarizePayload = exports.PAYLOAD_SUMMARY_MAX_NODES = exports.PAYLOAD_SUMMARY_MAX_ENTRIES = exports.PAYLOAD_SUMMARY_MAX_DEPTH = void 0;
53
+ const summarize_js_1 = require("./summarize.js");
54
+ /** Max nesting depth a payload summary descends before clipping. */
55
+ exports.PAYLOAD_SUMMARY_MAX_DEPTH = 3;
56
+ /** Max entries summarized per object/array level before truncating. */
57
+ exports.PAYLOAD_SUMMARY_MAX_ENTRIES = 16;
58
+ /** Global per-payload budget of summary nodes (wide×deep hard bound). */
59
+ exports.PAYLOAD_SUMMARY_MAX_NODES = 128;
60
+ /**
61
+ * Classify one value through the ONE classification path shared with the
62
+ * retention markers. GATE NOTE: Block 1 may not modify `summarize.ts`, so
63
+ * the module-private `classifyValue` is reached through its exported facade
64
+ * and the brand field is dropped by explicit copy — Block 6 may export
65
+ * `classifyValue` directly and inline this hop.
66
+ */
67
+ function classifyLeaf(value) {
68
+ const marker = (0, summarize_js_1.summarizeWriteValue)(value);
69
+ const leaf = { type: marker.type };
70
+ if (marker.size !== undefined)
71
+ leaf.size = marker.size;
72
+ if (marker.preview !== undefined)
73
+ leaf.preview = marker.preview;
74
+ return leaf;
75
+ }
76
+ /** Read one child property, converting throwing getters into a leaf. */
77
+ function summarizeChild(parent, key, depth, budget, ancestors) {
78
+ let child;
79
+ try {
80
+ child = parent[key];
81
+ }
82
+ catch {
83
+ return { type: 'unreadable', preview: '[getter threw during capture]' };
84
+ }
85
+ return summarizeNode(child, depth, budget, ancestors);
86
+ }
87
+ function summarizeNode(value, depth, budget, ancestors) {
88
+ budget.nodesLeft -= 1;
89
+ const leaf = classifyLeaf(value);
90
+ // Only plain containers descend. Map/Set stay leaves (real entry count
91
+ // already on `size` — matches summarize.ts); everything else is a leaf.
92
+ const container = (leaf.type === 'object' || leaf.type === 'array') && typeof value === 'object' && value !== null;
93
+ if (!container || value instanceof Map || value instanceof Set)
94
+ return leaf;
95
+ const obj = value;
96
+ if (ancestors.has(obj))
97
+ return { ...leaf, circular: true };
98
+ if (depth >= exports.PAYLOAD_SUMMARY_MAX_DEPTH)
99
+ return { ...leaf, depthClipped: true };
100
+ if (budget.nodesLeft <= 0)
101
+ return { ...leaf, truncated: true };
102
+ ancestors.add(obj);
103
+ try {
104
+ if (Array.isArray(value)) {
105
+ const limit = Math.min(value.length, exports.PAYLOAD_SUMMARY_MAX_ENTRIES);
106
+ const items = [];
107
+ let clipped = value.length > limit;
108
+ for (let i = 0; i < limit; i++) {
109
+ if (budget.nodesLeft <= 0) {
110
+ clipped = true;
111
+ break;
112
+ }
113
+ items.push(summarizeChild(value, i, depth + 1, budget, ancestors));
114
+ }
115
+ return clipped ? { ...leaf, items, truncated: true } : { ...leaf, items };
116
+ }
117
+ const keys = Object.keys(obj);
118
+ const limit = Math.min(keys.length, exports.PAYLOAD_SUMMARY_MAX_ENTRIES);
119
+ // Built via entries + fromEntries so hostile keys ('__proto__', ...)
120
+ // become own data properties — never prototype writes.
121
+ const entries = [];
122
+ let clipped = keys.length > limit;
123
+ for (let i = 0; i < limit; i++) {
124
+ if (budget.nodesLeft <= 0) {
125
+ clipped = true;
126
+ break;
127
+ }
128
+ entries.push([keys[i], summarizeChild(obj, keys[i], depth + 1, budget, ancestors)]);
129
+ }
130
+ const fields = Object.fromEntries(entries);
131
+ return clipped ? { ...leaf, fields, truncated: true } : { ...leaf, fields };
132
+ }
133
+ finally {
134
+ ancestors.delete(obj);
135
+ }
136
+ }
137
+ /**
138
+ * Produce a bounded, reference-free, structured-clone-safe summary of an
139
+ * arbitrary payload. Never throws; never holds a reference into the source
140
+ * value (every node is a fresh object whose fields are primitives). Bounds
141
+ * are documented in the module header.
142
+ */
143
+ function summarizePayload(payload) {
144
+ const budget = { nodesLeft: exports.PAYLOAD_SUMMARY_MAX_NODES };
145
+ const root = summarizeNode(payload, 0, budget, new Set());
146
+ return { __payloadSummary: true, ...root };
147
+ }
148
+ exports.summarizePayload = summarizePayload;
149
+ /** Materialize the payload per policy — see the module header contract. */
150
+ function capturePayload(request, policy, hooks) {
151
+ if (policy === 'ref') {
152
+ hooks?.warn?.(`[footprintjs capture] 'ref' capture for ${request.channel}.${request.method} passes a LIVE reference ` +
153
+ 'through deferred delivery — the caller asserts the payload is immutable until delivered.');
154
+ return request.payload;
155
+ }
156
+ if (policy === 'clone') {
157
+ try {
158
+ return structuredClone(request.payload);
159
+ }
160
+ catch {
161
+ hooks?.warn?.(`[footprintjs capture] 'clone' capture for ${request.channel}.${request.method} failed ` +
162
+ "(structuredClone threw — unclonable payload); degraded to 'summary'.");
163
+ return summarizePayload(request.payload);
164
+ }
165
+ }
166
+ return summarizePayload(request.payload);
167
+ }
168
+ /**
169
+ * Capture one observer event into an immutable {@link CaptureEnvelope}.
170
+ *
171
+ * Guarantees:
172
+ * - Never throws into the producer (`'clone'` degradation, summarizer
173
+ * never-throws contract).
174
+ * - The returned envelope is shallow-frozen — `seq`/`channel`/... cannot
175
+ * be reassigned. Under `'summary'`/`'clone'` the payload holds no live
176
+ * reference into the source; under `'ref'` it intentionally does.
177
+ * - Default policy is `'summary'` (cheapest safe tier).
178
+ */
179
+ function capture(request, policy = 'summary', hooks) {
180
+ const capturedAt = hooks?.now !== undefined ? hooks.now() : Date.now();
181
+ return Object.freeze({
182
+ seq: request.seq,
183
+ channel: request.channel,
184
+ method: request.method,
185
+ runtimeStageId: request.runtimeStageId,
186
+ runId: request.runId,
187
+ payload: capturePayload(request, policy, hooks),
188
+ capturedAt,
189
+ });
190
+ }
191
+ exports.capture = capture;
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7OztBQUVILGlEQUE0RTtBQWlFNUUsb0VBQW9FO0FBQ3ZELFFBQUEseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRTNDLHVFQUF1RTtBQUMxRCxRQUFBLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUU5Qyx5RUFBeUU7QUFDNUQsUUFBQSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUEwRDdDOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxrQ0FBbUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBcUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3ZELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ2hFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FDckIsTUFBYyxFQUNkLEdBQW9CLEVBQ3BCLEtBQWEsRUFDYixNQUF1QixFQUN2QixTQUFzQjtJQUV0QixJQUFJLEtBQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUksTUFBMkMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxZ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LEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQy9DLFVBQVU7S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBZkQsMEJBZUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNhcHR1cmUvZW52ZWxvcGUudHMg4oCUIFJGQy0wMDEgQmxvY2sgMTogY2FwdHVyZSBlbnZlbG9wZXMgKyBwYXlsb2FkIHN1bW1hcml6ZXIuXG4gKlxuICogUGF0dGVybjogIFBvaW50LWluLXRpbWUgY2FwdHVyZS4gQW4gb2JzZXJ2ZXIgZXZlbnQgaXMgc25hcHNob3R0ZWQgaW50byBhXG4gKiAgICAgICAgICAgc2VsZi1jb250YWluZWQsIGltbXV0YWJsZSBlbnZlbG9wZSBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbnMsIHNvXG4gKiAgICAgICAgICAgREVMSVZFUlkgY2FuIGJlIGRlZmVycmVkIChSRkMtMDAxIFwib25lIGJlYXQgYmVoaW5kXCIpIHdpdGhvdXQgdGhlXG4gKiAgICAgICAgICAgcGF5bG9hZCBkcmlmdGluZyB1bmRlciBsYXRlciBlbmdpbmUgbXV0YXRpb25zLlxuICogUm9sZTogICAgIFRoZSBjYXB0dXJlIHRpZXIgb2YgdGhlIGRlZmVycmVkLW9ic2VydmVyIHBpcGVsaW5lXG4gKiAgICAgICAgICAgKGBzcmMvbGliL29ic2VydmVyLXF1ZXVlL2ApLiBQdXJlIG1vZHVsZSDigJQgWkVSTyBlbmdpbmUgaW1wb3J0c1xuICogICAgICAgICAgIChvbmx5IGBjYXB0dXJlL2AgaW50ZXJuYWxzKTsgdGhlIGVuZ2luZSB3aXJpbmcgaXMgUkZDLTAwMVxuICogICAgICAgICAgIEJsb2NrcyA24oCTMTAuXG4gKlxuICogQ2FwdHVyZSBwb2xpY2llcyAoUkZDLTAwMSDCpzUpOlxuICogICAtIGAnc3VtbWFyeSdgIOKAlCBib3VuZGVkLCByZWZlcmVuY2UtZnJlZSBzdW1tYXJpemF0aW9uIHZpYVxuICogICAgIHtAbGluayBzdW1tYXJpemVQYXlsb2FkfS4gQnVpbHQgb24gdGhlIFNBTUUgY2xhc3NpZmljYXRpb24gcGF0aCBhcyB0aGVcbiAqICAgICByZXRlbnRpb24gbWFya2VycyBpbiBgc3VtbWFyaXplLnRzYCAoIzE0IC8gIzEzYy1BKSwgZXh0ZW5kZWQgd2l0aFxuICogICAgIGJvdW5kZWQgc3RydWN0dXJhbCBkZXNjZW50LiBTdHJ1Y3R1cmVkLWNsb25lLXNhZmUgYnkgY29uc3RydWN0aW9uLlxuICogICAtIGAnY2xvbmUnYCAgIOKAlCBgc3RydWN0dXJlZENsb25lYCBhdCBjYXB0dXJlIHRpbWUgKHRoZSBjYXB0dXJlLXRpZXJcbiAqICAgICBzcGVsbGluZyBvZiByZXRlbnRpb24gYCdmdWxsJ2Ag4oCUIHNlZSB0aGUgbWFwcGluZyBub3RlcyBpblxuICogICAgIGBwb2xpY2llcy50c2ApLiBJZiB0aGUgcGF5bG9hZCBpcyBub3QgY2xvbmFibGUgKGZ1bmN0aW9ucywgc3ltYm9scyxcbiAqICAgICBsaXZlIGhhbmRsZXMpLCBjYXB0dXJlIERFR1JBREVTIHRvIGAnc3VtbWFyeSdgIGFuZCByZXBvcnRzIHRocm91Z2ggdGhlXG4gKiAgICAgYHdhcm5gIGhvb2sg4oCUIGEgY2FwdHVyZSBtdXN0IG5ldmVyIHRocm93IGludG8gdGhlIHByb2R1Y2VyLlxuICogICAtIGAncmVmJ2AgICAgIOKAlCBwYXNzLXRocm91Z2ggb2YgdGhlIGxpdmUgcmVmZXJlbmNlLiBUaGUgQ0FMTEVSIGFzc2VydHNcbiAqICAgICBpbW11dGFiaWxpdHkgZm9yIHRoZSBkZWxpdmVyeSB3aW5kb3cgKHNhZmUgZS5nLiBmb3IgY29tbWl0dGVkLXN0YXRlXG4gKiAgICAgcmVhZHMsIHByb3ZlbiBpbW11dGFibGUtYWZ0ZXItc3dhcCBpbiAjMTMvIzEzYikuIEV4ZW1wdCBmcm9tIHRoZVxuICogICAgIGNsb25lLXNhZmV0eSBndWFyYW50ZWUg4oCUIHNlZSB0aGUgZGV2LXdhcm4gc2VhbSBiZWxvdy5cbiAqXG4gKiBEZXYtd2FybiBzZWFtIChyZXNvbHZlcyB0aGUgaXNEZXZNb2RlLXdvdWxkLWJlLWFuLWVuZ2luZS1pbXBvcnQgcHJvYmxlbSk6XG4gKiAgIFRoaXMgbW9kdWxlIG11c3Qgbm90IGltcG9ydCBgc2NvcGUvZGV0ZWN0Q2lyY3VsYXJgIChlbmdpbmUgdGVycml0b3J5KS5cbiAqICAgSW5zdGVhZCwgYGNhcHR1cmUoKWAgYWNjZXB0cyB7QGxpbmsgQ2FwdHVyZUhvb2tzfSB3aXRoIGFuIG9wdGlvbmFsXG4gKiAgIGB3YXJuYCBjYWxsYmFjayBhbmQgaW52b2tlcyBpdCBvbiBldmVyeSBgJ3JlZidgIGNhcHR1cmUgYW5kIGV2ZXJ5XG4gKiAgIGAnY2xvbmUnYCBkZWdyYWRhdGlvbi4gVGhlIFdJUklORyBsYXllciAoQmxvY2sgNikgYmluZHMgYHdhcm5gIHRvIGFuXG4gKiAgIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCBjb25zb2xlIHdhcm5lcjsgdGhlIHB1cmUgbW9kdWxlIHN0YXlzXG4gKiAgIGVuZ2luZS1mcmVlIGFuZCBzaWxlbnQgYnkgZGVmYXVsdCAobm8gaG9va3Mg4oeSIG5vIHdhcm5pbmcsIHplcm8gY29zdCkuXG4gKlxuICogU3VtbWFyaXplciBib3VuZHMgKGRvY3VtZW50ZWQgY29udHJhY3QsIGV4cG9ydGVkIGFzIGNvbnN0YW50cyk6XG4gKiAgIC0gZGVwdGggICDiiaQge0BsaW5rIFBBWUxPQURfU1VNTUFSWV9NQVhfREVQVEh9ICAgKDMpIOKAlCBkZWVwZXIgc3RydWN0dXJlXG4gKiAgICAgY29sbGFwc2VzIHRvIGEgY2xhc3NpZmllZCBsZWFmIHdpdGggYGRlcHRoQ2xpcHBlZDogdHJ1ZWAuXG4gKiAgIC0gYnJlYWR0aCDiiaQge0BsaW5rIFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFU30gKDE2KSBwZXIgb2JqZWN0L2FycmF5IOKAlFxuICogICAgIHRoZSByZW1haW5kZXIgaXMgZHJvcHBlZCBhbmQgZmxhZ2dlZCBgdHJ1bmNhdGVkOiB0cnVlYCAodGhlIGhvbmVzdFxuICogICAgIGBzaXplYCBzdGlsbCByZXBvcnRzIHRoZSByZWFsIGNvdW50KS5cbiAqICAgLSB0b3RhbCAgIOKJpCB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9OT0RFU30gICAoMTI4KSBzdW1tYXJ5IG5vZGVzIHBlclxuICogICAgIHBheWxvYWQg4oCUIGEgZ2xvYmFsIGJ1ZGdldCBzbyB3aWRlw5dkZWVwIHBheWxvYWRzIHN0YXkgTygxKS1ib3VuZGVkLlxuICogICAtIHN0cmluZyBwcmV2aWV3cyDiiaQgYFNVTU1BUllfUFJFVklFV19MRU5HVEhgICg4MCkgY2hhcnMuXG4gKiAgIEN5Y2xlcyBhcmUgZGV0ZWN0ZWQgKGFuY2VzdG9yIHNldCkgYW5kIGZsYWdnZWQgYGNpcmN1bGFyOiB0cnVlYDtcbiAqICAgdGhyb3dpbmcgZ2V0dGVycyB5aWVsZCBhIGAndW5yZWFkYWJsZSdgIGxlYWY7IHN5bWJvbC1rZXllZCBwcm9wZXJ0aWVzXG4gKiAgIGFyZSBpZ25vcmVkIChzYW1lIGFzIEpTT04gLyBgT2JqZWN0LmtleXNgKTsgYE1hcGAvYFNldGAgYXJlIGxlYXZlcyB3aXRoXG4gKiAgIHRoZWlyIFJFQUwgZW50cnkgY291bnQgKG5vIGRlc2NlbnQg4oCUIG1hdGNoZXMgYHN1bW1hcml6ZS50c2ApLlxuICovXG5cbmltcG9ydCB7IHR5cGUgU3VtbWFyeVZhbHVlVHlwZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4vc3VtbWFyaXplLmpzJztcblxuLyoqIFdoaWNoIG9ic2VydmVyIGNoYW5uZWwgcHJvZHVjZWQgYSBjYXB0dXJlZCBldmVudCAoUkZDLTAwMSDCpzUpLiAqL1xuZXhwb3J0IHR5cGUgQ2FwdHVyZUNoYW5uZWwgPSAnc2NvcGUnIHwgJ2Zsb3cnIHwgJ2VtaXQnO1xuXG4vKipcbiAqIEhvdyBhbiBldmVudCBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBpbnRvIHRoZSBlbnZlbG9wZSAoUkZDLTAwMSDCpzUpLlxuICogU2VlIHRoZSBtb2R1bGUgaGVhZGVyIGZvciB0aGUgZnVsbCBwZXItcG9saWN5IGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBDYXB0dXJlUG9saWN5ID0gJ3N1bW1hcnknIHwgJ2Nsb25lJyB8ICdyZWYnO1xuXG4vKipcbiAqIEEgY2FwdHVyZWQgb2JzZXJ2ZXIgZXZlbnQg4oCUIHNlbGYtY29udGFpbmVkIGFuZCBpbW11dGFibGUgKHNoYWxsb3ctZnJvemVuXG4gKiBhdCBjcmVhdGlvbikuIGBzZXFgIGlzIHRoZSBhcnJpdmFsIHN0YW1wIGFzc2lnbmVkIGF0IGNhcHR1cmUgdW5kZXIgdGhlXG4gKiBzaW5nbGUgSlMgdGhyZWFkOiBpdCB0b3RhbGx5IG9yZGVycyBldmVudHMgQUNST1NTIGFsbCB0aHJlZSBjaGFubmVscywgaXNcbiAqIG1vbm90b25pYywgYW5kIGlzIGdhcC1kZXRlY3RhYmxlIChhIGRyb3BwZWQgZXZlbnQgbGVhdmVzIGEgdmlzaWJsZSBob2xlXG4gKiBpbiB0aGUgZGVsaXZlcmVkIGBzZXFgIHNlcXVlbmNlIOKAlCBob25lc3QgbG9zcyBhY2NvdW50aW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlRW52ZWxvcGUge1xuICAvKiogQXJyaXZhbCBzdGFtcCDigJQgdG90YWwgb3JkZXIgYWNyb3NzIGNoYW5uZWxzOyBnYXBzIHJldmVhbCBkcm9wcy4gKi9cbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIC8qKiBQcm9kdWNpbmcgb2JzZXJ2ZXIgY2hhbm5lbC4gKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWw7XG4gIC8qKiBQcm9kdWNpbmcgaG9vayBuYW1lIOKAlCBgJ29uV3JpdGUnYCwgYCdvblN0YWdlRXhlY3V0ZWQnYCwgYCdvbkVtaXQnYCwgLi4uICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICAvKiogVGhlIGV4ZWN1dGlvbiBzdGVwIHRoYXQgcHJvZHVjZWQgdGhlIGV2ZW50IChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApLiAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVGhlIHJ1biB0aGF0IHByb2R1Y2VkIHRoZSBldmVudCAoQ29udmVudGlvbiA0IHBlci1ydW4gc2NvcGluZykuICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXIge0BsaW5rIENhcHR1cmVQb2xpY3l9IOKAlCBORVZFUiBhIGxpdmUgZW5naW5lIHJlZmVyZW5jZSB1bmRlclxuICAgKiBgJ3N1bW1hcnknYCAvIGAnY2xvbmUnYDsgdW5kZXIgYCdyZWYnYCB0aGUgY2FsbGVyIGFzc2VydGVkIGltbXV0YWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IHVua25vd247XG4gIC8qKiBDYXB0dXJlIHdhbGwtY2xvY2sgKG1zIGVwb2NoIGJ5IGRlZmF1bHQ7IGluamVjdGFibGUgdmlhIGhvb2tzLm5vdykuICovXG4gIHJlYWRvbmx5IGNhcHR1cmVkQXQ6IG51bWJlcjtcbn1cblxuLyoqIFRoZSByYXcgZXZlbnQgZGVzY3JpcHRpb24gaGFuZGVkIHRvIHtAbGluayBjYXB0dXJlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZVJlcXVlc3Qge1xuICAvKiogQXJyaXZhbCBzdGFtcCDigJQgYXNzaWduZWQgYnkgdGhlIG1lcmdlZCBxdWV1ZSdzIGNvdW50ZXIgKEJsb2NrIDMpLiAqL1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWw7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogVGhlIExJVkUgcGF5bG9hZCDigJQgYGNhcHR1cmUoKWAgbWF0ZXJpYWxpemVzIGl0IHBlciBwb2xpY3kuICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IHVua25vd247XG59XG5cbi8qKlxuICogRW5naW5lLWZyZWUgc2VhbXMgaW5qZWN0ZWQgYnkgdGhlIHdpcmluZyBsYXllciAoQmxvY2sgNikuIFRoZSBwdXJlIG1vZHVsZVxuICogbmV2ZXIgaW1wb3J0cyBkZXYtbW9kZSBvciBjbG9jayBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSG9va3Mge1xuICAvKipcbiAgICogRGlhZ25vc3RpYyBzaW5rIOKAlCBpbnZva2VkIG9uIGV2ZXJ5IGAncmVmJ2AgY2FwdHVyZSAoY2FsbGVyLWFzc2VydGVkXG4gICAqIGltbXV0YWJpbGl0eSkgYW5kIGV2ZXJ5IGAnY2xvbmUnYCDihpIgYCdzdW1tYXJ5J2AgZGVncmFkYXRpb24uIEJsb2NrIDZcbiAgICogYmluZHMgdGhpcyB0byBhbiBgaXNEZXZNb2RlKClgLWdhdGVkLCBkZWR1cGxpY2F0ZWQgd2FybmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Fybj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDbG9jayBmb3IgYGNhcHR1cmVkQXRgIOKAlCBkZWZhdWx0cyB0byBgRGF0ZS5ub3dgLiBJbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xufVxuXG4vKiogTWF4IG5lc3RpbmcgZGVwdGggYSBwYXlsb2FkIHN1bW1hcnkgZGVzY2VuZHMgYmVmb3JlIGNsaXBwaW5nLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfREVQVEggPSAzO1xuXG4vKiogTWF4IGVudHJpZXMgc3VtbWFyaXplZCBwZXIgb2JqZWN0L2FycmF5IGxldmVsIGJlZm9yZSB0cnVuY2F0aW5nLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFUyA9IDE2O1xuXG4vKiogR2xvYmFsIHBlci1wYXlsb2FkIGJ1ZGdldCBvZiBzdW1tYXJ5IG5vZGVzICh3aWRlw5dkZWVwIGhhcmQgYm91bmQpLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfTk9ERVMgPSAxMjg7XG5cbi8qKlxuICogTGVhZiBjbGFzc2lmaWNhdGlvbiBmb3IgYSBzdW1tYXJ5IG5vZGUg4oCUIHRoZSBgc3VtbWFyaXplLnRzYCBmYW1pbHkgcGx1c1xuICogYCd1bnJlYWRhYmxlJ2AgZm9yIHByb3BlcnRpZXMgd2hvc2UgZ2V0dGVyIHRocmV3IGR1cmluZyBjYXB0dXJlLlxuICovXG5leHBvcnQgdHlwZSBQYXlsb2FkU3VtbWFyeVR5cGUgPSBTdW1tYXJ5VmFsdWVUeXBlIHwgJ3VucmVhZGFibGUnO1xuXG4vKipcbiAqIE9uZSBub2RlIG9mIGEgcGF5bG9hZCBzdW1tYXJ5IHRyZWUuIEV2ZXJ5IGZpZWxkIGlzIGEgcHJpbWl0aXZlLCBhIHBsYWluXG4gKiBvYmplY3QsIG9yIGEgcGxhaW4gYXJyYXkg4oCUIHN0cnVjdHVyZWQtY2xvbmUtc2FmZSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgLyoqIENsYXNzaWZpY2F0aW9uIOKAlCBzYW1lIHJ1bGVzIGFzIHRoZSByZXRlbnRpb24gbWFya2VycyAob25lIGNvZGUgcGF0aCkuICovXG4gIHJlYWRvbmx5IHR5cGU6IFBheWxvYWRTdW1tYXJ5VHlwZTtcbiAgLyoqIEhvbmVzdCBzaXplIHByb3h5OiBzdHJpbmcgbGVuZ3RoLCBhcnJheSBsZW5ndGgsIG9yIGtleS9lbnRyeSBjb3VudC4gKi9cbiAgcmVhZG9ubHkgc2l6ZT86IG51bWJlcjtcbiAgLyoqIEZpcnN0IGBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIYCBjaGFycyDigJQgcHJpbWl0aXZlcy9zdHJpbmdzIG9ubHkuICovXG4gIHJlYWRvbmx5IHByZXZpZXc/OiBzdHJpbmc7XG4gIC8qKiBTdW1tYXJpemVkIG93biBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIChvYmplY3RzKS4gKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlPj47XG4gIC8qKiBTdW1tYXJpemVkIGxlYWRpbmcgaXRlbXMgKGFycmF5cykuICovXG4gIHJlYWRvbmx5IGl0ZW1zPzogcmVhZG9ubHkgUGF5bG9hZFN1bW1hcnlOb2RlW107XG4gIC8qKiBFbnRyaWVzIHdlcmUgb21pdHRlZCBoZXJlIChicmVhZHRoIGNhcCBvciBub2RlIGJ1ZGdldCkuICovXG4gIHJlYWRvbmx5IHRydW5jYXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGlzIHZhbHVlIGlzIGFuIGFuY2VzdG9yIG9mIGl0c2VsZiDigJQgZGVzY2VudCBzdG9wcGVkLiAqL1xuICByZWFkb25seSBjaXJjdWxhcj86IHRydWU7XG4gIC8qKiB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSH0gcmVhY2hlZCDigJQgY2hpbGRyZW4gbm90IGRlc2NlbmRlZC4gKi9cbiAgcmVhZG9ubHkgZGVwdGhDbGlwcGVkPzogdHJ1ZTtcbn1cblxuLyoqXG4gKiBSb290IG9mIGEgcGF5bG9hZCBzdW1tYXJ5IOKAlCBicmFuZGVkIHNvIGNvbnN1bWVycyAoYW5kIHRlc3RzKSBjYW4gZGV0ZWN0XG4gKiB0aGF0IGEgcGF5bG9hZCB3YXMgc3VtbWFyaXplZCByYXRoZXIgdGhhbiBjbG9uZWQuIFNpYmxpbmcgb2YgdGhlXG4gKiBgX19yZWFkU3VtbWFyeWAgLyBgX193cml0ZVN1bW1hcnlgIHJldGVudGlvbiBtYXJrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRTdW1tYXJ5IGV4dGVuZHMgUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgLyoqIERpc2NyaW1pbmFudCDigJQgYCdzdW1tYXJ5J2AtcG9saWN5IGVudmVsb3BlIHBheWxvYWRzIGNhcnJ5IHRoaXMuICovXG4gIHJlYWRvbmx5IF9fcGF5bG9hZFN1bW1hcnk6IHRydWU7XG59XG5cbi8qKiBNdXRhYmxlIGNvbnN0cnVjdGlvbiBzaGFwZSBmb3Ige0BsaW5rIFBheWxvYWRTdW1tYXJ5Tm9kZX0uICovXG5pbnRlcmZhY2UgU3VtbWFyeU5vZGVEcmFmdCB7XG4gIHR5cGU6IFBheWxvYWRTdW1tYXJ5VHlwZTtcbiAgc2l6ZT86IG51bWJlcjtcbiAgcHJldmlldz86IHN0cmluZztcbiAgZmllbGRzPzogUmVjb3JkPHN0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlPjtcbiAgaXRlbXM/OiBQYXlsb2FkU3VtbWFyeU5vZGVbXTtcbiAgdHJ1bmNhdGVkPzogYm9vbGVhbjtcbiAgY2lyY3VsYXI/OiB0cnVlO1xuICBkZXB0aENsaXBwZWQ/OiB0cnVlO1xufVxuXG4vKiogU2hhcmVkIG11dGFibGUgbm9kZSBidWRnZXQgZm9yIG9uZSB7QGxpbmsgc3VtbWFyaXplUGF5bG9hZH0gY2FsbC4gKi9cbmludGVyZmFjZSBTdW1tYXJpemVCdWRnZXQge1xuICBub2Rlc0xlZnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDbGFzc2lmeSBvbmUgdmFsdWUgdGhyb3VnaCB0aGUgT05FIGNsYXNzaWZpY2F0aW9uIHBhdGggc2hhcmVkIHdpdGggdGhlXG4gKiByZXRlbnRpb24gbWFya2Vycy4gR0FURSBOT1RFOiBCbG9jayAxIG1heSBub3QgbW9kaWZ5IGBzdW1tYXJpemUudHNgLCBzb1xuICogdGhlIG1vZHVsZS1wcml2YXRlIGBjbGFzc2lmeVZhbHVlYCBpcyByZWFjaGVkIHRocm91Z2ggaXRzIGV4cG9ydGVkIGZhY2FkZVxuICogYW5kIHRoZSBicmFuZCBmaWVsZCBpcyBkcm9wcGVkIGJ5IGV4cGxpY2l0IGNvcHkg4oCUIEJsb2NrIDYgbWF5IGV4cG9ydFxuICogYGNsYXNzaWZ5VmFsdWVgIGRpcmVjdGx5IGFuZCBpbmxpbmUgdGhpcyBob3AuXG4gKi9cbmZ1bmN0aW9uIGNsYXNzaWZ5TGVhZih2YWx1ZTogdW5rbm93bik6IFN1bW1hcnlOb2RlRHJhZnQge1xuICBjb25zdCBtYXJrZXIgPSBzdW1tYXJpemVXcml0ZVZhbHVlKHZhbHVlKTtcbiAgY29uc3QgbGVhZjogU3VtbWFyeU5vZGVEcmFmdCA9IHsgdHlwZTogbWFya2VyLnR5cGUgfTtcbiAgaWYgKG1hcmtlci5zaXplICE9PSB1bmRlZmluZWQpIGxlYWYuc2l6ZSA9IG1hcmtlci5zaXplO1xuICBpZiAobWFya2VyLnByZXZpZXcgIT09IHVuZGVmaW5lZCkgbGVhZi5wcmV2aWV3ID0gbWFya2VyLnByZXZpZXc7XG4gIHJldHVybiBsZWFmO1xufVxuXG4vKiogUmVhZCBvbmUgY2hpbGQgcHJvcGVydHksIGNvbnZlcnRpbmcgdGhyb3dpbmcgZ2V0dGVycyBpbnRvIGEgbGVhZi4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZUNoaWxkKFxuICBwYXJlbnQ6IG9iamVjdCxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIsXG4gIGRlcHRoOiBudW1iZXIsXG4gIGJ1ZGdldDogU3VtbWFyaXplQnVkZ2V0LFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+LFxuKTogUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgbGV0IGNoaWxkOiB1bmtub3duO1xuICB0cnkge1xuICAgIGNoaWxkID0gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ3VucmVhZGFibGUnLCBwcmV2aWV3OiAnW2dldHRlciB0aHJldyBkdXJpbmcgY2FwdHVyZV0nIH07XG4gIH1cbiAgcmV0dXJuIHN1bW1hcml6ZU5vZGUoY2hpbGQsIGRlcHRoLCBidWRnZXQsIGFuY2VzdG9ycyk7XG59XG5cbmZ1bmN0aW9uIHN1bW1hcml6ZU5vZGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZXB0aDogbnVtYmVyLFxuICBidWRnZXQ6IFN1bW1hcml6ZUJ1ZGdldCxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0Pixcbik6IFBheWxvYWRTdW1tYXJ5Tm9kZSB7XG4gIGJ1ZGdldC5ub2Rlc0xlZnQgLT0gMTtcbiAgY29uc3QgbGVhZiA9IGNsYXNzaWZ5TGVhZih2YWx1ZSk7XG5cbiAgLy8gT25seSBwbGFpbiBjb250YWluZXJzIGRlc2NlbmQuIE1hcC9TZXQgc3RheSBsZWF2ZXMgKHJlYWwgZW50cnkgY291bnRcbiAgLy8gYWxyZWFkeSBvbiBgc2l6ZWAg4oCUIG1hdGNoZXMgc3VtbWFyaXplLnRzKTsgZXZlcnl0aGluZyBlbHNlIGlzIGEgbGVhZi5cbiAgY29uc3QgY29udGFpbmVyID0gKGxlYWYudHlwZSA9PT0gJ29iamVjdCcgfHwgbGVhZi50eXBlID09PSAnYXJyYXknKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xuICBpZiAoIWNvbnRhaW5lciB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIGxlYWY7XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0O1xuICBpZiAoYW5jZXN0b3JzLmhhcyhvYmopKSByZXR1cm4geyAuLi5sZWFmLCBjaXJjdWxhcjogdHJ1ZSB9O1xuICBpZiAoZGVwdGggPj0gUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSCkgcmV0dXJuIHsgLi4ubGVhZiwgZGVwdGhDbGlwcGVkOiB0cnVlIH07XG4gIGlmIChidWRnZXQubm9kZXNMZWZ0IDw9IDApIHJldHVybiB7IC4uLmxlYWYsIHRydW5jYXRlZDogdHJ1ZSB9O1xuXG4gIGFuY2VzdG9ycy5hZGQob2JqKTtcbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4odmFsdWUubGVuZ3RoLCBQQVlMT0FEX1NVTU1BUllfTUFYX0VOVFJJRVMpO1xuICAgICAgY29uc3QgaXRlbXM6IFBheWxvYWRTdW1tYXJ5Tm9kZVtdID0gW107XG4gICAgICBsZXQgY2xpcHBlZCA9IHZhbHVlLmxlbmd0aCA+IGxpbWl0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICAgIGlmIChidWRnZXQubm9kZXNMZWZ0IDw9IDApIHtcbiAgICAgICAgICBjbGlwcGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpdGVtcy5wdXNoKHN1bW1hcml6ZUNoaWxkKHZhbHVlLCBpLCBkZXB0aCArIDEsIGJ1ZGdldCwgYW5jZXN0b3JzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xpcHBlZCA/IHsgLi4ubGVhZiwgaXRlbXMsIHRydW5jYXRlZDogdHJ1ZSB9IDogeyAuLi5sZWFmLCBpdGVtcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFUyk7XG4gICAgLy8gQnVpbHQgdmlhIGVudHJpZXMgKyBmcm9tRW50cmllcyBzbyBob3N0aWxlIGtleXMgKCdfX3Byb3RvX18nLCAuLi4pXG4gICAgLy8gYmVjb21lIG93biBkYXRhIHByb3BlcnRpZXMg4oCUIG5ldmVyIHByb3RvdHlwZSB3cml0ZXMuXG4gICAgY29uc3QgZW50cmllczogQXJyYXk8W3N0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlXT4gPSBbXTtcbiAgICBsZXQgY2xpcHBlZCA9IGtleXMubGVuZ3RoID4gbGltaXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICBpZiAoYnVkZ2V0Lm5vZGVzTGVmdCA8PSAwKSB7XG4gICAgICAgIGNsaXBwZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVudHJpZXMucHVzaChba2V5c1tpXSwgc3VtbWFyaXplQ2hpbGQob2JqLCBrZXlzW2ldLCBkZXB0aCArIDEsIGJ1ZGdldCwgYW5jZXN0b3JzKV0pO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG4gICAgcmV0dXJuIGNsaXBwZWQgPyB7IC4uLmxlYWYsIGZpZWxkcywgdHJ1bmNhdGVkOiB0cnVlIH0gOiB7IC4uLmxlYWYsIGZpZWxkcyB9O1xuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUob2JqKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2R1Y2UgYSBib3VuZGVkLCByZWZlcmVuY2UtZnJlZSwgc3RydWN0dXJlZC1jbG9uZS1zYWZlIHN1bW1hcnkgb2YgYW5cbiAqIGFyYml0cmFyeSBwYXlsb2FkLiBOZXZlciB0aHJvd3M7IG5ldmVyIGhvbGRzIGEgcmVmZXJlbmNlIGludG8gdGhlIHNvdXJjZVxuICogdmFsdWUgKGV2ZXJ5IG5vZGUgaXMgYSBmcmVzaCBvYmplY3Qgd2hvc2UgZmllbGRzIGFyZSBwcmltaXRpdmVzKS4gQm91bmRzXG4gKiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgbW9kdWxlIGhlYWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVBheWxvYWQocGF5bG9hZDogdW5rbm93bik6IFBheWxvYWRTdW1tYXJ5IHtcbiAgY29uc3QgYnVkZ2V0OiBTdW1tYXJpemVCdWRnZXQgPSB7IG5vZGVzTGVmdDogUEFZTE9BRF9TVU1NQVJZX01BWF9OT0RFUyB9O1xuICBjb25zdCByb290ID0gc3VtbWFyaXplTm9kZShwYXlsb2FkLCAwLCBidWRnZXQsIG5ldyBTZXQ8b2JqZWN0PigpKTtcbiAgcmV0dXJuIHsgX19wYXlsb2FkU3VtbWFyeTogdHJ1ZSwgLi4ucm9vdCB9O1xufVxuXG4vKiogTWF0ZXJpYWxpemUgdGhlIHBheWxvYWQgcGVyIHBvbGljeSDigJQgc2VlIHRoZSBtb2R1bGUgaGVhZGVyIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gY2FwdHVyZVBheWxvYWQocmVxdWVzdDogQ2FwdHVyZVJlcXVlc3QsIHBvbGljeTogQ2FwdHVyZVBvbGljeSwgaG9va3M/OiBDYXB0dXJlSG9va3MpOiB1bmtub3duIHtcbiAgaWYgKHBvbGljeSA9PT0gJ3JlZicpIHtcbiAgICBob29rcz8ud2Fybj8uKFxuICAgICAgYFtmb290cHJpbnRqcyBjYXB0dXJlXSAncmVmJyBjYXB0dXJlIGZvciAke3JlcXVlc3QuY2hhbm5lbH0uJHtyZXF1ZXN0Lm1ldGhvZH0gcGFzc2VzIGEgTElWRSByZWZlcmVuY2UgYCArXG4gICAgICAgICd0aHJvdWdoIGRlZmVycmVkIGRlbGl2ZXJ5IOKAlCB0aGUgY2FsbGVyIGFzc2VydHMgdGhlIHBheWxvYWQgaXMgaW1tdXRhYmxlIHVudGlsIGRlbGl2ZXJlZC4nLFxuICAgICk7XG4gICAgcmV0dXJuIHJlcXVlc3QucGF5bG9hZDtcbiAgfVxuICBpZiAocG9saWN5ID09PSAnY2xvbmUnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUocmVxdWVzdC5wYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGhvb2tzPy53YXJuPy4oXG4gICAgICAgIGBbZm9vdHByaW50anMgY2FwdHVyZV0gJ2Nsb25lJyBjYXB0dXJlIGZvciAke3JlcXVlc3QuY2hhbm5lbH0uJHtyZXF1ZXN0Lm1ldGhvZH0gZmFpbGVkIGAgK1xuICAgICAgICAgIFwiKHN0cnVjdHVyZWRDbG9uZSB0aHJldyDigJQgdW5jbG9uYWJsZSBwYXlsb2FkKTsgZGVncmFkZWQgdG8gJ3N1bW1hcnknLlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdW1tYXJpemVQYXlsb2FkKHJlcXVlc3QucGF5bG9hZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpemVQYXlsb2FkKHJlcXVlc3QucGF5bG9hZCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZSBvbmUgb2JzZXJ2ZXIgZXZlbnQgaW50byBhbiBpbW11dGFibGUge0BsaW5rIENhcHR1cmVFbnZlbG9wZX0uXG4gKlxuICogR3VhcmFudGVlczpcbiAqICAgLSBOZXZlciB0aHJvd3MgaW50byB0aGUgcHJvZHVjZXIgKGAnY2xvbmUnYCBkZWdyYWRhdGlvbiwgc3VtbWFyaXplclxuICogICAgIG5ldmVyLXRocm93cyBjb250cmFjdCkuXG4gKiAgIC0gVGhlIHJldHVybmVkIGVudmVsb3BlIGlzIHNoYWxsb3ctZnJvemVuIOKAlCBgc2VxYC9gY2hhbm5lbGAvLi4uIGNhbm5vdFxuICogICAgIGJlIHJlYXNzaWduZWQuIFVuZGVyIGAnc3VtbWFyeSdgL2AnY2xvbmUnYCB0aGUgcGF5bG9hZCBob2xkcyBubyBsaXZlXG4gKiAgICAgcmVmZXJlbmNlIGludG8gdGhlIHNvdXJjZTsgdW5kZXIgYCdyZWYnYCBpdCBpbnRlbnRpb25hbGx5IGRvZXMuXG4gKiAgIC0gRGVmYXVsdCBwb2xpY3kgaXMgYCdzdW1tYXJ5J2AgKGNoZWFwZXN0IHNhZmUgdGllcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlKFxuICByZXF1ZXN0OiBDYXB0dXJlUmVxdWVzdCxcbiAgcG9saWN5OiBDYXB0dXJlUG9saWN5ID0gJ3N1bW1hcnknLFxuICBob29rcz86IENhcHR1cmVIb29rcyxcbik6IENhcHR1cmVFbnZlbG9wZSB7XG4gIGNvbnN0IGNhcHR1cmVkQXQgPSBob29rcz8ubm93ICE9PSB1bmRlZmluZWQgPyBob29rcy5ub3coKSA6IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBzZXE6IHJlcXVlc3Quc2VxLFxuICAgIGNoYW5uZWw6IHJlcXVlc3QuY2hhbm5lbCxcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiByZXF1ZXN0LnJ1bnRpbWVTdGFnZUlkLFxuICAgIHJ1bklkOiByZXF1ZXN0LnJ1bklkLFxuICAgIHBheWxvYWQ6IGNhcHR1cmVQYXlsb2FkKHJlcXVlc3QsIHBvbGljeSwgaG9va3MpLFxuICAgIGNhcHR1cmVkQXQsXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /* istanbul ignore file */
3
+ /**
4
+ * capture/ — Shared value-capture / retention primitives (zero deps, leaf
5
+ * module — `memory/` imports it, never the reverse).
6
+ *
7
+ * One home for "what do we keep about a tracked operation's value?":
8
+ * - `RetentionPolicy` — the `'full' | 'summary' | 'off'` family behind the
9
+ * #14 `readTracking` and #13c-A `writeTracking` dials.
10
+ * - `summarizeReadValue` / `summarizeWriteValue` — the parameterized
11
+ * summary-marker builders sharing one classification path.
12
+ *
13
+ * RFC-001 (deferred observer delivery) builds its capture tier on this
14
+ * module — see the mapping notes in `policies.ts`.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.summarizeWriteValue = exports.summarizeReadValue = exports.SUMMARY_PREVIEW_LENGTH = exports.READ_PREVIEW_LENGTH = void 0;
18
+ var summarize_js_1 = require("./summarize.js");
19
+ Object.defineProperty(exports, "READ_PREVIEW_LENGTH", { enumerable: true, get: function () { return summarize_js_1.READ_PREVIEW_LENGTH; } });
20
+ Object.defineProperty(exports, "SUMMARY_PREVIEW_LENGTH", { enumerable: true, get: function () { return summarize_js_1.SUMMARY_PREVIEW_LENGTH; } });
21
+ Object.defineProperty(exports, "summarizeReadValue", { enumerable: true, get: function () { return summarize_js_1.summarizeReadValue; } });
22
+ Object.defineProperty(exports, "summarizeWriteValue", { enumerable: true, get: function () { return summarize_js_1.summarizeWriteValue; } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBCQUEwQjtBQUMxQjs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUlILCtDQUFzSDtBQUE3RyxtSEFBQSxtQkFBbUIsT0FBQTtBQUFFLHNIQUFBLHNCQUFzQixPQUFBO0FBQUUsa0hBQUEsa0JBQWtCLE9BQUE7QUFBRSxtSEFBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG4vKipcbiAqIGNhcHR1cmUvIOKAlCBTaGFyZWQgdmFsdWUtY2FwdHVyZSAvIHJldGVudGlvbiBwcmltaXRpdmVzICh6ZXJvIGRlcHMsIGxlYWZcbiAqIG1vZHVsZSDigJQgYG1lbW9yeS9gIGltcG9ydHMgaXQsIG5ldmVyIHRoZSByZXZlcnNlKS5cbiAqXG4gKiBPbmUgaG9tZSBmb3IgXCJ3aGF0IGRvIHdlIGtlZXAgYWJvdXQgYSB0cmFja2VkIG9wZXJhdGlvbidzIHZhbHVlP1wiOlxuICogICAtIGBSZXRlbnRpb25Qb2xpY3lgIOKAlCB0aGUgYCdmdWxsJyB8ICdzdW1tYXJ5JyB8ICdvZmYnYCBmYW1pbHkgYmVoaW5kIHRoZVxuICogICAgICMxNCBgcmVhZFRyYWNraW5nYCBhbmQgIzEzYy1BIGB3cml0ZVRyYWNraW5nYCBkaWFscy5cbiAqICAgLSBgc3VtbWFyaXplUmVhZFZhbHVlYCAvIGBzdW1tYXJpemVXcml0ZVZhbHVlYCDigJQgdGhlIHBhcmFtZXRlcml6ZWRcbiAqICAgICBzdW1tYXJ5LW1hcmtlciBidWlsZGVycyBzaGFyaW5nIG9uZSBjbGFzc2lmaWNhdGlvbiBwYXRoLlxuICpcbiAqIFJGQy0wMDEgKGRlZmVycmVkIG9ic2VydmVyIGRlbGl2ZXJ5KSBidWlsZHMgaXRzIGNhcHR1cmUgdGllciBvbiB0aGlzXG4gKiBtb2R1bGUg4oCUIHNlZSB0aGUgbWFwcGluZyBub3RlcyBpbiBgcG9saWNpZXMudHNgLlxuICovXG5cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi9wb2xpY2llcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBTdW1tYXJ5VmFsdWVUeXBlLCBXcml0ZVN1bW1hcnlNYXJrZXIgfSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG5leHBvcnQgeyBSRUFEX1BSRVZJRVdfTEVOR1RILCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RILCBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG4iXX0=
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * policies.ts — The retention policy family shared by every snapshot-tracking
4
+ * dial (#14 `readTracking`, #13c-A `writeTracking`).
5
+ *
6
+ * RETENTION answers "what does the engine KEEP in its own snapshot state
7
+ * (`StageSnapshot.stageReads` / `stageWrites`, and therefore the commit
8
+ * observer's mutations payload) after the moment of the operation?" It is
9
+ * distinct from DELIVERY — what an observer receives at event time
10
+ * (`ScopeRecorder.onRead`/`onWrite` always deliver the live value, in every
11
+ * retention mode).
12
+ *
13
+ * ── RFC-001 (deferred observer delivery) mapping ──────────────────────────
14
+ * RFC-001's capture tier uses the vocabulary `'clone' | 'summary' | 'ref'`.
15
+ * When its Block 1 lands it builds on THIS module:
16
+ *
17
+ * - RFC capture `'clone'` ≈ retention `'full'` (alias at the module
18
+ * boundary — same semantics: structuredClone at capture time).
19
+ * - RFC capture `'summary'` ≈ retention `'summary'` (same marker shapes —
20
+ * see `summarize.ts`).
21
+ * - RFC capture `'ref'` is DELIVERY-tier only and is NOT implemented here
22
+ * — reserved. Retention must never hold live references into engine
23
+ * state: retained entries outlive the stage (the execution tree keeps
24
+ * them for the whole run), while a `'ref'` is only safe within the
25
+ * immutability window of the captured value. Holding one in retention
26
+ * would either pin state generations (the #18 leak) or expose
27
+ * later-mutated values as if they were point-in-time captures.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcG9saWNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG9saWNpZXMudHMg4oCUIFRoZSByZXRlbnRpb24gcG9saWN5IGZhbWlseSBzaGFyZWQgYnkgZXZlcnkgc25hcHNob3QtdHJhY2tpbmdcbiAqIGRpYWwgKCMxNCBgcmVhZFRyYWNraW5nYCwgIzEzYy1BIGB3cml0ZVRyYWNraW5nYCkuXG4gKlxuICogUkVURU5USU9OIGFuc3dlcnMgXCJ3aGF0IGRvZXMgdGhlIGVuZ2luZSBLRUVQIGluIGl0cyBvd24gc25hcHNob3Qgc3RhdGVcbiAqIChgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAvIGBzdGFnZVdyaXRlc2AsIGFuZCB0aGVyZWZvcmUgdGhlIGNvbW1pdFxuICogb2JzZXJ2ZXIncyBtdXRhdGlvbnMgcGF5bG9hZCkgYWZ0ZXIgdGhlIG1vbWVudCBvZiB0aGUgb3BlcmF0aW9uP1wiIEl0IGlzXG4gKiBkaXN0aW5jdCBmcm9tIERFTElWRVJZIOKAlCB3aGF0IGFuIG9ic2VydmVyIHJlY2VpdmVzIGF0IGV2ZW50IHRpbWVcbiAqIChgU2NvcGVSZWNvcmRlci5vblJlYWRgL2BvbldyaXRlYCBhbHdheXMgZGVsaXZlciB0aGUgbGl2ZSB2YWx1ZSwgaW4gZXZlcnlcbiAqIHJldGVudGlvbiBtb2RlKS5cbiAqXG4gKiDilIDilIAgUkZDLTAwMSAoZGVmZXJyZWQgb2JzZXJ2ZXIgZGVsaXZlcnkpIG1hcHBpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBSRkMtMDAxJ3MgY2FwdHVyZSB0aWVyIHVzZXMgdGhlIHZvY2FidWxhcnkgYCdjbG9uZScgfCAnc3VtbWFyeScgfCAncmVmJ2AuXG4gKiBXaGVuIGl0cyBCbG9jayAxIGxhbmRzIGl0IGJ1aWxkcyBvbiBUSElTIG1vZHVsZTpcbiAqXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdjbG9uZSdgICAg4omIIHJldGVudGlvbiBgJ2Z1bGwnYCAoYWxpYXMgYXQgdGhlIG1vZHVsZVxuICogICAgIGJvdW5kYXJ5IOKAlCBzYW1lIHNlbWFudGljczogc3RydWN0dXJlZENsb25lIGF0IGNhcHR1cmUgdGltZSkuXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdzdW1tYXJ5J2Ag4omIIHJldGVudGlvbiBgJ3N1bW1hcnknYCAoc2FtZSBtYXJrZXIgc2hhcGVzIOKAlFxuICogICAgIHNlZSBgc3VtbWFyaXplLnRzYCkuXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdyZWYnYCBpcyBERUxJVkVSWS10aWVyIG9ubHkgYW5kIGlzIE5PVCBpbXBsZW1lbnRlZCBoZXJlXG4gKiAgICAg4oCUIHJlc2VydmVkLiBSZXRlbnRpb24gbXVzdCBuZXZlciBob2xkIGxpdmUgcmVmZXJlbmNlcyBpbnRvIGVuZ2luZVxuICogICAgIHN0YXRlOiByZXRhaW5lZCBlbnRyaWVzIG91dGxpdmUgdGhlIHN0YWdlICh0aGUgZXhlY3V0aW9uIHRyZWUga2VlcHNcbiAqICAgICB0aGVtIGZvciB0aGUgd2hvbGUgcnVuKSwgd2hpbGUgYSBgJ3JlZidgIGlzIG9ubHkgc2FmZSB3aXRoaW4gdGhlXG4gKiAgICAgaW1tdXRhYmlsaXR5IHdpbmRvdyBvZiB0aGUgY2FwdHVyZWQgdmFsdWUuIEhvbGRpbmcgb25lIGluIHJldGVudGlvblxuICogICAgIHdvdWxkIGVpdGhlciBwaW4gc3RhdGUgZ2VuZXJhdGlvbnMgKHRoZSAjMTggbGVhaykgb3IgZXhwb3NlXG4gKiAgICAgbGF0ZXItbXV0YXRlZCB2YWx1ZXMgYXMgaWYgdGhleSB3ZXJlIHBvaW50LWluLXRpbWUgY2FwdHVyZXMuXG4gKi9cblxuLyoqXG4gKiBIb3cgYSB0cmFja2VkIG9wZXJhdGlvbidzIHZhbHVlIGlzIHJldGFpbmVkIGluIHRoZSBwZXItc3RhZ2Ugc25hcHNob3Qgdmlldy5cbiAqXG4gKiAtIGAnZnVsbCdgIOKAlCBgc3RydWN0dXJlZENsb25lYCB0aGUgdmFsdWUgYXQgdGhlIG1vbWVudCBvZiB0aGUgb3BlcmF0aW9uXG4gKiAgICh0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGZvciBib3RoIGRpYWxzOyBwb2ludC1pbi10aW1lLCBkZXRhY2hlZCBjb3B5KS5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHJldGFpbiBhIGNoZWFwIG1hcmtlciAodHlwZSArIHNpemUgcHJveHkgKyBzaG9ydCBwcmV2aWV3KVxuICogICBpbnN0ZWFkIG9mIHRoZSB2YWx1ZS4gTygxKS1pc2ggcGVyIG9wZXJhdGlvbjsgbm8gdmFsdWUgY2xvbmUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJldGFpbiBub3RoaW5nLiBUaGUgb3BlcmF0aW9uIGl0c2VsZiBpcyB1bmFmZmVjdGVkIChyZWFkc1xuICogICBzdGlsbCByZXR1cm4gdmFsdWVzLCB3cml0ZXMgc3RpbGwgY29tbWl0KTsgb25seSB0aGUgc25hcHNob3QgYm9va2tlZXBpbmdcbiAqICAgaXMgc2tpcHBlZC5cbiAqXG4gKiBgUmVhZFRyYWNraW5nTW9kZWAgKCMxNCkgYW5kIGBXcml0ZVRyYWNraW5nTW9kZWAgKCMxM2MtQSkgYXJlIHB1YmxpY1xuICogYWxpYXNlcyBvZiB0aGlzIHR5cGUg4oCUIHNlZSBgbWVtb3J5L3R5cGVzLnRzYC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV0ZW50aW9uUG9saWN5ID0gJ2Z1bGwnIHwgJ3N1bW1hcnknIHwgJ29mZic7XG4iXX0=
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * summarize.ts — Cheap value summarization for `'summary'` retention.
4
+ *
5
+ * Extracted from `StageContext` (#14's `summarizeReadValue`) into a shared,
6
+ * brand-parameterized helper so both snapshot-tracking dials (#14
7
+ * `readTracking`, #13c-A `writeTracking`) — and later RFC-001's deferred
8
+ * observer capture tier — produce identical summaries from ONE code path.
9
+ *
10
+ * Deliberately avoids every O(value) operation: no clone, no serialization.
11
+ * See {@link ReadSummaryMarker} for the honest-cost contract.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.summarizeWriteValue = exports.summarizeReadValue = exports.READ_PREVIEW_LENGTH = exports.SUMMARY_PREVIEW_LENGTH = void 0;
15
+ /** Max characters captured in a summary marker's `preview`. */
16
+ exports.SUMMARY_PREVIEW_LENGTH = 80;
17
+ /**
18
+ * Compat alias for {@link SUMMARY_PREVIEW_LENGTH} — the name shipped with
19
+ * #14, kept so existing import paths (`memory/types`, the memory barrel)
20
+ * stay valid. Same constant; reads and writes share one preview cap.
21
+ */
22
+ exports.READ_PREVIEW_LENGTH = exports.SUMMARY_PREVIEW_LENGTH;
23
+ /**
24
+ * The one classification path both brands share — every per-type rule
25
+ * (including the Map/Set real-entry-count handling) lives here exactly once.
26
+ */
27
+ function classifyValue(value) {
28
+ if (value === null)
29
+ return { type: 'null' };
30
+ if (typeof value === 'string') {
31
+ return { type: 'string', size: value.length, preview: value.slice(0, exports.SUMMARY_PREVIEW_LENGTH) };
32
+ }
33
+ if (Array.isArray(value))
34
+ return { type: 'array', size: value.length };
35
+ if (value instanceof Map || value instanceof Set) {
36
+ // Object.keys() on a Map/Set is always [] — report the real entry count.
37
+ return { type: 'object', size: value.size };
38
+ }
39
+ if (typeof value === 'object') {
40
+ return { type: 'object', size: Object.keys(value).length };
41
+ }
42
+ if (typeof value === 'function')
43
+ return { type: 'function' };
44
+ // number | boolean | bigint | symbol — String() is O(rendered length)
45
+ return { type: typeof value, preview: String(value).slice(0, exports.SUMMARY_PREVIEW_LENGTH) };
46
+ }
47
+ /**
48
+ * Summarize a tracked READ for `readTracking: 'summary'` (#14). Byte-identical
49
+ * output to the pre-extraction `StageContext`-local implementation.
50
+ */
51
+ function summarizeReadValue(value) {
52
+ return { __readSummary: true, ...classifyValue(value) };
53
+ }
54
+ exports.summarizeReadValue = summarizeReadValue;
55
+ /**
56
+ * Summarize a tracked WRITE for `writeTracking: 'summary'` (#13c-A). Sibling
57
+ * of {@link summarizeReadValue} — same classification, distinct brand.
58
+ */
59
+ function summarizeWriteValue(value) {
60
+ return { __writeSummary: true, ...classifyValue(value) };
61
+ }
62
+ exports.summarizeWriteValue = summarizeWriteValue;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3N1bW1hcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBRUgsK0RBQStEO0FBQ2xELFFBQUEsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRXpDOzs7O0dBSUc7QUFDVSxRQUFBLG1CQUFtQixHQUFHLDhCQUFzQixDQUFDO0FBa0QxRDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDhCQUFzQixDQUFDLEVBQUUsQ0FBQztJQUNqRyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkUsSUFBSSxLQUFLLFlBQVksR0FBRyxJQUFJLEtBQUssWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx5RUFBeUU7UUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFnQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDN0Qsc0VBQXNFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxLQUF5QixFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw4QkFBc0IsQ0FBQyxFQUFFLENBQUM7QUFDN0csQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFjO0lBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDM0QsQ0FBQztBQUZELGtEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdW1tYXJpemUudHMg4oCUIENoZWFwIHZhbHVlIHN1bW1hcml6YXRpb24gZm9yIGAnc3VtbWFyeSdgIHJldGVudGlvbi5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSBgU3RhZ2VDb250ZXh0YCAoIzE0J3MgYHN1bW1hcml6ZVJlYWRWYWx1ZWApIGludG8gYSBzaGFyZWQsXG4gKiBicmFuZC1wYXJhbWV0ZXJpemVkIGhlbHBlciBzbyBib3RoIHNuYXBzaG90LXRyYWNraW5nIGRpYWxzICgjMTRcbiAqIGByZWFkVHJhY2tpbmdgLCAjMTNjLUEgYHdyaXRlVHJhY2tpbmdgKSDigJQgYW5kIGxhdGVyIFJGQy0wMDEncyBkZWZlcnJlZFxuICogb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyIOKAlCBwcm9kdWNlIGlkZW50aWNhbCBzdW1tYXJpZXMgZnJvbSBPTkUgY29kZSBwYXRoLlxuICpcbiAqIERlbGliZXJhdGVseSBhdm9pZHMgZXZlcnkgTyh2YWx1ZSkgb3BlcmF0aW9uOiBubyBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbi5cbiAqIFNlZSB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9IGZvciB0aGUgaG9uZXN0LWNvc3QgY29udHJhY3QuXG4gKi9cblxuLyoqIE1heCBjaGFyYWN0ZXJzIGNhcHR1cmVkIGluIGEgc3VtbWFyeSBtYXJrZXIncyBgcHJldmlld2AuICovXG5leHBvcnQgY29uc3QgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSCA9IDgwO1xuXG4vKipcbiAqIENvbXBhdCBhbGlhcyBmb3Ige0BsaW5rIFNVTU1BUllfUFJFVklFV19MRU5HVEh9IOKAlCB0aGUgbmFtZSBzaGlwcGVkIHdpdGhcbiAqICMxNCwga2VwdCBzbyBleGlzdGluZyBpbXBvcnQgcGF0aHMgKGBtZW1vcnkvdHlwZXNgLCB0aGUgbWVtb3J5IGJhcnJlbClcbiAqIHN0YXkgdmFsaWQuIFNhbWUgY29uc3RhbnQ7IHJlYWRzIGFuZCB3cml0ZXMgc2hhcmUgb25lIHByZXZpZXcgY2FwLlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9QUkVWSUVXX0xFTkdUSCA9IFNVTU1BUllfUFJFVklFV19MRU5HVEg7XG5cbi8qKiBgdHlwZW9mYCByZXN1bHQsIHJlZmluZWQgdG8gJ2FycmF5JyAvICdudWxsJyBmb3Igb2JqZWN0cy4gKi9cbmV4cG9ydCB0eXBlIFN1bW1hcnlWYWx1ZVR5cGUgPVxuICB8ICdzdHJpbmcnXG4gIHwgJ251bWJlcidcbiAgfCAnYm9vbGVhbidcbiAgfCAnYmlnaW50J1xuICB8ICdzeW1ib2wnXG4gIHwgJ2Z1bmN0aW9uJ1xuICB8ICdvYmplY3QnXG4gIHwgJ2FycmF5J1xuICB8ICdudWxsJztcblxuLyoqIEJyYW5kLWZyZWUgc3VtbWFyeSBmaWVsZHMgc2hhcmVkIGJ5IGJvdGggbWFya2VyIHNoYXBlcy4gKi9cbmludGVyZmFjZSBWYWx1ZVN1bW1hcnkge1xuICAvKiogYHR5cGVvZmAgcmVzdWx0LCByZWZpbmVkIHRvICdhcnJheScgLyAnbnVsbCcgZm9yIG9iamVjdHMuICovXG4gIHR5cGU6IFN1bW1hcnlWYWx1ZVR5cGU7XG4gIC8qKiBTaXplIHByb3h5OiBzdHJpbmcgbGVuZ3RoLCBhcnJheSBsZW5ndGgsIG9yIG9iamVjdCBrZXkgY291bnQuICovXG4gIHNpemU/OiBudW1iZXI7XG4gIC8qKiBGaXJzdCB7QGxpbmsgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSH0gY2hhcnMg4oCUIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3Mgb25seS4gKi9cbiAgcHJldmlldz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXJrZXIgcmVjb3JkZWQgaW4gYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgdW5kZXIgYHJlYWRUcmFja2luZzogJ3N1bW1hcnknYC5cbiAqXG4gKiBIb25lc3QgY29zdCBub3RlOiBgc2l6ZWAgaXMgYSBjaGVhcCBwcm94eSAoc3RyaW5nIGxlbmd0aCAvIGFycmF5IGxlbmd0aCAvXG4gKiBvYmplY3Qga2V5IGNvdW50KSwgTk9UIGEgc2VyaWFsaXplZCBieXRlIGNvdW50IOKAlCBjb21wdXRpbmcgcmVhbCBieXRlIHNpemVcbiAqIHdvdWxkIHJlcXVpcmUgYW4gTyh2YWx1ZSkgc2VyaWFsaXphdGlvbiwgd2hpY2ggaXMgZXhhY3RseSB0aGUgY29zdCB0aGVcbiAqIHN1bW1hcnkgbW9kZSByZW1vdmVzLiBgcHJldmlld2AgaXMgb25seSBwcm9kdWNlZCBmb3IgcHJpbWl0aXZlcyBhbmQgc3RyaW5nc1xuICogKGZpcnN0IHtAbGluayBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIfSBjaGFyYWN0ZXJzKTsgb2JqZWN0cyBhbmQgYXJyYXlzIGNhcnJ5XG4gKiBubyBwcmV2aWV3IGZvciB0aGUgc2FtZSByZWFzb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFN1bW1hcnlNYXJrZXIgZXh0ZW5kcyBWYWx1ZVN1bW1hcnkge1xuICAvKiogRGlzY3JpbWluYW50IOKAlCBsZXRzIHNuYXBzaG90IGNvbnN1bWVycyBkZXRlY3QgbWFya2VyIGVudHJpZXMuICovXG4gIF9fcmVhZFN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGVkIGluIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoYW5kIHRoZSBjb21taXQgb2JzZXJ2ZXInc1xuICogbXV0YXRpb25zIHBheWxvYWQpIHVuZGVyIGB3cml0ZVRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTNjLUEpLiBTYW1lIGZpZWxkc1xuICogYW5kIGNvc3QgY29udHJhY3QgYXMge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfTsgZGlzdGluY3QgYnJhbmQgc28gY29uc3VtZXJzXG4gKiBjYW4gdGVsbCB3aGljaCBkaWFsIHByb2R1Y2VkIGFuIGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlU3VtbWFyeU1hcmtlciBleHRlbmRzIFZhbHVlU3VtbWFyeSB7XG4gIC8qKiBEaXNjcmltaW5hbnQg4oCUIGxldHMgc25hcHNob3QgY29uc3VtZXJzIGRldGVjdCBtYXJrZXIgZW50cmllcy4gKi9cbiAgX193cml0ZVN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogVGhlIG9uZSBjbGFzc2lmaWNhdGlvbiBwYXRoIGJvdGggYnJhbmRzIHNoYXJlIOKAlCBldmVyeSBwZXItdHlwZSBydWxlXG4gKiAoaW5jbHVkaW5nIHRoZSBNYXAvU2V0IHJlYWwtZW50cnktY291bnQgaGFuZGxpbmcpIGxpdmVzIGhlcmUgZXhhY3RseSBvbmNlLlxuICovXG5mdW5jdGlvbiBjbGFzc2lmeVZhbHVlKHZhbHVlOiB1bmtub3duKTogVmFsdWVTdW1tYXJ5IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbnVsbCcgfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnc3RyaW5nJywgc2l6ZTogdmFsdWUubGVuZ3RoLCBwcmV2aWV3OiB2YWx1ZS5zbGljZSgwLCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIKSB9O1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHsgdHlwZTogJ2FycmF5Jywgc2l6ZTogdmFsdWUubGVuZ3RoIH07XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgIC8vIE9iamVjdC5rZXlzKCkgb24gYSBNYXAvU2V0IGlzIGFsd2F5cyBbXSDigJQgcmVwb3J0IHRoZSByZWFsIGVudHJ5IGNvdW50LlxuICAgIHJldHVybiB7IHR5cGU6ICdvYmplY3QnLCBzaXplOiB2YWx1ZS5zaXplIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnb2JqZWN0Jywgc2l6ZTogT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxlbmd0aCB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IHR5cGU6ICdmdW5jdGlvbicgfTtcbiAgLy8gbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCDigJQgU3RyaW5nKCkgaXMgTyhyZW5kZXJlZCBsZW5ndGgpXG4gIHJldHVybiB7IHR5cGU6IHR5cGVvZiB2YWx1ZSBhcyBTdW1tYXJ5VmFsdWVUeXBlLCBwcmV2aWV3OiBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIFNVTU1BUllfUFJFVklFV19MRU5HVEgpIH07XG59XG5cbi8qKlxuICogU3VtbWFyaXplIGEgdHJhY2tlZCBSRUFEIGZvciBgcmVhZFRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTQpLiBCeXRlLWlkZW50aWNhbFxuICogb3V0cHV0IHRvIHRoZSBwcmUtZXh0cmFjdGlvbiBgU3RhZ2VDb250ZXh0YC1sb2NhbCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVJlYWRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFJlYWRTdW1tYXJ5TWFya2VyIHtcbiAgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgLi4uY2xhc3NpZnlWYWx1ZSh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBTdW1tYXJpemUgYSB0cmFja2VkIFdSSVRFIGZvciBgd3JpdGVUcmFja2luZzogJ3N1bW1hcnknYCAoIzEzYy1BKS4gU2libGluZ1xuICogb2Yge0BsaW5rIHN1bW1hcml6ZVJlYWRWYWx1ZX0g4oCUIHNhbWUgY2xhc3NpZmljYXRpb24sIGRpc3RpbmN0IGJyYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplV3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFdyaXRlU3VtbWFyeU1hcmtlciB7XG4gIHJldHVybiB7IF9fd3JpdGVTdW1tYXJ5OiB0cnVlLCAuLi5jbGFzc2lmeVZhbHVlKHZhbHVlKSB9O1xufVxuIl19
@@ -30,6 +30,18 @@ class ContinuationResolver {
30
30
  * Key: node.id, Value: visit count (0 = first visit).
31
31
  */
32
32
  iterationCounters = new Map();
33
+ /**
34
+ * Total fn-bearing dynamic-next hops this traverser has followed.
35
+ *
36
+ * Fresh fn-bearing nodes bypass the per-node-id iteration counter (they
37
+ * are new nodes, often without stable ids — there is no back-edge to
38
+ * count). Without a bound, a stage that keeps returning a function-bearing
39
+ * dynamic `next` runs FOREVER on the flat trampoline (no stack overflow
40
+ * brakes it either). This run-total counter puts such chains under the
41
+ * same `maxIterations` budget (default 1000, tuned via
42
+ * `RunOptions.maxIterations`) that bounds loop edges.
43
+ */
44
+ dynamicNextHops = 0;
33
45
  onIterationUpdate;
34
46
  maxIterations;
35
47
  constructor(deps, nodeResolver, onIterationUpdate, maxIterations) {
@@ -55,14 +67,21 @@ class ContinuationResolver {
55
67
  * `onLoop` narrative), in the same order.
56
68
  *
57
69
  * Three dynamicNext patterns:
58
- * - StageNode with fn → truly dynamic node, returned as-is (no iteration
59
- * tracking — it is a fresh node, not a back-edge).
70
+ * - StageNode with fn → truly dynamic node, returned as-is (no per-node
71
+ * iteration tracking — it is a fresh node, not a back-edge — but the
72
+ * run-total dynamic-hop budget applies; see `dynamicNextHops`).
60
73
  * - String ID → reference to an existing node, resolved via NodeResolver.
61
74
  * - StageNode without fn → reference by ID, resolved via NodeResolver.
62
75
  */
63
76
  resolveTarget(dynamicNext, currentNode, context, branchPath, traversalContext) {
64
- // Truly dynamic node (has fn) → execute directly, no iteration tracking.
77
+ // Truly dynamic node (has fn) → execute directly, no per-node iteration
78
+ // tracking (fresh node, not a back-edge) — but the CHAIN of such hops is
79
+ // bounded by the run-total guard below, mirroring the loop budget.
65
80
  if (typeof dynamicNext !== 'string' && dynamicNext.fn) {
81
+ if (this.dynamicNextHops >= this.maxIterations) {
82
+ throw new Error(`Maximum dynamic-next continuations (${this.maxIterations}) exceeded at stage '${currentNode.id ?? currentNode.name}' ` + `(dynamic target '${dynamicNext.name}'). Set maxIterations to increase the limit.`);
83
+ }
84
+ this.dynamicNextHops++;
66
85
  context.addLog('dynamicNextDirect', true);
67
86
  context.addLog('dynamicNextName', dynamicNext.name);
68
87
  context.addFlowDebugMessage('next', `Moving to ${dynamicNext.name} stage (dynamic)`, {
@@ -124,4 +143,4 @@ class ContinuationResolver {
124
143
  }
125
144
  }
126
145
  exports.ContinuationResolver = ContinuationResolver;
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQVNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBYTNDLE1BQWEsb0JBQW9CO0lBV1o7SUFDQTtJQVhuQjs7O09BR0c7SUFDSyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUxQyxpQkFBaUIsQ0FBMkM7SUFDNUQsYUFBYSxDQUFTO0lBRXZDLFlBQ21CLElBQStCLEVBQy9CLFlBQXdDLEVBQ3pELGlCQUEyRCxFQUMzRCxhQUFzQjtRQUhMLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUE0QjtRQUl6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLElBQUksOEJBQXNCLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxXQUE2QyxFQUM3QyxJQUE2QixFQUM3QixPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGFBQWEsQ0FDWCxXQUE2QyxF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Z0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDYiw0QkFBNEIsSUFBSSxDQUFDLGFBQWEsd0JBQXdCLE1BQU0sS0FBSztnQkFDL0UsMENBQTBDLENBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFNBQWlCO1FBQ3RELE9BQU8sU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUFySUQsb0RBcUlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250aW51YXRpb25SZXNvbHZlciDigJQgQmFjay1lZGdlIHJlc29sdXRpb24gKyBpdGVyYXRpb24gY291bnRpbmcuXG4gKlxuICogUmVzb2x2ZXMgZHluYW1pYyBjb250aW51YXRpb25zIChsb29wLWJhY2tzLCBkeW5hbWljIG5leHQpIGFuZCB0cmFja3NcbiAqIHBlci1ub2RlIGl0ZXJhdGlvbiBjb3VudHMgZm9yIGNvbnRleHQgdHJlZSBuYW1pbmcuXG4gKlxuICogU3VwcG9ydHMgdGhyZWUgZHluYW1pY05leHQgcGF0dGVybnM6XG4gKiAtIFN0cmluZyBJRCDihpIgcmVmZXJlbmNlIHRvIGV4aXN0aW5nIG5vZGUgKHJlc29sdmUgdmlhIE5vZGVSZXNvbHZlcilcbiAqIC0gU3RhZ2VOb2RlIHdpdGggZm4g4oaSIHRydWx5IGR5bmFtaWMgbm9kZSAoZXhlY3V0ZSBkaXJlY3RseSlcbiAqIC0gU3RhZ2VOb2RlIHdpdGhvdXQgZm4g4oaSIHJlZmVyZW5jZSBieSBJRCAocmVzb2x2ZSB2aWEgTm9kZVJlc29sdmVyKVxuICpcbiAqIFR3byBlbnRyeSBwb2ludHM6XG4gKiAtIGByZXNvbHZlVGFyZ2V0YCDigJQgcmVzb2x2ZXMgdGhlIGNvbnRpbnVhdGlvbiB0byBgeyBub2RlLCBjb250ZXh0IH1gIGFuZFxuICogICBmaXJlcyBldmVyeSBzaWRlIGVmZmVjdCAoaXRlcmF0aW9uIGNvdW50aW5nLCBkZWJ1ZyBsb2dzLCBgb25Mb29wYFxuICogICBuYXJyYXRpdmUpIFdJVEhPVVQgZXhlY3V0aW5nLiBUaGUgdHJhdmVyc2VyJ3MgdHJhbXBvbGluZSBkcml2ZXIgdXNlc1xuICogICB0aGlzIHRvIGZvbGxvdyBsb29wIGVkZ2VzIGl0ZXJhdGl2ZWx5IOKAlCBmbGF0IHN0YWNrLCBzbyB0aGUgaXRlcmF0aW9uXG4gKiAgIGxpbWl0IChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICogLSBgcmVzb2x2ZWAg4oCUIHJlc29sdmVUYXJnZXQgKyBpbW1lZGlhdGUgZXhlY3V0aW9uIHZpYSB0aGUgcHJvdmlkZWRcbiAqICAgYGV4ZWN1dGVOb2RlYCBjYWxsYmFjay4gS2VwdCBmb3IgZGlyZWN0L2FkdmFuY2VkIGNhbGxlcnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuL05vZGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGVOb2RlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0lURVJBVElPTlMgPSAxMDAwO1xuXG4vKipcbiAqIEEgcmVzb2x2ZWQgY29udGludWF0aW9uIHRhcmdldCDigJQgdGhlIG5vZGUgdG8gZXhlY3V0ZSBuZXh0IHBsdXMgdGhlXG4gKiBTdGFnZUNvbnRleHQgdG8gZXhlY3V0ZSBpdCBpbi4gQWxsIHNpZGUgZWZmZWN0cyAoaXRlcmF0aW9uIGNvdW50aW5nLFxuICogZGVidWcgbG9ncywgYG9uTG9vcGAgbmFycmF0aXZlKSBoYXZlIGFscmVhZHkgZmlyZWQgYnkgdGhlIHRpbWUgdGhpc1xuICogaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb250aW51YXRpb248VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBjb250ZXh0OiBTdGFnZUNvbnRleHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBDb250aW51YXRpb25SZXNvbHZlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEl0ZXJhdGlvbiBjb3VudGVyIHBlciBub2RlIElELlxuICAgKiBLZXk6IG5vZGUuaWQsIFZhbHVlOiB2aXNpdCBjb3VudCAoMCA9IGZpcnN0IHZpc2l0KS5cbiAgICovXG4gIHByaXZhdGUgaXRlcmF0aW9uQ291bnRlcnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhJdGVyYXRpb25zOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPixcbiAgICBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlID0gb25JdGVyYXRpb25VcGRhdGU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gbWF4SXRlcmF0aW9ucyA/PyBERUZBVUxUX01BWF9JVEVSQVRJT05TO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiBhbmQgZXhlY3V0ZSBpdCBpbW1lZGlhdGVseS5cbiAgICogRXF1aXZhbGVudCB0byBgZXhlY3V0ZU5vZGUoLi4ucmVzb2x2ZVRhcmdldCguLi4pKWAg4oCUIHRoZSB0cmF2ZXJzZXInc1xuICAgKiBkcml2ZXIgbG9vcCBjYWxscyBgcmVzb2x2ZVRhcmdldGAgZGlyZWN0bHkgaW5zdGVhZCBzbyB0aGUgY29udGludWF0aW9uXG4gICAqIGJlY29tZXMgYSBmbGF0IHRyYW1wb2xpbmUgaG9wIHJhdGhlciB0aGFuIGEgcmV0YWluZWQgcmVjdXJzaXZlIGZyYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVRhcmdldChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgcmV0dXJuIGV4ZWN1dGVOb2RlKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgZHluYW1pYyBjb250aW51YXRpb24gdG8gaXRzIHRhcmdldCBub2RlICsgbmV4dCBTdGFnZUNvbnRleHRcbiAgICogV0lUSE9VVCBleGVjdXRpbmcgaXQuIEZpcmVzIHRoZSBzYW1lIHNpZGUgZWZmZWN0cyBgcmVzb2x2ZWAgYWx3YXlzIGRpZFxuICAgKiAoaXRlcmF0aW9uIGNvdW50aW5nICsgbGltaXQsIGBkeW5hbWljTmV4dCpgIGxvZ3MsIGxvb3AgZGVidWcgbWVzc2FnZSxcbiAgICogYG9uTG9vcGAgbmFycmF0aXZlKSwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIFRocmVlIGR5bmFtaWNOZXh0IHBhdHRlcm5zOlxuICAgKiAtIFN0YWdlTm9kZSB3aXRoIGZuIOKGkiB0cnVseSBkeW5hbWljIG5vZGUsIHJldHVybmVkIGFzLWlzIChubyBpdGVyYXRpb25cbiAgICogICB0cmFja2luZyDigJQgaXQgaXMgYSBmcmVzaCBub2RlLCBub3QgYSBiYWNrLWVkZ2UpLlxuICAgKiAtIFN0cmluZyBJRCDihpIgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG5vZGUsIHJlc29sdmVkIHZpYSBOb2RlUmVzb2x2ZXIuXG4gICAqIC0gU3RhZ2VOb2RlIHdpdGhvdXQgZm4g4oaSIHJlZmVyZW5jZSBieSBJRCwgcmVzb2x2ZWQgdmlhIE5vZGVSZXNvbHZlci5cbiAgICovXG4gIHJlc29sdmVUYXJnZXQoXG4gICAgZHluYW1pY05leHQ6IHN0cmluZyB8IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1cnJlbnROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBSZXNvbHZlZENvbnRpbnVhdGlvbjxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBUcnVseSBkeW5hbWljIG5vZGUgKGhhcyBmbikg4oaSIGV4ZWN1dGUgZGlyZWN0bHksIG5vIGl0ZXJhdGlvbiB0cmFja2luZy5cbiAgICBpZiAodHlwZW9mIGR5bmFtaWNOZXh0ICE9PSAnc3RyaW5nJyAmJiBkeW5hbWljTmV4dC5mbikge1xuICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0RGlyZWN0JywgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHROYW1lJywgZHluYW1pY05leHQubmFtZSk7XG5cbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtkeW5hbWljTmV4dC5uYW1lfSBzdGFnZSAoZHluYW1pYylgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBkeW5hbWljTmV4dC5uYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGR5bmFtaWNOZXh0Lm5hbWUsIGR5bmFtaWNOZXh0LmlkKTtcbiAgICAgIHJldHVybiB7IG5vZGU6IGR5bmFtaWNOZXh0LCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gICAgfVxuXG4gICAgLy8gUmVmZXJlbmNlIOKAlCBieSBzdHJpbmcgSUQgb3IgYnkgbm9kZS13aXRob3V0LWZuIElELiBBIG5vZGUgcmVmZXJlbmNlXG4gICAgLy8gd2l0aG91dCBhbiBpZCBpcyBhIHVzYWdlIGVycm9yOyBhIHN0cmluZyByZWZlcmVuY2UgaXMgcGFzc2VkIHRocm91Z2hcbiAgICAvLyB2ZXJiYXRpbSAoYW4gdW5rbm93biBpZCBzdXJmYWNlcyBhcyBcInRhcmdldCBub2RlIG5vdCBmb3VuZFwiIGJlbG93KS5cbiAgICBpZiAodHlwZW9mIGR5bmFtaWNOZXh0ICE9PSAnc3RyaW5nJyAmJiAhZHluYW1pY05leHQuaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdkeW5hbWljTmV4dCBub2RlIG11c3QgaGF2ZSBhbiBpZCB3aGVuIHVzZWQgYXMgcmVmZXJlbmNlJztcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtjdXJyZW50Tm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IG5leHROb2RlSWQgPSB0eXBlb2YgZHluYW1pY05leHQgPT09ICdzdHJpbmcnID8gZHluYW1pY05leHQgOiBkeW5hbWljTmV4dC5pZCE7XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIuZmluZE5vZGVCeUlkKG5leHROb2RlSWQpO1xuICAgIGlmICghdGFyZ2V0Tm9kZSkge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYGR5bmFtaWNOZXh0IHRhcmdldCBub2RlIG5vdCBmb3VuZDogJHtuZXh0Tm9kZUlkfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7Y3VycmVudE5vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZXJhdGlvbiA9IHRoaXMuZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5leHROb2RlSWQpO1xuICAgIGNvbnN0IGl0ZXJhdGVkU3RhZ2VOYW1lID0gdGhpcy5nZXRJdGVyYXRlZFN0YWdlTmFtZSh0YXJnZXROb2RlLm5hbWUsIGl0ZXJhdGlvbik7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0VGFyZ2V0JywgbmV4dE5vZGVJZCk7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0SXRlcmF0aW9uJywgaXRlcmF0aW9uKTtcblxuICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbG9vcCcsIGBMb29waW5nIGJhY2sgdG8gJHt0YXJnZXROb2RlLm5hbWV9IChpdGVyYXRpb24gJHtpdGVyYXRpb24gKyAxfSlgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogdGFyZ2V0Tm9kZS5uYW1lLFxuICAgICAgaXRlcmF0aW9uOiBpdGVyYXRpb24gKyAxLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkxvb3AodGFyZ2V0Tm9kZS5uYW1lLCBpdGVyYXRpb24gKyAxLCB0YXJnZXROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGl0ZXJhdGVkU3RhZ2VOYW1lLCB0YXJnZXROb2RlLmlkKTtcbiAgICByZXR1cm4geyBub2RlOiB0YXJnZXROb2RlLCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBuZXh0IGl0ZXJhdGlvbiBudW1iZXIgZm9yIGEgbm9kZSBhbmQgaW5jcmVtZW50LlxuICAgKiBSZXR1cm5zIDAgZm9yIGZpcnN0IHZpc2l0LCAxIGZvciBzZWNvbmQsIGV0Yy5cbiAgICogVGhyb3dzIGlmIG1heEl0ZXJhdGlvbnMgZXhjZWVkZWQgKGluZmluaXRlIGxvb3AgZ3VhcmQpLlxuICAgKi9cbiAgZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5vZGVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pdGVyYXRpb25Db3VudGVycy5nZXQobm9kZUlkKSA/PyAwO1xuICAgIGlmIChjdXJyZW50ID49IHRoaXMubWF4SXRlcmF0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgKCR7dGhpcy5tYXhJdGVyYXRpb25zfSkgZXhjZWVkZWQgZm9yIG5vZGUgJyR7bm9kZUlkfScuIGAgK1xuICAgICAgICAgICdTZXQgbWF4SXRlcmF0aW9ucyB0byBpbmNyZWFzZSB0aGUgbGltaXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuaXRlcmF0aW9uQ291bnRlcnMuc2V0KG5vZGVJZCwgY3VycmVudCArIDEpO1xuXG4gICAgaWYgKHRoaXMub25JdGVyYXRpb25VcGRhdGUpIHtcbiAgICAgIHRoaXMub25JdGVyYXRpb25VcGRhdGUobm9kZUlkLCBjdXJyZW50ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaXRlcmF0ZWQgc3RhZ2UgbmFtZSBmb3IgY29udGV4dCB0cmVlLlxuICAgKiBGaXJzdCB2aXNpdDogXCJhc2tMTE1cIiwgc2Vjb25kOiBcImFza0xMTS4xXCIsIHRoaXJkOiBcImFza0xMTS4yXCIuXG4gICAqL1xuICBnZXRJdGVyYXRlZFN0YWdlTmFtZShiYXNlTmFtZTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbiA9PT0gMCA/IGJhc2VOYW1lIDogYCR7YmFzZU5hbWV9LiR7aXRlcmF0aW9ufWA7XG4gIH1cbn1cbiJdfQ==
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQVNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBYTNDLE1BQWEsb0JBQW9CO0lBd0JaO0lBQ0E7SUF4Qm5COzs7T0FHRztJQUNLLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNEOzs7Ozs7Ozs7O09BVUc7SUFDSyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRVgsaUJBQWlCLENBQTJDO0lBQzVELGFBQWEsQ0FBUztJQUV2QyxZQUNtQixJQUErQixFQUMvQixZQUF3QyxFQUN6RCxpQkFBMkQsRUFDM0QsYUFBc0I7UUFITCxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBNEI7UUFJekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxJQUFJLDhCQUFzQixDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsV0FBNkMsRUFDN0MsSUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsU0FBbUMsRUFDbkMsVUFBOEIsRUFDOUIsV0FBd0MsRUFDeEMsZ0JBQW1DO1FBRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDNUYsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsYUFBYSxDQUNYLFdBQTZDLEVBQzdDLFdBQW9DLEVBQ3BDLE9BQXFCLEVBQ3JCLFVBQThCLEVBQzlCLGdCQUFtQztRQUVuQyx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLG1FQUFtRTtRQUNuRSxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1Q0FBdUMsSUFBSSxDQUFDLGFBQWEsd0JBQ3ZELFdBQVcsQ0FBQyxFQUFFLElBQUksV0FBVyxDQUFDLElBQ2hDLElBQUksR0FBRyxvQkFBb0IsV0FBVyxDQUFDLElBQUksOENBQThDLENBQzFGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFcEQsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxhQUFhLFdBQVcsQ0FBQyxJQUFJLGtCQUFrQixFQUFFO2dCQUNuRixXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7YUFDOUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEcsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDMUQsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLHlEQUF5RCxDQUFDO1lBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ2xILE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRyxDQUFDO1FBRW5GLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLFlBQVksR0FBRyxzQ0FBc0MsVUFBVSxFQUFFLENBQUM7WUFDeEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixVQUFVLFlBQVksV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDbEgsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWxELE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLFVBQVUsQ0FBQyxJQUFJLGVBQWUsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3JHLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSTtZQUM1QixTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU5RyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBb0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEcsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBd0IsQ0FBQyxNQUFjO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixJQUFJLENBQUMsYUFBYSx3QkFBd0IsTUFBTSxLQUFLO2dCQUMvRSwwQ0FBMEMsQ0FDN0MsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7UUFDdEQsT0FBTyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQTlKRCxvREE4SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRpbnVhdGlvblJlc29sdmVyIOKAlCBCYWNrLWVkZ2UgcmVzb2x1dGlvbiArIGl0ZXJhdGlvbiBjb3VudGluZy5cbiAqXG4gKiBSZXNvbHZlcyBkeW5hbWljIGNvbnRpbnVhdGlvbnMgKGxvb3AtYmFja3MsIGR5bmFtaWMgbmV4dCkgYW5kIHRyYWNrc1xuICogcGVyLW5vZGUgaXRlcmF0aW9uIGNvdW50cyBmb3IgY29udGV4dCB0cmVlIG5hbWluZy5cbiAqXG4gKiBTdXBwb3J0cyB0aHJlZSBkeW5hbWljTmV4dCBwYXR0ZXJuczpcbiAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gZXhpc3Rpbmcgbm9kZSAocmVzb2x2ZSB2aWEgTm9kZVJlc29sdmVyKVxuICogLSBTdGFnZU5vZGUgd2l0aCBmbiDihpIgdHJ1bHkgZHluYW1pYyBub2RlIChleGVjdXRlIGRpcmVjdGx5KVxuICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElEIChyZXNvbHZlIHZpYSBOb2RlUmVzb2x2ZXIpXG4gKlxuICogVHdvIGVudHJ5IHBvaW50czpcbiAqIC0gYHJlc29sdmVUYXJnZXRgIOKAlCByZXNvbHZlcyB0aGUgY29udGludWF0aW9uIHRvIGB7IG5vZGUsIGNvbnRleHQgfWAgYW5kXG4gKiAgIGZpcmVzIGV2ZXJ5IHNpZGUgZWZmZWN0IChpdGVyYXRpb24gY291bnRpbmcsIGRlYnVnIGxvZ3MsIGBvbkxvb3BgXG4gKiAgIG5hcnJhdGl2ZSkgV0lUSE9VVCBleGVjdXRpbmcuIFRoZSB0cmF2ZXJzZXIncyB0cmFtcG9saW5lIGRyaXZlciB1c2VzXG4gKiAgIHRoaXMgdG8gZm9sbG93IGxvb3AgZWRnZXMgaXRlcmF0aXZlbHkg4oCUIGZsYXQgc3RhY2ssIHNvIHRoZSBpdGVyYXRpb25cbiAqICAgbGltaXQgKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gKiAtIGByZXNvbHZlYCDigJQgcmVzb2x2ZVRhcmdldCArIGltbWVkaWF0ZSBleGVjdXRpb24gdmlhIHRoZSBwcm92aWRlZFxuICogICBgZXhlY3V0ZU5vZGVgIGNhbGxiYWNrLiBLZXB0IGZvciBkaXJlY3QvYWR2YW5jZWQgY2FsbGVycy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4vTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfSVRFUkFUSU9OUyA9IDEwMDA7XG5cbi8qKlxuICogQSByZXNvbHZlZCBjb250aW51YXRpb24gdGFyZ2V0IOKAlCB0aGUgbm9kZSB0byBleGVjdXRlIG5leHQgcGx1cyB0aGVcbiAqIFN0YWdlQ29udGV4dCB0byBleGVjdXRlIGl0IGluLiBBbGwgc2lkZSBlZmZlY3RzIChpdGVyYXRpb24gY291bnRpbmcsXG4gKiBkZWJ1ZyBsb2dzLCBgb25Mb29wYCBuYXJyYXRpdmUpIGhhdmUgYWxyZWFkeSBmaXJlZCBieSB0aGUgdGltZSB0aGlzXG4gKiBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbnRpbnVhdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogSXRlcmF0aW9uIGNvdW50ZXIgcGVyIG5vZGUgSUQuXG4gICAqIEtleTogbm9kZS5pZCwgVmFsdWU6IHZpc2l0IGNvdW50ICgwID0gZmlyc3QgdmlzaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpdGVyYXRpb25Db3VudGVyczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogVG90YWwgZm4tYmVhcmluZyBkeW5hbWljLW5leHQgaG9wcyB0aGlzIHRyYXZlcnNlciBoYXMgZm9sbG93ZWQuXG4gICAqXG4gICAqIEZyZXNoIGZuLWJlYXJpbmcgbm9kZXMgYnlwYXNzIHRoZSBwZXItbm9kZS1pZCBpdGVyYXRpb24gY291bnRlciAodGhleVxuICAgKiBhcmUgbmV3IG5vZGVzLCBvZnRlbiB3aXRob3V0IHN0YWJsZSBpZHMg4oCUIHRoZXJlIGlzIG5vIGJhY2stZWRnZSB0b1xuICAgKiBjb3VudCkuIFdpdGhvdXQgYSBib3VuZCwgYSBzdGFnZSB0aGF0IGtlZXBzIHJldHVybmluZyBhIGZ1bmN0aW9uLWJlYXJpbmdcbiAgICogZHluYW1pYyBgbmV4dGAgcnVucyBGT1JFVkVSIG9uIHRoZSBmbGF0IHRyYW1wb2xpbmUgKG5vIHN0YWNrIG92ZXJmbG93XG4gICAqIGJyYWtlcyBpdCBlaXRoZXIpLiBUaGlzIHJ1bi10b3RhbCBjb3VudGVyIHB1dHMgc3VjaCBjaGFpbnMgdW5kZXIgdGhlXG4gICAqIHNhbWUgYG1heEl0ZXJhdGlvbnNgIGJ1ZGdldCAoZGVmYXVsdCAxMDAwLCB0dW5lZCB2aWFcbiAgICogYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApIHRoYXQgYm91bmRzIGxvb3AgZWRnZXMuXG4gICAqL1xuICBwcml2YXRlIGR5bmFtaWNOZXh0SG9wcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhJdGVyYXRpb25zOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPixcbiAgICBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlID0gb25JdGVyYXRpb25VcGRhdGU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gbWF4SXRlcmF0aW9ucyA/PyBERUZBVUxUX01BWF9JVEVSQVRJT05TO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiBhbmQgZXhlY3V0ZSBpdCBpbW1lZGlhdGVseS5cbiAgICogRXF1aXZhbGVudCB0byBgZXhlY3V0ZU5vZGUoLi4ucmVzb2x2ZVRhcmdldCguLi4pKWAg4oCUIHRoZSB0cmF2ZXJzZXInc1xuICAgKiBkcml2ZXIgbG9vcCBjYWxscyBgcmVzb2x2ZVRhcmdldGAgZGlyZWN0bHkgaW5zdGVhZCBzbyB0aGUgY29udGludWF0aW9uXG4gICAqIGJlY29tZXMgYSBmbGF0IHRyYW1wb2xpbmUgaG9wIHJhdGhlciB0aGFuIGEgcmV0YWluZWQgcmVjdXJzaXZlIGZyYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVRhcmdldChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgcmV0dXJuIGV4ZWN1dGVOb2RlKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgZHluYW1pYyBjb250aW51YXRpb24gdG8gaXRzIHRhcmdldCBub2RlICsgbmV4dCBTdGFnZUNvbnRleHRcbiAgICogV0lUSE9VVCBleGVjdXRpbmcgaXQuIEZpcmVzIHRoZSBzYW1lIHNpZGUgZWZmZWN0cyBgcmVzb2x2ZWAgYWx3YXlzIGRpZFxuICAgKiAoaXRlcmF0aW9uIGNvdW50aW5nICsgbGltaXQsIGBkeW5hbWljTmV4dCpgIGxvZ3MsIGxvb3AgZGVidWcgbWVzc2FnZSxcbiAgICogYG9uTG9vcGAgbmFycmF0aXZlKSwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIFRocmVlIGR5bmFtaWNOZXh0IHBhdHRlcm5zOlxuICAgKiAtIFN0YWdlTm9kZSB3aXRoIGZuIOKGkiB0cnVseSBkeW5hbWljIG5vZGUsIHJldHVybmVkIGFzLWlzIChubyBwZXItbm9kZVxuICAgKiAgIGl0ZXJhdGlvbiB0cmFja2luZyDigJQgaXQgaXMgYSBmcmVzaCBub2RlLCBub3QgYSBiYWNrLWVkZ2Ug4oCUIGJ1dCB0aGVcbiAgICogICBydW4tdG90YWwgZHluYW1pYy1ob3AgYnVkZ2V0IGFwcGxpZXM7IHNlZSBgZHluYW1pY05leHRIb3BzYCkuXG4gICAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm9kZSwgcmVzb2x2ZWQgdmlhIE5vZGVSZXNvbHZlci5cbiAgICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElELCByZXNvbHZlZCB2aWEgTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcmVzb2x2ZVRhcmdldChcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VycmVudE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFJlc29sdmVkQ29udGludWF0aW9uPFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIFRydWx5IGR5bmFtaWMgbm9kZSAoaGFzIGZuKSDihpIgZXhlY3V0ZSBkaXJlY3RseSwgbm8gcGVyLW5vZGUgaXRlcmF0aW9uXG4gICAgLy8gdHJhY2tpbmcgKGZyZXNoIG5vZGUsIG5vdCBhIGJhY2stZWRnZSkg4oCUIGJ1dCB0aGUgQ0hBSU4gb2Ygc3VjaCBob3BzIGlzXG4gICAgLy8gYm91bmRlZCBieSB0aGUgcnVuLXRvdGFsIGd1YXJkIGJlbG93LCBtaXJyb3JpbmcgdGhlIGxvb3AgYnVkZ2V0LlxuICAgIGlmICh0eXBlb2YgZHluYW1pY05leHQgIT09ICdzdHJpbmcnICYmIGR5bmFtaWNOZXh0LmZuKSB7XG4gICAgICBpZiAodGhpcy5keW5hbWljTmV4dEhvcHMgPj0gdGhpcy5tYXhJdGVyYXRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWF4aW11bSBkeW5hbWljLW5leHQgY29udGludWF0aW9ucyAoJHt0aGlzLm1heEl0ZXJhdGlvbnN9KSBleGNlZWRlZCBhdCBzdGFnZSAnJHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLmlkID8/IGN1cnJlbnROb2RlLm5hbWVcbiAgICAgICAgICB9JyBgICsgYChkeW5hbWljIHRhcmdldCAnJHtkeW5hbWljTmV4dC5uYW1lfScpLiBTZXQgbWF4SXRlcmF0aW9ucyB0byBpbmNyZWFzZSB0aGUgbGltaXQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHluYW1pY05leHRIb3BzKys7XG5cbiAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dERpcmVjdCcsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0TmFtZScsIGR5bmFtaWNOZXh0Lm5hbWUpO1xuXG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7ZHluYW1pY05leHQubmFtZX0gc3RhZ2UgKGR5bmFtaWMpYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogZHluYW1pY05leHQubmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXh0U3RhZ2VDb250ZXh0ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBkeW5hbWljTmV4dC5uYW1lLCBkeW5hbWljTmV4dC5pZCk7XG4gICAgICByZXR1cm4geyBub2RlOiBkeW5hbWljTmV4dCwgY29udGV4dDogbmV4dFN0YWdlQ29udGV4dCB9O1xuICAgIH1cblxuICAgIC8vIFJlZmVyZW5jZSDigJQgYnkgc3RyaW5nIElEIG9yIGJ5IG5vZGUtd2l0aG91dC1mbiBJRC4gQSBub2RlIHJlZmVyZW5jZVxuICAgIC8vIHdpdGhvdXQgYW4gaWQgaXMgYSB1c2FnZSBlcnJvcjsgYSBzdHJpbmcgcmVmZXJlbmNlIGlzIHBhc3NlZCB0aHJvdWdoXG4gICAgLy8gdmVyYmF0aW0gKGFuIHVua25vd24gaWQgc3VyZmFjZXMgYXMgXCJ0YXJnZXQgbm9kZSBub3QgZm91bmRcIiBiZWxvdykuXG4gICAgaWYgKHR5cGVvZiBkeW5hbWljTmV4dCAhPT0gJ3N0cmluZycgJiYgIWR5bmFtaWNOZXh0LmlkKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnZHluYW1pY05leHQgbm9kZSBtdXN0IGhhdmUgYW4gaWQgd2hlbiB1c2VkIGFzIHJlZmVyZW5jZSc7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7Y3VycmVudE5vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBuZXh0Tm9kZUlkID0gdHlwZW9mIGR5bmFtaWNOZXh0ID09PSAnc3RyaW5nJyA/IGR5bmFtaWNOZXh0IDogZHluYW1pY05leHQuaWQhO1xuXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuZXh0Tm9kZUlkKTtcbiAgICBpZiAoIXRhcmdldE5vZGUpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBkeW5hbWljTmV4dCB0YXJnZXQgbm9kZSBub3QgZm91bmQ6ICR7bmV4dE5vZGVJZH1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske2N1cnJlbnROb2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVyYXRpb24gPSB0aGlzLmdldEFuZEluY3JlbWVudEl0ZXJhdGlvbihuZXh0Tm9kZUlkKTtcbiAgICBjb25zdCBpdGVyYXRlZFN0YWdlTmFtZSA9IHRoaXMuZ2V0SXRlcmF0ZWRTdGFnZU5hbWUodGFyZ2V0Tm9kZS5uYW1lLCBpdGVyYXRpb24pO1xuICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dFRhcmdldCcsIG5leHROb2RlSWQpO1xuICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dEl0ZXJhdGlvbicsIGl0ZXJhdGlvbik7XG5cbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2xvb3AnLCBgTG9vcGluZyBiYWNrIHRvICR7dGFyZ2V0Tm9kZS5uYW1lfSAoaXRlcmF0aW9uICR7aXRlcmF0aW9uICsgMX0pYCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHRhcmdldE5vZGUubmFtZSxcbiAgICAgIGl0ZXJhdGlvbjogaXRlcmF0aW9uICsgMSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25Mb29wKHRhcmdldE5vZGUubmFtZSwgaXRlcmF0aW9uICsgMSwgdGFyZ2V0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBjb25zdCBuZXh0U3RhZ2VDb250ZXh0ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBpdGVyYXRlZFN0YWdlTmFtZSwgdGFyZ2V0Tm9kZS5pZCk7XG4gICAgcmV0dXJuIHsgbm9kZTogdGFyZ2V0Tm9kZSwgY29udGV4dDogbmV4dFN0YWdlQ29udGV4dCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmV4dCBpdGVyYXRpb24gbnVtYmVyIGZvciBhIG5vZGUgYW5kIGluY3JlbWVudC5cbiAgICogUmV0dXJucyAwIGZvciBmaXJzdCB2aXNpdCwgMSBmb3Igc2Vjb25kLCBldGMuXG4gICAqIFRocm93cyBpZiBtYXhJdGVyYXRpb25zIGV4Y2VlZGVkIChpbmZpbml0ZSBsb29wIGd1YXJkKS5cbiAgICovXG4gIGdldEFuZEluY3JlbWVudEl0ZXJhdGlvbihub2RlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaXRlcmF0aW9uQ291bnRlcnMuZ2V0KG5vZGVJZCkgPz8gMDtcbiAgICBpZiAoY3VycmVudCA+PSB0aGlzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1heGltdW0gbG9vcCBpdGVyYXRpb25zICgke3RoaXMubWF4SXRlcmF0aW9uc30pIGV4Y2VlZGVkIGZvciBub2RlICcke25vZGVJZH0nLiBgICtcbiAgICAgICAgICAnU2V0IG1heEl0ZXJhdGlvbnMgdG8gaW5jcmVhc2UgdGhlIGxpbWl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLml0ZXJhdGlvbkNvdW50ZXJzLnNldChub2RlSWQsIGN1cnJlbnQgKyAxKTtcblxuICAgIGlmICh0aGlzLm9uSXRlcmF0aW9uVXBkYXRlKSB7XG4gICAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlKG5vZGVJZCwgY3VycmVudCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIGl0ZXJhdGVkIHN0YWdlIG5hbWUgZm9yIGNvbnRleHQgdHJlZS5cbiAgICogRmlyc3QgdmlzaXQ6IFwiYXNrTExNXCIsIHNlY29uZDogXCJhc2tMTE0uMVwiLCB0aGlyZDogXCJhc2tMTE0uMlwiLlxuICAgKi9cbiAgZ2V0SXRlcmF0ZWRTdGFnZU5hbWUoYmFzZU5hbWU6IHN0cmluZywgaXRlcmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVyYXRpb24gPT09IDAgPyBiYXNlTmFtZSA6IGAke2Jhc2VOYW1lfS4ke2l0ZXJhdGlvbn1gO1xuICB9XG59XG4iXX0=