footprintjs 9.48.0 → 9.48.2

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.
@@ -2,30 +2,29 @@
2
2
  /**
3
3
  * pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
4
4
  *
5
- * Security contract: all functions guard against prototype-pollution and
6
- * prototype-chain-read attacks. The DENIED set blocks the three canonical
7
- * pollution vectors (__proto__, constructor, prototype) on every function.
5
+ * The DENIED set is the shared rule for three prototype-pollution selector
6
+ * segments (__proto__, constructor, prototype). Each operation's traversal
7
+ * contract is explicit below; merely using this module is not a sandbox.
8
8
  *
9
9
  * Intentional asymmetry:
10
- * - nativeSet — DENIED check only at each segment. No hasOwnProperty
11
- * check is needed because writing always creates an OWN property on `curr`,
12
- * which cannot pollute the prototype chain.
13
- * - nativeGet / nativeHas — DENIED check + hasOwnProperty at every step.
14
- * Reads follow the prototype chain by default (bracket notation), so the
15
- * hasOwnProperty guard is required to prevent leaking inherited values
16
- * (e.g. Object.prototype, Object constructor, toString).
10
+ * - nativeSet — DENIED check at each segment; used on writer-owned
11
+ * containers. It can follow an inherited object under an ordinary key.
12
+ * - nativeGet — DENIED check + hasOwnProperty at every step.
13
+ * - nativeHas — own-property existence only, including own denied names
14
+ * and own undefined values; it does not use the DENIED rule.
17
15
  * - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
18
16
  * by spec so prototype keys never appear in the iteration.
19
17
  *
20
- * Do NOT "fix" the nativeSet asymmetry by adding hasOwnProperty — it is
21
- * intentional and would break path creation for new intermediate nodes.
18
+ * Nested diagnostic writers have their own whole-selector preflight and
19
+ * own-property writes in utils.ts, using the same isDeniedSegment predicate.
22
20
  *
23
21
  * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
24
22
  */
25
23
  Object.defineProperty(exports, "__esModule", { value: true });
26
24
  exports.mergeContextWins = exports.nativeHas = exports.adopt = exports.own = exports.ownedRootOf = exports.ownSpine = exports.shallowCopy = exports.ownChild = exports.isContainer = exports.nativeDelete = exports.nativeSet = exports.nativeGet = exports.isDeniedSegment = void 0;
25
+ const ownData_js_1 = require("../capture/ownData.js");
27
26
  const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
28
- /** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
27
+ /** Is `segment` one of the three denied prototype-pollution selector names? */
29
28
  function isDeniedSegment(segment) {
30
29
  return DENIED.has(String(segment));
31
30
  }
