footprintjs 9.46.0 → 9.47.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 (82) hide show
  1. package/AGENTS.md +4 -3
  2. package/CLAUDE.md +8 -8
  3. package/README.md +1 -1
  4. package/dist/advanced.js +95 -90
  5. package/dist/esm/advanced.d.ts +16 -10
  6. package/dist/esm/advanced.js +14 -9
  7. package/dist/esm/index.d.ts +4 -2
  8. package/dist/esm/index.js +5 -3
  9. package/dist/esm/lib/decide/evaluator.js +2 -2
  10. package/dist/esm/lib/decide/evidence.js +2 -2
  11. package/dist/esm/lib/engine/handlers/servedPause.js +2 -2
  12. package/dist/esm/lib/memory/EventLog.d.ts +1 -1
  13. package/dist/esm/lib/memory/EventLog.js +2 -2
  14. package/dist/esm/lib/memory/RecordFrame.d.ts +41 -6
  15. package/dist/esm/lib/memory/RecordFrame.js +36 -5
  16. package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
  17. package/dist/esm/lib/memory/SharedMemory.js +2 -2
  18. package/dist/esm/lib/memory/StageContext.d.ts +21 -14
  19. package/dist/esm/lib/memory/StageContext.js +36 -74
  20. package/dist/esm/lib/memory/borrowedMutation.d.ts +1 -1
  21. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  22. package/dist/esm/lib/memory/honesty.d.ts +4 -3
  23. package/dist/esm/lib/memory/honesty.js +5 -4
  24. package/dist/esm/lib/memory/index.d.ts +4 -2
  25. package/dist/esm/lib/memory/index.js +6 -4
  26. package/dist/esm/lib/memory/placeholders.d.ts +23 -28
  27. package/dist/esm/lib/memory/placeholders.js +24 -29
  28. package/dist/esm/lib/memory/recordCommit.d.ts +5 -3
  29. package/dist/esm/lib/memory/recordCommit.js +7 -5
  30. package/dist/esm/lib/memory/redaction.d.ts +78 -40
  31. package/dist/esm/lib/memory/redaction.js +130 -64
  32. package/dist/esm/lib/memory/runAddress.d.ts +20 -0
  33. package/dist/esm/lib/memory/runAddress.js +25 -0
  34. package/dist/esm/lib/memory/scrub.d.ts +53 -0
  35. package/dist/esm/lib/memory/scrub.js +74 -0
  36. package/dist/esm/lib/memory/utils.d.ts +3 -3
  37. package/dist/esm/lib/memory/utils.js +4 -4
  38. package/dist/esm/lib/memory/verbs.d.ts +1 -1
  39. package/dist/esm/lib/memory/verbs.js +2 -2
  40. package/dist/esm/trace.d.ts +2 -0
  41. package/dist/esm/trace.js +3 -2
  42. package/dist/esm/write.d.ts +47 -0
  43. package/dist/esm/write.js +46 -0
  44. package/dist/index.js +5 -3
  45. package/dist/lib/decide/evaluator.js +3 -3
  46. package/dist/lib/decide/evidence.js +3 -3
  47. package/dist/lib/engine/handlers/servedPause.js +3 -3
  48. package/dist/lib/memory/EventLog.js +2 -2
  49. package/dist/lib/memory/RecordFrame.js +36 -5
  50. package/dist/lib/memory/SharedMemory.js +2 -2
  51. package/dist/lib/memory/StageContext.js +42 -80
  52. package/dist/lib/memory/borrowedMutation.js +2 -2
  53. package/dist/lib/memory/honesty.js +5 -4
  54. package/dist/lib/memory/index.js +6 -4
  55. package/dist/lib/memory/placeholders.js +25 -30
  56. package/dist/lib/memory/recordCommit.js +9 -7
  57. package/dist/lib/memory/redaction.js +144 -75
  58. package/dist/lib/memory/runAddress.js +29 -0
  59. package/dist/lib/memory/scrub.js +79 -0
  60. package/dist/lib/memory/utils.js +4 -4
  61. package/dist/lib/memory/verbs.js +2 -2
  62. package/dist/trace.js +6 -4
  63. package/dist/types/advanced.d.ts +16 -10
  64. package/dist/types/index.d.ts +4 -2
  65. package/dist/types/lib/memory/EventLog.d.ts +1 -1
  66. package/dist/types/lib/memory/RecordFrame.d.ts +41 -6
  67. package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
  68. package/dist/types/lib/memory/StageContext.d.ts +21 -14
  69. package/dist/types/lib/memory/borrowedMutation.d.ts +1 -1
  70. package/dist/types/lib/memory/honesty.d.ts +4 -3
  71. package/dist/types/lib/memory/index.d.ts +4 -2
  72. package/dist/types/lib/memory/placeholders.d.ts +23 -28
  73. package/dist/types/lib/memory/recordCommit.d.ts +5 -3
  74. package/dist/types/lib/memory/redaction.d.ts +78 -40
  75. package/dist/types/lib/memory/runAddress.d.ts +20 -0
  76. package/dist/types/lib/memory/scrub.d.ts +53 -0
  77. package/dist/types/lib/memory/utils.d.ts +3 -3
  78. package/dist/types/lib/memory/verbs.d.ts +1 -1
  79. package/dist/types/trace.d.ts +2 -0
  80. package/dist/types/write.d.ts +47 -0
  81. package/dist/write.js +52 -0
  82. package/package.json +15 -1
@@ -3,10 +3,11 @@
3
3
  *
4
4
  * What a stage's frame needs to READ and WRITE the record, and nothing about the stage inside a run:
5
5
  * where it writes (its address), what it read first (the first-touch base), what it staged (the lazy
6
- * transaction buffer), which keys it read (the readKeys list), and where a commit lands (live state,
7
- * the redacted mirror, the log — through `recordCommit`). The engine's frame (`StageContext`, L4)
8
- * composes one and keeps the rest: retention, diagnostics, the dev-mode warnings, the commit observer
9
- * and the redaction verdict.
6
+ * transaction buffer) and which of it the log must not show (the scrub of each write), which keys it
7
+ * read (the readKeys list), and where a commit lands (live state, the redacted mirror, the log —
8
+ * through `recordCommit`). The engine's frame (`StageContext`, L4) composes one and keeps the rest:
9
+ * retention, diagnostics, the dev-mode warnings, the commit observer and the redaction DECISION —
10
+ * which value is secret (`redaction.ts · decideWrite`); the frame writes the bytes it is handed (C4).
10
11
  *
11
12
  * THE LAW:
12
13
  * 1. ADDRESS. The frame reads and writes at its address, a path prefix the engine computed and hands
@@ -28,6 +29,12 @@
28
29
  * the names, and hands both to `recordCommit`. `release` drops the buffer and the base; a frame
29
30
  * touched again re-anchors on the state as it stands then. The readKeys list survives a release,
30
31
  * and goes with `discard` (a failed attempt never happened).
32
+ * 7. WRITE. `write(path, value, verb, scrub?)` is the one way to stage: `set`, `merge` or `delete`
33
+ * at an absolute path (the address already joined — `at`), with the bytes of a redaction
34
+ * verdict. `whole` → the log and the mirror carry `LOG_PLACEHOLDER` at the path; `fields` → at
35
+ * each field inside the value (a literal key and, when dotted, the nested path) — wherever it
36
+ * holds a value at commit (`scrub.ts`). No scrub → the value as it is. The frame never decides
37
+ * a scrub, and nothing outside it reaches its buffer.
31
38
  */
32
39
  import { nativeGet } from './pathOps.js';
33
40
  import { recordCommit } from './recordCommit.js';
