footprintjs 9.44.0 → 9.44.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CLAUDE.md +6 -5
  2. package/dist/esm/lib/capture/freeze.d.ts +51 -7
  3. package/dist/esm/lib/capture/freeze.js +289 -24
  4. package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
  5. package/dist/esm/lib/capture/valueKinds.js +142 -0
  6. package/dist/esm/lib/memory/EventLog.d.ts +24 -6
  7. package/dist/esm/lib/memory/EventLog.js +30 -10
  8. package/dist/esm/lib/memory/admission.js +4 -3
  9. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  10. package/dist/esm/lib/memory/equality.d.ts +55 -19
  11. package/dist/esm/lib/memory/equality.js +154 -51
  12. package/dist/esm/lib/memory/logModel.js +11 -4
  13. package/dist/esm/lib/memory/redaction.d.ts +21 -0
  14. package/dist/esm/lib/memory/redaction.js +64 -7
  15. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
  16. package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
  17. package/dist/esm/lib/runner/snapshot.js +17 -3
  18. package/dist/esm/lib/slice/elementProvenance.js +2 -2
  19. package/dist/esm/lib/time-travel/chain.js +28 -26
  20. package/dist/lib/capture/freeze.js +292 -25
  21. package/dist/lib/capture/valueKinds.js +146 -0
  22. package/dist/lib/memory/EventLog.js +29 -9
  23. package/dist/lib/memory/admission.js +4 -3
  24. package/dist/lib/memory/borrowedMutation.js +2 -2
  25. package/dist/lib/memory/equality.js +154 -51
  26. package/dist/lib/memory/logModel.js +11 -4
  27. package/dist/lib/memory/redaction.js +66 -8
  28. package/dist/lib/runner/ExecutionRuntime.js +14 -9
  29. package/dist/lib/runner/snapshot.js +16 -2
  30. package/dist/lib/slice/elementProvenance.js +2 -2
  31. package/dist/lib/time-travel/chain.js +27 -25
  32. package/dist/types/lib/capture/freeze.d.ts +51 -7
  33. package/dist/types/lib/capture/valueKinds.d.ts +57 -0
  34. package/dist/types/lib/memory/EventLog.d.ts +24 -6
  35. package/dist/types/lib/memory/equality.d.ts +55 -19
  36. package/dist/types/lib/memory/redaction.d.ts +21 -0
  37. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
  38. package/package.json +2 -1
@@ -1,8 +1,10 @@
1
1
  /**
2
- * equality.ts — structural equality of committed-state values. A leaf (L0,
3
- * imports nothing): what `TransactionBuffer`'s net-change filter, the admitted
4
- * record's compare and the borrowed-mutation guard all ask. Re-exported from
5
- * `utils.ts`, so no importer moved.
2
+ * equality.ts — structural equality of committed-state values: THE owner of
3
+ * "what counts as a change". What `TransactionBuffer`'s net-change filter, the
4
+ * admitted record's compare, the read model's writer rule and the
5
+ * borrowed-mutation guard all ask. Its one import is the classifier of value
6
+ * kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
7
+ * importer moved.
6
8
  */
7
9
  /**
8
10
  * Structural deep equality for committed-state values.
@@ -10,26 +12,42 @@
10
12
  * Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
11
13
  * a path or merely re-wrote / reverted it to the value it already held (a
12
14
  * "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
13
- * borrowed read moved. Committed state must survive `structuredClone`, and
14
- * `structuredClone` keeps `Date`, `Map` and `Set` — so those are legal state
15
- * values (a `$setValue` bypasses the proxy's JSON round-trip) and this must
16
- * tell two of them apart. Before 9.22.0 it compared them as plain objects, and
17
- * a `Date`/`Map`/`Set` has no own enumerable keys: every pair was "equal", so
18
- * `$setValue('k', new Date(1999))` over a 2020 date was dropped as a no-op —
19
- * no trace row, state unchanged — and a `setFullYear` in place slipped past
20
- * the dev-mode guard.
15
+ * borrowed read moved. Committed state must survive `structuredClone`, so the
16
+ * values it can hold are the kinds the clone keeps, and two values are equal
17
+ * when a record holds the same thing for both. Every kind has ONE arm below
18
+ * (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
19
+ * compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
20
+ * as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
21
+ * a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
22
+ * were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
23
+ * live state kept the OLD value.
21
24
  *
22
25
  * Semantics:
23
26
  * - reference / identical-primitive short-circuits first (cheap fast path)
24
27
  * - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
28
+ * - two values of different KINDS are never equal (a `Date` is never `{}`,
29
+ * an array never `{ 0: … }`)
25
30
  * - `Date`: same `getTime()` (two invalid dates are equal)
31
+ * - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
32
+ * - `Error`: the same restored kind (one of the six built-in error names,
33
+ * else `Error`), own `message`, `stack` and own `cause` (deep) — what the
34
+ * clone keeps; any other own field is dropped by it, so it never counts
35
+ * (the admitted record's law)
36
+ * - a boxed primitive: the same wrapper type and the same primitive inside
37
+ * - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
38
+ * `DataView`: its type and the bytes IT views — never the rest of its
39
+ * buffer (a Node `Buffer` views a slice of a shared pool, and the record
40
+ * keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
26
41
  * - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
27
42
  * keys by `Map` identity (`SameValueZero`), values deep
28
43
  * - `Set`: same size AND every member of `a` is deep-equal to SOME member
29
44
  * of `b` (order-insensitive — a Set has no order to compare by)
30
- * - a typed value against a plain value, or two different typed kinds → not
31
- * equal (a `Date` is never `{}`)
32
- * - arrays: equal length AND deep-equal element-wise (order-sensitive)
45
+ * - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
46
+ * read): by the caller's {@link OpaqueRule} — equal only to itself by
47
+ * default (replacing one is always a change), or, when both sides are
48
+ * copies of one record, equal to any other of its kind
49
+ * - arrays: equal length AND deep-equal element-wise (order-sensitive; an
50
+ * array's expando keys are out of contract and not compared)
33
51
  * - objects: identical set of keys that HOLD a value AND deep-equal per key.
34
52
  * An own key whose value is `undefined` counts as ABSENT: it is this
35
53
  * library's other spelling of a deleted key (`'full'` mode flattens
@@ -38,11 +56,13 @@
38
56
  * mirror — reads the two spellings as one state. So must the net-change
39
57
  * filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
40
58
  * are untouched — a slot holding `undefined` is still a slot.
41
- * - mismatched kinds (array vs object, object vs null) → not equal
42
59
  *
43
60
  * Cost & safety:
44
- * - Allocates NOTHING but transient `Object.keys` arrays — no clones. It is
45
- * strictly cheaper than the `structuredClone` the commit already performs.
61
+ * - Allocates only transient `Object.keys` arrays, an error's property
62
+ * descriptors and a byte view per compared buffer — no clones (but one
63
+ * probe clone per class prototype, remembered: `capture/valueKinds.ts ·
64
+ * kindOf`). It is strictly cheaper than the `structuredClone` the commit
65
+ * already performs.
46
66
  * - Primitive comparisons (the bulk of state) are O(1) via the `===` /
47
67
  * `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
48
68
  * by the value's own size.
@@ -54,4 +74,20 @@
54
74
  * change. Dev mode still warns about cycles at write time
55
75
  * (`ScopeFacade.setValue`) because they surprise narrative and JSON.
56
76
  */
