footprintjs 9.23.2 → 9.23.3

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.
@@ -59,6 +59,7 @@
59
59
  * `liveView.ts`), over an {@link elementSink}. A fix lands in a leaf once.
60
60
  */
61
61
  import { shouldWrapWithProxy } from './allowlist.js';
62
+ import { rememberHandle } from './handles.js';
62
63
  import { liveGetTrap, liveInspectionTraps, liveObject, MemberCache } from './liveView.js';
63
64
  import { unwrapProxy } from './structuralWrite.js';
64
65
  import { elementSink, sinkDeleteTrap, sinkSetTrap } from './writeTraps.js';
@@ -202,12 +203,12 @@ function wrapElementMember(value, sink, path, visited) {
202
203
  function createElementProxy(raw, sink, segments, visited) {
203
204
  const members = new MemberCache();
204
205
  const live = () => liveObject(raw, sink.readAt(segments));
205
- return new Proxy(raw, {
206
+ return rememberHandle(new Proxy(raw, {
206
207
  get: liveGetTrap(live, segments, (value, path) => wrapElementMember(value, sink, path, visited), members),
207
208
  set: sinkSetTrap(sink, segments),
208
209
  deleteProperty: sinkDeleteTrap(sink, segments),
209
210
  ...liveInspectionTraps(live),
210
- });
211
+ }), live);
211
212
  }
212
213
  /**
213
214
  * Creates a Proxy over an array that intercepts mutating operations.
@@ -227,7 +228,8 @@ export function createArrayProxy(getCurrent, commit) {
227
228
  const read = getCurrent;
228
229
  const write = commit;
229
230
  const elements = new Map();
230
- return new Proxy(target, {
231
+ // The array handle's value is the current array itself (handles.ts).
232
+ return rememberHandle(new Proxy(target, {
231
233
  get(_target, prop) {
232
234
  if (typeof prop === 'string' && MUTATING_METHODS.has(prop))
233
235
  return mutatingMethod(read, write, prop);
@@ -256,6 +258,6 @@ export function createArrayProxy(getCurrent, commit) {
256
258
  has: (_target, prop) => Reflect.has(read(), prop),
257
259
  ownKeys: () => Reflect.ownKeys(read()),
258
260
  getOwnPropertyDescriptor: (_target, prop) => Object.getOwnPropertyDescriptor(read(), prop),
259
- });
261
+ }), read);
260
262
  }
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRiw4RUFBOEU7QUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsTUFBTTtJQUNOLFlBQVk7Q0FDYixDQUFDLENBQUM7QUFLSCxnRkFBZ0Y7QUFFaEY7c0VBQ3NFO0FBQ3RFLFNBQVMsT0FBTyxDQUFDLE9BQWtCLEVBQUUsSUFBcUI7SUFDeEQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM3RixDQUFDO0FBRUQsdUdBQXVH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LEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxLQUFLLFNBQVM7Z0JBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN4RCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixPQUFPLElBQUksQ0FBQyxDQUFDLGdGQUFnRjtRQUMvRixDQUFDO1FBQ0QsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLHdCQUF3QixFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztLQUMzRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9hcnJheVRyYXBzIC0tIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbiB2aWEgUHJveHkuXG4gKlxuICogV2hlbiBzY29wZS5pdGVtcyBpcyBhbiBhcnJheSwgd2UgcmV0dXJuIGEgUHJveHkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nXG4gKiBtZXRob2RzIChwdXNoLCBwb3AsIHNwbGljZSwgZXRjLikgQU5EIGluZGV4ZWQgYWNjZXNzLiBFYWNoIG11dGF0aW9uOlxuICogMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGFycmF5XG4gKiAyLiBBcHBsaWVzIHRoZSBtdXRhdGlvbiB0byB0aGUgY2xvbmVcbiAqIDMuIENvbW1pdHMgdGhlIG5ldyBhcnJheSB2aWEgdGhlIGNvbW1pdCBjYWxsYmFja1xuICpcbiAqIE5vbi1tdXRhdGluZyBtZXRob2RzIChtYXAsIGZpbHRlciwgZm9yRWFjaCwgZXRjLikgcGFzcyB0aHJvdWdoIHRvIHRoZVxuICogY3VycmVudCBhcnJheSBzbmFwc2hvdCB3aXRob3V0IGludGVyY2VwdGlvbi5cbiAqXG4gKiBUaGUgb3JpZ2luYWwgYXJyYXkgaW4gc3RhdGUgaXMgTkVWRVIgbXV0YXRlZCBkaXJlY3RseSAtLSBhbGwgd3JpdGVzIGdvXG4gKiB0aHJvdWdoIHRoZSBjb21taXQgY2FsbGJhY2sgd2hpY2ggY2FsbHMgc2V0VmFsdWUvdXBkYXRlVmFsdWUuXG4gKlxuICog4pSA4pSAIE9ubHkgdGhlIEFTU0lHTkVEIHZhbHVlIGlzIHVud3JhcHBlZCAoOS4yMy4wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIExhbmRtaW5lIDEgc2F5cyB0aGUgc2V0IHRyYXAgSlNPTi1yb3VuZC10cmlwcyB0aGUgdmFsdWUgdGhlIGNhbGxlciBoYW5kZWRcbiAqIGluLiBGb3IgYW4gYXJyYXkgdGhhdCBpcyB0aGUgaW5kZXgtYXNzaWduZWQgZWxlbWVudCwgYSBtdXRhdGluZyBtZXRob2Qnc1xuICogYXJndW1lbnRzIChgcHVzaCh4KWAsIGBzcGxpY2UoaSwgbiwgLi4uaXRlbXMpYCwgYGZpbGwoeClgKSwgb3IgdGhlIGxlYWYgYW5cbiAqIGVsZW1lbnQgcHJveHkgd3JpdGVzIOKAlCBhbmQgaXQgaXMgdW53cmFwcGVkIEhFUkUsIGF0IHRoZSB0cmFwIHRoYXQgcmVjZWl2ZXNcbiAqIGl0LiBUaGUgcmVidWlsdCBhcnJheSBpcyBoYW5kZWQgdG8gYGNvbW1pdGAgYXMgaXQgaXM6IGV2ZXJ5IHNpYmxpbmcgdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCB0b3VjaCBwYXNzZXMgdGhyb3VnaCBieSByZWZlcmVuY2UsIGBEYXRlYHMgYW5kIGBNYXBgc1xuICogaW50YWN0LiBVbnRpbCA5LjIzLjAgdGhlIGNvbW1pdCBjYWxsYmFja3Mgcm91bmQtdHJpcHBlZCB0aGUgV0hPTEUgcmVidWlsdFxuICogYXJyYXksIHdoaWNoIHN0cmluZ2lmaWVkIHVudG91Y2hlZCBzaWJsaW5ncyBhbmQgd2FzIE8oTikgcGVyIGVsZW1lbnQgd3JpdGUuXG4gKiBUaGUgb25lIHRoaW5nIHRoZSByb3VuZC10cmlwIHVzZWQgdG8gZG8gZm9yIHRoZSBhcnJheSdzIG93biBzaGFwZSDigJQgYW5cbiAqIGVtcHRpZWQgb3Igc2tpcHBlZCBzbG90IGJlY2FtZSBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUg4oCUXG4gKiBpcyBub3cgZG9uZSBleHBsaWNpdGx5IGJ5IHRoZSB0cmFwcyB0aGF0IGNhbiBjcmVhdGUgb25lIChgZGVsZXRlIGFycltpXWAsXG4gKiBgYXJyW2ldID0gdmAgcGFzdCB0aGUgZW5kLCBgYXJyLmxlbmd0aCA9IG5gIGdyb3d0aCkuXG4gKlxuICog4pSA4pSAIEluZGV4ZWQgYWNjZXNzIGlzIHBhcnQgb2YgdGhlIGNoYWluICg5LjIyLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGFycltpXWAgdXNlZCB0byBoYW5kIGJhY2sgdGhlIFJBVyBlbGVtZW50LCB3aGljaCBicm9rZSB0aGUgcHJveHkgY2hhaW4gYXRcbiAqIGV4YWN0bHkgdGhlIHBvaW50IHVzZXJzIHdyaXRlIHRocm91Z2ggaXQ6IGBvcmRlci5saW5lc1swXS5xdHkgPSA0YCB3YXMgYW5cbiAqIGluLXBsYWNlIG11dGF0aW9uIG9mIGEgYm9ycm93ZWQgcmVhZCDigJQgbm8gdHJhcCwgbm8gdHJhY2Ugcm93LCBubyBjb21taXQuXG4gKiBCZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIHRoYXQgYm9ycm93ZWQgdmFsdWUgSVMgY29tbWl0dGVkXG4gKiBzaGFyZWQgbWVtb3J5LCBzbyB0aGUgbXV0YXRpb24gbW92ZWQgc3RhdGUgd2hpbGUgdGhlIGxvZyBzdGF5ZWQgZW1wdHk7IGFmdGVyXG4gKiBpdCwgdGhlIG11dGF0aW9uIGxhbmRlZCBpbiB0aGUgcHJpdmF0ZSBidWZmZXIgY2xvbmUgYW5kIHdhcyBkcm9wcGVkLiBTYW1lXG4gKiBleHByZXNzaW9uLCB0d28gc2lsZW50IG91dGNvbWVzLlxuICpcbiAqIE5vdyBhbiBpbmRleGVkIHJlYWQgb2YgYSB3cmFwcGFibGUgZWxlbWVudCByZXR1cm5zIGFuIEVMRU1FTlQgUFJPWFkgdGhhdFxuICogYWNjdW11bGF0ZXMgdGhlIHBhdGggaW5zaWRlIHRoZSBlbGVtZW50IGFuZCwgb24gd3JpdGUsIHJlYnVpbGRzIHRoZSBhcnJheVxuICogaW1tdXRhYmx5IChgc3RydWN0dXJhbFdyaXRlLnNldEluUGF0aGAsIGJlaGluZCBgd3JpdGVUcmFwcy5lbGVtZW50U2lua2ApXG4gKiBhbmQgaGFuZHMgdGhlIHdob2xlIG5ldyBhcnJheSB0byBgY29tbWl0YCDigJQgdGhlIHNhbWUgZnVubmVsIGBwdXNoYCBhbHJlYWR5XG4gKiB1c2VkLiBPbmUgd3JpdGUgcGF0aCBmb3IgdGhlIHdob2xlIGFycmF5LCB3aGF0ZXZlciBkZXB0aCBpdCBpcyBhZGRyZXNzZWQgYXQuXG4gKlxuICog4pSA4pSAIFdoYXQgaXMgc3RpbGwgTk9UIHNlZW4gKGJ5IGRlc2lnbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBFbGVtZW50cyByZWFjaGVkIFdJVEhPVVQgYW4gaW5kZXgg4oCUIGBmaW5kKClgLCBgZmlsdGVyKClgLCBgZm9y4oCmb2ZgLFxuICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nIOKAlCBhcmUgaGFuZGVkIGJhY2sgcmF3LCBiZWNhdXNlIHdyYXBwaW5nIHRoZW0gd291bGRcbiAqIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mIGV2ZXJ5IHJlYWQgbWV0aG9kIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheVxuICogb2YgcHJveGllcykgZm9yIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gTXV0YXRpbmcgb25lIG9mIHRob3NlIGlzXG4gKiBub3QgbG9zdCBpbiBzaWxlbmNlIGVpdGhlcjogYFN0YWdlQ29udGV4dGAgY29tcGFyZXMgd2hhdCBhIHN0YWdlIFJFQUQgd2l0aFxuICogd2hhdCB0aGUgdmFsdWUgaG9sZHMgYXQgY29tbWl0IGFuZCwgaW4gZGV2IG1vZGUsIHdhcm5zIHdpdGggdGhlIGV4YWN0IHBhdGguXG4gKiBTZWUgc3JjL2xpYi9yZWFjdGl2ZS9SRUFETUUubWQuXG4gKlxuICog4pSA4pSAIFNoYXBlICg5LjIzLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGNyZWF0ZUFycmF5UHJveHlgIGFuZCBgY3JlYXRlRWxlbWVudFByb3h5YCBhcmUgT1JDSEVTVFJBVE9SUzogdGhleSB3aXJlXG4gKiB0cmFwcyBhbmQgaG9sZCB0aGUgY2FjaGVzLiBFdmVyeSB0cmFwIGJvZHkgaXMgYSBuYW1lZCBsZWFmIGJlbG93IOKAlCBvbmVcbiAqIGNvbmNlcm4gZWFjaCDigJQgYW5kIHRoZSBlbGVtZW50IHByb3h5J3Mgc2V0L2RlbGV0ZS9nZXQgdHJhcHMgYXJlIHRoZSBTQU1FXG4gKiBsZWF2ZXMgdGhlIG5lc3RlZCBhbmQgdGVybWluYWwgb2JqZWN0IHByb3hpZXMgdXNlIChgd3JpdGVUcmFwcy50c2AsXG4gKiBgbGl2ZVZpZXcudHNgKSwgb3ZlciBhbiB7QGxpbmsgZWxlbWVudFNpbmt9LiBBIGZpeCBsYW5kcyBpbiBhIGxlYWYgb25jZS5cbiAqL1xuXG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgeyB1bndyYXBQcm94eSB9IGZyb20gJy4vc3RydWN0dXJhbFdyaXRlLmpzJztcbmltcG9ydCB7IHR5cGUgV3JpdGVTaW5rLCBlbGVtZW50U2luaywgc2lua0RlbGV0ZVRyYXAsIHNpbmtTZXRUcmFwIH0gZnJvbSAnLi93cml0ZVRyYXBzLmpzJztcblxuLyoqIE1ldGhvZHMgdGhhdCBtdXRhdGUgdGhlIGFycmF5IGluLXBsYWNlLiBXZSBpbnRlcmNlcHQgYW5kIGNvcHktb24td3JpdGUuICovXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnLFxuICAnZmlsbCcsXG4gICdjb3B5V2l0aGluJyxcbl0pO1xuXG50eXBlIFJlYWQgPSAoKSA9PiB1bmtub3duW107XG50eXBlIFdyaXRlID0gKG5leHQ6IHVua25vd25bXSkgPT4gdm9pZDtcblxuLy8gLS0gTGVhdmVzOiByZWFkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdIWSBgTnVtYmVyKHByb3ApYDogdGhlIGhpc3RvcmljYWwgcmVhZGluZyBvZiBhbiBpbmRleCBuYW1lIOKAlCBgJzAxJ2AgYW5kXG4gKiAgYCcnYCBhZGRyZXNzIHNsb3RzIDEgYW5kIDAsIGFzIHRoZXkgYWx3YXlzIGhhdmUuIEluIHJhbmdlIG9ubHkuICovXG5mdW5jdGlvbiBpbmRleEluKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIocHJvcCk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY3VycmVudC5sZW5ndGggPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgaW5kZXggbmFtZWQgYnkgYHByb3BgIChhbnkgcmFuZ2Ug4oCUIGEgd3JpdGUgcGFzdCB0aGUgZW5kIGdyb3dzIHRoZSBhcnJheSkuICovXG5mdW5jdGlvbiBpbmRleE5hbWVkKHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCA/IGluZGV4IDogdW5kZWZpbmVkO1xufVxuXG4vKiogV0hZOiBhIG5vbi1tdXRhdGluZyByZWFkIGFuc3dlcnMgZnJvbSB0aGUgQ1VSUkVOVCBhcnJheSwgbmV2ZXIgdGhlXG4gKiAgY3JlYXRpb24tdGltZSB0YXJnZXQg4oCUIGEgbWV0aG9kIGlzIGJvdW5kIHRvIGl0LCBhbnl0aGluZyBlbHNlIHJlYWQgb2ZmIGl0LiAqL1xuZnVuY3Rpb24gYm91bmRNZW1iZXIoY3VycmVudDogdW5rbm93bltdLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgY29uc3QgdmFsID0gKGN1cnJlbnQgYXMgYW55KVtwcm9wXTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgPyB2YWwuYmluZChjdXJyZW50KSA6IHZhbDtcbn1cblxudHlwZSBFbGVtZW50Q2FjaGUgPSBNYXA8bnVtYmVyLCB7IHJlZjogdW5rbm93bjsgcHJveHk6IHVua25vd24gfT47XG5cbi8qKiBXSFkgdGhlIGNhY2hlOiByZWFkaW5nIGBsaW5lc1tpXS5xdHlgIGluIGEgbG9vcCBtdXN0IG5vdCBhbGxvY2F0ZSBhIHByb3h5XG4gKiAgcGVyIHJlYWQsIGFuZCBgbGluZXNbMF0gPT09IGxpbmVzWzBdYCBtdXN0IGhvbGQgd2l0aGluIGEgc3RhZ2UuIFZhbGlkYXRlZCBieVxuICogIHJhdyBpZGVudGl0eSDigJQgYSBjb21taXQgcmVwbGFjZXMgdGhlIGFycmF5LCB0aGUgcmVmIGNoZWNrIG1pc3NlcywgYW5kIGFcbiAqICBmcmVzaCBwcm94eSBpcyBidWlsdCBvdmVyIHRoZSBuZXcgZWxlbWVudC4gQSBwcmltaXRpdmUgaXMgaGFuZGVkIGJhY2sgcmF3LiAqL1xuZnVuY3Rpb24gY2FjaGVkRWxlbWVudChjYWNoZTogRWxlbWVudENhY2hlLCBlbGVtZW50OiB1bmtub3duLCBpbmRleDogbnVtYmVyLCByZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUpOiB1bmtub3duIHtcbiAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVmID09PSBlbGVtZW50KSByZXR1cm4gY2FjaGVkLnByb3h5O1xuICBjb25zdCB3cmFwcGVkID0gd3JhcEVsZW1lbnRNZW1iZXIoZWxlbWVudCwgZWxlbWVudFNpbmsocmVhZCwgd3JpdGUsIGluZGV4KSwgW10sIG5ldyBTZXQ8b2JqZWN0PigpKTtcbiAgY2FjaGUuc2V0KGluZGV4LCB7IHJlZjogZWxlbWVudCwgcHJveHk6IHdyYXBwZWQgfSk7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHdyaXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2xvdHMgZnJvbSB0aGUgY3VycmVudCBlbmQgdXAgdG8gKG5vdCBpbmNsdWRpbmcpIGB1cFRvYCBiZWNvbWUgYG51bGxgIOKAlFxuICogIHRoZSBKU09OIHNwZWxsaW5nIG9mIGEgaG9sZSwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtYXJyYXkgcm91bmQtdHJpcCB1c2VkXG4gKiAgdG8gcHJvZHVjZSBmb3IgdGhlbS4gTm8tb3Agd2hlbiBgdXBUb2AgaXMgd2l0aGluIHRoZSBhcnJheS4gKi9cbmZ1bmN0aW9uIGZpbGxIb2xlcyhhcnI6IHVua25vd25bXSwgdXBUbzogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoOyBpIDwgdXBUbzsgaSsrKSBhcnJbaV0gPSBudWxsO1xufVxuXG4vKiogV0hZOiBhIG11dGF0aW5nIG1ldGhvZCBydW5zIG9uIGEgQ09QWSwgd2l0aCBpdHMgYXJndW1lbnRzIHVud3JhcHBlZCAodGhleVxuICogIGFyZSB0aGUgYXNzaWduZWQgdmFsdWVzOyBhIG51bWJlciBvciBhIGNvbXBhcmF0b3IgcGFzc2VzIHRocm91Z2gpLCBhbmQgdGhlXG4gKiAgY29weSBpcyBjb21taXR0ZWQgd2hvbGUuIFRoZSBhcnJheSBpbiBzdGF0ZSBpcyBuZXZlciB0b3VjaGVkLiAqL1xuZnVuY3Rpb24gbXV0YXRpbmdNZXRob2QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBuYW1lOiBzdHJpbmcpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgICBjb25zdCByZXN1bHQgPSAoY2xvbmUgYXMgYW55KVtuYW1lXSguLi5hcmdzLm1hcCh1bndyYXBQcm94eSkpO1xuICAgIHdyaXRlKGNsb25lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKiogYGFycltpXSA9IHZgOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGEgd3JpdGUgcGFzdCB0aGUgZW5kIHNraXBzLCBwbGFjZSB0aGUgdW53cmFwcGVkIHZhbHVlLCBjb21taXQuICovXG5mdW5jdGlvbiBzZXRJbmRleChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGluZGV4OiBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgaW5kZXgpO1xuICBjbG9uZVtpbmRleF0gPSB1bndyYXBQcm94eSh2YWx1ZSk7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIGBhcnIubGVuZ3RoID0gbmA6IGNvcHksIGBudWxsYCB0aGUgc2xvdHMgZ3Jvd3RoIGFkZHMsIHRydW5jYXRlIG9yIGV4dGVuZCwgY29tbWl0LiAqL1xuZnVuY3Rpb24gc2V0TGVuZ3RoKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgZmlsbEhvbGVzKGNsb25lLCBsZW5ndGgpO1xuICBjbG9uZS5sZW5ndGggPSBsZW5ndGg7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIFdIWTogd2l0aG91dCB0aGlzIHRyYXAgYGRlbGV0ZSBpdGVtc1syXWAgcmVhY2hlcyB0aGUgUkFXIGFycmF5IGNhcHR1cmVkXG4gKiAgYXMgdGhlIHByb3h5IHRhcmdldCDigJQgY29tbWl0dGVkIHN0YXRlLCBubyBjb21taXQgcmVjb3JkLiBKUyBgZGVsZXRlYCBvbiBhblxuICogIGluZGV4IGxlYXZlcyB0aGUgc2xvdCBlbXB0eSBhbmQgdGhlIGxlbmd0aCB1bmNoYW5nZWQsIGFuZCBzbyBkb2VzIHRoaXM6XG4gKiAgdGhlIGVtcHRpZWQgc2xvdCBjb21taXRzIGFzIGBudWxsYCwgSlNPTidzIG9ubHkgc3BlbGxpbmcgZm9yIGEgaG9sZS4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVNsb3QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgY29uc3QgaW5kZXggPSB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgPyBOdW1iZXIocHJvcCkgOiBOYU47XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY2xvbmUubGVuZ3RoKSBjbG9uZVtpbmRleF0gPSBudWxsO1xuICBlbHNlIGRlbGV0ZSAoY2xvbmUgYXMgYW55KVtwcm9wXTtcbiAgd3JpdGUoY2xvbmUpO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHRoZSBjaGFpbiBiZWxvdyBhbiBlbGVtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogV0hZOiBhbiBhcnJheSBhbnl3aGVyZSBiZWxvdyBhIHNpbmsncyByb290IGlzIE9ORSB3cml0ZSBwYXRoIOKAlCBpdCByZWFkc1xuICogdGhyb3VnaCB0aGUgc2luayBhbmQgY29tbWl0cyB0aGUgV0hPTEUgbmV3IGFycmF5IGJhY2sgdGhyb3VnaCBpdCwgc29cbiAqIGBwdXNoYCB0aHJlZSBsZXZlbHMgZG93biBhbmQgYGFycltpXS54ID0gdmAgYXQgdGhlIHRvcCBzaGFyZSBhIGZ1bm5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5UHJveHlBdChzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIGNyZWF0ZUFycmF5UHJveHkoXG4gICAgKCkgPT4gKHNpbmsucmVhZEF0KHBhdGgpIGFzIHVua25vd25bXSkgPz8gW10sXG4gICAgKG5leHQpID0+IHNpbmsucHV0KHBhdGgsIG5leHQpLFxuICApO1xufVxuXG4vKipcbiAqIFdyYXAgYSB2YWx1ZSByZWFkIG91dCBvZiBhbiBlbGVtZW50OiBhcnJheXMgYmVjb21lIGFycmF5IHByb3hpZXMgd2hvc2VcbiAqIGNvbW1pdHMgcm91dGUgYmFjayB0aHJvdWdoIHRoZSBvd25pbmcgYXJyYXksIHBsYWluIG9iamVjdHMgYmVjb21lIGVsZW1lbnRcbiAqIHByb3hpZXMgb25lIGxldmVsIGRlZXBlciwgZXZlcnl0aGluZyBlbHNlIGlzIHJldHVybmVkIGFzLWlzLiBBIHZhbHVlIGFscmVhZHlcbiAqIG9uIHRoZSBhY2Nlc3MgY2hhaW4gKGEgY3ljbGUpIGlzIHJldHVybmVkIHJhdyDigJQgdGhlIHNhbWUgYmFjay1lZGdlIHRoZVxuICogbmVzdGVkLW9iamVjdCB0ZXJtaW5hbCBwcm94eSB0YWtlcy5cbiAqL1xuZnVuY3Rpb24gd3JhcEVsZW1lbnRNZW1iZXIodmFsdWU6IHVua25vd24sIHNpbms6IFdyaXRlU2luaywgcGF0aDogc3RyaW5nW10sIHZpc2l0ZWQ6IFNldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgYnJhbmNoID0gbmV3IFNldCh2aXNpdGVkKTtcbiAgYnJhbmNoLmFkZCh2YWx1ZSBhcyBvYmplY3QpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50UHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIGJyYW5jaCk7XG59XG5cbi8vIC0tIE9yY2hlc3RyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUHJveHkgb3ZlciBvbmUgT0JKRUNUIGVsZW1lbnQgKG9yIGFuIG9iamVjdCBuZXN0ZWQgaW5zaWRlIG9uZSksIGNhcnJ5aW5nIHRoZVxuICogcGF0aCBmcm9tIHRoZSBlbGVtZW50IGRvd24gdG8gaXQuIFJlYWRzIHJlY3Vyc2U7IHdyaXRlcyBnbyBiYWNrIG91dCB0aHJvdWdoXG4gKiB0aGUgb3duaW5nIGFycmF5J3MgY29tbWl0IGNhbGxiYWNrICh0aGUge0BsaW5rIGVsZW1lbnRTaW5rfSkuXG4gKlxuICogUkVBRFMgQVJFIExJVkUuIEV2ZXJ5IHdyaXRlIHJlYnVpbGRzIHRoZSBhcnJheSBpbW11dGFibHksIHNvIHRoZSBvYmplY3QgdGhlXG4gKiBwcm94eSB3YXMgY3JlYXRlZCBvdmVyIGlzIHRoZSBQUkUtd3JpdGUgZWxlbWVudCBmb3IgZXZlciBhZnRlcjsgYSBoZWxkXG4gKiBoYW5kbGUgdGhhdCByZWFkIGZyb20gaXQgc2F3IGl0cyBvd24gd3JpdGVzIHZhbmlzaCAoYGxpbmUubiArPSAxYCB0d2ljZVxuICogZ2F2ZSAyLCBgbGluZS50b3RhbCA9IGxpbmUucXR5ICogMTBgIHVzZWQgdGhlIG9sZCBgcXR5YCwgYCd4JyBpbiBsaW5lYCB3YXNcbiAqIGZhbHNlIHJpZ2h0IGFmdGVyIGBsaW5lLnggPSAxYCkuIEV2ZXJ5IHRyYXAgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSBlbGVtZW50XG4gKiB0aHJvdWdoIHRoZSBzaW5rIGZpcnN0LCBhbmQgZmFsbHMgYmFjayB0byB0aGUgY2FwdHVyZWQgb2JqZWN0IG9ubHkgd2hlblxuICogdGhlIHBhdGggbm8gbG9uZ2VyIGV4aXN0cyAodGhlIHNsb3Qgd2FzIGVtcHRpZWQgb3IgdGhlIGFycmF5IHNocmFuaykg4oCUIHRoZVxuICogc2FtZSByZWFkLXlvdXItd3JpdGVzIHRoZSBhcnJheSBwcm94eSBpdHNlbGYgaGFzIGFsd2F5cyBoYWQsIGFuZCB0aGUgc2FtZVxuICogbGF3IHRoZSBuZXN0ZWQgYW5kIHRlcm1pbmFsIG9iamVjdCBwcm94aWVzIGZvbGxvdyAobGl2ZVZpZXcudHMpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50UHJveHkoXG4gIHJhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0Pixcbik6IHVua25vd24ge1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KHJhdywgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgcmV0dXJuIG5ldyBQcm94eShyYXcsIHtcbiAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCAodmFsdWUsIHBhdGgpID0+IHdyYXBFbGVtZW50TWVtYmVyKHZhbHVlLCBzaW5rLCBwYXRoLCB2aXNpdGVkKSwgbWVtYmVycyksXG4gICAgc2V0OiBzaW5rU2V0VHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgb3ZlciBhbiBhcnJheSB0aGF0IGludGVyY2VwdHMgbXV0YXRpbmcgb3BlcmF0aW9ucy5cbiAqXG4gKiBUaGUgYWN0dWFsIGN1cnJlbnQgYXJyYXkgaXMgdGhlIFByb3h5IHRhcmdldDogTm9kZS5qcyBjb25zb2xlLmxvZyBpbnNwZWN0c1xuICogdGhlIHRhcmdldCBkaXJlY3RseSAoYnlwYXNzZXMgUHJveHkgdHJhcHMpLCBzbyB0aGUgcmVhbCBhcnJheSBzaG93cyBjb3JyZWN0XG4gKiB2YWx1ZXMuIFRoZSB0YXJnZXQgcmVmZXJlbmNlIGlzIGZpeGVkIGF0IGNyZWF0aW9uIHRpbWUg4oCUIGFmdGVyIG11dGF0aW9ucyxcbiAqIHRoZSBwcm94eSByZXR1cm5zIGEgbmV3IHByb3h5ICh2aWEgY2FjaGUgaW52YWxpZGF0aW9uKSB3aXRoIHRoZSBmcmVzaCBhcnJheVxuICogYXMgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBnZXRDdXJyZW50IC0gUmV0dXJucyB0aGUgY3VycmVudCBhcnJheSBzbmFwc2hvdCBmcm9tIHN0YXRlXG4gKiBAcGFyYW0gY29tbWl0IC0gQ2FsbGVkIHdpdGggdGhlIG5ldyBhcnJheSBhZnRlciBhIG11dGF0aW9uICh0cmlnZ2VycyBzZXRWYWx1ZSlcbiAqIEByZXR1cm5zIFByb3hpZWQgYXJyYXkgd2l0aCBjb3B5LW9uLXdyaXRlIHNlbWFudGljc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJyYXlQcm94eTxUPihnZXRDdXJyZW50OiAoKSA9PiBUW10sIGNvbW1pdDogKG5ld0FycmF5OiBUW10pID0+IHZvaWQpOiBUW10ge1xuICBjb25zdCB0YXJnZXQgPSBnZXRDdXJyZW50KCkgYXMgVFtdO1xuICBjb25zdCByZWFkID0gZ2V0Q3VycmVudCBhcyB1bmtub3duIGFzIFJlYWQ7XG4gIGNvbnN0IHdyaXRlID0gY29tbWl0IGFzIHVua25vd24gYXMgV3JpdGU7XG4gIGNvbnN0IGVsZW1lbnRzOiBFbGVtZW50Q2FjaGUgPSBuZXcgTWFwKCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBNVVRBVElOR19NRVRIT0RTLmhhcyhwcm9wKSkgcmV0dXJuIG11dGF0aW5nTWV0aG9kKHJlYWQsIHdyaXRlLCBwcm9wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWFkKCk7XG4gICAgICBpZiAocHJvcCA9PT0gJ2xlbmd0aCcpIHJldHVybiBjdXJyZW50Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhJbihjdXJyZW50LCBwcm9wKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkRWxlbWVudChlbGVtZW50cywgY3VycmVudFtpbmRleF0sIGluZGV4LCByZWFkLCB3cml0ZSk7XG4gICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IGN1cnJlbnQ7XG4gICAgICByZXR1cm4gYm91bmRNZW1iZXIoY3VycmVudCwgcHJvcCk7XG4gICAgfSxcbiAgICBzZXQoX3RhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhOYW1lZChwcm9wKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSBzZXRJbmRleChyZWFkLCB3cml0ZSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHByb3AgPT09ICdsZW5ndGgnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHNldExlbmd0aChyZWFkLCB3cml0ZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBzZXQgaXMgaWdub3JlZCAoYW4gZXhwYW5kbyBvbiBhbiBhcnJheSBpcyBvdXQgb2YgY29udHJhY3Qg4oCUIFJFQURNRSlcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIHByb3ApIHtcbiAgICAgIGRlbGV0ZVNsb3QocmVhZCwgd3JpdGUsIHByb3ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiBSZWZsZWN0LmhhcyhyZWFkKCksIHByb3ApLFxuICAgIG93bktleXM6ICgpID0+IFJlZmxlY3Qub3duS2V5cyhyZWFkKCkpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKF90YXJnZXQsIHByb3ApID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVhZCgpLCBwcm9wKSxcbiAgfSk7XG59XG4iXX0=
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlUcmFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvYXJyYXlUcmFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNGLDhFQUE4RTtBQUM5RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQy9CLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sWUFBWTtDQUNiLENBQUMsQ0FBQztBQUtILGdGQUFnRjtBQUVoRjtzRUFDc0U7QUFDdEUsU0FBUyxPQUFPLENBQUMsT0FBa0IsRUFBRSxJQUFxQjtJQUN4RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxD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QUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUs7WUFDdEIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxLQUFLLFNBQVM7Z0JBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN4RCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixPQUFPLElBQUksQ0FBQyxDQUFDLGdGQUFnRjtRQUMvRixDQUFDO1FBQ0QsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJO1lBQzFCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLHdCQUF3QixFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztLQUMzRixDQUFDLEVBQ0YsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS9hcnJheVRyYXBzIC0tIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbiB2aWEgUHJveHkuXG4gKlxuICogV2hlbiBzY29wZS5pdGVtcyBpcyBhbiBhcnJheSwgd2UgcmV0dXJuIGEgUHJveHkgdGhhdCBpbnRlcmNlcHRzIG11dGF0aW5nXG4gKiBtZXRob2RzIChwdXNoLCBwb3AsIHNwbGljZSwgZXRjLikgQU5EIGluZGV4ZWQgYWNjZXNzLiBFYWNoIG11dGF0aW9uOlxuICogMS4gQ2xvbmVzIHRoZSBjdXJyZW50IGFycmF5XG4gKiAyLiBBcHBsaWVzIHRoZSBtdXRhdGlvbiB0byB0aGUgY2xvbmVcbiAqIDMuIENvbW1pdHMgdGhlIG5ldyBhcnJheSB2aWEgdGhlIGNvbW1pdCBjYWxsYmFja1xuICpcbiAqIE5vbi1tdXRhdGluZyBtZXRob2RzIChtYXAsIGZpbHRlciwgZm9yRWFjaCwgZXRjLikgcGFzcyB0aHJvdWdoIHRvIHRoZVxuICogY3VycmVudCBhcnJheSBzbmFwc2hvdCB3aXRob3V0IGludGVyY2VwdGlvbi5cbiAqXG4gKiBUaGUgb3JpZ2luYWwgYXJyYXkgaW4gc3RhdGUgaXMgTkVWRVIgbXV0YXRlZCBkaXJlY3RseSAtLSBhbGwgd3JpdGVzIGdvXG4gKiB0aHJvdWdoIHRoZSBjb21taXQgY2FsbGJhY2sgd2hpY2ggY2FsbHMgc2V0VmFsdWUvdXBkYXRlVmFsdWUuXG4gKlxuICog4pSA4pSAIE9ubHkgdGhlIEFTU0lHTkVEIHZhbHVlIGlzIHVud3JhcHBlZCAoOS4yMy4wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIExhbmRtaW5lIDEgc2F5cyB0aGUgc2V0IHRyYXAgSlNPTi1yb3VuZC10cmlwcyB0aGUgdmFsdWUgdGhlIGNhbGxlciBoYW5kZWRcbiAqIGluLiBGb3IgYW4gYXJyYXkgdGhhdCBpcyB0aGUgaW5kZXgtYXNzaWduZWQgZWxlbWVudCwgYSBtdXRhdGluZyBtZXRob2Qnc1xuICogYXJndW1lbnRzIChgcHVzaCh4KWAsIGBzcGxpY2UoaSwgbiwgLi4uaXRlbXMpYCwgYGZpbGwoeClgKSwgb3IgdGhlIGxlYWYgYW5cbiAqIGVsZW1lbnQgcHJveHkgd3JpdGVzIOKAlCBhbmQgaXQgaXMgdW53cmFwcGVkIEhFUkUsIGF0IHRoZSB0cmFwIHRoYXQgcmVjZWl2ZXNcbiAqIGl0LiBUaGUgcmVidWlsdCBhcnJheSBpcyBoYW5kZWQgdG8gYGNvbW1pdGAgYXMgaXQgaXM6IGV2ZXJ5IHNpYmxpbmcgdGhlXG4gKiBjYWxsZXIgZGlkIG5vdCB0b3VjaCBwYXNzZXMgdGhyb3VnaCBieSByZWZlcmVuY2UsIGBEYXRlYHMgYW5kIGBNYXBgc1xuICogaW50YWN0LiBVbnRpbCA5LjIzLjAgdGhlIGNvbW1pdCBjYWxsYmFja3Mgcm91bmQtdHJpcHBlZCB0aGUgV0hPTEUgcmVidWlsdFxuICogYXJyYXksIHdoaWNoIHN0cmluZ2lmaWVkIHVudG91Y2hlZCBzaWJsaW5ncyBhbmQgd2FzIE8oTikgcGVyIGVsZW1lbnQgd3JpdGUuXG4gKiBUaGUgb25lIHRoaW5nIHRoZSByb3VuZC10cmlwIHVzZWQgdG8gZG8gZm9yIHRoZSBhcnJheSdzIG93biBzaGFwZSDigJQgYW5cbiAqIGVtcHRpZWQgb3Igc2tpcHBlZCBzbG90IGJlY2FtZSBgbnVsbGAsIEpTT04ncyBvbmx5IHNwZWxsaW5nIGZvciBhIGhvbGUg4oCUXG4gKiBpcyBub3cgZG9uZSBleHBsaWNpdGx5IGJ5IHRoZSB0cmFwcyB0aGF0IGNhbiBjcmVhdGUgb25lIChgZGVsZXRlIGFycltpXWAsXG4gKiBgYXJyW2ldID0gdmAgcGFzdCB0aGUgZW5kLCBgYXJyLmxlbmd0aCA9IG5gIGdyb3d0aCkuXG4gKlxuICog4pSA4pSAIEluZGV4ZWQgYWNjZXNzIGlzIHBhcnQgb2YgdGhlIGNoYWluICg5LjIyLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGFycltpXWAgdXNlZCB0byBoYW5kIGJhY2sgdGhlIFJBVyBlbGVtZW50LCB3aGljaCBicm9rZSB0aGUgcHJveHkgY2hhaW4gYXRcbiAqIGV4YWN0bHkgdGhlIHBvaW50IHVzZXJzIHdyaXRlIHRocm91Z2ggaXQ6IGBvcmRlci5saW5lc1swXS5xdHkgPSA0YCB3YXMgYW5cbiAqIGluLXBsYWNlIG11dGF0aW9uIG9mIGEgYm9ycm93ZWQgcmVhZCDigJQgbm8gdHJhcCwgbm8gdHJhY2Ugcm93LCBubyBjb21taXQuXG4gKiBCZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIHRoYXQgYm9ycm93ZWQgdmFsdWUgSVMgY29tbWl0dGVkXG4gKiBzaGFyZWQgbWVtb3J5LCBzbyB0aGUgbXV0YXRpb24gbW92ZWQgc3RhdGUgd2hpbGUgdGhlIGxvZyBzdGF5ZWQgZW1wdHk7IGFmdGVyXG4gKiBpdCwgdGhlIG11dGF0aW9uIGxhbmRlZCBpbiB0aGUgcHJpdmF0ZSBidWZmZXIgY2xvbmUgYW5kIHdhcyBkcm9wcGVkLiBTYW1lXG4gKiBleHByZXNzaW9uLCB0d28gc2lsZW50IG91dGNvbWVzLlxuICpcbiAqIE5vdyBhbiBpbmRleGVkIHJlYWQgb2YgYSB3cmFwcGFibGUgZWxlbWVudCByZXR1cm5zIGFuIEVMRU1FTlQgUFJPWFkgdGhhdFxuICogYWNjdW11bGF0ZXMgdGhlIHBhdGggaW5zaWRlIHRoZSBlbGVtZW50IGFuZCwgb24gd3JpdGUsIHJlYnVpbGRzIHRoZSBhcnJheVxuICogaW1tdXRhYmx5IChgc3RydWN0dXJhbFdyaXRlLnNldEluUGF0aGAsIGJlaGluZCBgd3JpdGVUcmFwcy5lbGVtZW50U2lua2ApXG4gKiBhbmQgaGFuZHMgdGhlIHdob2xlIG5ldyBhcnJheSB0byBgY29tbWl0YCDigJQgdGhlIHNhbWUgZnVubmVsIGBwdXNoYCBhbHJlYWR5XG4gKiB1c2VkLiBPbmUgd3JpdGUgcGF0aCBmb3IgdGhlIHdob2xlIGFycmF5LCB3aGF0ZXZlciBkZXB0aCBpdCBpcyBhZGRyZXNzZWQgYXQuXG4gKlxuICog4pSA4pSAIFdoYXQgaXMgc3RpbGwgTk9UIHNlZW4gKGJ5IGRlc2lnbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBFbGVtZW50cyByZWFjaGVkIFdJVEhPVVQgYW4gaW5kZXgg4oCUIGBmaW5kKClgLCBgZmlsdGVyKClgLCBgZm9y4oCmb2ZgLFxuICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nIOKAlCBhcmUgaGFuZGVkIGJhY2sgcmF3LCBiZWNhdXNlIHdyYXBwaW5nIHRoZW0gd291bGRcbiAqIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mIGV2ZXJ5IHJlYWQgbWV0aG9kIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheVxuICogb2YgcHJveGllcykgZm9yIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gTXV0YXRpbmcgb25lIG9mIHRob3NlIGlzXG4gKiBub3QgbG9zdCBpbiBzaWxlbmNlIGVpdGhlcjogYFN0YWdlQ29udGV4dGAgY29tcGFyZXMgd2hhdCBhIHN0YWdlIFJFQUQgd2l0aFxuICogd2hhdCB0aGUgdmFsdWUgaG9sZHMgYXQgY29tbWl0IGFuZCwgaW4gZGV2IG1vZGUsIHdhcm5zIHdpdGggdGhlIGV4YWN0IHBhdGguXG4gKiBTZWUgc3JjL2xpYi9yZWFjdGl2ZS9SRUFETUUubWQuXG4gKlxuICog4pSA4pSAIFNoYXBlICg5LjIzLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICogYGNyZWF0ZUFycmF5UHJveHlgIGFuZCBgY3JlYXRlRWxlbWVudFByb3h5YCBhcmUgT1JDSEVTVFJBVE9SUzogdGhleSB3aXJlXG4gKiB0cmFwcyBhbmQgaG9sZCB0aGUgY2FjaGVzLiBFdmVyeSB0cmFwIGJvZHkgaXMgYSBuYW1lZCBsZWFmIGJlbG93IOKAlCBvbmVcbiAqIGNvbmNlcm4gZWFjaCDigJQgYW5kIHRoZSBlbGVtZW50IHByb3h5J3Mgc2V0L2RlbGV0ZS9nZXQgdHJhcHMgYXJlIHRoZSBTQU1FXG4gKiBsZWF2ZXMgdGhlIG5lc3RlZCBhbmQgdGVybWluYWwgb2JqZWN0IHByb3hpZXMgdXNlIChgd3JpdGVUcmFwcy50c2AsXG4gKiBgbGl2ZVZpZXcudHNgKSwgb3ZlciBhbiB7QGxpbmsgZWxlbWVudFNpbmt9LiBBIGZpeCBsYW5kcyBpbiBhIGxlYWYgb25jZS5cbiAqL1xuXG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgcmVtZW1iZXJIYW5kbGUgfSBmcm9tICcuL2hhbmRsZXMuanMnO1xuaW1wb3J0IHsgbGl2ZUdldFRyYXAsIGxpdmVJbnNwZWN0aW9uVHJhcHMsIGxpdmVPYmplY3QsIE1lbWJlckNhY2hlIH0gZnJvbSAnLi9saXZlVmlldy5qcyc7XG5pbXBvcnQgeyB1bndyYXBQcm94eSB9IGZyb20gJy4vc3RydWN0dXJhbFdyaXRlLmpzJztcbmltcG9ydCB7IHR5cGUgV3JpdGVTaW5rLCBlbGVtZW50U2luaywgc2lua0RlbGV0ZVRyYXAsIHNpbmtTZXRUcmFwIH0gZnJvbSAnLi93cml0ZVRyYXBzLmpzJztcblxuLyoqIE1ldGhvZHMgdGhhdCBtdXRhdGUgdGhlIGFycmF5IGluLXBsYWNlLiBXZSBpbnRlcmNlcHQgYW5kIGNvcHktb24td3JpdGUuICovXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnLFxuICAnZmlsbCcsXG4gICdjb3B5V2l0aGluJyxcbl0pO1xuXG50eXBlIFJlYWQgPSAoKSA9PiB1bmtub3duW107XG50eXBlIFdyaXRlID0gKG5leHQ6IHVua25vd25bXSkgPT4gdm9pZDtcblxuLy8gLS0gTGVhdmVzOiByZWFkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdIWSBgTnVtYmVyKHByb3ApYDogdGhlIGhpc3RvcmljYWwgcmVhZGluZyBvZiBhbiBpbmRleCBuYW1lIOKAlCBgJzAxJ2AgYW5kXG4gKiAgYCcnYCBhZGRyZXNzIHNsb3RzIDEgYW5kIDAsIGFzIHRoZXkgYWx3YXlzIGhhdmUuIEluIHJhbmdlIG9ubHkuICovXG5mdW5jdGlvbiBpbmRleEluKGN1cnJlbnQ6IHVua25vd25bXSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIocHJvcCk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY3VycmVudC5sZW5ndGggPyBpbmRleCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgaW5kZXggbmFtZWQgYnkgYHByb3BgIChhbnkgcmFuZ2Ug4oCUIGEgd3JpdGUgcGFzdCB0aGUgZW5kIGdyb3dzIHRoZSBhcnJheSkuICovXG5mdW5jdGlvbiBpbmRleE5hbWVkKHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHByb3ApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCA/IGluZGV4IDogdW5kZWZpbmVkO1xufVxuXG4vKiogV0hZOiBhIG5vbi1tdXRhdGluZyByZWFkIGFuc3dlcnMgZnJvbSB0aGUgQ1VSUkVOVCBhcnJheSwgbmV2ZXIgdGhlXG4gKiAgY3JlYXRpb24tdGltZSB0YXJnZXQg4oCUIGEgbWV0aG9kIGlzIGJvdW5kIHRvIGl0LCBhbnl0aGluZyBlbHNlIHJlYWQgb2ZmIGl0LiAqL1xuZnVuY3Rpb24gYm91bmRNZW1iZXIoY3VycmVudDogdW5rbm93bltdLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgY29uc3QgdmFsID0gKGN1cnJlbnQgYXMgYW55KVtwcm9wXTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgPyB2YWwuYmluZChjdXJyZW50KSA6IHZhbDtcbn1cblxudHlwZSBFbGVtZW50Q2FjaGUgPSBNYXA8bnVtYmVyLCB7IHJlZjogdW5rbm93bjsgcHJveHk6IHVua25vd24gfT47XG5cbi8qKiBXSFkgdGhlIGNhY2hlOiByZWFkaW5nIGBsaW5lc1tpXS5xdHlgIGluIGEgbG9vcCBtdXN0IG5vdCBhbGxvY2F0ZSBhIHByb3h5XG4gKiAgcGVyIHJlYWQsIGFuZCBgbGluZXNbMF0gPT09IGxpbmVzWzBdYCBtdXN0IGhvbGQgd2l0aGluIGEgc3RhZ2UuIFZhbGlkYXRlZCBieVxuICogIHJhdyBpZGVudGl0eSDigJQgYSBjb21taXQgcmVwbGFjZXMgdGhlIGFycmF5LCB0aGUgcmVmIGNoZWNrIG1pc3NlcywgYW5kIGFcbiAqICBmcmVzaCBwcm94eSBpcyBidWlsdCBvdmVyIHRoZSBuZXcgZWxlbWVudC4gQSBwcmltaXRpdmUgaXMgaGFuZGVkIGJhY2sgcmF3LiAqL1xuZnVuY3Rpb24gY2FjaGVkRWxlbWVudChjYWNoZTogRWxlbWVudENhY2hlLCBlbGVtZW50OiB1bmtub3duLCBpbmRleDogbnVtYmVyLCByZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUpOiB1bmtub3duIHtcbiAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVmID09PSBlbGVtZW50KSByZXR1cm4gY2FjaGVkLnByb3h5O1xuICBjb25zdCB3cmFwcGVkID0gd3JhcEVsZW1lbnRNZW1iZXIoZWxlbWVudCwgZWxlbWVudFNpbmsocmVhZCwgd3JpdGUsIGluZGV4KSwgW10sIG5ldyBTZXQ8b2JqZWN0PigpKTtcbiAgY2FjaGUuc2V0KGluZGV4LCB7IHJlZjogZWxlbWVudCwgcHJveHk6IHdyYXBwZWQgfSk7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHdyaXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2xvdHMgZnJvbSB0aGUgY3VycmVudCBlbmQgdXAgdG8gKG5vdCBpbmNsdWRpbmcpIGB1cFRvYCBiZWNvbWUgYG51bGxgIOKAlFxuICogIHRoZSBKU09OIHNwZWxsaW5nIG9mIGEgaG9sZSwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtYXJyYXkgcm91bmQtdHJpcCB1c2VkXG4gKiAgdG8gcHJvZHVjZSBmb3IgdGhlbS4gTm8tb3Agd2hlbiBgdXBUb2AgaXMgd2l0aGluIHRoZSBhcnJheS4gKi9cbmZ1bmN0aW9uIGZpbGxIb2xlcyhhcnI6IHVua25vd25bXSwgdXBUbzogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoOyBpIDwgdXBUbzsgaSsrKSBhcnJbaV0gPSBudWxsO1xufVxuXG4vKiogV0hZOiBhIG11dGF0aW5nIG1ldGhvZCBydW5zIG9uIGEgQ09QWSwgd2l0aCBpdHMgYXJndW1lbnRzIHVud3JhcHBlZCAodGhleVxuICogIGFyZSB0aGUgYXNzaWduZWQgdmFsdWVzOyBhIG51bWJlciBvciBhIGNvbXBhcmF0b3IgcGFzc2VzIHRocm91Z2gpLCBhbmQgdGhlXG4gKiAgY29weSBpcyBjb21taXR0ZWQgd2hvbGUuIFRoZSBhcnJheSBpbiBzdGF0ZSBpcyBuZXZlciB0b3VjaGVkLiAqL1xuZnVuY3Rpb24gbXV0YXRpbmdNZXRob2QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBuYW1lOiBzdHJpbmcpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgICBjb25zdCByZXN1bHQgPSAoY2xvbmUgYXMgYW55KVtuYW1lXSguLi5hcmdzLm1hcCh1bndyYXBQcm94eSkpO1xuICAgIHdyaXRlKGNsb25lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKiogYGFycltpXSA9IHZgOiBjb3B5LCBgbnVsbGAgdGhlIHNsb3RzIGEgd3JpdGUgcGFzdCB0aGUgZW5kIHNraXBzLCBwbGFjZSB0aGUgdW53cmFwcGVkIHZhbHVlLCBjb21taXQuICovXG5mdW5jdGlvbiBzZXRJbmRleChyZWFkOiBSZWFkLCB3cml0ZTogV3JpdGUsIGluZGV4OiBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IGNsb25lID0gWy4uLnJlYWQoKV07XG4gIGZpbGxIb2xlcyhjbG9uZSwgaW5kZXgpO1xuICBjbG9uZVtpbmRleF0gPSB1bndyYXBQcm94eSh2YWx1ZSk7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIGBhcnIubGVuZ3RoID0gbmA6IGNvcHksIGBudWxsYCB0aGUgc2xvdHMgZ3Jvd3RoIGFkZHMsIHRydW5jYXRlIG9yIGV4dGVuZCwgY29tbWl0LiAqL1xuZnVuY3Rpb24gc2V0TGVuZ3RoKHJlYWQ6IFJlYWQsIHdyaXRlOiBXcml0ZSwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgZmlsbEhvbGVzKGNsb25lLCBsZW5ndGgpO1xuICBjbG9uZS5sZW5ndGggPSBsZW5ndGg7XG4gIHdyaXRlKGNsb25lKTtcbn1cblxuLyoqIFdIWTogd2l0aG91dCB0aGlzIHRyYXAgYGRlbGV0ZSBpdGVtc1syXWAgcmVhY2hlcyB0aGUgUkFXIGFycmF5IGNhcHR1cmVkXG4gKiAgYXMgdGhlIHByb3h5IHRhcmdldCDigJQgY29tbWl0dGVkIHN0YXRlLCBubyBjb21taXQgcmVjb3JkLiBKUyBgZGVsZXRlYCBvbiBhblxuICogIGluZGV4IGxlYXZlcyB0aGUgc2xvdCBlbXB0eSBhbmQgdGhlIGxlbmd0aCB1bmNoYW5nZWQsIGFuZCBzbyBkb2VzIHRoaXM6XG4gKiAgdGhlIGVtcHRpZWQgc2xvdCBjb21taXRzIGFzIGBudWxsYCwgSlNPTidzIG9ubHkgc3BlbGxpbmcgZm9yIGEgaG9sZS4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVNsb3QocmVhZDogUmVhZCwgd3JpdGU6IFdyaXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB2b2lkIHtcbiAgY29uc3QgY2xvbmUgPSBbLi4ucmVhZCgpXTtcbiAgY29uc3QgaW5kZXggPSB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgPyBOdW1iZXIocHJvcCkgOiBOYU47XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgY2xvbmUubGVuZ3RoKSBjbG9uZVtpbmRleF0gPSBudWxsO1xuICBlbHNlIGRlbGV0ZSAoY2xvbmUgYXMgYW55KVtwcm9wXTtcbiAgd3JpdGUoY2xvbmUpO1xufVxuXG4vLyAtLSBMZWF2ZXM6IHRoZSBjaGFpbiBiZWxvdyBhbiBlbGVtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogV0hZOiBhbiBhcnJheSBhbnl3aGVyZSBiZWxvdyBhIHNpbmsncyByb290IGlzIE9ORSB3cml0ZSBwYXRoIOKAlCBpdCByZWFkc1xuICogdGhyb3VnaCB0aGUgc2luayBhbmQgY29tbWl0cyB0aGUgV0hPTEUgbmV3IGFycmF5IGJhY2sgdGhyb3VnaCBpdCwgc29cbiAqIGBwdXNoYCB0aHJlZSBsZXZlbHMgZG93biBhbmQgYGFycltpXS54ID0gdmAgYXQgdGhlIHRvcCBzaGFyZSBhIGZ1bm5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5UHJveHlBdChzaW5rOiBXcml0ZVNpbmssIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIGNyZWF0ZUFycmF5UHJveHkoXG4gICAgKCkgPT4gKHNpbmsucmVhZEF0KHBhdGgpIGFzIHVua25vd25bXSkgPz8gW10sXG4gICAgKG5leHQpID0+IHNpbmsucHV0KHBhdGgsIG5leHQpLFxuICApO1xufVxuXG4vKipcbiAqIFdyYXAgYSB2YWx1ZSByZWFkIG91dCBvZiBhbiBlbGVtZW50OiBhcnJheXMgYmVjb21lIGFycmF5IHByb3hpZXMgd2hvc2VcbiAqIGNvbW1pdHMgcm91dGUgYmFjayB0aHJvdWdoIHRoZSBvd25pbmcgYXJyYXksIHBsYWluIG9iamVjdHMgYmVjb21lIGVsZW1lbnRcbiAqIHByb3hpZXMgb25lIGxldmVsIGRlZXBlciwgZXZlcnl0aGluZyBlbHNlIGlzIHJldHVybmVkIGFzLWlzLiBBIHZhbHVlIGFscmVhZHlcbiAqIG9uIHRoZSBhY2Nlc3MgY2hhaW4gKGEgY3ljbGUpIGlzIHJldHVybmVkIHJhdyDigJQgdGhlIHNhbWUgYmFjay1lZGdlIHRoZVxuICogbmVzdGVkLW9iamVjdCB0ZXJtaW5hbCBwcm94eSB0YWtlcy5cbiAqL1xuZnVuY3Rpb24gd3JhcEVsZW1lbnRNZW1iZXIodmFsdWU6IHVua25vd24sIHNpbms6IFdyaXRlU2luaywgcGF0aDogc3RyaW5nW10sIHZpc2l0ZWQ6IFNldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgYnJhbmNoID0gbmV3IFNldCh2aXNpdGVkKTtcbiAgYnJhbmNoLmFkZCh2YWx1ZSBhcyBvYmplY3QpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50UHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIGJyYW5jaCk7XG59XG5cbi8vIC0tIE9yY2hlc3RyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUHJveHkgb3ZlciBvbmUgT0JKRUNUIGVsZW1lbnQgKG9yIGFuIG9iamVjdCBuZXN0ZWQgaW5zaWRlIG9uZSksIGNhcnJ5aW5nIHRoZVxuICogcGF0aCBmcm9tIHRoZSBlbGVtZW50IGRvd24gdG8gaXQuIFJlYWRzIHJlY3Vyc2U7IHdyaXRlcyBnbyBiYWNrIG91dCB0aHJvdWdoXG4gKiB0aGUgb3duaW5nIGFycmF5J3MgY29tbWl0IGNhbGxiYWNrICh0aGUge0BsaW5rIGVsZW1lbnRTaW5rfSkuXG4gKlxuICogUkVBRFMgQVJFIExJVkUuIEV2ZXJ5IHdyaXRlIHJlYnVpbGRzIHRoZSBhcnJheSBpbW11dGFibHksIHNvIHRoZSBvYmplY3QgdGhlXG4gKiBwcm94eSB3YXMgY3JlYXRlZCBvdmVyIGlzIHRoZSBQUkUtd3JpdGUgZWxlbWVudCBmb3IgZXZlciBhZnRlcjsgYSBoZWxkXG4gKiBoYW5kbGUgdGhhdCByZWFkIGZyb20gaXQgc2F3IGl0cyBvd24gd3JpdGVzIHZhbmlzaCAoYGxpbmUubiArPSAxYCB0d2ljZVxuICogZ2F2ZSAyLCBgbGluZS50b3RhbCA9IGxpbmUucXR5ICogMTBgIHVzZWQgdGhlIG9sZCBgcXR5YCwgYCd4JyBpbiBsaW5lYCB3YXNcbiAqIGZhbHNlIHJpZ2h0IGFmdGVyIGBsaW5lLnggPSAxYCkuIEV2ZXJ5IHRyYXAgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSBlbGVtZW50XG4gKiB0aHJvdWdoIHRoZSBzaW5rIGZpcnN0LCBhbmQgZmFsbHMgYmFjayB0byB0aGUgY2FwdHVyZWQgb2JqZWN0IG9ubHkgd2hlblxuICogdGhlIHBhdGggbm8gbG9uZ2VyIGV4aXN0cyAodGhlIHNsb3Qgd2FzIGVtcHRpZWQgb3IgdGhlIGFycmF5IHNocmFuaykg4oCUIHRoZVxuICogc2FtZSByZWFkLXlvdXItd3JpdGVzIHRoZSBhcnJheSBwcm94eSBpdHNlbGYgaGFzIGFsd2F5cyBoYWQsIGFuZCB0aGUgc2FtZVxuICogbGF3IHRoZSBuZXN0ZWQgYW5kIHRlcm1pbmFsIG9iamVjdCBwcm94aWVzIGZvbGxvdyAobGl2ZVZpZXcudHMpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50UHJveHkoXG4gIHJhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0Pixcbik6IHVua25vd24ge1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KHJhdywgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgcmV0dXJuIHJlbWVtYmVySGFuZGxlKFxuICAgIG5ldyBQcm94eShyYXcsIHtcbiAgICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsICh2YWx1ZSwgcGF0aCkgPT4gd3JhcEVsZW1lbnRNZW1iZXIodmFsdWUsIHNpbmssIHBhdGgsIHZpc2l0ZWQpLCBtZW1iZXJzKSxcbiAgICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gICAgfSksXG4gICAgbGl2ZSxcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgb3ZlciBhbiBhcnJheSB0aGF0IGludGVyY2VwdHMgbXV0YXRpbmcgb3BlcmF0aW9ucy5cbiAqXG4gKiBUaGUgYWN0dWFsIGN1cnJlbnQgYXJyYXkgaXMgdGhlIFByb3h5IHRhcmdldDogTm9kZS5qcyBjb25zb2xlLmxvZyBpbnNwZWN0c1xuICogdGhlIHRhcmdldCBkaXJlY3RseSAoYnlwYXNzZXMgUHJveHkgdHJhcHMpLCBzbyB0aGUgcmVhbCBhcnJheSBzaG93cyBjb3JyZWN0XG4gKiB2YWx1ZXMuIFRoZSB0YXJnZXQgcmVmZXJlbmNlIGlzIGZpeGVkIGF0IGNyZWF0aW9uIHRpbWUg4oCUIGFmdGVyIG11dGF0aW9ucyxcbiAqIHRoZSBwcm94eSByZXR1cm5zIGEgbmV3IHByb3h5ICh2aWEgY2FjaGUgaW52YWxpZGF0aW9uKSB3aXRoIHRoZSBmcmVzaCBhcnJheVxuICogYXMgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSBnZXRDdXJyZW50IC0gUmV0dXJucyB0aGUgY3VycmVudCBhcnJheSBzbmFwc2hvdCBmcm9tIHN0YXRlXG4gKiBAcGFyYW0gY29tbWl0IC0gQ2FsbGVkIHdpdGggdGhlIG5ldyBhcnJheSBhZnRlciBhIG11dGF0aW9uICh0cmlnZ2VycyBzZXRWYWx1ZSlcbiAqIEByZXR1cm5zIFByb3hpZWQgYXJyYXkgd2l0aCBjb3B5LW9uLXdyaXRlIHNlbWFudGljc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJyYXlQcm94eTxUPihnZXRDdXJyZW50OiAoKSA9PiBUW10sIGNvbW1pdDogKG5ld0FycmF5OiBUW10pID0+IHZvaWQpOiBUW10ge1xuICBjb25zdCB0YXJnZXQgPSBnZXRDdXJyZW50KCkgYXMgVFtdO1xuICBjb25zdCByZWFkID0gZ2V0Q3VycmVudCBhcyB1bmtub3duIGFzIFJlYWQ7XG4gIGNvbnN0IHdyaXRlID0gY29tbWl0IGFzIHVua25vd24gYXMgV3JpdGU7XG4gIGNvbnN0IGVsZW1lbnRzOiBFbGVtZW50Q2FjaGUgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGFycmF5IGhhbmRsZSdzIHZhbHVlIGlzIHRoZSBjdXJyZW50IGFycmF5IGl0c2VsZiAoaGFuZGxlcy50cykuXG4gIHJldHVybiByZW1lbWJlckhhbmRsZShcbiAgICBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIE1VVEFUSU5HX01FVEhPRFMuaGFzKHByb3ApKSByZXR1cm4gbXV0YXRpbmdNZXRob2QocmVhZCwgd3JpdGUsIHByb3ApO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVhZCgpO1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2xlbmd0aCcpIHJldHVybiBjdXJyZW50Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleEluKGN1cnJlbnQsIHByb3ApO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZEVsZW1lbnQoZWxlbWVudHMsIGN1cnJlbnRbaW5kZXhdLCBpbmRleCwgcmVhZCwgd3JpdGUpO1xuICAgICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSkgcmV0dXJuICgpID0+IGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiBib3VuZE1lbWJlcihjdXJyZW50LCBwcm9wKTtcbiAgICAgIH0sXG4gICAgICBzZXQoX3RhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE5hbWVkKHByb3ApO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgc2V0SW5kZXgocmVhZCwgd3JpdGUsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKHByb3AgPT09ICdsZW5ndGgnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHNldExlbmd0aChyZWFkLCB3cml0ZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IG90aGVyIHNldCBpcyBpZ25vcmVkIChhbiBleHBhbmRvIG9uIGFuIGFycmF5IGlzIG91dCBvZiBjb250cmFjdCDigJQgUkVBRE1FKVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIHByb3ApIHtcbiAgICAgICAgZGVsZXRlU2xvdChyZWFkLCB3cml0ZSwgcHJvcCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IFJlZmxlY3QuaGFzKHJlYWQoKSwgcHJvcCksXG4gICAgICBvd25LZXlzOiAoKSA9PiBSZWZsZWN0Lm93bktleXMocmVhZCgpKSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKF90YXJnZXQsIHByb3ApID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVhZCgpLCBwcm9wKSxcbiAgICB9KSxcbiAgICByZWFkLFxuICApO1xufVxuIl19
@@ -16,14 +16,20 @@
16
16
  import { nativeGet as lodashGet } from '../memory/pathOps.js';
17
17
  import { shouldWrapWithProxy } from './allowlist.js';
18
18
  import { arrayProxyAt } from './arrayTraps.js';
19
+ import { rememberHandle, unwrapHandles } from './handles.js';
19
20
  import { cachedMember, liveGetTrap, liveInspectionTraps, liveObject, MemberCache } from './liveView.js';
20
21
  import { unwrapProxy } from './structuralWrite.js';
21
22
  import { BREAK_SETTER, EXECUTOR_INTERNAL_METHODS, IS_TYPED_SCOPE, SCOPE_METHOD_NAMES } from './types.js';
22
23
  import { rootKeySink, sinkDeleteTrap, sinkSetTrap } from './writeTraps.js';
23
24
  const METHOD_ROUTES = {
24
25
  $getValue: (t) => t.getValue.bind(t),
25
- $setValue: (t) => t.setValue.bind(t),
26
- $update: (t) => t.updateValue.bind(t),
26
+ // A handle the scope handed out is a value it accepts back (handles.ts):
27
+ // `$setValue('copy', scope.customer)` stores the value behind the handle,
28
+ // not a Proxy the commit could never clone. The set trap has always done
29
+ // this for `scope.copy = scope.customer` (through `unwrapProxy`); these
30
+ // are the explicit doors. A handle-free value passes through by reference.
31
+ $setValue: (t) => (key, value, shouldRedact, description) => t.setValue(key, unwrapHandles(value), shouldRedact, description),
32
+ $update: (t) => (key, value, description) => t.updateValue(key, unwrapHandles(value), description),
27
33
  $delete: (t) => t.deleteValue.bind(t),
28
34
  $read: (t) => (dotPath) => {
29
35
  const rootKey = dotPath.split('.')[0];
@@ -55,8 +61,10 @@ const METHOD_ROUTES = {
55
61
  const clone = Array.isArray(current) ? structuredClone(current) : [];
56
62
  // User applies all mutations to the plain clone — no Proxy, no per-mutation commit
57
63
  fn(clone);
58
- // One setValue — fires onWrite once with the final array
59
- t.setValue(key, clone);
64
+ // One setValue — fires onWrite once with the final array. The stage may
65
+ // have pushed handles into the clone (`arr.push(scope.template)`) — they
66
+ // are values by the time the array is staged (handles.ts).
67
+ t.setValue(key, unwrapHandles(clone));
60
68
  },
61
69
  $break: (_t, opts) => (reason) => {
62
70
  if (!opts.breakFn)
@@ -128,12 +136,12 @@ function createTerminalProxy(obj, sink, segments, visited = new Set()) {
128
136
  return value;
129
137
  return createTerminalProxy(value, sink, path, visited);
130
138
  };
131
- return new Proxy(obj, {
139
+ return rememberHandle(new Proxy(obj, {
132
140
  get: liveGetTrap(live, segments, child, members),
133
141
  set: sinkSetTrap(sink, segments),
134
142
  deleteProperty: sinkDeleteTrap(sink, segments),
135
143
  ...liveInspectionTraps(live),
136
- });
144
+ }), live);
137
145
  }
138
146
  function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
139
147
  // Reads are LIVE (9.22.0): a held proxy reads its own writes, `'x' in o`
@@ -152,12 +160,12 @@ function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
152
160
  return createTerminalProxy(value, sink, path);
153
161
  return createNestedProxy(value, sink, path, new Set(ancestors).add(value));
154
162
  };
155
- return new Proxy(obj, {
163
+ return rememberHandle(new Proxy(obj, {
156
164
  get: liveGetTrap(live, segments, child, members),
157
165
  set: sinkSetTrap(sink, segments),
158
166
  deleteProperty: sinkDeleteTrap(sink, segments),
159
167
  ...liveInspectionTraps(live),
160
- });
168
+ }), live);
161
169
  }
162
170
  // -- Top-level leaves ---------------------------------------------------------
163
171
  /** `internalRead` answered nothing: the name is a state key and must be read (tracked) from the target. */
@@ -292,4 +300,4 @@ export function createTypedScope(target, options) {
292
300
  },
293
301
  });