@@ -163,7 +162,7 @@ function shallowCopy(container) {
163
162
  if (Array.isArray(container)) {
164
163
  const copy = container.slice();
165
164
  for (const key of namedArrayKeys(container))
166
- copy[key] = container[key];
165
+ (0, ownData_js_1.putOwn)(copy, key, container[key]);
167
166
  return copy;
168
167
  }
169
168
  const proto = Object.getPrototypeOf(container);
@@ -172,7 +171,7 @@ function shallowCopy(container) {
172
171
  const copy = structuredClone(container);
173
172
  for (const key of Object.keys(container)) {
174
173
  if (!Object.prototype.hasOwnProperty.call(copy, key))
175
- copy[key] = container[key];
174
+ (0, ownData_js_1.putOwn)(copy, key, container[key]);
176
175
  }
177
176
  return copy;
178
177
  }
@@ -304,4 +303,4 @@ function mergeContextWins(dst, src) {
304
303
  return out;
305
304
  }
306
305
  exports.mergeContextWins = mergeContextWins;
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHOzs7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsU0FBZ0IsZUFBZSxDQUFDLE9BQXdCO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRkQsMENBRUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFB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Q2pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCw2QkFBNkI7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBMUJELDRDQTBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcGF0aE9wcy50cyDigJQgTmF0aXZlIG5lc3RlZC1wYXRoIGhlbHBlcnMgKHJlcGxhY2VzIGxvZGFzaC5nZXQvc2V0L2hhcy9tZXJnZXdpdGgpXG4gKlxuICogU2VjdXJpdHkgY29udHJhY3Q6IGFsbCBmdW5jdGlvbnMgZ3VhcmQgYWdhaW5zdCBwcm90b3R5cGUtcG9sbHV0aW9uIGFuZFxuICogcHJvdG90eXBlLWNoYWluLXJlYWQgYXR0YWNrcy4gVGhlIERFTklFRCBzZXQgYmxvY2tzIHRoZSB0aHJlZSBjYW5vbmljYWxcbiAqIHBvbGx1dGlvbiB2ZWN0b3JzIChfX3Byb3RvX18sIGNvbnN0cnVjdG9yLCBwcm90b3R5cGUpIG9uIGV2ZXJ5IGZ1bmN0aW9uLlxuICpcbiAqIEludGVudGlvbmFsIGFzeW1tZXRyeTpcbiAqICAgLSBuYXRpdmVTZXQgIOKAlCBERU5JRUQgY2hlY2sgb25seSBhdCBlYWNoIHNlZ21lbnQuIE5vIGhhc093blByb3BlcnR5XG4gKiAgICAgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2Ugd3JpdGluZyBhbHdheXMgY3JlYXRlcyBhbiBPV04gcHJvcGVydHkgb24gYGN1cnJgLFxuICogICAgIHdoaWNoIGNhbm5vdCBwb2xsdXRlIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gKiAgIC0gbmF0aXZlR2V0IC8gbmF0aXZlSGFzIOKAlCBERU5JRUQgY2hlY2sgKyBoYXNPd25Qcm9wZXJ0eSBhdCBldmVyeSBzdGVwLlxuICogICAgIFJlYWRzIGZvbGxvdyB0aGUgcHJvdG90eXBlIGNoYWluIGJ5IGRlZmF1bHQgKGJyYWNrZXQgbm90YXRpb24pLCBzbyB0aGVcbiAqICAgICBoYXNPd25Qcm9wZXJ0eSBndWFyZCBpcyByZXF1aXJlZCB0byBwcmV2ZW50IGxlYWtpbmcgaW5oZXJpdGVkIHZhbHVlc1xuICogICAgIChlLmcuIE9iamVjdC5wcm90b3R5cGUsIE9iamVjdCBjb25zdHJ1Y3RvciwgdG9TdHJpbmcpLlxuICogICAtIG1lcmdlQ29udGV4dFdpbnMg4oCUIERFTklFRCBjaGVjayBvbmx5OyBPYmplY3Qua2V5cygpIGlzIG93bi1lbnVtZXJhYmxlLW9ubHlcbiAqICAgICBieSBzcGVjIHNvIHByb3RvdHlwZSBrZXlzIG5ldmVyIGFwcGVhciBpbiB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIERvIE5PVCBcImZpeFwiIHRoZSBuYXRpdmVTZXQgYXN5bW1ldHJ5IGJ5IGFkZGluZyBoYXNPd25Qcm9wZXJ0eSDigJQgaXQgaXNcbiAqIGludGVudGlvbmFsIGFuZCB3b3VsZCBicmVhayBwYXRoIGNyZWF0aW9uIGZvciBuZXcgaW50ZXJtZWRpYXRlIG5vZGVzLlxuICpcbiAqIFBhdGhzIG1heSBiZSBkb3Qtbm90YXRpb24gc3RyaW5ncyBvciBwcmUtc3BsaXQgKHN0cmluZ3xudW1iZXIpW10gYXJyYXlzLlxuICovXG5cbmNvbnN0IERFTklFRCA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKiogSXMgYHNlZ21lbnRgIG9uZSBvZiB0aGUgdGhyZWUgcHJvdG90eXBlLXBvbGx1dGlvbiB2ZWN0b3JzIGV2ZXJ5IGhlbHBlciBoZXJlIHJlZnVzZXM/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gREVOSUVELmhhcyhTdHJpbmcoc2VnbWVudCkpO1xufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnRzKHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXQgYHBhdGhgIGluIGBvYmpgLCByZXR1cm5pbmcgYGRlZmF1bHRWYWx1ZWAgaWYgYWJzZW50LlxuICpcbiAqIFNlY3VyaXR5OiBlYWNoIHBhdGggc2VnbWVudCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIERFTklFRCBsaXN0IGFuZCByZXF1aXJlc1xuICogYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAsIHByZXZlbnRpbmcgcHJvdG90eXBlLWNoYWluIHJlYWRzLlxuICogZS5nLiBuYXRpdmVHZXQoe30sICdfX3Byb3RvX18nKSBhbmQgbmF0aXZlR2V0KHt9LCAnY29uc3RydWN0b3InKSBib3RoIHJldHVyblxuICogYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBvZiBsZWFraW5nIE9iamVjdC5wcm90b3R5cGUgLyB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ3MpIHtcbiAgICBpZiAoY3VyciA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgcmV0dXJuIGN1cnIgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IGN1cnI7XG59XG5cbi8qKiBNdXRhdGUgYG9iamAsIHNldHRpbmcgYHZhbHVlYCBhdCBgcGF0aGAgKGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMpLiBSZXR1cm5zIGBvYmpgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZVNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybiBvYmo7XG4gICAgaWYgKGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGN1cnJba10gPSB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fTtcbiAgICB9XG4gICAgY3VyciA9IGN1cnJba107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuIG9iajtcbiAgY3VycltsYXN0XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgb3duIHByb3BlcnR5IGF0IGBwYXRoYCBpbiBgb2JqYCAodGhlIHJlcGxheSBwcmltaXRpdmUgZm9yIHRoZVxuICogYGRlbGV0ZWAgY29tbWl0IHZlcmIsICMxM2MtQikuIE5vLW9wIHdoZW4gYW55IGludGVybWVkaWF0ZSBzZWdtZW50IGlzXG4gKiBtaXNzaW5nIOKAlCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGhhcyBub3RoaW5nIHRvIHJlbW92ZS5cbiAqXG4gKiBTZWN1cml0eTogc2FtZSBERU5JRUQgKyBoYXNPd25Qcm9wZXJ0eSBkaXNjaXBsaW5lIGFzIG5hdGl2ZUdldCDigJQgZXZlcnlcbiAqIHNlZ21lbnQgaXMgY2hlY2tlZCwgc28gYG5hdGl2ZURlbGV0ZShvYmosICdfX3Byb3RvX19cdTAwMWZ4JylgIGFuZFxuICogcHJvdG90eXBlLWNoYWluIHdhbGtzIGFyZSBpbmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZURlbGV0ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuO1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgdHlwZW9mIGN1cnIgIT09ICdvYmplY3QnIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuO1xuICBpZiAoY3VyciAhPSBudWxsICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyW2xhc3RdO1xuICB9XG59XG5cbi8vIOKUgOKUgCBDb3B5LW9uLXdyaXRlIHByaW1pdGl2ZXMgKGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpIOKUgOKUgFxuLy9cbi8vIFRIRSBMQVc6IGEgY29tbWl0dGVkIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBBIHdyaXRlciBjb3BpZXMgdGhlIHJvb3Rcbi8vIGFuZCBldmVyeSBjb250YWluZXIgb24gZWFjaCBwYXRoIGl0IHdyaXRlcywgZWRpdHMgb25seSBjb250YWluZXJzIGl0XG4vLyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gKGl0cyBgb3duZWRgIHNldCksIGFuZCBzaGFyZXMgZXZlcnlcbi8vIG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQuIFRoZSBzYW1lIGxhd1xuLy8gYHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZS50cyDCtyBzZXRJblBhdGhgIGFwcGxpZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG5cbi8qKiBBIGNvbnRhaW5lciBhIHdyaXRlciBtYXkgb3duOiBhbnl0aGluZyBgdHlwZW9mICdvYmplY3QnYCBhbmQgbm90IG51bGwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBgcGFyZW50W2tleV1gIHdoZW4gYHBhcmVudGAgaXMgYSBjb250YWluZXIgdGhhdCBPV05TIGBrZXlgIOKAlCB0aGUgc2xvdFxuICoge0BsaW5rIG5hdGl2ZUdldH0gd291bGQgcmVhZCwgcmVmdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlLXBvbGx1dGlvblxuICogc2VnbWVudHMg4oCUIGVsc2UgYHVuZGVmaW5lZGAuIE9uZSBzdGVwIG9mIGEgcGF0aCB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duQ2hpbGQocGFyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZyB8IG51bWJlcik6IHVua25vd24ge1xuICByZXR1cm4gaXNDb250YWluZXIocGFyZW50KSAmJiAhREVOSUVELmhhcyhTdHJpbmcoa2V5KSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmVudCwga2V5KVxuICAgID8gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSBmb3IgYW4gb3duIGtleSBvZiBhbiBhcnJheSB0aGF0IGlzIGFuIGFycmF5IElOREVYIChgJzAnYCwgYCcxMidgKSwgbm90IGEgbmFtZSAoYGFyci5ub3RlYCkuICovXG5mdW5jdGlvbiBpc0FycmF5SW5kZXhLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IE51bWJlcihrZXkpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgJiYgbiA8IDQyOTQ5NjcyOTUgJiYgU3RyaW5nKG4pID09PSBrZXk7XG59XG5cbi8qKlxuICogVGhlIG5hbWVkIChub24taW5kZXgpIG93biBrZXlzIG9mIGFuIGFycmF5LCBpbiBvcmRlci4gT3duLWtleSBvcmRlciBwdXRzXG4gKiBldmVyeSBpbmRleCBmaXJzdCwgYXNjZW5kaW5nLCBhbmQgbmFtZXMgYWZ0ZXIgdGhlbSDigJQgc28gdGhlIG5hbWVzIGFyZSB0aGVcbiAqIHRhaWwgb2YgYE9iamVjdC5rZXlzYCwgYW5kIGFuIGFycmF5IHdpdGhvdXQgYW55IGlzIHRvbGQgYnkgaXRzIGxhc3Qga2V5LlxuICovXG5mdW5jdGlvbiBuYW1lZEFycmF5S2V5cyhhcnJheTogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyYXkpO1xuICBsZXQgZmlyc3QgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGZpcnN0ID4gMCAmJiAhaXNBcnJheUluZGV4S2V5KGtleXNbZmlyc3QgLSAxXSkpIGZpcnN0LS07XG4gIHJldHVybiBrZXlzLnNsaWNlKGZpcnN0KTtcbn1cblxuLyoqXG4gKiBBIFNIQUxMT1cgY29weSBvZiBvbmUgY29udGFpbmVyIHRoYXQga2VlcHMgZXZlcnkgc2xvdCB0aGUgd2hvbGUtc3RhdGVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoaXMgcmVwbGFjZWQga2VwdCDigJQgc28gYSBwYXRoIGNvcHkgYW5kIGEgZGVlcCBjbG9uZSBnaXZlXG4gKiB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoOlxuICogICAtIGEgcGxhaW4gb2JqZWN0IChvciBhIG51bGwtcHJvdG90eXBlIG9uZSk6IGl0cyBvd24gZW51bWVyYWJsZSBrZXlzLCBpblxuICogICAgIG9yZGVyLCBieSBzcHJlYWQg4oCUIGFuIG93biBgX19wcm90b19fYCBrZXkgc3RheXMgYSBrZXk7IHRoZSByZXN1bHQgaGFzXG4gKiAgICAgYE9iamVjdC5wcm90b3R5cGVgLCBhcyBhIGNsb25lJ3MgZG9lcztcbiAqICAgLSBhbiBhcnJheTogaXRzIGluZGljZXMsIGhvbGVzIGFuZCBsZW5ndGggKGBzbGljZWApIEFORCBhbnkgbmFtZWRcbiAqICAgICBwcm9wZXJ0eSBhIG5lc3RlZCB3cml0ZSBodW5nIG9mZiBpdCAoYHNsaWNlYCBhbG9uZSB3b3VsZCBkcm9wIHRob3NlKTtcbiAqICAgLSBhbnl0aGluZyBlbHNlIOKAlCBhIGBEYXRlYCwgYE1hcGAsIGBTZXRgLCB0eXBlZCBhcnJheSwgYSBjbGFzcyBpbnN0YW5jZSDigJRcbiAqICAgICBpcyBkZWVwLWNsb25lZCwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgZGlkIHRvIGl0OyBhbmQgdGhlXG4gKiAgICAgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyB0aGUgY2xvbmUgY2Fubm90IGNhcnJ5IChhbiBleHBhbmRvIGEgbmVzdGVkXG4gKiAgICAgd3JpdGUgaHVuZyBvbiBhIGBEYXRlYCkgYXJlIGNhcnJpZWQgb3ZlciBieSByZWZlcmVuY2UsIHNvIGEgbGF0ZXIgd3JpdGVcbiAqICAgICB0aHJvdWdoIGl0IGNoYW5nZXMgZXhhY3RseSBpdHMgb3duIHBhdGguIFJhcmUgb24gYSB3cml0ZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VCBleHRlbmRzIG9iamVjdD4oY29udGFpbmVyOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb3B5ID0gY29udGFpbmVyLnNsaWNlKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuYW1lZEFycmF5S2V5cyhjb250YWluZXIpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgcmV0dXJuIGNvcHkgYXMgdW5rbm93biBhcyBUO1xuICB9XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnRhaW5lcik7XG4gIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkgcmV0dXJuIHsgLi4uY29udGFpbmVyIH07XG4gIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29udGFpbmVyKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29udGFpbmVyKSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGtleSkpIGNvcHlba2V5XSA9IChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gIH1cbiAgcmV0dXJuIGNvcHkgYXMgVDtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gYHBhdGhgJ3MgTEVBRiBvbmVzIHRoZSB3cml0ZXIgb3ducywgc29cbiAqIHRoZSB3cml0ZSB0aGF0IGZvbGxvd3MgKGBuYXRpdmVTZXRgIC8gYG5hdGl2ZURlbGV0ZWAgLyBhIHZlcmIgYXJtKSBlZGl0c1xuICogbm90aGluZyBpdCBkaWQgbm90IGNyZWF0ZS5cbiAqXG4gKiBgcm9vdGAgbXVzdCBhbHJlYWR5IGJlIG93bmVkLiBXYWxraW5nIGRvd24sIGV2ZXJ5IGNvbnRhaW5lciB0aGUgd3JpdGVyIGRpZFxuICogbm90IGNyZWF0ZSAoYG93bmVkYCBkb2VzIG5vdCBob2xkIGl0KSBpcyByZXBsYWNlZCwgaW4gaXRzIHBhcmVudCwgYnkgaXRzXG4gKiB7QGxpbmsgc2hhbGxvd0NvcHl9LCB3aGljaCB0aGUgd3JpdGVyIHRoZW4gb3ducy4gVGhlIHdhbGsgc3RvcHMgd2hlcmVcbiAqIGBuYXRpdmVTZXRgIHdvdWxkIHN0b3Agb3IgY3JlYXRlOiBhIERFTklFRCBzZWdtZW50ICh0aGUgd3JpdGUgaXMgcmVmdXNlZFxuICogdGhlcmUgYW55d2F5KSwgb3IgYSBtaXNzaW5nIC8gcHJpbWl0aXZlIGludGVybWVkaWF0ZSAoYG5hdGl2ZVNldGAgbWFrZXMgYVxuICogZnJlc2ggY29udGFpbmVyIGZyb20gdGhhdCBwb2ludCBvbikuIFRoZSBsZWFmIGl0c2VsZiBpcyBuZXZlciBjb3BpZWQg4oCUIHRoZVxuICogd3JpdGUgcmVwbGFjZXMgaXQuXG4gKlxuICogQ29zdDogb25lIHNoYWxsb3cgY29weSBwZXIgY29udGFpbmVyIG9uIHRoZSBwYXRoIHRoYXQgdGhpcyB3cml0ZXIgaGFzIG5vdFxuICogYWxyZWFkeSBjb3BpZWQg4oCUIE8oZGVwdGggw5cgd2lkdGgpLCBpbmRlcGVuZGVudCBvZiBldmVyeXRoaW5nIHRoZSB3cml0ZVxuICogZG9lcyBub3QgcGFzcyB0aHJvdWdoLiBBIHBhdGggb2Ygb25lIHNlZ21lbnQgKGEgcm9vdCBrZXksIHRoZSBjb21tb24gY2FzZSlcbiAqIGNvcGllcyBub3RoaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25TcGluZShyb290OiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gcm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gY3VycltrXTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKG5leHQpKSByZXR1cm47XG4gICAgaWYgKG93bmVkLmhhcyhuZXh0KSkge1xuICAgICAgY3VyciA9IG5leHQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY29weSA9IHNoYWxsb3dDb3B5KG5leHQpO1xuICAgIG93bmVkLmFkZChjb3B5KTtcbiAgICBjdXJyW2tdID0gY29weTtcbiAgICBjdXJyID0gY29weTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IG9mIGEgbmV3IGdlbmVyYXRpb246IGEgc2hhbGxvdyBjb3B5IG9mIGBiYXNlYCB3aGVuIGl0IGlzIGFcbiAqIGNvbnRhaW5lciAob3duZWQgYnkgdGhlIHdyaXRlciksIGVsc2UgdGhlIGhpc3RvcmljYWwgZGVlcCBjbG9uZSBvZiBhXG4gKiBub24tY29udGFpbmVyIGJhc2UgKGB1bmRlZmluZWRgLCBhIHByaW1pdGl2ZSkgc28gdGhlIGNhbGxlcnMnIGJlaGF2aW91ciBvblxuICogc3VjaCBhIGJhc2UgaXMgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duZWRSb290T2YoYmFzZTogYW55LCBvd25lZD86IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmICghaXNDb250YWluZXIoYmFzZSkpIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGNvbnN0IHJvb3QgPSBzaGFsbG93Q29weShiYXNlKTtcbiAgb3duZWQ/LmFkZChyb290KTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBNYXJrIGEgdmFsdWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgKGEgZnJlc2ggY2xvbmUsIGEgbWVyZ2UgcmVzdWx0KSBhcyBvd25lZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd24odmFsdWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG93bmVkICE9PSB1bmRlZmluZWQgJiYgaXNDb250YWluZXIodmFsdWUpKSBvd25lZC5hZGQodmFsdWUpO1xufVxuXG4vKipcbiAqIE1hcmsgRVZFUlkgY29udGFpbmVyIG9mIGEgdHJlZSB0aGUgd3JpdGVyIGp1c3QgY3JlYXRlZCB3aG9sZSAoYVxuICogYHN0cnVjdHVyZWRDbG9uZWAgcmVzdWx0KSBhcyBvd25lZCwgc28gYSBsYXRlciB3cml0ZSB0aHJvdWdoIGFueSBvZiB0aGVtXG4gKiBlZGl0cyBpdCBpbiBwbGFjZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgYWdhaW4uIFdhbGtzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUXG4gKiB0aGUgc2xvdHMgYSBwYXRoIGNhbiBhZGRyZXNzOyBhIGBNYXBgJ3Mgb3IgYFNldGAncyBlbnRyaWVzIGFyZSBub3QuIE8odGhlXG4gKiB0cmVlJ3MgY29udGFpbmVycyk7IGEgY29udGFpbmVyIGFscmVhZHkgb3duZWQgaXMgbm90IHdhbGtlZCB0d2ljZSAoYSBjeWNsZVxuICogaW5zaWRlIHRoZSBjbG9uZSBlbmRzIHRoZXJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkb3B0KHRyZWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhY2s6IHVua25vd25bXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8IG93bmVkLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIG93bmVkLmFkZCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSBzdGFjay5wdXNoKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsc0RBQStDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSxTQUFnQixlQUFlLENBQUMsT0FBd0I7SUFDdEQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFGRCwwQ0FFQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFrQyxFQUFFLFlBQWtCO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lB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Q0FBQztnQkFDdEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUk7Z0JBQ2pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCw2QkFBNkI7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBMUJELDRDQTBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcGF0aE9wcy50cyDigJQgTmF0aXZlIG5lc3RlZC1wYXRoIGhlbHBlcnMgKHJlcGxhY2VzIGxvZGFzaC5nZXQvc2V0L2hhcy9tZXJnZXdpdGgpXG4gKlxuICogVGhlIERFTklFRCBzZXQgaXMgdGhlIHNoYXJlZCBydWxlIGZvciB0aHJlZSBwcm90b3R5cGUtcG9sbHV0aW9uIHNlbGVjdG9yXG4gKiBzZWdtZW50cyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKS4gRWFjaCBvcGVyYXRpb24ncyB0cmF2ZXJzYWxcbiAqIGNvbnRyYWN0IGlzIGV4cGxpY2l0IGJlbG93OyBtZXJlbHkgdXNpbmcgdGhpcyBtb2R1bGUgaXMgbm90IGEgc2FuZGJveC5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0IOKAlCBERU5JRUQgY2hlY2sgYXQgZWFjaCBzZWdtZW50OyB1c2VkIG9uIHdyaXRlci1vd25lZFxuICogICAgIGNvbnRhaW5lcnMuIEl0IGNhbiBmb2xsb3cgYW4gaW5oZXJpdGVkIG9iamVjdCB1bmRlciBhbiBvcmRpbmFyeSBrZXkuXG4gKiAgIC0gbmF0aXZlR2V0IOKAlCBERU5JRUQgY2hlY2sgKyBoYXNPd25Qcm9wZXJ0eSBhdCBldmVyeSBzdGVwLlxuICogICAtIG5hdGl2ZUhhcyDigJQgb3duLXByb3BlcnR5IGV4aXN0ZW5jZSBvbmx5LCBpbmNsdWRpbmcgb3duIGRlbmllZCBuYW1lc1xuICogICAgIGFuZCBvd24gdW5kZWZpbmVkIHZhbHVlczsgaXQgZG9lcyBub3QgdXNlIHRoZSBERU5JRUQgcnVsZS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBOZXN0ZWQgZGlhZ25vc3RpYyB3cml0ZXJzIGhhdmUgdGhlaXIgb3duIHdob2xlLXNlbGVjdG9yIHByZWZsaWdodCBhbmRcbiAqIG93bi1wcm9wZXJ0eSB3cml0ZXMgaW4gdXRpbHMudHMsIHVzaW5nIHRoZSBzYW1lIGlzRGVuaWVkU2VnbWVudCBwcmVkaWNhdGUuXG4gKlxuICogUGF0aHMgbWF5IGJlIGRvdC1ub3RhdGlvbiBzdHJpbmdzIG9yIHByZS1zcGxpdCAoc3RyaW5nfG51bWJlcilbXSBhcnJheXMuXG4gKi9cblxuaW1wb3J0IHsgcHV0T3duIH0gZnJvbSAnLi4vY2FwdHVyZS9vd25EYXRhLmpzJztcblxuY29uc3QgREVOSUVEID0gbmV3IFNldChbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXSk7XG5cbi8qKiBJcyBgc2VnbWVudGAgb25lIG9mIHRoZSB0aHJlZSBkZW5pZWQgcHJvdG90eXBlLXBvbGx1dGlvbiBzZWxlY3RvciBuYW1lcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFNlZ21lbnQoc2VnbWVudDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBERU5JRUQuaGFzKFN0cmluZyhzZWdtZW50KSk7XG59XG5cbmZ1bmN0aW9uIHRvU2VnbWVudHMocGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gYG9iamAsIHJldHVybmluZyBgZGVmYXVsdFZhbHVlYCBpZiBhYnNlbnQuXG4gKlxuICogU2VjdXJpdHk6IGVhY2ggcGF0aCBzZWdtZW50IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgREVOSUVEIGxpc3QgYW5kIHJlcXVpcmVzXG4gKiBhbiBvd24gcHJvcGVydHkgYXQgZXZlcnkgc3RlcCwgcHJldmVudGluZyBwcm90b3R5cGUtY2hhaW4gcmVhZHMuXG4gKiBlLmcuIG5hdGl2ZUdldCh7fSwgJ19fcHJvdG9fXycpIGFuZCBuYXRpdmVHZXQoe30sICdjb25zdHJ1Y3RvcicpIGJvdGggcmV0dXJuXG4gKiBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkIG9mIGxlYWtpbmcgT2JqZWN0LnByb3RvdHlwZSAvIHRoZSBPYmplY3QgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVHZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgIGlmIChjdXJyID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICByZXR1cm4gY3VyciA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogY3Vycjtcbn1cblxuLyoqIE11dGF0ZSBgb2JqYCwgc2V0dGluZyBgdmFsdWVgIGF0IGBwYXRoYCAoY3JlYXRlcyBpbnRlcm1lZGlhdGUgb2JqZWN0cykuIFJldHVybnMgYG9iamAuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlU2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgayA9IHNlZ3NbaV07XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGspKSkgcmV0dXJuIG9iajtcbiAgICBpZiAoY3VycltrXSA9PSBudWxsIHx8IHR5cGVvZiBjdXJyW2tdICE9PSAnb2JqZWN0Jykge1xuICAgICAgY3VycltrXSA9IHR5cGVvZiBzZWdzW2kgKyAxXSA9PT0gJ251bWJlcicgPyBbXSA6IHt9O1xuICAgIH1cbiAgICBjdXJyID0gY3VycltrXTtcbiAgfVxuICBjb25zdCBsYXN0ID0gc2Vnc1tzZWdzLmxlbmd0aCAtIDFdO1xuICBpZiAoREVOSUVELmhhcyhTdHJpbmcobGFzdCkpKSByZXR1cm4gb2JqO1xuICBjdXJyW2xhc3RdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBvd24gcHJvcGVydHkgYXQgYHBhdGhgIGluIGBvYmpgICh0aGUgcmVwbGF5IHByaW1pdGl2ZSBmb3IgdGhlXG4gKiBgZGVsZXRlYCBjb21taXQgdmVyYiwgIzEzYy1CKS4gTm8tb3Agd2hlbiBhbnkgaW50ZXJtZWRpYXRlIHNlZ21lbnQgaXNcbiAqIG1pc3Npbmcg4oCUIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaGFzIG5vdGhpbmcgdG8gcmVtb3ZlLlxuICpcbiAqIFNlY3VyaXR5OiBzYW1lIERFTklFRCArIGhhc093blByb3BlcnR5IGRpc2NpcGxpbmUgYXMgbmF0aXZlR2V0IOKAlCBldmVyeVxuICogc2VnbWVudCBpcyBjaGVja2VkLCBzbyBgbmF0aXZlRGVsZXRlKG9iaiwgJ19fcHJvdG9fX1x1MDAxZngnKWAgYW5kXG4gKiBwcm90b3R5cGUtY2hhaW4gd2Fsa3MgYXJlIGluZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlRGVsZXRlKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHNlZyA9IHNlZ3NbaV07XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm47XG4gICAgaWYgKGN1cnIgPT0gbnVsbCB8fCB0eXBlb2YgY3VyciAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm47XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICBjb25zdCBsYXN0ID0gc2Vnc1tzZWdzLmxlbmd0aCAtIDFdO1xuICBpZiAoREVOSUVELmhhcyhTdHJpbmcobGFzdCkpKSByZXR1cm47XG4gIGlmIChjdXJyICE9IG51bGwgJiYgdHlwZW9mIGN1cnIgPT09ICdvYmplY3QnKSB7XG4gICAgZGVsZXRlIGN1cnJbbGFzdF07XG4gIH1cbn1cblxuLy8g4pSA4pSAIENvcHktb24td3JpdGUgcHJpbWl0aXZlcyAoZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkg4pSA4pSAXG4vL1xuLy8gVEhFIExBVzogYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiBpcyBuZXZlciBlZGl0ZWQuIEEgd3JpdGVyIGNvcGllcyB0aGUgcm9vdFxuLy8gYW5kIGV2ZXJ5IGNvbnRhaW5lciBvbiBlYWNoIHBhdGggaXQgd3JpdGVzLCBlZGl0cyBvbmx5IGNvbnRhaW5lcnMgaXRcbi8vIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IG9wZXJhdGlvbiAoaXRzIGBvd25lZGAgc2V0KSwgYW5kIHNoYXJlcyBldmVyeVxuLy8gb3RoZXIgc3VidHJlZSB3aXRoIHRoZSBnZW5lcmF0aW9uIGJlZm9yZSBpdC4gVGhlIHNhbWUgbGF3XG4vLyBgcmVhY3RpdmUvc3RydWN0dXJhbFdyaXRlLnRzIMK3IHNldEluUGF0aGAgYXBwbGllcyB0byBhIHNpbmdsZSB2YWx1ZS5cblxuLyoqIEEgY29udGFpbmVyIGEgd3JpdGVyIG1heSBvd246IGFueXRoaW5nIGB0eXBlb2YgJ29iamVjdCdgIGFuZCBub3QgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIGBwYXJlbnRba2V5XWAgd2hlbiBgcGFyZW50YCBpcyBhIGNvbnRhaW5lciB0aGF0IE9XTlMgYGtleWAg4oCUIHRoZSBzbG90XG4gKiB7QGxpbmsgbmF0aXZlR2V0fSB3b3VsZCByZWFkLCByZWZ1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUtcG9sbHV0aW9uXG4gKiBzZWdtZW50cyDigJQgZWxzZSBgdW5kZWZpbmVkYC4gT25lIHN0ZXAgb2YgYSBwYXRoIHdhbGsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25DaGlsZChwYXJlbnQ6IHVua25vd24sIGtleTogc3RyaW5nIHwgbnVtYmVyKTogdW5rbm93biB7XG4gIHJldHVybiBpc0NvbnRhaW5lcihwYXJlbnQpICYmICFERU5JRUQuaGFzKFN0cmluZyhrZXkpKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50LCBrZXkpXG4gICAgPyAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHVua25vd24+KVtrZXldXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIGZvciBhbiBvd24ga2V5IG9mIGFuIGFycmF5IHRoYXQgaXMgYW4gYXJyYXkgSU5ERVggKGAnMCdgLCBgJzEyJ2ApLCBub3QgYSBuYW1lIChgYXJyLm5vdGVgKS4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlJbmRleEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuID0gTnVtYmVyKGtleSk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMCAmJiBuIDwgNDI5NDk2NzI5NSAmJiBTdHJpbmcobikgPT09IGtleTtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZWQgKG5vbi1pbmRleCkgb3duIGtleXMgb2YgYW4gYXJyYXksIGluIG9yZGVyLiBPd24ta2V5IG9yZGVyIHB1dHNcbiAqIGV2ZXJ5IGluZGV4IGZpcnN0LCBhc2NlbmRpbmcsIGFuZCBuYW1lcyBhZnRlciB0aGVtIOKAlCBzbyB0aGUgbmFtZXMgYXJlIHRoZVxuICogdGFpbCBvZiBgT2JqZWN0LmtleXNgLCBhbmQgYW4gYXJyYXkgd2l0aG91dCBhbnkgaXMgdG9sZCBieSBpdHMgbGFzdCBrZXkuXG4gKi9cbmZ1bmN0aW9uIG5hbWVkQXJyYXlLZXlzKGFycmF5OiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnJheSk7XG4gIGxldCBmaXJzdCA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoZmlyc3QgPiAwICYmICFpc0FycmF5SW5kZXhLZXkoa2V5c1tmaXJzdCAtIDFdKSkgZmlyc3QtLTtcbiAgcmV0dXJuIGtleXMuc2xpY2UoZmlyc3QpO1xufVxuXG4vKipcbiAqIEEgU0hBTExPVyBjb3B5IG9mIG9uZSBjb250YWluZXIgdGhhdCBrZWVwcyBldmVyeSBzbG90IHRoZSB3aG9sZS1zdGF0ZVxuICogYHN0cnVjdHVyZWRDbG9uZWAgdGhpcyByZXBsYWNlZCBrZXB0IOKAlCBzbyBhIHBhdGggY29weSBhbmQgYSBkZWVwIGNsb25lIGdpdmVcbiAqIHRoZSBzYW1lIHZhbHVlIGF0IGV2ZXJ5IHBhdGg6XG4gKiAgIC0gYSBwbGFpbiBvYmplY3QgKG9yIGEgbnVsbC1wcm90b3R5cGUgb25lKTogaXRzIG93biBlbnVtZXJhYmxlIGtleXMsIGluXG4gKiAgICAgb3JkZXIsIGJ5IHNwcmVhZCDigJQgYW4gb3duIGBfX3Byb3RvX19gIGtleSBzdGF5cyBhIGtleTsgdGhlIHJlc3VsdCBoYXNcbiAqICAgICBgT2JqZWN0LnByb3RvdHlwZWAsIGFzIGEgY2xvbmUncyBkb2VzO1xuICogICAtIGFuIGFycmF5OiBpdHMgaW5kaWNlcywgaG9sZXMgYW5kIGxlbmd0aCAoYHNsaWNlYCkgQU5EIGFueSBuYW1lZFxuICogICAgIHByb3BlcnR5IGEgbmVzdGVkIHdyaXRlIGh1bmcgb2ZmIGl0IChgc2xpY2VgIGFsb25lIHdvdWxkIGRyb3AgdGhvc2UpO1xuICogICAtIGFueXRoaW5nIGVsc2Ug4oCUIGEgYERhdGVgLCBgTWFwYCwgYFNldGAsIHR5cGVkIGFycmF5LCBhIGNsYXNzIGluc3RhbmNlIOKAlFxuICogICAgIGlzIGRlZXAtY2xvbmVkLCB3aGljaCBpcyB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSBkaWQgdG8gaXQ7IGFuZCB0aGVcbiAqICAgICBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRoZSBjbG9uZSBjYW5ub3QgY2FycnkgKGFuIGV4cGFuZG8gYSBuZXN0ZWRcbiAqICAgICB3cml0ZSBodW5nIG9uIGEgYERhdGVgKSBhcmUgY2FycmllZCBvdmVyIGJ5IHJlZmVyZW5jZSwgc28gYSBsYXRlciB3cml0ZVxuICogICAgIHRocm91Z2ggaXQgY2hhbmdlcyBleGFjdGx5IGl0cyBvd24gcGF0aC4gUmFyZSBvbiBhIHdyaXRlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weTxUIGV4dGVuZHMgb2JqZWN0Pihjb250YWluZXI6IFQpOiBUIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvcHkgPSBjb250YWluZXIuc2xpY2UoKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG5hbWVkQXJyYXlLZXlzKGNvbnRhaW5lcikpXG4gICAgICBwdXRPd24oY29weSwga2V5LCAoY29udGFpbmVyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKVxuICAgICAgcHV0T3duKGNvcHksIGtleSwgKGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbiAgcmV0dXJuIGNvcHkgYXMgVDtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gYHBhdGhgJ3MgTEVBRiBvbmVzIHRoZSB3cml0ZXIgb3ducywgc29cbiAqIHRoZSB3cml0ZSB0aGF0IGZvbGxvd3MgKGBuYXRpdmVTZXRgIC8gYG5hdGl2ZURlbGV0ZWAgLyBhIHZlcmIgYXJtKSBlZGl0c1xuICogbm90aGluZyBpdCBkaWQgbm90IGNyZWF0ZS5cbiAqXG4gKiBgcm9vdGAgbXVzdCBhbHJlYWR5IGJlIG93bmVkLiBXYWxraW5nIGRvd24sIGV2ZXJ5IGNvbnRhaW5lciB0aGUgd3JpdGVyIGRpZFxuICogbm90IGNyZWF0ZSAoYG93bmVkYCBkb2VzIG5vdCBob2xkIGl0KSBpcyByZXBsYWNlZCwgaW4gaXRzIHBhcmVudCwgYnkgaXRzXG4gKiB7QGxpbmsgc2hhbGxvd0NvcHl9LCB3aGljaCB0aGUgd3JpdGVyIHRoZW4gb3ducy4gVGhlIHdhbGsgc3RvcHMgd2hlcmVcbiAqIGBuYXRpdmVTZXRgIHdvdWxkIHN0b3Agb3IgY3JlYXRlOiBhIERFTklFRCBzZWdtZW50ICh0aGUgd3JpdGUgaXMgcmVmdXNlZFxuICogdGhlcmUgYW55d2F5KSwgb3IgYSBtaXNzaW5nIC8gcHJpbWl0aXZlIGludGVybWVkaWF0ZSAoYG5hdGl2ZVNldGAgbWFrZXMgYVxuICogZnJlc2ggY29udGFpbmVyIGZyb20gdGhhdCBwb2ludCBvbikuIFRoZSBsZWFmIGl0c2VsZiBpcyBuZXZlciBjb3BpZWQg4oCUIHRoZVxuICogd3JpdGUgcmVwbGFjZXMgaXQuXG4gKlxuICogQ29zdDogb25lIHNoYWxsb3cgY29weSBwZXIgY29udGFpbmVyIG9uIHRoZSBwYXRoIHRoYXQgdGhpcyB3cml0ZXIgaGFzIG5vdFxuICogYWxyZWFkeSBjb3BpZWQg4oCUIE8oZGVwdGggw5cgd2lkdGgpLCBpbmRlcGVuZGVudCBvZiBldmVyeXRoaW5nIHRoZSB3cml0ZVxuICogZG9lcyBub3QgcGFzcyB0aHJvdWdoLiBBIHBhdGggb2Ygb25lIHNlZ21lbnQgKGEgcm9vdCBrZXksIHRoZSBjb21tb24gY2FzZSlcbiAqIGNvcGllcyBub3RoaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25TcGluZShyb290OiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gcm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gY3VycltrXTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKG5leHQpKSByZXR1cm47XG4gICAgaWYgKG93bmVkLmhhcyhuZXh0KSkge1xuICAgICAgY3VyciA9IG5leHQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY29weSA9IHNoYWxsb3dDb3B5KG5leHQpO1xuICAgIG93bmVkLmFkZChjb3B5KTtcbiAgICBjdXJyW2tdID0gY29weTtcbiAgICBjdXJyID0gY29weTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IG9mIGEgbmV3IGdlbmVyYXRpb246IGEgc2hhbGxvdyBjb3B5IG9mIGBiYXNlYCB3aGVuIGl0IGlzIGFcbiAqIGNvbnRhaW5lciAob3duZWQgYnkgdGhlIHdyaXRlciksIGVsc2UgdGhlIGhpc3RvcmljYWwgZGVlcCBjbG9uZSBvZiBhXG4gKiBub24tY29udGFpbmVyIGJhc2UgKGB1bmRlZmluZWRgLCBhIHByaW1pdGl2ZSkgc28gdGhlIGNhbGxlcnMnIGJlaGF2aW91ciBvblxuICogc3VjaCBhIGJhc2UgaXMgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duZWRSb290T2YoYmFzZTogYW55LCBvd25lZD86IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmICghaXNDb250YWluZXIoYmFzZSkpIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGNvbnN0IHJvb3QgPSBzaGFsbG93Q29weShiYXNlKTtcbiAgb3duZWQ/LmFkZChyb290KTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBNYXJrIGEgdmFsdWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgKGEgZnJlc2ggY2xvbmUsIGEgbWVyZ2UgcmVzdWx0KSBhcyBvd25lZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd24odmFsdWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG93bmVkICE9PSB1bmRlZmluZWQgJiYgaXNDb250YWluZXIodmFsdWUpKSBvd25lZC5hZGQodmFsdWUpO1xufVxuXG4vKipcbiAqIE1hcmsgRVZFUlkgY29udGFpbmVyIG9mIGEgdHJlZSB0aGUgd3JpdGVyIGp1c3QgY3JlYXRlZCB3aG9sZSAoYVxuICogYHN0cnVjdHVyZWRDbG9uZWAgcmVzdWx0KSBhcyBvd25lZCwgc28gYSBsYXRlciB3cml0ZSB0aHJvdWdoIGFueSBvZiB0aGVtXG4gKiBlZGl0cyBpdCBpbiBwbGFjZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgYWdhaW4uIFdhbGtzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUXG4gKiB0aGUgc2xvdHMgYSBwYXRoIGNhbiBhZGRyZXNzOyBhIGBNYXBgJ3Mgb3IgYFNldGAncyBlbnRyaWVzIGFyZSBub3QuIE8odGhlXG4gKiB0cmVlJ3MgY29udGFpbmVycyk7IGEgY29udGFpbmVyIGFscmVhZHkgb3duZWQgaXMgbm90IHdhbGtlZCB0d2ljZSAoYSBjeWNsZVxuICogaW5zaWRlIHRoZSBjbG9uZSBlbmRzIHRoZXJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkb3B0KHRyZWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhY2s6IHVua25vd25bXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8IG93bmVkLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIG93bmVkLmFkZCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSBzdGFjay5wdXNoKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -16,7 +16,7 @@
16
16
  * Zero external dependencies.
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
19
+ exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.isDeniedWritePath = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
20
20
  const pathOps_js_1 = require("./pathOps.js");
21
21
  var equality_js_1 = require("./equality.js");
22
22
  Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
@@ -64,6 +64,26 @@ function pathUnder(address, path) {
64
64
  out[address.length + i] = path[i];
65
65
  return out;
66
66
  }
67
+ /**
68
+ * Refuse the WHOLE selector before creating a container or copying a generation.
69
+ * The address's array contract is checked even when another selector is denied.
70
+ * Payload keys are data, not selectors, and are deliberately not inspected.
71
+ * @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
72
+ */
73
+ function isDeniedWritePath(address = [], path = [], field) {
74
+ const prefix = addressOf(address);
75
+ return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
76
+ }
77
+ exports.isDeniedWritePath = isDeniedWritePath;
78
+ /** Keep existing own-property behavior; a missing slot must not call an inherited setter. */
79
+ function setOwnValue(object, key, value) {
80
+ if (Object.prototype.hasOwnProperty.call(object, key)) {
81
+ object[key] = value;
82
+ }
83
+ else {
84
+ Object.defineProperty(object, key, { value, enumerable: true, writable: true, configurable: true });
85
+ }
86
+ }
67
87
  /**
68
88
  * The container at `address` + `path` inside `obj`, each missing one created
69
89
  * on the way: the one AT the address from `defaultValues` when given, every
@@ -75,7 +95,7 @@ function containerAt(obj, address = [], path = [], defaultValues) {
75
95
  for (let i = 0; i < segments.length; i++) {
76
96
  const key = segments[i];
77
97
  if (!Object.prototype.hasOwnProperty.call(current, key)) {
78
- current[key] = i === address.length - 1 && defaultValues ? defaultValues : {};
98
+ setOwnValue(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
79
99
  }
80
100
  current = current[key];
81
101
  }
@@ -83,19 +103,25 @@ function containerAt(obj, address = [], path = [], defaultValues) {
83
103
  }
84
104
  /**
85
105
  * Sets a value at a nested path under `address`, creating intermediate objects as needed.
106
+ * A denied address/path/field leaves `obj` unchanged, including its prototype.
86
107
  */
87
108
  function setNestedValue(obj, address, path, field, value, defaultValues) {
88
- containerAt(obj, address, path, defaultValues)[field] = value;
109
+ if (isDeniedWritePath(address, path, field))
110
+ return obj;
111
+ setOwnValue(containerAt(obj, address, path, defaultValues), field, value);
89
112
  return obj;
90
113
  }
91
114
  exports.setNestedValue = setNestedValue;
92
115
  /**
93
- * Deep-merges a value into the object at a nested path under `address`.
116
+ * Updates a value in the object at a nested path under `address`.
117
+ * A denied address/path/field leaves `obj` unchanged, including its prototype.
94
118
  * - Arrays: concatenate
95
119
  * - Objects: shallow merge at each level
96
120
  * - Primitives: replace
97
121
  */
98
122
  function updateNestedValue(obj, address, path, field, value, defaultValues) {
123
+ if (isDeniedWritePath(address, path, field))
124
+ return obj;
99
125
  updateValue(containerAt(obj, address, path, defaultValues), field, value);
100
126
  return obj;
101
127
  }
@@ -116,21 +142,23 @@ exports.updateNestedValue = updateNestedValue;
116
142
  * The fix is the explicit `value.length === 0` early-return branch.
117
143
  */
118
144
  function updateValue(object, key, value) {
145
+ if ((0, pathOps_js_1.isDeniedSegment)(key))
146
+ return;
119
147
  if (Array.isArray(value)) {
120
148
  if (value.length === 0) {
121
- object[key] = value; // clear: [] replaces whatever was there
149
+ setOwnValue(object, key, value); // clear: [] replaces whatever was there
122
150
  }
123
151
  else {
124
- const cur = object[key];
125
- object[key] = cur === undefined ? value : [...cur, ...value];
152
+ const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
153
+ setOwnValue(object, key, cur === undefined ? value : [...cur, ...value]);
126
154
  }
127
155
  }
128
156
  else if (value && typeof value === 'object' && Object.keys(value).length) {
129
- const cur = object[key];
130
- object[key] = cur === undefined ? value : { ...cur, ...value };
157
+ const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
158
+ setOwnValue(object, key, cur === undefined ? value : { ...cur, ...value });
131
159
  }
132
160
  else {
133
- object[key] = value;
161
+ setOwnValue(object, key, value);
134
162
  }
135
163
  }
136
164
  exports.updateValue = updateValue;
@@ -147,4 +175,4 @@ function getNestedValue(root, path, field) {
147
175
  return undefined;
148
176
  }
149
177
  exports.getNestedValue = getNestedValue;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBdUY7QUFJdkYsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBa0U7QUFJbEUsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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QUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IGlzRGVuaWVkU2VnbWVudCwgbmF0aXZlR2V0IGFzIF9nZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgdGhlIFdIT0xFIHNlbGVjdG9yIGJlZm9yZSBjcmVhdGluZyBhIGNvbnRhaW5lciBvciBjb3B5aW5nIGEgZ2VuZXJhdGlvbi5cbiAqIFRoZSBhZGRyZXNzJ3MgYXJyYXkgY29udHJhY3QgaXMgY2hlY2tlZCBldmVuIHdoZW4gYW5vdGhlciBzZWxlY3RvciBpcyBkZW5pZWQuXG4gKiBQYXlsb2FkIGtleXMgYXJlIGRhdGEsIG5vdCBzZWxlY3RvcnMsIGFuZCBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBpbnNwZWN0ZWQuXG4gKiBAaW50ZXJuYWwgU2hhcmVkIGJ5IHRoZSBuZXN0ZWQgd3JpdGVycyBhbmQgU2hhcmVkTWVtb3J5J3MgcHJlLWNvcHkgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFdyaXRlUGF0aChcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NPZihhZGRyZXNzKTtcbiAgcmV0dXJuIHByZWZpeC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgcGF0aC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgaXNEZW5pZWRTZWdtZW50KGZpZWxkKTtcbn1cblxuLyoqIEtlZXAgZXhpc3Rpbmcgb3duLXByb3BlcnR5IGJlaGF2aW9yOyBhIG1pc3Npbmcgc2xvdCBtdXN0IG5vdCBjYWxsIGFuIGluaGVyaXRlZCBzZXR0ZXIuICovXG5mdW5jdGlvbiBzZXRPd25WYWx1ZShvYmplY3Q6IE5lc3RlZE9iamVjdCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBzZXRPd25WYWx1ZShjdXJyZW50LCBrZXksIGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9KTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICBzZXRPd25WYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogQSBkZW5pZWQgYWRkcmVzcy9wYXRoL2ZpZWxkIGxlYXZlcyBgb2JqYCB1bmNoYW5nZWQsIGluY2x1ZGluZyBpdHMgcHJvdG90eXBlLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoaXNEZW5pZWRTZWdtZW50KGtleSkpIHJldHVybjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgPyBvYmplY3Rba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `target[name] = value`, preserving existing own-slot behavior while making
3
+ * a missing inherited name an OWN data property. Payload names such as
4
+ * `__proto__` are data, not setters or selector instructions. Shared by the
5
+ * record-serving and copy-on-write copies; this is not a public helper.
6
+ */
7
+ export declare function putOwn(target: Record<string, unknown>, name: string, value: unknown): void;
@@ -1,27 +1,25 @@
1
1
  /**
2
2
  * pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
3
3
  *
4
- * Security contract: all functions guard against prototype-pollution and
5
- * prototype-chain-read attacks. The DENIED set blocks the three canonical
6
- * pollution vectors (__proto__, constructor, prototype) on every function.
4
+ * The DENIED set is the shared rule for three prototype-pollution selector
5
+ * segments (__proto__, constructor, prototype). Each operation's traversal
6
+ * contract is explicit below; merely using this module is not a sandbox.
7
7
  *
8
8
  * Intentional asymmetry:
9
- * - nativeSet — DENIED check only at each segment. No hasOwnProperty
10
- * check is needed because writing always creates an OWN property on `curr`,
11
- * which cannot pollute the prototype chain.
12
- * - nativeGet / nativeHas — DENIED check + hasOwnProperty at every step.
13
- * Reads follow the prototype chain by default (bracket notation), so the
14
- * hasOwnProperty guard is required to prevent leaking inherited values
15
- * (e.g. Object.prototype, Object constructor, toString).
9
+ * - nativeSet — DENIED check at each segment; used on writer-owned
10
+ * containers. It can follow an inherited object under an ordinary key.
11
+ * - nativeGet — DENIED check + hasOwnProperty at every step.
12
+ * - nativeHas — own-property existence only, including own denied names
13
+ * and own undefined values; it does not use the DENIED rule.
16
14
  * - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
17
15
  * by spec so prototype keys never appear in the iteration.
18
16
  *
19
- * Do NOT "fix" the nativeSet asymmetry by adding hasOwnProperty — it is
20
- * intentional and would break path creation for new intermediate nodes.
17
+ * Nested diagnostic writers have their own whole-selector preflight and
18
+ * own-property writes in utils.ts, using the same isDeniedSegment predicate.
21
19
  *
22
20
  * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
23
21
  */
24
- /** Is `segment` one of the three prototype-pollution vectors every helper here refuses? */
22
+ /** Is `segment` one of the three denied prototype-pollution selector names? */
25
23
  export declare function isDeniedSegment(segment: string | number): boolean;
26
24
  /**
27
25
  * Get the value at `path` in `obj`, returning `defaultValue` if absent.
@@ -31,12 +31,21 @@ export declare function getRunAndGlobalPaths(address?: readonly string[], path?:
31
31
  runPath: (string | number)[] | undefined;
32
32
  globalPath: (string | number)[];
33
33
  };
34
+ /**
35
+ * Refuse the WHOLE selector before creating a container or copying a generation.
36
+ * The address's array contract is checked even when another selector is denied.
37
+ * Payload keys are data, not selectors, and are deliberately not inspected.
38
+ * @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
39
+ */
40
+ export declare function isDeniedWritePath(address: readonly string[] | undefined, path: readonly (string | number)[] | undefined, field: string | number): boolean;
34
41
  /**
35
42
  * Sets a value at a nested path under `address`, creating intermediate objects as needed.
43
+ * A denied address/path/field leaves `obj` unchanged, including its prototype.
36
44
  */
37
45
  export declare function setNestedValue<T>(obj: NestedObject, address: readonly string[], path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
38
46
  /**
39
- * Deep-merges a value into the object at a nested path under `address`.
47
+ * Updates a value in the object at a nested path under `address`.
48
+ * A denied address/path/field leaves `obj` unchanged, including its prototype.
40
49
  * - Arrays: concatenate
41
50
  * - Objects: shallow merge at each level
42
51
  * - Primitives: replace
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "9.48.0",
3
+ "version": "9.48.2",
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",
@@ -51,6 +51,9 @@
51
51
  "release:major": "bash scripts/release.sh major",
52
52
  "check:dup-types": "node scripts/check-dup-types.mjs",
53
53
  "check:layering": "node scripts/check-layering.mjs",
54
+ "check:record-tests": "node scripts/record-tests.mjs --check",
55
+ "check:trace-ready": "node scripts/trace-ready.mjs --check-e1",
56
+ "trace:ready": "node scripts/trace-ready.mjs",
54
57
  "check:doc-snippets": "node scripts/check-doc-snippets.mjs",
55
58
  "audit:family": "node scripts/audit-family-versions.mjs",
56
59
  "audit:consumers": "node scripts/audit-consumers.mjs",