footprintjs 9.28.0 → 9.30.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 (44) hide show
  1. package/CLAUDE.md +8 -6
  2. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +41 -2
  3. package/dist/esm/lib/memory/EventLog.d.ts +6 -0
  4. package/dist/esm/lib/memory/EventLog.js +10 -4
  5. package/dist/esm/lib/memory/SharedMemory.d.ts +18 -4
  6. package/dist/esm/lib/memory/SharedMemory.js +42 -11
  7. package/dist/esm/lib/memory/StageContext.d.ts +45 -18
  8. package/dist/esm/lib/memory/StageContext.js +82 -27
  9. package/dist/esm/lib/memory/TransactionBuffer.d.ts +256 -86
  10. package/dist/esm/lib/memory/TransactionBuffer.js +497 -273
  11. package/dist/esm/lib/memory/admission.d.ts +81 -0
  12. package/dist/esm/lib/memory/admission.js +152 -0
  13. package/dist/esm/lib/memory/borrowedMutation.d.ts +9 -0
  14. package/dist/esm/lib/memory/borrowedMutation.js +18 -1
  15. package/dist/esm/lib/memory/deltaEncoding.d.ts +66 -0
  16. package/dist/esm/lib/memory/deltaEncoding.js +122 -0
  17. package/dist/esm/lib/memory/pathOps.d.ts +63 -0
  18. package/dist/esm/lib/memory/pathOps.js +150 -1
  19. package/dist/esm/lib/memory/utils.d.ts +47 -16
  20. package/dist/esm/lib/memory/utils.js +119 -24
  21. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -5
  22. package/dist/esm/lib/runner/FlowChartExecutor.js +8 -6
  23. package/dist/lib/engine/handlers/SubflowExecutor.js +41 -2
  24. package/dist/lib/memory/EventLog.js +9 -3
  25. package/dist/lib/memory/SharedMemory.js +40 -9
  26. package/dist/lib/memory/StageContext.js +81 -26
  27. package/dist/lib/memory/TransactionBuffer.js +495 -271
  28. package/dist/lib/memory/admission.js +158 -0
  29. package/dist/lib/memory/borrowedMutation.js +20 -2
  30. package/dist/lib/memory/deltaEncoding.js +128 -0
  31. package/dist/lib/memory/pathOps.js +159 -2
  32. package/dist/lib/memory/utils.js +122 -25
  33. package/dist/lib/runner/FlowChartExecutor.js +8 -6
  34. package/dist/types/lib/memory/EventLog.d.ts +6 -0
  35. package/dist/types/lib/memory/SharedMemory.d.ts +18 -4
  36. package/dist/types/lib/memory/StageContext.d.ts +45 -18
  37. package/dist/types/lib/memory/TransactionBuffer.d.ts +256 -86
  38. package/dist/types/lib/memory/admission.d.ts +81 -0
  39. package/dist/types/lib/memory/borrowedMutation.d.ts +9 -0
  40. package/dist/types/lib/memory/deltaEncoding.d.ts +66 -0
  41. package/dist/types/lib/memory/pathOps.d.ts +63 -0
  42. package/dist/types/lib/memory/utils.d.ts +47 -16
  43. package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -5
  44. package/package.json +2 -1
@@ -21,6 +21,8 @@
21
21
  *
22
22
  * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
23
23
  */
24
+ /** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
25
+ export declare function isDeniedSegment(segment: string | number): boolean;
24
26
  /**
25
27
  * Get the value at `path` in `obj`, returning `defaultValue` if absent.
26
28
  *
@@ -42,6 +44,67 @@ export declare function nativeSet(obj: any, path: string | (string | number)[],
42
44
  * prototype-chain walks are inert.
43
45
  */
44
46
  export declare function nativeDelete(obj: any, path: string | (string | number)[]): void;