294
302
  }
295
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pHLE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9CLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxvQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBNEIsRUFBRSxFQUFFO1FBQ2hFLG1DQUFtQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLHVFQUF1RTtRQUN2RSx5RUFBeUU7UUFDekUsa0VBQWtFO1FBQ2xFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHFFQUFxRTtRQUNyRSxNQUFNLEtBQUssR0FBYyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRixtRkFBbUY7UUFDbkYsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ1YseURBQXlEO1FBQ3pELENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQWUsRUFBRSxFQUFFO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLDJFQUEyRTtJQUMzRSwyQ0FBMkM7SUFDM0MsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQ3ZCLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDBEQUEwRDtBQUUxRCxNQUFNLFdBQVcsR0FBcUM7SUFDcEQsSUFBSSxFQUFFLFNBQVMsRUFBRSw0QkFBNEI7SUFDN0MsZUFBZSxFQUFFLFNBQVMsRUFBRSx3Q0FBd0M7SUFDcEUsV0FBVyxFQUFFLE1BQU0sRUFBRSxpQkFBaUI7SUFDdEMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWTtDQUNuQyxDQUFDO0FBRUYsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsR0FBVztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQVVELGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsbURBQW1EO0FBRW5ELFNBQVMsbUJBQW1CLENBQzFCLEdBQTRCLEVBQzVCLElBQWUsRUFDZixRQUEyQixFQUMzQixVQUF1QixJQUFJLEdBQUcsRUFBRTtJQUVoQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFjLEVBQUUsSUFBYyxFQUFXLEVBQUU7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzlDLHVFQUF1RTtRQUN2RSwyRUFBMkU7UUFDM0UsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBZSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0MsT0FBTyxtQkFBbUIsQ0FBQyxLQUFnQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEYsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDcEIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUM7UUFDaEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1FBQ2hDLGNBQWMsRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUM5QyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztLQUM3QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsR0FBNEIsRUFDNUIsSUFBZSxFQUNmLFFBQTJCLEVBQzNCLFlBQXlCLElBQUksR0FBRyxFQUFFO0lBRWxDLHlFQUF5RTtJQUN6RSx3RUFBd0U7SUFDeEUsNEVBQTRFO0lBQzVFLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFjLEVBQUUsSUFBYyxFQUFXLEVBQUU7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzlDLDBFQUEwRTtRQUMxRSx1REFBdUQ7UUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBZSxDQUFDO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQyxLQUFnQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RyxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBZSxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUM7SUFDRixPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNwQixHQUFHLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUNoRCxHQUFHLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7UUFDaEMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1FBQzlDLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO0tBQzdCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxnRkFBZ0Y7QUFFaEYsMkdBQTJHO0FBQzNHLE1BQU0sU0FBUyxHQUFrQixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBc0IsRUFBRSxLQUFvQixFQUFFLElBQXFCO0lBQ3ZGLElBQUksSUFBSSxLQUFLLGNBQWM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QyxJQUFJLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsRUFBYyxFQUFFLEVBQUU7WUFDeEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7WUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RGLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlFLElBQUkseUJBQXlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3ZGLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FDckIsTUFBc0IsRUFDdEIsVUFBb0MsRUFDcEMsS0FBb0IsRUFDcEIsR0FBVyxFQUNYLEtBQWM7SUFFZCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsc0NBQXNDO0lBQ3JGLE9BQU8sWUFBWSxDQUNqQixLQUFLLENBQUMsVUFBVSxFQUNoQixHQUFHLEVBQ0gsS0FBSyxFQUNMLEdBQUcsRUFBRTtRQUNILE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRyxDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Z0ZBQ2dGO0FBQ2hGLFNBQVMsY0FBYyxDQUFDLE1BQXNCLEVBQUUsS0FBb0IsRUFBRSxHQUFXLEVBQUUsS0FBYztJQUMvRixJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLEdBQUcsc0dBQXNHLENBQ25JLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELG1IQUFtSDtBQUNuSCxTQUFTLFFBQVEsQ0FBQyxNQUFzQixFQUFFLEdBQVc7SUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxJQUFJLE1BQU0sQ0FBQyxZQUFZO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxrREFBa0Q7QUFDL0YsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLFNBQVMsQ0FBQyxNQUFzQjtJQUN2QyxJQUFJLE1BQU0sQ0FBQyxZQUFZO1FBQUUsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBeUMsQ0FBQztJQUMxRSxPQUFPLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMvRSxDQUFDO0FBRUQsK0VBQStFO0FBRS9FOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBbUIsTUFBc0IsRUFBRSxPQUF5QjtJQUNsRyxNQUFNLEtBQUssR0FBa0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hHLDJGQUEyRjtJQUMzRixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzRSxPQUFPLElBQUksS0FBSyxDQUFDLE1BQWtDLEVBQUU7UUFDbkQsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFDNUMsdUVBQXVFO1lBQ3ZFLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQWMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQWMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUNELEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUs7WUFDM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO2dCQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUk7WUFDL0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJO1lBQ3BCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtnQkFBRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0YsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDaEMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLElBQUk7WUFDekMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQyxDQUFDLCtCQUErQjtZQUMvRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7UUFDM0csQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGFycmF5UHJveHlBdCB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBjYWNoZWRNZW1iZXIsIGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgJHNldFZhbHVlOiAodCkgPT4gdC5zZXRWYWx1ZS5iaW5kKHQpLFxuICAkdXBkYXRlOiAodCkgPT4gdC51cGRhdGVWYWx1ZS5iaW5kKHQpLFxuICAkZGVsZXRlOiAodCkgPT4gdC5kZWxldGVWYWx1ZS5iaW5kKHQpLFxuICAkcmVhZDogKHQpID0+IChkb3RQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290S2V5ID0gZG90UGF0aC5zcGxpdCgnLicpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gdC5nZXRWYWx1ZShyb290S2V5KTtcbiAgICBpZiAoIWRvdFBhdGguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBsb2Rhc2hHZXQodmFsdWUsIGRvdFBhdGguc2xpY2Uocm9vdEtleS5sZW5ndGggKyAxKSk7XG4gIH0sXG4gICRnZXRBcmdzOiAodCkgPT4gdC5nZXRBcmdzLmJpbmQodCksXG4gICRnZXRFbnY6ICh0KSA9PiB0LmdldEVudi5iaW5kKHQpLFxuICAkZGVidWc6ICh0KSA9PiB0LmFkZERlYnVnSW5mby5iaW5kKHQpLFxuICAkbG9nOiAodCkgPT4gdC5hZGREZWJ1Z01lc3NhZ2UuYmluZCh0KSxcbiAgJGVycm9yOiAodCkgPT4gdC5hZGRFcnJvckluZm8uYmluZCh0KSxcbiAgJG1ldHJpYzogKHQpID0+IHQuYWRkTWV0cmljLmJpbmQodCksXG4gICRldmFsOiAodCkgPT4gdC5hZGRFdmFsLmJpbmQodCksXG4gICRhdHRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5hdHRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5kZXRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRnZXRTY29wZVJlY29yZGVyczogKHQpID0+IHQuZ2V0U2NvcGVSZWNvcmRlcnMuYmluZCh0KSxcbiAgJGJhdGNoQXJyYXk6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAvLyBPbmUgZ2V0VmFsdWUg4oCUIGZpcmVzIG9uUmVhZCBvbmNlXG4gICAgY29uc3QgY3VycmVudCA9IHQuZ2V0VmFsdWUoa2V5KTtcbiAgICAvLyBDbG9uZSBvbmNlIOKAlCBERUVQIChvciBzdGFydCBlbXB0eSBpZiBtaXNzaW5nL25vbi1hcnJheSkuIFRoZSByZWFkIGlzXG4gICAgLy8gQk9SUk9XRUQ6IGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgY29tbWl0dGVkIHNoYXJlZFxuICAgIC8vIG1lbW9yeSBpdHNlbGYsIHNvIGEgc2hhbGxvdyBgWy4uLmN1cnJlbnRdYCBoYW5kZWQgdGhlIHN0YWdlIHRoZVxuICAgIC8vIGNvbW1pdHRlZCBFTEVNRU5UUyBhbmQgYGFyclswXS5uID0gOWAgZWRpdGVkIGNvbW1pdHRlZCBzdGF0ZSBpbiBwbGFjZVxuICAgIC8vIHdpdGggbm8gdHJhY2Ugcm93IChhbmQgdGhlIGxhenkgYnVmZmVyJ3MgYmFzZSB3YXMgdGhlbiB0YWtlbiBBRlRFUiB0aGVcbiAgICAvLyBlZGl0LCBzbyB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIgc2F3IG5vdGhpbmcpLiBTdGF0ZSB2YWx1ZXMgc3Vydml2ZVxuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgIGJ5IGNvbnRyYWN0LCBzbyB0aGUgd29ya2luZyBjb3B5IGlzIGEgZnVsbCBjb3B5LlxuICAgIGNvbnN0IGNsb25lOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpID8gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpIDogW107XG4gICAgLy8gVXNlciBhcHBsaWVzIGFsbCBtdXRhdGlvbnMgdG8gdGhlIHBsYWluIGNsb25lIOKAlCBubyBQcm94eSwgbm8gcGVyLW11dGF0aW9uIGNvbW1pdFxuICAgIGZuKGNsb25lKTtcbiAgICAvLyBPbmUgc2V0VmFsdWUg4oCUIGZpcmVzIG9uV3JpdGUgb25jZSB3aXRoIHRoZSBmaW5hbCBhcnJheVxuICAgIHQuc2V0VmFsdWUoa2V5LCBjbG9uZSk7XG4gIH0sXG4gICRicmVhazogKF90LCBvcHRzKSA9PiAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFvcHRzLmJyZWFrRm4pIHRocm93IG5ldyBFcnJvcignJGJyZWFrKCkgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHN0YWdlIGV4ZWN1dGlvbicpO1xuICAgIG9wdHMuYnJlYWtGbihyZWFzb24pO1xuICB9LFxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpLiBSb3V0ZXMgdG8gU2NvcGVGYWNhZGUuZW1pdEV2ZW50XG4gIC8vIHdoaWNoIGhhbmRsZXMgZmFzdC1wYXRoLCBlbnJpY2htZW50LCByZWRhY3Rpb24sIGFuZCBlcnJvciBpc29sYXRpb24uXG4gICRlbWl0OiAodCkgPT4gdC5lbWl0RXZlbnQuYmluZCh0KSxcbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBEZWxlZ2F0ZXMgdG8gU2NvcGVGYWNhZGVcbiAgLy8gd2hpY2ggbWludGVkIHJlZklkcyBmcm9tIHJ1bnRpbWVTdGFnZUlkLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyOiAodCkgPT4gdC5kZXRhY2hBbmRKb2luTGF0ZXIuYmluZCh0KSxcbiAgJGRldGFjaEFuZEZvcmdldDogKHQpID0+IHQuZGV0YWNoQW5kRm9yZ2V0LmJpbmQodCksXG4gICR0b1JhdzogKHQpID0+ICgpID0+IHQsXG59O1xuXG4vLyAtLSBHdWFyZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgdG8gcHJldmVudCBQcm94eSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBQcm9taXNlLFxuLy8gYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MsIG9yIGNvbmZ1c2luZyB0ZXN0IG1hdGNoZXJzLlxuXG5jb25zdCBHVUFSRF9QUk9QUzogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7XG4gIHRoZW46IHVuZGVmaW5lZCwgLy8gcHJldmVudCBQcm9taXNlIGRldGVjdGlvblxuICBhc3ltbWV0cmljTWF0Y2g6IHVuZGVmaW5lZCwgLy8gcHJldmVudCB2aXRlc3QvamVzdCBtYXRjaGVyIGNvbmZ1c2lvblxuICBjb25zdHJ1Y3RvcjogT2JqZWN0LCAvLyBzYWZlIHByb3RvdHlwZVxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ1R5cGVkU2NvcGUnLFxufTtcblxuLy8gLS0gU2lsZW50IGV4aXN0ZW5jZSBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIERvZXMgdGhpcyBrZXkgZXhpc3QgaW4gc3RhdGUsIGFuc3dlcmVkIHdpdGggTk8gdHJhY2tpbmcgc2lkZSBlZmZlY3QgYXQgYWxsP1xuICpcbiAqIGBnZXRTdGF0ZUtleXMoKWAgaXMgdGhlIG9ubHkgaW5zcGVjdGlvbiBhIFNjb3BlRmFjYWRlIGFuc3dlcnMgd2l0aG91dCByb3V0aW5nXG4gKiB0aHJvdWdoIHRoZSB0cmFja2VkIHJlYWQgcGF0aC4gYGhhc0tleSgpYCBkZWxpYmVyYXRlbHkgRE9FUyByb3V0ZSB0aHJvdWdoIGl0OlxuICogYCdrJyBpbiBzY29wZWAgaXMgYSByZWFsIHF1ZXN0aW9uIGFib3V0IHN0YXRlIHRoYXQgYSBzdGFnZSBjYW4gYnJhbmNoIG9uLCBzb1xuICogaXQgcmVnaXN0ZXJzIGFzIGEgcmVhZCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyBwcm9iZSBtdXN0IG5vdCB1c2UgaXQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0YXJnZXQgb2ZmZXJzIG5vIHNpbGVudCBhbnN3ZXI7IGNhbGxlcnMgbXVzdFxuICogdGhlbiBjaG9vc2UgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIGFzc3VtZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbn1cblxuLy8gLS0gTXV0YWJsZSBzdGF0ZSBwZXIgcHJveHkgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgUmVhY3RpdmVTdGF0ZSB7XG4gIGJyZWFrRm4/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogVGhlIHRvcC1sZXZlbCBrZXkncyBjaGlsZCBwcm94eSwgdmFsaWRhdGVkIGJ5IHJhdyBpZGVudGl0eSAoYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApOyBhIHNpbmsgZHJvcHMgdGhlIGtleSBvbiB3cml0ZS4gKi9cbiAgY2hpbGRDYWNoZTogTWVtYmVyQ2FjaGU7XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94aWVzIChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQm90aCBmYWN0b3JpZXMgYXJlIE9SQ0hFU1RSQVRPUlMgKDkuMjMuMSk6IHJlYWRzIGFyZSBgbGl2ZVZpZXcudHNgLCB3cml0ZXNcbi8vIGFyZSBgd3JpdGVUcmFwcy50c2Agb3ZlciBhIGByb290S2V5U2lua2AsIGFuZCB0aGUgT05FIHRoaW5nIGVhY2ggZGVjaWRlc1xuLy8gaXRzZWxmIGlzIHdoYXQgYSBjaGlsZCBtZW1iZXIgYmVjb21lcyDigJQgdGhlIGN5Y2xlIHBvbGljeS4gRWFjaCBob2xkcyBpdHNcbi8vIG93biBwZXItbWVtYmVyIHByb3h5IGNhY2hlICg5LjIzLjIsIGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKS5cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY29tbWl0cyB0aHJvdWdoIHRoZSBzaW5rKSBidXQgZG9lc24ndCByZWN1cnNlIHJlYWRzXG4vLyBmdXJ0aGVyLiBUaGUgdGVybWluYWwgY2hhaW4gc2hhcmVzIE9ORSBtdXRhYmxlIGB2aXNpdGVkYCBzZXQ6IGEgdmFsdWUgc2VlblxuLy8gYW55d2hlcmUgcGFzdCB0aGUgY3ljbGUgZWRnZSBpcyBoYW5kZWQgYmFjayByYXcuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRlcm1pbmFsUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIFJPT1QgS0VZIChyZWFjdGl2ZS9SRUFETUUubWQsIGxhdyAzKVxuICAgIC8vIOKAlCB0aGUgc2luaydzIHZlcmIsIHdoYXRldmVyIGRlcHRoIHRoZSBhcnJheSBzaXRzIGF0LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCk7XG4gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBuZXcgU2V0KGFuY2VzdG9ycykuYWRkKHZhbHVlIGFzIG9iamVjdCkpO1xuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gIH0pO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgbGVhdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYGludGVybmFsUmVhZGAgYW5zd2VyZWQgbm90aGluZzogdGhlIG5hbWUgaXMgYSBzdGF0ZSBrZXkgYW5kIG11c3QgYmUgcmVhZCAodHJhY2tlZCkgZnJvbSB0aGUgdGFyZ2V0LiAqL1xuY29uc3QgU1RBVEVfS0VZOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzdGF0ZS1rZXknKTtcblxuLyoqXG4gKiBXSFk6IHRoZSBuYW1lcyB0aGUgc2NvcGUgYW5zd2VycyBJVFNFTEYg4oCUIGludGVybmFsIHN5bWJvbHMsIHRoZSBndWFyZFxuICogcHJvcGVydGllcywgTm9kZSdzIGluc3BlY3QgaG9vaywgdGhlIGAkYC1tZXRob2RzLCB0aGUgZXhlY3V0b3IncyBhbGxvd2xpc3RlZFxuICogcGFzcy10aHJvdWdocyAoYGF0dGFjaFNjb3BlUmVjb3JkZXJgLCBgbm90aWZ5U3RhZ2VTdGFydGAsIOKApiwgY2FsbGVkIGRpcmVjdGx5XG4gKiBvbiB0aGUgc2NvcGUpIGFuZCB0aGUgSlNPTiBwcm9iZSDigJQgbXVzdCBuZXZlciBiZWNvbWUgdHJhY2tlZCByZWFkcztcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHN0YXRlIGtleSBhbmQgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSBwcm9iZTogYEpTT04uc3RyaW5naWZ5YCBhc2tzIEVWRVJZIHZhbHVlIGZvciBhIGB0b0pTT05gIG1ldGhvZC4gVGhhdFxuICogcXVlc3Rpb24gY29tZXMgZnJvbSB0aGUgcnVudGltZSwgbm90IHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyXG4gKiB0aGUgcmVhZCBzZXQuIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWw6IHdoZW4gaXQgRVhJU1RTXG4gKiB0aGlzIGlzIGEgZ2VudWluZSByZWFkIGFuZCBzdGF5cyB0cmFja2VkLCBhbmQgd2hlbiB0aGUgdGFyZ2V0IGNhbm5vdCBhbnN3ZXJcbiAqIHNpbGVudGx5LCB0cnV0aCB3aW5zIG92ZXIgbm9pc2Ug4oCUIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaW50ZXJuYWxSZWFkKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb3AgPT09IEJSRUFLX1NFVFRFUikge1xuICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIE1FVEhPRF9ST1VURVNbcHJvcF0/Lih0YXJnZXQsIHN0YXRlKTtcbiAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgfVxuICBpZiAocHJvcCA9PT0gJ3RvSlNPTicgJiYgc2lsZW50bHlLbm93bktleSh0YXJnZXQsIHByb3ApID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIFNUQVRFX0tFWTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwYWJsZSBzdGF0ZSB2YWx1ZSBiZWNvbWVzIHRoZSBhcnJheSBvciBuZXN0ZWQgcHJveHkgZm9yIGl0cyBrZXk7XG4gKiBhbnl0aGluZyBlbHNlIGlzIGhhbmRlZCBiYWNrIHJhdy4gYHNjb3BlLmsgPT09IHNjb3BlLmtgIGhvbGRzIHdpdGhpbiBhXG4gKiBzdGFnZSB0aHJvdWdoIHRoZSBzYW1lIHBlci1tZW1iZXIgY2FjaGUgZXZlcnkgb2JqZWN0IHByb3h5IHVzZXNcbiAqIChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk6IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGUgZW50cnkgKHRoZVxuICogc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrIG1pc3NlcyDigJQgZWl0aGVyXG4gKiB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBTdGF0ZVZhbHVlKFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7IC8vIERhdGUsIE1hcCwgY2xhc3MgaW5zdGFuY2UsIGZyb3plbiDigKZcbiAgcmV0dXJuIGNhY2hlZE1lbWJlcihcbiAgICBzdGF0ZS5jaGlsZENhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5rID0gcm9vdEtleVNpbmsodGFyZ2V0LCByZWFkU2lsZW50LCBrZXksIHN0YXRlLmNoaWxkQ2FjaGUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIFtdKTtcbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSk7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHVud3JhcHBlZCB2YWx1ZSAobGFuZG1pbmUgMSkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSkpO1xuICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShrZXkpO1xufVxuXG4vKiogRG9lcyB0aGUga2V5IGV4aXN0IOKAlCBhbnN3ZXJlZCB3aXRob3V0IGEgdHJhY2tlZCByZWFkIHdoZXJldmVyIHRoZSB0YXJnZXQgY2FuOyBgZ2V0VmFsdWVgIGlzIHRoZSBsYXN0IHJlc29ydC4gKi9cbmZ1bmN0aW9uIGtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShrZXkpO1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xuICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKGtleSkgIT09IHVuZGVmaW5lZDsgLy8gZmFsbGJhY2s6IGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbn1cblxuLyoqIEV2ZXJ5IHN0YXRlIGtleSDigJQgc2lsZW50bHkgd2hlcmUgdGhlIHRhcmdldCBjYW4sIGVsc2UgZnJvbSBhIHdob2xlLXN0YXRlIHJlYWQuICovXG5mdW5jdGlvbiBzdGF0ZUtleXModGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0LmdldFZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzbmFwc2hvdCAmJiB0eXBlb2Ygc25hcHNob3QgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMoc25hcHNob3QpIDogW107XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0geyBicmVha0ZuOiBvcHRpb25zPy5icmVha1BpcGVsaW5lLCBjaGlsZENhY2hlOiBuZXcgTWVtYmVyQ2FjaGUoKSB9O1xuICAvLyBCaW5kIHRoZSBzaWxlbnQgcmVhZCBvbmNlIOKAlCB0aGUgbmVzdGVkL2FycmF5IHByb3hpZXMgcmVzb2x2ZSB0aGVpciBsaXZlIHZpZXcgdGhyb3VnaCBpdC5cbiAgY29uc3QgcmVhZFNpbGVudCA9ICh0YXJnZXQuZ2V0VmFsdWVTaWxlbnQgPz8gdGFyZ2V0LmdldFZhbHVlKS5iaW5kKHRhcmdldCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQgYXMgdW5rbm93biBhcyBUeXBlZFNjb3BlPFQ+LCB7XG4gICAgZ2V0KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgYW5zd2VyZWQgPSBpbnRlcm5hbFJlYWQodGFyZ2V0LCBzdGF0ZSwgcHJvcCk7XG4gICAgICBpZiAoYW5zd2VyZWQgIT09IFNUQVRFX0tFWSkgcmV0dXJuIGFuc3dlcmVkO1xuICAgICAgLy8gQSBzdGF0ZSBrZXk6IE9ORSB0cmFja2VkIHJlYWQgKGZpcmVzIG9uUmVhZCBvbmNlKSwgdGhlbiB0aGUgd3JhcHBlci5cbiAgICAgIHJldHVybiB3cmFwU3RhdGVWYWx1ZSh0YXJnZXQsIHJlYWRTaWxlbnQsIHN0YXRlLCBwcm9wIGFzIHN0cmluZywgdGFyZ2V0LmdldFZhbHVlKHByb3AgYXMgc3RyaW5nKSk7XG4gICAgfSxcbiAgICBzZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykgYXNzaWduU3RhdGVLZXkodGFyZ2V0LCBzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eShfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LmRlbGV0ZVZhbHVlKHByb3ApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyhfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApO1xuICAgICAgcmV0dXJuIFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkgfHwga25vd25LZXkodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICAgIG93bktleXM6ICgpID0+IHN0YXRlS2V5cyh0YXJnZXQpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycgfHwgU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gJC1tZXRob2RzIGFyZSBub24tZW51bWVyYWJsZVxuICAgICAgaWYgKCFrbm93bktleSh0YXJnZXQsIHByb3ApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9OyAvLyB0aGUgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pHLE9BQU8sRUFBa0IsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxZQUFzQixFQUFFLFdBQW9CLEVBQUUsRUFBRSxDQUM5RixDQUFDLENBQUMs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UUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7UUFDM0csQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGFycmF5UHJveHlBdCB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyByZW1lbWJlckhhbmRsZSwgdW53cmFwSGFuZGxlcyB9IGZyb20gJy4vaGFuZGxlcy5qcyc7XG5pbXBvcnQgeyBjYWNoZWRNZW1iZXIsIGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgLy8gQSBoYW5kbGUgdGhlIHNjb3BlIGhhbmRlZCBvdXQgaXMgYSB2YWx1ZSBpdCBhY2NlcHRzIGJhY2sgKGhhbmRsZXMudHMpOlxuICAvLyBgJHNldFZhbHVlKCdjb3B5Jywgc2NvcGUuY3VzdG9tZXIpYCBzdG9yZXMgdGhlIHZhbHVlIGJlaGluZCB0aGUgaGFuZGxlLFxuICAvLyBub3QgYSBQcm94eSB0aGUgY29tbWl0IGNvdWxkIG5ldmVyIGNsb25lLiBUaGUgc2V0IHRyYXAgaGFzIGFsd2F5cyBkb25lXG4gIC8vIHRoaXMgZm9yIGBzY29wZS5jb3B5ID0gc2NvcGUuY3VzdG9tZXJgICh0aHJvdWdoIGB1bndyYXBQcm94eWApOyB0aGVzZVxuICAvLyBhcmUgdGhlIGV4cGxpY2l0IGRvb3JzLiBBIGhhbmRsZS1mcmVlIHZhbHVlIHBhc3NlcyB0aHJvdWdoIGJ5IHJlZmVyZW5jZS5cbiAgJHNldFZhbHVlOiAodCkgPT4gKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpID0+XG4gICAgdC5zZXRWYWx1ZShrZXksIHVud3JhcEhhbmRsZXModmFsdWUpLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKSxcbiAgJHVwZGF0ZTogKHQpID0+IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSA9PlxuICAgIHQudXBkYXRlVmFsdWUoa2V5LCB1bndyYXBIYW5kbGVzKHZhbHVlKSwgZGVzY3JpcHRpb24pLFxuICAkZGVsZXRlOiAodCkgPT4gdC5kZWxldGVWYWx1ZS5iaW5kKHQpLFxuICAkcmVhZDogKHQpID0+IChkb3RQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290S2V5ID0gZG90UGF0aC5zcGxpdCgnLicpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gdC5nZXRWYWx1ZShyb290S2V5KTtcbiAgICBpZiAoIWRvdFBhdGguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBsb2Rhc2hHZXQodmFsdWUsIGRvdFBhdGguc2xpY2Uocm9vdEtleS5sZW5ndGggKyAxKSk7XG4gIH0sXG4gICRnZXRBcmdzOiAodCkgPT4gdC5nZXRBcmdzLmJpbmQodCksXG4gICRnZXRFbnY6ICh0KSA9PiB0LmdldEVudi5iaW5kKHQpLFxuICAkZGVidWc6ICh0KSA9PiB0LmFkZERlYnVnSW5mby5iaW5kKHQpLFxuICAkbG9nOiAodCkgPT4gdC5hZGREZWJ1Z01lc3NhZ2UuYmluZCh0KSxcbiAgJGVycm9yOiAodCkgPT4gdC5hZGRFcnJvckluZm8uYmluZCh0KSxcbiAgJG1ldHJpYzogKHQpID0+IHQuYWRkTWV0cmljLmJpbmQodCksXG4gICRldmFsOiAodCkgPT4gdC5hZGRFdmFsLmJpbmQodCksXG4gICRhdHRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5hdHRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5kZXRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRnZXRTY29wZVJlY29yZGVyczogKHQpID0+IHQuZ2V0U2NvcGVSZWNvcmRlcnMuYmluZCh0KSxcbiAgJGJhdGNoQXJyYXk6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAvLyBPbmUgZ2V0VmFsdWUg4oCUIGZpcmVzIG9uUmVhZCBvbmNlXG4gICAgY29uc3QgY3VycmVudCA9IHQuZ2V0VmFsdWUoa2V5KTtcbiAgICAvLyBDbG9uZSBvbmNlIOKAlCBERUVQIChvciBzdGFydCBlbXB0eSBpZiBtaXNzaW5nL25vbi1hcnJheSkuIFRoZSByZWFkIGlzXG4gICAgLy8gQk9SUk9XRUQ6IGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgY29tbWl0dGVkIHNoYXJlZFxuICAgIC8vIG1lbW9yeSBpdHNlbGYsIHNvIGEgc2hhbGxvdyBgWy4uLmN1cnJlbnRdYCBoYW5kZWQgdGhlIHN0YWdlIHRoZVxuICAgIC8vIGNvbW1pdHRlZCBFTEVNRU5UUyBhbmQgYGFyclswXS5uID0gOWAgZWRpdGVkIGNvbW1pdHRlZCBzdGF0ZSBpbiBwbGFjZVxuICAgIC8vIHdpdGggbm8gdHJhY2Ugcm93IChhbmQgdGhlIGxhenkgYnVmZmVyJ3MgYmFzZSB3YXMgdGhlbiB0YWtlbiBBRlRFUiB0aGVcbiAgICAvLyBlZGl0LCBzbyB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIgc2F3IG5vdGhpbmcpLiBTdGF0ZSB2YWx1ZXMgc3Vydml2ZVxuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgIGJ5IGNvbnRyYWN0LCBzbyB0aGUgd29ya2luZyBjb3B5IGlzIGEgZnVsbCBjb3B5LlxuICAgIGNvbnN0IGNsb25lOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpID8gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpIDogW107XG4gICAgLy8gVXNlciBhcHBsaWVzIGFsbCBtdXRhdGlvbnMgdG8gdGhlIHBsYWluIGNsb25lIOKAlCBubyBQcm94eSwgbm8gcGVyLW11dGF0aW9uIGNvbW1pdFxuICAgIGZuKGNsb25lKTtcbiAgICAvLyBPbmUgc2V0VmFsdWUg4oCUIGZpcmVzIG9uV3JpdGUgb25jZSB3aXRoIHRoZSBmaW5hbCBhcnJheS4gVGhlIHN0YWdlIG1heVxuICAgIC8vIGhhdmUgcHVzaGVkIGhhbmRsZXMgaW50byB0aGUgY2xvbmUgKGBhcnIucHVzaChzY29wZS50ZW1wbGF0ZSlgKSDigJQgdGhleVxuICAgIC8vIGFyZSB2YWx1ZXMgYnkgdGhlIHRpbWUgdGhlIGFycmF5IGlzIHN0YWdlZCAoaGFuZGxlcy50cykuXG4gICAgdC5zZXRWYWx1ZShrZXksIHVud3JhcEhhbmRsZXMoY2xvbmUpKTtcbiAgfSxcbiAgJGJyZWFrOiAoX3QsIG9wdHMpID0+IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW9wdHMuYnJlYWtGbikgdGhyb3cgbmV3IEVycm9yKCckYnJlYWsoKSBpcyBub3QgYXZhaWxhYmxlIG91dHNpZGUgc3RhZ2UgZXhlY3V0aW9uJyk7XG4gICAgb3B0cy5icmVha0ZuKHJlYXNvbik7XG4gIH0sXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykuIFJvdXRlcyB0byBTY29wZUZhY2FkZS5lbWl0RXZlbnRcbiAgLy8gd2hpY2ggaGFuZGxlcyBmYXN0LXBhdGgsIGVucmljaG1lbnQsIHJlZGFjdGlvbiwgYW5kIGVycm9yIGlzb2xhdGlvbi5cbiAgJGVtaXQ6ICh0KSA9PiB0LmVtaXRFdmVudC5iaW5kKHQpLFxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIERlbGVnYXRlcyB0byBTY29wZUZhY2FkZVxuICAvLyB3aGljaCBtaW50ZWQgcmVmSWRzIGZyb20gcnVudGltZVN0YWdlSWQuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXI6ICh0KSA9PiB0LmRldGFjaEFuZEpvaW5MYXRlci5iaW5kKHQpLFxuICAkZGV0YWNoQW5kRm9yZ2V0OiAodCkgPT4gdC5kZXRhY2hBbmRGb3JnZXQuYmluZCh0KSxcbiAgJHRvUmF3OiAodCkgPT4gKCkgPT4gdCxcbn07XG5cbi8vIC0tIEd1YXJkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZXNlIG11c3QgYmUgaGFuZGxlZCB0byBwcmV2ZW50IFByb3h5IGZyb20gYmVpbmcgdHJlYXRlZCBhcyBhIFByb21pc2UsXG4vLyBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcywgb3IgY29uZnVzaW5nIHRlc3QgbWF0Y2hlcnMuXG5cbmNvbnN0IEdVQVJEX1BST1BTOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiA9IHtcbiAgdGhlbjogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IFByb21pc2UgZGV0ZWN0aW9uXG4gIGFzeW1tZXRyaWNNYXRjaDogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IHZpdGVzdC9qZXN0IG1hdGNoZXIgY29uZnVzaW9uXG4gIGNvbnN0cnVjdG9yOiBPYmplY3QsIC8vIHNhZmUgcHJvdG90eXBlXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnVHlwZWRTY29wZScsXG59O1xuXG4vLyAtLSBTaWxlbnQgZXhpc3RlbmNlIGNoZWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRG9lcyB0aGlzIGtleSBleGlzdCBpbiBzdGF0ZSwgYW5zd2VyZWQgd2l0aCBOTyB0cmFja2luZyBzaWRlIGVmZmVjdCBhdCBhbGw/XG4gKlxuICogYGdldFN0YXRlS2V5cygpYCBpcyB0aGUgb25seSBpbnNwZWN0aW9uIGEgU2NvcGVGYWNhZGUgYW5zd2VycyB3aXRob3V0IHJvdXRpbmdcbiAqIHRocm91Z2ggdGhlIHRyYWNrZWQgcmVhZCBwYXRoLiBgaGFzS2V5KClgIGRlbGliZXJhdGVseSBET0VTIHJvdXRlIHRocm91Z2ggaXQ6XG4gKiBgJ2snIGluIHNjb3BlYCBpcyBhIHJlYWwgcXVlc3Rpb24gYWJvdXQgc3RhdGUgdGhhdCBhIHN0YWdlIGNhbiBicmFuY2ggb24sIHNvXG4gKiBpdCByZWdpc3RlcnMgYXMgYSByZWFkIOKAlCB3aGljaCBpcyBleGFjdGx5IHdoeSB0aGlzIHByb2JlIG11c3Qgbm90IHVzZSBpdC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHRhcmdldCBvZmZlcnMgbm8gc2lsZW50IGFuc3dlcjsgY2FsbGVycyBtdXN0XG4gKiB0aGVuIGNob29zZSBkZWxpYmVyYXRlbHkgcmF0aGVyIHRoYW4gYXNzdW1lLlxuICovXG5mdW5jdGlvbiBzaWxlbnRseUtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xufVxuXG4vLyAtLSBNdXRhYmxlIHN0YXRlIHBlciBwcm94eSBpbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBSZWFjdGl2ZVN0YXRlIHtcbiAgYnJlYWtGbj86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBUaGUgdG9wLWxldmVsIGtleSdzIGNoaWxkIHByb3h5LCB2YWxpZGF0ZWQgYnkgcmF3IGlkZW50aXR5IChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk7IGEgc2luayBkcm9wcyB0aGUga2V5IG9uIHdyaXRlLiAqL1xuICBjaGlsZENhY2hlOiBNZW1iZXJDYWNoZTtcbn1cblxuLy8gLS0gTmVzdGVkIGNoaWxkIHByb3hpZXMgKGZvciBkZWVwIHdyaXRlIGludGVyY2VwdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBCb3RoIGZhY3RvcmllcyBhcmUgT1JDSEVTVFJBVE9SUyAoOS4yMy4xKTogcmVhZHMgYXJlIGBsaXZlVmlldy50c2AsIHdyaXRlc1xuLy8gYXJlIGB3cml0ZVRyYXBzLnRzYCBvdmVyIGEgYHJvb3RLZXlTaW5rYCwgYW5kIHRoZSBPTkUgdGhpbmcgZWFjaCBkZWNpZGVzXG4vLyBpdHNlbGYgaXMgd2hhdCBhIGNoaWxkIG1lbWJlciBiZWNvbWVzIOKAlCB0aGUgY3ljbGUgcG9saWN5LiBFYWNoIGhvbGRzIGl0c1xuLy8gb3duIHBlci1tZW1iZXIgcHJveHkgY2FjaGUgKDkuMjMuMiwgYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApLlxuLy9cbi8vIEN5Y2xlIHNhZmV0eTogYW4gaW1tdXRhYmxlIFNldDxvYmplY3Q+IG9mIGFuY2VzdG9yIG9iamVjdHMgaXMgcGFzc2VkIGRvd25cbi8vIGVhY2ggYWNjZXNzIGNoYWluLiBFYWNoIGJyYW5jaCBnZXRzIGl0cyBvd24gY29weSAobmV3IFNldChwYXJlbnQpKSBzb1xuLy8gc2NvcGUueC5mcmllbmQgYW5kIHNjb3BlLnguY293b3JrZXIgZG9uJ3QgcG9sbHV0ZSBlYWNoIG90aGVyJ3MgdHJhY2tpbmcuXG4vLyBXaGVuIGEgY2hpbGQgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgYW5jZXN0b3Igc2V0LCB3ZSd2ZSBoaXQgYSBjeWNsZS5cbi8vIEF0IHRoZSBjeWNsZSBicmVhazogcmV0dXJuIGEgdGVybWluYWwgcHJveHkgdGhhdCB0cmFja3Mgd3JpdGVzIChzZXQgdHJhcFxuLy8gc3RpbGwgYnVpbGRzIHBhdGggKyBjb21taXRzIHRocm91Z2ggdGhlIHNpbmspIGJ1dCBkb2Vzbid0IHJlY3Vyc2UgcmVhZHNcbi8vIGZ1cnRoZXIuIFRoZSB0ZXJtaW5hbCBjaGFpbiBzaGFyZXMgT05FIG11dGFibGUgYHZpc2l0ZWRgIHNldDogYSB2YWx1ZSBzZWVuXG4vLyBhbnl3aGVyZSBwYXN0IHRoZSBjeWNsZSBlZGdlIGlzIGhhbmRlZCBiYWNrIHJhdy5cblxuZnVuY3Rpb24gY3JlYXRlVGVybWluYWxQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2luazogV3JpdGVTaW5rLFxuICBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHZpc2l0ZWQ6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdW5rbm93biB7XG4gIHZpc2l0ZWQuYWRkKG9iaik7XG4gIGNvbnN0IG1lbWJlcnMgPSBuZXcgTWVtYmVyQ2FjaGUoKTtcbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3Qob2JqLCBzaW5rLnJlYWRBdChzZWdtZW50cykpO1xuICBjb25zdCBjaGlsZCA9ICh2YWx1ZTogdW5rbm93biwgcGF0aDogc3RyaW5nW10pOiB1bmtub3duID0+IHtcbiAgICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgLy8gQW4gYXJyYXkgcGFzdCB0aGUgY3ljbGUgZWRnZSBzdGlsbCBnZXRzIGNvcHktb24td3JpdGUgaW50ZXJjZXB0aW9uIOKAlFxuICAgIC8vIGl0IGNvbW1pdHMgYXMgYSBgc2V0YCBvZiB0aGUgcm9vdCBrZXksIHRoZSBzYW1lIGxhdyBhcyB0aGUgbmVzdGVkIHByb3h5LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAodmlzaXRlZC5oYXModmFsdWUgYXMgb2JqZWN0KSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCB2aXNpdGVkKTtcbiAgfTtcbiAgcmV0dXJuIHJlbWVtYmVySGFuZGxlKFxuICAgIG5ldyBQcm94eShvYmosIHtcbiAgICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgICAgZGVsZXRlUHJvcGVydHk6IHNpbmtEZWxldGVUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gICAgfSksXG4gICAgbGl2ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVzdGVkUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdW5rbm93biB7XG4gIC8vIFJlYWRzIGFyZSBMSVZFICg5LjIyLjApOiBhIGhlbGQgcHJveHkgcmVhZHMgaXRzIG93biB3cml0ZXMsIGAneCcgaW4gb2BcbiAgLy8gYW5kIGBPYmplY3Qua2V5cyhvKWAgc2VlIHRoZW0sIGFuZCBgby5iID0gby5hICogMTBgIHVzZXMgdGhlIG5ldyBgYWAuXG4gIC8vIFRoZSBjYXB0dXJlZCBvYmplY3QgYW5zd2VycyBvbmx5IHdoZW4gdGhlIHBhdGggaXMgZ29uZSDigJQgc2VlIGxpdmVWaWV3LnRzLlxuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IGNvbW1pdHMgYXMgYSBgc2V0YCBvZiB0aGUgUk9PVCBLRVkgKHJlYWN0aXZlL1JFQURNRS5tZCwgbGF3IDMpXG4gICAgLy8g4oCUIHRoZSBzaW5rJ3MgdmVyYiwgd2hhdGV2ZXIgZGVwdGggdGhlIGFycmF5IHNpdHMgYXQuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIHBhdGgpO1xuICAgIGlmIChhbmNlc3RvcnMuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoKTtcbiAgICByZXR1cm4gY3JlYXRlTmVzdGVkUHJveHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHNpbmssIHBhdGgsIG5ldyBTZXQoYW5jZXN0b3JzKS5hZGQodmFsdWUgYXMgb2JqZWN0KSk7XG4gIH07XG4gIHJldHVybiByZW1lbWJlckhhbmRsZShcbiAgICBuZXcgUHJveHkob2JqLCB7XG4gICAgICBnZXQ6IGxpdmVHZXRUcmFwKGxpdmUsIHNlZ21lbnRzLCBjaGlsZCwgbWVtYmVycyksXG4gICAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICAgIH0pLFxuICAgIGxpdmUsXG4gICk7XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBsZWF2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBgaW50ZXJuYWxSZWFkYCBhbnN3ZXJlZCBub3RoaW5nOiB0aGUgbmFtZSBpcyBhIHN0YXRlIGtleSBhbmQgbXVzdCBiZSByZWFkICh0cmFja2VkKSBmcm9tIHRoZSB0YXJnZXQuICovXG5jb25zdCBTVEFURV9LRVk6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ3N0YXRlLWtleScpO1xuXG4vKipcbiAqIFdIWTogdGhlIG5hbWVzIHRoZSBzY29wZSBhbnN3ZXJzIElUU0VMRiDigJQgaW50ZXJuYWwgc3ltYm9scywgdGhlIGd1YXJkXG4gKiBwcm9wZXJ0aWVzLCBOb2RlJ3MgaW5zcGVjdCBob29rLCB0aGUgYCRgLW1ldGhvZHMsIHRoZSBleGVjdXRvcidzIGFsbG93bGlzdGVkXG4gKiBwYXNzLXRocm91Z2hzIChgYXR0YWNoU2NvcGVSZWNvcmRlcmAsIGBub3RpZnlTdGFnZVN0YXJ0YCwg4oCmLCBjYWxsZWQgZGlyZWN0bHlcbiAqIG9uIHRoZSBzY29wZSkgYW5kIHRoZSBKU09OIHByb2JlIOKAlCBtdXN0IG5ldmVyIGJlY29tZSB0cmFja2VkIHJlYWRzO1xuICogZXZlcnl0aGluZyBlbHNlIGlzIGEgc3RhdGUga2V5IGFuZCBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuXG4gKlxuICogVGhlIHByb2JlOiBgSlNPTi5zdHJpbmdpZnlgIGFza3MgRVZFUlkgdmFsdWUgZm9yIGEgYHRvSlNPTmAgbWV0aG9kLiBUaGF0XG4gKiBxdWVzdGlvbiBjb21lcyBmcm9tIHRoZSBydW50aW1lLCBub3QgdGhlIHN0YWdlIGF1dGhvciwgc28gaXQgbXVzdCBub3QgZW50ZXJcbiAqIHRoZSByZWFkIHNldC4gQSBzdGF0ZSBrZXkgbGl0ZXJhbGx5IGNhbGxlZCAndG9KU09OJyBpcyBsZWdhbDogd2hlbiBpdCBFWElTVFNcbiAqIHRoaXMgaXMgYSBnZW51aW5lIHJlYWQgYW5kIHN0YXlzIHRyYWNrZWQsIGFuZCB3aGVuIHRoZSB0YXJnZXQgY2Fubm90IGFuc3dlclxuICogc2lsZW50bHksIHRydXRoIHdpbnMgb3ZlciBub2lzZSDigJQgZmFsbCB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiBpbnRlcm5hbFJlYWQodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwgc3RhdGU6IFJlYWN0aXZlU3RhdGUsIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IHVua25vd24ge1xuICBpZiAocHJvcCA9PT0gSVNfVFlQRURfU0NPUEUpIHJldHVybiB0cnVlO1xuICBpZiAocHJvcCA9PT0gQlJFQUtfU0VUVEVSKSB7XG4gICAgcmV0dXJuIChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgc3RhdGUuYnJlYWtGbiA9IGZuO1xuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApKSByZXR1cm4gR1VBUkRfUFJPUFNbcHJvcF07XG4gICAgaWYgKHByb3AgPT09IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykpIHJldHVybiAoKSA9PiB0YXJnZXQuZ2V0VmFsdWUoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApKSByZXR1cm4gR1VBUkRfUFJPUFNbcHJvcF07XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gTUVUSE9EX1JPVVRFU1twcm9wXT8uKHRhcmdldCwgc3RhdGUpO1xuICBpZiAoRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUy5oYXMocHJvcCkgJiYgdHlwZW9mICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAodGFyZ2V0IGFzIGFueSlbcHJvcF0uYmluZCh0YXJnZXQpO1xuICB9XG4gIGlmIChwcm9wID09PSAndG9KU09OJyAmJiBzaWxlbnRseUtub3duS2V5KHRhcmdldCwgcHJvcCkgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gU1RBVEVfS0VZO1xufVxuXG4vKipcbiAqIEEgd3JhcHBhYmxlIHN0YXRlIHZhbHVlIGJlY29tZXMgdGhlIGFycmF5IG9yIG5lc3RlZCBwcm94eSBmb3IgaXRzIGtleTtcbiAqIGFueXRoaW5nIGVsc2UgaXMgaGFuZGVkIGJhY2sgcmF3LiBgc2NvcGUuayA9PT0gc2NvcGUua2AgaG9sZHMgd2l0aGluIGFcbiAqIHN0YWdlIHRocm91Z2ggdGhlIHNhbWUgcGVyLW1lbWJlciBjYWNoZSBldmVyeSBvYmplY3QgcHJveHkgdXNlc1xuICogKGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKTogYSB3cml0ZSB0byB0aGUga2V5IGRyb3BzIHRoZSBlbnRyeSAodGhlXG4gKiBzaW5rIGRvZXMgaXQpLCBhIGNvbW1pdCBzd2FwcyB0aGUgdmFsdWUgYW5kIHRoZSByZWYgY2hlY2sgbWlzc2VzIOKAlCBlaXRoZXJcbiAqIHdheSB0aGUgbmV4dCByZWFkIGJ1aWxkcyBhIGZyZXNoIHByb3h5IG92ZXIgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gd3JhcFN0YXRlVmFsdWUoXG4gIHRhcmdldDogUmVhY3RpdmVUYXJnZXQsXG4gIHJlYWRTaWxlbnQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bixcbiAgc3RhdGU6IFJlYWN0aXZlU3RhdGUsXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTsgLy8gRGF0ZSwgTWFwLCBjbGFzcyBpbnN0YW5jZSwgZnJvemVuIOKAplxuICByZXR1cm4gY2FjaGVkTWVtYmVyKFxuICAgIHN0YXRlLmNoaWxkQ2FjaGUsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmsgPSByb290S2V5U2luayh0YXJnZXQsIHJlYWRTaWxlbnQsIGtleSwgc3RhdGUuY2hpbGRDYWNoZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgW10pO1xuICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBbXSwgbmV3IFNldDxvYmplY3Q+KFt2YWx1ZV0pKTtcbiAgICB9LFxuICAgIFtdLFxuICApO1xufVxuXG4vKiogV0hZOiBhIGAkYC1uYW1lIGNhbiBuZXZlciBiZSBhIHN0YXRlIGtleSDigJQgdGhlIHdyaXRlIGlzIHJlZnVzZWQsIG5vdCBzaGFkb3dlZDsgZXZlcnkgb3RoZXIgYXNzaWdubWVudFxuICogIHN0b3JlcyB0aGUgdW53cmFwcGVkIHZhbHVlIChsYW5kbWluZSAxKSBhbmQgZHJvcHMgdGhlIGtleSdzIGNhY2hlZCBwcm94eS4gKi9cbmZ1bmN0aW9uIGFzc2lnblN0YXRlS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMoa2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2V0IHN0YXRlIGtleSBcIiR7a2V5fVwiIC0tIGl0IGNvbmZsaWN0cyB3aXRoIGEgcmVzZXJ2ZWQgVHlwZWRTY29wZSBtZXRob2QuIFJlbmFtZSB0aGUgc3RhdGUga2V5IHRvIGF2b2lkICQtcHJlZml4ZWQgbmFtZXMuYCxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zZXRWYWx1ZShrZXksIHVud3JhcFByb3h5KHZhbHVlKSk7XG4gIHN0YXRlLmNoaWxkQ2FjaGUuZGVsZXRlKGtleSk7XG59XG5cbi8qKiBEb2VzIHRoZSBrZXkgZXhpc3Qg4oCUIGFuc3dlcmVkIHdpdGhvdXQgYSB0cmFja2VkIHJlYWQgd2hlcmV2ZXIgdGhlIHRhcmdldCBjYW47IGBnZXRWYWx1ZWAgaXMgdGhlIGxhc3QgcmVzb3J0LiAqL1xuZnVuY3Rpb24ga25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHRhcmdldC5oYXNLZXkpIHJldHVybiB0YXJnZXQuaGFzS2V5KGtleSk7XG4gIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG4gIHJldHVybiB0YXJnZXQuZ2V0VmFsdWUoa2V5KSAhPT0gdW5kZWZpbmVkOyAvLyBmYWxsYmFjazogZmlyZXMgb25SZWFkIChhY2NlcHRhYmxlIGRlZ3JhZGF0aW9uKVxufVxuXG4vKiogRXZlcnkgc3RhdGUga2V5IOKAlCBzaWxlbnRseSB3aGVyZSB0aGUgdGFyZ2V0IGNhbiwgZWxzZSBmcm9tIGEgd2hvbGUtc3RhdGUgcmVhZC4gKi9cbmZ1bmN0aW9uIHN0YXRlS2V5cyh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0KTogc3RyaW5nW10ge1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKTtcbiAgY29uc3Qgc25hcHNob3QgPSB0YXJnZXQuZ2V0VmFsdWUoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHNuYXBzaG90ICYmIHR5cGVvZiBzbmFwc2hvdCA9PT0gJ29iamVjdCcgPyBPYmplY3Qua2V5cyhzbmFwc2hvdCkgOiBbXTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIHByb3h5ICh0aGUgbWFpbiBUeXBlZFNjb3BlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUeXBlZFNjb3BlPFQ+IHByb3h5IHdyYXBwaW5nIGEgUmVhY3RpdmVUYXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB1bmRlcmx5aW5nIHNjb3BlIChTY29wZUZhY2FkZSBvciBhbnkgUmVhY3RpdmVUYXJnZXQpXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKGJyZWFrUGlwZWxpbmUgaW5qZWN0aW9uKVxuICogQHJldHVybnMgQSBQcm94eSB3aXRoIHR5cGVkIHByb3BlcnR5IGFjY2VzcyBhbmQgJC1wcmVmaXhlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdGlvbnM/OiBSZWFjdGl2ZU9wdGlvbnMpOiBUeXBlZFNjb3BlPFQ+IHtcbiAgY29uc3Qgc3RhdGU6IFJlYWN0aXZlU3RhdGUgPSB7IGJyZWFrRm46IG9wdGlvbnM/LmJyZWFrUGlwZWxpbmUsIGNoaWxkQ2FjaGU6IG5ldyBNZW1iZXJDYWNoZSgpIH07XG4gIC8vIEJpbmQgdGhlIHNpbGVudCByZWFkIG9uY2Ug4oCUIHRoZSBuZXN0ZWQvYXJyYXkgcHJveGllcyByZXNvbHZlIHRoZWlyIGxpdmUgdmlldyB0aHJvdWdoIGl0LlxuICBjb25zdCByZWFkU2lsZW50ID0gKHRhcmdldC5nZXRWYWx1ZVNpbGVudCA/PyB0YXJnZXQuZ2V0VmFsdWUpLmJpbmQodGFyZ2V0KTtcblxuICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBjb25zdCBhbnN3ZXJlZCA9IGludGVybmFsUmVhZCh0YXJnZXQsIHN0YXRlLCBwcm9wKTtcbiAgICAgIGlmIChhbnN3ZXJlZCAhPT0gU1RBVEVfS0VZKSByZXR1cm4gYW5zd2VyZWQ7XG4gICAgICAvLyBBIHN0YXRlIGtleTogT05FIHRyYWNrZWQgcmVhZCAoZmlyZXMgb25SZWFkIG9uY2UpLCB0aGVuIHRoZSB3cmFwcGVyLlxuICAgICAgcmV0dXJuIHdyYXBTdGF0ZVZhbHVlKHRhcmdldCwgcmVhZFNpbGVudCwgc3RhdGUsIHByb3AgYXMgc3RyaW5nLCB0YXJnZXQuZ2V0VmFsdWUocHJvcCBhcyBzdHJpbmcpKTtcbiAgICB9LFxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSBhc3NpZ25TdGF0ZUtleSh0YXJnZXQsIHN0YXRlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCk7XG4gICAgICByZXR1cm4gU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSB8fCBrbm93bktleSh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gICAgb3duS2V5czogKCkgPT4gc3RhdGVLZXlzKHRhcmdldCksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyB8fCBTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkOyAvLyAkLW1ldGhvZHMgYXJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICBpZiAoIWtub3duS2V5KHRhcmdldCwgcHJvcCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07IC8vIHRoZSB2YWx1ZSBpcyBmZXRjaGVkIHZpYSB0aGUgZ2V0IHRyYXBcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,46 @@
1
+ /**
2
+ * reactive/handles — which objects are the scope's HANDLES, and the value
3
+ * behind each.
4
+ *
5
+ * Every object the typed scope hands back is a Proxy bound to its stage
6
+ * (reactive/README.md, "A handle is bound to its stage"): inside the stage
7
+ * that is what makes a deep write commit and a held read stay live. A handle
8
+ * can also TRAVEL out of the stage in the library's own hands — an
9
+ * `addParallelForEach` items selector returns the array handle and its
10
+ * elements become the generated branch inputs; a subflow `inputMapper` or
11
+ * `outputMapper` hands one on; `$setValue('copy', scope.customer)` hands one
12
+ * back. Wherever the engine RECORDS a value it clones it (`structuredClone`,
13
+ * at commit since 9.23.0), and a Proxy cannot be cloned: `DataCloneError`,
14
+ * the stage's writes lost. 9.22.0–9.23.2 lost every child of a fan-out over
15
+ * object items that way (9.23.3).
16
+ *
17
+ * LAW: a handle the scope handed out is a value the engine accepts back.
18
+ * Each proxy factory registers its handle here with the same live reader its
19
+ * get trap uses, so the value behind a handle is what a read of it would
20
+ * return NOW — and the engine asks {@link unwrapHandles} at every boundary
21
+ * where app code hands it a value to record. O(1) for a handle (a WeakMap
22
+ * lookup, no walk, no JSON round-trip: a `Date` stays a `Date`); a walk only
23
+ * for a plain container the app built around handles, copy-on-write so a
24
+ * handle-free value comes back as the SAME reference.
25
+ *
26
+ * The value behind a handle is BORROWED — the same reference a read hands
27
+ * back, cloned by the buffer at commit. Never mutate it (the reads law).
28
+ */
29
+ /** Register `handle` as a scope handle whose current value `live` returns. Returns the handle. */
30
+ export declare function rememberHandle<T extends object>(handle: T, live: () => unknown): T;
31
+ /** Is `value` a handle the scope handed out? */
32
+ export declare function isHandle(value: unknown): value is object;
33
+ /** The live value behind a handle; `value` itself when it is not one. O(1). */
34
+ export declare function valueBehind(value: unknown): unknown;
35
+ /**
36
+ * `value` with every handle inside it replaced by the value behind it.
37
+ *
38
+ * A handle is replaced in O(1) and NOT entered (the state behind it holds no
39
+ * handles — they are built on read, never stored). A plain container is
40
+ * walked and copied ONLY when something inside it changed, so a handle-free
41
+ * value is returned as the same reference and a hand-built `{ item, index }`
42
+ * around one handle costs one object. Anything else (a `Date`, a `Map`, a
43
+ * class instance, a primitive) is a leaf. A cycle among plain containers is
44
+ * left as it is — `structuredClone` handles cycles; only a Proxy stops it.
45
+ */
46
+ export declare function unwrapHandles<T>(value: T): T;
@@ -0,0 +1,105 @@
1
+ /**
2
+ * reactive/handles — which objects are the scope's HANDLES, and the value
3
+ * behind each.
4
+ *
5
+ * Every object the typed scope hands back is a Proxy bound to its stage
6
+ * (reactive/README.md, "A handle is bound to its stage"): inside the stage
7
+ * that is what makes a deep write commit and a held read stay live. A handle
8
+ * can also TRAVEL out of the stage in the library's own hands — an
9
+ * `addParallelForEach` items selector returns the array handle and its
10
+ * elements become the generated branch inputs; a subflow `inputMapper` or
11
+ * `outputMapper` hands one on; `$setValue('copy', scope.customer)` hands one
12
+ * back. Wherever the engine RECORDS a value it clones it (`structuredClone`,
13
+ * at commit since 9.23.0), and a Proxy cannot be cloned: `DataCloneError`,
14
+ * the stage's writes lost. 9.22.0–9.23.2 lost every child of a fan-out over
15
+ * object items that way (9.23.3).
16
+ *
17
+ * LAW: a handle the scope handed out is a value the engine accepts back.
18
+ * Each proxy factory registers its handle here with the same live reader its
19
+ * get trap uses, so the value behind a handle is what a read of it would
20
+ * return NOW — and the engine asks {@link unwrapHandles} at every boundary
21
+ * where app code hands it a value to record. O(1) for a handle (a WeakMap
22
+ * lookup, no walk, no JSON round-trip: a `Date` stays a `Date`); a walk only
23
+ * for a plain container the app built around handles, copy-on-write so a
24
+ * handle-free value comes back as the SAME reference.
25
+ *
26
+ * The value behind a handle is BORROWED — the same reference a read hands
27
+ * back, cloned by the buffer at commit. Never mutate it (the reads law).
28
+ */
29
+ /** Every handle the four proxy factories built, mapped to its live reader. */
30
+ const LIVE = new WeakMap();
31
+ /** Register `handle` as a scope handle whose current value `live` returns. Returns the handle. */
32
+ export function rememberHandle(handle, live) {
33
+ LIVE.set(handle, live);
34
+ return handle;
35
+ }
36
+ /** Is `value` a handle the scope handed out? */
37
+ export function isHandle(value) {
38
+ return value !== null && typeof value === 'object' && LIVE.has(value);
39
+ }
40
+ /** The live value behind a handle; `value` itself when it is not one. O(1). */
41
+ export function valueBehind(value) {
42
+ if (value === null || typeof value !== 'object')
43
+ return value;
44
+ const live = LIVE.get(value);
45
+ return live === undefined ? value : live();
46
+ }
47
+ /** A plain object or array — the only containers the walk enters (a `Date`, `Map` or class instance is a leaf). */
48
+ function isPlainContainer(value) {
49
+ if (value === null || typeof value !== 'object')
50
+ return false;
51
+ if (Array.isArray(value))
52
+ return true;
53
+ const proto = Object.getPrototypeOf(value);
54
+ return proto === Object.prototype || proto === null;
55
+ }
56
+ /**
57
+ * `value` with every handle inside it replaced by the value behind it.
58
+ *
59
+ * A handle is replaced in O(1) and NOT entered (the state behind it holds no
60
+ * handles — they are built on read, never stored). A plain container is
61
+ * walked and copied ONLY when something inside it changed, so a handle-free
62
+ * value is returned as the same reference and a hand-built `{ item, index }`
63
+ * around one handle costs one object. Anything else (a `Date`, a `Map`, a
64
+ * class instance, a primitive) is a leaf. A cycle among plain containers is
65
+ * left as it is — `structuredClone` handles cycles; only a Proxy stops it.
66
+ */
67
+ export function unwrapHandles(value) {
68
+ return walk(value, new Set());
69
+ }
70
+ function walk(value, onPath) {
71
+ if (value === null || typeof value !== 'object')
72
+ return value;
73
+ const live = LIVE.get(value);
74
+ if (live !== undefined)
75
+ return live();
76
+ if (!isPlainContainer(value) || onPath.has(value))
77
+ return value;
78
+ onPath.add(value);
79
+ const out = Array.isArray(value) ? walkArray(value, onPath) : walkObject(value, onPath);
80
+ onPath.delete(value);
81
+ return out;
82
+ }
83
+ function walkArray(value, onPath) {
84
+ let copy;
85
+ for (let i = 0; i < value.length; i++) {
86
+ const next = walk(value[i], onPath);
87
+ if (next === value[i])
88
+ continue;
89
+ copy ??= [...value];
90
+ copy[i] = next;
91
+ }
92
+ return copy ?? value;
93
+ }
94
+ function walkObject(value, onPath) {
95
+ let copy;
96
+ for (const key of Object.keys(value)) {
97
+ const next = walk(value[key], onPath);
98
+ if (next === value[key])
99
+ continue;
100
+ copy ??= { ...value };
101
+ copy[key] = next;
102
+ }
103
+ return copy ?? value;
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvaGFuZGxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsOEVBQThFO0FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0FBRWxELGtHQUFrRztBQUNsRyxNQUFNLFVBQVUsY0FBYyxDQUFtQixNQUFTLEVBQUUsSUFBbUI7SUFDN0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWM7SUFDckMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFjO0lBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDN0MsQ0FBQztBQUVELG1IQUFtSDtBQUNuSCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFJLEtBQVE7SUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLENBQU0sQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsS0FBYyxFQUFFLE1BQW1CO0lBQy9DLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFnQixFQUFFLE1BQW1CO0lBQ3RELElBQUksSUFBMkIsQ0FBQztJQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDaEMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLElBQUksSUFBSSxLQUFLLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQThCLEVBQUUsTUFBbUI7SUFDckUsSUFBSSxJQUF5QyxDQUFDO0lBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVM7UUFDbEMsSUFBSSxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLElBQUksSUFBSSxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvaGFuZGxlcyDigJQgd2hpY2ggb2JqZWN0cyBhcmUgdGhlIHNjb3BlJ3MgSEFORExFUywgYW5kIHRoZSB2YWx1ZVxuICogYmVoaW5kIGVhY2guXG4gKlxuICogRXZlcnkgb2JqZWN0IHRoZSB0eXBlZCBzY29wZSBoYW5kcyBiYWNrIGlzIGEgUHJveHkgYm91bmQgdG8gaXRzIHN0YWdlXG4gKiAocmVhY3RpdmUvUkVBRE1FLm1kLCBcIkEgaGFuZGxlIGlzIGJvdW5kIHRvIGl0cyBzdGFnZVwiKTogaW5zaWRlIHRoZSBzdGFnZVxuICogdGhhdCBpcyB3aGF0IG1ha2VzIGEgZGVlcCB3cml0ZSBjb21taXQgYW5kIGEgaGVsZCByZWFkIHN0YXkgbGl2ZS4gQSBoYW5kbGVcbiAqIGNhbiBhbHNvIFRSQVZFTCBvdXQgb2YgdGhlIHN0YWdlIGluIHRoZSBsaWJyYXJ5J3Mgb3duIGhhbmRzIOKAlCBhblxuICogYGFkZFBhcmFsbGVsRm9yRWFjaGAgaXRlbXMgc2VsZWN0b3IgcmV0dXJucyB0aGUgYXJyYXkgaGFuZGxlIGFuZCBpdHNcbiAqIGVsZW1lbnRzIGJlY29tZSB0aGUgZ2VuZXJhdGVkIGJyYW5jaCBpbnB1dHM7IGEgc3ViZmxvdyBgaW5wdXRNYXBwZXJgIG9yXG4gKiBgb3V0cHV0TWFwcGVyYCBoYW5kcyBvbmUgb247IGAkc2V0VmFsdWUoJ2NvcHknLCBzY29wZS5jdXN0b21lcilgIGhhbmRzIG9uZVxuICogYmFjay4gV2hlcmV2ZXIgdGhlIGVuZ2luZSBSRUNPUkRTIGEgdmFsdWUgaXQgY2xvbmVzIGl0IChgc3RydWN0dXJlZENsb25lYCxcbiAqIGF0IGNvbW1pdCBzaW5jZSA5LjIzLjApLCBhbmQgYSBQcm94eSBjYW5ub3QgYmUgY2xvbmVkOiBgRGF0YUNsb25lRXJyb3JgLFxuICogdGhlIHN0YWdlJ3Mgd3JpdGVzIGxvc3QuIDkuMjIuMOKAkzkuMjMuMiBsb3N0IGV2ZXJ5IGNoaWxkIG9mIGEgZmFuLW91dCBvdmVyXG4gKiBvYmplY3QgaXRlbXMgdGhhdCB3YXkgKDkuMjMuMykuXG4gKlxuICogTEFXOiBhIGhhbmRsZSB0aGUgc2NvcGUgaGFuZGVkIG91dCBpcyBhIHZhbHVlIHRoZSBlbmdpbmUgYWNjZXB0cyBiYWNrLlxuICogRWFjaCBwcm94eSBmYWN0b3J5IHJlZ2lzdGVycyBpdHMgaGFuZGxlIGhlcmUgd2l0aCB0aGUgc2FtZSBsaXZlIHJlYWRlciBpdHNcbiAqIGdldCB0cmFwIHVzZXMsIHNvIHRoZSB2YWx1ZSBiZWhpbmQgYSBoYW5kbGUgaXMgd2hhdCBhIHJlYWQgb2YgaXQgd291bGRcbiAqIHJldHVybiBOT1cg4oCUIGFuZCB0aGUgZW5naW5lIGFza3Mge0BsaW5rIHVud3JhcEhhbmRsZXN9IGF0IGV2ZXJ5IGJvdW5kYXJ5XG4gKiB3aGVyZSBhcHAgY29kZSBoYW5kcyBpdCBhIHZhbHVlIHRvIHJlY29yZC4gTygxKSBmb3IgYSBoYW5kbGUgKGEgV2Vha01hcFxuICogbG9va3VwLCBubyB3YWxrLCBubyBKU09OIHJvdW5kLXRyaXA6IGEgYERhdGVgIHN0YXlzIGEgYERhdGVgKTsgYSB3YWxrIG9ubHlcbiAqIGZvciBhIHBsYWluIGNvbnRhaW5lciB0aGUgYXBwIGJ1aWx0IGFyb3VuZCBoYW5kbGVzLCBjb3B5LW9uLXdyaXRlIHNvIGFcbiAqIGhhbmRsZS1mcmVlIHZhbHVlIGNvbWVzIGJhY2sgYXMgdGhlIFNBTUUgcmVmZXJlbmNlLlxuICpcbiAqIFRoZSB2YWx1ZSBiZWhpbmQgYSBoYW5kbGUgaXMgQk9SUk9XRUQg4oCUIHRoZSBzYW1lIHJlZmVyZW5jZSBhIHJlYWQgaGFuZHNcbiAqIGJhY2ssIGNsb25lZCBieSB0aGUgYnVmZmVyIGF0IGNvbW1pdC4gTmV2ZXIgbXV0YXRlIGl0ICh0aGUgcmVhZHMgbGF3KS5cbiAqL1xuXG4vKiogRXZlcnkgaGFuZGxlIHRoZSBmb3VyIHByb3h5IGZhY3RvcmllcyBidWlsdCwgbWFwcGVkIHRvIGl0cyBsaXZlIHJlYWRlci4gKi9cbmNvbnN0IExJVkUgPSBuZXcgV2Vha01hcDxvYmplY3QsICgpID0+IHVua25vd24+KCk7XG5cbi8qKiBSZWdpc3RlciBgaGFuZGxlYCBhcyBhIHNjb3BlIGhhbmRsZSB3aG9zZSBjdXJyZW50IHZhbHVlIGBsaXZlYCByZXR1cm5zLiBSZXR1cm5zIHRoZSBoYW5kbGUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtZW1iZXJIYW5kbGU8VCBleHRlbmRzIG9iamVjdD4oaGFuZGxlOiBULCBsaXZlOiAoKSA9PiB1bmtub3duKTogVCB7XG4gIExJVkUuc2V0KGhhbmRsZSwgbGl2ZSk7XG4gIHJldHVybiBoYW5kbGU7XG59XG5cbi8qKiBJcyBgdmFsdWVgIGEgaGFuZGxlIHRoZSBzY29wZSBoYW5kZWQgb3V0PyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZGxlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgTElWRS5oYXModmFsdWUpO1xufVxuXG4vKiogVGhlIGxpdmUgdmFsdWUgYmVoaW5kIGEgaGFuZGxlOyBgdmFsdWVgIGl0c2VsZiB3aGVuIGl0IGlzIG5vdCBvbmUuIE8oMSkuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVCZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgbGl2ZSA9IExJVkUuZ2V0KHZhbHVlKTtcbiAgcmV0dXJuIGxpdmUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogbGl2ZSgpO1xufVxuXG4vKiogQSBwbGFpbiBvYmplY3Qgb3IgYXJyYXkg4oCUIHRoZSBvbmx5IGNvbnRhaW5lcnMgdGhlIHdhbGsgZW50ZXJzIChhIGBEYXRlYCwgYE1hcGAgb3IgY2xhc3MgaW5zdGFuY2UgaXMgYSBsZWFmKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5Db250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKipcbiAqIGB2YWx1ZWAgd2l0aCBldmVyeSBoYW5kbGUgaW5zaWRlIGl0IHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZSBiZWhpbmQgaXQuXG4gKlxuICogQSBoYW5kbGUgaXMgcmVwbGFjZWQgaW4gTygxKSBhbmQgTk9UIGVudGVyZWQgKHRoZSBzdGF0ZSBiZWhpbmQgaXQgaG9sZHMgbm9cbiAqIGhhbmRsZXMg4oCUIHRoZXkgYXJlIGJ1aWx0IG9uIHJlYWQsIG5ldmVyIHN0b3JlZCkuIEEgcGxhaW4gY29udGFpbmVyIGlzXG4gKiB3YWxrZWQgYW5kIGNvcGllZCBPTkxZIHdoZW4gc29tZXRoaW5nIGluc2lkZSBpdCBjaGFuZ2VkLCBzbyBhIGhhbmRsZS1mcmVlXG4gKiB2YWx1ZSBpcyByZXR1cm5lZCBhcyB0aGUgc2FtZSByZWZlcmVuY2UgYW5kIGEgaGFuZC1idWlsdCBgeyBpdGVtLCBpbmRleCB9YFxuICogYXJvdW5kIG9uZSBoYW5kbGUgY29zdHMgb25lIG9iamVjdC4gQW55dGhpbmcgZWxzZSAoYSBgRGF0ZWAsIGEgYE1hcGAsIGFcbiAqIGNsYXNzIGluc3RhbmNlLCBhIHByaW1pdGl2ZSkgaXMgYSBsZWFmLiBBIGN5Y2xlIGFtb25nIHBsYWluIGNvbnRhaW5lcnMgaXNcbiAqIGxlZnQgYXMgaXQgaXMg4oCUIGBzdHJ1Y3R1cmVkQ2xvbmVgIGhhbmRsZXMgY3ljbGVzOyBvbmx5IGEgUHJveHkgc3RvcHMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBIYW5kbGVzPFQ+KHZhbHVlOiBUKTogVCB7XG4gIHJldHVybiB3YWxrKHZhbHVlLCBuZXcgU2V0KCkpIGFzIFQ7XG59XG5cbmZ1bmN0aW9uIHdhbGsodmFsdWU6IHVua25vd24sIG9uUGF0aDogU2V0PG9iamVjdD4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgbGl2ZSA9IExJVkUuZ2V0KHZhbHVlKTtcbiAgaWYgKGxpdmUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGxpdmUoKTtcbiAgaWYgKCFpc1BsYWluQ29udGFpbmVyKHZhbHVlKSB8fCBvblBhdGguaGFzKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBvblBhdGguYWRkKHZhbHVlKTtcbiAgY29uc3Qgb3V0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB3YWxrQXJyYXkodmFsdWUsIG9uUGF0aCkgOiB3YWxrT2JqZWN0KHZhbHVlLCBvblBhdGgpO1xuICBvblBhdGguZGVsZXRlKHZhbHVlKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gd2Fsa0FycmF5KHZhbHVlOiB1bmtub3duW10sIG9uUGF0aDogU2V0PG9iamVjdD4pOiB1bmtub3duW10ge1xuICBsZXQgY29weTogdW5rbm93bltdIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbmV4dCA9IHdhbGsodmFsdWVbaV0sIG9uUGF0aCk7XG4gICAgaWYgKG5leHQgPT09IHZhbHVlW2ldKSBjb250aW51ZTtcbiAgICBjb3B5ID8/PSBbLi4udmFsdWVdO1xuICAgIGNvcHlbaV0gPSBuZXh0O1xuICB9XG4gIHJldHVybiBjb3B5ID8/IHZhbHVlO1xufVxuXG5mdW5jdGlvbiB3YWxrT2JqZWN0KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb25QYXRoOiBTZXQ8b2JqZWN0Pik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICBjb25zdCBuZXh0ID0gd2Fsayh2YWx1ZVtrZXldLCBvblBhdGgpO1xuICAgIGlmIChuZXh0ID09PSB2YWx1ZVtrZXldKSBjb250aW51ZTtcbiAgICBjb3B5ID8/PSB7IC4uLnZhbHVlIH07XG4gICAgY29weVtrZXldID0gbmV4dDtcbiAgfVxuICByZXR1cm4gY29weSA/PyB2YWx1ZTtcbn1cbiJdfQ==
@@ -11,4 +11,5 @@ export { BREAK_SETTER, EXECUTOR_INTERNAL_METHODS, IS_TYPED_SCOPE, SCOPE_METHOD_N
11
11
  export { createTypedScope } from './createTypedScope.js';
12
12
  export { shouldWrapWithProxy } from './allowlist.js';
13
13
  export { createArrayProxy } from './arrayTraps.js';
14
+ export { isHandle, unwrapHandles, valueBehind } from './handles.js';
14
15
  export { buildNestedPatch, joinPath } from './pathBuilder.js';
@@ -13,5 +13,6 @@ export { createTypedScope } from './createTypedScope.js';
13
13
  // Utilities
14
14
  export { shouldWrapWithProxy } from './allowlist.js';
15
15
  export { createArrayProxy } from './arrayTraps.js';
16
+ export { isHandle, unwrapHandles, valueBehind } from './handles.js';
16
17
  export { buildNestedPatch, joinPath } from './pathBuilder.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFLSCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekcsZUFBZTtBQUNmLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpELFlBQVk7QUFDWixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlLyAtLSBEZWVwIFByb3h5IHN5c3RlbSBmb3IgVHlwZWRTY29wZTxUPi5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgdG8gZm9vdHByaW50anMgc2NvcGUgc3RhdGU6XG4gKiAgIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgIGluc3RlYWQgb2YgIHNjb3BlLnNldFZhbHVlKCdjcmVkaXRUaWVyJywgJ0EnKVxuICogICBzY29wZS5jdXN0b21lci5hZGRyZXNzLnppcCA9ICc5MDIxMCcgIGluc3RlYWQgb2YgIHNjb3BlLnVwZGF0ZVZhbHVlKC4uLilcbiAqICAgc2NvcGUudGFncy5wdXNoKCd2aXAnKSAgaW5zdGVhZCBvZiAgc2NvcGUuc2V0VmFsdWUoJ3RhZ3MnLCBbLi4udGFncywgJ3ZpcCddKVxuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBSdW50aW1lIGNvbnN0YW50c1xuZXhwb3J0IHsgQlJFQUtfU0VUVEVSLCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTLCBJU19UWVBFRF9TQ09QRSwgU0NPUEVfTUVUSE9EX05BTUVTIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIENvcmUgZmFjdG9yeVxuZXhwb3J0IHsgY3JlYXRlVHlwZWRTY29wZSB9IGZyb20gJy4vY3JlYXRlVHlwZWRTY29wZS5qcyc7XG5cbi8vIFV0aWxpdGllc1xuZXhwb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmV4cG9ydCB7IGNyZWF0ZUFycmF5UHJveHkgfSBmcm9tICcuL2FycmF5VHJhcHMuanMnO1xuZXhwb3J0IHsgYnVpbGROZXN0ZWRQYXRjaCwgam9pblBhdGggfSBmcm9tICcuL3BhdGhCdWlsZGVyLmpzJztcbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFLSCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekcsZUFBZTtBQUNmLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpELFlBQVk7QUFDWixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS8gLS0gRGVlcCBQcm94eSBzeXN0ZW0gZm9yIFR5cGVkU2NvcGU8VD4uXG4gKlxuICogUHJvdmlkZXMgdHlwZWQgcHJvcGVydHkgYWNjZXNzIHRvIGZvb3RwcmludGpzIHNjb3BlIHN0YXRlOlxuICogICBzY29wZS5jcmVkaXRUaWVyID0gJ0EnICBpbnN0ZWFkIG9mICBzY29wZS5zZXRWYWx1ZSgnY3JlZGl0VGllcicsICdBJylcbiAqICAgc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnICBpbnN0ZWFkIG9mICBzY29wZS51cGRhdGVWYWx1ZSguLi4pXG4gKiAgIHNjb3BlLnRhZ3MucHVzaCgndmlwJykgIGluc3RlYWQgb2YgIHNjb3BlLnNldFZhbHVlKCd0YWdzJywgWy4uLnRhZ3MsICd2aXAnXSlcbiAqL1xuXG4vLyBUeXBlc1xuZXhwb3J0IHR5cGUgeyBSZWFjdGl2ZU9wdGlvbnMsIFJlYWN0aXZlVGFyZ2V0LCBTY29wZU1ldGhvZHMsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gUnVudGltZSBjb25zdGFudHNcbmV4cG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBDb3JlIGZhY3RvcnlcbmV4cG9ydCB7IGNyZWF0ZVR5cGVkU2NvcGUgfSBmcm9tICcuL2NyZWF0ZVR5cGVkU2NvcGUuanMnO1xuXG4vLyBVdGlsaXRpZXNcbmV4cG9ydCB7IHNob3VsZFdyYXBXaXRoUHJveHkgfSBmcm9tICcuL2FsbG93bGlzdC5qcyc7XG5leHBvcnQgeyBjcmVhdGVBcnJheVByb3h5IH0gZnJvbSAnLi9hcnJheVRyYXBzLmpzJztcbmV4cG9ydCB7IGlzSGFuZGxlLCB1bndyYXBIYW5kbGVzLCB2YWx1ZUJlaGluZCB9IGZyb20gJy4vaGFuZGxlcy5qcyc7XG5leHBvcnQgeyBidWlsZE5lc3RlZFBhdGNoLCBqb2luUGF0aCB9IGZyb20gJy4vcGF0aEJ1aWxkZXIuanMnO1xuIl19