57
- export declare function deepEqual(a: any, b: any): boolean;
77
+ export declare function deepEqual(a: any, b: any, opaque?: OpaqueRule): boolean;
78
+ /**
79
+ * How {@link deepEqual} compares two OPAQUE values (a Blob, a `DOMException` —
80
+ * content this library cannot read):
81
+ *
82
+ * - `'identity'` (the default) — equal only to itself. The answer when one
83
+ * side is a value a stage handed in: the net-change filter
84
+ * (`TransactionBuffer`), the append check (`deltaEncoding`). A new object
85
+ * is a change, because nothing can say it is not.
86
+ * - `'copies'` — equal to any other of its kind. The answer when BOTH sides
87
+ * are copies of one recorded value — a fold's generations (`logModel`,
88
+ * `elementProvenance`), a retained read against live state
89
+ * (`borrowedMutation`), the record replayed against the read-back
90
+ * (`admission`): copies never share identity, so identity would call every
91
+ * opaque value changed.
92
+ */
93
+ export type OpaqueRule = 'identity' | 'copies';
@@ -1,35 +1,54 @@
1
1
  /**
2
- * equality.ts — structural equality of committed-state values. A leaf (L0,
3
- * imports nothing): what `TransactionBuffer`'s net-change filter, the admitted
4
- * record's compare and the borrowed-mutation guard all ask. Re-exported from
5
- * `utils.ts`, so no importer moved.
2
+ * equality.ts — structural equality of committed-state values: THE owner of
3
+ * "what counts as a change". What `TransactionBuffer`'s net-change filter, the
4
+ * admitted record's compare, the read model's writer rule and the
5
+ * borrowed-mutation guard all ask. Its one import is the classifier of value
6
+ * kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
7
+ * importer moved.
6
8
  */
9
+ import { kindOf } from '../capture/valueKinds.js';
7
10
  /**
8
11
  * Structural deep equality for committed-state values.
9
12
  *
10
13
  * Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
11
14
  * a path or merely re-wrote / reverted it to the value it already held (a
12
15
  * "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
13
- * borrowed read moved. Committed state must survive `structuredClone`, and
14
- * `structuredClone` keeps `Date`, `Map` and `Set` — so those are legal state
15
- * values (a `$setValue` bypasses the proxy's JSON round-trip) and this must
16
- * tell two of them apart. Before 9.22.0 it compared them as plain objects, and
17
- * a `Date`/`Map`/`Set` has no own enumerable keys: every pair was "equal", so
18
- * `$setValue('k', new Date(1999))` over a 2020 date was dropped as a no-op —
19
- * no trace row, state unchanged — and a `setFullYear` in place slipped past
20
- * the dev-mode guard.
16
+ * borrowed read moved. Committed state must survive `structuredClone`, so the
17
+ * values it can hold are the kinds the clone keeps, and two values are equal
18
+ * when a record holds the same thing for both. Every kind has ONE arm below
19
+ * (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
20
+ * compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
21
+ * as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
22
+ * a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
23
+ * were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
24
+ * live state kept the OLD value.
21
25
  *
22
26
  * Semantics:
23
27
  * - reference / identical-primitive short-circuits first (cheap fast path)
24
28
  * - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
29
+ * - two values of different KINDS are never equal (a `Date` is never `{}`,
30
+ * an array never `{ 0: … }`)
25
31
  * - `Date`: same `getTime()` (two invalid dates are equal)
32
+ * - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
33
+ * - `Error`: the same restored kind (one of the six built-in error names,
34
+ * else `Error`), own `message`, `stack` and own `cause` (deep) — what the
35
+ * clone keeps; any other own field is dropped by it, so it never counts
36
+ * (the admitted record's law)
37
+ * - a boxed primitive: the same wrapper type and the same primitive inside
38
+ * - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
39
+ * `DataView`: its type and the bytes IT views — never the rest of its
40
+ * buffer (a Node `Buffer` views a slice of a shared pool, and the record
41
+ * keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
26
42
  * - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
27
43
  * keys by `Map` identity (`SameValueZero`), values deep
28
44
  * - `Set`: same size AND every member of `a` is deep-equal to SOME member
29
45
  * of `b` (order-insensitive — a Set has no order to compare by)
30
- * - a typed value against a plain value, or two different typed kinds → not
31
- * equal (a `Date` is never `{}`)
32
- * - arrays: equal length AND deep-equal element-wise (order-sensitive)
46
+ * - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
47
+ * read): by the caller's {@link OpaqueRule} — equal only to itself by
48
+ * default (replacing one is always a change), or, when both sides are
49
+ * copies of one record, equal to any other of its kind
50
+ * - arrays: equal length AND deep-equal element-wise (order-sensitive; an
51
+ * array's expando keys are out of contract and not compared)
33
52
  * - objects: identical set of keys that HOLD a value AND deep-equal per key.
34
53
  * An own key whose value is `undefined` counts as ABSENT: it is this
35
54
  * library's other spelling of a deleted key (`'full'` mode flattens
@@ -38,11 +57,13 @@
38
57
  * mirror — reads the two spellings as one state. So must the net-change
39
58
  * filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
40
59
  * are untouched — a slot holding `undefined` is still a slot.
41
- * - mismatched kinds (array vs object, object vs null) → not equal
42
60
  *
43
61
  * Cost & safety:
44
- * - Allocates NOTHING but transient `Object.keys` arrays — no clones. It is
45
- * strictly cheaper than the `structuredClone` the commit already performs.
62
+ * - Allocates only transient `Object.keys` arrays, an error's property
63
+ * descriptors and a byte view per compared buffer — no clones (but one
64
+ * probe clone per class prototype, remembered: `capture/valueKinds.ts ·
65
+ * kindOf`). It is strictly cheaper than the `structuredClone` the commit
66
+ * already performs.
46
67
  * - Primitive comparisons (the bulk of state) are O(1) via the `===` /
47
68
  * `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
48
69
  * by the value's own size.
@@ -54,10 +75,10 @@
54
75
  * change. Dev mode still warns about cycles at write time
55
76
  * (`ScopeFacade.setValue`) because they surprise narrative and JSON.
56
77
  */
