@plumile/router 0.1.13 → 0.1.17

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 (117) hide show
  1. package/README.md +43 -422
  2. package/lib/esm/builder.d.ts +5 -5
  3. package/lib/esm/builder.d.ts.map +1 -1
  4. package/lib/esm/builder.js +1 -1
  5. package/lib/esm/index.d.ts +0 -4
  6. package/lib/esm/index.d.ts.map +1 -1
  7. package/lib/esm/index.js +1 -5
  8. package/lib/esm/routing/Link.d.ts +3 -3
  9. package/lib/esm/routing/Link.d.ts.map +1 -1
  10. package/lib/esm/routing/Link.js +3 -8
  11. package/lib/esm/routing/RouteComponentWrapper.d.ts +6 -5
  12. package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
  13. package/lib/esm/routing/RouteComponentWrapper.js +1 -1
  14. package/lib/esm/routing/RouterRenderer.d.ts.map +1 -1
  15. package/lib/esm/routing/RouterRenderer.js +1 -1
  16. package/lib/esm/routing/createRouter.d.ts +0 -1
  17. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  18. package/lib/esm/routing/createRouter.js +434 -399
  19. package/lib/esm/routing/index.d.ts +2 -6
  20. package/lib/esm/routing/index.d.ts.map +1 -1
  21. package/lib/esm/routing/index.js +3 -7
  22. package/lib/esm/routing/useAllQuery.d.ts +7 -0
  23. package/lib/esm/routing/useAllQuery.d.ts.map +1 -0
  24. package/lib/esm/routing/useAllQuery.js +31 -0
  25. package/lib/esm/routing/useFilterDiagnostics.d.ts +2 -0
  26. package/lib/esm/routing/useFilterDiagnostics.d.ts.map +1 -0
  27. package/lib/esm/routing/useFilterDiagnostics.js +11 -0
  28. package/lib/esm/routing/useFilters.d.ts +16 -0
  29. package/lib/esm/routing/useFilters.d.ts.map +1 -0
  30. package/lib/esm/routing/useFilters.js +83 -0
  31. package/lib/esm/routing/useNavigate.d.ts +2 -9
  32. package/lib/esm/routing/useNavigate.d.ts.map +1 -1
  33. package/lib/esm/routing/useNavigate.js +1 -1
  34. package/lib/esm/routing/useQueryState.d.ts +1 -1
  35. package/lib/esm/routing/useQueryState.d.ts.map +1 -1
  36. package/lib/esm/routing/useQueryState.js +2 -2
  37. package/lib/esm/routing/useTypedQuery.js +1 -1
  38. package/lib/esm/tools/buildCombinedSearch.d.ts +11 -0
  39. package/lib/esm/tools/buildCombinedSearch.d.ts.map +1 -0
  40. package/lib/esm/tools/buildCombinedSearch.js +28 -0
  41. package/lib/esm/tools/buildSearch.d.ts +2 -8
  42. package/lib/esm/tools/buildSearch.d.ts.map +1 -1
  43. package/lib/esm/tools/buildSearch.js +12 -216
  44. package/lib/esm/tools.d.ts +1 -1
  45. package/lib/esm/tools.d.ts.map +1 -1
  46. package/lib/esm/tools.js +1 -1
  47. package/lib/esm/types.d.ts +25 -37
  48. package/lib/esm/types.d.ts.map +1 -1
  49. package/lib/esm/types.js +1 -1
  50. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  51. package/lib/types/builder.d.ts +5 -5
  52. package/lib/types/builder.d.ts.map +1 -1
  53. package/lib/types/index.d.ts +0 -4
  54. package/lib/types/index.d.ts.map +1 -1
  55. package/lib/types/routing/Link.d.ts +3 -3
  56. package/lib/types/routing/Link.d.ts.map +1 -1
  57. package/lib/types/routing/RouteComponentWrapper.d.ts +6 -5
  58. package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
  59. package/lib/types/routing/RouterRenderer.d.ts.map +1 -1
  60. package/lib/types/routing/createRouter.d.ts +0 -1
  61. package/lib/types/routing/createRouter.d.ts.map +1 -1
  62. package/lib/types/routing/index.d.ts +2 -6
  63. package/lib/types/routing/index.d.ts.map +1 -1
  64. package/lib/types/routing/useAllQuery.d.ts +7 -0
  65. package/lib/types/routing/useAllQuery.d.ts.map +1 -0
  66. package/lib/types/routing/useFilterDiagnostics.d.ts +2 -0
  67. package/lib/types/routing/useFilterDiagnostics.d.ts.map +1 -0
  68. package/lib/types/routing/useFilters.d.ts +16 -0
  69. package/lib/types/routing/useFilters.d.ts.map +1 -0
  70. package/lib/types/routing/useNavigate.d.ts +2 -9
  71. package/lib/types/routing/useNavigate.d.ts.map +1 -1
  72. package/lib/types/routing/useQueryState.d.ts +1 -1
  73. package/lib/types/routing/useQueryState.d.ts.map +1 -1
  74. package/lib/types/tools/buildCombinedSearch.d.ts +11 -0
  75. package/lib/types/tools/buildCombinedSearch.d.ts.map +1 -0
  76. package/lib/types/tools/buildSearch.d.ts +2 -8
  77. package/lib/types/tools/buildSearch.d.ts.map +1 -1
  78. package/lib/types/tools.d.ts +1 -1
  79. package/lib/types/tools.d.ts.map +1 -1
  80. package/lib/types/types.d.ts +25 -37
  81. package/lib/types/types.d.ts.map +1 -1
  82. package/package.json +6 -5
  83. package/lib/esm/routing/devtools.d.ts +0 -20
  84. package/lib/esm/routing/devtools.d.ts.map +0 -1
  85. package/lib/esm/routing/devtools.js +0 -678
  86. package/lib/esm/routing/filters.d.ts +0 -97
  87. package/lib/esm/routing/filters.d.ts.map +0 -1
  88. package/lib/esm/routing/filters.js +0 -557
  89. package/lib/esm/routing/useActiveFilters.d.ts +0 -9
  90. package/lib/esm/routing/useActiveFilters.d.ts.map +0 -1
  91. package/lib/esm/routing/useActiveFilters.js +0 -38
  92. package/lib/esm/routing/useFilterState.d.ts +0 -10
  93. package/lib/esm/routing/useFilterState.d.ts.map +0 -1
  94. package/lib/esm/routing/useFilterState.js +0 -14
  95. package/lib/esm/routing/useNavigateWithQuery.d.ts +0 -15
  96. package/lib/esm/routing/useNavigateWithQuery.d.ts.map +0 -1
  97. package/lib/esm/routing/useNavigateWithQuery.js +0 -95
  98. package/lib/esm/routing/useQueryObject.d.ts +0 -18
  99. package/lib/esm/routing/useQueryObject.d.ts.map +0 -1
  100. package/lib/esm/routing/useQueryObject.js +0 -107
  101. package/lib/esm/routing/useStableRefEquality.d.ts +0 -5
  102. package/lib/esm/routing/useStableRefEquality.d.ts.map +0 -1
  103. package/lib/esm/routing/useStableRefEquality.js +0 -47
  104. package/lib/types/routing/devtools.d.ts +0 -20
  105. package/lib/types/routing/devtools.d.ts.map +0 -1
  106. package/lib/types/routing/filters.d.ts +0 -97
  107. package/lib/types/routing/filters.d.ts.map +0 -1
  108. package/lib/types/routing/useActiveFilters.d.ts +0 -9
  109. package/lib/types/routing/useActiveFilters.d.ts.map +0 -1
  110. package/lib/types/routing/useFilterState.d.ts +0 -10
  111. package/lib/types/routing/useFilterState.d.ts.map +0 -1
  112. package/lib/types/routing/useNavigateWithQuery.d.ts +0 -15
  113. package/lib/types/routing/useNavigateWithQuery.d.ts.map +0 -1
  114. package/lib/types/routing/useQueryObject.d.ts +0 -18
  115. package/lib/types/routing/useQueryObject.d.ts.map +0 -1
  116. package/lib/types/routing/useStableRefEquality.d.ts +0 -5
  117. package/lib/types/routing/useStableRefEquality.d.ts.map +0 -1
@@ -4,6 +4,8 @@ import { getMatchedRoute, prepareMatch } from '../tools.js';
4
4
  import { parseTypedQuery } from '../tools/query-dsl.js';
5
5
  import { parseRawQuery } from '../tools/query.js';
6
6
  import { buildSearch } from '../tools/buildSearch.js';
