footprintjs 9.44.2 → 9.45.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 (36) hide show
  1. package/CLAUDE.md +4 -3
  2. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  3. package/dist/esm/lib/memory/EventLog.d.ts +1 -1
  4. package/dist/esm/lib/memory/EventLog.js +2 -2
  5. package/dist/esm/lib/memory/SharedMemory.d.ts +11 -10
  6. package/dist/esm/lib/memory/SharedMemory.js +19 -20
  7. package/dist/esm/lib/memory/StageContext.d.ts +11 -34
  8. package/dist/esm/lib/memory/StageContext.js +44 -94
  9. package/dist/esm/lib/memory/TransactionBuffer.d.ts +4 -3
  10. package/dist/esm/lib/memory/TransactionBuffer.js +6 -5
  11. package/dist/esm/lib/memory/recordCommit.d.ts +43 -0
  12. package/dist/esm/lib/memory/recordCommit.js +59 -0
  13. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  14. package/dist/esm/lib/memory/redaction.js +2 -2
  15. package/dist/esm/lib/memory/utils.d.ts +11 -7
  16. package/dist/esm/lib/memory/utils.js +46 -28
  17. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -2
  18. package/dist/esm/lib/runner/ExecutionRuntime.js +3 -3
  19. package/dist/lib/memory/DiagnosticCollector.js +2 -2
  20. package/dist/lib/memory/EventLog.js +2 -2
  21. package/dist/lib/memory/SharedMemory.js +19 -20
  22. package/dist/lib/memory/StageContext.js +43 -93
  23. package/dist/lib/memory/TransactionBuffer.js +6 -5
  24. package/dist/lib/memory/recordCommit.js +63 -0
  25. package/dist/lib/memory/redaction.js +2 -2
  26. package/dist/lib/memory/utils.js +46 -28
  27. package/dist/lib/runner/ExecutionRuntime.js +3 -3
  28. package/dist/types/lib/memory/EventLog.d.ts +1 -1
  29. package/dist/types/lib/memory/SharedMemory.d.ts +11 -10
  30. package/dist/types/lib/memory/StageContext.d.ts +11 -34
  31. package/dist/types/lib/memory/TransactionBuffer.d.ts +4 -3
  32. package/dist/types/lib/memory/recordCommit.d.ts +43 -0
  33. package/dist/types/lib/memory/redaction.d.ts +1 -1
  34. package/dist/types/lib/memory/utils.d.ts +11 -7
  35. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -2
  36. package/package.json +1 -1