47
+ /** A container a writer may own: anything `typeof 'object'` and not null. */
48
+ export declare function isContainer(value: unknown): value is object;
49
+ /**
50
+ * `parent[key]` when `parent` is a container that OWNS `key` — the slot
51
+ * {@link nativeGet} would read, refusing the same prototype-pollution
52
+ * segments — else `undefined`. One step of a path walk.
53
+ */
54
+ export declare function ownChild(parent: unknown, key: string | number): unknown;
55
+ /**
56
+ * A SHALLOW copy of one container that keeps every slot the whole-state
57
+ * `structuredClone` this replaced kept — so a path copy and a deep clone give
58
+ * the same value at every path:
59
+ * - a plain object (or a null-prototype one): its own enumerable keys, in
60
+ * order, by spread — an own `__proto__` key stays a key; the result has
61
+ * `Object.prototype`, as a clone's does;
62
+ * - an array: its indices, holes and length (`slice`) AND any named
63
+ * property a nested write hung off it (`slice` alone would drop those);
64
+ * - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
65
+ * is deep-cloned, which is what the whole-state clone did to it; and the
66
+ * own enumerable properties the clone cannot carry (an expando a nested
67
+ * write hung on a `Date`) are carried over by reference, so a later write
68
+ * through it changes exactly its own path. Rare on a write path.
69
+ */
70
+ export declare function shallowCopy<T extends object>(container: T): T;
71
+ /**
72
+ * Make the containers on the way to `path`'s LEAF ones the writer owns, so
73
+ * the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
74
+ * nothing it did not create.
75
+ *
76
+ * `root` must already be owned. Walking down, every container the writer did
77
+ * not create (`owned` does not hold it) is replaced, in its parent, by its
78
+ * {@link shallowCopy}, which the writer then owns. The walk stops where
79
+ * `nativeSet` would stop or create: a DENIED segment (the write is refused
80
+ * there anyway), or a missing / primitive intermediate (`nativeSet` makes a
81
+ * fresh container from that point on). The leaf itself is never copied — the
82
+ * write replaces it.
83
+ *
84
+ * Cost: one shallow copy per container on the path that this writer has not
85
+ * already copied — O(depth × width), independent of everything the write
86
+ * does not pass through. A path of one segment (a root key, the common case)
87
+ * copies nothing here.
88
+ */
89
+ export declare function ownSpine(root: any, path: string | (string | number)[], owned: WeakSet<object>): void;
90
+ /**
91
+ * The root of a new generation: a shallow copy of `base` when it is a
92
+ * container (owned by the writer), else the historical deep clone of a
93
+ * non-container base (`undefined`, a primitive) so the callers' behaviour on
94
+ * such a base is unchanged.
95
+ */
96
+ export declare function ownedRootOf(base: any, owned?: WeakSet<object>): any;
97
+ /** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
98
+ export declare function own(value: unknown, owned: WeakSet<object> | undefined): void;
99
+ /**
100
+ * Mark EVERY container of a tree the writer just created whole (a
101
+ * `structuredClone` result) as owned, so a later write through any of them
102
+ * edits it in place instead of copying it again. Walks own enumerable keys —
103
+ * the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
104
+ * tree's containers); a container already owned is not walked twice (a cycle
105
+ * inside the clone ends there).
106
+ */
107
+ export declare function adopt(tree: unknown, owned: WeakSet<object>): void;
45
108
  /** Returns true if `obj` has an own property at every segment of `path`. */
46
109
  export declare function nativeHas(obj: any, path: string | (string | number)[]): boolean;
47
110
  /**
@@ -22,6 +22,10 @@
22
22
  * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
23
23
  */
24
24
  const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
