@plumile/router 0.1.11 → 0.1.13

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 (127) hide show
  1. package/README.md +755 -1
  2. package/lib/esm/builder.d.ts.map +1 -1
  3. package/lib/esm/builder.js +10 -3
  4. package/lib/esm/eslint-rules/index.d.ts +2 -0
  5. package/lib/esm/eslint-rules/index.d.ts.map +1 -0
  6. package/lib/esm/eslint-rules/index.js +2 -0
  7. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  8. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  9. package/lib/esm/eslint-rules/no-direct-window-location-search.js +48 -0
  10. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  11. package/lib/esm/history/BrowserHistory.js +4 -2
  12. package/lib/esm/index.d.ts +5 -0
  13. package/lib/esm/index.d.ts.map +1 -1
  14. package/lib/esm/index.js +6 -1
  15. package/lib/esm/routing/Link.d.ts +1 -0
  16. package/lib/esm/routing/Link.d.ts.map +1 -1
  17. package/lib/esm/routing/Link.js +35 -4
  18. package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
  19. package/lib/esm/routing/RouteComponentWrapper.js +7 -2
  20. package/lib/esm/routing/createRouter.d.ts +8 -1
  21. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  22. package/lib/esm/routing/createRouter.js +540 -17
  23. package/lib/esm/routing/devtools.d.ts +20 -0
  24. package/lib/esm/routing/devtools.d.ts.map +1 -0
  25. package/lib/esm/routing/devtools.js +678 -0
  26. package/lib/esm/routing/filters.d.ts +97 -0
  27. package/lib/esm/routing/filters.d.ts.map +1 -0
  28. package/lib/esm/routing/filters.js +557 -0
  29. package/lib/esm/routing/index.d.ts +10 -0
  30. package/lib/esm/routing/index.d.ts.map +1 -1
  31. package/lib/esm/routing/index.js +11 -1
  32. package/lib/esm/routing/useActiveFilters.d.ts +9 -0
  33. package/lib/esm/routing/useActiveFilters.d.ts.map +1 -0
  34. package/lib/esm/routing/useActiveFilters.js +38 -0
  35. package/lib/esm/routing/useFilterState.d.ts +10 -0
  36. package/lib/esm/routing/useFilterState.d.ts.map +1 -0
  37. package/lib/esm/routing/useFilterState.js +14 -0
  38. package/lib/esm/routing/useNavigate.d.ts +13 -0
  39. package/lib/esm/routing/useNavigate.d.ts.map +1 -0
  40. package/lib/esm/routing/useNavigate.js +11 -0
  41. package/lib/esm/routing/useNavigateWithQuery.d.ts +15 -0
  42. package/lib/esm/routing/useNavigateWithQuery.d.ts.map +1 -0
  43. package/lib/esm/routing/useNavigateWithQuery.js +95 -0
  44. package/lib/esm/routing/useQuery.d.ts +2 -0
  45. package/lib/esm/routing/useQuery.d.ts.map +1 -0
  46. package/lib/esm/routing/useQuery.js +9 -0
  47. package/lib/esm/routing/useQueryObject.d.ts +18 -0
  48. package/lib/esm/routing/useQueryObject.d.ts.map +1 -0
  49. package/lib/esm/routing/useQueryObject.js +107 -0
  50. package/lib/esm/routing/useQueryState.d.ts +13 -0
  51. package/lib/esm/routing/useQueryState.d.ts.map +1 -0
  52. package/lib/esm/routing/useQueryState.js +80 -0
  53. package/lib/esm/routing/useStableRefEquality.d.ts +5 -0
  54. package/lib/esm/routing/useStableRefEquality.d.ts.map +1 -0
  55. package/lib/esm/routing/useStableRefEquality.js +47 -0
  56. package/lib/esm/routing/useTypedQuery.d.ts +2 -0
  57. package/lib/esm/routing/useTypedQuery.d.ts.map +1 -0
  58. package/lib/esm/routing/useTypedQuery.js +36 -0
  59. package/lib/esm/tools/buildSearch.d.ts +12 -0
  60. package/lib/esm/tools/buildSearch.d.ts.map +1 -0
  61. package/lib/esm/tools/buildSearch.js +264 -0
  62. package/lib/esm/tools/query-dsl.d.ts +28 -0
  63. package/lib/esm/tools/query-dsl.d.ts.map +1 -0
  64. package/lib/esm/tools/query-dsl.js +250 -0
  65. package/lib/esm/tools/query.d.ts +2 -0
  66. package/lib/esm/tools/query.d.ts.map +1 -0
  67. package/lib/esm/tools/query.js +43 -0
  68. package/lib/esm/tools.d.ts +2 -2
  69. package/lib/esm/tools.d.ts.map +1 -1
  70. package/lib/esm/tools.js +3 -2
  71. package/lib/esm/type-tests/query-infer.test-d.d.ts +2 -0
  72. package/lib/esm/type-tests/query-infer.test-d.d.ts.map +1 -0
  73. package/lib/esm/type-tests/query-infer.test-d.js +49 -0
  74. package/lib/esm/types.d.ts +47 -4
  75. package/lib/esm/types.d.ts.map +1 -1
  76. package/lib/esm/types.js +1 -1
  77. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  78. package/lib/types/builder.d.ts.map +1 -1
  79. package/lib/types/eslint-rules/index.d.ts +2 -0
  80. package/lib/types/eslint-rules/index.d.ts.map +1 -0
  81. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  82. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  83. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  84. package/lib/types/index.d.ts +5 -0
  85. package/lib/types/index.d.ts.map +1 -1
  86. package/lib/types/routing/Link.d.ts +1 -0
  87. package/lib/types/routing/Link.d.ts.map +1 -1
  88. package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
  89. package/lib/types/routing/createRouter.d.ts +8 -1
  90. package/lib/types/routing/createRouter.d.ts.map +1 -1
  91. package/lib/types/routing/devtools.d.ts +20 -0
  92. package/lib/types/routing/devtools.d.ts.map +1 -0
  93. package/lib/types/routing/filters.d.ts +97 -0
  94. package/lib/types/routing/filters.d.ts.map +1 -0
  95. package/lib/types/routing/index.d.ts +10 -0
  96. package/lib/types/routing/index.d.ts.map +1 -1
  97. package/lib/types/routing/useActiveFilters.d.ts +9 -0
  98. package/lib/types/routing/useActiveFilters.d.ts.map +1 -0
  99. package/lib/types/routing/useFilterState.d.ts +10 -0
  100. package/lib/types/routing/useFilterState.d.ts.map +1 -0
  101. package/lib/types/routing/useNavigate.d.ts +13 -0
  102. package/lib/types/routing/useNavigate.d.ts.map +1 -0
  103. package/lib/types/routing/useNavigateWithQuery.d.ts +15 -0
  104. package/lib/types/routing/useNavigateWithQuery.d.ts.map +1 -0
  105. package/lib/types/routing/useQuery.d.ts +2 -0
  106. package/lib/types/routing/useQuery.d.ts.map +1 -0
  107. package/lib/types/routing/useQueryObject.d.ts +18 -0
  108. package/lib/types/routing/useQueryObject.d.ts.map +1 -0
  109. package/lib/types/routing/useQueryState.d.ts +13 -0
  110. package/lib/types/routing/useQueryState.d.ts.map +1 -0
  111. package/lib/types/routing/useStableRefEquality.d.ts +5 -0
  112. package/lib/types/routing/useStableRefEquality.d.ts.map +1 -0
  113. package/lib/types/routing/useTypedQuery.d.ts +2 -0
  114. package/lib/types/routing/useTypedQuery.d.ts.map +1 -0
  115. package/lib/types/tools/buildSearch.d.ts +12 -0
  116. package/lib/types/tools/buildSearch.d.ts.map +1 -0
  117. package/lib/types/tools/query-dsl.d.ts +28 -0
  118. package/lib/types/tools/query-dsl.d.ts.map +1 -0
  119. package/lib/types/tools/query.d.ts +2 -0
  120. package/lib/types/tools/query.d.ts.map +1 -0
  121. package/lib/types/tools.d.ts +2 -2
  122. package/lib/types/tools.d.ts.map +1 -1
  123. package/lib/types/type-tests/query-infer.test-d.d.ts +2 -0
  124. package/lib/types/type-tests/query-infer.test-d.d.ts.map +1 -0
  125. package/lib/types/types.d.ts +47 -4
  126. package/lib/types/types.d.ts.map +1 -1
  127. package/package.json +7 -7