@@ -11,6 +11,8 @@
11
11
  * (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
12
12
  * `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
13
13
  * The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
14
+ * The writers take an ADDRESS, a path prefix their caller computed, and never
15
+ * name one (C2: the engine decides where a stage writes, `StageContext · address`).
14
16
  * Zero external dependencies.
15
17
  */
16
18
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -31,54 +33,70 @@ Object.defineProperty(exports, "dryFold", { enumerable: true, get: function () {
31
33
  Object.defineProperty(exports, "nextGeneration", { enumerable: true, get: function () { return verbs_js_1.nextGeneration; } });
32
34
  Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: function () { return verbs_js_1.supersededByNextSet; } });
33
35
  /**
34
- * Resolves run-namespaced and global paths.
35
- * Each flowchart execution (run) stores data under `runs/{id}/` to prevent collisions.
36
+ * The two places a value at `path` can sit: under `address` (`runPath`, absent
37
+ * for the root address `[]`) and at the root (`globalPath`). `address` is a
38
+ * path prefix the caller computed — for the engine, a frame's run namespace
39
+ * (`StageContext · address`, C2).
36
40
  */
37
- function getRunAndGlobalPaths(runId, path = []) {
41
+ function getRunAndGlobalPaths(address = [], path = []) {
38
42
  return {
39
- runPath: runId ? ['runs', runId, ...path] : undefined,
43
+ runPath: addressOf(address).length > 0 ? pathUnder(address, path) : undefined,
40
44
  globalPath: [...path],
41
45
  };
42
46
  }
43
47
  exports.getRunAndGlobalPaths = getRunAndGlobalPaths;
48
+ /** An address is an array. A run id still passed in its place (C2) is refused, never spread into its characters. */
49
+ function addressOf(address) {
50
+ if (Array.isArray(address))
51
+ return address;
52
+ throw new TypeError(`footprintjs: an address is an array path prefix, got ${address === null ? 'null' : typeof address}`);
53
+ }
54
+ /**
55
+ * `address` then `path`, as one new array. An index loop, because the double
56
+ * spread `[...address, ...path]` costs twice as much and a frame builds one on
57
+ * every read it serves from live state (a fork child reading a root key).
58
+ */
59
+ function pathUnder(address, path) {
60
+ const out = new Array(address.length + path.length);
61
+ for (let i = 0; i < address.length; i++)
62
+ out[i] = address[i];
63
+ for (let i = 0; i < path.length; i++)
64
+ out[address.length + i] = path[i];
65
+ return out;
66
+ }
44
67
  /**
45
- * Sets a value at a nested path, creating intermediate objects as needed.
68
+ * The container at `address` + `path` inside `obj`, each missing one created
69
+ * on the way: the one AT the address from `defaultValues` when given, every
70
+ * other one empty. The one walk both nested writers share.
46
71
  */
47
- function setNestedValue(obj, runId, _path, field, value, defaultValues) {
48
- const { runPath, globalPath } = getRunAndGlobalPaths(runId, _path);
49
- const path = runPath || globalPath;
50
- const pathCopy = [...path];
72
+ function containerAt(obj, address = [], path = [], defaultValues) {
73
+ const segments = pathUnder(addressOf(address), path);
51
74
  let current = obj;
52
- while (pathCopy.length > 0) {
53
- const key = pathCopy.shift();
75
+ for (let i = 0; i < segments.length; i++) {
76
+ const key = segments[i];
54
77
  if (!Object.prototype.hasOwnProperty.call(current, key)) {
55
- current[key] = key === runId && defaultValues ? defaultValues : {};
78
+ current[key] = i === address.length - 1 && defaultValues ? defaultValues : {};
56
79
  }
57
80
  current = current[key];
58
81
  }
59
- current[field] = value;
82
+ return current;
83
+ }
84
+ /**
85
+ * Sets a value at a nested path under `address`, creating intermediate objects as needed.
86
+ */
87
+ function setNestedValue(obj, address, path, field, value, defaultValues) {
88
+ containerAt(obj, address, path, defaultValues)[field] = value;
60
89
  return obj;
61
90
  }
62
91
  exports.setNestedValue = setNestedValue;
63
92
  /**
64
- * Deep-merges a value into the object at the specified path.
93
+ * Deep-merges a value into the object at a nested path under `address`.
65
94
  * - Arrays: concatenate
66
95
  * - Objects: shallow merge at each level
67
96
  * - Primitives: replace
68
97
  */
69
- function updateNestedValue(obj, runId, _path, field, value, defaultValues) {
70
- const { runPath, globalPath } = getRunAndGlobalPaths(runId, _path);
71
- const path = runPath || globalPath;
72
- const pathCopy = [...path];
73
- let current = obj;
74
- while (pathCopy.length > 0) {
75
- const key = pathCopy.shift();
76
- if (!Object.prototype.hasOwnProperty.call(current, key)) {
77
- current[key] = key === runId && defaultValues ? defaultValues : {};
78
- }
79
- current = current[key];
80
- }
81
- updateValue(current, field, value);
98
+ function updateNestedValue(obj, address, path, field, value, defaultValues) {
99
+ updateValue(containerAt(obj, address, path, defaultValues), field, value);
82
100
  return obj;
83
101
  }
84
102
  exports.updateNestedValue = updateNestedValue;
@@ -129,4 +147,4 @@ function getNestedValue(root, path, field) {
129
147
  return undefined;
130
148
  }
131
149
  exports.getNestedValue = getNestedValue;
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRzs7O0FBRUgsNkNBQXVGO0FBSXZGLDZDQUEwQztBQUFqQyx3R0FBQSxTQUFTLE9BQUE7QUFDbEIsdUNBQTRDO0FBQW5DLDBHQUFBLGNBQWMsT0FBQTtBQUN2Qix1Q0FBZ0U7QUFBdkQsaUdBQUEsS0FBSyxPQUFBO0FBQUUseUdBQUEsYUFBYSxPQUFBO0FBQUUsd0dBQUEsWUFBWSxPQUFBO0FBQzNDLHVDQUFnSDtBQUF2RywyR0FBQSxlQUFlLE9BQUE7QUFBRSwrR0FBQSxtQkFBbUIsT0FBQTtBQUFFLG1HQUFBLE9BQU8sT0FBQTtBQUFFLDBHQUFBLGNBQWMsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBSTNGOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxPQUE0QixFQUFFO0lBQ2pGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUxELG9EQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLEtBQWEsRUFDYixLQUFlLEVBQ2YsS0FBYSxFQUNiLEtBQVEsRUFDUixhQUF1QjtJQUV2QixNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDO0lBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJ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R0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDakUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBZEQsa0NBY0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxJQUFTLEVBQUUsSUFBeUIsRUFBRSxLQUF1QjtJQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVBELHdDQU9DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB1dGlscy50cyDigJQgbmVzdGVkLW9iamVjdCBoZWxwZXJzIGZvciB0aGUgaGVhcCwgYW5kIHRoZSBtZW1vcnkgbGVhdmVzJyBvbmVcbiAqIHJlLWV4cG9ydCBzdXJmYWNlLlxuICpcbiAqIFRoZSBoZWxwZXJzIGhlcmUgKGBzZXROZXN0ZWRWYWx1ZWAsIGB1cGRhdGVOZXN0ZWRWYWx1ZWAsIGB1cGRhdGVWYWx1ZWAsXG4gKiBgZ2V0TmVzdGVkVmFsdWVgKSB3YWxrIGEgbmVzdGVkIG9iamVjdCBieSBwYXRoIHdpdGhcbiAqIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi4gRXZlcnl0aGluZyBlbHNlIHRoaXMgZmlsZSB1c2VkIHRvIGhvbGQgaGFzIGFuXG4gKiBvd25lciBvZiBpdHMgb3duIGFuZCBpcyByZS1leHBvcnRlZCwgc28gbm8gaW1wb3J0ZXIgbW92ZWQ6IHRoZSBwYXRoIGNvZGVjXG4gKiAoYHBhdGhzLnRzYCksIHN0cnVjdHVyYWwgZXF1YWxpdHkgKGBlcXVhbGl0eS50c2ApIGFuZCB0aGUgdW5pb24gbWVyZ2VcbiAqIChgbWVyZ2UudHNgKSBhdCBMMCwgYW5kIHRoZSB2ZXJiIGxhdyAoYHZlcmJzLnRzYCkgYXQgTDEg4oCUIGBhcHBseVNtYXJ0TWVyZ2VgLFxuICogYG5leHRHZW5lcmF0aW9uYCwgYGFwcGx5U21hcnRNZXJnZUludG9gLCBgZHJ5Rm9sZGAsIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAqIFRoZSBsb2cncyBzY3J1YiwgYHJlZGFjdFBhdGNoYCwgbW92ZWQgdG8gaXRzIG93bmVyIGByZWRhY3Rpb24udHNgIGluIDkuMzMuMC5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogUmVzb2x2ZXMgcnVuLW5hbWVzcGFjZWQgYW5kIGdsb2JhbCBwYXRocy5cbiAqIEVhY2ggZmxvd2NoYXJ0IGV4ZWN1dGlvbiAocnVuKSBzdG9yZXMgZGF0YSB1bmRlciBgcnVucy97aWR9L2AgdG8gcHJldmVudCBjb2xsaXNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQ/OiBzdHJpbmcsIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IHJ1bklkID8gWydydW5zJywgcnVuSWQsIC4uLnBhdGhdIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCwgY3JlYXRpbmcgaW50ZXJtZWRpYXRlIG9iamVjdHMgYXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VD4oXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBydW5JZDogc3RyaW5nLFxuICBfcGF0aDogc3RyaW5nW10sXG4gIGZpZWxkOiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQsIF9wYXRoKTtcbiAgY29uc3QgcGF0aCA9IHJ1blBhdGggfHwgZ2xvYmFsUGF0aDtcbiAgY29uc3QgcGF0aENvcHkgPSBbLi4ucGF0aF07XG4gIGxldCBjdXJyZW50OiBOZXN0ZWRPYmplY3QgPSBvYmo7XG4gIHdoaWxlIChwYXRoQ29weS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0aENvcHkuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0ga2V5ID09PSBydW5JZCAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIGN1cnJlbnRbZmllbGRdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRGVlcC1tZXJnZXMgYSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIF9wYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkLCBfcGF0aCk7XG4gIGNvbnN0IHBhdGggPSBydW5QYXRoIHx8IGdsb2JhbFBhdGg7XG4gIGNvbnN0IHBhdGhDb3B5ID0gWy4uLnBhdGhdO1xuICBsZXQgY3VycmVudDogTmVzdGVkT2JqZWN0ID0gb2JqO1xuICB3aGlsZSAocGF0aENvcHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGtleSA9IHBhdGhDb3B5LnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGtleSA9PT0gcnVuSWQgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICB1cGRhdGVWYWx1ZShjdXJyZW50LCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBdUY7QUFJdkYsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIHRvIGl0cyBvd25lciBgcmVkYWN0aW9uLnRzYCBpbiA5LjMzLjAuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgU3RhZ2VDb250ZXh0IMK3IGFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYFN0YWdlQ29udGV4dCDCtyBhZGRyZXNzYCwgQzIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdKSB7XG4gIHJldHVybiB7XG4gICAgcnVuUGF0aDogYWRkcmVzc09mKGFkZHJlc3MpLmxlbmd0aCA+IDAgPyBwYXRoVW5kZXIoYWRkcmVzcywgcGF0aCkgOiB1bmRlZmluZWQsXG4gICAgZ2xvYmFsUGF0aDogWy4uLnBhdGhdLFxuICB9O1xufVxuXG4vKiogQW4gYWRkcmVzcyBpcyBhbiBhcnJheS4gQSBydW4gaWQgc3RpbGwgcGFzc2VkIGluIGl0cyBwbGFjZSAoQzIpIGlzIHJlZnVzZWQsIG5ldmVyIHNwcmVhZCBpbnRvIGl0cyBjaGFyYWN0ZXJzLiAqL1xuZnVuY3Rpb24gYWRkcmVzc09mKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhZGRyZXNzKSkgcmV0dXJuIGFkZHJlc3M7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYGZvb3RwcmludGpzOiBhbiBhZGRyZXNzIGlzIGFuIGFycmF5IHBhdGggcHJlZml4LCBnb3QgJHthZGRyZXNzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFkZHJlc3N9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBgYWRkcmVzc2AgdGhlbiBgcGF0aGAsIGFzIG9uZSBuZXcgYXJyYXkuIEFuIGluZGV4IGxvb3AsIGJlY2F1c2UgdGhlIGRvdWJsZVxuICogc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aF1gIGNvc3RzIHR3aWNlIGFzIG11Y2ggYW5kIGEgZnJhbWUgYnVpbGRzIG9uZSBvblxuICogZXZlcnkgcmVhZCBpdCBzZXJ2ZXMgZnJvbSBsaXZlIHN0YXRlIChhIGZvcmsgY2hpbGQgcmVhZGluZyBhIHJvb3Qga2V5KS5cbiAqL1xuZnVuY3Rpb24gcGF0aFVuZGVyKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmcgfCBudW1iZXI+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgb3V0W2FkZHJlc3MubGVuZ3RoICsgaV0gPSBwYXRoW2ldO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBjb250YWluZXIgYXQgYGFkZHJlc3NgICsgYHBhdGhgIGluc2lkZSBgb2JqYCwgZWFjaCBtaXNzaW5nIG9uZSBjcmVhdGVkXG4gKiBvbiB0aGUgd2F5OiB0aGUgb25lIEFUIHRoZSBhZGRyZXNzIGZyb20gYGRlZmF1bHRWYWx1ZXNgIHdoZW4gZ2l2ZW4sIGV2ZXJ5XG4gKiBvdGhlciBvbmUgZW1wdHkuIFRoZSBvbmUgd2FsayBib3RoIG5lc3RlZCB3cml0ZXJzIHNoYXJlLlxuICovXG5mdW5jdGlvbiBjb250YWluZXJBdChcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGhVbmRlcihhZGRyZXNzT2YoYWRkcmVzcyksIHBhdGgpO1xuICBsZXQgY3VycmVudCA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNlZ21lbnRzW2ldO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFNldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYCwgY3JlYXRpbmcgaW50ZXJtZWRpYXRlIG9iamVjdHMgYXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VD4oXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogc3RyaW5nW10sXG4gIGZpZWxkOiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcylbZmllbGRdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRGVlcC1tZXJnZXMgYSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AuXG4gKiAtIEFycmF5czogY29uY2F0ZW5hdGVcbiAqIC0gT2JqZWN0czogc2hhbGxvdyBtZXJnZSBhdCBlYWNoIGxldmVsXG4gKiAtIFByaW1pdGl2ZXM6IHJlcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IGFueSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGZpZWxkOiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IGFueSB7XG4gIHVwZGF0ZVZhbHVlKGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcyksIGZpZWxkLCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW4tcGxhY2UgdmFsdWUgdXBkYXRlIHdpdGggbWVyZ2Ugc2VtYW50aWNzLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IGNvbmNhdGVuYXRlIG9udG8gZXhpc3RpbmdcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBgW11gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gT2JqZWN0cyAobm9uLWVtcHR5KTogc2hhbGxvdyBtZXJnZSAoc3ByZWFkKVxuICogLSBPYmplY3RzIChlbXB0eSk6ICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGB7fWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBQcmltaXRpdmVzOiBkaXJlY3QgYXNzaWdubWVudFxuICpcbiAqIE5vdGUgb24gZW1wdHkgYXJyYXlzOiBib3RoIGB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKWAgYW5kXG4gKiBgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGV2YWx1YXRlIHRoZSBzYW1lIGZvciBhcnJheXMg4oCUIGBbXWAgaXMgdHJ1dGh5IGluXG4gKiBKYXZhU2NyaXB0LCBzbyB0aGUgYCYmYCBndWFyZCB3YXMgbmV2ZXIgdGhlIGlzc3VlLiBUaGUgYWN0dWFsIGJ1ZyB3YXMgdGhlXG4gKiBjb25jYXQgcGF0aDogYFsuLi5jdXIsIC4uLltdXWAgc2lsZW50bHkgcmV0dXJuZWQgYGN1cmAgdW5jaGFuZ2VkIHdoZW4gYHZhbHVlYFxuICogd2FzIGBbXWAsIG1ha2luZyBgdXBkYXRlVmFsdWUob2JqLCAndGFncycsIFtdKWAgYSBuby1vcCBpbnN0ZWFkIG9mIGEgY2xlYXIuXG4gKiBUaGUgZml4IGlzIHRoZSBleHBsaWNpdCBgdmFsdWUubGVuZ3RoID09PSAwYCBlYXJseS1yZXR1cm4gYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWUob2JqZWN0OiBhbnksIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogWy4uLmN1ciwgLi4udmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi5jdXIsIC4uLnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
@@ -21,8 +21,8 @@ const StageContext_js_1 = require("../memory/StageContext.js");
21
21
  class ExecutionRuntime {
22
22
  globalStore;
23
23
  /**
24
- * Parallel redacted mirror of `globalStore`. Populated during traversal via
25
- * `StageContext.commit()` using the already-computed redacted patches.
24
+ * Parallel redacted mirror of `globalStore`. Populated by every commit that
25
+ * staged a write (`memory/recordCommit.ts · recordCommit`), with the already-computed redacted patches.
26
26
  * Only exists when the run's policy keeps a mirror (`RunPolicy.mirror` —
27
27
  * `FlowChartExecutor` sets it when a `RedactionPolicy` is configured).
28
28
  * Otherwise undefined and zero cost.
@@ -192,4 +192,4 @@ class ExecutionRuntime {
192
192
  }
193
193
  }
194
194
  exports.ExecutionRuntime = ExecutionRuntime;
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUVILG9EQUFvRDtBQUNwRCx1REFBaUQ7QUFFakQsK0RBQTREO0FBRTVELHlEQUE0RDtBQUM1RCwrREFBeUQ7QUFDekQsK0RBQXlEO0FBbUh6RCxNQUFhLGdCQUFnQjtJQUNwQixXQUFXLENBQWU7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFlO0lBQy9CLGdCQUFnQixDQUFXO0lBQ2xDLG9GQUFvRjtJQUM1RSxhQUFhLENBQWdCO0lBQzdCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVU7SUFDaEM7bUZBQytFO0lBQ3ZFLE1BQU0sQ0FBWTtJQUUxQiw0RUFBNEU7SUFDcEUsU0FBUyxDQUEyQjtJQUU1Qzs7Ozs7O09BTUc7SUFDSCxZQUNFLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxhQUF1QixFQUN2QixZQUFzQixFQUN0QixTQUFvQixpQ0FBa0I7UUFFdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLDhCQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsOERBQThEO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4ZWN1dGlvblJ1bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgeyBmcmVlemVSZWNvcmQgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4uL21lbW9yeS9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICcuLi9tZW1vcnkvZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGlzIGxvZywgc3RhYmxlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIHJlc3VtZS4gQWJzZW50IGJlZm9yZSBiaW5kaW5nIG9yIGluIG9sZGVyIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbn07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGR1cmluZyB0cmF2ZXJzYWwgdmlhXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0KClgIHVzaW5nIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMuXG4gICAqIE9ubHkgZXhpc3RzIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvciAoYFJ1blBvbGljeS5taXJyb3JgIOKAlFxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHNldHMgaXQgd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBPdGhlcndpc2UgdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgKGBtZW1vcnkvcnVuUG9saWN5LnRzYCkg4oCUIGluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZTtcbiAgICogIGl0cyBgY29tbWl0VmFsdWVzYCBhbmQgYHdyaXRlUHJvdmVuYW5jZWAgYXJlIHRoZSBzbmFwc2hvdCBkaXNjcmltaW5hbnRzLiAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5O1xuXG4gIC8qKiBNZW1vaXplZCBmcm96ZW4gZm9sZCBiYXNlIOKAlCBzZWUge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LiAqL1xuICBwcml2YXRlIF9mb2xkQmFzZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcG9saWN5IFRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgLCBGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGVcbiAgICogICByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnLiBJbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWUgaGVyZSwgc29cbiAgICogICB0aGUgRklSU1QgY29tbWl0IChhIHN1YmZsb3cncyBzZWVkLCBgaGlzdG9yeVswXWApIGFscmVhZHkgcnVucyB1bmRlciBpdDtcbiAgICogICBldmVyeSBmcmFtZSBhZnRlciBpbmhlcml0cyB0aGUgc2FtZSByZWZlcmVuY2UuIERlZmF1bHQ6IGV2ZXJ5IGRpYWwgYXRcbiAgICogICBpdHMgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICByb290SWQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbiAgICBpbml0aWFsU3RhdGU/OiB1bmtub3duLFxuICAgIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZLFxuICApIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICAvLyBUaGUgZXZlbnQgbG9nJ3MgZm9sZCBiYXNlIG11c3QgYmUgdGhlIFNBTUUgc3RhdGUgdGhlIHN0b3JlIHN0YXJ0cyBmcm9tXG4gICAgLy8g4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIGBTaGFyZWRNZW1vcnlgIGNvbXB1dGVkIGFib3ZlLiBTZWVkaW5nIHRoZSBsb2cgZnJvbSBgaW5pdGlhbFN0YXRlYCBhbG9uZVxuICAgIC8vIGxlZnQgYGRlZmF1bHRWYWx1ZXNgIG91dCBvZiBldmVyeSByZXBsYXksIHNvIGEgZm9sZCBjb3VsZCBub3QgcmVwcm9kdWNlXG4gICAgLy8gdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LiBgZ2V0U3RhdGUoKWAgaXMgdGhlIGxpdmUgY29udGV4dDsgdGhlXG4gICAgLy8gRXZlbnRMb2cgY29uc3RydWN0b3IgY2xvbmVzIGl0LCBzbyB0aGUgYmFzZSBzdGF5cyBkZXRhY2hlZC5cbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkgPSBuZXcgRXZlbnRMb2codGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSB0aGlzLm5ld1Jvb3Qocm9vdE5hbWUsIHJvb3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmcmVzaCByb290IGZyYW1lIGZvciB0aGlzIHJ1bnRpbWUg4oCUIGBnbG9iYWxTdG9yZWAsIGBleGVjdXRpb25IaXN0b3J5YCxcbiAgICogdGhlIHJ1bidzIHBvbGljeSBhbmQgKHdoZW4ga2VwdCkgdGhlIG1pcnJvci4gQWxzbyBob3cgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogcmVwbGFjZXMgYSBzdWJmbG93J3Mgc2VlZCBmcmFtZSB3aXRoIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbi5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICBjb25zdCByb290ID0gbmV3IFN0YWdlQ29udGV4dCgnJywgbmFtZSwgaWQsIHRoaXMuZ2xvYmFsU3RvcmUsICcnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkpO1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeShyb290KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgb24gdGhlIENVUlJFTlQgcm9vdCBmcmFtZSDigJQgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSwgd2hvc2UgY29udGludWF0aW9uIHJvb3QgKGBsZWFmLmNyZWF0ZU5leHRgKSBpcyBhZHZhbmNlZCBiZWZvcmVcbiAgICogdGhlIGV4ZWN1dG9yIGJ1aWxkcyB0aGlzIGxlZydzIHBvbGljeSAoYSBmcmVzaCBydWxlIHBlciBsZWcpLiBFdmVyeVxuICAgKiBkZXNjZW5kYW50IHRha2VzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGVyZS5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeSh0aGlzLnJvb3RTdGFnZUNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgb24gYHJvb3RgLCBhbmQgdGhlIG1pcnJvciBzdG9yZSB3aGVuIHRoZSBwb2xpY3kga2VlcHMgb25lLlxuICAgKiBUaGUgbWlycm9yIGlzIGEgU0VSVkVEIHN1cmZhY2UsIHNvIGl0cyBzZWVkIG11c3QgYWxyZWFkeSBiZSB0aGUgcG9saWN5J3NcbiAgICogdmlldyBvZiB0aGUgc3RhcnRpbmcgc3RhdGU6IGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgYGluaXRpYWxDb250ZXh0YFxuICAgKiAvIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAgKG9yLCBvbiBhIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSwgYnkgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgKSBhbmQgaXMgbmV2ZXIgcmUtd3JpdHRlbiB3b3VsZCBvdGhlcndpc2Ugc2l0XG4gICAqIGluIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaW4gcGxhaW50ZXh0IOKAlCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBMT0cncyBwbGFjZWhvbGRlciwgdGhlIHNhbWUgc3RyaW5nIHRoZSByZWRhY3RlZCBwYXRjaGVzIGNhcnJ5LlxuICAgKiBDcmVhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgKGEgc3ViZmxvdydzIHJ1bnRpbWUga2VlcHMgaXRzIG93bjsgaXRzIHNlZWQgaXNcbiAgICogZW1wdHkg4oCUIHRoZSBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvbGljeShyb290OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICByb290LnVzZVBvbGljeSh0aGlzLnBvbGljeSk7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5taXJyb3IpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVkYWN0ZWRTdG9yZSkge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICAgIHRoaXMucmVkYWN0ZWRTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2RlZmF1bHRWYWx1ZXMsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnVzZVJlZGFjdGVkTWlycm9yKHRoaXMucmVkYWN0ZWRTdG9yZSk7XG4gIH1cblxuICAvKiogUHJlc2VydmUgdGhlIGN1cnJlbnQgcm9vdFN0YWdlQ29udGV4dCBmb3Igc25hcHNob3RzIGJlZm9yZSBjaGFuZ2luZyBpdCBmb3IgcmVzdW1lLiAqL1xuICBwcmVzZXJ2ZVNuYXBzaG90Um9vdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NuYXBzaG90Um9vdCkge1xuICAgICAgdGhpcy5fc25hcHNob3RSb290ID0gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJvemVuLCBkZXRhY2hlZCBmb2xkIGJhc2Ugc2VydmVkIGFzIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS5cbiAgICogQ29tcHV0ZWQgb25jZSAodGhlIGJhc2UgbmV2ZXIgY2hhbmdlcyBhZnRlciBjb25zdHJ1Y3Rpb24pIGFuZCBzaGFyZWQg4oCUXG4gICAqIHNhZmUgYmVjYXVzZSBpdCBpcyBkZWVwbHkgZnJvemVuLCBzbyBubyBob2xkZXIgY2FuIG11dGF0ZSBpdCBvciByZWFjaCB0aGVcbiAgICogZW5naW5lIHRocm91Z2ggaXQ7IGEgYmFzZSBob2xkaW5nIGEgRGF0ZSwgTWFwLCBidWZmZXIg4oCmICh3aGF0IGZyZWV6aW5nXG4gICAqIGNhbm5vdCBzZWFsKSBpcyBzZXJ2ZWQgYnkgdGhlIHB1YmxpYyBzbmFwc2hvdCBhcyBhIGNvcHkgb2YgaXRzIG9wZW4gcGF0aHNcbiAgICogKGBydW5uZXIvc25hcHNob3QudHMgwrcgc2VydmVkU25hcHNob3RgLCBgY2FwdHVyZS9mcmVlemUudHMgwrcgc2VydmVSZWNvcmRgLFxuICAgKiA5LjQ0LjIpLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb2xkQmFzZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLl9mb2xkQmFzZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIHRoaXMuX2ZvbGRCYXNlID0gZnJlZXplUmVjb3JkKGJhc2UgJiYgdHlwZW9mIGJhc2UgPT09ICdvYmplY3QnID8gYmFzZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvbGRCYXNlO1xuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqXG4gICAqIGBpbml0aWFsU3RhdGVgICh0aGUgZm9sZCBiYXNlKSBpcyBPTUlUVEVEIHVuZGVyIGByZWRhY3Q6IHRydWVgLiBJdCBpcyB0aGVcbiAgICogcnVuJ3MgcmF3IHByZS1ydW4gc2VlZCDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aFxuICAgKiBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIOKAlCBhbmQgaXQgbmV2ZXIgcGFzc2VkIHRocm91Z2ggYSByZWRhY3Rpb25cbiAgICogcG9saWN5OiB0aGUgcG9saWN5IHNjcnVicyBXUklURVMgYXQgdGhlIHNjb3BlIGZhY2FkZSwgYW5kIHRoZSBiYXNlIHdhc1xuICAgKiBuZXZlciB3cml0dGVuIGJ5IGEgc3RhZ2UuIFNlcnZpbmcgaXQgb24gdGhlIHJlZGFjdGVkIHN1cmZhY2Ugd291bGQgaGFuZFxuICAgKiBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhIHNlZWRlZCBzZWNyZXQgdGhhdCBhIGxhdGVyIGNvbW1pdCBoYWRcbiAgICogc2NydWJiZWQuIEEgY29uc3VtZXIgZm9sZGluZyB3aXRob3V0IGl0IGdldHMgYGJhc2lzOiAnbG9nLW9ubHknYCBmcm9tXG4gICAqIGBzdGF0ZUF0YCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBzaWduYWwgdGhhdCB0aGUgYmFzZSBkaWQgbm90IHRyYXZlbCB3aXRoXG4gICAqIHRoaXMgbG9nIOKAlCBhIHBhcnRpYWwgYW5zd2VyIHRoYXQgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gICAqXG4gICAqIFJldHVybnMgYE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPmA6IHRoZSBydW50aW1lIGlzIHRoZSBtZW1vcnlcbiAgICogY29udGFpbmVyIGFuZCBkb2Vzbid0IGtub3cgd2hpY2ggcnVuIGl0IHNlcnZlcyDigJQgYHJ1bklkYCBpcyBwZXItcnVuXG4gICAqIGV4ZWN1dG9yIHN0YXRlLCBzdGFtcGVkIGJ5IGBGbG93Y2hhcnRUcmF2ZXJzZXIuZ2V0U25hcHNob3QoKWAgKHdoaWNoXG4gICAqIG93bnMgdGhlIHJ1bidzIGlkIGFuZCBhbHJlYWR5IHN0YW1wcyBpdCBvbiBldmVyeSBldmVudCkuIFN1YmZsb3dzJ1xuICAgKiBuZXN0ZWQgcnVudGltZXMgZGVsaWJlcmF0ZWx5IGhhdmUgTk8gcnVuSWQgb2YgdGhlaXIgb3duIChhIHN1YmZsb3cgaXNcbiAgICogcGFydCBvZiB0aGUgcGFyZW50J3MgbG9naWNhbCBydW4pLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+IHtcbiAgICBjb25zdCBzbmFwc2hvdFJvb3QgPSB0aGlzLl9zbmFwc2hvdFJvb3QgPz8gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHVzZVJlZGFjdGVkID0gb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlICYmIHRoaXMucmVkYWN0ZWRTdG9yZSAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFyZWRTdGF0ZTogdXNlUmVkYWN0ZWQgPyB0aGlzLnJlZGFjdGVkU3RvcmUhLmdldFN0YXRlKCkgOiB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdFJvb3QuZ2V0U25hcHNob3QoKSxcbiAgICAgIC8vIFJFREFDVElPTjogdGhlIGZvbGQgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW4gc2VlZCBhbmQgbm8gcG9saWN5IGV2ZXJcbiAgICAgIC8vIHRvdWNoZWQgaXQgKHBvbGljaWVzIHNjcnViIHdyaXRlczsgbm90aGluZyB3cm90ZSB0aGUgYmFzZSkuIE9taXQgaXRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGxlYWsgaXQg4oCUIGBzdGF0ZUF0YCBkZWdyYWRlcyB0byBgYmFzaXM6ICdsb2ctb25seSdgLlxuICAgICAgLi4uKHVzZVJlZGFjdGVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogdGhpcy5nZXRGb2xkQmFzZSgpIH0pLFxuICAgICAgLy8gREVUQUNIRUQ6IHRoZSBlbmdpbmUga2VlcHMgaXRzIGxpdmUgRXZlbnRMb2c7IHRoZSBzbmFwc2hvdCBnZXRzIGFcbiAgICAgIC8vIGZyb3plbiBhcnJheSBvZiBpdHMgb3duIChgcmVjb3JkZWQoKWAgYnVpbGRzIGEgbmV3IG9uZSkuIFNlcnZpbmcgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSBhbGlhc2VkIGl0LCBzbyBhIHNuYXBzaG90IHRha2VuIG1pZC1ydW4ga2VwdCBncm93aW5nXG4gICAgICAvLyB1bmRlciBpdHMgaG9sZGVyIGFuZCBhIGNvbnN1bWVyIGNvdWxkIHNwbGljZSB0aGUgZW5naW5lJ3Mgb3duIGhpc3RvcnkuXG4gICAgICAvLyBUaGUgYnVuZGxlcyBpbiBpdCBhcmUgdGhlIGxvZydzIG93biwgZnJvemVuIGF0IGBFdmVudExvZyDCtyByZWNvcmRgXG4gICAgICAvLyAoRjMpLiBUaGUgcHVibGljIHNuYXBzaG90IHNlcnZlcyB0aGVtIChgcnVubmVyL3NuYXBzaG90LnRzIMK3XG4gICAgICAvLyBzZXJ2ZWRTbmFwc2hvdGAsIDkuNDQuMik7IHRoaXMgb25lIGlzIGFsc28gdGhlIGVuZ2luZSdzIG93biDigJQgYVxuICAgICAgLy8gc3ViZmxvdyBtb3VudCB0YWtlcyBpdCBvbmNlIHBlciBtb3VudCDigJQgc28gdGhlIHJ1biBwYXRoIHNlcnZlcyBub3RoaW5nLlxuICAgICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5yZWNvcmRlZCgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIC4uLih0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzIH0pLFxuICAgICAgY29tbWl0VmFsdWVzOiB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2U6IHRoaXMucG9saWN5LndyaXRlUHJvdmVuYW5jZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0dBVUc7OztBQUVILG9EQUFvRDtBQUNwRCx1REFBaUQ7QUFFakQsK0RBQTREO0FBRTVELHlEQUE0RDtBQUM1RCwrREFBeUQ7QUFDekQsK0RBQXlEO0FBbUh6RCxNQUFhLGdCQUFnQjtJQUNwQixXQUFXLENBQWU7SUFDakM7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFlO0lBQy9CLGdCQUFnQixDQUFXO0lBQ2xDLG9GQUFvRjtJQUM1RSxhQUFhLENBQWdCO0lBQzdCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVU7SUFDaEM7bUZBQytFO0lBQ3ZFLE1BQU0sQ0FBWTtJQUUxQiw0RUFBNEU7SUFDcEUsU0FBUyxDQUEyQjtJQUU1Qzs7Ozs7O09BTUc7SUFDSCxZQUNFLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxhQUF1QixFQUN2QixZQUFzQixFQUN0QixTQUFvQixpQ0FBa0I7UUFFdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLDhCQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsOERBQThEO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4ZWN1dGlvblJ1bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgeyBmcmVlemVSZWNvcmQgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4uL21lbW9yeS9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICcuLi9tZW1vcnkvZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGlzIGxvZywgc3RhYmxlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIHJlc3VtZS4gQWJzZW50IGJlZm9yZSBiaW5kaW5nIG9yIGluIG9sZGVyIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbn07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGJ5IGV2ZXJ5IGNvbW1pdCB0aGF0XG4gICAqIHN0YWdlZCBhIHdyaXRlIChgbWVtb3J5L3JlY29yZENvbW1pdC50cyDCtyByZWNvcmRDb21taXRgKSwgd2l0aCB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzLlxuICAgKiBPbmx5IGV4aXN0cyB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IgKGBSdW5Qb2xpY3kubWlycm9yYCDigJRcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCBzZXRzIGl0IHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKS5cbiAgICogT3RoZXJ3aXNlIHVuZGVmaW5lZCBhbmQgemVybyBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpYSBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLlxuICAgKi9cbiAgcHVibGljIHJlZGFjdGVkU3RvcmU/OiBTaGFyZWRNZW1vcnk7XG4gIHB1YmxpYyByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBleGVjdXRpb25IaXN0b3J5OiBFdmVudExvZztcbiAgLyoqIE9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkg4oCUIHNldCBiZWZvcmUgcmVzdW1lIGNoYW5nZXMgcm9vdFN0YWdlQ29udGV4dC4gKi9cbiAgcHJpdmF0ZSBfc25hcHNob3RSb290PzogU3RhZ2VDb250ZXh0O1xuICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IHVua25vd247XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IHVua25vd247XG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IChgbWVtb3J5L3J1blBvbGljeS50c2ApIOKAlCBpbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWU7XG4gICAqICBpdHMgYGNvbW1pdFZhbHVlc2AgYW5kIGB3cml0ZVByb3ZlbmFuY2VgIGFyZSB0aGUgc25hcHNob3QgZGlzY3JpbWluYW50cy4gKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeTtcblxuICAvKiogTWVtb2l6ZWQgZnJvemVuIGZvbGQgYmFzZSDigJQgc2VlIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS4gKi9cbiAgcHJpdmF0ZSBfZm9sZEJhc2U/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQHBhcmFtIHBvbGljeSBUaGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCwgRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlXG4gICAqICAgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZy4gSW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lIGhlcmUsIHNvXG4gICAqICAgdGhlIEZJUlNUIGNvbW1pdCAoYSBzdWJmbG93J3Mgc2VlZCwgYGhpc3RvcnlbMF1gKSBhbHJlYWR5IHJ1bnMgdW5kZXIgaXQ7XG4gICAqICAgZXZlcnkgZnJhbWUgYWZ0ZXIgaW5oZXJpdHMgdGhlIHNhbWUgcmVmZXJlbmNlLiBEZWZhdWx0OiBldmVyeSBkaWFsIGF0XG4gICAqICAgaXRzIGRlZmF1bHQsIG5vIHJ1bGUsIG5vIG1pcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgcm9vdElkOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4gICAgaW5pdGlhbFN0YXRlPzogdW5rbm93bixcbiAgICBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWSxcbiAgKSB7XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIHRoaXMuZ2xvYmFsU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KGRlZmF1bHRWYWx1ZXMsIGluaXRpYWxTdGF0ZSk7XG4gICAgLy8gVGhlIGV2ZW50IGxvZydzIGZvbGQgYmFzZSBtdXN0IGJlIHRoZSBTQU1FIHN0YXRlIHRoZSBzdG9yZSBzdGFydHMgZnJvbVxuICAgIC8vIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHdoYXRcbiAgICAvLyBgU2hhcmVkTWVtb3J5YCBjb21wdXRlZCBhYm92ZS4gU2VlZGluZyB0aGUgbG9nIGZyb20gYGluaXRpYWxTdGF0ZWAgYWxvbmVcbiAgICAvLyBsZWZ0IGBkZWZhdWx0VmFsdWVzYCBvdXQgb2YgZXZlcnkgcmVwbGF5LCBzbyBhIGZvbGQgY291bGQgbm90IHJlcHJvZHVjZVxuICAgIC8vIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy4gYGdldFN0YXRlKClgIGlzIHRoZSBsaXZlIGNvbnRleHQ7IHRoZVxuICAgIC8vIEV2ZW50TG9nIGNvbnN0cnVjdG9yIGNsb25lcyBpdCwgc28gdGhlIGJhc2Ugc3RheXMgZGV0YWNoZWQuXG4gICAgdGhpcy5leGVjdXRpb25IaXN0b3J5ID0gbmV3IEV2ZW50TG9nKHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0ID0gdGhpcy5uZXdSb290KHJvb3ROYW1lLCByb290SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBmb3IgdGhpcyBydW50aW1lIOKAlCBgZ2xvYmFsU3RvcmVgLCBgZXhlY3V0aW9uSGlzdG9yeWAsXG4gICAqIHRoZSBydW4ncyBwb2xpY3kgYW5kICh3aGVuIGtlcHQpIHRoZSBtaXJyb3IuIEFsc28gaG93IGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHJlcGxhY2VzIGEgc3ViZmxvdydzIHNlZWQgZnJhbWUgd2l0aCB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24uXG4gICAqL1xuICBuZXdSb290KG5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgY29uc3Qgcm9vdCA9IG5ldyBTdGFnZUNvbnRleHQoJycsIG5hbWUsIGlkLCB0aGlzLmdsb2JhbFN0b3JlLCAnJywgdGhpcy5leGVjdXRpb25IaXN0b3J5KTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kocm9vdCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IG9uIHRoZSBDVVJSRU5UIHJvb3QgZnJhbWUg4oCUIGEgc2FtZS1leGVjdXRvclxuICAgKiByZXN1bWUsIHdob3NlIGNvbnRpbnVhdGlvbiByb290IChgbGVhZi5jcmVhdGVOZXh0YCkgaXMgYWR2YW5jZWQgYmVmb3JlXG4gICAqIHRoZSBleGVjdXRvciBidWlsZHMgdGhpcyBsZWcncyBwb2xpY3kgKGEgZnJlc2ggcnVsZSBwZXIgbGVnKS4gRXZlcnlcbiAgICogZGVzY2VuZGFudCB0YWtlcyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlcmUuXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLmluc3RhbGxQb2xpY3kodGhpcy5yb290U3RhZ2VDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IG9uIGByb290YCwgYW5kIHRoZSBtaXJyb3Igc3RvcmUgd2hlbiB0aGUgcG9saWN5IGtlZXBzIG9uZS5cbiAgICogVGhlIG1pcnJvciBpcyBhIFNFUlZFRCBzdXJmYWNlLCBzbyBpdHMgc2VlZCBtdXN0IGFscmVhZHkgYmUgdGhlIHBvbGljeSdzXG4gICAqIHZpZXcgb2YgdGhlIHN0YXJ0aW5nIHN0YXRlOiBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IGBpbml0aWFsQ29udGV4dGBcbiAgICogLyBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIChvciwgb24gYSBjcm9zcy1leGVjdXRvciByZXN1bWUsIGJ5IHRoZVxuICAgKiBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCkgYW5kIGlzIG5ldmVyIHJlLXdyaXR0ZW4gd291bGQgb3RoZXJ3aXNlIHNpdFxuICAgKiBpbiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGluIHBsYWludGV4dCDigJQgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgTE9HJ3MgcGxhY2Vob2xkZXIsIHRoZSBzYW1lIHN0cmluZyB0aGUgcmVkYWN0ZWQgcGF0Y2hlcyBjYXJyeS5cbiAgICogQ3JlYXRlZCBvbmNlIHBlciBydW50aW1lIChhIHN1YmZsb3cncyBydW50aW1lIGtlZXBzIGl0cyBvd247IGl0cyBzZWVkIGlzXG4gICAqIGVtcHR5IOKAlCB0aGUgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQb2xpY3kocm9vdDogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgcm9vdC51c2VQb2xpY3kodGhpcy5wb2xpY3kpO1xuICAgIGlmICghdGhpcy5wb2xpY3kubWlycm9yKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnJlZGFjdGVkU3RvcmUpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgICB0aGlzLnJlZGFjdGVkU3RvcmUgPSBuZXcgU2hhcmVkTWVtb3J5KFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9kZWZhdWx0VmFsdWVzLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5fZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5faW5pdGlhbFN0YXRlLCBMT0dfUExBQ0VIT0xERVIpIDogdGhpcy5faW5pdGlhbFN0YXRlLFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC51c2VSZWRhY3RlZE1pcnJvcih0aGlzLnJlZGFjdGVkU3RvcmUpO1xuICB9XG5cbiAgLyoqIFByZXNlcnZlIHRoZSBjdXJyZW50IHJvb3RTdGFnZUNvbnRleHQgZm9yIHNuYXBzaG90cyBiZWZvcmUgY2hhbmdpbmcgaXQgZm9yIHJlc3VtZS4gKi9cbiAgcHJlc2VydmVTbmFwc2hvdFJvb3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zbmFwc2hvdFJvb3QpIHtcbiAgICAgIHRoaXMuX3NuYXBzaG90Um9vdCA9IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyb3plbiwgZGV0YWNoZWQgZm9sZCBiYXNlIHNlcnZlZCBhcyB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uXG4gICAqIENvbXB1dGVkIG9uY2UgKHRoZSBiYXNlIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY29uc3RydWN0aW9uKSBhbmQgc2hhcmVkIOKAlFxuICAgKiBzYWZlIGJlY2F1c2UgaXQgaXMgZGVlcGx5IGZyb3plbiwgc28gbm8gaG9sZGVyIGNhbiBtdXRhdGUgaXQgb3IgcmVhY2ggdGhlXG4gICAqIGVuZ2luZSB0aHJvdWdoIGl0OyBhIGJhc2UgaG9sZGluZyBhIERhdGUsIE1hcCwgYnVmZmVyIOKApiAod2hhdCBmcmVlemluZ1xuICAgKiBjYW5ub3Qgc2VhbCkgaXMgc2VydmVkIGJ5IHRoZSBwdWJsaWMgc25hcHNob3QgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzXG4gICAqIChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCwgYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCxcbiAgICogOS40NC4yKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGZyZWV6ZVJlY29yZChiYXNlICYmIHR5cGVvZiBiYXNlID09PSAnb2JqZWN0JyA/IGJhc2UgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb2xkQmFzZTtcbiAgfVxuXG4gIGdldFBpcGVsaW5lcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHN0YXRlLnBpcGVsaW5lcyA/IE9iamVjdC5rZXlzKHN0YXRlLnBpcGVsaW5lcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCByZXR1cm5zIGBzaGFyZWRTdGF0ZWAgZnJvbSB0aGVcbiAgICogICBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIG9uZSB3YXMgZW5hYmxlZCkuIFRoaXMgaXMgdGhlIHNhZmUgdmlld1xuICAgKiAgIGZvciBzaGFyaW5nIHRyYWNlcyBleHRlcm5hbGx5IOKAlCBwYXN0ZSBpbnRvIGEgdmlld2VyLCBzaGlwIHRvIHN1cHBvcnQsXG4gICAqICAgZXRjLiBXaGVuIHRoZSBtaXJyb3Igd2FzIG5ldmVyIGVuYWJsZWQsIGZhbGxzIGJhY2sgdG8gcmF3IGBnbG9iYWxTdG9yZWBcbiAgICogICBhbmQgYSBkZXYtbW9kZSB3YXJuaW5nIGlzIGVtaXR0ZWQgKHNpbGVudCBpbiBwcm9kdWN0aW9uKS5cbiAgICpcbiAgICogICBEZWZhdWx0IGBmYWxzZWAgcHJlc2VydmVzIHRoZSBydW50aW1lIHZpZXcg4oCUIG5lY2Vzc2FyeSBmb3IgcGF1c2UgL1xuICAgKiAgIHJlc3VtZSAocmVzdW1wdGlvbiBtdXN0IHJlcGxheSBhZ2FpbnN0IHRoZSByZWFsIHZhbHVlcywgbm90XG4gICAqICAgJ1tSRURBQ1RFRF0nKS5cbiAgICpcbiAgICogT3RoZXIgZmllbGRzIChgZXhlY3V0aW9uVHJlZWAsIGBjb21taXRMb2dgKSBhcmUgdGhlIHNhbWUgZWl0aGVyIHdheSDigJRcbiAgICogdGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lLCBhbmQgdGhlIGV4ZWN1dGlvblxuICAgKiB0cmVlIG9ubHkgY2FycmllcyBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiBgaW5pdGlhbFN0YXRlYCAodGhlIGZvbGQgYmFzZSkgaXMgT01JVFRFRCB1bmRlciBgcmVkYWN0OiB0cnVlYC4gSXQgaXMgdGhlXG4gICAqIHJ1bidzIHJhdyBwcmUtcnVuIHNlZWQg4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGhcbiAgICogYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCDigJQgYW5kIGl0IG5ldmVyIHBhc3NlZCB0aHJvdWdoIGEgcmVkYWN0aW9uXG4gICAqIHBvbGljeTogdGhlIHBvbGljeSBzY3J1YnMgV1JJVEVTIGF0IHRoZSBzY29wZSBmYWNhZGUsIGFuZCB0aGUgYmFzZSB3YXNcbiAgICogbmV2ZXIgd3JpdHRlbiBieSBhIHN0YWdlLiBTZXJ2aW5nIGl0IG9uIHRoZSByZWRhY3RlZCBzdXJmYWNlIHdvdWxkIGhhbmRcbiAgICogYmFjayB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSBzZWVkZWQgc2VjcmV0IHRoYXQgYSBsYXRlciBjb21taXQgaGFkXG4gICAqIHNjcnViYmVkLiBBIGNvbnN1bWVyIGZvbGRpbmcgd2l0aG91dCBpdCBnZXRzIGBiYXNpczogJ2xvZy1vbmx5J2AgZnJvbVxuICAgKiBgc3RhdGVBdGAsIHdoaWNoIGlzIHRoZSBob25lc3Qgc2lnbmFsIHRoYXQgdGhlIGJhc2UgZGlkIG5vdCB0cmF2ZWwgd2l0aFxuICAgKiB0aGlzIGxvZyDigJQgYSBwYXJ0aWFsIGFuc3dlciB0aGF0IHNheXMgaXQgaXMgcGFydGlhbCwgbmV2ZXIgYSBzaWxlbnQgb25lLlxuICAgKlxuICAgKiBSZXR1cm5zIGBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJz5gOiB0aGUgcnVudGltZSBpcyB0aGUgbWVtb3J5XG4gICAqIGNvbnRhaW5lciBhbmQgZG9lc24ndCBrbm93IHdoaWNoIHJ1biBpdCBzZXJ2ZXMg4oCUIGBydW5JZGAgaXMgcGVyLXJ1blxuICAgKiBleGVjdXRvciBzdGF0ZSwgc3RhbXBlZCBieSBgRmxvd2NoYXJ0VHJhdmVyc2VyLmdldFNuYXBzaG90KClgICh3aGljaFxuICAgKiBvd25zIHRoZSBydW4ncyBpZCBhbmQgYWxyZWFkeSBzdGFtcHMgaXQgb24gZXZlcnkgZXZlbnQpLiBTdWJmbG93cydcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGRlbGliZXJhdGVseSBoYXZlIE5PIHJ1bklkIG9mIHRoZWlyIG93biAoYSBzdWJmbG93IGlzXG4gICAqIHBhcnQgb2YgdGhlIHBhcmVudCdzIGxvZ2ljYWwgcnVuKS5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPiB7XG4gICAgY29uc3Qgc25hcHNob3RSb290ID0gdGhpcy5fc25hcHNob3RSb290ID8/IHRoaXMucm9vdFN0YWdlQ29udGV4dDtcbiAgICBjb25zdCB1c2VSZWRhY3RlZCA9IG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSAmJiB0aGlzLnJlZGFjdGVkU3RvcmUgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2hhcmVkU3RhdGU6IHVzZVJlZGFjdGVkID8gdGhpcy5yZWRhY3RlZFN0b3JlIS5nZXRTdGF0ZSgpIDogdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3RSb290LmdldFNuYXBzaG90KCksXG4gICAgICAvLyBSRURBQ1RJT046IHRoZSBmb2xkIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuIHNlZWQgYW5kIG5vIHBvbGljeSBldmVyXG4gICAgICAvLyB0b3VjaGVkIGl0IChwb2xpY2llcyBzY3J1YiB3cml0ZXM7IG5vdGhpbmcgd3JvdGUgdGhlIGJhc2UpLiBPbWl0IGl0XG4gICAgICAvLyByYXRoZXIgdGhhbiBsZWFrIGl0IOKAlCBgc3RhdGVBdGAgZGVncmFkZXMgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC5cbiAgICAgIC4uLih1c2VSZWRhY3RlZCA/IHt9IDogeyBpbml0aWFsU3RhdGU6IHRoaXMuZ2V0Rm9sZEJhc2UoKSB9KSxcbiAgICAgIC8vIERFVEFDSEVEOiB0aGUgZW5naW5lIGtlZXBzIGl0cyBsaXZlIEV2ZW50TG9nOyB0aGUgc25hcHNob3QgZ2V0cyBhXG4gICAgICAvLyBmcm96ZW4gYXJyYXkgb2YgaXRzIG93biAoYHJlY29yZGVkKClgIGJ1aWxkcyBhIG5ldyBvbmUpLiBTZXJ2aW5nIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgYXJyYXkgYWxpYXNlZCBpdCwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZ1xuICAgICAgLy8gdW5kZXIgaXRzIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LlxuICAgICAgLy8gVGhlIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYFxuICAgICAgLy8gKEYzKS4gVGhlIHB1YmxpYyBzbmFwc2hvdCBzZXJ2ZXMgdGhlbSAoYHJ1bm5lci9zbmFwc2hvdC50cyDCt1xuICAgICAgLy8gc2VydmVkU25hcHNob3RgLCA5LjQ0LjIpOyB0aGlzIG9uZSBpcyBhbHNvIHRoZSBlbmdpbmUncyBvd24g4oCUIGFcbiAgICAgIC8vIHN1YmZsb3cgbW91bnQgdGFrZXMgaXQgb25jZSBwZXIgbW91bnQg4oCUIHNvIHRoZSBydW4gcGF0aCBzZXJ2ZXMgbm90aGluZy5cbiAgICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZSh0aGlzLmV4ZWN1dGlvbkhpc3RvcnkucmVjb3JkZWQoKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgICAuLi4odGhpcy5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dBZGRyZXNzOiB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyB9KSxcbiAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlOiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -8,7 +8,7 @@
8
8
  * row's `readKeys`, `redactedPaths`, `tags`, `untrackedSources` — so a holder of a snapshot can no
9
9
  * longer rewrite the history every later answer is folded from: an assignment into a bundle throws
10
10
  * a `TypeError` in strict code. Safe because nothing outside the log holds a bundle's containers:
11
- * the log's payload is the commit's own copy (`StageContext · commit` hands it the output of
11
+ * the log's payload is the commit's own copy (`recordCommit` hands it the output of
12
12
  * `scrubPatch`), and live state, the redacted mirror and write retention each take their own copy
13
13
  * (`verbs.ts · foldRows` detaches, `StageContext · retainedForm` clones) — pinned by
14
14
  * test/lib/memory/property/record-reachability.property.test.ts.
@@ -2,8 +2,11 @@
2
2
  * SharedMemory — The shared state container for all flowchart execution
3
3
  *
4
4
  * Like a runtime heap with namespace isolation:
5
- * - Each run gets its own namespace (runs/{id}/)
6
- * - Default values can be initialised and preserved
5
+ * - A value is written at an ADDRESS — a path prefix the caller computed
6
+ * (C2: the engine's frame decides it, `StageContext · address`) — and read
7
+ * there first, then at the root
8
+ * - Default values seed the root, and the container at an address when a
9
+ * write creates it
7
10
  * - Accepts commit bundles from TransactionBuffer
8
11
  *
9
12
  * COPY-ON-WRITE (9.29.0 — docs/design/2026-10-copy-on-write-commit.md):
@@ -22,12 +25,10 @@ export declare class SharedMemory {
22
25
  constructor(defaultValues?: unknown, initialContext?: unknown);
23
26
  /** Gets a clone of the default values. */
24
27
  getDefaultValues(): {} | undefined;
25
- /** Gets all run namespaces. */
26
- getRuns(): any;
27
- /** Updates a value using merge semantics, as a new generation (path copy + swap). */
28
- updateValue(runId: string, path: string[], key: string, value: unknown): void;
29
- /** Sets a value using overwrite semantics, as a new generation (path copy + swap). */
30
- setValue(runId: string, path: string[], key: string, value: unknown): void;
28
+ /** Updates a value at `address` + `path` using merge semantics, as a new generation (path copy + swap). */
29
+ updateValue(address: readonly string[], path: string[], key: string, value: unknown): void;
30
+ /** Sets a value at `address` + `path` using overwrite semantics, as a new generation (path copy + swap). */
31
+ setValue(address: readonly string[], path: string[], key: string, value: unknown): void;
31
32
  /**
32
33
  * A copy of the current generation's root whose containers on the way to
33
34
  * `key` are owned — the in-place helpers above then edit only copies.
@@ -35,9 +36,9 @@ export declare class SharedMemory {
35
36
  private ownedPathTo;
36
37
  /**
37
38
  * Reads a value from the store.
38
- * Looks up in run namespace first, falls back to global.
39
+ * Looks up at `address` first, falls back to the root.
39
40
  */
40
- getValue(runId?: string, path?: string[], key?: string): any;
41
+ getValue(address?: readonly string[], path?: string[], key?: string): any;
41
42
  /** Gets the entire state as a JSON object — the current generation, by reference. Never mutate it. */
42
43
  getState(): Record<string, unknown>;
43
44
  /** Applies a commit bundle from TransactionBuffer: builds the next generation and swaps it in. */
@@ -157,10 +157,10 @@ export declare class StageContext {
157
157
  /** Capture from this frame's OWN log. A manual/unaddressable frame stays unknown. */
158
158
  captureEmitPosition(): EmitSourcePosition | undefined;
159
159
  /**
160
- * Install a parallel redacted mirror. Subsequent `commit()` calls will
161
- * apply the already-computed redacted patches to this mirror in addition
162
- * to the raw `sharedMemory` + `eventLog`. Child / next contexts inherit
163
- * the mirror via `createNext` / `createChild`.
160
+ * Install a parallel redacted mirror. Subsequent `commit()` calls apply
161
+ * the already-computed redacted patches — the ones the log records — to
162
+ * this mirror, beside the raw patches on `sharedMemory` (`recordCommit`).
163
+ * Child / next contexts inherit the mirror via `createNext` / `createChild`.
164
164
  *
165
165
  * Called on a runtime's root frame by `ExecutionRuntime` when the run's policy keeps a mirror.
166
166
  */
@@ -311,7 +311,13 @@ export declare class StageContext {
311
311
  * stay anchored at first touch to match the eager engine — see
312
312
  * {@link firstTouchState}. */
313
313
  getTransactionBuffer(): TransactionBuffer;
314
- /** Builds an absolute path inside the shared memory (run namespace). */
314
+ /**
315
+ * Where this frame writes and reads: `['runs', <id>]`, or `[]` (the root) with
316
+ * no run id. Handed to the record layer as data (C2): the buffer's address,
317
+ * and where `SharedMemory · getValue` looks before the root.
318
+ */
319
+ private get address();
320
+ /** Builds an absolute path inside the shared memory: this frame's {@link address}, then the path. */
315
321
  private withNamespace;
316
322
  /** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
317
323
  private get namespaceId();
@@ -384,19 +390,6 @@ export declare class StageContext {
384
390
  * surfaced as `CommitBundle.untrackedSources` on this stage's commit.
385
391
  */
386
392
  markUntrackedSource(source: UntrackedSource): void;
387
- /**
388
- * RFC-003 D2: the `untrackedSources` bundle fragment for commit() — `{}`
389
- * when nothing was marked, so the spread keeps the field ABSENT (not
390
- * empty-array-valued) and untouched charts stay byte-identical.
391
- */
392
- private untrackedSourcesFragment;
393
- /**
394
- * The `tags` bundle fragment for commit() — `{}` when the stage declares
395
- * none, so an untagged chart's log is byte-identical to 9.20.0. Added after
396
- * the payload encoding, so it is independent of `commitValues`; names, so
397
- * redaction never sees it.
398
- */
399
- private tagsFragment;
400
393
  /** Register an observer that fires after commit() applies patches.
401
394
  * Used by ScopeFacade to dispatch ScopeRecorder.onCommit events. */
402
395
  setCommitObserver(observer: (mutations: Record<string, {
@@ -494,22 +487,6 @@ export declare class StageContext {
494
487
  * reads them post-run for the execution-tree snapshot.
495
488
  */
496
489
  commit(phase?: CommitPhase): void;
497
- /**
498
- * THE bundle of one commit (F10): the payload (an empty one on the lazy
499
- * path, the buffer's on the other), then the stage's names, then the
500
- * fragments — spread once, here, for both commit paths. Key order is the
501
- * record's bytes: payload keys, `stage`, `stageId`, `runtimeStageId`,
502
- * `untrackedSources?`, `tags?`, `phase?`.
503
- */
504
- private bundleFor;
505
- /**
506
- * The tail of both commit paths: notify the observer (ScopeFacade) with the
507
- * tracked mutations, THEN release the staging state (#13b — see `commit`),
508
- * so the observer sees the world as it was. D2's untracked-source markers
509
- * and the declared tags release with it: one stamp per execution, so the
510
- * engine's double-commit paths record them exactly once.
511
- */
512
- private finishCommit;
513
490
  /**
514
491
  * Throw away everything this stage has STAGED, without committing any of it.
515
492
  *
@@ -128,8 +128,9 @@ export declare class TransactionBuffer {
128
128
  */
129
129
  private detachedBase?;
130
130
  /**
131
- * Where the stage writes (9.30.0): `['runs', runId]` for a run-namespaced
132
- * stage, `[]` otherwise. Its containers are the stage's ADDRESS, not a value
131
+ * Where the stage writes (9.30.0): a path prefix its frame computed and
132
+ * hands over as data (C2 — for the engine, the frame's run namespace, or
133
+ * `[]` for the root). Its containers are the stage's ADDRESS, not a value
133
134
  * the stage reads (every read it makes is a key below it), so a shell a
134
135
  * write leaves there is no part of the read-back the record must hold.
135
136
  */
@@ -275,7 +276,7 @@ export declare class TransactionBuffer {
275
276
  * - a container still SHARED with committed state at the same position is
276
277
  * replaced by a private deep copy when it is the value read, or by a
277
278
  * shallow copy when it is a container on the way to it (so a read of
278
- * `runs/<id>/k` copies `k`, not every run's namespace);
279
+ * `k` under a fork child's address copies `k`, not every child's namespace);
279
280
  * - a container the stage STAGED (or anything else the buffer did not
280
281
  * take from committed state) is handed back by reference, as before;
281
282
  * - a container the buffer owns is walked on — and when it is the value
@@ -0,0 +1,43 @@
1
+ /**
2
+ * recordCommit — one stage's commit onto the record (C1, L3). The one owner of a bundle's bytes and
3
+ * of where a commit lands: live state, the redacted mirror, the log.
4
+ *
5
+ * THE LAW:
6
+ * 1. No payload (the stage staged no write) → an EMPTY bundle goes to the log, and nothing else
7
+ * moves: live state and the mirror keep their generation. Every executed stage is a cursor stop.
8
+ * 2. A payload → its names are read first, so a stamp that cannot be read fails the commit before
9
+ * anything moves; then its raw rows build live state's next generation, `scrubPatch` puts the
10
+ * placeholder at each redacted path that holds a value (in a spine copy, never in the raw
11
+ * patch), and the mirror and the log take the scrubbed rows — never the raw ones.
12
+ * 3. The bundle's KEY ORDER is the record's bytes: `overwrite`, `updates`, `redactedPaths`, `trace`,
13
+ * `stage`, `stageId`, `runtimeStageId`, then `untrackedSources`, `tags` and `phase`, each only
14
+ * when it has something to say (absent, never empty). `EventLog · record` appends `idx`. The
15
+ * names are names: no redaction reads them, and no encoding (`commitValues`) changes them.
16
+ *
17
+ * The frame (`StageContext`) decides WHAT is committed — the payload, the names, whether the bundle
18
+ * is a continuation — and keeps what is not the record: retention, diagnostics, the dev-mode
19
+ * warnings and the commit observer.
20
+ */
21
+ import type { EventLog } from './EventLog.js';
22
+ import type { SharedMemory } from './SharedMemory.js';
23
+ import type { TransactionBuffer } from './TransactionBuffer.js';
24
+ import type { CommitPhase, UntrackedSource } from './types.js';
25
+ /** One stage's net change, as `TransactionBuffer · commit` hands it over. */
26
+ export type CommitPayload = ReturnType<TransactionBuffer['commit']>;
27
+ /** What names a commit on the record, beside its payload (law 3). */
28
+ export interface CommitStamp {
29
+ stage: string;
30
+ stageId: string;
31
+ runtimeStageId: string;
32
+ untrackedSources?: ReadonlySet<UntrackedSource>;
33
+ tags?: readonly string[];
34
+ phase?: CommitPhase;
35
+ }
36
+ /** Where a commit lands: live state always; the mirror and the log when the run keeps them. */
37
+ export interface CommitTargets {
38
+ state: SharedMemory;
39
+ mirror?: SharedMemory;
40
+ log?: EventLog;
41
+ }
42
+ /** Record one commit (the module law). `payload` absent = the empty commit. */
43
+ export declare function recordCommit(payload: CommitPayload | undefined, stamp: CommitStamp, into: CommitTargets): void;
@@ -520,7 +520,7 @@ export declare class MapperTaint {
520
520
  }
521
521
  /**
522
522
  * The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
523
- * holds a defined value — the copy `StageContext · commit` records and feeds the redacted mirror.
523
+ * holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
524
524
  *
525
525
  * CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
526
526
  * own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
@@ -10,6 +10,8 @@
10
10
  * (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
11
11
  * `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
12
12
  * The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
13
+ * The writers take an ADDRESS, a path prefix their caller computed, and never
14
+ * name one (C2: the engine decides where a stage writes, `StageContext · address`).
13
15
  * Zero external dependencies.
14
16
  */
15
17
  export { deepEqual } from './equality.js';
@@ -20,24 +22,26 @@ type NestedObject = {
20
22
  [key: string]: any;
21
23
  };
22
24
  /**
23
- * Resolves run-namespaced and global paths.
24
- * Each flowchart execution (run) stores data under `runs/{id}/` to prevent collisions.
25
+ * The two places a value at `path` can sit: under `address` (`runPath`, absent
26
+ * for the root address `[]`) and at the root (`globalPath`). `address` is a
27
+ * path prefix the caller computed — for the engine, a frame's run namespace
28
+ * (`StageContext · address`, C2).
25
29
  */
26
- export declare function getRunAndGlobalPaths(runId?: string, path?: (string | number)[]): {
30
+ export declare function getRunAndGlobalPaths(address?: readonly string[], path?: (string | number)[]): {
27
31
  runPath: (string | number)[] | undefined;
28
32
  globalPath: (string | number)[];
29
33
  };
30
34
  /**
31
- * Sets a value at a nested path, creating intermediate objects as needed.
35
+ * Sets a value at a nested path under `address`, creating intermediate objects as needed.
32
36
  */
33
- export declare function setNestedValue<T>(obj: NestedObject, runId: string, _path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
37
+ export declare function setNestedValue<T>(obj: NestedObject, address: readonly string[], path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
34
38
  /**
35
- * Deep-merges a value into the object at the specified path.
39
+ * Deep-merges a value into the object at a nested path under `address`.
36
40
  * - Arrays: concatenate
37
41
  * - Objects: shallow merge at each level
38
42
  * - Primitives: replace
39
43
  */
40
- export declare function updateNestedValue<T>(obj: any, runId: string | undefined, _path: (string | number)[], field: string | number, value: T, defaultValues?: unknown): any;
44
+ export declare function updateNestedValue<T>(obj: any, address: readonly string[], path: (string | number)[], field: string | number, value: T, defaultValues?: unknown): any;
41
45
  /**
42
46
  * In-place value update with merge semantics.
43
47
  * - Arrays (non-empty): concatenate onto existing
@@ -128,8 +128,8 @@ export type RuntimeSnapshot = {
128
128
  export declare class ExecutionRuntime {
129
129
  globalStore: SharedMemory;
130
130
  /**
131
- * Parallel redacted mirror of `globalStore`. Populated during traversal via
132
- * `StageContext.commit()` using the already-computed redacted patches.
131
+ * Parallel redacted mirror of `globalStore`. Populated by every commit that
132
+ * staged a write (`memory/recordCommit.ts · recordCommit`), with the already-computed redacted patches.
133
133
  * Only exists when the run's policy keeps a mirror (`RunPolicy.mirror` —
134
134
  * `FlowChartExecutor` sets it when a `RedactionPolicy` is configured).
135
135
  * Otherwise undefined and zero cost.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "9.44.2",
3
+ "version": "9.45.0",
4
4
  "description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",