25
+ /** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
26
+ export function isDeniedSegment(segment) {
27
+ return DENIED.has(String(segment));
28
+ }
25
29
  function toSegments(path) {
26
30
  return Array.isArray(path) ? path : path.split('.');
27
31
  }
@@ -93,6 +97,151 @@ export function nativeDelete(obj, path) {
93
97
  delete curr[last];
94
98
  }
95
99
  }
100
+ // ── Copy-on-write primitives (docs/design/2026-10-copy-on-write-commit.md) ──
101
+ //
102
+ // THE LAW: a committed generation is never edited. A writer copies the root
103
+ // and every container on each path it writes, edits only containers it
104
+ // created during the current operation (its `owned` set), and shares every
105
+ // other subtree with the generation before it. The same law
106
+ // `reactive/structuralWrite.ts · setInPath` applies to a single value.
107
+ /** A container a writer may own: anything `typeof 'object'` and not null. */
108
+ export function isContainer(value) {
109
+ return value !== null && typeof value === 'object';
110
+ }
111
+ /**
112
+ * `parent[key]` when `parent` is a container that OWNS `key` — the slot
113
+ * {@link nativeGet} would read, refusing the same prototype-pollution
114
+ * segments — else `undefined`. One step of a path walk.
115
+ */
116
+ export function ownChild(parent, key) {
117
+ return isContainer(parent) && !DENIED.has(String(key)) && Object.prototype.hasOwnProperty.call(parent, key)
118
+ ? parent[key]
119
+ : undefined;
120
+ }
121
+ /** True for an own key of an array that is an array INDEX (`'0'`, `'12'`), not a name (`arr.note`). */
122
+ function isArrayIndexKey(key) {
123
+ const n = Number(key);
124
+ return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
125
+ }
126
+ /**
127
+ * The named (non-index) own keys of an array, in order. Own-key order puts
128
+ * every index first, ascending, and names after them — so the names are the
129
+ * tail of `Object.keys`, and an array without any is told by its last key.
130
+ */
131
+ function namedArrayKeys(array) {
132
+ const keys = Object.keys(array);
133
+ let first = keys.length;
134
+ while (first > 0 && !isArrayIndexKey(keys[first - 1]))
135
+ first--;
136
+ return keys.slice(first);
137
+ }
138
+ /**
139
+ * A SHALLOW copy of one container that keeps every slot the whole-state
140
+ * `structuredClone` this replaced kept — so a path copy and a deep clone give
141
+ * the same value at every path:
142
+ * - a plain object (or a null-prototype one): its own enumerable keys, in
143
+ * order, by spread — an own `__proto__` key stays a key; the result has
144
+ * `Object.prototype`, as a clone's does;
145
+ * - an array: its indices, holes and length (`slice`) AND any named
146
+ * property a nested write hung off it (`slice` alone would drop those);
147
+ * - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
148
+ * is deep-cloned, which is what the whole-state clone did to it; and the
149
+ * own enumerable properties the clone cannot carry (an expando a nested
150
+ * write hung on a `Date`) are carried over by reference, so a later write
151
+ * through it changes exactly its own path. Rare on a write path.
152
+ */
153
+ export function shallowCopy(container) {
154
+ if (Array.isArray(container)) {
155
+ const copy = container.slice();
156
+ for (const key of namedArrayKeys(container))
157
+ copy[key] = container[key];
158
+ return copy;
159
+ }
160
+ const proto = Object.getPrototypeOf(container);
161
+ if (proto === Object.prototype || proto === null)
162
+ return { ...container };
163
+ const copy = structuredClone(container);
164
+ for (const key of Object.keys(container)) {
165
+ if (!Object.prototype.hasOwnProperty.call(copy, key))
166
+ copy[key] = container[key];
167
+ }
168
+ return copy;
169
+ }
170
+ /**
171
+ * Make the containers on the way to `path`'s LEAF ones the writer owns, so
172
+ * the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
173
+ * nothing it did not create.
174
+ *
175
+ * `root` must already be owned. Walking down, every container the writer did
176
+ * not create (`owned` does not hold it) is replaced, in its parent, by its
177
+ * {@link shallowCopy}, which the writer then owns. The walk stops where
178
+ * `nativeSet` would stop or create: a DENIED segment (the write is refused
179
+ * there anyway), or a missing / primitive intermediate (`nativeSet` makes a
180
+ * fresh container from that point on). The leaf itself is never copied — the
181
+ * write replaces it.
182
+ *
183
+ * Cost: one shallow copy per container on the path that this writer has not
184
+ * already copied — O(depth × width), independent of everything the write
185
+ * does not pass through. A path of one segment (a root key, the common case)
186
+ * copies nothing here.
187
+ */
188
+ export function ownSpine(root, path, owned) {
189
+ const segs = toSegments(path);
190
+ let curr = root;
191
+ for (let i = 0; i < segs.length - 1; i++) {
192
+ const k = segs[i];
193
+ if (DENIED.has(String(k)))
194
+ return;
195
+ const next = curr[k];
196
+ if (!isContainer(next))
197
+ return;
198
+ if (owned.has(next)) {
199
+ curr = next;
200
+ continue;
201
+ }
202
+ const copy = shallowCopy(next);
203
+ owned.add(copy);
204
+ curr[k] = copy;
205
+ curr = copy;
206
+ }
207
+ }
208
+ /**
209
+ * The root of a new generation: a shallow copy of `base` when it is a
210
+ * container (owned by the writer), else the historical deep clone of a
211
+ * non-container base (`undefined`, a primitive) so the callers' behaviour on
212
+ * such a base is unchanged.
213
+ */
214
+ export function ownedRootOf(base, owned) {
215
+ if (!isContainer(base))
216
+ return structuredClone(base);
217
+ const root = shallowCopy(base);
218
+ owned?.add(root);
219
+ return root;
220
+ }
221
+ /** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
222
+ export function own(value, owned) {
223
+ if (owned !== undefined && isContainer(value))
224
+ owned.add(value);
225
+ }
226
+ /**
227
+ * Mark EVERY container of a tree the writer just created whole (a
228
+ * `structuredClone` result) as owned, so a later write through any of them
229
+ * edits it in place instead of copying it again. Walks own enumerable keys —
230
+ * the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
231
+ * tree's containers); a container already owned is not walked twice (a cycle
232
+ * inside the clone ends there).
233
+ */
234
+ export function adopt(tree, owned) {
235
+ const stack = [tree];
236
+ while (stack.length > 0) {
237
+ const value = stack.pop();
238
+ if (!isContainer(value) || owned.has(value))
239
+ continue;
240
+ owned.add(value);
241
+ for (const key of Object.keys(value))
242
+ stack.push(value[key]);
243
+ }
244
+ }
96
245
  /** Returns true if `obj` has an own property at every segment of `path`. */