57
- export function deepEqual(a, b) {
58
- return equalPairs(a, b, undefined);
78
+ export function deepEqual(a, b, opaque = 'identity') {
79
+ return equalPairs(a, b, undefined, opaque);
59
80
  }
60
- function equalPairs(a, b, seen) {
81
+ function equalPairs(a, b, seen, opaque) {
61
82
  if (a === b)
62
83
  return true; // same reference or identical primitive
63
84
  if (typeof a !== typeof b)
@@ -66,16 +87,35 @@ function equalPairs(a, b, seen) {
66
87
  return a === b; // one is null, the other isn't
67
88
  if (typeof a !== 'object')
68
89
  return Object.is(a, b); // NaN-safe primitive compare
69
- // Typed arms first — a Date/Map/Set has no own enumerable keys, so the
70
- // plain-object walk below would call any two of them equal.
71
- const aKind = typedKind(a);
72
- if (aKind !== typedKind(b))
90
+ const kind = kindOf(a);
91
+ if (kind !== kindOf(b))
73
92
  return false;
74
- if (aKind === 'date')
75
- return Object.is(a.getTime(), b.getTime());
76
- const aIsArray = Array.isArray(a);
77
- if (aIsArray !== Array.isArray(b))
78
- return false; // array vs plain object
93
+ switch (kind) {
94
+ // Atoms: their content is a slot, not their keys.
95
+ case 'date':
96
+ return Object.is(Date.prototype.getTime.call(a), Date.prototype.getTime.call(b));
97
+ case 'regexp':
98
+ return a.source === b.source && a.flags === b.flags;
99
+ case 'boxed':
100
+ return tagOf(a) === tagOf(b) && equalPairs(a.valueOf(), b.valueOf(), seen, opaque);
101
+ case 'buffer':
102
+ return equalBuffers(a, b);
103
+ case 'view':
104
+ return equalViews(a, b);
105
+ case 'opaque':
106
+ return opaque === 'copies' && tagOf(a) === tagOf(b); // `a === b` was answered above
107
+ case 'plain':
108
+ case 'array':
109
+ case 'map':
110
+ case 'set':
111
+ case 'error':
112
+ return equalContainers(a, b, kind, seen, opaque);
113
+ default:
114
+ return unknownKind(kind);
115
+ }
116
+ }
117
+ /** The kinds whose content is other values: compared part by part, under the cycle guard. */
118
+ function equalContainers(a, b, kind, seen, opaque) {
79
119
  // Cycle guard — a pair we are already inside is equal by assumption.
80
120
  seen ??= new WeakMap();
81
121
  let partners = seen.get(a);
@@ -84,15 +124,17 @@ function equalPairs(a, b, seen) {
84
124
  if (!partners)
85
125
  seen.set(a, (partners = new WeakSet()));
86
126
  partners.add(b);
87
- if (aKind === 'map')
88
- return equalMaps(a, b, seen);
89
- if (aKind === 'set')
90
- return equalSets(a, b, seen);
91
- if (aIsArray) {
127
+ if (kind === 'map')
128
+ return equalMaps(a, b, seen, opaque);
129
+ if (kind === 'set')
130
+ return equalSets(a, b, seen, opaque);
131
+ if (kind === 'error')
132
+ return equalErrors(a, b, seen, opaque);
133
+ if (kind === 'array') {
92
134
  if (a.length !== b.length)
93
135
  return false;
94
136
  for (let i = 0; i < a.length; i++) {
95
- if (!equalPairs(a[i], b[i], seen))
137
+ if (!equalPairs(a[i], b[i], seen, opaque))
96
138
  return false;
97
139
  }
98
140
  return true;
@@ -106,7 +148,7 @@ function equalPairs(a, b, seen) {
106
148
  aHeld++;
107
149
  if (!Object.prototype.hasOwnProperty.call(b, key))
108
150
  return false;
109
- if (!equalPairs(a[key], b[key], seen))
151
+ if (!equalPairs(a[key], b[key], seen, opaque))
110
152
  return false;
111
153
  }
112
154
  let bHeld = 0;
@@ -115,23 +157,84 @@ function equalPairs(a, b, seen) {
115
157
  bHeld++;
116
158
  return aHeld === bHeld;
117
159
  }
118
- /** The typed state values `structuredClone` keeps and a key walk cannot see. */
119
- function typedKind(value) {
120
- if (value instanceof Date)
121
- return 'date';
122
- if (value instanceof Map)
123
- return 'map';
124
- if (value instanceof Set)
125
- return 'set';
126
- return undefined;
160
+ function unknownKind(kind) {
161
+ throw new TypeError(`deepEqual: no comparison for the value kind '${String(kind)}'`);
162
+ }
163
+ /** `[object Number]`, `[object Uint8Array]` … — the built-in type a boxed value or a view carries. */
164
+ function tagOf(value) {
165
+ return Object.prototype.toString.call(value);
166
+ }
167
+ /** The same view type over the same bytes — the bytes the view sees, wherever they sit in its buffer. */
168
+ function equalViews(a, b) {
169
+ if (tagOf(a) !== tagOf(b) || a.byteLength !== b.byteLength)
170
+ return false;
171
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset)
172
+ return true;
173
+ const p = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
174
+ const q = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
175
+ for (let i = 0; i < p.length; i++)
176
+ if (p[i] !== q[i])
177
+ return false;
178
+ return true;
179
+ }
180
+ /** The same length, resizability and bytes. */
181
+ function equalBuffers(a, b) {
182
+ if (a === b)
183
+ return true;
184
+ const x = a;
185
+ const y = b;
186
+ if (x.byteLength !== y.byteLength || x.resizable !== y.resizable || x.maxByteLength !== y.maxByteLength) {
187
+ return false;
188
+ }
189
+ const p = new Uint8Array(a);
190
+ const q = new Uint8Array(b);
191
+ for (let i = 0; i < p.length; i++)
192
+ if (p[i] !== q[i])
193
+ return false;
194
+ return true;
195
+ }
196
+ /** The six error names `structuredClone` restores; any other name comes back an `Error`. */
197
+ const ERROR_NAMES = new Set(['EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError']);
198
+ /**
199
+ * Two errors as the clone keeps them: the restored kind, the own `message`,
200
+ * the `stack` and the own `cause` (deep). Any other own field is dropped by
201
+ * the clone, so it never counts.
202
+ */
203
+ function equalErrors(a, b, seen, opaque) {
204
+ if (errorKindOf(a) !== errorKindOf(b) || stackOf(a) !== stackOf(b))
205
+ return false;
206
+ const aMessage = ownData(a, 'message');
207
+ const bMessage = ownData(b, 'message');
208
+ if (String(aMessage?.value) !== String(bMessage?.value) || !aMessage !== !bMessage)
209
+ return false;
210
+ const aCause = ownData(a, 'cause');
211
+ const bCause = ownData(b, 'cause');
212
+ if (!aCause || !bCause)
213
+ return !aCause === !bCause;
214
+ return equalPairs(aCause.value, bCause.value, seen, opaque);
215
+ }
216
+ function errorKindOf(error) {
217
+ const name = String(error.name);
218
+ return ERROR_NAMES.has(name) ? name : 'Error';
219
+ }
220
+ function stackOf(error) {
221
+ const stack = error.stack;
222
+ return typeof stack === 'string' ? stack : undefined;
223
+ }
224
+ /** An own DATA property, boxed — how the clone reads an error's `message` and `cause`. */
225
+ function ownData(value, key) {
226
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
227
+ return descriptor !== undefined && Object.prototype.hasOwnProperty.call(descriptor, 'value')
228
+ ? { value: descriptor.value }
229
+ : undefined;
127
230
  }
128
- function equalMaps(a, b, seen) {
231
+ function equalMaps(a, b, seen, opaque) {
129
232
  if (a.size !== b.size)
130
233
  return false;
131
234
  for (const [key, value] of a) {
132
235
  if (!b.has(key))
133
236
  return false;
134
- if (!equalPairs(value, b.get(key), seen))
237
+ if (!equalPairs(value, b.get(key), seen, opaque))
135
238
  return false;
136
239
  }
137
240
  return true;
@@ -140,7 +243,7 @@ function equalMaps(a, b, seen) {
140
243
  * Order-insensitive, deep per member. Quadratic in the worst case for sets of
141
244
  * objects — a set of primitives (the common shape) is one `has` per member.
142
245
  */
143
- function equalSets(a, b, seen) {
246
+ function equalSets(a, b, seen, opaque) {
144
247
  if (a.size !== b.size)
145
248
  return false;
146
249
  const unmatched = [...b];
@@ -149,11 +252,11 @@ function equalSets(a, b, seen) {
149
252
  // Each match retires its slot so two structurally-equal members of `a`
150
253
  // cannot both claim the same member of `b`.
151
254
  const at = unmatched.indexOf(member);
152
- const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen));
255
+ const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen, opaque));
153
256
  if (found < 0)
154
257
  return false;
155
258
  unmatched.splice(found, 1);
156
259
  }
157
260
  return true;
158
261
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUN0QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFXRCxTQUFTLFVBQVUsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLElBQTJCO0lBQzdELElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLHVFQUF1RTtJQUN2RSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QyxJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVq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LElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuIEEgbGVhZiAoTDAsXG4gKiBpbXBvcnRzIG5vdGhpbmcpOiB3aGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlIGFkbWl0dGVkXG4gKiByZWNvcmQncyBjb21wYXJlIGFuZCB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYWxsIGFzay4gUmUtZXhwb3J0ZWQgZnJvbVxuICogYHV0aWxzLnRzYCwgc28gbm8gaW1wb3J0ZXIgbW92ZWQuXG4gKi9cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRlZXAgZXF1YWxpdHkgZm9yIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXJ9IHRvIGRlY2lkZSB3aGV0aGVyIGEgc3RhZ2UgYWN0dWFsbHkgQ0hBTkdFRFxuICogYSBwYXRoIG9yIG1lcmVseSByZS13cm90ZSAvIHJldmVydGVkIGl0IHRvIHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhlbGQgKGFcbiAqIFwibm8tb3Agd3JpdGVcIiksIGFuZCBieSBgYm9ycm93ZWRNdXRhdGlvbi5maXJzdERpZmZlcmluZ1BhdGhgIHRvIGZpbmQgd2hlcmUgYVxuICogYm9ycm93ZWQgcmVhZCBtb3ZlZC4gQ29tbWl0dGVkIHN0YXRlIG11c3Qgc3Vydml2ZSBgc3RydWN0dXJlZENsb25lYCwgYW5kXG4gKiBgc3RydWN0dXJlZENsb25lYCBrZWVwcyBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCDigJQgc28gdGhvc2UgYXJlIGxlZ2FsIHN0YXRlXG4gKiB2YWx1ZXMgKGEgYCRzZXRWYWx1ZWAgYnlwYXNzZXMgdGhlIHByb3h5J3MgSlNPTiByb3VuZC10cmlwKSBhbmQgdGhpcyBtdXN0XG4gKiB0ZWxsIHR3byBvZiB0aGVtIGFwYXJ0LiBCZWZvcmUgOS4yMi4wIGl0IGNvbXBhcmVkIHRoZW0gYXMgcGxhaW4gb2JqZWN0cywgYW5kXG4gKiBhIGBEYXRlYC9gTWFwYC9gU2V0YCBoYXMgbm8gb3duIGVudW1lcmFibGUga2V5czogZXZlcnkgcGFpciB3YXMgXCJlcXVhbFwiLCBzb1xuICogYCRzZXRWYWx1ZSgnaycsIG5ldyBEYXRlKDE5OTkpKWAgb3ZlciBhIDIwMjAgZGF0ZSB3YXMgZHJvcHBlZCBhcyBhIG5vLW9wIOKAlFxuICogbm8gdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQg4oCUIGFuZCBhIGBzZXRGdWxsWWVhcmAgaW4gcGxhY2Ugc2xpcHBlZCBwYXN0XG4gKiB0aGUgZGV2LW1vZGUgZ3VhcmQuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gYERhdGVgOiBzYW1lIGBnZXRUaW1lKClgICh0d28gaW52YWxpZCBkYXRlcyBhcmUgZXF1YWwpXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYSB0eXBlZCB2YWx1ZSBhZ2FpbnN0IGEgcGxhaW4gdmFsdWUsIG9yIHR3byBkaWZmZXJlbnQgdHlwZWQga2luZHMg4oaSIG5vdFxuICogICAgIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gKVxuICogICAtIGFycmF5czogZXF1YWwgbGVuZ3RoIEFORCBkZWVwLWVxdWFsIGVsZW1lbnQtd2lzZSAob3JkZXItc2Vuc2l0aXZlKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICogICAtIG1pc21hdGNoZWQga2luZHMgKGFycmF5IHZzIG9iamVjdCwgb2JqZWN0IHZzIG51bGwpIOKGkiBub3QgZXF1YWxcbiAqXG4gKiBDb3N0ICYgc2FmZXR5OlxuICogICAtIEFsbG9jYXRlcyBOT1RISU5HIGJ1dCB0cmFuc2llbnQgYE9iamVjdC5rZXlzYCBhcnJheXMg4oCUIG5vIGNsb25lcy4gSXQgaXNcbiAqICAgICBzdHJpY3RseSBjaGVhcGVyIHRoYW4gdGhlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoZSBjb21taXQgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogT2JqZWN0IHBhaXJzIG1ldCBzbyBmYXIsIGtleWVkIGBhIOKGkiB0aGUgYidzIGl0IGhhcyBiZWVuIHBhaXJlZCB3aXRoYC4gQ3JlYXRlZFxuICogbGF6aWx5IGJ5IHRoZSBmaXJzdCBvYmplY3QgcGFpciwgc28gcHJpbWl0aXZlIGNvbXBhcmVzIGFsbG9jYXRlIG5vdGhpbmcuXG4gKiBOZXZlciBwcnVuZWQ6IGV2ZXJ5IGBmYWxzZWAgcmV0dXJucyBzdHJhaWdodCB1cCB0byB0aGUgY2FsbGVyIChlYWNoIHJlY3Vyc2l2ZVxuICogY2FsbCBzaG9ydC1jaXJjdWl0cyBvbiBpdCksIHNvIG5vdGhpbmcgaXMgbG9va2VkIHVwIGFmdGVyIGEgbWlzbWF0Y2gg4oCUIGFcbiAqIHN0b3JlZCBwYWlyIGlzIGVpdGhlciBzdGlsbCB1bmRlciBjb21wYXJpc29uIG9yIGFscmVhZHkga25vd24gZXF1YWwuXG4gKi9cbnR5cGUgU2VlblBhaXJzID0gV2Vha01hcDxvYmplY3QsIFdlYWtTZXQ8b2JqZWN0Pj47XG5cbmZ1bmN0aW9uIGVxdWFsUGFpcnMoYTogYW55LCBiOiBhbnksIHNlZW46IFNlZW5QYWlycyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIC8vIFR5cGVkIGFybXMgZmlyc3Qg4oCUIGEgRGF0ZS9NYXAvU2V0IGhhcyBubyBvd24gZW51bWVyYWJsZSBrZXlzLCBzbyB0aGVcbiAgLy8gcGxhaW4tb2JqZWN0IHdhbGsgYmVsb3cgd291bGQgY2FsbCBhbnkgdHdvIG9mIHRoZW0gZXF1YWwuXG4gIGNvbnN0IGFLaW5kID0gdHlwZWRLaW5kKGEpO1xuICBpZiAoYUtpbmQgIT09IHR5cGVkS2luZChiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUtpbmQgPT09ICdkYXRlJykgcmV0dXJuIE9iamVjdC5pcyhhLmdldFRpbWUoKSwgYi5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IGFJc0FycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7IC8vIGFycmF5IHZzIHBsYWluIG9iamVjdFxuXG4gIC8vIEN5Y2xlIGd1YXJkIOKAlCBhIHBhaXIgd2UgYXJlIGFscmVhZHkgaW5zaWRlIGlzIGVxdWFsIGJ5IGFzc3VtcHRpb24uXG4gIHNlZW4gPz89IG5ldyBXZWFrTWFwKCk7XG4gIGxldCBwYXJ0bmVycyA9IHNlZW4uZ2V0KGEpO1xuICBpZiAocGFydG5lcnM/LmhhcyhiKSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGFydG5lcnMpIHNlZW4uc2V0KGEsIChwYXJ0bmVycyA9IG5ldyBXZWFrU2V0KCkpKTtcbiAgcGFydG5lcnMuYWRkKGIpO1xuXG4gIGlmIChhS2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbik7XG4gIGlmIChhS2luZCA9PT0gJ3NldCcpIHJldHVybiBlcXVhbFNldHMoYSwgYiwgc2Vlbik7XG5cbiAgaWYgKGFJc0FycmF5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbFBhaXJzKGFbaV0sIGJbaV0sIHNlZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT2JqZWN0czogb25seSBrZXlzIHRoYXQgSE9MRCBhIHZhbHVlIHRha2UgcGFydCDigJQgYW4gb3duIGB1bmRlZmluZWRgIGlzIGFcbiAgLy8gZGVsZXRlZCBrZXksIHRoZSBzYW1lIHN0YXRlIGFzIGFuIGFic2VudCBvbmUgKHNlZSB0aGUgY29udHJhY3QgYWJvdmUpLlxuICBsZXQgYUhlbGQgPSAwO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhKSkge1xuICAgIGlmIChhW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgYUhlbGQrKztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKGFba2V5XSwgYltrZXldLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbi8qKiBUaGUgdHlwZWQgc3RhdGUgdmFsdWVzIGBzdHJ1Y3R1cmVkQ2xvbmVgIGtlZXBzIGFuZCBhIGtleSB3YWxrIGNhbm5vdCBzZWUuICovXG5mdW5jdGlvbiB0eXBlZEtpbmQodmFsdWU6IG9iamVjdCk6ICdkYXRlJyB8ICdtYXAnIHwgJ3NldCcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHJldHVybiAnbWFwJztcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gJ3NldCc7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGVxdWFsTWFwcyhhOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIGI6IE1hcDx1bmtub3duLCB1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIE9yZGVyLWluc2Vuc2l0aXZlLCBkZWVwIHBlciBtZW1iZXIuIFF1YWRyYXRpYyBpbiB0aGUgd29yc3QgY2FzZSBmb3Igc2V0cyBvZlxuICogb2JqZWN0cyDigJQgYSBzZXQgb2YgcHJpbWl0aXZlcyAodGhlIGNvbW1vbiBzaGFwZSkgaXMgb25lIGBoYXNgIHBlciBtZW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsU2V0cyhhOiBTZXQ8dW5rbm93bj4sIGI6IFNldDx1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB1bm1hdGNoZWQgPSBbLi4uYl07XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGEpIHtcbiAgICAvLyBTYW1lVmFsdWVaZXJvIGZpcnN0IOKAlCBwcmltaXRpdmVzIGFuZCBzaGFyZWQgcmVmZXJlbmNlcywgb25lIGBoYXNgLlxuICAgIC8vIEVhY2ggbWF0Y2ggcmV0aXJlcyBpdHMgc2xvdCBzbyB0d28gc3RydWN0dXJhbGx5LWVxdWFsIG1lbWJlcnMgb2YgYGFgXG4gICAgLy8gY2Fubm90IGJvdGggY2xhaW0gdGhlIHNhbWUgbWVtYmVyIG9mIGBiYC5cbiAgICBjb25zdCBhdCA9IHVubWF0Y2hlZC5pbmRleE9mKG1lbWJlcik7XG4gICAgY29uc3QgZm91bmQgPSBhdCA+PSAwID8gYXQgOiB1bm1hdGNoZWQuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGVxdWFsUGFpcnMobWVtYmVyLCBjYW5kaWRhdGUsIHNlZW4pKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1FRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxTQUFxQixVQUFVO0lBQ3ZFLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUE0QkQsU0FBUyxVQUFVLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUEyQixFQUFFLE1BQWtCO0lBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLGtEQUFrRDtR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QU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXM6IFRIRSBvd25lciBvZlxuICogXCJ3aGF0IGNvdW50cyBhcyBhIGNoYW5nZVwiLiBXaGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlXG4gKiBhZG1pdHRlZCByZWNvcmQncyBjb21wYXJlLCB0aGUgcmVhZCBtb2RlbCdzIHdyaXRlciBydWxlIGFuZCB0aGVcbiAqIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFsbCBhc2suIEl0cyBvbmUgaW1wb3J0IGlzIHRoZSBjbGFzc2lmaWVyIG9mIHZhbHVlXG4gKiBraW5kcyAoYGNhcHR1cmUvdmFsdWVLaW5kcy50c2AsIGEgbGVhZik7IHJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm9cbiAqIGltcG9ydGVyIG1vdmVkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVLaW5kLCBraW5kT2YgfSBmcm9tICcuLi9jYXB0dXJlL3ZhbHVlS2luZHMuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKSwgYW5kIGJ5IGBib3Jyb3dlZE11dGF0aW9uLmZpcnN0RGlmZmVyaW5nUGF0aGAgdG8gZmluZCB3aGVyZSBhXG4gKiBib3Jyb3dlZCByZWFkIG1vdmVkLiBDb21taXR0ZWQgc3RhdGUgbXVzdCBzdXJ2aXZlIGBzdHJ1Y3R1cmVkQ2xvbmVgLCBzbyB0aGVcbiAqIHZhbHVlcyBpdCBjYW4gaG9sZCBhcmUgdGhlIGtpbmRzIHRoZSBjbG9uZSBrZWVwcywgYW5kIHR3byB2YWx1ZXMgYXJlIGVxdWFsXG4gKiB3aGVuIGEgcmVjb3JkIGhvbGRzIHRoZSBzYW1lIHRoaW5nIGZvciBib3RoLiBFdmVyeSBraW5kIGhhcyBPTkUgYXJtIGJlbG93XG4gKiAoYGVxdWFsUGFpcnNgJyBzd2l0Y2ggb3ZlciBgVmFsdWVLaW5kYCDigJQgYSBraW5kIGFkZGVkIHRvIHRoZSB1bmlvbiBkb2VzIG5vdFxuICogY29tcGlsZSB1bnRpbCBpdCBpcyBjb21wYXJlZCkuIEJlZm9yZSA5LjIyLjAgYSBEYXRlLCBNYXAgb3IgU2V0IHdhcyBjb21wYXJlZFxuICogYXMgYW4gb2JqZWN0IHdpdGggbm8gb3duIGtleXMsIGFuZCB1bnRpbCA5LjQ0LjIgc28gd2VyZSBhIFJlZ0V4cCwgYW4gRXJyb3IsXG4gKiBhIGJveGVkIHByaW1pdGl2ZSwgYW4gQXJyYXlCdWZmZXIsIGEgRGF0YVZpZXcgYW5kIGEgQmxvYjogYW55IHR3byBvZiBhIGtpbmRcbiAqIHdlcmUgXCJlcXVhbFwiLCBzbyBgJHNldFZhbHVlKCdyZScsIC95L2cpYCBvdmVyIGAveC9nYCBjb21taXR0ZWQgbm8gcm93IGFuZFxuICogbGl2ZSBzdGF0ZSBrZXB0IHRoZSBPTEQgdmFsdWUuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gdHdvIHZhbHVlcyBvZiBkaWZmZXJlbnQgS0lORFMgYXJlIG5ldmVyIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gLFxuICogICAgIGFuIGFycmF5IG5ldmVyIGB7IDA6IOKApiB9YClcbiAqICAgLSBgRGF0ZWA6IHNhbWUgYGdldFRpbWUoKWAgKHR3byBpbnZhbGlkIGRhdGVzIGFyZSBlcXVhbClcbiAqICAgLSBgUmVnRXhwYDogc2FtZSBgc291cmNlYCBhbmQgYGZsYWdzYCAodGhlIGNsb25lIHJlc2V0cyBgbGFzdEluZGV4YClcbiAqICAgLSBgRXJyb3JgOiB0aGUgc2FtZSByZXN0b3JlZCBraW5kIChvbmUgb2YgdGhlIHNpeCBidWlsdC1pbiBlcnJvciBuYW1lcyxcbiAqICAgICBlbHNlIGBFcnJvcmApLCBvd24gYG1lc3NhZ2VgLCBgc3RhY2tgIGFuZCBvd24gYGNhdXNlYCAoZGVlcCkg4oCUIHdoYXQgdGhlXG4gKiAgICAgY2xvbmUga2VlcHM7IGFueSBvdGhlciBvd24gZmllbGQgaXMgZHJvcHBlZCBieSBpdCwgc28gaXQgbmV2ZXIgY291bnRzXG4gKiAgICAgKHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXcpXG4gKiAgIC0gYSBib3hlZCBwcmltaXRpdmU6IHRoZSBzYW1lIHdyYXBwZXIgdHlwZSBhbmQgdGhlIHNhbWUgcHJpbWl0aXZlIGluc2lkZVxuICogICAtIGFuIGBBcnJheUJ1ZmZlcmA6IGxlbmd0aCwgcmVzaXphYmlsaXR5IGFuZCBieXRlczsgYSB0eXBlZCBhcnJheSBvciBhXG4gKiAgICAgYERhdGFWaWV3YDogaXRzIHR5cGUgYW5kIHRoZSBieXRlcyBJVCB2aWV3cyDigJQgbmV2ZXIgdGhlIHJlc3Qgb2YgaXRzXG4gKiAgICAgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgYSBzbGljZSBvZiBhIHNoYXJlZCBwb29sLCBhbmQgdGhlIHJlY29yZFxuICogICAgIGtlZXBzIHRoZSB2aWV3J3MgYnl0ZXMgb25seTogYGNhcHR1cmUvZnJlZXplLnRzIMK3IGZyZWV6ZVJlY29yZGApXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYW4gT1BBUVVFIHZhbHVlIChhIEJsb2IsIGEgYERPTUV4Y2VwdGlvbmAg4oCUIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdFxuICogICAgIHJlYWQpOiBieSB0aGUgY2FsbGVyJ3Mge0BsaW5rIE9wYXF1ZVJ1bGV9IOKAlCBlcXVhbCBvbmx5IHRvIGl0c2VsZiBieVxuICogICAgIGRlZmF1bHQgKHJlcGxhY2luZyBvbmUgaXMgYWx3YXlzIGEgY2hhbmdlKSwgb3IsIHdoZW4gYm90aCBzaWRlcyBhcmVcbiAqICAgICBjb3BpZXMgb2Ygb25lIHJlY29yZCwgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kXG4gKiAgIC0gYXJyYXlzOiBlcXVhbCBsZW5ndGggQU5EIGRlZXAtZXF1YWwgZWxlbWVudC13aXNlIChvcmRlci1zZW5zaXRpdmU7IGFuXG4gKiAgICAgYXJyYXkncyBleHBhbmRvIGtleXMgYXJlIG91dCBvZiBjb250cmFjdCBhbmQgbm90IGNvbXBhcmVkKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIG9ubHkgdHJhbnNpZW50IGBPYmplY3Qua2V5c2AgYXJyYXlzLCBhbiBlcnJvcidzIHByb3BlcnR5XG4gKiAgICAgZGVzY3JpcHRvcnMgYW5kIGEgYnl0ZSB2aWV3IHBlciBjb21wYXJlZCBidWZmZXIg4oCUIG5vIGNsb25lcyAoYnV0IG9uZVxuICogICAgIHByb2JlIGNsb25lIHBlciBjbGFzcyBwcm90b3R5cGUsIHJlbWVtYmVyZWQ6IGBjYXB0dXJlL3ZhbHVlS2luZHMudHMgwrdcbiAqICAgICBraW5kT2ZgKS4gSXQgaXMgc3RyaWN0bHkgY2hlYXBlciB0aGFuIHRoZSBgc3RydWN0dXJlZENsb25lYCB0aGUgY29tbWl0XG4gKiAgICAgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55LCBvcGFxdWU6IE9wYXF1ZVJ1bGUgPSAnaWRlbnRpdHknKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCwgb3BhcXVlKTtcbn1cblxuLyoqXG4gKiBIb3cge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXMgdHdvIE9QQVFVRSB2YWx1ZXMgKGEgQmxvYiwgYSBgRE9NRXhjZXB0aW9uYCDigJRcbiAqIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkKTpcbiAqXG4gKiAgIC0gYCdpZGVudGl0eSdgICh0aGUgZGVmYXVsdCkg4oCUIGVxdWFsIG9ubHkgdG8gaXRzZWxmLiBUaGUgYW5zd2VyIHdoZW4gb25lXG4gKiAgICAgc2lkZSBpcyBhIHZhbHVlIGEgc3RhZ2UgaGFuZGVkIGluOiB0aGUgbmV0LWNoYW5nZSBmaWx0ZXJcbiAqICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyYCksIHRoZSBhcHBlbmQgY2hlY2sgKGBkZWx0YUVuY29kaW5nYCkuIEEgbmV3IG9iamVjdFxuICogICAgIGlzIGEgY2hhbmdlLCBiZWNhdXNlIG5vdGhpbmcgY2FuIHNheSBpdCBpcyBub3QuXG4gKiAgIC0gYCdjb3BpZXMnYCDigJQgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kLiBUaGUgYW5zd2VyIHdoZW4gQk9USCBzaWRlc1xuICogICAgIGFyZSBjb3BpZXMgb2Ygb25lIHJlY29yZGVkIHZhbHVlIOKAlCBhIGZvbGQncyBnZW5lcmF0aW9ucyAoYGxvZ01vZGVsYCxcbiAqICAgICBgZWxlbWVudFByb3ZlbmFuY2VgKSwgYSByZXRhaW5lZCByZWFkIGFnYWluc3QgbGl2ZSBzdGF0ZVxuICogICAgIChgYm9ycm93ZWRNdXRhdGlvbmApLCB0aGUgcmVjb3JkIHJlcGxheWVkIGFnYWluc3QgdGhlIHJlYWQtYmFja1xuICogICAgIChgYWRtaXNzaW9uYCk6IGNvcGllcyBuZXZlciBzaGFyZSBpZGVudGl0eSwgc28gaWRlbnRpdHkgd291bGQgY2FsbCBldmVyeVxuICogICAgIG9wYXF1ZSB2YWx1ZSBjaGFuZ2VkLlxuICovXG5leHBvcnQgdHlwZSBPcGFxdWVSdWxlID0gJ2lkZW50aXR5JyB8ICdjb3BpZXMnO1xuXG4vKipcbiAqIE9iamVjdCBwYWlycyBtZXQgc28gZmFyLCBrZXllZCBgYSDihpIgdGhlIGIncyBpdCBoYXMgYmVlbiBwYWlyZWQgd2l0aGAuIENyZWF0ZWRcbiAqIGxhemlseSBieSB0aGUgZmlyc3Qgb2JqZWN0IHBhaXIsIHNvIHByaW1pdGl2ZSBjb21wYXJlcyBhbGxvY2F0ZSBub3RoaW5nLlxuICogTmV2ZXIgcHJ1bmVkOiBldmVyeSBgZmFsc2VgIHJldHVybnMgc3RyYWlnaHQgdXAgdG8gdGhlIGNhbGxlciAoZWFjaCByZWN1cnNpdmVcbiAqIGNhbGwgc2hvcnQtY2lyY3VpdHMgb24gaXQpLCBzbyBub3RoaW5nIGlzIGxvb2tlZCB1cCBhZnRlciBhIG1pc21hdGNoIOKAlCBhXG4gKiBzdG9yZWQgcGFpciBpcyBlaXRoZXIgc3RpbGwgdW5kZXIgY29tcGFyaXNvbiBvciBhbHJlYWR5IGtub3duIGVxdWFsLlxuICovXG50eXBlIFNlZW5QYWlycyA9IFdlYWtNYXA8b2JqZWN0LCBXZWFrU2V0PG9iamVjdD4+O1xuXG5mdW5jdGlvbiBlcXVhbFBhaXJzKGE6IGFueSwgYjogYW55LCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIGNvbnN0IGtpbmQgPSBraW5kT2YoYSk7XG4gIGlmIChraW5kICE9PSBraW5kT2YoYikpIHJldHVybiBmYWxzZTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgLy8gQXRvbXM6IHRoZWlyIGNvbnRlbnQgaXMgYSBzbG90LCBub3QgdGhlaXIga2V5cy5cbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBPYmplY3QuaXMoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZS5jYWxsKGEpLCBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwoYikpO1xuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgY2FzZSAnYm94ZWQnOlxuICAgICAgcmV0dXJuIHRhZ09mKGEpID09PSB0YWdPZihiKSAmJiBlcXVhbFBhaXJzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSwgc2Vlbiwgb3BhcXVlKTtcbiAgICBjYXNlICdidWZmZXInOlxuICAgICAgcmV0dXJuIGVxdWFsQnVmZmVycyhhLCBiKTtcbiAgICBjYXNlICd2aWV3JzpcbiAgICAgIHJldHVybiBlcXVhbFZpZXdzKGEsIGIpO1xuICAgIGNhc2UgJ29wYXF1ZSc6XG4gICAgICByZXR1cm4gb3BhcXVlID09PSAnY29waWVzJyAmJiB0YWdPZihhKSA9PT0gdGFnT2YoYik7IC8vIGBhID09PSBiYCB3YXMgYW5zd2VyZWQgYWJvdmVcbiAgICBjYXNlICdwbGFpbic6XG4gICAgY2FzZSAnYXJyYXknOlxuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnc2V0JzpcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICByZXR1cm4gZXF1YWxDb250YWluZXJzKGEsIGIsIGtpbmQsIHNlZW4sIG9wYXF1ZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmtub3duS2luZChraW5kKTtcbiAgfVxufVxuXG4vKiogVGhlIGtpbmRzIHdob3NlIGNvbnRlbnQgaXMgb3RoZXIgdmFsdWVzOiBjb21wYXJlZCBwYXJ0IGJ5IHBhcnQsIHVuZGVyIHRoZSBjeWNsZSBndWFyZC4gKi9cbmZ1bmN0aW9uIGVxdWFsQ29udGFpbmVycyhhOiBhbnksIGI6IGFueSwga2luZDogVmFsdWVLaW5kLCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICAvLyBDeWNsZSBndWFyZCDigJQgYSBwYWlyIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBpcyBlcXVhbCBieSBhc3N1bXB0aW9uLlxuICBzZWVuID8/PSBuZXcgV2Vha01hcCgpO1xuICBsZXQgcGFydG5lcnMgPSBzZWVuLmdldChhKTtcbiAgaWYgKHBhcnRuZXJzPy5oYXMoYikpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhcnRuZXJzKSBzZWVuLnNldChhLCAocGFydG5lcnMgPSBuZXcgV2Vha1NldCgpKSk7XG4gIHBhcnRuZXJzLmFkZChiKTtcblxuICBpZiAoa2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdzZXQnKSByZXR1cm4gZXF1YWxTZXRzKGEsIGIsIHNlZW4sIG9wYXF1ZSk7XG4gIGlmIChraW5kID09PSAnZXJyb3InKSByZXR1cm4gZXF1YWxFcnJvcnMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsUGFpcnMoYVtpXSwgYltpXSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9iamVjdHM6IG9ubHkga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSB0YWtlIHBhcnQg4oCUIGFuIG93biBgdW5kZWZpbmVkYCBpcyBhXG4gIC8vIGRlbGV0ZWQga2V5LCB0aGUgc2FtZSBzdGF0ZSBhcyBhbiBhYnNlbnQgb25lIChzZWUgdGhlIGNvbnRyYWN0IGFib3ZlKS5cbiAgbGV0IGFIZWxkID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYSkpIHtcbiAgICBpZiAoYVtrZXldID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGFIZWxkKys7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghZXF1YWxQYWlycyhhW2tleV0sIGJba2V5XSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbmZ1bmN0aW9uIHVua25vd25LaW5kKGtpbmQ6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBkZWVwRXF1YWw6IG5vIGNvbXBhcmlzb24gZm9yIHRoZSB2YWx1ZSBraW5kICcke1N0cmluZyhraW5kKX0nYCk7XG59XG5cbi8qKiBgW29iamVjdCBOdW1iZXJdYCwgYFtvYmplY3QgVWludDhBcnJheV1gIOKApiDigJQgdGhlIGJ1aWx0LWluIHR5cGUgYSBib3hlZCB2YWx1ZSBvciBhIHZpZXcgY2Fycmllcy4gKi9cbmZ1bmN0aW9uIHRhZ09mKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLyoqIFRoZSBzYW1lIHZpZXcgdHlwZSBvdmVyIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgYnl0ZXMgdGhlIHZpZXcgc2Vlcywgd2hlcmV2ZXIgdGhleSBzaXQgaW4gaXRzIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGVxdWFsVmlld3MoYTogQXJyYXlCdWZmZXJWaWV3LCBiOiBBcnJheUJ1ZmZlclZpZXcpOiBib29sZWFuIHtcbiAgaWYgKHRhZ09mKGEpICE9PSB0YWdPZihiKSB8fCBhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5idWZmZXIgPT09IGIuYnVmZmVyICYmIGEuYnl0ZU9mZnNldCA9PT0gYi5ieXRlT2Zmc2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHEgPSBuZXcgVWludDhBcnJheShiLmJ1ZmZlciwgYi5ieXRlT2Zmc2V0LCBiLmJ5dGVMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNhbWUgbGVuZ3RoLCByZXNpemFiaWxpdHkgYW5kIGJ5dGVzLiAqL1xuZnVuY3Rpb24gZXF1YWxCdWZmZXJzKGE6IEFycmF5QnVmZmVyTGlrZSwgYjogQXJyYXlCdWZmZXJMaWtlKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeCA9IGEgYXMgQXJyYXlCdWZmZXJMaWtlICYgeyByZXNpemFibGU/OiBib29sZWFuOyBtYXhCeXRlTGVuZ3RoPzogbnVtYmVyIH07XG4gIGNvbnN0IHkgPSBiIGFzIHR5cGVvZiB4O1xuICBpZiAoeC5ieXRlTGVuZ3RoICE9PSB5LmJ5dGVMZW5ndGggfHwgeC5yZXNpemFibGUgIT09IHkucmVzaXphYmxlIHx8IHgubWF4Qnl0ZUxlbmd0aCAhPT0geS5tYXhCeXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHAgPSBuZXcgVWludDhBcnJheShhKTtcbiAgY29uc3QgcSA9IG5ldyBVaW50OEFycmF5KGIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNpeCBlcnJvciBuYW1lcyBgc3RydWN0dXJlZENsb25lYCByZXN0b3JlczsgYW55IG90aGVyIG5hbWUgY29tZXMgYmFjayBhbiBgRXJyb3JgLiAqL1xuY29uc3QgRVJST1JfTkFNRVMgPSBuZXcgU2V0KFsnRXZhbEVycm9yJywgJ1JhbmdlRXJyb3InLCAnUmVmZXJlbmNlRXJyb3InLCAnU3ludGF4RXJyb3InLCAnVHlwZUVycm9yJywgJ1VSSUVycm9yJ10pO1xuXG4vKipcbiAqIFR3byBlcnJvcnMgYXMgdGhlIGNsb25lIGtlZXBzIHRoZW06IHRoZSByZXN0b3JlZCBraW5kLCB0aGUgb3duIGBtZXNzYWdlYCxcbiAqIHRoZSBgc3RhY2tgIGFuZCB0aGUgb3duIGBjYXVzZWAgKGRlZXApLiBBbnkgb3RoZXIgb3duIGZpZWxkIGlzIGRyb3BwZWQgYnlcbiAqIHRoZSBjbG9uZSwgc28gaXQgbmV2ZXIgY291bnRzLlxuICovXG5mdW5jdGlvbiBlcXVhbEVycm9ycyhhOiBFcnJvciwgYjogRXJyb3IsIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChlcnJvcktpbmRPZihhKSAhPT0gZXJyb3JLaW5kT2YoYikgfHwgc3RhY2tPZihhKSAhPT0gc3RhY2tPZihiKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhTWVzc2FnZSA9IG93bkRhdGEoYSwgJ21lc3NhZ2UnKTtcbiAgY29uc3QgYk1lc3NhZ2UgPSBvd25EYXRhKGIsICdtZXNzYWdlJyk7XG4gIGlmIChTdHJpbmcoYU1lc3NhZ2U/LnZhbHVlKSAhPT0gU3RyaW5nKGJNZXNzYWdlPy52YWx1ZSkgfHwgIWFNZXNzYWdlICE9PSAhYk1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYUNhdXNlID0gb3duRGF0YShhLCAnY2F1c2UnKTtcbiAgY29uc3QgYkNhdXNlID0gb3duRGF0YShiLCAnY2F1c2UnKTtcbiAgaWYgKCFhQ2F1c2UgfHwgIWJDYXVzZSkgcmV0dXJuICFhQ2F1c2UgPT09ICFiQ2F1c2U7XG4gIHJldHVybiBlcXVhbFBhaXJzKGFDYXVzZS52YWx1ZSwgYkNhdXNlLnZhbHVlLCBzZWVuLCBvcGFxdWUpO1xufVxuXG5mdW5jdGlvbiBlcnJvcktpbmRPZihlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gU3RyaW5nKGVycm9yLm5hbWUpO1xuICByZXR1cm4gRVJST1JfTkFNRVMuaGFzKG5hbWUpID8gbmFtZSA6ICdFcnJvcic7XG59XG5cbmZ1bmN0aW9uIHN0YWNrT2YoZXJyb3I6IEVycm9yKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgcmV0dXJuIHR5cGVvZiBzdGFjayA9PT0gJ3N0cmluZycgPyBzdGFjayA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFuIG93biBEQVRBIHByb3BlcnR5LCBib3hlZCDigJQgaG93IHRoZSBjbG9uZSByZWFkcyBhbiBlcnJvcidzIGBtZXNzYWdlYCBhbmQgYGNhdXNlYC4gKi9cbmZ1bmN0aW9uIG93bkRhdGEodmFsdWU6IG9iamVjdCwga2V5OiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRvciwgJ3ZhbHVlJylcbiAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IudmFsdWUgfVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlcXVhbE1hcHMoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuLCBvcGFxdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogT3JkZXItaW5zZW5zaXRpdmUsIGRlZXAgcGVyIG1lbWJlci4gUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlIGZvciBzZXRzIG9mXG4gKiBvYmplY3RzIOKAlCBhIHNldCBvZiBwcmltaXRpdmVzICh0aGUgY29tbW9uIHNoYXBlKSBpcyBvbmUgYGhhc2AgcGVyIG1lbWJlci5cbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzKGE6IFNldDx1bmtub3duPiwgYjogU2V0PHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdW5tYXRjaGVkID0gWy4uLmJdO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhKSB7XG4gICAgLy8gU2FtZVZhbHVlWmVybyBmaXJzdCDigJQgcHJpbWl0aXZlcyBhbmQgc2hhcmVkIHJlZmVyZW5jZXMsIG9uZSBgaGFzYC5cbiAgICAvLyBFYWNoIG1hdGNoIHJldGlyZXMgaXRzIHNsb3Qgc28gdHdvIHN0cnVjdHVyYWxseS1lcXVhbCBtZW1iZXJzIG9mIGBhYFxuICAgIC8vIGNhbm5vdCBib3RoIGNsYWltIHRoZSBzYW1lIG1lbWJlciBvZiBgYmAuXG4gICAgY29uc3QgYXQgPSB1bm1hdGNoZWQuaW5kZXhPZihtZW1iZXIpO1xuICAgIGNvbnN0IGZvdW5kID0gYXQgPj0gMCA/IGF0IDogdW5tYXRjaGVkLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBlcXVhbFBhaXJzKG1lbWJlciwgY2FuZGlkYXRlLCBzZWVuLCBvcGFxdWUpKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=