@@ -0,0 +1,557 @@
1
+ import { useCallback, useContext, useMemo, useRef } from 'react';
2
+ import RoutingContext from './RoutingContext.js';
3
+ export function numberFilter(def = {}) {
4
+ return { __filter: true, kind: 'number', ...def };
5
+ }
6
+ export function stringFilter(def = {}) {
7
+ return { __filter: true, kind: 'string', ...def };
8
+ }
9
+ export function defineFilters(schema) {
10
+ return { __defined: true, schema };
11
+ }
12
+ const NUMERIC_DEFAULT_OPS = [
13
+ 'eq',
14
+ 'neq',
15
+ 'gt',
16
+ 'gte',
17
+ 'lt',
18
+ 'lte',
19
+ 'in',
20
+ 'nin',
21
+ 'between',
22
+ 'exists',
23
+ ];
24
+ const STRING_DEFAULT_OPS = [
25
+ 'eq',
26
+ 'neq',
27
+ 'in',
28
+ 'nin',
29
+ 'between',
30
+ 'exists',
31
+ 'contains',
32
+ 'starts',
33
+ 'ends',
34
+ 'regex',
35
+ ];
36
+ function allowedOperators(def) {
37
+ if (def.operators != null) {
38
+ return def.operators;
39
+ }
40
+ if (def.kind === 'number') {
41
+ return NUMERIC_DEFAULT_OPS;
42
+ }
43
+ return STRING_DEFAULT_OPS;
44
+ }
45
+ function parsePrimitive(kind, raw) {
46
+ if (kind === 'string') {
47
+ return raw;
48
+ }
49
+ const n = Number(raw);
50
+ if (Number.isNaN(n)) {
51
+ return undefined;
52
+ }
53
+ return n;
54
+ }
55
+ function serializePrimitive(v) {
56
+ if (typeof v === 'boolean') {
57
+ if (v) {
58
+ return '1';
59
+ }
60
+ return '0';
61
+ }
62
+ return String(v);
63
+ }
64
+ const PARSE_CACHE = new Map();
65
+ const SCHEMA_IDS = new WeakMap();
66
+ let NEXT_SCHEMA_ID = 0;
67
+ function stableFiltersSignature(obj, schemaId) {
68
+ const parts = ['S', String(schemaId)];
69
+ const fields = Object.keys(obj).sort();
70
+ for (const f of fields) {
71
+ parts.push('F', f);
72
+ const fieldObj = obj[f];
73
+ const ops = Object.keys(fieldObj ?? {}).sort();
74
+ for (const op of ops) {
75
+ const desc = Object.getOwnPropertyDescriptor(fieldObj, op);
76
+ if (desc == null) {
77
+ continue;
78
+ }
79
+ const val = desc.value;
80
+ parts.push('O', op);
81
+ if (typeof val === 'boolean') {
82
+ if (val) {
83
+ parts.push('T');
84
+ }
85
+ else {
86
+ parts.push('F');
87
+ }
88
+ continue;
89
+ }
90
+ if (Array.isArray(val)) {
91
+ if (val.length > 0 && Array.isArray(val[0])) {
92
+ parts.push('B');
93
+ for (const t of val) {
94
+ if (Array.isArray(t)) {
95
+ parts.push(String(t[0]), String(t[1]));
96
+ }
97
+ }
98
+ }
99
+ else {
100
+ parts.push('A');
101
+ for (const v of val) {
102
+ parts.push(String(v));
103
+ }
104
+ }
105
+ continue;
106
+ }
107
+ if (val === undefined) {
108
+ parts.push('U');
109
+ continue;
110
+ }
111
+ if (typeof val === 'string' || typeof val === 'number') {
112
+ parts.push('V', String(val));
113
+ continue;
114
+ }
115
+ parts.push('V', '[obj]');
116
+ }
117
+ }
118
+ return parts.join('\u001f');
119
+ }
120
+ export function parseFilters(defined, rawQuery) {
121
+ const schemaId = (() => {
122
+ const wm = SCHEMA_IDS;
123
+ let id = wm.get(defined);
124
+ if (id == null) {
125
+ id = NEXT_SCHEMA_ID += 1;
126
+ wm.set(defined, id);
127
+ }
128
+ return id;
129
+ })();
130
+ const { schema } = defined;
131
+ const out = {};
132
+ for (const entry of Object.entries(schema)) {
133
+ const field = entry[0];
134
+ const def = entry[1];
135
+ const fieldState = {};
136
+ const ops = allowedOperators(def);
137
+ for (const op of ops) {
138
+ const key = `${field}.${op}`;
139
+ const rawVal = rawQuery[key];
140
+ if (rawVal === undefined) {
141
+ }
142
+ else {
143
+ let values;
144
+ if (Array.isArray(rawVal)) {
145
+ values = rawVal;
146
+ }
147
+ else {
148
+ values = [rawVal];
149
+ }
150
+ if (op === 'exists') {
151
+ const last = values[values.length - 1];
152
+ if (last !== undefined && last !== '') {
153
+ const norm = last.toLowerCase();
154
+ if (norm === '0' || norm === 'false' || norm === 'no') {
155
+ fieldState.exists = false;
156
+ }
157
+ else {
158
+ fieldState.exists = true;
159
+ }
160
+ }
161
+ }
162
+ else if (op === 'between') {
163
+ const tuples = [];
164
+ let i = 0;
165
+ while (i + 1 < values.length) {
166
+ const rawA = values[i];
167
+ const rawB = values[i + 1];
168
+ if (rawA === undefined || rawB === undefined) {
169
+ break;
170
+ }
171
+ const a = parsePrimitive(def.kind, rawA);
172
+ const b = parsePrimitive(def.kind, rawB);
173
+ if (a !== undefined && b !== undefined) {
174
+ let x = a;
175
+ let y = b;
176
+ if (x > y) {
177
+ const tmp = x;
178
+ x = y;
179
+ y = tmp;
180
+ }
181
+ tuples.push([x, y]);
182
+ }
183
+ i += 2;
184
+ }
185
+ if (tuples.length > 0) {
186
+ tuples.sort((a, b) => {
187
+ const ax = a[0];
188
+ const bx = b[0];
189
+ if (ax < bx)
190
+ return -1;
191
+ if (ax > bx)
192
+ return 1;
193
+ const ay = a[1];
194
+ const by = b[1];
195
+ if (ay < by)
196
+ return -1;
197
+ if (ay > by)
198
+ return 1;
199
+ return 0;
200
+ });
201
+ fieldState.between = tuples;
202
+ }
203
+ }
204
+ else {
205
+ const arr = [];
206
+ for (const rawItem of values) {
207
+ let value = rawItem;
208
+ if (def.kind === 'string' && def.normalize != null) {
209
+ try {
210
+ value = def.normalize(rawItem);
211
+ }
212
+ catch {
213
+ value = rawItem;
214
+ }
215
+ if (value === '') {
216
+ continue;
217
+ }
218
+ }
219
+ const parsed = parsePrimitive(def.kind, value);
220
+ if (parsed !== undefined && parsed !== '') {
221
+ arr.push(parsed);
222
+ }
223
+ }
224
+ if (arr.length > 0) {
225
+ if (def.kind === 'number') {
226
+ const nums = arr;
227
+ nums.sort((a, b) => {
228
+ return a - b;
229
+ });
230
+ if (def.dedupe) {
231
+ const ded = [];
232
+ let last;
233
+ for (const n of nums) {
234
+ if (n !== last) {
235
+ ded.push(n);
236
+ last = n;
237
+ }
238
+ }
239
+ fieldState[op] = ded;
240
+ }
241
+ else {
242
+ fieldState[op] = nums;
243
+ }
244
+ }
245
+ else if (def.dedupe) {
246
+ const seen = new Set();
247
+ const res = [];
248
+ for (const s of arr) {
249
+ if (!seen.has(s)) {
250
+ seen.add(s);
251
+ res.push(s);
252
+ }
253
+ }
254
+ fieldState[op] = res;
255
+ }
256
+ else {
257
+ fieldState[op] = arr;
258
+ }
259
+ }
260
+ }
261
+ }
262
+ }
263
+ out[field] = fieldState;
264
+ }
265
+ const signature = stableFiltersSignature(out, schemaId);
266
+ const existing = PARSE_CACHE.get(signature);
267
+ if (existing !== undefined) {
268
+ return existing;
269
+ }
270
+ PARSE_CACHE.set(signature, out);
271
+ return out;
272
+ }
273
+ export const OPERATOR_PRIORITY = [
274
+ 'eq',
275
+ 'between',
276
+ 'gt',
277
+ 'gte',
278
+ 'lt',
279
+ 'lte',
280
+ 'in',
281
+ 'nin',
282
+ 'exists',
283
+ 'contains',
284
+ 'starts',
285
+ 'ends',
286
+ 'regex',
287
+ ];
288
+ function arraysEqual(a, b) {
289
+ if (a.length !== b.length) {
290
+ return false;
291
+ }
292
+ let i = 0;
293
+ while (i < a.length) {
294
+ const av = a[i];
295
+ const bv = b[i];
296
+ if (Array.isArray(av) && Array.isArray(bv)) {
297
+ if (!arraysEqual(av, bv)) {
298
+ return false;
299
+ }
300
+ }
301
+ else if (av !== bv) {
302
+ return false;
303
+ }
304
+ i += 1;
305
+ }
306
+ return true;
307
+ }
308
+ export function buildFiltersQuery(defined, currentQuery, next) {
309
+ const { schema } = defined;
310
+ const out = {};
311
+ const fields = Object.keys(schema);
312
+ for (const kv of Object.entries(currentQuery)) {
313
+ const k = kv[0];
314
+ const v = kv[1];
315
+ let belongs = false;
316
+ for (const f of fields) {
317
+ if (k.startsWith(`${f}.`)) {
318
+ belongs = true;
319
+ break;
320
+ }
321
+ }
322
+ if (!belongs) {
323
+ out[k] = v;
324
+ }
325
+ }
326
+ for (const entry of Object.entries(schema)) {
327
+ const field = entry[0];
328
+ const def = entry[1];
329
+ const opsUnsorted = allowedOperators(def);
330
+ const ops = [...opsUnsorted];
331
+ ops.sort((a, b) => {
332
+ const ia = OPERATOR_PRIORITY.indexOf(a);
333
+ const ib = OPERATOR_PRIORITY.indexOf(b);
334
+ let safeA = ia;
335
+ if (safeA === -1) {
336
+ safeA = 999;
337
+ }
338
+ let safeB = ib;
339
+ if (safeB === -1) {
340
+ safeB = 999;
341
+ }
342
+ if (safeA < safeB)
343
+ return -1;
344
+ if (safeA > safeB)
345
+ return 1;
346
+ if (a < b)
347
+ return -1;
348
+ if (a > b)
349
+ return 1;
350
+ return 0;
351
+ });
352
+ const recordNext = next;
353
+ const state = recordNext[field] ?? {};
354
+ for (const op of ops) {
355
+ if (Object.prototype.hasOwnProperty.call(state, op)) {
356
+ const value = state[op];
357
+ if (value != null) {
358
+ const defaults = def.defaults;
359
+ if (defaults != null &&
360
+ Object.prototype.hasOwnProperty.call(defaults, op)) {
361
+ const dv = defaults[op];
362
+ let equal = false;
363
+ if (Array.isArray(dv) && Array.isArray(value)) {
364
+ equal = arraysEqual(dv, value);
365
+ }
366
+ else if (typeof dv === 'boolean' && typeof value === 'boolean') {
367
+ equal = dv === value;
368
+ }
369
+ if (equal) {
370
+ continue;
371
+ }
372
+ }
373
+ const key = `${field}.${op}`;
374
+ if (op === 'exists' && typeof value === 'boolean') {
375
+ out[key] = serializePrimitive(value);
376
+ }
377
+ else if (op === 'between') {
378
+ const ranges = value;
379
+ for (const range of ranges) {
380
+ const aVal = range[0];
381
+ const bVal = range[1];
382
+ const pair = [
383
+ serializePrimitive(aVal),
384
+ serializePrimitive(bVal),
385
+ ];
386
+ const existing = out[key];
387
+ if (existing == null) {
388
+ out[key] = pair;
389
+ }
390
+ else if (Array.isArray(existing)) {
391
+ out[key] = [...existing, ...pair];
392
+ }
393
+ else {
394
+ out[key] = [existing, ...pair];
395
+ }
396
+ }
397
+ }
398
+ else {
399
+ const arr = value;
400
+ for (const val of arr) {
401
+ const sv = serializePrimitive(val);
402
+ const existing = out[key];
403
+ if (existing == null) {
404
+ out[key] = sv;
405
+ }
406
+ else if (Array.isArray(existing)) {
407
+ existing.push(sv);
408
+ }
409
+ else {
410
+ out[key] = [existing, sv];
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ }
417
+ }
418
+ return out;
419
+ }
420
+ export function useFilters(defined) {
421
+ const ctx = useContext(RoutingContext);
422
+ const entry = ctx?.get();
423
+ const activeDefined = useMemo(() => {
424
+ if (defined != null) {
425
+ return defined;
426
+ }
427
+ if (ctx == null) {
428
+ return undefined;
429
+ }
430
+ return ctx.currentMergedFilterSchema();
431
+ }, [defined, ctx]);
432
+ const filters = useMemo(() => {
433
+ if (activeDefined == null || entry == null) {
434
+ return {};
435
+ }
436
+ return parseFilters(activeDefined, entry.query);
437
+ }, [activeDefined, entry]);
438
+ const schemaRef = useRef(activeDefined);
439
+ schemaRef.current = activeDefined;
440
+ const navigateFilters = useCallback((nextFilters, opts) => {
441
+ if (ctx == null) {
442
+ return;
443
+ }
444
+ let schemaNow = schemaRef.current;
445
+ schemaNow ??= ctx.currentMergedFilterSchema();
446
+ if (schemaNow == null) {
447
+ return;
448
+ }
449
+ ctx.navigate({
450
+ filters: nextFilters,
451
+ filterSchema: schemaNow,
452
+ replace: opts?.replace,
453
+ batch: opts?.batch,
454
+ });
455
+ }, [ctx]);
456
+ const set = useCallback((next, navOpts) => {
457
+ const prev = filters;
458
+ let resolved = prev;
459
+ if (typeof next === 'function') {
460
+ try {
461
+ resolved = next(prev);
462
+ }
463
+ catch {
464
+ resolved = prev;
465
+ }
466
+ }
467
+ else {
468
+ resolved = next;
469
+ }
470
+ const internal = navOpts?.internalBatch !== false;
471
+ if (!internal) {
472
+ let replaceFlag;
473
+ let batchFlag;
474
+ if (navOpts.replace === true) {
475
+ replaceFlag = true;
476
+ }
477
+ if (navOpts.batch === true) {
478
+ batchFlag = true;
479
+ }
480
+ navigateFilters(resolved, { replace: replaceFlag, batch: batchFlag });
481
+ return;
482
+ }
483
+ const self = set;
484
+ self.__pending ??= { scheduled: false };
485
+ const pending = self.__pending;
486
+ pending.filters = resolved;
487
+ if (navOpts?.replace) {
488
+ pending.replace = true;
489
+ }
490
+ if (navOpts?.batch) {
491
+ pending.batch = true;
492
+ }
493
+ if (!pending.scheduled) {
494
+ pending.scheduled = true;
495
+ queueMicrotask(() => {
496
+ pending.scheduled = false;
497
+ if (pending.filters != null) {
498
+ navigateFilters(pending.filters, {
499
+ replace: pending.replace,
500
+ batch: pending.batch,
501
+ });
502
+ }
503
+ pending.filters = undefined;
504
+ pending.replace = undefined;
505
+ pending.batch = undefined;
506
+ });
507
+ }
508
+ }, [filters, navigateFilters]);
509
+ const patch = useCallback((delta, navOpts) => {
510
+ set((prev) => {
511
+ const merged = { ...prev };
512
+ for (const [field, ops] of Object.entries(delta)) {
513
+ let cur = merged[field];
514
+ if (cur == null || typeof cur !== 'object') {
515
+ cur = {};
516
+ }
517
+ else {
518
+ cur = { ...cur };
519
+ }
520
+ if (ops != null && typeof ops === 'object') {
521
+ for (const [op, val] of Object.entries(ops)) {
522
+ cur[op] = val;
523
+ }
524
+ }
525
+ merged[field] = cur;
526
+ }
527
+ return merged;
528
+ }, navOpts);
529
+ }, [set]);
530
+ const clear = useCallback((fields, navOpts) => {
531
+ if (fields == null) {
532
+ set((prev) => {
533
+ const next = {};
534
+ for (const k of Object.keys(prev)) {
535
+ next[k] = {};
536
+ }
537
+ return next;
538
+ }, navOpts);
539
+ }
540
+ else {
541
+ const emptyEntries = fields.map((f) => {
542
+ return [f, {}];
543
+ });
544
+ const delta = Object.fromEntries(emptyEntries);
545
+ patch(delta, navOpts);
546
+ }
547
+ }, [patch, set]);
548
+ const helpers = {
549
+ set,
550
+ patch,
551
+ clear,
552
+ };
553
+ return [filters, helpers];
554
+ }
555
+ export const useQueryFilters = useFilters;
556
+ export default useFilters;
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0aW5nL2ZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqRSxPQUFPLGNBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQXFFakQsTUFBTSxVQUFVLFlBQVksQ0FDMUIsTUFBMkUsRUFBRTtJQUU3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLE1BQTJFLEVBQUU7SUFFN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUFTO0lBRVQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQXFDRCxNQUFNLG1CQUFtQixHQUFxQjtJQUM1QyxJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLFNBQVM7SUFDVCxRQUFRO0NBQ1QsQ0FBQztBQUNGLE1BQU0sa0JBQWtCLEdBQXFCO0lBQzNDLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87Q0FDUixDQUFDO0FBR0YsU0FBUyxnQkFBZ0IsQ0FBQyxHQUEwQjtJQUNsRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFF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O1FBQzFFLEdBQUc7UUFDSCxLQUFLO1FBQ0wsS0FBSztLQUNOLENBQUM7SUFDRixPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQzFDLGVBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSb3V0aW5nQ29udGV4dCBmcm9tICcuL1JvdXRpbmdDb250ZXh0LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUeXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEZpbHRlck9wZXJhdG9yID1cbiAgfCAnZXEnXG4gIHwgJ25lcSdcbiAgfCAnZ3QnXG4gIHwgJ2d0ZSdcbiAgfCAnbHQnXG4gIHwgJ2x0ZSdcbiAgfCAnaW4nXG4gIHwgJ25pbidcbiAgfCAnYmV0d2VlbidcbiAgfCAnZXhpc3RzJ1xuICB8ICdjb250YWlucydcbiAgfCAnc3RhcnRzJ1xuICB8ICdlbmRzJ1xuICB8ICdyZWdleCc7XG5cbmV4cG9ydCB0eXBlIEZpbHRlclZhbHVlS2luZCA9ICdzdHJpbmcnIHwgJ251bWJlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRmllbGREZWZpbml0aW9uPFxuICBLaW5kIGV4dGVuZHMgRmlsdGVyVmFsdWVLaW5kID0gRmlsdGVyVmFsdWVLaW5kLFxuPiB7XG4gIF9fZmlsdGVyOiB0cnVlO1xuICBraW5kOiBLaW5kO1xuICBvcGVyYXRvcnM/OiBGaWx0ZXJPcGVyYXRvcltdO1xuICBkZWR1cGU/OiBib29sZWFuO1xuICBsYWJlbD86IHN0cmluZztcbiAgbm9ybWFsaXplPzogKHJhdzogc3RyaW5nKSA9PiBzdHJpbmc7IC8vIHN0cmluZyBvbmx5XG4gIGRlZmF1bHRzPzogUGFydGlhbDxcbiAgICBLaW5kIGV4dGVuZHMgJ251bWJlcidcbiAgICAgID8ge1xuICAgICAgICAgIGVxOiBudW1iZXJbXTtcbiAgICAgICAgICBuZXE6IG51bWJlcltdO1xuICAgICAgICAgIGd0OiBudW1iZXJbXTtcbiAgICAgICAgICBndGU6IG51bWJlcltdO1xuICAgICAgICAgIGx0OiBudW1iZXJbXTtcbiAgICAgICAgICBsdGU6IG51bWJlcltdO1xuICAgICAgICAgIGluOiBudW1iZXJbXTtcbiAgICAgICAgICBuaW46IG51bWJlcltdO1xuICAgICAgICAgIGJldHdlZW46IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAgICAgICBleGlzdHM6IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIGVxOiBzdHJpbmdbXTtcbiAgICAgICAgICBuZXE6IHN0cmluZ1tdO1xuICAgICAgICAgIGluOiBzdHJpbmdbXTtcbiAgICAgICAgICBuaW46IHN0cmluZ1tdO1xuICAgICAgICAgIGJldHdlZW46IFtzdHJpbmcsIHN0cmluZ11bXTtcbiAgICAgICAgICBleGlzdHM6IGJvb2xlYW47XG4gICAgICAgICAgY29udGFpbnM6IHN0cmluZ1tdO1xuICAgICAgICAgIHN0YXJ0czogc3RyaW5nW107XG4gICAgICAgICAgZW5kczogc3RyaW5nW107XG4gICAgICAgICAgcmVnZXg6IHN0cmluZ1tdO1xuICAgICAgICB9XG4gID47XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlclNjaGVtYSA9IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkRGVmaW5pdGlvbj47XG5leHBvcnQgaW50ZXJmYWNlIERlZmluZWRGaWx0ZXJTY2hlbWE8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4ge1xuICBfX2RlZmluZWQ6IHRydWU7XG4gIHNjaGVtYTogRjtcbn1cblxuLyoqIENyZWF0ZSBhIG51bWJlciBmaWx0ZXIgZmllbGQgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZpbHRlcihcbiAgZGVmOiBQYXJ0aWFsPE9taXQ8RmlsdGVyRmllbGREZWZpbml0aW9uPCdudW1iZXInPiwgJ19fZmlsdGVyJyB8ICdraW5kJz4+ID0ge30sXG4pOiBGaWx0ZXJGaWVsZERlZmluaXRpb248J251bWJlcic+IHtcbiAgcmV0dXJuIHsgX19maWx0ZXI6IHRydWUsIGtpbmQ6ICdudW1iZXInLCAuLi5kZWYgfTtcbn1cbi8qKiBDcmVhdGUgYSBzdHJpbmcgZmlsdGVyIGZpZWxkIGRlZmluaXRpb24gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGaWx0ZXIoXG4gIGRlZjogUGFydGlhbDxPbWl0PEZpbHRlckZpZWxkRGVmaW5pdGlvbjwnc3RyaW5nJz4sICdfX2ZpbHRlcicgfCAna2luZCc+PiA9IHt9LFxuKTogRmlsdGVyRmllbGREZWZpbml0aW9uPCdzdHJpbmcnPiB7XG4gIHJldHVybiB7IF9fZmlsdGVyOiB0cnVlLCBraW5kOiAnc3RyaW5nJywgLi4uZGVmIH07XG59XG4vKiogV3JhcCBhIHNjaGVtYSB0byBtYXJrIGl0IGFzIGRlZmluZWQgZm9yIGluZmVyZW5jZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUZpbHRlcnM8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4oXG4gIHNjaGVtYTogRixcbik6IERlZmluZWRGaWx0ZXJTY2hlbWE8Rj4ge1xuICByZXR1cm4geyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYSB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEluZmVyZW5jZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCB0eXBlIE9wZXJhdG9yVmFsdWU8SyBleHRlbmRzIEZpbHRlclZhbHVlS2luZD4gPSBLIGV4dGVuZHMgJ251bWJlcidcbiAgPyB7XG4gICAgICBlcT86IG51bWJlcltdO1xuICAgICAgbmVxPzogbnVtYmVyW107XG4gICAgICBndD86IG51bWJlcltdO1xuICAgICAgZ3RlPzogbnVtYmVyW107XG4gICAgICBsdD86IG51bWJlcltdO1xuICAgICAgbHRlPzogbnVtYmVyW107XG4gICAgICBpbj86IG51bWJlcltdO1xuICAgICAgbmluPzogbnVtYmVyW107XG4gICAgICBiZXR3ZWVuPzogW251bWJlciwgbnVtYmVyXVtdO1xuICAgICAgZXhpc3RzPzogYm9vbGVhbjtcbiAgICB9XG4gIDoge1xuICAgICAgZXE/OiBzdHJpbmdbXTtcbiAgICAgIG5lcT86IHN0cmluZ1tdO1xuICAgICAgaW4/OiBzdHJpbmdbXTtcbiAgICAgIG5pbj86IHN0cmluZ1tdO1xuICAgICAgYmV0d2Vlbj86IFtzdHJpbmcsIHN0cmluZ11bXTtcbiAgICAgIGV4aXN0cz86IGJvb2xlYW47XG4gICAgICBjb250YWlucz86IHN0cmluZ1tdO1xuICAgICAgc3RhcnRzPzogc3RyaW5nW107XG4gICAgICBlbmRzPzogc3RyaW5nW107XG4gICAgICByZWdleD86IHN0cmluZ1tdO1xuICAgIH07XG5leHBvcnQgdHlwZSBJbmZlckZpbHRlcnM8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4gPSB7XG4gIFtLIGluIGtleW9mIEZdOiBPcGVyYXRvclZhbHVlPEZbS11bJ2tpbmQnXT47XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9wZXJhdG9yIGRlZmF1bHRzICYgdXRpbGl0aWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IE5VTUVSSUNfREVGQVVMVF9PUFM6IEZpbHRlck9wZXJhdG9yW10gPSBbXG4gICdlcScsXG4gICduZXEnLFxuICAnZ3QnLFxuICAnZ3RlJyxcbiAgJ2x0JyxcbiAgJ2x0ZScsXG4gICdpbicsXG4gICduaW4nLFxuICAnYmV0d2VlbicsXG4gICdleGlzdHMnLFxuXTtcbmNvbnN0IFNUUklOR19ERUZBVUxUX09QUzogRmlsdGVyT3BlcmF0b3JbXSA9IFtcbiAgJ2VxJyxcbiAgJ25lcScsXG4gICdpbicsXG4gICduaW4nLFxuICAnYmV0d2VlbicsXG4gICdleGlzdHMnLFxuICAnY29udGFpbnMnLFxuICAnc3RhcnRzJyxcbiAgJ2VuZHMnLFxuICAncmVnZXgnLFxuXTtcblxuLyoqIFJldHVybiBhbGxvd2VkIG9wZXJhdG9ycyBmb3IgYSBmaWVsZCAoZXhwbGljaXQgb3IgZGVmYXVsdHMpICovXG5mdW5jdGlvbiBhbGxvd2VkT3BlcmF0b3JzKGRlZjogRmlsdGVyRmllbGREZWZpbml0aW9uKTogRmlsdGVyT3BlcmF0b3JbXSB7XG4gIGlmIChkZWYub3BlcmF0b3JzICE9IG51bGwpIHtcbiAgICByZXR1cm4gZGVmLm9wZXJhdG9ycztcbiAgfVxuICBpZiAoZGVmLmtpbmQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIE5VTUVSSUNfREVGQVVMVF9PUFM7XG4gIH1cbiAgcmV0dXJuIFNUUklOR19ERUZBVUxUX09QUztcbn1cblxuLyoqIFBhcnNlIGEgcHJpbWl0aXZlIGFjY29yZGluZyB0byBraW5kICovXG5mdW5jdGlvbiBwYXJzZVByaW1pdGl2ZShcbiAga2luZDogRmlsdGVyVmFsdWVLaW5kLFxuICByYXc6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChraW5kID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByYXc7XG4gIH1cbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG4pKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBwcmltaXRpdmUgb3IgYm9vbGVhbiB0byBxdWVyeSBzdHJpbmcgdmFsdWUgKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZVByaW1pdGl2ZSh2OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHtcbiAgICBpZiAodikge1xuICAgICAgcmV0dXJuICcxJztcbiAgICB9XG4gICAgcmV0dXJuICcwJztcbiAgfVxuICByZXR1cm4gU3RyaW5nKHYpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWNoZSB1dGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiogR2xvYmFsIHBhcnNlIGNhY2hlIGtleWVkIGJ5IGNhbm9uaWNhbCBzaWduYXR1cmUgKi9cbmNvbnN0IFBBUlNFX0NBQ0hFID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4vKiogV2VhayBtYXAgYXNzaWduaW5nIHN0YWJsZSBudW1lcmljIGlkcyBwZXIgc2NoZW1hIHdyYXBwZXIgKi9cbmNvbnN0IFNDSEVNQV9JRFMgPSBuZXcgV2Vha01hcDxvYmplY3QsIG51bWJlcj4oKTtcbmxldCBORVhUX1NDSEVNQV9JRCA9IDA7XG5cbi8qKiBCdWlsZCBhIHN0YWJsZSBjYW5vbmljYWwgc2lnbmF0dXJlIGZvciBwYXJzZWQgZmlsdGVycyAqL1xuZnVuY3Rpb24gc3RhYmxlRmlsdGVyc1NpZ25hdHVyZShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNjaGVtYUlkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbJ1MnLCBTdHJpbmcoc2NoZW1hSWQpXTtcbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIHtcbiAgICBwYXJ0cy5wdXNoKCdGJywgZik7XG4gICAgY29uc3QgZmllbGRPYmogPSBvYmpbZl07XG4gICAgY29uc3Qgb3BzID0gT2JqZWN0LmtleXMoZmllbGRPYmogPz8ge30pLnNvcnQoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmosIG9wKTtcbiAgICAgIGlmIChkZXNjID09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsOiB1bmtub3duID0gZGVzYy52YWx1ZTtcbiAgICAgIHBhcnRzLnB1c2goJ08nLCBvcCk7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKCdUJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaCgnRicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goJ0InKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdmFsIGFzIHVua25vd25bXSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcodFswXSksIFN0cmluZyh0WzFdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2goJ0EnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsIGFzIHVua25vd25bXSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcodikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFydHMucHVzaCgnVScpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcGFydHMucHVzaCgnVicsIFN0cmluZyh2YWwpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaCgnVicsICdbb2JqXScpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignXFx1MDAxZicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqIFBhcnNlIHJhdyBxdWVyeSBpbnRvIHN0cnVjdHVyZWQgZmlsdGVycyAod2l0aCBpZGVudGl0eSBjYWNoZSkgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlcnM8RiBleHRlbmRzIERlZmluZWRGaWx0ZXJTY2hlbWE8RmlsdGVyU2NoZW1hPj4oXG4gIGRlZmluZWQ6IEYsXG4gIHJhd1F1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4sXG4pOiBJbmZlckZpbHRlcnM8Rlsnc2NoZW1hJ10+IHtcbiAgLy8gLS0tIENhY2hpbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gV2UgcmVidWlsZCB0aGUgc3RydWN0dXJlZCBvYmplY3QgZXZlcnkgaW52b2NhdGlvbiAoc2ltcGxpY2l0eSkgdGhlblxuICAvLyBjb21wdXRlIGEgc3RhYmxlIGNhbm9uaWNhbCBzaWduYXR1cmUgYW5kIHJldHVybiB0aGUgcHJldmlvdXNseSBjYWNoZWRcbiAgLy8gb2JqZWN0IHdoZW4gaWRlbnRpY2FsLiBUaGlzIHNhdGlzZmllcyBpZGVudGl0eSBleHBlY3RhdGlvbnMgaW4gdGVzdHNcbiAgLy8gKHBhcnNlRmlsdGVycyhhKSA9PT0gcGFyc2VGaWx0ZXJzKGEpIGZvciB1bmNoYW5nZWQgcmF3IHF1ZXJ5KSB3aGlsZVxuICAvLyBrZWVwaW5nIGltcGxlbWVudGF0aW9uIHN0cmFpZ2h0Zm9yd2FyZC4gTWVtb3J5IHVzYWdlIGlzIGJvdW5kZWQgYnlcbiAgLy8gdmFyaWF0aW9uIG9mIGNhbm9uaWNhbCBmaWx0ZXIgc3RhdGVzIGVuY291bnRlcmVkIGR1cmluZyBhcHAgbGlmZXRpbWUuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0IHNjaGVtYUlkID0gKCgpID0+IHtcbiAgICAvLyBBc3NpZ24gc3RhYmxlIHNtYWxsIG51bWVyaWMgaWQgcGVyIGRlZmluZWQgc2NoZW1hIHdyYXBwZXIuXG4gICAgY29uc3Qgd20gPSBTQ0hFTUFfSURTO1xuICAgIGxldCBpZCA9IHdtLmdldChkZWZpbmVkKTtcbiAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgaWQgPSBORVhUX1NDSEVNQV9JRCArPSAxO1xuICAgICAgd20uc2V0KGRlZmluZWQsIGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9KSgpO1xuICAvLyBXZSBidWlsZCB0aGVuIGhhc2g7IGFsdGVybmF0aXZlIHByZS1oYXNoIG9mIHJhdyB2YWx1ZXMgb21pdHRlZCBmb3IgY2xhcml0eS5cbiAgY29uc3QgeyBzY2hlbWEgfSA9IGRlZmluZWQ7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge307XG4gIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGNvbnN0IGZpZWxkID0gZW50cnlbMF07XG4gICAgY29uc3QgZGVmID0gZW50cnlbMV07XG4gICAgY29uc3QgZmllbGRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCBvcHMgPSBhbGxvd2VkT3BlcmF0b3JzKGRlZik7XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGAke2ZpZWxkfS4ke29wfWA7XG4gICAgICBjb25zdCByYXdWYWwgPSByYXdRdWVyeVtrZXldO1xuICAgICAgaWYgKHJhd1ZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5vIGtleVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHZhbHVlczogc3RyaW5nW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd1ZhbCkpIHtcbiAgICAgICAgICB2YWx1ZXMgPSByYXdWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVzID0gW3Jhd1ZhbF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wID09PSAnZXhpc3RzJykge1xuICAgICAgICAgIGNvbnN0IGxhc3QgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0ICE9PSB1bmRlZmluZWQgJiYgbGFzdCAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm0gPSBsYXN0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9ybSA9PT0gJzAnIHx8IG5vcm0gPT09ICdmYWxzZScgfHwgbm9ybSA9PT0gJ25vJykge1xuICAgICAgICAgICAgICBmaWVsZFN0YXRlLmV4aXN0cyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZmllbGRTdGF0ZS5leGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2JldHdlZW4nKSB7XG4gICAgICAgICAgY29uc3QgdHVwbGVzOiBbdW5rbm93biwgdW5rbm93bl1bXSA9IFtdO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICB3aGlsZSAoaSArIDEgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCByYXdBID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgY29uc3QgcmF3QiA9IHZhbHVlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocmF3QSA9PT0gdW5kZWZpbmVkIHx8IHJhd0IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGEgPSBwYXJzZVByaW1pdGl2ZShkZWYua2luZCwgcmF3QSk7XG4gICAgICAgICAgICBjb25zdCBiID0gcGFyc2VQcmltaXRpdmUoZGVmLmtpbmQsIHJhd0IpO1xuICAgICAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV0IHggPSBhO1xuICAgICAgICAgICAgICBsZXQgeSA9IGI7XG4gICAgICAgICAgICAgIGlmICgoeCBhcyBudW1iZXIpID4gKHkgYXMgbnVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHg7XG4gICAgICAgICAgICAgICAgeCA9IHk7XG4gICAgICAgICAgICAgICAgeSA9IHRtcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0dXBsZXMucHVzaChbeCwgeV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHVwbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHR1cGxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGF4ID0gYVswXSBhcyBudW1iZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICAgIGNvbnN0IGJ4ID0gYlswXSBhcyBudW1iZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChheCA8IGJ4KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIGlmIChheCA+IGJ4KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgY29uc3QgYXkgPSBhWzFdIGFzIG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgY29uc3QgYnkgPSBiWzFdIGFzIG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgaWYgKGF5IDwgYnkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgaWYgKGF5ID4gYnkpIHJldHVybiAxO1xuICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZmllbGRTdGF0ZS5iZXR3ZWVuID0gdHVwbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhcnI6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhd0l0ZW0gb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSByYXdJdGVtO1xuICAgICAgICAgICAgaWYgKGRlZi5raW5kID09PSAnc3RyaW5nJyAmJiBkZWYubm9ybWFsaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZi5ub3JtYWxpemUocmF3SXRlbSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcmF3SXRlbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlbXB0eVxuICAgICAgICAgICAgICAgIC8vIHNraXAgZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VQcmltaXRpdmUoZGVmLmtpbmQsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGFyci5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGRlZi5raW5kID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICBjb25zdCBudW1zID0gYXJyIGFzIG51bWJlcltdO1xuICAgICAgICAgICAgICBudW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoZGVmLmRlZHVwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBudW1zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBkZWQucHVzaChuKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpZWxkU3RhdGVbb3BdID0gZGVkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkU3RhdGVbb3BdID0gbnVtcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWYuZGVkdXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgYXJyIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuLmhhcyhzKSkge1xuICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQocyk7XG4gICAgICAgICAgICAgICAgICByZXMucHVzaChzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZmllbGRTdGF0ZVtvcF0gPSByZXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaWVsZFN0YXRlW29wXSA9IGFyciBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb3V0W2ZpZWxkXSA9IGZpZWxkU3RhdGU7XG4gIH1cbiAgY29uc3Qgc2lnbmF0dXJlID0gc3RhYmxlRmlsdGVyc1NpZ25hdHVyZShvdXQsIHNjaGVtYUlkKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBQQVJTRV9DQUNIRS5nZXQoc2lnbmF0dXJlKTtcbiAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcgYXMgSW5mZXJGaWx0ZXJzPEZbJ3NjaGVtYSddPjtcbiAgfVxuICBQQVJTRV9DQUNIRS5zZXQoc2lnbmF0dXJlLCBvdXQpO1xuICByZXR1cm4gb3V0IGFzIEluZmVyRmlsdGVyczxGWydzY2hlbWEnXT47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VyaWFsaXphdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgT1BFUkFUT1JfUFJJT1JJVFk6IEZpbHRlck9wZXJhdG9yW10gPSBbXG4gICdlcScsXG4gICdiZXR3ZWVuJyxcbiAgJ2d0JyxcbiAgJ2d0ZScsXG4gICdsdCcsXG4gICdsdGUnLFxuICAnaW4nLFxuICAnbmluJyxcbiAgJ2V4aXN0cycsXG4gICdjb250YWlucycsXG4gICdzdGFydHMnLFxuICAnZW5kcycsXG4gICdyZWdleCcsXG5dO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzUGF0Y2g8Rj4gPSB7IFtLIGluIGtleW9mIEZdPzogUGFydGlhbDxGW0tdPiB9O1xuXG4vKiogRGVlcCAob25lLWxldmVsKSBhcnJheSBlcXVhbGl0eSB3aXRoIHR1cGxlIHJlY3Vyc2lvbiAqL1xuZnVuY3Rpb24gYXJyYXlzRXF1YWwoYTogdW5rbm93bltdLCBiOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgYS5sZW5ndGgpIHtcbiAgICBjb25zdCBhdiA9IGFbaV07XG4gICAgY29uc3QgYnYgPSBiW2ldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGF2KSAmJiBBcnJheS5pc0FycmF5KGJ2KSkge1xuICAgICAgaWYgKCFhcnJheXNFcXVhbChhdiwgYnYpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGF2ICE9PSBidikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBTZXJpYWxpemUgc3RydWN0dXJlZCBmaWx0ZXJzIGJhY2sgaW50byBmbGF0IHF1ZXJ5IG9iamVjdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsdGVyc1F1ZXJ5PEYgZXh0ZW5kcyBEZWZpbmVkRmlsdGVyU2NoZW1hPEZpbHRlclNjaGVtYT4+KFxuICBkZWZpbmVkOiBGLFxuICBjdXJyZW50UXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBuZXh0OiBJbmZlckZpbHRlcnM8Rlsnc2NoZW1hJ10+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IHNjaGVtYSB9ID0gZGVmaW5lZDtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICBmb3IgKGNvbnN0IGt2IG9mIE9iamVjdC5lbnRyaWVzKGN1cnJlbnRRdWVyeSkpIHtcbiAgICBjb25zdCBrID0ga3ZbMF07XG4gICAgY29uc3QgdiA9IGt2WzFdO1xuICAgIGxldCBiZWxvbmdzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGsuc3RhcnRzV2l0aChgJHtmfS5gKSkge1xuICAgICAgICBiZWxvbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYmVsb25ncykge1xuICAgICAgb3V0W2tdID0gdjtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgY29uc3QgZmllbGQgPSBlbnRyeVswXTtcbiAgICBjb25zdCBkZWYgPSBlbnRyeVsxXTtcbiAgICBjb25zdCBvcHNVbnNvcnRlZCA9IGFsbG93ZWRPcGVyYXRvcnMoZGVmKTtcbiAgICBjb25zdCBvcHMgPSBbLi4ub3BzVW5zb3J0ZWRdO1xuICAgIG9wcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBpYSA9IE9QRVJBVE9SX1BSSU9SSVRZLmluZGV4T2YoYSk7XG4gICAgICBjb25zdCBpYiA9IE9QRVJBVE9SX1BSSU9SSVRZLmluZGV4T2YoYik7XG4gICAgICBsZXQgc2FmZUEgPSBpYTtcbiAgICAgIGlmIChzYWZlQSA9PT0gLTEpIHtcbiAgICAgICAgc2FmZUEgPSA5OTk7XG4gICAgICB9XG4gICAgICBsZXQgc2FmZUIgPSBpYjtcbiAgICAgIGlmIChzYWZlQiA9PT0gLTEpIHtcbiAgICAgICAgc2FmZUIgPSA5OTk7XG4gICAgICB9XG4gICAgICBpZiAoc2FmZUEgPCBzYWZlQikgcmV0dXJuIC0xO1xuICAgICAgaWYgKHNhZmVBID4gc2FmZUIpIHJldHVybiAxO1xuICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gICAgY29uc3QgcmVjb3JkTmV4dCA9IG5leHQgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgIGNvbnN0IHN0YXRlID0gcmVjb3JkTmV4dFtmaWVsZF0gPz8ge307XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdGUsIG9wKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW29wXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IGRlZi5kZWZhdWx0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWZhdWx0cyAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdHMsIG9wKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgZHYgPSBkZWZhdWx0c1tvcF07XG4gICAgICAgICAgICBsZXQgZXF1YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGR2KSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBlcXVhbCA9IGFycmF5c0VxdWFsKGR2LCB2YWx1ZSBhcyB1bmtub3duW10pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZHYgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBlcXVhbCA9IGR2ID09PSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcXVhbCkge1xuICAgICAgICAgICAgICAvLyBvbWl0IGRlZmF1bHQtZXF1aXZhbGVudFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgY29udGludWU7IC8vIG9taXQgZGVmYXVsdC1lcXVpdmFsZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGtleSA9IGAke2ZpZWxkfS4ke29wfWA7XG4gICAgICAgICAgaWYgKG9wID09PSAnZXhpc3RzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgb3V0W2tleV0gPSBzZXJpYWxpemVQcmltaXRpdmUodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICdiZXR3ZWVuJykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gdmFsdWUgYXMgW3Vua25vd24sIHVua25vd25dW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICAgICAgICBjb25zdCBhVmFsID0gcmFuZ2VbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGJWYWwgPSByYW5nZVsxXTtcbiAgICAgICAgICAgICAgY29uc3QgcGFpcjogKHN0cmluZyB8IG51bWJlcilbXSA9IFtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVQcmltaXRpdmUoYVZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVQcmltaXRpdmUoYlZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBvdXRba2V5XTtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHBhaXI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IFsuLi5leGlzdGluZywgLi4ucGFpcl07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBbZXhpc3RpbmcsIC4uLnBhaXJdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IHZhbHVlIGFzIHVua25vd25bXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIGFycikge1xuICAgICAgICAgICAgICBjb25zdCBzdiA9IHNlcmlhbGl6ZVByaW1pdGl2ZSh2YWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbik7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gb3V0W2tleV07XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBzdjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnB1c2goc3YpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gW2V4aXN0aW5nLCBzdl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIb29rXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRmlsdGVyc0hlbHBlcnM8Rj4ge1xuICBzZXQ6IChcbiAgICBuZXh0OiBGIHwgKChwOiBGKSA9PiBGKSxcbiAgICBuYXZPcHRzPzogeyByZXBsYWNlPzogYm9vbGVhbjsgYmF0Y2g/OiBib29sZWFuOyBpbnRlcm5hbEJhdGNoPzogYm9vbGVhbiB9LFxuICApID0+IHZvaWQ7XG4gIHBhdGNoOiAoXG4gICAgZGVsdGE6IEZpbHRlcnNQYXRjaDxGPixcbiAgICBuYXZPcHRzPzogeyByZXBsYWNlPzogYm9vbGVhbjsgYmF0Y2g/OiBib29sZWFuOyBpbnRlcm5hbEJhdGNoPzogYm9vbGVhbiB9LFxuICApID0+IHZvaWQ7XG4gIGNsZWFyOiAoXG4gICAgZmllbGRzPzogKGtleW9mIEYpW10sXG4gICAgbmF2T3B0cz86IHsgcmVwbGFjZT86IGJvb2xlYW47IGJhdGNoPzogYm9vbGVhbjsgaW50ZXJuYWxCYXRjaD86IGJvb2xlYW4gfSxcbiAgKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIHVzZUZpbHRlcnMgaG9va1xuICogLSBXaGVuIGEgc2NoZW1hIHdyYXBwZXIgaXMgcHJvdmlkZWQsIHR5cGVzIHJlbWFpbiBpbmZlcnJlZC5cbiAqIC0gV2hlbiBvbWl0dGVkLCBpbXBsaWNpdCBtZXJnZWQgcm91dGUgc2NoZW1hIGlzIHVzZWQgKGhlbHBlcnMgc3RpbGwgd29yayBidXQgcmVjb3JkIGlzIGdlbmVyaWMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmlsdGVycyhcbiAgZGVmaW5lZD86IERlZmluZWRGaWx0ZXJTY2hlbWE8RmlsdGVyU2NoZW1hPixcbik6IFtcbiAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBVc2VGaWx0ZXJzSGVscGVyczxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+LFxuXSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoUm91dGluZ0NvbnRleHQpO1xuICBjb25zdCBlbnRyeSA9IGN0eD8uZ2V0KCk7XG4gIGNvbnN0IGFjdGl2ZURlZmluZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGVmaW5lZCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGN0eCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY3R4LmN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKTtcbiAgfSwgW2RlZmluZWQsIGN0eF0pO1xuXG4gIGNvbnN0IGZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoYWN0aXZlRGVmaW5lZCA9PSBudWxsIHx8IGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZpbHRlcnMoYWN0aXZlRGVmaW5lZCwgZW50cnkucXVlcnkpO1xuICB9LCBbYWN0aXZlRGVmaW5lZCwgZW50cnldKTtcblxuICB0eXBlIE5hdk9wdHMgPSB7XG4gICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgYmF0Y2g/OiBib29sZWFuO1xuICAgIGludGVybmFsQmF0Y2g/OiBib29sZWFuO1xuICB9O1xuICBjb25zdCBzY2hlbWFSZWYgPSB1c2VSZWYoYWN0aXZlRGVmaW5lZCk7XG4gIHNjaGVtYVJlZi5jdXJyZW50ID0gYWN0aXZlRGVmaW5lZDtcblxuICBjb25zdCBuYXZpZ2F0ZUZpbHRlcnMgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBuZXh0RmlsdGVyczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgb3B0cz86IHsgcmVwbGFjZT86IGJvb2xlYW47IGJhdGNoPzogYm9vbGVhbiB9LFxuICAgICkgPT4ge1xuICAgICAgaWYgKGN0eCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBzY2hlbWFOb3cgPSBzY2hlbWFSZWYuY3VycmVudDtcbiAgICAgIHNjaGVtYU5vdyA/Pz0gY3R4LmN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKTtcbiAgICAgIGlmIChzY2hlbWFOb3cgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHgubmF2aWdhdGUoe1xuICAgICAgICBmaWx0ZXJzOiBuZXh0RmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hOiBzY2hlbWFOb3csXG4gICAgICAgIHJlcGxhY2U6IG9wdHM/LnJlcGxhY2UsXG4gICAgICAgIGJhdGNoOiBvcHRzPy5iYXRjaCxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2N0eF0sXG4gICk7XG5cbiAgY29uc3Qgc2V0ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbmV4dDpcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgcDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICkgPT4gUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSxcbiAgICAgIG5hdk9wdHM/OiBOYXZPcHRzLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IGZpbHRlcnM7XG4gICAgICBsZXQgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHByZXY7XG4gICAgICBpZiAodHlwZW9mIG5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNvbHZlZCA9IG5leHQocHJldik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJlc29sdmVkID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZWQgPSBuZXh0O1xuICAgICAgfVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSBuYXZPcHRzPy5pbnRlcm5hbEJhdGNoICE9PSBmYWxzZTtcbiAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgbGV0IHJlcGxhY2VGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgYmF0Y2hGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobmF2T3B0cy5yZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmVwbGFjZUZsYWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZPcHRzLmJhdGNoID09PSB0cnVlKSB7XG4gICAgICAgICAgYmF0Y2hGbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuYXZpZ2F0ZUZpbHRlcnMocmVzb2x2ZWQsIHsgcmVwbGFjZTogcmVwbGFjZUZsYWcsIGJhdGNoOiBiYXRjaEZsYWcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGludGVyZmFjZSBQZW5kaW5nU3RhdGUge1xuICAgICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgYmF0Y2g/OiBib29sZWFuO1xuICAgICAgICBzY2hlZHVsZWQ6IGJvb2xlYW47XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxmID0gc2V0IGFzIHVua25vd24gYXMgeyBfX3BlbmRpbmc/OiBQZW5kaW5nU3RhdGUgfTtcbiAgICAgIHNlbGYuX19wZW5kaW5nID8/PSB7IHNjaGVkdWxlZDogZmFsc2UgfTtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBzZWxmLl9fcGVuZGluZztcbiAgICAgIHBlbmRpbmcuZmlsdGVycyA9IHJlc29sdmVkO1xuICAgICAgaWYgKG5hdk9wdHM/LnJlcGxhY2UpIHtcbiAgICAgICAgcGVuZGluZy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXZPcHRzPy5iYXRjaCkge1xuICAgICAgICBwZW5kaW5nLmJhdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcGVuZGluZy5zY2hlZHVsZWQpIHtcbiAgICAgICAgcGVuZGluZy5zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5zY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocGVuZGluZy5maWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hdmlnYXRlRmlsdGVycyhwZW5kaW5nLmZpbHRlcnMsIHtcbiAgICAgICAgICAgICAgcmVwbGFjZTogcGVuZGluZy5yZXBsYWNlLFxuICAgICAgICAgICAgICBiYXRjaDogcGVuZGluZy5iYXRjaCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwZW5kaW5nLmZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcGVuZGluZy5yZXBsYWNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHBlbmRpbmcuYmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpbHRlcnMsIG5hdmlnYXRlRmlsdGVyc10sXG4gICk7XG5cbiAgY29uc3QgcGF0Y2ggPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBkZWx0YTogRmlsdGVyc1BhdGNoPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4sXG4gICAgICBuYXZPcHRzPzogTmF2T3B0cyxcbiAgICApID0+IHtcbiAgICAgIHNldCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHsgLi4ucHJldiB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZCwgb3BzXSBvZiBPYmplY3QuZW50cmllcyhkZWx0YSkpIHtcbiAgICAgICAgICBsZXQgY3VyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IG1lcmdlZFtmaWVsZF07XG4gICAgICAgICAgaWYgKGN1ciA9PSBudWxsIHx8IHR5cGVvZiBjdXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjdXIgPSB7fTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyID0geyAuLi5jdXIgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wcyAhPSBudWxsICYmIHR5cGVvZiBvcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtvcCwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgb3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjdXJbb3BdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZXJnZWRbZmllbGRdID0gY3VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICB9LCBuYXZPcHRzKTtcbiAgICB9LFxuICAgIFtzZXRdLFxuICApO1xuXG4gIGNvbnN0IGNsZWFyID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpZWxkcz86IHN0cmluZ1tdLCBuYXZPcHRzPzogTmF2T3B0cykgPT4ge1xuICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7XG4gICAgICAgIHNldCgocHJldikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhwcmV2KSkge1xuICAgICAgICAgICAgbmV4dFtrXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfSwgbmF2T3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbXB0eUVudHJpZXMgPSBmaWVsZHMubWFwKChmKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtmLCB7fV07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkZWx0YSA9IE9iamVjdC5mcm9tRW50cmllcyhlbXB0eUVudHJpZXMpIGFzIEZpbHRlcnNQYXRjaDxcbiAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgPjtcbiAgICAgICAgcGF0Y2goZGVsdGEsIG5hdk9wdHMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3BhdGNoLCBzZXRdLFxuICApO1xuXG4gIGNvbnN0IGhlbHBlcnM6IFVzZUZpbHRlcnNIZWxwZXJzPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPSB7XG4gICAgc2V0LFxuICAgIHBhdGNoLFxuICAgIGNsZWFyLFxuICB9O1xuICByZXR1cm4gW2ZpbHRlcnMsIGhlbHBlcnNdO1xufVxuXG5leHBvcnQgY29uc3QgdXNlUXVlcnlGaWx0ZXJzID0gdXNlRmlsdGVycztcbmV4cG9ydCBkZWZhdWx0IHVzZUZpbHRlcnM7XG4iXX0=