@@ -151,6 +158,8 @@ export class RecordFrame {
151
158
  * The buffer's base is the FIRST-TOUCH view, NOT the live state at write time: under parallel forks
152
159
  * a sibling may have committed between this frame's first read and this write, and the net-change
153
160
  * diff base must stay anchored at first touch to match the eager engine — see {@link firstTouch}.
161
+ *
162
+ * Private since C4: every write goes through {@link write}, so the scrub travels with the op.
154
163
  */
155
164
  getTransactionBuffer() {
156
165
  if (!this.buffer) {
@@ -163,6 +172,28 @@ export class RecordFrame {
163
172
  }
164
173
  return this.buffer;
165
174
  }
175
+ /**
176
+ * Stage one write (law 7): `verb` at `path` — an absolute path, the address already joined
177
+ * ({@link at}) — and the bytes of its redaction verdict. The first write builds the buffer (law 4).
178
+ *
179
+ * The scrub registers paths, never values: `whole` marks the op's own path, `fields` each field
180
+ * inside the value (a literal key and, when dotted, the nested path); `recordCommit` puts the
181
+ * log's placeholder wherever one of them holds a value at commit, for the mirror and the log only
182
+ * (`scrub.ts`). Live state takes the value as it is. A path marked by a write that the net-change
183
+ * filter drops goes with it.
184
+ */
185
+ write(path, value, verb, scrub) {
186
+ const buffer = this.getTransactionBuffer();
187
+ const whole = scrub?.whole === true;
188
+ if (verb === 'merge')
189
+ buffer.merge(path, value, whole);
190
+ else if (verb === 'delete')
191
+ buffer.delete(path, whole);
192
+ else
193
+ buffer.set(path, value, whole);
194
+ if (scrub?.fields !== undefined)
195
+ buffer.markRedactedFields(path, scrub.fields);
196
+ }
166
197
  /** Has the frame staged a write since its last release — does its buffer exist? */
167
198
  get hasStaged() {
168
199
  return this.buffer !== undefined;
@@ -262,4 +293,4 @@ export class RecordFrame {
262
293
  this.readKeys = undefined;
263
294
  }
264
295
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBR0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQW9CLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBYTNELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLHFFQUFxRTtJQUM1RCxLQUFLLENBQWU7SUFDN0IsbUVBQW1FO0lBQzFELEdBQUcsQ0FBWTtJQUN4QixtR0FBbUc7SUFDM0YsT0FBTyxDQUFnQjtJQUMvQixnREFBZ0Q7SUFDeEMsUUFBUSxDQUFvQjtJQUNwQyxnRUFBZ0U7SUFDeEQsUUFBUSxDQUFrQjtJQUNsQzs7OztPQUlHO0lBQ0ssSUFBSSxDQUEyQjtJQUN2Qyx3RkFBd0Y7SUFDaEYsTUFBTSxDQUFxQjtJQUNuQzs7OztPQUlHO0lBQ0ssUUFBUSxDQUFlO0lBRS9CLFlBQVksS0FBbUIsRUFBRSxHQUFjLEVBQUUsVUFBNkIsRUFBRTtRQUM5RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxrR0FBa0c7SUFDbEcsV0FBVyxDQUFDLFFB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QUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVjb3JkRnJhbWUg4oCUIHRoZSByZWNvcmQgaGFsZiBvZiBvbmUgc3RhZ2UncyBmcmFtZSAoQzMsIEwzKS5cbiAqXG4gKiBXaGF0IGEgc3RhZ2UncyBmcmFtZSBuZWVkcyB0byBSRUFEIGFuZCBXUklURSB0aGUgcmVjb3JkLCBhbmQgbm90aGluZyBhYm91dCB0aGUgc3RhZ2UgaW5zaWRlIGEgcnVuOlxuICogd2hlcmUgaXQgd3JpdGVzIChpdHMgYWRkcmVzcyksIHdoYXQgaXQgcmVhZCBmaXJzdCAodGhlIGZpcnN0LXRvdWNoIGJhc2UpLCB3aGF0IGl0IHN0YWdlZCAodGhlIGxhenlcbiAqIHRyYW5zYWN0aW9uIGJ1ZmZlciksIHdoaWNoIGtleXMgaXQgcmVhZCAodGhlIHJlYWRLZXlzIGxpc3QpLCBhbmQgd2hlcmUgYSBjb21taXQgbGFuZHMgKGxpdmUgc3RhdGUsXG4gKiB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlCB0aHJvdWdoIGByZWNvcmRDb21taXRgKS4gVGhlIGVuZ2luZSdzIGZyYW1lIChgU3RhZ2VDb250ZXh0YCwgTDQpXG4gKiBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OiByZXRlbnRpb24sIGRpYWdub3N0aWNzLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIGFuZCB0aGUgcmVkYWN0aW9uIHZlcmRpY3QuXG4gKlxuICogVEhFIExBVzpcbiAqICAgMS4gQUREUkVTUy4gVGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgYXQgaXRzIGFkZHJlc3MsIGEgcGF0aCBwcmVmaXggdGhlIGVuZ2luZSBjb21wdXRlZCBhbmQgaGFuZHNcbiAqICAgICAgb3ZlciBhcyBkYXRhIChDMjogYFsncnVucycsIDxpZD5dYCBvciBgW11gLCB0aGUgcm9vdCkuIEl0IG1vdmVzIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZTpcbiAqICAgICAgdGhlIGJ1ZmZlciBrZWVwcyB0aGUgYWRkcmVzcyBpdCB3YXMgYnVpbHQgYXQgKHRoZSBlbmdpbmUgcmVmdXNlcyBhIGxhdGVyIG1vdmUpLlxuICogICAyLiBGSVJTVCBUT1VDSC4gVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIOKAlCBpdHMgZmlyc3QgcmVhZCBPUiBmaXJzdCB3cml0ZSDigJRcbiAqICAgICAgaXMgaGVsZCBieSByZWZlcmVuY2UsIG5ldmVyIGNsb25lZDogdGhlIHJlYWQgdmlldyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGFuZCB0aGUgYnVmZmVyJ3NcbiAqICAgICAgbmV0LWNoYW5nZSBkaWZmIGJhc2UgYWZ0ZXIgaXQuXG4gKiAgIDMuIFRXTyBUSUVSUy4gQSByZWFkIGlzIHNlcnZlZCBmcm9tIHRoZSBzdGFnZSdzIG93biB2aWV3ICh0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IG9uY2UgdGhlIHN0YWdlXG4gKiAgICAgIHdyb3RlLCBlbHNlIHRoZSBmaXJzdC10b3VjaCBiYXNlKTsgYSBrZXkgYWJzZW50IHRoZXJlIGlzIHNlcnZlZCBmcm9tIExJVkUgc3RhdGUgKGF0IHRoZVxuICogICAgICBhZGRyZXNzLCB0aGVuIHRoZSByb290KS4gQWZ0ZXIgdGhlIGZpcnN0IHdyaXRlIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgaXMgZmlyc3QgZ2l2ZW4gYSBwcml2YXRlXG4gKiAgICAgIGNvcHkgYXQgdGhhdCBwYXRoIChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgZGV0YWNoQmFzZWApLlxuICogICA0LiBMQVpZIEJVRkZFUi4gVGhlIGJ1ZmZlciBpcyBidWlsdCBhdCB0aGUgZmlyc3Qgd3JpdGUg4oCUIG9uIHRoZSBmaXJzdC10b3VjaCBiYXNlLCBhdCB0aGUgYWRkcmVzcyxcbiAqICAgICAgdW5kZXIgdGhlIGVuY29kaW5nLiBBIGZyYW1lIHRoYXQgbmV2ZXIgd3JpdGVzIGJ1aWxkcyBub25lLCBhbmQgaXRzIGNvbW1pdCBpcyB0aGUgZW1wdHkgYnVuZGxlLlxuICogICA1LiBSRUFEIEtFWVMuIFVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBldmVyeSBub3RlZCByZWFkIHB1dHMgaXRzIHVzZXItbGV2ZWwga2V5XG4gKiAgICAgIChkb3R0ZWQgZm9yIGEgbmVzdGVkIHBhdGgpIG9uIHRoZSBmcmFtZSdzIGxpc3QsIG9uY2UsIGluIG9yZGVyOyBlYWNoIHN0YWdlZCByb3cgY2FycmllcyBhIGNvcHlcbiAqICAgICAgb2YgdGhlIGxpc3QgYXMgaXQgc3RhbmRzIHdoZW4gdGhlIHJvdyBpcyBzdGFnZWQuXG4gKiAgIDYuIENPTU1JVCwgUkVMRUFTRSwgRElTQ0FSRC4gYGNvbW1pdGAgdGFrZXMgdGhlIGJ1ZmZlcidzIHBheWxvYWQgKG5vbmUgPSB0aGUgZW1wdHkgY29tbWl0KSwgdGhlblxuICogICAgICB0aGUgbmFtZXMsIGFuZCBoYW5kcyBib3RoIHRvIGByZWNvcmRDb21taXRgLiBgcmVsZWFzZWAgZHJvcHMgdGhlIGJ1ZmZlciBhbmQgdGhlIGJhc2U7IGEgZnJhbWVcbiAqICAgICAgdG91Y2hlZCBhZ2FpbiByZS1hbmNob3JzIG9uIHRoZSBzdGF0ZSBhcyBpdCBzdGFuZHMgdGhlbi4gVGhlIHJlYWRLZXlzIGxpc3Qgc3Vydml2ZXMgYSByZWxlYXNlLFxuICogICAgICBhbmQgZ29lcyB3aXRoIGBkaXNjYXJkYCAoYSBmYWlsZWQgYXR0ZW1wdCBuZXZlciBoYXBwZW5lZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTogVHJhbnNhY3Rpb25CdWZmZXIge1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlICgjUDEpOiBoYW5kIHRoZSBidWZmZXIgYSBsaXZlIHZpZXcgb2YgdGhpcyBmcmFtZSdzIHJlYWQgcHJlZml4IOKAlFxuICAgICAgLy8gZXZhbHVhdGVkIEFUIEVBQ0ggV1JJVEUsIHNvIGVhY2ggc3RhZ2VkIG9wIGNhcHR1cmVzIGV4YWN0bHkgdGhlIHJlYWRzIHRoYXQgcHJlY2VkZWQgaXQuXG4gICAgICBjb25zdCByZWFkS2V5c1Byb3ZpZGVyID1cbiAgICAgICAgdGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4JyA/ICgpID0+IFsuLi4odGhpcy5yZWFkS2V5cyA/PyBbXSldIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIGZyYW1lJ3MgYWRkcmVzcyAoOS4zMC4wOiB0aGUgYWRtaXR0ZWQgcmVjb3JkIHJlYWRzIHRoZSBjb250YWluZXJzIHRoZXJlIGFzIHdoZXJlIHRoZVxuICAgICAgLy8gc3RhZ2Ugd3JpdGVzLCBuZXZlciBhcyBhIHZhbHVlIGl0IHJlYWQpLlxuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIoXG4gICAgICAgIHRoaXMuZmlyc3RUb3VjaCgpLFxuICAgICAgICB0aGlzLmVuY29kaW5nPy5jb21taXRWYWx1ZXMsXG4gICAgICAgIHJlYWRLZXlzUHJvdmlkZXIsXG4gICAgICAgIHRoaXMuX2FkZHJlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKiogSGFzIHRoZSBmcmFtZSBzdGFnZWQgYSB3cml0ZSBzaW5jZSBpdHMgbGFzdCByZWxlYXNlIOKAlCBkb2VzIGl0cyBidWZmZXIgZXhpc3Q/ICovXG4gIGdldCBoYXNTdGFnZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyYW1lJ3MgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGUgKGxhdyAzKTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHMgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyXG4gICAqICAgICAgIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZSB6ZXJvLWNsb25lIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXRcbiAgICogICAgICAgdmlldywgc28gdGhlIHR3byB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzXG4gICAqICAgICAgIGFkZHJlc3PihpJyb290IGZhbGxiYWNrLiBUaGUgZWFnZXIgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3NpbmdcbiAgICogICAgICAga2V5czsgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS4gQWZ0ZXIgdGhlIGZyYW1lJ3MgZmlyc3Qgd3JpdGUgc3VjaCBhIHZhbHVlIGNhbiBiZSB0aGUgdmVyeVxuICAgKiAgICAgICBjb250YWluZXIgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBob2xkcyBhdCB0aGUgcGF0aCAodGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXQgaXQsIG9yXG4gICAqICAgICAgIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0KSwgc28gdGhlIGJhc2UgaXMgZGV0YWNoZWQgdGhlcmUgZmlyc3RcbiAgICogICAgICAgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBkZXRhY2hCYXNlYCk6IGFuIGluLXBsYWNlIGVkaXQgb2YgdGhlIHZhbHVlIChvdXQgb2YgY29udHJhY3QpIHdyaXR0ZW5cbiAgICogICAgICAgYmFjayBpcyByZWNvcmRlZCwgYXMgb24gOS4yOC4wLCB3aG9zZSBiYXNlIHdhcyBhIGNsb25lIHRha2VuIGF0IHRoZSBmaXJzdCB3cml0ZS5cbiAgICpcbiAgICogUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgZnJhbWUgdGhhdCBuZXZlciB3cml0ZXMgcGVyZm9ybXMgemVybyBjbG9uZXMgb2YgdGhlXG4gICAqIHNoYXJlZCBzdGF0ZS5cbiAgICovXG4gIHJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5hdChwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChhdCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIGF0KTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgY29uc3QgbGl2ZSA9IHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICAvLyBUaWVyIDIgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlOiBrZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGxpdmUgIT09IG51bGwgJiYgdHlwZW9mIGxpdmUgPT09ICdvYmplY3QnKSB0aGlzLmJ1ZmZlci5kZXRhY2hCYXNlKGF0KTtcbiAgICByZXR1cm4gbGl2ZTtcbiAgfVxuXG4gIC8qKiBQdXQgYSB0cmFja2VkIHJlYWQncyB1c2VyLWxldmVsIGtleSBvbiB0aGUgcmVhZEtleXMgbGlzdCAobGF3IDUpIOKAlCBhIG5vLW9wIHVubGVzcyB0aGUgZnJhbWUga2VlcHMgb25lLiAqL1xuICBub3RlUmVhZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4Jykge1xuICAgICAgKHRoaXMucmVhZEtleXMgPz89IG5ldyBTZXQoKSkuYWRkKHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgOiBhdCB0aGUgZnJhbWUncyBhZGRyZXNzLCBlbHNlIGF0IHRoZSByb290IOKAlCBuZXZlciB0aGUgc3RhZ2UncyBvd25cbiAgICogdmlldy4gVHlwZWQgYXMgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgdHlwZXMgaXQsIHdoaWNoIGBTdGFnZUNvbnRleHQgwrcgZ2V0Um9vdGAgaGFuZHMgb24uXG4gICAqL1xuICByZWFkTGl2ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKHRoaXMuX2FkZHJlc3MsIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgIGF0IHRoZSByb290IOKAlCB0eXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCAoYFN0YWdlQ29udGV4dCDCtyBnZXRHbG9iYWxgKS4gKi9cbiAgcmVhZEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKFtdLCBbXSwga2V5KTtcbiAgfVxuXG4gIC8qKiBEaWQgYSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgIOKAlCBvbiBpdCwgYWJvdmUgaXQgb3IgYmVsb3cgaXQ/IChBIHJlcG9ydCdzIHF1ZXN0aW9uOyBuZXZlciB0aGUgaG90IHBhdGguKSAqL1xuICB3YXNTdGFnZWQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYnVmZmVyLndhc1N0YWdlZChwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHdoYXQgdGhlIHN0YWdlIGhhcyBzZWVuIOKAlCBpdHMgd29ya2luZyBjb3B5IG9uY2UgaXQgd3JvdGUsIGVsc2UgaXRzXG4gICAqIGZpcnN0LXRvdWNoIGJhc2Ug4oCUIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5OiBmb3IgYSByZXBvcnQgdGhhdCBvbmx5IGNvbXBhcmVzLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIucGVlayhwYXRoKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKiogVGhlIHZhbHVlIGF0IGBwYXRoYCBpbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSDigJQgY29tbWl0dGVkIHN0YXRlIGFzIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIGl0LiAqL1xuICBiYXNlQXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IHRoZSBmcmFtZSBzdGFnZWQgKGxhdyA2KTogdGhlIGJ1ZmZlcidzIHBheWxvYWQgZmlyc3Qg4oCUIG5vbmUsIHRoZSBlbXB0eSBjb21taXQsIHdoZW5cbiAgICogaXQgc3RhZ2VkIG5vdGhpbmcgKCMxMzogemVybyBjbG9uZXMpIOKAlCB0aGVuIHRoZSBuYW1lcyAoYHN0YW1wT2YoKWApLCByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXNcbiAgICogYnVpbHQsIGFuZCBib3RoIHRvIGByZWNvcmRDb21taXRgLiBVc2VyIGNvZGUgY2FuIHJ1biB3aGlsZSB0aGUgcGF5bG9hZCBpcyBidWlsdCAoYSBnZXR0ZXIgb24gYVxuICAgKiBzdGFnZWQgdmFsdWUsIHdoaWNoIHRoZSBuZXQtY2hhbmdlIGNvbXBhcmUgYW5kIHRoZSBjbG9uZSBpbnZva2UpOyB3aGF0IGl0IGFkZHMgdG8gdGhlIG5hbWVzIOKAlFxuICAgKiBhbiB1bnRyYWNrZWQgcmVhZCwgc2F5IOKAlCBpcyBvbiB0aGUgYnVuZGxlLlxuICAgKi9cbiAgY29tbWl0KHN0YW1wT2Y6ICgpID0+IENvbW1pdFN0YW1wKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVmZmVyPy5jb21taXQoKTtcbiAgICByZWNvcmRDb21taXQocGF5bG9hZCwgc3RhbXBPZigpLCB7IHN0YXRlOiB0aGlzLnN0YXRlLCBtaXJyb3I6IHRoaXMuX21pcnJvciwgbG9nOiB0aGlzLmxvZyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGZyYW1lJ3MgaG9sZCBvbiBzdGF0ZSAoIzEzYiwgbGF3IDYpOiBkcm9wIHRoZSBidWZmZXIgKGl0cyB3b3JraW5nIGNvcHkgYW5kIHdoYXRldmVyIHByaXZhdGVcbiAgICogY29waWVzIGl0cyByZWFkcyB0b29rKSBhbmQgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKGEgcmVmZXJlbmNlIHRoYXQgcGlucyBvbmUgY29tbWl0dGVkLXN0YXRlXG4gICAqIEdFTkVSQVRJT04pLiBCb3RoIHJlLWNyZWF0ZSBsYXppbHk6IGEgbGF0ZXIgcmVhZCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGFcbiAgICogbGF0ZXIgd3JpdGUgYnVpbGRzIGEgZnJlc2ggYnVmZmVyIG9uIGl0IOKAlCBzbyBhIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCB0aGUgc3RhdGUgYWZ0ZXIgdGhlXG4gICAqIGZpcnN0LiBXaXRob3V0IHRoZSByZWxlYXNlLCB0aGUgZXhlY3V0aW9uIHRyZWUg4oCUIHdoaWNoIHJldGFpbnMgZXZlcnkgZnJhbWUgZm9yIHRoZSBsaWZldGltZSBvZlxuICAgKiB0aGUgcnVuIOKAlCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZCBzdGFnZSAobWVhc3VyZWQgTyhOwrIpIGJlZm9yZSBjb3B5LW9uLXdyaXRlO1xuICAgKiBhIDUwMC1pdGVyYXRpb24gYWdlbnQgT09NZWQgYSBkZWZhdWx0IE5vZGUgaGVhcCwgYmFja2xvZyAjMTgpLlxuICAgKi9cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJhc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoZSBmcmFtZSBzdGFnZWQgYW5kIHJlYWQgKGxhdyA2KTogdGhlIGJ1ZmZlciwgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBuZXh0XG4gICAqIGF0dGVtcHQgcmUtYW5jaG9ycyBvbiBjb21taXR0ZWQgc3RhdGUgYXMgaXQgc3RhbmRzIE5PVykgYW5kIHRoZSByZWFkS2V5cyBsaXN0IOKAlCBhIGRpc2NhcmRlZFxuICAgKiBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dCBhdHRlbXB0J3MgYFRyYWNlRW50cnkucmVhZEtleXNgLCBvciBhIGJhY2t3YXJkIHNsaWNlXG4gICAqIHdvdWxkIGZvbGxvdyBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkLiBOb3RoaW5nIGlzIHJlY29yZGVkLlxuICAgKi9cbiAgZGlzY2FyZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgICB0aGlzLnJlYWRLZXlzID0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUlILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQThCM0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIscUVBQXFFO0lBQzVELEtBQUssQ0FBZTtJQUM3QixtRUFBbUU7SUFDMUQsR0FBRyxDQUFZO0lBQ3hCLG1HQUFtRztJQUMzRixPQUFPLENBQWdCO0lBQy9CLGdEQUFnRDtJQUN4QyxRQUFRLENBQW9CO0lBQ3BDLGdFQUFnRTtJQUN4RCxRQUFRLENBQWtCO0lBQ2xDOzs7O09BSUc7SUFDSyxJQUFJLENBQTJCO0lBQ3ZDLHdGQUF3RjtJQUNoRixNQUFNLENBQXFCO0lBQ25DOzs7O09BSUc7SUFDSyxRQUFRLENBQWU7SUFFL0IsWUFBWSxLQUFtQixFQUFFLEdBQWMsRUFBRSxVQUE2QixFQUFFO1FBQzlFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxXQUFX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LENBQUM7SUFDbkYsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxNQUFNLENBQUMsSUFBeUI7UUFDOUIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsT0FBMEI7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIG9mIG9uZSBzdGFnZSdzIGZyYW1lIChDMywgTDMpLlxuICpcbiAqIFdoYXQgYSBzdGFnZSdzIGZyYW1lIG5lZWRzIHRvIFJFQUQgYW5kIFdSSVRFIHRoZSByZWNvcmQsIGFuZCBub3RoaW5nIGFib3V0IHRoZSBzdGFnZSBpbnNpZGUgYSBydW46XG4gKiB3aGVyZSBpdCB3cml0ZXMgKGl0cyBhZGRyZXNzKSwgd2hhdCBpdCByZWFkIGZpcnN0ICh0aGUgZmlyc3QtdG91Y2ggYmFzZSksIHdoYXQgaXQgc3RhZ2VkICh0aGUgbGF6eVxuICogdHJhbnNhY3Rpb24gYnVmZmVyKSBhbmQgd2hpY2ggb2YgaXQgdGhlIGxvZyBtdXN0IG5vdCBzaG93ICh0aGUgc2NydWIgb2YgZWFjaCB3cml0ZSksIHdoaWNoIGtleXMgaXRcbiAqIHJlYWQgKHRoZSByZWFkS2V5cyBsaXN0KSwgYW5kIHdoZXJlIGEgY29tbWl0IGxhbmRzIChsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlFxuICogdGhyb3VnaCBgcmVjb3JkQ29tbWl0YCkuIFRoZSBlbmdpbmUncyBmcmFtZSAoYFN0YWdlQ29udGV4dGAsIEw0KSBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OlxuICogcmV0ZW50aW9uLCBkaWFnbm9zdGljcywgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyIGFuZCB0aGUgcmVkYWN0aW9uIERFQ0lTSU9OIOKAlFxuICogd2hpY2ggdmFsdWUgaXMgc2VjcmV0IChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCk7IHRoZSBmcmFtZSB3cml0ZXMgdGhlIGJ5dGVzIGl0IGlzIGhhbmRlZCAoQzQpLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEFERFJFU1MuIFRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIGF0IGl0cyBhZGRyZXNzLCBhIHBhdGggcHJlZml4IHRoZSBlbmdpbmUgY29tcHV0ZWQgYW5kIGhhbmRzXG4gKiAgICAgIG92ZXIgYXMgZGF0YSAoQzI6IGBbJ3J1bnMnLCA8aWQ+XWAgb3IgYFtdYCwgdGhlIHJvb3QpLiBJdCBtb3ZlcyBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGU6XG4gKiAgICAgIHRoZSBidWZmZXIga2VlcHMgdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0ICh0aGUgZW5naW5lIHJlZnVzZXMgYSBsYXRlciBtb3ZlKS5cbiAqICAgMi4gRklSU1QgVE9VQ0guIFRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgZnJhbWUgZmlyc3QgdG91Y2hlZCDigJQgaXRzIGZpcnN0IHJlYWQgT1IgZmlyc3Qgd3JpdGUg4oCUXG4gKiAgICAgIGlzIGhlbGQgYnkgcmVmZXJlbmNlLCBuZXZlciBjbG9uZWQ6IHRoZSByZWFkIHZpZXcgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBhbmQgdGhlIGJ1ZmZlcidzXG4gKiAgICAgIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIGFmdGVyIGl0LlxuICogICAzLiBUV08gVElFUlMuIEEgcmVhZCBpcyBzZXJ2ZWQgZnJvbSB0aGUgc3RhZ2UncyBvd24gdmlldyAodGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBvbmNlIHRoZSBzdGFnZVxuICogICAgICB3cm90ZSwgZWxzZSB0aGUgZmlyc3QtdG91Y2ggYmFzZSk7IGEga2V5IGFic2VudCB0aGVyZSBpcyBzZXJ2ZWQgZnJvbSBMSVZFIHN0YXRlIChhdCB0aGVcbiAqICAgICAgYWRkcmVzcywgdGhlbiB0aGUgcm9vdCkuIEFmdGVyIHRoZSBmaXJzdCB3cml0ZSB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGlzIGZpcnN0IGdpdmVuIGEgcHJpdmF0ZVxuICogICAgICBjb3B5IGF0IHRoYXQgcGF0aCAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKS5cbiAqICAgNC4gTEFaWSBCVUZGRVIuIFRoZSBidWZmZXIgaXMgYnVpbHQgYXQgdGhlIGZpcnN0IHdyaXRlIOKAlCBvbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSwgYXQgdGhlIGFkZHJlc3MsXG4gKiAgICAgIHVuZGVyIHRoZSBlbmNvZGluZy4gQSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBidWlsZHMgbm9uZSwgYW5kIGl0cyBjb21taXQgaXMgdGhlIGVtcHR5IGJ1bmRsZS5cbiAqICAgNS4gUkVBRCBLRVlTLiBVbmRlciBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZXZlcnkgbm90ZWQgcmVhZCBwdXRzIGl0cyB1c2VyLWxldmVsIGtleVxuICogICAgICAoZG90dGVkIGZvciBhIG5lc3RlZCBwYXRoKSBvbiB0aGUgZnJhbWUncyBsaXN0LCBvbmNlLCBpbiBvcmRlcjsgZWFjaCBzdGFnZWQgcm93IGNhcnJpZXMgYSBjb3B5XG4gKiAgICAgIG9mIHRoZSBsaXN0IGFzIGl0IHN0YW5kcyB3aGVuIHRoZSByb3cgaXMgc3RhZ2VkLlxuICogICA2LiBDT01NSVQsIFJFTEVBU0UsIERJU0NBUkQuIGBjb21taXRgIHRha2VzIHRoZSBidWZmZXIncyBwYXlsb2FkIChub25lID0gdGhlIGVtcHR5IGNvbW1pdCksIHRoZW5cbiAqICAgICAgdGhlIG5hbWVzLCBhbmQgaGFuZHMgYm90aCB0byBgcmVjb3JkQ29tbWl0YC4gYHJlbGVhc2VgIGRyb3BzIHRoZSBidWZmZXIgYW5kIHRoZSBiYXNlOyBhIGZyYW1lXG4gKiAgICAgIHRvdWNoZWQgYWdhaW4gcmUtYW5jaG9ycyBvbiB0aGUgc3RhdGUgYXMgaXQgc3RhbmRzIHRoZW4uIFRoZSByZWFkS2V5cyBsaXN0IHN1cnZpdmVzIGEgcmVsZWFzZSxcbiAqICAgICAgYW5kIGdvZXMgd2l0aCBgZGlzY2FyZGAgKGEgZmFpbGVkIGF0dGVtcHQgbmV2ZXIgaGFwcGVuZWQpLlxuICogICA3LiBXUklURS4gYHdyaXRlKHBhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yj8pYCBpcyB0aGUgb25lIHdheSB0byBzdGFnZTogYHNldGAsIGBtZXJnZWAgb3IgYGRlbGV0ZWBcbiAqICAgICAgYXQgYW4gYWJzb2x1dGUgcGF0aCAodGhlIGFkZHJlc3MgYWxyZWFkeSBqb2luZWQg4oCUIGBhdGApLCB3aXRoIHRoZSBieXRlcyBvZiBhIHJlZGFjdGlvblxuICogICAgICB2ZXJkaWN0LiBgd2hvbGVgIOKGkiB0aGUgbG9nIGFuZCB0aGUgbWlycm9yIGNhcnJ5IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSBwYXRoOyBgZmllbGRzYCDihpIgYXRcbiAqICAgICAgZWFjaCBmaWVsZCBpbnNpZGUgdGhlIHZhbHVlIChhIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aCkg4oCUIHdoZXJldmVyIGl0XG4gKiAgICAgIGhvbGRzIGEgdmFsdWUgYXQgY29tbWl0IChgc2NydWIudHNgKS4gTm8gc2NydWIg4oaSIHRoZSB2YWx1ZSBhcyBpdCBpcy4gVGhlIGZyYW1lIG5ldmVyIGRlY2lkZXNcbiAqICAgICAgYSBzY3J1YiwgYW5kIG5vdGhpbmcgb3V0c2lkZSBpdCByZWFjaGVzIGl0cyBidWZmZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPcFZlcmIgfSBmcm9tICcuL2RlbHRhRW5jb2RpbmcuanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RhZ2UgY2FuIHN0YWdlIChsYXcgNykg4oCUIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBvcCB2ZXJicyAoYGRlbHRhRW5jb2RpbmcudHMgwrcgT3BWZXJiYCksIG9uZVxuICogdW5pb24uIGBhcHBlbmRgIGlzIG5vdCBvbmU6IGl0IGlzIGhvdyB0aGUgbG9nIGVuY29kZXMgYSBncm93biBhcnJheSAoYCdkZWx0YSdgKS5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVWZXJiID0gT3BWZXJiO1xuXG4vKipcbiAqIFRoZSBieXRlcyBvZiBhIHJlZGFjdGlvbiB2ZXJkaWN0IGZvciBvbmUgd3JpdGUgKGxhdyA3KTogd2hpY2ggb2YgaXQgdGhlIGNvbW1pdCBsb2cgYW5kIHRoZSByZWRhY3RlZFxuICogbWlycm9yIG11c3Qgbm90IHNob3cuIFRoZSBlbmdpbmUgZGVjaWRlcyBpdCAoYHJlZGFjdGlvbi50cyDCtyBkZWNpZGVXcml0ZWApOyB0aGUgZnJhbWUgb25seSB3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVTY3J1YiB7XG4gIC8qKiBUaGUgd2hvbGUgdmFsdWU6IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSB3cml0ZSdzIHBhdGguICovXG4gIHJlYWRvbmx5IHdob2xlPzogYm9vbGVhbjtcbiAgLyoqIERvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlLCByZWxhdGl2ZSB0byBpdDogYExPR19QTEFDRUhPTERFUmAgYXQgZWFjaCBvbmUgdGhhdCBob2xkcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBmaWVsZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKlxuICAgKiBQcml2YXRlIHNpbmNlIEM0OiBldmVyeSB3cml0ZSBnb2VzIHRocm91Z2gge0BsaW5rIHdyaXRlfSwgc28gdGhlIHNjcnViIHRyYXZlbHMgd2l0aCB0aGUgb3AuXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXMgZnJhbWUncyByZWFkIHByZWZpeCDigJRcbiAgICAgIC8vIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcCBjYXB0dXJlcyBleGFjdGx5IHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0LlxuICAgICAgY29uc3QgcmVhZEtleXNQcm92aWRlciA9XG4gICAgICAgIHRoaXMuZW5jb2Rpbmc/LndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMucmVhZEtleXMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBmcmFtZSdzIGFkZHJlc3MgKDkuMzAuMDogdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVycyB0aGVyZSBhcyB3aGVyZSB0aGVcbiAgICAgIC8vIHN0YWdlIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKFxuICAgICAgICB0aGlzLmZpcnN0VG91Y2goKSxcbiAgICAgICAgdGhpcy5lbmNvZGluZz8uY29tbWl0VmFsdWVzLFxuICAgICAgICByZWFkS2V5c1Byb3ZpZGVyLFxuICAgICAgICB0aGlzLl9hZGRyZXNzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWdlIG9uZSB3cml0ZSAobGF3IDcpOiBgdmVyYmAgYXQgYHBhdGhgIOKAlCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUgYWRkcmVzcyBhbHJlYWR5IGpvaW5lZFxuICAgKiAoe0BsaW5rIGF0fSkg4oCUIGFuZCB0aGUgYnl0ZXMgb2YgaXRzIHJlZGFjdGlvbiB2ZXJkaWN0LiBUaGUgZmlyc3Qgd3JpdGUgYnVpbGRzIHRoZSBidWZmZXIgKGxhdyA0KS5cbiAgICpcbiAgICogVGhlIHNjcnViIHJlZ2lzdGVycyBwYXRocywgbmV2ZXIgdmFsdWVzOiBgd2hvbGVgIG1hcmtzIHRoZSBvcCdzIG93biBwYXRoLCBgZmllbGRzYCBlYWNoIGZpZWxkXG4gICAqIGluc2lkZSB0aGUgdmFsdWUgKGEgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoKTsgYHJlY29yZENvbW1pdGAgcHV0cyB0aGVcbiAgICogbG9nJ3MgcGxhY2Vob2xkZXIgd2hlcmV2ZXIgb25lIG9mIHRoZW0gaG9sZHMgYSB2YWx1ZSBhdCBjb21taXQsIGZvciB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIG9ubHlcbiAgICogKGBzY3J1Yi50c2ApLiBMaXZlIHN0YXRlIHRha2VzIHRoZSB2YWx1ZSBhcyBpdCBpcy4gQSBwYXRoIG1hcmtlZCBieSBhIHdyaXRlIHRoYXQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZmlsdGVyIGRyb3BzIGdvZXMgd2l0aCBpdC5cbiAgICovXG4gIHdyaXRlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiB1bmtub3duLCB2ZXJiOiBXcml0ZVZlcmIsIHNjcnViPzogV3JpdGVTY3J1Yik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCB3aG9sZSA9IHNjcnViPy53aG9sZSA9PT0gdHJ1ZTtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgYnVmZmVyLm1lcmdlKHBhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUocGF0aCwgd2hvbGUpO1xuICAgIGVsc2UgYnVmZmVyLnNldChwYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGlmIChzY3J1Yj8uZmllbGRzICE9PSB1bmRlZmluZWQpIGJ1ZmZlci5tYXJrUmVkYWN0ZWRGaWVsZHMocGF0aCwgc2NydWIuZmllbGRzKTtcbiAgfVxuXG4gIC8qKiBIYXMgdGhlIGZyYW1lIHN0YWdlZCBhIHdyaXRlIHNpbmNlIGl0cyBsYXN0IHJlbGVhc2Ug4oCUIGRvZXMgaXRzIGJ1ZmZlciBleGlzdD8gKi9cbiAgZ2V0IGhhc1N0YWdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJhbWUncyByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZSAobGF3IDMpOlxuICAgKlxuICAgKiAgICAxLiBzdGFnZWQgd3JpdGVzICsgZmlyc3QtdG91Y2ggc25hcHNob3Qg4oCUIGBidWZmZXIuZ2V0YCBvdmVyIGl0cyB3b3JraW5nQ29weSB3aGVuIHRoZSBidWZmZXJcbiAgICogICAgICAgZXhpc3RzLCBlbHNlIGBuYXRpdmVHZXRgIG92ZXIgdGhlIHplcm8tY2xvbmUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIGJ1ZmZlcidzIGJhc2UgSVMgdGhhdFxuICAgKiAgICAgICB2aWV3LCBzbyB0aGUgdHdvIHRpZXJzIGFncmVlIG9uIGNvbnRlbnQpO1xuICAgKiAgICAyLiBMSVZFIHN0YXRlIHZpYSBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCBmb3Iga2V5cyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qg4oCUIGluY2x1ZGluZyBpdHNcbiAgICogICAgICAgYWRkcmVzc+KGknJvb3QgZmFsbGJhY2suIFRoZSBlYWdlciBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZ1xuICAgKiAgICAgICBrZXlzOyBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LiBBZnRlciB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSBzdWNoIGEgdmFsdWUgY2FuIGJlIHRoZSB2ZXJ5XG4gICAqICAgICAgIGNvbnRhaW5lciB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGhvbGRzIGF0IHRoZSBwYXRoICh0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldCBpdCwgb3JcbiAgICogICAgICAgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQpLCBzbyB0aGUgYmFzZSBpcyBkZXRhY2hlZCB0aGVyZSBmaXJzdFxuICAgKiAgICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKTogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGUgdmFsdWUgKG91dCBvZiBjb250cmFjdCkgd3JpdHRlblxuICAgKiAgICAgICBiYWNrIGlzIHJlY29yZGVkLCBhcyBvbiA5LjI4LjAsIHdob3NlIGJhc2Ugd2FzIGEgY2xvbmUgdGFrZW4gYXQgdGhlIGZpcnN0IHdyaXRlLlxuICAgKlxuICAgKiBSZWFkcyBuZXZlciBjb25zdHJ1Y3QgdGhlIGJ1ZmZlciAoIzEzKTogYSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGVcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKi9cbiAgcmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmF0KHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KGF0KSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgYXQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICBjb25zdCBsaXZlID0gdGhpcy5zdGF0ZS5nZXRWYWx1ZSh0aGlzLl9hZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIC8vIFRpZXIgMiBhZnRlciB0aGUgZmlyc3Qgd3JpdGU6IGtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCAoc2VlIGFib3ZlKS5cbiAgICBpZiAodGhpcy5idWZmZXIgJiYgbGl2ZSAhPT0gbnVsbCAmJiB0eXBlb2YgbGl2ZSA9PT0gJ29iamVjdCcpIHRoaXMuYnVmZmVyLmRldGFjaEJhc2UoYXQpO1xuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqIFB1dCBhIHRyYWNrZWQgcmVhZCdzIHVzZXItbGV2ZWwga2V5IG9uIHRoZSByZWFkS2V5cyBsaXN0IChsYXcgNSkg4oCUIGEgbm8tb3AgdW5sZXNzIHRoZSBmcmFtZSBrZWVwcyBvbmUuICovXG4gIG5vdGVSZWFkKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuY29kaW5nPy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5yZWFkS2V5cyA/Pz0gbmV3IFNldCgpKS5hZGQocGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWA6IGF0IHRoZSBmcmFtZSdzIGFkZHJlc3MsIGVsc2UgYXQgdGhlIHJvb3Qg4oCUIG5ldmVyIHRoZSBzdGFnZSdzIG93blxuICAgKiB2aWV3LiBUeXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCB0eXBlcyBpdCwgd2hpY2ggYFN0YWdlQ29udGV4dCDCtyBnZXRSb290YCBoYW5kcyBvbi5cbiAgICovXG4gIHJlYWRMaXZlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgW10sIGtleSk7XG4gIH1cblxuICAvKiogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWAgYXQgdGhlIHJvb3Qg4oCUIHR5cGVkIGFzIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIChgU3RhZ2VDb250ZXh0IMK3IGdldEdsb2JhbGApLiAqL1xuICByZWFkR2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUoW10sIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIERpZCBhIHN0YWdlZCBvcCB0b3VjaCBgcGF0aGAg4oCUIG9uIGl0LCBhYm92ZSBpdCBvciBiZWxvdyBpdD8gKEEgcmVwb3J0J3MgcXVlc3Rpb247IG5ldmVyIHRoZSBob3QgcGF0aC4pICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5idWZmZXIud2FzU3RhZ2VkKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gd2hhdCB0aGUgc3RhZ2UgaGFzIHNlZW4g4oCUIGl0cyB3b3JraW5nIGNvcHkgb25jZSBpdCB3cm90ZSwgZWxzZSBpdHNcbiAgICogZmlyc3QtdG91Y2ggYmFzZSDigJQgV0lUSE9VVCB0YWtpbmcgYSBwcml2YXRlIGNvcHk6IGZvciBhIHJlcG9ydCB0aGF0IG9ubHkgY29tcGFyZXMuXG4gICAqL1xuICBwZWVrKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5wZWVrKHBhdGgpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaCgpLCBwYXRoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHRoZSBmaXJzdC10b3VjaCBiYXNlIOKAlCBjb21taXR0ZWQgc3RhdGUgYXMgdGhlIGZyYW1lIGZpcnN0IHRvdWNoZWQgaXQuICovXG4gIGJhc2VBdChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHdoYXQgdGhlIGZyYW1lIHN0YWdlZCAobGF3IDYpOiB0aGUgYnVmZmVyJ3MgcGF5bG9hZCBmaXJzdCDigJQgbm9uZSwgdGhlIGVtcHR5IGNvbW1pdCwgd2hlblxuICAgKiBpdCBzdGFnZWQgbm90aGluZyAoIzEzOiB6ZXJvIGNsb25lcykg4oCUIHRoZW4gdGhlIG5hbWVzIChgc3RhbXBPZigpYCksIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpc1xuICAgKiBidWlsdCwgYW5kIGJvdGggdG8gYHJlY29yZENvbW1pdGAuIFVzZXIgY29kZSBjYW4gcnVuIHdoaWxlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0IChhIGdldHRlciBvbiBhXG4gICAqIHN0YWdlZCB2YWx1ZSwgd2hpY2ggdGhlIG5ldC1jaGFuZ2UgY29tcGFyZSBhbmQgdGhlIGNsb25lIGludm9rZSk7IHdoYXQgaXQgYWRkcyB0byB0aGUgbmFtZXMg4oCUXG4gICAqIGFuIHVudHJhY2tlZCByZWFkLCBzYXkg4oCUIGlzIG9uIHRoZSBidW5kbGUuXG4gICAqL1xuICBjb21taXQoc3RhbXBPZjogKCkgPT4gQ29tbWl0U3RhbXApOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5idWZmZXI/LmNvbW1pdCgpO1xuICAgIHJlY29yZENvbW1pdChwYXlsb2FkLCBzdGFtcE9mKCksIHsgc3RhdGU6IHRoaXMuc3RhdGUsIG1pcnJvcjogdGhpcy5fbWlycm9yLCBsb2c6IHRoaXMubG9nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgZnJhbWUncyBob2xkIG9uIHN0YXRlICgjMTNiLCBsYXcgNik6IGRyb3AgdGhlIGJ1ZmZlciAoaXRzIHdvcmtpbmcgY29weSBhbmQgd2hhdGV2ZXIgcHJpdmF0ZVxuICAgKiBjb3BpZXMgaXRzIHJlYWRzIHRvb2spIGFuZCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAoYSByZWZlcmVuY2UgdGhhdCBwaW5zIG9uZSBjb21taXR0ZWQtc3RhdGVcbiAgICogR0VORVJBVElPTikuIEJvdGggcmUtY3JlYXRlIGxhemlseTogYSBsYXRlciByZWFkIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlLCBhbmQgYVxuICAgKiBsYXRlciB3cml0ZSBidWlsZHMgYSBmcmVzaCBidWZmZXIgb24gaXQg4oCUIHNvIGEgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHRoZSBzdGF0ZSBhZnRlciB0aGVcbiAgICogZmlyc3QuIFdpdGhvdXQgdGhlIHJlbGVhc2UsIHRoZSBleGVjdXRpb24gdHJlZSDigJQgd2hpY2ggcmV0YWlucyBldmVyeSBmcmFtZSBmb3IgdGhlIGxpZmV0aW1lIG9mXG4gICAqIHRoZSBydW4g4oCUIHJldGFpbnMgb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkIHN0YWdlIChtZWFzdXJlZCBPKE7CsikgYmVmb3JlIGNvcHktb24td3JpdGU7XG4gICAqIGEgNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwLCBiYWNrbG9nICMxOCkuXG4gICAqL1xuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmFzZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhlIGZyYW1lIHN0YWdlZCBhbmQgcmVhZCAobGF3IDYpOiB0aGUgYnVmZmVyLCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIG5leHRcbiAgICogYXR0ZW1wdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XKSBhbmQgdGhlIHJlYWRLZXlzIGxpc3Qg4oCUIGEgZGlzY2FyZGVkXG4gICAqIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIHJlYWNoIHRoZSBuZXh0IGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2VcbiAgICogd291bGQgZm9sbG93IGFuIGVkZ2UgdGhhdCBubyBjb21taXR0ZWQgd3JpdGUgZXZlciBoYWQuIE5vdGhpbmcgaXMgcmVjb3JkZWQuXG4gICAqL1xuICBkaXNjYXJkKCk6IHZvaWQge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICAgIHRoaXMucmVhZEtleXMgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Like a runtime heap with namespace isolation:
5
5
  * - A value is written at an ADDRESS — a path prefix the caller computed
6
- * (C2: the engine's frame decides it, `StageContext.ts · runAddress`) — and read
6
+ * (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
7
7
  * there first, then at the root
8
8
  * - Default values seed the root, and the container at an address when a
9
9
  * write creates it
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Like a runtime heap with namespace isolation:
5
5
  * - A value is written at an ADDRESS — a path prefix the caller computed
6
- * (C2: the engine's frame decides it, `StageContext.ts · runAddress`) — and read
6
+ * (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
7
7
  * there first, then at the root
8
8
  * - Default values seed the root, and the container at an address when a
9
9
  * write creates it
@@ -79,4 +79,4 @@ export class SharedMemory {
79
79
  this.context = nextGeneration(this.context, updates, overwrite, trace);
80
80
  }
81
81
  }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJILE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUEyQixFQUFFLElBQWUsRUFBRSxHQUFZO1FBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLFVBQVUsQ0FBQyxTQUFzQixFQUFFLE9BQW9CLEVBQUUsS0FBbUI7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkTWVtb3J5IOKAlCBUaGUgc2hhcmVkIHN0YXRlIGNvbnRhaW5lciBmb3IgYWxsIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGEgcnVudGltZSBoZWFwIHdpdGggbmFtZXNwYWNlIGlzb2xhdGlvbjpcbiAqIC0gQSB2YWx1ZSBpcyB3cml0dGVuIGF0IGFuIEFERFJFU1Mg4oCUIGEgcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZFxuICogICAoQzI6IHRoZSBlbmdpbmUncyBmcmFtZSBkZWNpZGVzIGl0LCBgU3RhZ2VDb250ZXh0LnRzIMK3IHJ1bkFkZHJlc3NgKSDigJQgYW5kIHJlYWRcbiAqICAgdGhlcmUgZmlyc3QsIHRoZW4gYXQgdGhlIHJvb3RcbiAqIC0gRGVmYXVsdCB2YWx1ZXMgc2VlZCB0aGUgcm9vdCwgYW5kIHRoZSBjb250YWluZXIgYXQgYW4gYWRkcmVzcyB3aGVuIGFcbiAqICAgd3JpdGUgY3JlYXRlcyBpdFxuICogLSBBY2NlcHRzIGNvbW1pdCBidW5kbGVzIGZyb20gVHJhbnNhY3Rpb25CdWZmZXJcbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpOlxuICogYGNvbnRleHRgIGlzIGEgR0VORVJBVElPTiwgYW5kIGEgZ2VuZXJhdGlvbiBpcyBuZXZlciBlZGl0ZWQuIEV2ZXJ5IHdyaXRlIOKAlFxuICogYGFwcGx5UGF0Y2hgIChhIHN0YWdlIGNvbW1pdCksIGBzZXRWYWx1ZWAsIGB1cGRhdGVWYWx1ZWAg4oCUIGJ1aWxkcyB0aGUgbmV4dFxuICogZ2VuZXJhdGlvbiBieSBjb3B5aW5nIHRoZSByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiBlYWNoIHdyaXR0ZW4gcGF0aCxcbiAqIHNoYXJlcyBldmVyeSBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LCBhbmQgc3dhcHMuIFNvIGFcbiAqIGdlbmVyYXRpb24gYSBzdGFnZSBjYXB0dXJlZCAoaXRzIGZpcnN0LXRvdWNoIHZpZXcsIGl0cyB0cmFuc2FjdGlvblxuICogYnVmZmVyJ3MgZGlmZiBiYXNlKSBzdGF5cyBleGFjdGx5IHdoYXQgaXQgd2FzLCBhbmQgYSB3cml0ZSBjb3N0cyBPKHdoYXQgaXRcbiAqIHdyb3RlKSwgbm90IE8oc3RhdGUpLlxuICovXG5cbmltcG9ydCB7IG1lcmdlQ29udGV4dFdpbnMsIG93bmVkUm9vdE9mLCBvd25TcGluZSB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROZXN0ZWRWYWx1ZSwgZ2V0UnVuQW5kR2xvYmFsUGF0aHMsIG5leHRHZW5lcmF0aW9uLCBzZXROZXN0ZWRWYWx1ZSwgdXBkYXRlTmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNoYXJlZE1lbW9yeSB7XG4gIHByaXZhdGUgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzPzogdW5rbm93biwgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgY29uc3Qgc2VlZCA9IG1lcmdlQ29udGV4dFdpbnMoaW5pdGlhbENvbnRleHQgfHwge30sIGRlZmF1bHRWYWx1ZXMgfHwge30pO1xuICAgIC8vIERldGFjaGVkIE9OQ0UsIGhlcmU6IGBtZXJnZUNvbnRleHRXaW5zYCBjb3BpZXMgb25seSB0aGUgdG9wIGxldmVsLCBzb1xuICAgIC8vIHRoZSBzZWVkJ3MgbmVzdGVkIHZhbHVlcyBhcmUgdGhlIGNhbGxlcidzIG93biBvYmplY3RzLiBCZWZvcmUgOS4yOS4wXG4gICAgLy8gdGhlIGZpcnN0IGNvbW1pdCdzIHdob2xlLXN0YXRlIGNsb25lIGRldGFjaGVkIHRoZW0gKGFuZCB1bnRpbCB0aGVuIGFcbiAgICAvLyBjYWxsZXIgbXV0YXRpbmcgaXRzIGBpbml0aWFsQ29udGV4dGAgY2hhbmdlZCBsaXZlIHN0YXRlIHdpdGggbm8gcm93KTtcbiAgICAvLyBub3RoaW5nIHJlLWNsb25lcyB0aGUgc3RhdGUgYW55IG1vcmUsIHNvIHRoZSBzZWVkIGlzIGRldGFjaGVkIGF0XG4gICAgLy8gY29uc3RydWN0aW9uIOKAlCBvbmUgY2xvbmUgcGVyIHJ1bnRpbWUsIG5vdCBvbmUgcGVyIGNvbW1pdC5cbiAgICB0aGlzLmNvbnRleHQgPSBPYmplY3Qua2V5cyhzZWVkKS5sZW5ndGggPiAwID8gc3RydWN0dXJlZENsb25lKHNlZWQpIDogc2VlZDtcbiAgfVxuXG4gIC8qKiBHZXRzIGEgY2xvbmUgb2YgdGhlIGRlZmF1bHQgdmFsdWVzLiAqL1xuICBnZXREZWZhdWx0VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzID8gc3RydWN0dXJlZENsb25lKHRoaXMuX2RlZmF1bHRWYWx1ZXMpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgbWVyZ2Ugc2VtYW50aWNzLCBhcyBhIG5ldyBnZW5lcmF0aW9uIChwYXRoIGNvcHkgKyBzd2FwKS4gKi9cbiAgdXBkYXRlVmFsdWUoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vd25lZFBhdGhUbyhhZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIHVwZGF0ZU5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqIFNldHMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgb3ZlcndyaXRlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHNldFZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICBzZXROZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvcHkgb2YgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbidzIHJvb3Qgd2hvc2UgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvXG4gICAqIGBrZXlgIGFyZSBvd25lZCDigJQgdGhlIGluLXBsYWNlIGhlbHBlcnMgYWJvdmUgdGhlbiBlZGl0IG9ubHkgY29waWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZFBhdGhUbyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3Qgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgY29uc3Qgcm9vdCA9IG93bmVkUm9vdE9mKHRoaXMuY29udGV4dCwgb3duZWQpO1xuICAgIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgb3duU3BpbmUocm9vdCwgWy4uLihydW5QYXRoIHx8IGdsb2JhbFBhdGgpLCBrZXldLCBvd25lZCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIHRoZSBzdG9yZS5cbiAgICogTG9va3MgdXAgYXQgYGFkZHJlc3NgIGZpcnN0LCBmYWxscyBiYWNrIHRvIHRoZSByb290LlxuICAgKi9cbiAgZ2V0VmFsdWUoYWRkcmVzcz86IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoPzogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgeyBnbG9iYWxQYXRoLCBydW5QYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzLCBwYXRoKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1blBhdGggPyBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIHJ1blBhdGgsIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IGdldE5lc3RlZFZhbHVlKHRoaXMuY29udGV4dCwgZ2xvYmFsUGF0aCwga2V5KTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBlbnRpcmUgc3RhdGUgYXMgYSBKU09OIG9iamVjdCDigJQgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgYnkgcmVmZXJlbmNlLiBOZXZlciBtdXRhdGUgaXQuICovXG4gIGdldFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgLyoqIEFwcGxpZXMgYSBjb21taXQgYnVuZGxlIGZyb20gVHJhbnNhY3Rpb25CdWZmZXI6IGJ1aWxkcyB0aGUgbmV4dCBnZW5lcmF0aW9uIGFuZCBzd2FwcyBpdCBpbi4gKi9cbiAgYXBwbHlQYXRjaChvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dCA9IG5leHRHZW5lcmF0aW9uKHRoaXMuY29udGV4dCwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSk7XG4gIH1cbn1cbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJILE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUEyQixFQUFFLElBQWUsRUFBRSxHQUFZO1FBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLFVBQVUsQ0FBQyxTQUFzQixFQUFFLE9BQW9CLEVBQUUsS0FBbUI7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkTWVtb3J5IOKAlCBUaGUgc2hhcmVkIHN0YXRlIGNvbnRhaW5lciBmb3IgYWxsIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGEgcnVudGltZSBoZWFwIHdpdGggbmFtZXNwYWNlIGlzb2xhdGlvbjpcbiAqIC0gQSB2YWx1ZSBpcyB3cml0dGVuIGF0IGFuIEFERFJFU1Mg4oCUIGEgcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZFxuICogICAoQzI6IHRoZSBlbmdpbmUncyBmcmFtZSBkZWNpZGVzIGl0LCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkg4oCUIGFuZCByZWFkXG4gKiAgIHRoZXJlIGZpcnN0LCB0aGVuIGF0IHRoZSByb290XG4gKiAtIERlZmF1bHQgdmFsdWVzIHNlZWQgdGhlIHJvb3QsIGFuZCB0aGUgY29udGFpbmVyIGF0IGFuIGFkZHJlc3Mgd2hlbiBhXG4gKiAgIHdyaXRlIGNyZWF0ZXMgaXRcbiAqIC0gQWNjZXB0cyBjb21taXQgYnVuZGxlcyBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKTpcbiAqIGBjb250ZXh0YCBpcyBhIEdFTkVSQVRJT04sIGFuZCBhIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBFdmVyeSB3cml0ZSDigJRcbiAqIGBhcHBseVBhdGNoYCAoYSBzdGFnZSBjb21taXQpLCBgc2V0VmFsdWVgLCBgdXBkYXRlVmFsdWVgIOKAlCBidWlsZHMgdGhlIG5leHRcbiAqIGdlbmVyYXRpb24gYnkgY29weWluZyB0aGUgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gZWFjaCB3cml0dGVuIHBhdGgsXG4gKiBzaGFyZXMgZXZlcnkgb3RoZXIgc3VidHJlZSB3aXRoIHRoZSBnZW5lcmF0aW9uIGJlZm9yZSBpdCwgYW5kIHN3YXBzLiBTbyBhXG4gKiBnZW5lcmF0aW9uIGEgc3RhZ2UgY2FwdHVyZWQgKGl0cyBmaXJzdC10b3VjaCB2aWV3LCBpdHMgdHJhbnNhY3Rpb25cbiAqIGJ1ZmZlcidzIGRpZmYgYmFzZSkgc3RheXMgZXhhY3RseSB3aGF0IGl0IHdhcywgYW5kIGEgd3JpdGUgY29zdHMgTyh3aGF0IGl0XG4gKiB3cm90ZSksIG5vdCBPKHN0YXRlKS5cbiAqL1xuXG5pbXBvcnQgeyBtZXJnZUNvbnRleHRXaW5zLCBvd25lZFJvb3RPZiwgb3duU3BpbmUgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmVzdGVkVmFsdWUsIGdldFJ1bkFuZEdsb2JhbFBhdGhzLCBuZXh0R2VuZXJhdGlvbiwgc2V0TmVzdGVkVmFsdWUsIHVwZGF0ZU5lc3RlZFZhbHVlIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGFyZWRNZW1vcnkge1xuICBwcml2YXRlIGNvbnRleHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlcz86IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IHVua25vd24sIGluaXRpYWxDb250ZXh0PzogdW5rbm93bikge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIGNvbnN0IHNlZWQgPSBtZXJnZUNvbnRleHRXaW5zKGluaXRpYWxDb250ZXh0IHx8IHt9LCBkZWZhdWx0VmFsdWVzIHx8IHt9KTtcbiAgICAvLyBEZXRhY2hlZCBPTkNFLCBoZXJlOiBgbWVyZ2VDb250ZXh0V2luc2AgY29waWVzIG9ubHkgdGhlIHRvcCBsZXZlbCwgc29cbiAgICAvLyB0aGUgc2VlZCdzIG5lc3RlZCB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0cy4gQmVmb3JlIDkuMjkuMFxuICAgIC8vIHRoZSBmaXJzdCBjb21taXQncyB3aG9sZS1zdGF0ZSBjbG9uZSBkZXRhY2hlZCB0aGVtIChhbmQgdW50aWwgdGhlbiBhXG4gICAgLy8gY2FsbGVyIG11dGF0aW5nIGl0cyBgaW5pdGlhbENvbnRleHRgIGNoYW5nZWQgbGl2ZSBzdGF0ZSB3aXRoIG5vIHJvdyk7XG4gICAgLy8gbm90aGluZyByZS1jbG9uZXMgdGhlIHN0YXRlIGFueSBtb3JlLCBzbyB0aGUgc2VlZCBpcyBkZXRhY2hlZCBhdFxuICAgIC8vIGNvbnN0cnVjdGlvbiDigJQgb25lIGNsb25lIHBlciBydW50aW1lLCBub3Qgb25lIHBlciBjb21taXQuXG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmtleXMoc2VlZCkubGVuZ3RoID4gMCA/IHN0cnVjdHVyZWRDbG9uZShzZWVkKSA6IHNlZWQ7XG4gIH1cblxuICAvKiogR2V0cyBhIGNsb25lIG9mIHRoZSBkZWZhdWx0IHZhbHVlcy4gKi9cbiAgZ2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlcyA/IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9kZWZhdWx0VmFsdWVzKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBVcGRhdGVzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG1lcmdlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHVwZGF0ZVZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICB1cGRhdGVOZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKiBTZXRzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG92ZXJ3cml0ZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICBzZXRWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgc2V0TmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjb3B5IG9mIHRoZSBjdXJyZW50IGdlbmVyYXRpb24ncyByb290IHdob3NlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0b1xuICAgKiBga2V5YCBhcmUgb3duZWQg4oCUIHRoZSBpbi1wbGFjZSBoZWxwZXJzIGFib3ZlIHRoZW4gZWRpdCBvbmx5IGNvcGllcy5cbiAgICovXG4gIHByaXZhdGUgb3duZWRQYXRoVG8oYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IHJvb3QgPSBvd25lZFJvb3RPZih0aGlzLmNvbnRleHQsIG93bmVkKTtcbiAgICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIG93blNwaW5lKHJvb3QsIFsuLi4ocnVuUGF0aCB8fCBnbG9iYWxQYXRoKSwga2V5XSwgb3duZWQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgdmFsdWUgZnJvbSB0aGUgc3RvcmUuXG4gICAqIExvb2tzIHVwIGF0IGBhZGRyZXNzYCBmaXJzdCwgZmFsbHMgYmFjayB0byB0aGUgcm9vdC5cbiAgICovXG4gIGdldFZhbHVlKGFkZHJlc3M/OiByZWFkb25seSBzdHJpbmdbXSwgcGF0aD86IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHsgZ2xvYmFsUGF0aCwgcnVuUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgY29uc3QgdmFsdWUgPSBydW5QYXRoID8gZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBydW5QYXRoLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIGdsb2JhbFBhdGgsIGtleSk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgZW50aXJlIHN0YXRlIGFzIGEgSlNPTiBvYmplY3Qg4oCUIHRoZSBjdXJyZW50IGdlbmVyYXRpb24sIGJ5IHJlZmVyZW5jZS4gTmV2ZXIgbXV0YXRlIGl0LiAqL1xuICBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyOiBidWlsZHMgdGhlIG5leHQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4uICovXG4gIGFwcGx5UGF0Y2gob3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0R2VuZXJhdGlvbih0aGlzLmNvbnRleHQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UpO1xuICB9XG59XG4iXX0=
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * Like a stack frame in a compiler/runtime:
5
5
  * - A RecordFrame — the record half (C3): the heap, the address, the
6
- * first-touch base, the lazy transaction buffer, the readKeys list
6
+ * first-touch base, the lazy transaction buffer and every write's scrub
7
+ * (C4), the readKeys list
7
8
  * - Links to parent/child/next contexts (call stack frames)
8
9
  * - What belongs to a stage inside a run: retention of reads and writes, the
9
- * redaction verdict per write, the dev-mode warnings, the commit observer
10
+ * redaction decision per write (`redaction.ts · decideWrite`) and where the
11
+ * frame writes (`runAddress.ts`), the dev-mode warnings, the commit observer
10
12
  * - DiagnosticCollector for logs, errors, metrics
11
13
  */
12
14
  import { type DiagnosticChannel, DiagnosticCollector } from './DiagnosticCollector.js';
@@ -206,10 +208,10 @@ export declare class StageContext {
206
208
  * and stores nothing under `'off'` (entry skipped entirely — nothing to
207
209
  * leak). A field-level verdict scrubs a clone BEFORE the dial sees it, so
208
210
  * a summary preview can never show the secret either. The verdict is the
209
- * one `stageWrite` asked the rule for BEFORE staging, carried to commit
210
- * with the value. The staged write itself is unaffected — redaction of
211
- * the committed payload is handled by the transaction buffer's
212
- * `redactedPaths`.
211
+ * one `stageWrite` decided BEFORE staging, carried to commit with the
212
+ * value. The staged write itself is unaffected — redaction of the
213
+ * committed payload is the record frame's scrub of that write
214
+ * (`RecordFrame · write`, then `scrub.ts` at commit).
213
215
  */
214
216
  private trackWrite;
215
217
  /**
@@ -243,14 +245,19 @@ export declare class StageContext {
243
245
  /**
244
246
  * THE ONE FUNNEL every staged write passes through — facade writes AND
245
247
  * the paths that bypass the facade (subflow seed, `outputMapper`
246
- * merge-back, resume re-seed). The ONE decision is made here: an explicit
247
- * per-call flag makes the value secret outright (and marks the key for the
248
- * rest of the run, the declare-once contract); otherwise the installed
249
- * rule decides from the user-level path. It stages the write, registers
250
- * the redacted paths the commit log and mirror will scrub (whole key, or
251
- * the fields inside the value), and keeps the run's marked-keys set in
252
- * step (a whole verdict marks its key; a delete clears the mark). Returns
253
- * the verdict so the caller retains and reports under the same decision.
248
+ * merge-back, resume re-seed). Two owners (C4): the run's rule DECIDES,
249
+ * the record frame WRITES the verdict's bytes, in four steps
250
+ * (`redaction.ts`, "The write decision"):
251
+ * 1. the verdict — `decideWrite`, under the rule active as the write begins;
252
+ * 2. identity inheritance — `inheritByIdentity`, against this frame's
253
+ * selected reads as they stand after step 1;
254
+ * 3. the bytes — `RecordFrame · write`, the op and its scrub (the whole
255
+ * value, or the fields inside it);
256
+ * 4. the marks — `markStagedWrite`, only once the write staged, so a
257
+ * write that fails to stage marks nothing.
258
+ * Each step reads the rule (and the selected reads) when it acts, as this
259
+ * funnel always did. Returns the verdict so the caller retains and reports
260
+ * under the same decision.
254
261
  */
255
262
  private stageWrite;
256
263
  /**