97
246
  export function nativeHas(obj, path) {
98
247
  const segs = toSegments(path);
@@ -139,4 +288,4 @@ export function mergeContextWins(dst, src) {
139
288
  }
140
289
  return out;
141
290
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBUSxFQUFFLElBQWtDLEVBQUUsWUFBa0I7SUFDeEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUMxRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMs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RSxNQUFNLEtBQUssSUFBSTtnQkFDZixPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUMxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtnQkFDakIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGBvYmpgIGhhcyBhbiBvd24gcHJvcGVydHkgYXQgZXZlcnkgc2VnbWVudCBvZiBgcGF0aGAuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlSGFzKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZ3NbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGkgPCBzZWdzLmxlbmd0aCAtIDEpIGN1cnIgPSBjdXJyW3NlZ3NbaV1dO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERlZXAgbWVyZ2Ugd2hlcmUgZGVzdGluYXRpb24gd2lucyBmb3IgYW55IGRlZmluZWQgdmFsdWUuXG4gKiBGaWxscyBtaXNzaW5nIGtleXMgZnJvbSBgc3JjYCwgYnV0IG5ldmVyIG92ZXJ3cml0ZXMgZGVmaW5lZCBrZXlzIGluIGBkc3RgLlxuICogQXJyYXlzIGFyZSBub3QgcmVjdXJzZWQg4oCUIGRzdCBhcnJheSBhbHdheXMgd2lucyB3aGVuIHByZXNlbnQuXG4gKlxuICogUmVwbGFjZXM6IGBtZXJnZVdpdGgoZHN0LCBzcmMsIChvYmpWYWx1ZSkgPT4gb2JqVmFsdWUgIT09IHVuZGVmaW5lZCA/IG9ialZhbHVlIDogdW5kZWZpbmVkKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29udGV4dFdpbnMoZHN0OiBhbnksIHNyYzogYW55KTogYW55IHtcbiAgaWYgKCFzcmMgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShzcmMpKSB7XG4gICAgcmV0dXJuIGRzdCAhPT0gdW5kZWZpbmVkID8gZHN0IDogc3JjO1xuICB9XG4gIGNvbnN0IG91dDogYW55ID0gZHN0ICE9IG51bGwgJiYgdHlwZW9mIGRzdCA9PT0gJ29iamVjdCcgPyB7IC4uLmRzdCB9IDoge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBpZiAoREVOSUVELmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICBjb25zdCBkc3RWYWwgPSBvdXRba2V5XTtcbiAgICBpZiAoZHN0VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGRzdCB3aW5zOyByZWN1cnNlIG9ubHkgaWYgYm90aCBzaWRlcyBhcmUgcGxhaW4gb2JqZWN0c1xuICAgICAgaWYgKFxuICAgICAgICBkc3RWYWwgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGRzdFZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZHN0VmFsKSAmJlxuICAgICAgICBzcmNba2V5XSAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2Ygc3JjW2tleV0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNyY1trZXldKVxuICAgICAgKSB7XG4gICAgICAgIG91dFtrZXldID0gbWVyZ2VDb250ZXh0V2lucyhkc3RWYWwsIHNyY1trZXldKTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2Uga2VlcCBkc3RWYWwgdW5jaGFuZ2VkXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtrZXldID0gc3JjW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxD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QUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqIElzIGBzZWdtZW50YCBvbmUgb2YgdGhlIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gdmVjdG9ycyBldmVyeSBoZWxwZXIgaGVyZSByZWZ1c2VzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuaWVkU2VnbWVudChzZWdtZW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIERFTklFRC5oYXMoU3RyaW5nKHNlZ21lbnQpKTtcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vLyDilIDilIAgQ29weS1vbi13cml0ZSBwcmltaXRpdmVzIChkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKSDilIDilIBcbi8vXG4vLyBUSEUgTEFXOiBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gQSB3cml0ZXIgY29waWVzIHRoZSByb290XG4vLyBhbmQgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggcGF0aCBpdCB3cml0ZXMsIGVkaXRzIG9ubHkgY29udGFpbmVycyBpdFxuLy8gY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChpdHMgYG93bmVkYCBzZXQpLCBhbmQgc2hhcmVzIGV2ZXJ5XG4vLyBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LiBUaGUgc2FtZSBsYXdcbi8vIGByZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMgwrcgc2V0SW5QYXRoYCBhcHBsaWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuXG4vKiogQSBjb250YWluZXIgYSB3cml0ZXIgbWF5IG93bjogYW55dGhpbmcgYHR5cGVvZiAnb2JqZWN0J2AgYW5kIG5vdCBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogYHBhcmVudFtrZXldYCB3aGVuIGBwYXJlbnRgIGlzIGEgY29udGFpbmVyIHRoYXQgT1dOUyBga2V5YCDigJQgdGhlIHNsb3RcbiAqIHtAbGluayBuYXRpdmVHZXR9IHdvdWxkIHJlYWQsIHJlZnVzaW5nIHRoZSBzYW1lIHByb3RvdHlwZS1wb2xsdXRpb25cbiAqIHNlZ21lbnRzIOKAlCBlbHNlIGB1bmRlZmluZWRgLiBPbmUgc3RlcCBvZiBhIHBhdGggd2Fsay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkNoaWxkKHBhcmVudDogdW5rbm93biwga2V5OiBzdHJpbmcgfCBudW1iZXIpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzQ29udGFpbmVyKHBhcmVudCkgJiYgIURFTklFRC5oYXMoU3RyaW5nKGtleSkpICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnQsIGtleSlcbiAgICA/IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgZm9yIGFuIG93biBrZXkgb2YgYW4gYXJyYXkgdGhhdCBpcyBhbiBhcnJheSBJTkRFWCAoYCcwJ2AsIGAnMTInYCksIG5vdCBhIG5hbWUgKGBhcnIubm90ZWApLiAqL1xuZnVuY3Rpb24gaXNBcnJheUluZGV4S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwICYmIG4gPCA0Mjk0OTY3Mjk1ICYmIFN0cmluZyhuKSA9PT0ga2V5O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lZCAobm9uLWluZGV4KSBvd24ga2V5cyBvZiBhbiBhcnJheSwgaW4gb3JkZXIuIE93bi1rZXkgb3JkZXIgcHV0c1xuICogZXZlcnkgaW5kZXggZmlyc3QsIGFzY2VuZGluZywgYW5kIG5hbWVzIGFmdGVyIHRoZW0g4oCUIHNvIHRoZSBuYW1lcyBhcmUgdGhlXG4gKiB0YWlsIG9mIGBPYmplY3Qua2V5c2AsIGFuZCBhbiBhcnJheSB3aXRob3V0IGFueSBpcyB0b2xkIGJ5IGl0cyBsYXN0IGtleS5cbiAqL1xuZnVuY3Rpb24gbmFtZWRBcnJheUtleXMoYXJyYXk6IHVua25vd25bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgbGV0IGZpcnN0ID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChmaXJzdCA+IDAgJiYgIWlzQXJyYXlJbmRleEtleShrZXlzW2ZpcnN0IC0gMV0pKSBmaXJzdC0tO1xuICByZXR1cm4ga2V5cy5zbGljZShmaXJzdCk7XG59XG5cbi8qKlxuICogQSBTSEFMTE9XIGNvcHkgb2Ygb25lIGNvbnRhaW5lciB0aGF0IGtlZXBzIGV2ZXJ5IHNsb3QgdGhlIHdob2xlLXN0YXRlXG4gKiBgc3RydWN0dXJlZENsb25lYCB0aGlzIHJlcGxhY2VkIGtlcHQg4oCUIHNvIGEgcGF0aCBjb3B5IGFuZCBhIGRlZXAgY2xvbmUgZ2l2ZVxuICogdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aDpcbiAqICAgLSBhIHBsYWluIG9iamVjdCAob3IgYSBudWxsLXByb3RvdHlwZSBvbmUpOiBpdHMgb3duIGVudW1lcmFibGUga2V5cywgaW5cbiAqICAgICBvcmRlciwgYnkgc3ByZWFkIOKAlCBhbiBvd24gYF9fcHJvdG9fX2Aga2V5IHN0YXlzIGEga2V5OyB0aGUgcmVzdWx0IGhhc1xuICogICAgIGBPYmplY3QucHJvdG90eXBlYCwgYXMgYSBjbG9uZSdzIGRvZXM7XG4gKiAgIC0gYW4gYXJyYXk6IGl0cyBpbmRpY2VzLCBob2xlcyBhbmQgbGVuZ3RoIChgc2xpY2VgKSBBTkQgYW55IG5hbWVkXG4gKiAgICAgcHJvcGVydHkgYSBuZXN0ZWQgd3JpdGUgaHVuZyBvZmYgaXQgKGBzbGljZWAgYWxvbmUgd291bGQgZHJvcCB0aG9zZSk7XG4gKiAgIC0gYW55dGhpbmcgZWxzZSDigJQgYSBgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgdHlwZWQgYXJyYXksIGEgY2xhc3MgaW5zdGFuY2Ug4oCUXG4gKiAgICAgaXMgZGVlcC1jbG9uZWQsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIGRpZCB0byBpdDsgYW5kIHRoZVxuICogICAgIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhlIGNsb25lIGNhbm5vdCBjYXJyeSAoYW4gZXhwYW5kbyBhIG5lc3RlZFxuICogICAgIHdyaXRlIGh1bmcgb24gYSBgRGF0ZWApIGFyZSBjYXJyaWVkIG92ZXIgYnkgcmVmZXJlbmNlLCBzbyBhIGxhdGVyIHdyaXRlXG4gKiAgICAgdGhyb3VnaCBpdCBjaGFuZ2VzIGV4YWN0bHkgaXRzIG93biBwYXRoLiBSYXJlIG9uIGEgd3JpdGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRhaW5lcjogVCk6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29weSA9IGNvbnRhaW5lci5zbGljZSgpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbmFtZWRBcnJheUtleXMoY29udGFpbmVyKSkgY29weVtrZXldID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
@@ -183,9 +183,11 @@ export declare function deepSmartMerge(dst: any, src: any): any;
183
183
  * whole-array `set` rows on one path, and this is what makes replaying them
184
184
  * O(N) instead of O(N × rows).
185
185
  *
186
- * Shared by {@link applySmartMerge} (live state, `EventLog.materialise`,
187
- * `stateAt`, the redacted mirror) and `TransactionBuffer.replayFamilyVerbs`
188
- * (the delta encoder's per-family fold) — the two loops that clone per row.
186
+ * Asked by `replayRows` — live state and the redacted mirror through
187
+ * {@link nextGeneration}, `EventLog.materialise` and `stateAt` through
188
+ * {@link applySmartMergeInto}, the public {@link applySmartMerge}, and the
189
+ * admitted record's {@link dryFold} (9.30.0; the delta encoder's own
190
+ * per-family replay, which asked it too, was deleted then).
189
191
  * `commitValueAt` needs no skip: it anchors at the LAST `set` by construction.
190
192
  */
191
193
  export declare function supersededByNextSet(rows: readonly {
@@ -196,10 +198,15 @@ export declare function supersededByNextSet(rows: readonly {
196
198
  * Applies a commit bundle to a base state by replaying operations in order.
197
199
  * Guarantees "last writer wins" semantics.
198
200
  *
199
- * The single replay primitive — three consumers inherit every verb from it:
200
- * live state (`SharedMemory.applyPatch`), time travel
201
- * (`EventLog.materialise`), and the redacted mirror
202
- * (`StageContext.commit`'s second `applyPatch`).
201
+ * Returns a FULLY DETACHED result: the base is deep-cloned first and every
202
+ * value the replay writes is its own (`set` / `append` clone the recorded
203
+ * value; the `merge` arm reads a detached copy of `updates`), so the result
204
+ * shares no container with `base`, `updates` or `overwrite`. This is the
205
+ * public (`footprintjs/advanced`) contract, unchanged by copy-on-write
206
+ * (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
207
+ * commit does NOT come here: `SharedMemory.applyPatch` builds the next
208
+ * generation with `nextGeneration`, which copies only the written
209
+ * paths. Both run the ONE verb switch, `replayRows`.
203
210
  *
204
211
  * Verb arms:
205
212
  * - `'set'` — overwrite with `overwrite[path]` (the full final value).
@@ -217,18 +224,42 @@ export declare function supersededByNextSet(rows: readonly {
217
224
  *
218
225
  * Work, not bytes (9.22.1): a `set` row the NEXT row re-sets is skipped
219
226
  * ({@link supersededByNextSet}) — the rows stay in the log, only the clone
220
- * each would have paid is not. Every consumer above inherits the skip from
221
- * here; there is no second replay loop to keep in step.
227
+ * each would have paid is not. Every consumer inherits the skip from
228
+ * `replayRows`; there is no second replay loop to keep in step.
222
229
  */
223
230
  export declare function applySmartMerge(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
224
231
  /**
225
- * The same replay, INTO `target` — the one verb switch, no clone of its own.
226
- * For a caller that already holds a private working copy (the read-side fold
227
- * in `time-travel/stateAt.ts`, which clones its base ONCE and then applies
228
- * every bundle here), so a fold over N bundles costs N row applications, not
229
- * N clones of the whole state. Never hand it committed state: it mutates.
230
- * The values it writes are its own (`set`/`append` clone the recorded value;
231
- * `merge` builds new containers), so `target` never aliases the log.
232
+ * The engine's commit (copy-on-write, 9.29.0 — docs/design/2026-10-copy-on-
233
+ * write-commit.md): the NEXT committed generation. A copy of `base`'s ROOT
234
+ * plus a copy of every container on each written path; every other subtree
235
+ * is SHARED with `base`, which is never edited — committed state is
236
+ * immutable-after-swap, so sharing is safe, and a commit costs O(what it
237
+ * wrote), not O(state). `SharedMemory.applyPatch` (live state and the
238
+ * redacted mirror) is its caller. Internal: the public replay is
239
+ * {@link applySmartMerge}.
240
+ */
241
+ export declare function nextGeneration(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
242
+ /**
243
+ * The same replay, INTO `target` — no clone of its own. For a caller that
244
+ * already holds a private working copy (the read-side folds: `stateAt` in
245
+ * `time-travel/stateAt.ts` and `EventLog.materialise` clone their base ONCE
246
+ * and then apply every bundle here), so a fold over N bundles costs N row
247
+ * applications, not N clones of the whole state. Never hand it committed
248
+ * state: it mutates the ROOT in place. Below the root it follows the live
249
+ * commit's law ({@link nextGeneration}) — a container this call did not
250
+ * create is copied before a write passes through it — so a fold and the live
251
+ * state give the same value at every path, aliased subtrees included.
252
+ * The values it writes are its own, so `target` never aliases the log.
232
253
  */
233
254
  export declare function applySmartMergeInto(target: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
255
+ /**
256
+ * The fold, for COMPARISON only (9.30.0 — the admitted record): `base` with
257
+ * the bundle replayed by the one verb switch, copy-on-write below the root,
258
+ * every recorded value placed BY REFERENCE — no clone, so it costs what the
259
+ * bundle wrote and nothing more. It aliases the payload and every subtree of
260
+ * `base` the bundle did not write, and edits neither. Never hand it out,
261
+ * store it or write through it: `TransactionBuffer` builds one to ask whether
262
+ * a bundle folds back to what the stage read, then drops it.
263
+ */
264
+ export declare function dryFold(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
234
265
  export {};