7
+ import buildCombinedSearch from '../tools/buildCombinedSearch.js';
8
+ import { parse as parseFilters } from '@plumile/filter-query';
7
9
  export default function createRouter(routes, opts = {}) {
8
10
  let devtoolsGlobal;
9
11
  let devtoolsPanel = false;
@@ -46,22 +48,36 @@ export default function createRouter(routes, opts = {}) {
46
48
  let initialSchema;
47
49
  if (route != null) {
48
50
  const collected = [];
49
- const collectedFilters = [];
50
51
  for (const r of route.route.routes) {
51
52
  const maybe = r.query;
52
53
  if (maybe != null) {
53
54
  collected.push(maybe);
54
55
  }
55
- const maybeFilter = r.filterSchema;
56
- if (maybeFilter != null) {
57
- collectedFilters.push(maybeFilter);
58
- }
59
56
  }
60
57
  if (collected.length > 0) {
61
58
  initialSchema = collected.at(-1);
62
59
  }
63
60
  }
64
61
  const initialTypedQuery = parseTypedQuery(initialSchema, initialRawQuery);
62
+ let initialFilterSchema;
63
+ if (route != null) {
64
+ const collected = [];
65
+ for (const r of route.route.routes) {
66
+ const maybe = r
67
+ .filterSchema;
68
+ if (maybe != null)
69
+ collected.push(maybe);
70
+ }
71
+ if (collected.length > 0)
72
+ initialFilterSchema = collected.at(-1);
73
+ }
74
+ let initialFilters;
75
+ let initialFilterDiagnostics;
76
+ if (initialFilterSchema != null) {
77
+ const parsed = parseFilters(history.location.search, initialFilterSchema);
78
+ initialFilters = parsed.filters;
79
+ initialFilterDiagnostics = parsed.diagnostics;
80
+ }
65
81
  const preparedMatch = prepareMatch(route, initialTypedQuery);
66
82
  let currentEntry = {
67
83
  forceRerender: false,
@@ -71,6 +87,8 @@ export default function createRouter(routes, opts = {}) {
71
87
  rawSearch: history.location.search,
72
88
  query: initialRawQuery,
73
89
  typedQuery: initialTypedQuery,
90
+ filters: initialFilters,
91
+ filterDiagnostics: initialFilterDiagnostics,
74
92
  };
75
93
  const initTyped = currentEntry.typedQuery;
76
94
  let initPage;
@@ -106,24 +124,35 @@ export default function createRouter(routes, opts = {}) {
106
124
  }
107
125
  const query = parseRawQuery(location.search);
108
126
  let schema;
127
+ let filterSchema;
109
128
  if (nextRoute != null) {
110
129
  const collected = [];
111
- const collectedFilters = [];
130
+ const filterCollected = [];
112
131
  for (const r of nextRoute.route.routes) {
113
132
  const maybe = r.query;
114
133
  if (maybe != null) {
115
134
  collected.push(maybe);
116
135
  }
117
- const maybeFilter = r.filterSchema;
118
- if (maybeFilter != null) {
119
- collectedFilters.push(maybeFilter);
120
- }
136
+ const maybeF = r
137
+ .filterSchema;
138
+ if (maybeF != null)
139
+ filterCollected.push(maybeF);
121
140
  }
122
141
  if (collected.length > 0) {
123
142
  schema = collected.at(-1);
124
143
  }
144
+ if (filterCollected.length > 0) {
145
+ filterSchema = filterCollected.at(-1);
146
+ }
125
147
  }
126
148
  let typedQuery = parseTypedQuery(schema, query);
149
+ let filters;
150
+ let filterDiagnostics;
151
+ if (filterSchema != null) {
152
+ const parsedF = parseFilters(location.search, filterSchema);
153
+ filters = parsedF.filters;
154
+ filterDiagnostics = parsedF.diagnostics;
155
+ }
127
156
  let normalized = false;
128
157
  const pg = typedQuery.page;
129
158
  if (typeof pg === 'number' && pg < 1) {
@@ -145,9 +174,16 @@ export default function createRouter(routes, opts = {}) {
145
174
  rawSearch: location.search,
146
175
  query,
147
176
  typedQuery,
177
+ filters,
178
+ filterDiagnostics,
148
179
  };
149
180
  if (normalized && schema != null) {
150
- const normalizedSearch = buildSearch(typedQuery, schema);
181
+ const normalizedSearch = buildCombinedSearch({
182
+ query: typedQuery,
183
+ querySchema: schema,
184
+ filters,
185
+ filterSchema,
186
+ });
151
187
  if (normalizedSearch !== location.search) {
152
188
  history.set({
153
189
  pathname: location.pathname,
@@ -162,272 +198,23 @@ export default function createRouter(routes, opts = {}) {
162
198
  callback(nextEntry);
163
199
  });
164
200
  });
165
- let pendingNavs;
166
- let flushScheduled = false;
167
- let batchedMergedQuery;
168
- let lastBatchQuery;
169
- let batchedFilters;
170
- let batchedFilterSchema;
171
- let devtoolsOnNavEvent;
172
- let batchMode;
173
- function collectRouteChain(pathname) {
174
- if (pathname === currentEntry.location.pathname) {
175
- if (currentEntry.route != null) {
176
- return currentEntry.route.route.routes;
177
- }
178
- return undefined;
179
- }
180
- const destRoute = getMatchedRoute(flatRoutes, {
181
- ...window.location,
182
- pathname,
183
- });
184
- if (destRoute != null)
185
- return destRoute.route.routes;
186
- return undefined;
187
- }
188
- function mergeQuerySchemaFromChain(chain) {
189
- if (chain == null)
190
- return undefined;
191
- const merged = {};
192
- for (const node of chain) {
193
- const qobj = node.query;
194
- if (qobj != null) {
195
- for (const [k, v] of Object.entries(qobj)) {
196
- merged[k] = v;
197
- }
198
- }
199
- }
200
- if (Object.keys(merged).length === 0)
201
- return undefined;
202
- return merged;
203
- }
204
- function mergeFilterSchemaFromChain(chain) {
205
- if (chain == null)
206
- return undefined;
207
- let merged;
208
- for (const node of chain) {
209
- const fs = node.filterSchema;
210
- if (fs != null) {
211
- merged ??= {};
212
- Object.assign(merged, fs.schema);
213
- }
214
- }
215
- if (merged != null)
216
- return { __defined: true, schema: merged };
217
- return undefined;
218
- }
219
- function resolveSchema(pathname) {
220
- return mergeQuerySchemaFromChain(collectRouteChain(pathname));
221
- }
222
- function resolveFilterSchema(pathname) {
223
- return mergeFilterSchemaFromChain(collectRouteChain(pathname));
224
- }
225
- function coalesceNavigations(list) {
226
- let targetPathname = currentEntry.location.pathname;
227
- if (targetPathname === '') {
228
- targetPathname = '/';
229
- }
230
- for (const nav of list) {
231
- if (nav.pathname !== undefined) {
232
- const pn = nav.pathname;
233
- if (pn === '') {
234
- targetPathname = '/';
235
- }
236
- else {
237
- targetPathname = pn;
238
- }
239
- }
240
- }
241
- let replaceFlag;
242
- for (const nav of list) {
243
- if (nav.replace !== undefined) {
244
- replaceFlag = nav.replace;
245
- }
246
- }
247
- let baseQuery = currentEntry.typedQuery ?? currentEntry.query ?? {};
248
- if (batchedMergedQuery != null) {
249
- baseQuery = batchedMergedQuery;
250
- }
251
- else if (lastBatchQuery != null) {
252
- baseQuery = lastBatchQuery;
253
- }
254
- else {
255
- for (let i = list.length - 1; i >= 0; i -= 1) {
256
- const item = list[i];
257
- if (item != null) {
258
- const q = item.query;
259
- if (q != null && Object.keys(q).length > 0) {
260
- baseQuery = q;
261
- break;
262
- }
263
- }
264
- }
265
- }
266
- const batchFilters = batchedFilters;
267
- const batchFilterSchema = batchedFilterSchema;
268
- const schema = resolveSchema(targetPathname);
269
- let buildOpts;
270
- if (batchFilters !== undefined) {
271
- const fs = batchFilterSchema ?? resolveFilterSchema(targetPathname);
272
- if (fs != null) {
273
- buildOpts = { filters: batchFilters, filterSchema: fs };
274
- }
275
- }
276
- const search = buildSearch(baseQuery, schema, buildOpts);
277
- let normalizedPath = targetPathname;
278
- if (normalizedPath === '') {
279
- normalizedPath = '/';
280
- }
281
- let nextRoute = currentEntry.route;
282
- if (normalizedPath !== currentEntry.location.pathname) {
283
- nextRoute = getMatchedRoute(flatRoutes, {
284
- ...window.location,
285
- pathname: normalizedPath,
286
- });
287
- }
288
- const effectiveSchema = schema ?? resolveSchema(normalizedPath);
289
- const rawQueryObj = parseRawQuery(search);
290
- const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
291
- const prepared = prepareMatch(nextRoute, typed);
292
- const nextEntry = {
293
- forceRerender: false,
294
- location: { ...currentEntry.location, pathname: normalizedPath, search },
295
- route: nextRoute,
296
- preparedMatch: prepared,
297
- rawSearch: search,
298
- query: rawQueryObj,
299
- typedQuery: typed,
300
- };
301
- return {
302
- search,
303
- pathname: normalizedPath,
304
- replace: replaceFlag,
305
- nextEntry,
306
- };
307
- }
308
- function flushNavigations() {
309
- flushScheduled = false;
310
- const list = pendingNavs;
311
- pendingNavs = undefined;
312
- if (list == null || list.length === 0) {
313
- return;
314
- }
315
- const { search, pathname, replace: replaceFlag, nextEntry, } = coalesceNavigations(list);
316
- batchedMergedQuery = undefined;
317
- lastBatchQuery = undefined;
318
- batchedFilters = undefined;
319
- batchedFilterSchema = undefined;
320
- currentEntry = nextEntry;
321
- const loc = { pathname, search, hash: '' };
322
- if (replaceFlag)
323
- history.set(loc);
324
- else
325
- history.push(loc);
326
- let mode = 'manual';
327
- if (batchMode === 'auto') {
328
- mode = 'auto';
329
- }
330
- else if (batchMode === 'mixed') {
331
- mode = 'mixed';
332
- }
333
- devtoolsOnNavEvent?.({
334
- kind: 'batch-flush',
335
- mode,
336
- count: list.length,
337
- pathname,
338
- search,
339
- timestamp: Date.now(),
340
- });
341
- batchMode = undefined;
342
- }
343
- function applyProvisionalBatchUpdate(pathname) {
344
- try {
345
- const basePath = pathname ?? currentEntry.location.pathname;
346
- const schema = resolveSchema(basePath);
347
- const mergedQ = batchedMergedQuery ?? lastBatchQuery ?? {};
348
- let buildOpts;
349
- if (batchedFilters != null && batchedFilterSchema != null) {
350
- buildOpts = {
351
- filters: batchedFilters,
352
- filterSchema: batchedFilterSchema,
353
- };
354
- }
355
- else if (batchedFilters != null && batchedFilterSchema == null) {
356
- let merged;
357
- let routeChain;
358
- if (basePath === currentEntry.location.pathname) {
359
- if (currentEntry.route != null) {
360
- routeChain = currentEntry.route.route.routes;
361
- }
362
- }
363
- else {
364
- const destRoute = getMatchedRoute(flatRoutes, {
365
- ...window.location,
366
- pathname: basePath,
367
- });
368
- if (destRoute != null) {
369
- routeChain = destRoute.route.routes;
370
- }
371
- }
372
- if (routeChain != null) {
373
- for (const node of routeChain) {
374
- const fs = node.filterSchema;
375
- if (fs != null) {
376
- merged ??= {};
377
- Object.assign(merged, fs.schema);
378
- }
379
- }
380
- }
381
- if (merged != null) {
382
- buildOpts = {
383
- filters: batchedFilters,
384
- filterSchema: { __defined: true, schema: merged },
385
- };
386
- }
387
- }
388
- const provisionalSearch = buildSearch(mergedQ, schema, buildOpts);
389
- const pathChanged = basePath !== currentEntry.location.pathname;
390
- if (provisionalSearch !== currentEntry.rawSearch || pathChanged) {
391
- const typed = parseTypedQuery(schema, mergedQ);
392
- const rawQueryObj = parseRawQuery(provisionalSearch);
393
- currentEntry = {
394
- ...currentEntry,
395
- location: {
396
- ...currentEntry.location,
397
- pathname: basePath,
398
- search: provisionalSearch,
399
- },
400
- rawSearch: provisionalSearch,
401
- query: rawQueryObj,
402
- typedQuery: typed,
403
- };
404
- }
405
- }
406
- catch {
407
- }
408
- }
409
- const autoBatch = opts.autoBatch === true;
410
201
  const context = {
411
202
  history,
412
203
  get() {
413
204
  return currentEntry;
414
205
  },
415
- resolveFilterSchema(pathname) {
416
- return resolveFilterSchema(pathname);
417
- },
418
- currentMergedFilterSchema() {
419
- return resolveFilterSchema(currentEntry.location.pathname);
420
- },
421
206
  preloadCode(pathname) {
422
207
  const matches = getMatchedRoute(flatRoutes, {
423
208
  ...window.location,
424
209
  pathname,
425
210
  });
426
- if (matches == null)
211
+ if (matches == null) {
427
212
  return;
213
+ }
428
214
  matches.route.routes.forEach(({ resourcePage }) => {
429
- if (resourcePage == null)
215
+ if (resourcePage == null) {
430
216
  return;
217
+ }
431
218
  resourcePage.load();
432
219
  });
433
220
  },
@@ -441,158 +228,406 @@ export default function createRouter(routes, opts = {}) {
441
228
  subscribe(callback) {
442
229
  nextId += 1;
443
230
  const id = nextId;
444
- function dispose() {
231
+ const dispose = () => {
445
232
  subscribers.delete(id);
446
- }
233
+ };
447
234
  subscribers.set(id, callback);
448
235
  return dispose;
449
236
  },
450
- navigate({ pathname, query, replace, filters, filterSchema, batch, immediate, inherit, }) {
451
- try {
452
- const effectiveInherit = inherit === true;
453
- const wantsBatch = batch === true ||
454
- (autoBatch && immediate !== true && batch !== false);
455
- if (wantsBatch) {
456
- const nav = {};
457
- if (pathname !== undefined)
458
- nav.pathname = pathname;
459
- if (query !== undefined)
460
- nav.query = query;
461
- if (replace !== undefined)
462
- nav.replace = replace;
463
- if (filters !== undefined)
464
- nav.filters = filters;
465
- if (filterSchema !== undefined)
466
- nav.filterSchema = filterSchema;
467
- if (effectiveInherit)
468
- nav.inherit = true;
469
- pendingNavs ??= [];
470
- pendingNavs.push(nav);
471
- let thisMode;
472
- if (batch === true)
473
- thisMode = 'manual';
474
- else
475
- thisMode = 'auto';
476
- if (batchMode == null)
477
- batchMode = thisMode;
478
- else if (batchMode !== thisMode)
479
- batchMode = 'mixed';
480
- if (query != null) {
481
- if (effectiveInherit) {
482
- const base = batchedMergedQuery ??
483
- lastBatchQuery ??
484
- currentEntry.typedQuery ??
485
- currentEntry.query ??
486
- {};
487
- batchedMergedQuery = { ...base, ...query };
488
- }
489
- else {
490
- batchedMergedQuery = { ...query };
491
- }
492
- lastBatchQuery = query;
493
- }
494
- if (filters != null) {
495
- batchedFilters = filters;
496
- if (filterSchema != null)
497
- batchedFilterSchema = filterSchema;
498
- }
499
- if (!flushScheduled) {
500
- flushScheduled = true;
501
- Promise.resolve().then(flushNavigations);
502
- }
503
- applyProvisionalBatchUpdate(pathname);
504
- subscribers.forEach((cb) => {
505
- cb(currentEntry);
506
- });
237
+ navigate({ pathname, query, filters: navFilters, replace, }) {
238
+ const current = currentEntry;
239
+ const targetPathname = pathname ?? current.location.pathname;
240
+ let schema;
241
+ let filterSchema;
242
+ function collectSchema(routesArr) {
243
+ if (routesArr == null) {
507
244
  return;
508
245
  }
509
- let base;
510
- if (effectiveInherit) {
511
- base = { ...(currentEntry.typedQuery ?? currentEntry.query ?? {}) };
512
- }
513
- if (query != null) {
514
- if (base != null)
515
- Object.assign(base, query);
516
- else
517
- base = query;
246
+ const collected = [];
247
+ const filterCollected = [];
248
+ for (const r of routesArr) {
249
+ const maybe = r.query;
250
+ if (maybe != null) {
251
+ collected.push(maybe);
252
+ }
253
+ const maybeF = r
254
+ .filterSchema;
255
+ if (maybeF != null)
256
+ filterCollected.push(maybeF);
518
257
  }
519
- base ??= currentEntry.typedQuery ?? currentEntry.query ?? {};
520
- const targetPath = pathname ?? currentEntry.location.pathname;
521
- const schema = resolveSchema(targetPath);
522
- let buildOpts;
523
- if (filters != null) {
524
- const fs = filterSchema ?? resolveFilterSchema(targetPath);
525
- if (fs != null)
526
- buildOpts = { filters, filterSchema: fs };
258
+ if (collected.length > 0) {
259
+ schema = collected.at(-1);
527
260
  }
528
- const search = buildSearch(base, schema, buildOpts);
529
- let targetPathname = targetPath;
530
- if (targetPathname === '')
531
- targetPathname = '/';
532
- let nextRoute = currentEntry.route;
533
- if (targetPathname !== currentEntry.location.pathname) {
534
- nextRoute = getMatchedRoute(flatRoutes, {
535
- ...window.location,
536
- pathname: targetPathname,
537
- });
261
+ if (filterCollected.length > 0) {
262
+ filterSchema = filterCollected.at(-1);
538
263
  }
539
- const effectiveSchema = schema ?? resolveSchema(targetPathname);
540
- const rawQueryObj = parseRawQuery(search);
541
- const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
542
- const prepared = prepareMatch(nextRoute, typed);
543
- currentEntry = {
544
- forceRerender: false,
545
- location: {
546
- ...currentEntry.location,
547
- pathname: targetPathname,
548
- search,
549
- },
550
- route: nextRoute,
551
- preparedMatch: prepared,
552
- rawSearch: search,
553
- query: rawQueryObj,
554
- typedQuery: typed,
555
- };
556
- let normImmediate = targetPathname;
557
- if (normImmediate === '')
558
- normImmediate = '/';
559
- const locationObj = { pathname: normImmediate, search, hash: '' };
560
- if (replace)
561
- history.set(locationObj);
562
- else
563
- history.push(locationObj);
564
- devtoolsOnNavEvent?.({
565
- kind: 'navigate',
566
- mode: 'immediate',
567
- count: 1,
568
- pathname: normImmediate,
569
- search,
570
- timestamp: Date.now(),
264
+ }
265
+ if (pathname == null || pathname === current.location.pathname) {
266
+ collectSchema(current.route?.route.routes);
267
+ }
268
+ else {
269
+ const destRoute = getMatchedRoute(flatRoutes, {
270
+ ...window.location,
271
+ pathname: targetPathname,
571
272
  });
273
+ collectSchema(destRoute?.route.routes);
572
274
  }
573
- catch {
275
+ const effectiveFilters = navFilters ?? current.filters;
276
+ const search = buildCombinedSearch({
277
+ query,
278
+ querySchema: schema,
279
+ filters: effectiveFilters,
280
+ filterSchema,
281
+ });
282
+ const locationObj = { pathname: targetPathname, search, hash: '' };
283
+ if (replace) {
284
+ history.set(locationObj);
285
+ }
286
+ else {
287
+ history.push(locationObj);
574
288
  }
575
289
  },
576
290
  };
577
- if ((devtoolsGlobal || devtoolsPanel) && typeof window !== 'undefined') {
578
- (async () => {
579
- try {
580
- const mod = await import('./devtools.js');
581
- if (mod != null && typeof mod.initRouterDevtools === 'function') {
582
- devtoolsOnNavEvent = mod.initRouterDevtools({
583
- context,
584
- options: {
585
- global: devtoolsGlobal,
586
- panel: devtoolsPanel,
587
- shortcut: devtoolsShortcut,
588
- },
291
+ if (devtoolsGlobal) {
292
+ try {
293
+ if (typeof window !== 'undefined') {
294
+ window.__PLUMILE_ROUTER__ =
295
+ {
296
+ get: context.get,
297
+ subscribe: context.subscribe,
298
+ };
299
+ }
300
+ }
301
+ catch {
302
+ }
303
+ }
304
+ if (devtoolsPanel) {
305
+ try {
306
+ if (typeof window !== 'undefined' &&
307
+ typeof document !== 'undefined' &&
308
+ document.querySelector('[data-plumile-router-devtools-panel]') == null) {
309
+ const host = document.createElement('div');
310
+ host.setAttribute('data-plumile-router-devtools-panel', '');
311
+ host.style.position = 'fixed';
312
+ host.style.zIndex = '2147483646';
313
+ host.style.bottom = '8px';
314
+ host.style.right = '8px';
315
+ host.style.fontFamily =
316
+ 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';
317
+ host.style.fontSize = '12px';
318
+ host.style.lineHeight = '1.3';
319
+ host.style.color = '#111';
320
+ host.style.background = 'transparent';
321
+ host.style.pointerEvents = 'none';
322
+ const shadow = host.attachShadow({ mode: 'open' });
323
+ const panel = document.createElement('div');
324
+ panel.style.pointerEvents = 'auto';
325
+ panel.style.minWidth = '260px';
326
+ panel.style.maxWidth = '420px';
327
+ panel.style.maxHeight = '50vh';
328
+ panel.style.overflow = 'auto';
329
+ panel.style.background = 'rgba(255,255,255,0.95)';
330
+ panel.style.border = '1px solid #ccc';
331
+ panel.style.borderRadius = '6px';
332
+ panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
333
+ panel.style.padding = '6px 8px 8px';
334
+ panel.style.backdropFilter = 'blur(4px)';
335
+ panel.style.display = 'flex';
336
+ panel.style.flexDirection = 'column';
337
+ panel.style.rowGap = '4px';
338
+ const header = document.createElement('div');
339
+ header.style.display = 'flex';
340
+ header.style.alignItems = 'center';
341
+ header.style.justifyContent = 'space-between';
342
+ header.style.gap = '8px';
343
+ const title = document.createElement('span');
344
+ title.textContent = 'Plumile Router';
345
+ title.style.fontWeight = '600';
346
+ const buttons = document.createElement('div');
347
+ buttons.style.display = 'flex';
348
+ buttons.style.gap = '4px';
349
+ const collapseBtn = document.createElement('button');
350
+ collapseBtn.textContent = '−';
351
+ const closeBtn = document.createElement('button');
352
+ closeBtn.textContent = '×';
353
+ const btns = [collapseBtn, closeBtn];
354
+ for (const b of btns) {
355
+ b.style.cursor = 'pointer';
356
+ b.style.background = '#eee';
357
+ b.style.border = '1px solid #ccc';
358
+ b.style.borderRadius = '4px';
359
+ b.style.fontSize = '11px';
360
+ b.style.lineHeight = '1';
361
+ b.style.padding = '2px 5px';
362
+ }
363
+ header.appendChild(title);
364
+ buttons.appendChild(collapseBtn);
365
+ buttons.appendChild(closeBtn);
366
+ header.appendChild(buttons);
367
+ const pathEl = document.createElement('div');
368
+ pathEl.style.whiteSpace = 'nowrap';
369
+ const varsEl = document.createElement('pre');
370
+ const queryEl = document.createElement('pre');
371
+ const typedEl = document.createElement('pre');
372
+ const filtersEl = document.createElement('pre');
373
+ const filterDiagEl = document.createElement('pre');
374
+ const timelineWrap = document.createElement('div');
375
+ timelineWrap.style.display = 'flex';
376
+ timelineWrap.style.flexDirection = 'column';
377
+ timelineWrap.style.gap = '2px';
378
+ timelineWrap.style.marginTop = '4px';
379
+ const timelineHeader = document.createElement('div');
380
+ timelineHeader.textContent = 'Timeline (query changes)';
381
+ timelineHeader.style.fontWeight = '600';
382
+ timelineHeader.style.fontSize = '11px';
383
+ const timeline = document.createElement('div');
384
+ timeline.style.display = 'flex';
385
+ timeline.style.flexDirection = 'column-reverse';
386
+ timeline.style.maxHeight = '140px';
387
+ timeline.style.overflowY = 'auto';
388
+ timeline.style.border = '1px solid #e2e2e2';
389
+ timeline.style.borderRadius = '4px';
390
+ timeline.style.background = '#fafbfc';
391
+ timeline.style.fontFamily = 'inherit';
392
+ timeline.style.fontSize = '11px';
393
+ timelineWrap.appendChild(timelineHeader);
394
+ timelineWrap.appendChild(timeline);
395
+ const pres = [
396
+ varsEl,
397
+ queryEl,
398
+ typedEl,
399
+ filtersEl,
400
+ filterDiagEl,
401
+ ];
402
+ for (const p of pres) {
403
+ p.style.margin = '0';
404
+ p.style.padding = '4px';
405
+ p.style.background = '#f6f8fa';
406
+ p.style.border = '1px solid #e2e2e2';
407
+ p.style.borderRadius = '4px';
408
+ p.style.overflowX = 'auto';
409
+ p.style.maxHeight = '160px';
410
+ }
411
+ const small = document.createElement('div');
412
+ small.style.fontSize = '10px';
413
+ small.style.opacity = '0.7';
414
+ small.textContent = `Shortcut: ${devtoolsShortcut}`;
415
+ panel.appendChild(header);
416
+ panel.appendChild(pathEl);
417
+ panel.appendChild(varsEl);
418
+ panel.appendChild(queryEl);
419
+ panel.appendChild(typedEl);
420
+ panel.appendChild(timelineWrap);
421
+ panel.appendChild(filtersEl);
422
+ panel.appendChild(filterDiagEl);
423
+ panel.appendChild(small);
424
+ shadow.appendChild(panel);
425
+ document.body.appendChild(host);
426
+ let collapsed = false;
427
+ collapseBtn.addEventListener('click', () => {
428
+ collapsed = !collapsed;
429
+ if (collapsed) {
430
+ panel.style.maxHeight = '24px';
431
+ panel.style.overflow = 'hidden';
432
+ collapseBtn.textContent = '+';
433
+ }
434
+ else {
435
+ panel.style.maxHeight = '50vh';
436
+ panel.style.overflow = 'auto';
437
+ collapseBtn.textContent = '−';
438
+ }
439
+ });
440
+ let unsub;
441
+ closeBtn.addEventListener('click', () => {
442
+ host.remove();
443
+ if (typeof unsub === 'function') {
444
+ unsub();
445
+ }
446
+ });
447
+ let lastQuery;
448
+ let lastSearch;
449
+ function diffQueries(prev, next) {
450
+ const added = [];
451
+ const removed = [];
452
+ const changed = [];
453
+ const unchanged = [];
454
+ const prevKeys = new Set(Object.keys(prev ?? {}));
455
+ const nextKeys = new Set(Object.keys(next));
456
+ nextKeys.forEach((k) => {
457
+ if (!prevKeys.has(k)) {
458
+ added.push(k);
459
+ return;
460
+ }
461
+ let pv;
462
+ if (prev != null) {
463
+ pv = prev[k];
464
+ }
465
+ const nv = next[k];
466
+ let same = false;
467
+ if (Array.isArray(pv) && Array.isArray(nv)) {
468
+ if (pv.length === nv.length) {
469
+ same = pv.every((v, i) => {
470
+ return v === nv[i];
471
+ });
472
+ }
473
+ }
474
+ else {
475
+ same = pv === nv;
476
+ }
477
+ if (same) {
478
+ unchanged.push(k);
479
+ }
480
+ else {
481
+ changed.push(k);
482
+ }
483
+ prevKeys.delete(k);
589
484
  });
485
+ prevKeys.forEach((k) => {
486
+ removed.push(k);
487
+ });
488
+ return { added, removed, changed, unchanged };
590
489
  }
490
+ function render() {
491
+ try {
492
+ const entry = context.get();
493
+ pathEl.textContent = `${entry.location.pathname}${entry.location.search}`;
494
+ const varsJson = JSON.stringify(entry.route?.params ?? {}, null, 2);
495
+ varsEl.textContent = `vars: ${varsJson}`;
496
+ const rawJson = JSON.stringify(entry.query, null, 2);
497
+ queryEl.textContent = `raw: ${rawJson}`;
498
+ const typedJson = JSON.stringify(entry.typedQuery, null, 2);
499
+ typedEl.textContent = `typed:${typedJson}`;
500
+ const filtersJson = JSON.stringify(entry.filters, null, 2);
501
+ filtersEl.textContent = `filters:${filtersJson}`;
502
+ const diag = entry.filterDiagnostics ?? [];
503
+ filterDiagEl.textContent = `filterDiagnostics: ${diag.length}`;
504
+ if (entry.rawSearch !== lastSearch) {
505
+ const nowQuery = entry.query;
506
+ const diff = diffQueries(lastQuery, nowQuery);
507
+ const row = document.createElement('div');
508
+ row.style.display = 'flex';
509
+ row.style.flexDirection = 'column';
510
+ row.style.borderBottom = '1px solid #e9e9e9';
511
+ row.style.padding = '3px 4px';
512
+ const head = document.createElement('div');
513
+ head.style.display = 'flex';
514
+ head.style.justifyContent = 'space-between';
515
+ const ts = new Date().toLocaleTimeString();
516
+ let searchDisplay = '(empty)';
517
+ if (entry.location.search !== '') {
518
+ searchDisplay = entry.location.search;
519
+ }
520
+ head.innerHTML = `<strong>${ts}</strong> <code style="background:#eee;padding:1px 3px;border-radius:3px;">${searchDisplay}</code>`;
521
+ const body = document.createElement('div');
522
+ body.style.display = 'flex';
523
+ body.style.flexWrap = 'wrap';
524
+ body.style.gap = '4px';
525
+ function pill(label, kind) {
526
+ const span = document.createElement('span');
527
+ span.textContent = label;
528
+ span.style.padding = '1px 4px';
529
+ span.style.borderRadius = '10px';
530
+ span.style.fontSize = '10px';
531
+ span.style.border = '1px solid';
532
+ switch (kind) {
533
+ case 'added':
534
+ span.style.background = '#e6ffed';
535
+ span.style.borderColor = '#2cbe4e';
536
+ span.style.color = '#22863a';
537
+ break;
538
+ case 'removed':
539
+ span.style.background = '#ffeef0';
540
+ span.style.borderColor = '#d73a49';
541
+ span.style.color = '#cb2431';
542
+ break;
543
+ case 'changed':
544
+ span.style.background = '#fff5b1';
545
+ span.style.borderColor = '#ffd33d';
546
+ span.style.color = '#735c0f';
547
+ break;
548
+ case 'unchanged':
549
+ span.style.background = '#f1f8ff';
550
+ span.style.borderColor = '#79b8ff';
551
+ span.style.color = '#0366d6';
552
+ break;
553
+ default:
554
+ break;
555
+ }
556
+ return span;
557
+ }
558
+ if (diff.added.length > 0) {
559
+ body.append(...diff.added.map((k) => {
560
+ return pill(`+${k}`, 'added');
561
+ }));
562
+ }
563
+ if (diff.changed.length > 0) {
564
+ body.append(...diff.changed.map((k) => {
565
+ return pill(`~${k}`, 'changed');
566
+ }));
567
+ }
568
+ if (diff.removed.length > 0) {
569
+ body.append(...diff.removed.map((k) => {
570
+ return pill(`-${k}`, 'removed');
571
+ }));
572
+ }
573
+ const noAdds = diff.added.length === 0;
574
+ const noChanges = diff.changed.length === 0;
575
+ const noRemovals = diff.removed.length === 0;
576
+ if (noAdds && noChanges && noRemovals) {
577
+ body.append(pill('no-change', 'unchanged'));
578
+ }
579
+ row.appendChild(head);
580
+ row.appendChild(body);
581
+ timeline.appendChild(row);
582
+ if (timeline.childElementCount > 50) {
583
+ const first = timeline.firstElementChild;
584
+ if (first != null) {
585
+ timeline.removeChild(first);
586
+ }
587
+ }
588
+ lastQuery = nowQuery;
589
+ lastSearch = entry.rawSearch;
590
+ }
591
+ }
592
+ catch {
593
+ }
594
+ }
595
+ render();
596
+ unsub = context.subscribe(() => {
597
+ render();
598
+ });
599
+ window.addEventListener('keydown', (ev) => {
600
+ try {
601
+ const parts = [];
602
+ if (ev.altKey)
603
+ parts.push('Alt');
604
+ if (ev.shiftKey)
605
+ parts.push('Shift');
606
+ if (ev.ctrlKey)
607
+ parts.push('Ctrl');
608
+ let keyPart = ev.key;
609
+ if (ev.key.length === 1) {
610
+ keyPart = ev.key.toUpperCase();
611
+ }
612
+ parts.push(keyPart);
613
+ const combo = parts.join('+');
614
+ if (combo === devtoolsShortcut.replace(/\s+/g, '')) {
615
+ if (host.style.display === 'none') {
616
+ host.style.display = 'block';
617
+ }
618
+ else {
619
+ host.style.display = 'none';
620
+ }
621
+ }
622
+ }
623
+ catch {
624
+ }
625
+ });
591
626
  }
592
- catch {
593
- }
594
- })();
627
+ }
628
+ catch {
629
+ }
595
630
  }
596
631
  return { cleanup, context };
597
632
  }
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFDckQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMs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QkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUdGLElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFFdkUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUdoRSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7d0JBQzFDLE9BQU87d0JBQ1AsT0FBTyxFQUFFOzRCQUNQLE1BQU0sRUFBRSxjQUFjOzRCQUN0QixLQUFLLEVBQUUsYUFBYTs0QkFDcEIsUUFBUSxFQUFFLGdCQUFnQjt5QkFDM0I7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO1lBRVQsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlVHlwZWRRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LWRzbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2ggfSBmcm9tICcuLi90b29scy9idWlsZFNlYXJjaC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlLFxuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55Pjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihcbiAgcm91dGVzOiBSb3V0ZTxhbnksIGFueT5bXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7IGdsb2JhbD86IGJvb2xlYW47IHBhbmVsPzogYm9vbGVhbjsgc2hvcnRjdXQ/OiBzdHJpbmcgfTtcbiAgICAvKiogV2hlbiB0cnVlLCBjb25zZWN1dGl2ZSBuYXZpZ2F0ZSgpIGNhbGxzIGluIHNhbWUgbWljcm90YXNrIGF1dG/igJFjb2FsZXNjZSAodW5sZXNzIGltbWVkaWF0ZTogdHJ1ZSkuICovXG4gICAgYXV0b0JhdGNoPzogYm9vbGVhbjtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvYyk7XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgbW9kZSxcbiAgICAgIGNvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIGJhdGNoTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBBZnRlciByZXNvbHZlRmlsdGVyU2NoZW1hIGlzIGRlZmluZWQgd2UgY2FuIGFwcGx5IGltcGxpY2l0IHNjaGVtYSBmb3IgYW55IHF1ZXVlZCBiYXRjaCAoaWYgc3RpbGwgcGVuZGluZylcbiAgLyoqIEFwcGx5IHByb3Zpc2lvbmFsIG1lcmdlZCBxdWVyeStmaWx0ZXJzIHVwZGF0ZSAoZHVyaW5nIGJhdGNoaW5nKVxuICAgKiB0byBjdXJyZW50RW50cnkgZm9yIHN5bmNocm9ub3VzIHJlYWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYShiYXNlUGF0aCk7XG4gICAgICBjb25zdCBtZXJnZWRRID0gYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/IGxhc3RCYXRjaFF1ZXJ5ID8/IHt9O1xuICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgZmlsdGVyU2NoZW1hOiBiYXRjaGVkRmlsdGVyU2NoZW1hLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHV0aW9uIGZvciBwcm92aXNpb25hbCB2aWV3XG4gICAgICAgIGxldCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByb3V0ZUNoYWluOlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9W11cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LnJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZGVzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBkZXN0Um91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlQ2hhaW4gIT0gbnVsbCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByb3V0ZUNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmcyA9IChcbiAgICAgICAgICAgICAgbm9kZSBhcyB7XG4gICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1lcmdlZCA/Pz0ge307XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBmcy5zY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2VkICE9IG51bGwpIHtcbiAgICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBiYXRjaGVkRmlsdGVycyxcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYTogbWVyZ2VkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcHJvdmlzaW9uYWxTZWFyY2ggPSBidWlsZFNlYXJjaChtZXJnZWRRLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICBjb25zdCBwYXRoQ2hhbmdlZCA9IGJhc2VQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBpZiAocHJvdmlzaW9uYWxTZWFyY2ggIT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2ggfHwgcGF0aENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoc2NoZW1hLCBtZXJnZWRRKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHByb3Zpc2lvbmFsU2VhcmNoKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2VhcmNoOiBwcm92aXNpb25hbFNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhd1NlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF1dG9CYXRjaCA9IG9wdHMuYXV0b0JhdGNoID09PSB0cnVlO1xuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lKTtcbiAgICB9LFxuICAgIGN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHJldHVybjtcbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZChwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiBTdWJzY3JpYmVDYWxsYmFjazxhbnk+KSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlcGxhY2UsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgYmF0Y2gsXG4gICAgICBpbW1lZGlhdGUsXG4gICAgICBpbmhlcml0LFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgIGJhdGNoPzogYm9vbGVhbjtcbiAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG4gICAgICBpbmhlcml0PzogYm9vbGVhbjtcbiAgICB9KTogdm9pZCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJbmhlcml0ID0gaW5oZXJpdCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd2FudHNCYXRjaCA9XG4gICAgICAgICAgYmF0Y2ggPT09IHRydWUgfHxcbiAgICAgICAgICAoYXV0b0JhdGNoICYmIGltbWVkaWF0ZSAhPT0gdHJ1ZSAmJiBiYXRjaCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAod2FudHNCYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG5hdjogUGVuZGluZ05hdiA9IHt9O1xuICAgICAgICAgIGlmIChwYXRobmFtZSAhPT0gdW5kZWZpbmVkKSBuYXYucGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkgbmF2LnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgaWYgKHJlcGxhY2UgIT09IHVuZGVmaW5lZCkgbmF2LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIG5hdi5pbmhlcml0ID0gdHJ1ZTtcbiAgICAgICAgICBwZW5kaW5nTmF2cyA/Pz0gW107XG4gICAgICAgICAgcGVuZGluZ05hdnMucHVzaChuYXYpO1xuICAgICAgICAgIGxldCB0aGlzTW9kZTogJ21hbnVhbCcgfCAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoID09PSB0cnVlKSB0aGlzTW9kZSA9ICdtYW51YWwnO1xuICAgICAgICAgIGVsc2UgdGhpc01vZGUgPSAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoTW9kZSA9PSBudWxsKSBiYXRjaE1vZGUgPSB0aGlzTW9kZTtcbiAgICAgICAgICBlbHNlIGlmIChiYXRjaE1vZGUgIT09IHRoaXNNb2RlKSBiYXRjaE1vZGUgPSAnbWl4ZWQnO1xuICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgY3VycmVudEVudHJ5LnF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4uYmFzZSwgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RCYXRjaFF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhdGNoZWRGaWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkgYmF0Y2hlZEZpbHRlclNjaGVtYSA9IGZpbHRlclNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmbHVzaFNjaGVkdWxlZCkge1xuICAgICAgICAgICAgZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaE5hdmlnYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lKTtcbiAgICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICAgICAgY2IoY3VycmVudEVudHJ5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW1tZWRpYXRlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IGJhc2U6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSB7XG4gICAgICAgICAgYmFzZSA9IHsgLi4uKGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fSkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIE9iamVjdC5hc3NpZ24oYmFzZSwgcXVlcnkpO1xuICAgICAgICAgIGVsc2UgYmFzZSA9IHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgPz89IGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcyA9IGZpbHRlclNjaGVtYSA/PyByZXNvbHZlRmlsdGVyU2NoZW1hKHRhcmdldFBhdGgpO1xuICAgICAgICAgIGlmIChmcyAhPSBudWxsKSBidWlsZE9wdHMgPSB7IGZpbHRlcnMsIGZpbHRlclNjaGVtYTogZnMgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICAgIGxldCB0YXJnZXRQYXRobmFtZSA9IHRhcmdldFBhdGg7XG4gICAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgIT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU2NoZW1hID0gc2NoZW1hID8/IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgICAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoZWZmZWN0aXZlU2NoZW1hLCByYXdRdWVyeU9iaik7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWQpO1xuICAgICAgICBjdXJyZW50RW50cnkgPSB7XG4gICAgICAgICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZWQsXG4gICAgICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgICAgbGV0IG5vcm1JbW1lZGlhdGUgPSB0YXJnZXRQYXRobmFtZTtcbiAgICAgICAgaWYgKG5vcm1JbW1lZGlhdGUgPT09ICcnKSBub3JtSW1tZWRpYXRlID0gJy8nO1xuICAgICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IG5vcm1JbW1lZGlhdGUsIHNlYXJjaCwgaGFzaDogJycgfTtcbiAgICAgICAgaWYgKHJlcGxhY2UpIGhpc3Rvcnkuc2V0KGxvY2F0aW9uT2JqKTtcbiAgICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICBtb2RlOiAnaW1tZWRpYXRlJyxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIER5bmFtaWMgZGV2dG9vbHMgbG9hZCAoZGV2IG9ubHkpIC0gc2VwYXJhdGUgY2h1bmsgZm9yIHRyZWUtc2hha2luZ1xuICBpZiAoKGRldnRvb2xzR2xvYmFsIHx8IGRldnRvb2xzUGFuZWwpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtb2Q6IGFueSA9IGF3YWl0IGltcG9ydCgnLi9kZXZ0b29scy5qcycpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCAmJiB0eXBlb2YgbW9kLmluaXRSb3V0ZXJEZXZ0b29scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljLWVzbGludC9tYXgtbGVuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50ID0gbW9kLmluaXRSb3V0ZXJEZXZ0b29scyh7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBnbG9iYWw6IGRldnRvb2xzR2xvYmFsLFxuICAgICAgICAgICAgICBwYW5lbDogZGV2dG9vbHNQYW5lbCxcbiAgICAgICAgICAgICAgc2hvcnRjdXQ6IGRldnRvb2xzU2hvcnRjdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
633
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sbUJBQW1CLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWtEOUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxZQUFZLENBQ2xDLE1BQXlCLEVBQ3pCLE9BSUksRUFBRTtJQUdOLElBQUksY0FBdUIsQ0FBQztJQUM1QixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDckMsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FDTCxPQUFPLE9BQU8sS0FBSyxXQUFXO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQ3RDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFD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RyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2pDLENBQUM7d0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxLQUFLLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzRCQUNuRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dDQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7NEJBQy9CLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7NEJBQzlCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO29CQUFDLE1BQU0sQ0FBQztvQkFFVCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7UUFFVCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVR5cGVkUXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS1kc2wuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCB7IGJ1aWxkU2VhcmNoIH0gZnJvbSAnLi4vdG9vbHMvYnVpbGRTZWFyY2guanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUZpbHRlcnMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnknO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZSxcbiAgUm91dGVFbnRyeSxcbiAgUm91dGluZ0NvbnRleHRUeXBlLFxuICBTdWJzY3JpYmVDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoXG4gIHJvdXRlczogUm91dGU8YW55LCBhbnk+W10sXG4gIG9wdHM6IHtcbiAgICBkZXZ0b29scz86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgeyBnbG9iYWw/OiBib29sZWFuOyBwYW5lbD86IGJvb2xlYW47IHNob3J0Y3V0Pzogc3RyaW5nIH07XG4gIH0gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybiB7XG4gIC8vIE5vcm1hbGl6ZSBkZXZ0b29scyBvcHRpb25zIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGxldCBkZXZ0b29sc0dsb2JhbDogYm9vbGVhbjtcbiAgbGV0IGRldnRvb2xzUGFuZWwgPSBmYWxzZTtcbiAgbGV0IGRldnRvb2xzU2hvcnRjdXQgPSAnQWx0K1NoaWZ0K1InO1xuICBpZiAodHlwZW9mIG9wdHMuZGV2dG9vbHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYmFzZUVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBvcHRzLmRldnRvb2xzLmdsb2JhbCA/PyBiYXNlRW5hYmxlZDtcbiAgICBkZXZ0b29sc1BhbmVsID0gISFvcHRzLmRldnRvb2xzLnBhbmVsO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBvcHRzLmRldnRvb2xzLnNob3J0Y3V0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgb3B0cy5kZXZ0b29scy5zaG9ydGN1dC50cmltKCkgIT09ICcnXG4gICAgKSB7XG4gICAgICBkZXZ0b29sc1Nob3J0Y3V0ID0gb3B0cy5kZXZ0b29scy5zaG9ydGN1dDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gYm9vbGVhbiBvciB1bmRlZmluZWRcbiAgICBjb25zdCBlbmFibGVkID0gKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gb3B0cy5kZXZ0b29scztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGRldnRvb2xzR2xvYmFsID0gZW5hYmxlZDtcbiAgfVxuICAvLyBJbml0aWFsaXplIGJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VyXG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgQnJvd3Nlckhpc3RvcnkoKTtcblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxSYXdRdWVyeSA9IHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpO1xuICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCByb3V0ZSBmb3IgaW5pdGlhbCBsb2FkXG4gIGxldCBpbml0aWFsU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiByb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgIGlmIChtYXliZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgLy8gRGV0ZXJtaW5lIGZpbHRlciBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlXG4gIGxldCBpbml0aWFsRmlsdGVyU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiByb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IGZpbHRlclNjaGVtYT86IHVua25vd24gfSlcbiAgICAgICAgLmZpbHRlclNjaGVtYTtcbiAgICAgIGlmIChtYXliZSAhPSBudWxsKSBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgfVxuICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkgaW5pdGlhbEZpbHRlclNjaGVtYSA9IGNvbGxlY3RlZC5hdCgtMSk7XG4gIH1cbiAgbGV0IGluaXRpYWxGaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRpYWxGaWx0ZXJEaWFnbm9zdGljczogYW55W10gfCB1bmRlZmluZWQ7XG4gIGlmIChpbml0aWFsRmlsdGVyU2NoZW1hICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsIGluaXRpYWxGaWx0ZXJTY2hlbWEpO1xuICAgIGluaXRpYWxGaWx0ZXJzID0gcGFyc2VkLmZpbHRlcnMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MgPSBwYXJzZWQuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICB9XG4gIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gocm91dGUsIGluaXRpYWxUeXBlZFF1ZXJ5KTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICBmb3JjZVJlcmVuZGVyOiBmYWxzZSxcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICByb3V0ZSxcbiAgICBwcmVwYXJlZE1hdGNoLFxuICAgIHJhd1NlYXJjaDogaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsXG4gICAgcXVlcnk6IGluaXRpYWxSYXdRdWVyeSxcbiAgICB0eXBlZFF1ZXJ5OiBpbml0aWFsVHlwZWRRdWVyeSxcbiAgICBmaWx0ZXJzOiBpbml0aWFsRmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzLFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGxldCBmaWx0ZXJTY2hlbWE6IGFueTtcbiAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbHRlckNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgciBvZiBuZXh0Um91dGUucm91dGUucm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgICAgaWYgKG1heWJlICE9IG51bGwpIHtcbiAgICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF5YmVGOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IGZpbHRlclNjaGVtYT86IHVua25vd24gfSlcbiAgICAgICAgICAuZmlsdGVyU2NoZW1hO1xuICAgICAgICBpZiAobWF5YmVGICE9IG51bGwpIGZpbHRlckNvbGxlY3RlZC5wdXNoKG1heWJlRik7XG4gICAgICB9XG4gICAgICBpZiAoY29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJDb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJTY2hlbWEgPSBmaWx0ZXJDb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgdHlwZWRRdWVyeSA9IHBhcnNlVHlwZWRRdWVyeShzY2hlbWEsIHF1ZXJ5KTtcbiAgICAvLyBQYXJzZSBmaWx0ZXJzIHVzaW5nIGZpbHRlciBzY2hlbWEgaWYgcHJlc2VudFxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyc2VkRiA9IHBhcnNlRmlsdGVycyhsb2NhdGlvbi5zZWFyY2gsIGZpbHRlclNjaGVtYSk7XG4gICAgICBmaWx0ZXJzID0gcGFyc2VkRi5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZEYuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemF0aW9uOiBjbGFtcCBwYWdlID49IDEgaWYgbnVtZXJpYyBwYWdlIHByZXNlbnRcbiAgICBsZXQgbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgIGNvbnN0IHBnID0gKHR5cGVkUXVlcnkgYXMgUmVjb3JkPHN0cmluZywgYW55PikucGFnZTtcbiAgICBpZiAodHlwZW9mIHBnID09PSAnbnVtYmVyJyAmJiBwZyA8IDEpIHtcbiAgICAgIGNvbnN0IGNsb25lID0geyAuLi4odHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSwgcGFnZTogMSB9O1xuICAgICAgdHlwZWRRdWVyeSA9IGNsb25lO1xuICAgICAgbm9ybWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgKHNhbWUgcGF0aG5hbWUpIHdlIHN0aWxsIG5lZWQgdG8gcmUtcnVuIHByZXBhcmVcbiAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gobmV4dFJvdXRlLCB0eXBlZFF1ZXJ5KTtcbiAgICB9IGVsc2UgaWYgKCFzYW1lU2VhcmNoKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeSxcbiAgICAgIHR5cGVkUXVlcnksXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgfTtcblxuICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgIGlmIChub3JtYWxpemVkICYmIHNjaGVtYSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgIHF1ZXJ5OiB0eXBlZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gbG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZW50cnkgYW5kIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnNcbiAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7XG4gICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgIGNhbGxiYWNrKG5leHRFbnRyeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ID0ge1xuICAgIGhpc3RvcnksXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHBhdGhuYW1lKSB7XG4gICAgICAvLyBQcmVsb2FkIGp1c3QgdGhlIGNvbXBvbmVudCBjb2RlIGZvciBhIHJvdXRlIHdpdGhvdXQgc3RvcmluZyB0aGUgcmVzdWx0XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBhbGwgcmVzb3VyY2UgcGFnZXMgZm9yIHRoZSBtYXRjaGVkIHJvdXRlXG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQocGF0aG5hbWUpIHtcbiAgICAgIC8vIFByZWxvYWQgYm90aCB0aGUgY29tcG9uZW50IGNvZGUgYW5kIHByZXBhcmVkIGRhdGEgZm9yIGEgcm91dGVcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBwcmVwYXJlTWF0Y2gobWF0Y2hlcyk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIC8vIEFkZCBhIG5ldyBzdWJzY3JpYmVyIGFuZCByZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIG5leHRJZCArPSAxO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SWQ7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1zdHlsZVxuICAgICAgY29uc3QgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH07XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IG5hdkZpbHRlcnMsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZSA/PyBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgLy8gRGV0ZXJtaW5lIHNjaGVtYSBvZiBkZXN0aW5hdGlvbiAoaWYgc2FtZSBwYXRoIGFuZCB3ZSBoYXZlIHJvdXRlIHdlIGNhbiByZXVzZSwgZWxzZSByZW1hdGNoKVxuICAgICAgbGV0IHNjaGVtYTogYW55O1xuICAgICAgbGV0IGZpbHRlclNjaGVtYTogYW55O1xuICAgICAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgZnJvbSByb3V0ZSBjaGFpbiAqL1xuICAgICAgZnVuY3Rpb24gY29sbGVjdFNjaGVtYShyb3V0ZXNBcnI6IGFueVtdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmIChyb3V0ZXNBcnIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xsZWN0ZWQ6IGFueVtdID0gW107XG4gICAgICAgIGNvbnN0IGZpbHRlckNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIHJvdXRlc0Fycikge1xuICAgICAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29sbGVjdGVkLnB1c2gobWF5YmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtYXliZUY6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgZmlsdGVyU2NoZW1hPzogdW5rbm93biB9KVxuICAgICAgICAgICAgLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICBpZiAobWF5YmVGICE9IG51bGwpIGZpbHRlckNvbGxlY3RlZC5wdXNoKG1heWJlRik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWEgPSBmaWx0ZXJDb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0aG5hbWUgPT0gbnVsbCB8fCBwYXRobmFtZSA9PT0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICBjb2xsZWN0U2NoZW1hKGN1cnJlbnQucm91dGU/LnJvdXRlLnJvdXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXN0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb2xsZWN0U2NoZW1hKGRlc3RSb3V0ZT8ucm91dGUucm91dGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcnMgPSBuYXZGaWx0ZXJzID8/IGN1cnJlbnQuZmlsdGVycztcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgZmlsdGVyczogZWZmZWN0aXZlRmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICBoaXN0b3J5LnNldChsb2NhdGlvbk9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLy8gUmV0dXJuIGJvdGggdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhIGNsZWFudXAgZnVuY3Rpb25cbiAgLy8gRGV2dG9vbHMgZXhwb3N1cmUgKGRldmVsb3BtZW50IG9ubHkpXG4gIGlmIChkZXZ0b29sc0dsb2JhbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgX19QTFVNSUxFX1JPVVRFUl9fPzogYW55IH0pLl9fUExVTUlMRV9ST1VURVJfXyA9XG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0OiBjb250ZXh0LmdldCxcbiAgICAgICAgICAgIHN1YnNjcmliZTogY29udGV4dC5zdWJzY3JpYmUsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuICAvLyBPcHRpb25hbCBpbi1wYWdlIGRldnRvb2xzIHBhbmVsIChsaWdodHdlaWdodCBvdmVybGF5KVxuICBpZiAoZGV2dG9vbHNQYW5lbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWxdJykgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWwnLCAnJyk7XG4gICAgICAgIGhvc3Quc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBob3N0LnN0eWxlLnpJbmRleCA9ICcyMTQ3NDgzNjQ2JztcbiAgICAgICAgaG9zdC5zdHlsZS5ib3R0b20gPSAnOHB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgICAgICBob3N0LnN0eWxlLmZvbnRGYW1pbHkgPVxuICAgICAgICAgICd1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgbW9ub3NwYWNlJztcbiAgICAgICAgaG9zdC5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5saW5lSGVpZ2h0ID0gJzEuMyc7XG4gICAgICAgIGhvc3Quc3R5bGUuY29sb3IgPSAnIzExMSc7XG4gICAgICAgIGhvc3Quc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIGhvc3Quc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBhbmVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm1pbldpZHRoID0gJzI2MHB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4V2lkdGggPSAnNDIwcHgnO1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnNTB2aCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICBwYW5lbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC45NSknO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNjY2MnO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNnB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUuYm94U2hhZG93ID0gJzAgMnB4IDhweCByZ2JhKDAsMCwwLDAuMTUpJztcbiAgICAgICAgcGFuZWwuc3R5bGUucGFkZGluZyA9ICc2cHggOHB4IDhweCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJhY2tkcm9wRmlsdGVyID0gJ2JsdXIoNHB4KSc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgcGFuZWwuc3R5bGUucm93R2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ3NwYWNlLWJldHdlZW4nO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZ2FwID0gJzhweCc7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aXRsZS50ZXh0Q29udGVudCA9ICdQbHVtaWxlIFJvdXRlcic7XG4gICAgICAgIHRpdGxlLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBidXR0b25zLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIGJ1dHRvbnMuc3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNvbGxhcHNlQnRuLnRleHRDb250ZW50ID0gJ+KIkic7XG4gICAgICAgIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNsb3NlQnRuLnRleHRDb250ZW50ID0gJ8OXJztcbiAgICAgICAgY29uc3QgYnRuczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IFtjb2xsYXBzZUJ0biwgY2xvc2VCdG5dO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnRucykge1xuICAgICAgICAgIGIuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgIGIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWVlJztcbiAgICAgICAgICBiLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgICAgICAgYi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICBiLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICAgIGIuc3R5bGUubGluZUhlaWdodCA9ICcxJztcbiAgICAgICAgICBiLnN0eWxlLnBhZGRpbmcgPSAnMnB4IDVweCc7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICAgICAgYnV0dG9ucy5hcHBlbmRDaGlsZChjb2xsYXBzZUJ0bik7XG4gICAgICAgIGJ1dHRvbnMuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYnV0dG9ucyk7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwYXRoRWwuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgICAgICBjb25zdCB2YXJzRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgY29uc3QgcXVlcnlFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCB0eXBlZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCBmaWx0ZXJEaWFnRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgLy8gVGltZWxpbmUgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZVdyYXAuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmdhcCA9ICcycHgnO1xuICAgICAgICB0aW1lbGluZVdyYXAuc3R5bGUubWFyZ2luVG9wID0gJzRweCc7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnRleHRDb250ZW50ID0gJ1RpbWVsaW5lIChxdWVyeSBjaGFuZ2VzKSc7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgICAgICAgdGltZWxpbmVIZWFkZXIuc3R5bGUuZm9udFNpemUgPSAnMTFweCc7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uLXJldmVyc2UnOyAvLyBuZXdlc3Qgb24gdG9wIHZpc3VhbGx5IHdoaWxlIGFwcGVuZGluZyBhdCBlbmQgZm9yIGNoZWFwZXIgb3BzXG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLm1heEhlaWdodCA9ICcxNDBweCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLm92ZXJmbG93WSA9ICdhdXRvJztcbiAgICAgICAgdGltZWxpbmUuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZTJlMmUyJztcbiAgICAgICAgdGltZWxpbmUuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZhZmJmYyc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZvbnRGYW1pbHkgPSAnaW5oZXJpdCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICB0aW1lbGluZVdyYXAuYXBwZW5kQ2hpbGQodGltZWxpbmVIZWFkZXIpO1xuICAgICAgICB0aW1lbGluZVdyYXAuYXBwZW5kQ2hpbGQodGltZWxpbmUpO1xuICAgICAgICBjb25zdCBwcmVzOiBIVE1MUHJlRWxlbWVudFtdID0gW1xuICAgICAgICAgIHZhcnNFbCxcbiAgICAgICAgICBxdWVyeUVsLFxuICAgICAgICAgIHR5cGVkRWwsXG4gICAgICAgICAgZmlsdGVyc0VsLFxuICAgICAgICAgIGZpbHRlckRpYWdFbCxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHByZXMpIHtcbiAgICAgICAgICBwLnN0eWxlLm1hcmdpbiA9ICcwJztcbiAgICAgICAgICBwLnN0eWxlLnBhZGRpbmcgPSAnNHB4JztcbiAgICAgICAgICBwLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y2ZjhmYSc7XG4gICAgICAgICAgcC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNlMmUyZTInO1xuICAgICAgICAgIHAuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gICAgICAgICAgcC5zdHlsZS5vdmVyZmxvd1ggPSAnYXV0byc7XG4gICAgICAgICAgcC5zdHlsZS5tYXhIZWlnaHQgPSAnMTYwcHgnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNtYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNtYWxsLnN0eWxlLmZvbnRTaXplID0gJzEwcHgnO1xuICAgICAgICBzbWFsbC5zdHlsZS5vcGFjaXR5ID0gJzAuNyc7XG4gICAgICAgIHNtYWxsLnRleHRDb250ZW50ID0gYFNob3J0Y3V0OiAke2RldnRvb2xzU2hvcnRjdXR9YDtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQocGF0aEVsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQodmFyc0VsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQocXVlcnlFbCk7XG4gICAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHR5cGVkRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZCh0aW1lbGluZVdyYXApO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJzRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJEaWFnRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChzbWFsbCk7XG4gICAgICAgIHNoYWRvdy5hcHBlbmRDaGlsZChwYW5lbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gICAgICAgIGxldCBjb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgY29sbGFwc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29sbGFwc2VkID0gIWNvbGxhcHNlZDtcbiAgICAgICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnMjRweCc7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAnKyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc1MHZoJztcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAn4oiSJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdW5zdWI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgaG9zdC5yZW1vdmUoKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHVuc3ViID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB1bnN1YigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBVcGRhdGUgcGFuZWwgY29udGVudCBmcm9tIGN1cnJlbnQgcm91dGUgZW50cnkgKi9cbiAgICAgICAgLy8gS2VlcCBsYXN0IHF1ZXJ5IHNuYXBzaG90IGZvciBkaWZmXG4gICAgICAgIGxldCBsYXN0UXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbGFzdFNlYXJjaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcHV0ZSBkaWZmIGNsYXNzaWZpY2F0aW9uIGJldHdlZW4gdHdvIHF1ZXJ5IG9iamVjdHMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkaWZmUXVlcmllcyhcbiAgICAgICAgICBwcmV2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgKToge1xuICAgICAgICAgIGFkZGVkOiBzdHJpbmdbXTtcbiAgICAgICAgICByZW1vdmVkOiBzdHJpbmdbXTtcbiAgICAgICAgICBjaGFuZ2VkOiBzdHJpbmdbXTtcbiAgICAgICAgICB1bmNoYW5nZWQ6IHN0cmluZ1tdO1xuICAgICAgICB9IHtcbiAgICAgICAgICBjb25zdCBhZGRlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgdW5jaGFuZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHByZXZLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhwcmV2ID8/IHt9KSk7XG4gICAgICAgICAgY29uc3QgbmV4dEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG5leHQpKTtcbiAgICAgICAgICBuZXh0S2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByZXZLZXlzLmhhcyhrKSkge1xuICAgICAgICAgICAgICBhZGRlZC5wdXNoKGspO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcHY6IHVua25vd247XG4gICAgICAgICAgICBpZiAocHJldiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIHByZXYgaXMgYSBwbGFpbiByZWNvcmQ7IGRpcmVjdCBpbmRleCAocnVudGltZSBzYWZlKVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgIHB2ID0gKHByZXYgYXMgYW55KVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG52ID0gbmV4dFtrXTtcbiAgICAgICAgICAgIGxldCBzYW1lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwdikgJiYgQXJyYXkuaXNBcnJheShudikpIHtcbiAgICAgICAgICAgICAgaWYgKHB2Lmxlbmd0aCA9PT0gKG52IGFzIHVua25vd25bXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2FtZSA9IHB2LmV2ZXJ5KCh2LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdiA9PT0gKG52IGFzIHVua25vd25bXSlbaV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNhbWUgPSBwdiA9PT0gbnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2FtZSkge1xuICAgICAgICAgICAgICB1bmNoYW5nZWQucHVzaChrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNoYW5nZWQucHVzaChrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZLZXlzLmRlbGV0ZShrKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcmV2S2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICByZW1vdmVkLnB1c2goayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgYWRkZWQsIHJlbW92ZWQsIGNoYW5nZWQsIHVuY2hhbmdlZCB9O1xuICAgICAgICB9XG4gICAgICAgIC8qKiBVcGRhdGUgcGFuZWwgY29udGVudCBhbmQgbWF5YmUgcHVzaCB0aW1lbGluZSBlbnRyeSAqL1xuICAgICAgICBmdW5jdGlvbiByZW5kZXIoKTogdm9pZCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY29udGV4dC5nZXQoKTtcbiAgICAgICAgICAgIHBhdGhFbC50ZXh0Q29udGVudCA9IGAke2VudHJ5LmxvY2F0aW9uLnBhdGhuYW1lfSR7ZW50cnkubG9jYXRpb24uc2VhcmNofWA7XG4gICAgICAgICAgICBjb25zdCB2YXJzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5LnJvdXRlPy5wYXJhbXMgPz8ge30sIG51bGwsIDIpO1xuICAgICAgICAgICAgdmFyc0VsLnRleHRDb250ZW50ID0gYHZhcnM6ICR7dmFyc0pzb259YDtcbiAgICAgICAgICAgIGNvbnN0IHJhd0pzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeS5xdWVyeSwgbnVsbCwgMik7XG4gICAgICAgICAgICBxdWVyeUVsLnRleHRDb250ZW50ID0gYHJhdzogICR7cmF3SnNvbn1gO1xuICAgICAgICAgICAgY29uc3QgdHlwZWRKc29uID0gSlNPTi5zdHJpbmdpZnkoZW50cnkudHlwZWRRdWVyeSwgbnVsbCwgMik7XG4gICAgICAgICAgICB0eXBlZEVsLnRleHRDb250ZW50ID0gYHR5cGVkOiR7dHlwZWRKc29ufWA7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5LmZpbHRlcnMsIG51bGwsIDIpO1xuICAgICAgICAgICAgZmlsdGVyc0VsLnRleHRDb250ZW50ID0gYGZpbHRlcnM6JHtmaWx0ZXJzSnNvbn1gO1xuICAgICAgICAgICAgY29uc3QgZGlhZyA9IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzID8/IFtdO1xuICAgICAgICAgICAgZmlsdGVyRGlhZ0VsLnRleHRDb250ZW50ID0gYGZpbHRlckRpYWdub3N0aWNzOiAke2RpYWcubGVuZ3RofWA7XG4gICAgICAgICAgICAvLyBUaW1lbGluZSBsb2cgaWYgcXVlcnkgc2VhcmNoIGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChlbnRyeS5yYXdTZWFyY2ggIT09IGxhc3RTZWFyY2gpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm93UXVlcnkgPSBlbnRyeS5xdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZRdWVyaWVzKGxhc3RRdWVyeSwgbm93UXVlcnkpO1xuICAgICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkICNlOWU5ZTknO1xuICAgICAgICAgICAgICByb3cuc3R5bGUucGFkZGluZyA9ICczcHggNHB4JztcbiAgICAgICAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBoZWFkLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIGhlYWQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnc3BhY2UtYmV0d2Vlbic7XG4gICAgICAgICAgICAgIGNvbnN0IHRzID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgbGV0IHNlYXJjaERpc3BsYXkgPSAnKGVtcHR5KSc7XG4gICAgICAgICAgICAgIGlmIChlbnRyeS5sb2NhdGlvbi5zZWFyY2ggIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoRGlzcGxheSA9IGVudHJ5LmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGA8c3Ryb25nPiR7dHN9PC9zdHJvbmc+IDxjb2RlIHN0eWxlPVwiYmFja2dyb3VuZDojZWVlO3BhZGRpbmc6MXB4IDNweDtib3JkZXItcmFkaXVzOjNweDtcIj4ke3NlYXJjaERpc3BsYXl9PC9jb2RlPmA7XG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgYm9keS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmZsZXhXcmFwID0gJ3dyYXAnO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmdhcCA9ICc0cHgnO1xuICAgICAgICAgICAgICAvKiogQ3JlYXRlIGEgY29sb3JlZCBwaWxsIGVsZW1lbnQgKi9cbiAgICAgICAgICAgICAgZnVuY3Rpb24gcGlsbChcbiAgICAgICAgICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGtpbmQ6ICdhZGRlZCcgfCAncmVtb3ZlZCcgfCAnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyxcbiAgICAgICAgICAgICAgKTogSFRNTFNwYW5FbGVtZW50IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLnBhZGRpbmcgPSAnMXB4IDRweCc7XG4gICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMTBweCc7XG4gICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICcxMHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQnO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJhY2tncm91bmQgPSAnI2U2ZmZlZCc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnIzJjYmU0ZSc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnIzIyODYzYSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAncmVtb3ZlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZlZWYwJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZDczYTQ5JztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjY2IyNDMxJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlICdjaGFuZ2VkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmY1YjEnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZmQzM2QnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyM3MzVjMGYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VuY2hhbmdlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZjFmOGZmJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjNzliOGZmJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMDM2NmQ2JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZXhoYXVzdGl2ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3BhbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGlmZi5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLmFkZGVkLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGlsbChgKyR7a31gLCAnYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRpZmYuY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLmNoYW5nZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGB+JHtrfWAsICdjaGFuZ2VkJyk7XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkaWZmLnJlbW92ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgLi4uZGlmZi5yZW1vdmVkLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGlsbChgLSR7a31gLCAncmVtb3ZlZCcpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBub0FkZHMgPSBkaWZmLmFkZGVkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgY29uc3Qgbm9DaGFuZ2VzID0gZGlmZi5jaGFuZ2VkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgY29uc3Qgbm9SZW1vdmFscyA9IGRpZmYucmVtb3ZlZC5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgIGlmIChub0FkZHMgJiYgbm9DaGFuZ2VzICYmIG5vUmVtb3ZhbHMpIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChwaWxsKCduby1jaGFuZ2UnLCAndW5jaGFuZ2VkJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKTtcbiAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGJvZHkpO1xuICAgICAgICAgICAgICB0aW1lbGluZS5hcHBlbmRDaGlsZChyb3cpO1xuICAgICAgICAgICAgICBpZiAodGltZWxpbmUuY2hpbGRFbGVtZW50Q291bnQgPiA1MCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gdGltZWxpbmUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRpbWVsaW5lLnJlbW92ZUNoaWxkKGZpcnN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFF1ZXJ5ID0gbm93UXVlcnk7XG4gICAgICAgICAgICAgIGxhc3RTZWFyY2ggPSBlbnRyeS5yYXdTZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCk7XG4gICAgICAgIHVuc3ViID0gY29udGV4dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXYpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBpZiAoZXYuYWx0S2V5KSBwYXJ0cy5wdXNoKCdBbHQnKTtcbiAgICAgICAgICAgIGlmIChldi5zaGlmdEtleSkgcGFydHMucHVzaCgnU2hpZnQnKTtcbiAgICAgICAgICAgIGlmIChldi5jdHJsS2V5KSBwYXJ0cy5wdXNoKCdDdHJsJyk7XG4gICAgICAgICAgICBsZXQga2V5UGFydCA9IGV2LmtleTtcbiAgICAgICAgICAgIGlmIChldi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIGtleVBhcnQgPSBldi5rZXkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzLnB1c2goa2V5UGFydCk7XG4gICAgICAgICAgICBjb25zdCBjb21ibyA9IHBhcnRzLmpvaW4oJysnKTtcbiAgICAgICAgICAgIGlmIChjb21ibyA9PT0gZGV2dG9vbHNTaG9ydGN1dC5yZXBsYWNlKC9cXHMrL2csICcnKSkge1xuICAgICAgICAgICAgICBpZiAoaG9zdC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBob3N0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhvc3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogaWdub3JlICovXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjbGVhbnVwLCBjb250ZXh0IH07XG59XG4iXX0=