@plumile/router 0.2.3 → 0.2.6

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 (79) hide show
  1. package/README.md +2 -1
  2. package/lib/esm/builder.d.ts +1 -0
  3. package/lib/esm/builder.d.ts.map +1 -1
  4. package/lib/esm/builder.js +27 -4
  5. package/lib/esm/errors/HttpRedirect.d.ts +3 -2
  6. package/lib/esm/errors/HttpRedirect.d.ts.map +1 -1
  7. package/lib/esm/errors/HttpRedirect.js +1 -1
  8. package/lib/esm/history/BrowserHistory.d.ts +4 -1
  9. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  10. package/lib/esm/history/BrowserHistory.js +52 -2
  11. package/lib/esm/history/types.d.ts +6 -0
  12. package/lib/esm/history/types.d.ts.map +1 -1
  13. package/lib/esm/history/types.js +1 -1
  14. package/lib/esm/instrumentation/Instrumentation.d.ts +8 -10
  15. package/lib/esm/instrumentation/Instrumentation.d.ts.map +1 -1
  16. package/lib/esm/instrumentation/Instrumentation.js +1 -1
  17. package/lib/esm/instrumentation/adapters/devtoolsBridge.d.ts +1 -0
  18. package/lib/esm/instrumentation/adapters/devtoolsBridge.d.ts.map +1 -1
  19. package/lib/esm/instrumentation/adapters/devtoolsBridge.js +18 -7
  20. package/lib/esm/routing/Link.d.ts.map +1 -1
  21. package/lib/esm/routing/Link.js +24 -10
  22. package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
  23. package/lib/esm/routing/RouteComponentWrapper.js +26 -50
  24. package/lib/esm/routing/RouterRenderer.d.ts +5 -2
  25. package/lib/esm/routing/RouterRenderer.d.ts.map +1 -1
  26. package/lib/esm/routing/RouterRenderer.js +8 -2
  27. package/lib/esm/routing/createRouter.d.ts +2 -1
  28. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  29. package/lib/esm/routing/createRouter.js +192 -16
  30. package/lib/esm/routing/createStaticRouter.d.ts +16 -2
  31. package/lib/esm/routing/createStaticRouter.d.ts.map +1 -1
  32. package/lib/esm/routing/createStaticRouter.js +46 -10
  33. package/lib/esm/routing/index.d.ts +3 -3
  34. package/lib/esm/routing/index.d.ts.map +1 -1
  35. package/lib/esm/routing/index.js +3 -3
  36. package/lib/esm/routing/routerHydration.d.ts +5 -0
  37. package/lib/esm/routing/routerHydration.d.ts.map +1 -0
  38. package/lib/esm/routing/routerHydration.js +57 -0
  39. package/lib/esm/tools.d.ts +6 -2
  40. package/lib/esm/tools.d.ts.map +1 -1
  41. package/lib/esm/tools.js +56 -5
  42. package/lib/esm/types.d.ts +42 -11
  43. package/lib/esm/types.d.ts.map +1 -1
  44. package/lib/esm/types.js +1 -1
  45. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  46. package/lib/types/builder.d.ts +1 -0
  47. package/lib/types/builder.d.ts.map +1 -1
  48. package/lib/types/errors/HttpRedirect.d.ts +3 -2
  49. package/lib/types/errors/HttpRedirect.d.ts.map +1 -1
  50. package/lib/types/history/BrowserHistory.d.ts +4 -1
  51. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  52. package/lib/types/history/types.d.ts +6 -0
  53. package/lib/types/history/types.d.ts.map +1 -1
  54. package/lib/types/instrumentation/Instrumentation.d.ts +8 -10
  55. package/lib/types/instrumentation/Instrumentation.d.ts.map +1 -1
  56. package/lib/types/instrumentation/adapters/devtoolsBridge.d.ts +1 -0
  57. package/lib/types/instrumentation/adapters/devtoolsBridge.d.ts.map +1 -1
  58. package/lib/types/routing/Link.d.ts.map +1 -1
  59. package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
  60. package/lib/types/routing/RouterRenderer.d.ts +5 -2
  61. package/lib/types/routing/RouterRenderer.d.ts.map +1 -1
  62. package/lib/types/routing/createRouter.d.ts +2 -1
  63. package/lib/types/routing/createRouter.d.ts.map +1 -1
  64. package/lib/types/routing/createStaticRouter.d.ts +16 -2
  65. package/lib/types/routing/createStaticRouter.d.ts.map +1 -1
  66. package/lib/types/routing/index.d.ts +3 -3
  67. package/lib/types/routing/index.d.ts.map +1 -1
  68. package/lib/types/routing/routerHydration.d.ts +5 -0
  69. package/lib/types/routing/routerHydration.d.ts.map +1 -0
  70. package/lib/types/tools.d.ts +6 -2
  71. package/lib/types/tools.d.ts.map +1 -1
  72. package/lib/types/types.d.ts +42 -11
  73. package/lib/types/types.d.ts.map +1 -1
  74. package/package.json +3 -3
  75. package/lib/esm/routing/RouteComponent.d.ts +0 -8
  76. package/lib/esm/routing/RouteComponent.d.ts.map +0 -1
  77. package/lib/esm/routing/RouteComponent.js +0 -20
  78. package/lib/types/routing/RouteComponent.d.ts +0 -8
  79. package/lib/types/routing/RouteComponent.d.ts.map +0 -1
@@ -6,7 +6,9 @@ import { createInstrumentationRegistry, } from '../instrumentation/Instrumentati
6
6
  import { isRouterNavigationSource, } from '../values.js';
7
7
  import { buildDestinationSearch, resolveRouterDestination, } from './destination.js';
8
8
  import { calculateLoadState } from '../internal/routerLoadState.js';
9
+ import { HttpRedirect } from '../errors/index.js';
9
10
  import { parseSearchState, } from '../internal/routerSearchState.js';
11
+ import { assertRouterJsonValue } from './routerHydration.js';
10
12
  function shouldPrepareOnNavigation(input) {
11
13
  if (!input.samePathname) {
12
14
  return true;
@@ -115,6 +117,9 @@ export default function createRouter(routes, options = {}) {
115
117
  function readActiveQuerySchema(route) {
116
118
  return route?.route.routes.at(-1)?.querySchema;
117
119
  }
120
+ function readRenderStatus(route) {
121
+ return route?.route.routes.at(-1)?.status ?? 200;
122
+ }
118
123
  function readPageValue(filters) {
119
124
  if (filters == null) {
120
125
  return undefined;
@@ -173,7 +178,11 @@ export default function createRouter(routes, options = {}) {
173
178
  segmentIndex: segment.segmentIndex,
174
179
  routeNode: segment.routeNode,
175
180
  preparedResource: segment.preparedResource,
181
+ preparedHydration: segment.preparedHydration,
182
+ render: segment.render,
176
183
  redirectTo: segment.redirectTo,
184
+ redirectStatus: segment.redirectStatus,
185
+ resourcePage: segment.resourcePage,
177
186
  suspenseBoundary: segment.suspenseBoundary,
178
187
  fallback: segment.fallback,
179
188
  highlightId: segment.highlightId,
@@ -183,7 +192,10 @@ export default function createRouter(routes, options = {}) {
183
192
  });
184
193
  return {
185
194
  location: normalizeLocation(entry.location),
195
+ rawSearch: entry.rawSearch,
186
196
  routePath: readMatchedRoutePath(entry),
197
+ params: entry.route?.params,
198
+ query: entry.query,
187
199
  preparedMatch: {
188
200
  segments: preparedSegments,
189
201
  },
@@ -192,6 +204,8 @@ export default function createRouter(routes, options = {}) {
192
204
  filters: entry.filters,
193
205
  filterDiagnostics: entry.filterDiagnostics,
194
206
  activeQuerySchema: entry.activeQuerySchema,
207
+ forceRerender: entry.forceRerender,
208
+ status: entry.status,
195
209
  };
196
210
  }
197
211
  function notifyEntry(entry) {
@@ -265,6 +279,48 @@ export default function createRouter(routes, options = {}) {
265
279
  details,
266
280
  });
267
281
  }
282
+ const flatRoutes = buildRoutes(routes);
283
+ function buildRedirectSearch(input) {
284
+ const destinationRoute = getMatchedRoute(flatRoutes, {
285
+ ...history.location,
286
+ pathname: input.pathname,
287
+ });
288
+ return buildDestinationSearch({
289
+ filters: input.filters,
290
+ query: input.query,
291
+ querySchema: readActiveQuerySchema(destinationRoute),
292
+ });
293
+ }
294
+ function replaceWithRedirect(redirectTo, status, source) {
295
+ const currentLocation = normalizeLocation(history.location);
296
+ const currentHref = `http://plumile.local${currentLocation.pathname}${currentLocation.search}${currentLocation.hash}`;
297
+ const destination = resolveRouterDestination({
298
+ destination: redirectTo,
299
+ currentHref,
300
+ buildSearch: buildRedirectSearch,
301
+ });
302
+ const target = {
303
+ pathname: destination.pathname,
304
+ search: destination.search,
305
+ hash: destination.hash,
306
+ };
307
+ const currentTarget = `${currentLocation.pathname}${currentLocation.search}${currentLocation.hash}`;
308
+ const nextTarget = `${target.pathname}${target.search}${target.hash}`;
309
+ if (currentTarget === nextTarget) {
310
+ throw new Error(`Router redirect loop: ${nextTarget}`);
311
+ }
312
+ emitHistoryEvent('replace', source, target, {
313
+ trigger: 'redirect',
314
+ redirectStatus: status,
315
+ });
316
+ history.set({
317
+ ...target,
318
+ debugContext: {
319
+ origin: source,
320
+ trigger: 'redirect',
321
+ },
322
+ });
323
+ }
268
324
  function loadPreparedMatchResources(preparedMatchToLoad) {
269
325
  preparedMatchToLoad.segments.forEach((route) => {
270
326
  if (route.preparedResource != null) {
@@ -287,12 +343,55 @@ export default function createRouter(routes, options = {}) {
287
343
  }
288
344
  return cached.preparedMatch;
289
345
  }
290
- const flatRoutes = buildRoutes(routes);
291
- const route = getMatchedRoute(flatRoutes, history.location);
346
+ const matchedInitialRoute = getMatchedRoute(flatRoutes, history.location);
347
+ const initialDeclarativeRedirect = matchedInitialRoute?.route.redirectTo;
348
+ const initialDeclarativeRedirectStatus = matchedInitialRoute?.route.redirectStatus ?? 302;
349
+ if (initialDeclarativeRedirect != null) {
350
+ replaceWithRedirect(initialDeclarativeRedirect, initialDeclarativeRedirectStatus, 'external');
351
+ }
352
+ let route = matchedInitialRoute;
353
+ if (initialDeclarativeRedirect != null) {
354
+ route = null;
355
+ }
292
356
  const initialUnifiedSchema = readActiveQuerySchema(route);
293
357
  const initialSearchState = parseSearchState(history.location.search, initialUnifiedSchema);
294
358
  const normalizedInitialFilters = normalizePageFilters(initialSearchState.filters);
295
359
  const initialLocationSnapshot = normalizeLocation(history.location);
360
+ let hydrationValues;
361
+ if (options.hydrationSnapshot != null) {
362
+ const snapshot = options.hydrationSnapshot;
363
+ const snapshotVersion = snapshot.version;
364
+ const snapshotSegments = snapshot.segments;
365
+ if (snapshotVersion !== 1 || !Array.isArray(snapshotSegments)) {
366
+ throw new Error('Router hydration snapshot is malformed');
367
+ }
368
+ const snapshotLocation = normalizeLocation(snapshot.location);
369
+ if (snapshotLocation.pathname !== initialLocationSnapshot.pathname ||
370
+ snapshotLocation.search !== initialLocationSnapshot.search ||
371
+ snapshotLocation.hash !== initialLocationSnapshot.hash) {
372
+ throw new Error('Router hydration location does not match the initial location');
373
+ }
374
+ const values = new Map();
375
+ hydrationValues = values;
376
+ const segments = snapshotSegments;
377
+ segments.forEach((segment) => {
378
+ if (typeof segment !== 'object' ||
379
+ segment == null ||
380
+ !('prepared' in segment)) {
381
+ throw new Error('Router hydration snapshot is malformed');
382
+ }
383
+ const segmentRecord = segment;
384
+ const segmentKey = segmentRecord.key;
385
+ if (typeof segmentKey !== 'string' || segmentKey === '') {
386
+ throw new Error('Router hydration snapshot is malformed');
387
+ }
388
+ if (values.has(segmentKey)) {
389
+ throw new Error(`Duplicate router hydration segment: ${segmentKey}`);
390
+ }
391
+ assertRouterJsonValue(segmentRecord.prepared);
392
+ values.set(segmentKey, segmentRecord.prepared);
393
+ });
394
+ }
296
395
  let initialInstrumentation;
297
396
  if (route != null) {
298
397
  initialInstrumentation = {
@@ -304,13 +403,55 @@ export default function createRouter(routes, options = {}) {
304
403
  };
305
404
  }
306
405
  const initialContext = resolveContext();
307
- const preparedMatch = prepareMatch(route, buildPrepareQueryInput({
308
- ...initialSearchState,
309
- filters: normalizedInitialFilters.filters,
310
- }), initialInstrumentation, initialContext, undefined, {
311
- rawQuery: initialSearchState.query,
312
- filters: normalizedInitialFilters.filters,
406
+ const hydrationConsumed = new Set();
407
+ let hydration;
408
+ if (hydrationValues != null) {
409
+ hydration = { values: hydrationValues, consumed: hydrationConsumed };
410
+ }
411
+ let preparedMatch;
412
+ try {
413
+ preparedMatch = prepareMatch(route, buildPrepareQueryInput({
414
+ ...initialSearchState,
415
+ filters: normalizedInitialFilters.filters,
416
+ }), initialInstrumentation, initialContext, undefined, {
417
+ rawQuery: initialSearchState.query,
418
+ filters: normalizedInitialFilters.filters,
419
+ }, hydration);
420
+ }
421
+ catch (error) {
422
+ if (!(error instanceof HttpRedirect)) {
423
+ throw error;
424
+ }
425
+ replaceWithRedirect(error.redirectTo, error.statusCode, 'external');
426
+ preparedMatch = prepareMatch(null);
427
+ }
428
+ if (hydrationValues != null) {
429
+ hydrationValues.forEach((_value, key) => {
430
+ const matchingSegments = preparedMatch.segments.filter((segment) => {
431
+ return segment.segmentKey === key;
432
+ });
433
+ if (matchingSegments.length === 0) {
434
+ throw new Error(`Unknown router hydration segment: ${key}`);
435
+ }
436
+ if (matchingSegments.length !== 1) {
437
+ throw new Error(`Ambiguous router hydration segment: ${key}`);
438
+ }
439
+ if (!hydrationConsumed.has(key)) {
440
+ throw new Error(`Router hydration segment was not consumed: ${key}`);
441
+ }
442
+ });
443
+ }
444
+ const initialPrepareRedirect = preparedMatch.segments
445
+ .map((segment) => {
446
+ return segment.preparedResource?.getError();
447
+ })
448
+ .find((error) => {
449
+ return error instanceof HttpRedirect;
313
450
  });
451
+ if (initialPrepareRedirect != null) {
452
+ replaceWithRedirect(initialPrepareRedirect.redirectTo, initialPrepareRedirect.statusCode, 'external');
453
+ preparedMatch = prepareMatch(null);
454
+ }
314
455
  let nextId = 0;
315
456
  const subscribers = new Map();
316
457
  let currentEntry = withLoadState({
@@ -324,6 +465,8 @@ export default function createRouter(routes, options = {}) {
324
465
  filters: normalizedInitialFilters.filters,
325
466
  filterDiagnostics: initialSearchState.filterDiagnostics,
326
467
  activeQuerySchema: initialUnifiedSchema,
468
+ status: readRenderStatus(route),
469
+ navigation: history.navigation,
327
470
  });
328
471
  if (normalizedInitialFilters.normalized &&
329
472
  initialUnifiedSchema != null &&
@@ -399,7 +542,11 @@ export default function createRouter(routes, options = {}) {
399
542
  if (segment.preparedResource?.getStatus() === 'pending') {
400
543
  segment.preparedResource.load().then(() => {
401
544
  refreshActiveLoadState(entryId, source);
402
- }, () => {
545
+ }, (error) => {
546
+ if (error instanceof HttpRedirect) {
547
+ replaceWithRedirect(error.redirectTo, error.statusCode, source);
548
+ return;
549
+ }
403
550
  refreshActiveLoadState(entryId, source);
404
551
  });
405
552
  }
@@ -475,6 +622,11 @@ export default function createRouter(routes, options = {}) {
475
622
  if (!samePathname) {
476
623
  nextRoute = getMatchedRoute(flatRoutes, location);
477
624
  }
625
+ const declarativeRedirect = nextRoute?.route.redirectTo;
626
+ if (declarativeRedirect != null) {
627
+ replaceWithRedirect(declarativeRedirect, nextRoute?.route.redirectStatus ?? 302, origin);
628
+ return;
629
+ }
478
630
  const querySchema = readActiveQuerySchema(nextRoute);
479
631
  const parsedSearchState = parseSearchState(location.search, querySchema);
480
632
  const normalizedFilters = normalizePageFilters(parsedSearchState.filters);
@@ -513,13 +665,33 @@ export default function createRouter(routes, options = {}) {
513
665
  sameSearch,
514
666
  };
515
667
  }
516
- nextPreparedMatch = prepareMatch(nextRoute, buildPrepareQueryInput({
517
- ...parsedSearchState,
518
- filters: normalizedFilters.filters,
519
- }), updateInstrumentation, nextContext, reusePreparedSegments, {
520
- rawQuery: parsedSearchState.query,
521
- filters: normalizedFilters.filters,
668
+ try {
669
+ nextPreparedMatch = prepareMatch(nextRoute, buildPrepareQueryInput({
670
+ ...parsedSearchState,
671
+ filters: normalizedFilters.filters,
672
+ }), updateInstrumentation, nextContext, reusePreparedSegments, {
673
+ rawQuery: parsedSearchState.query,
674
+ filters: normalizedFilters.filters,
675
+ });
676
+ }
677
+ catch (error) {
678
+ if (!(error instanceof HttpRedirect)) {
679
+ throw error;
680
+ }
681
+ replaceWithRedirect(error.redirectTo, error.statusCode, origin);
682
+ return;
683
+ }
684
+ const prepareRedirect = nextPreparedMatch.segments
685
+ .map((segment) => {
686
+ return segment.preparedResource?.getError();
687
+ })
688
+ .find((error) => {
689
+ return error instanceof HttpRedirect;
522
690
  });
691
+ if (prepareRedirect != null) {
692
+ replaceWithRedirect(prepareRedirect.redirectTo, prepareRedirect.statusCode, origin);
693
+ return;
694
+ }
523
695
  }
524
696
  }
525
697
  loadStateVersion += 1;
@@ -534,6 +706,8 @@ export default function createRouter(routes, options = {}) {
534
706
  filters: normalizedFilters.filters,
535
707
  filterDiagnostics: parsedSearchState.filterDiagnostics,
536
708
  activeQuerySchema: querySchema,
709
+ status: readRenderStatus(nextRoute),
710
+ navigation: history.navigation,
537
711
  });
538
712
  if (normalizedFilters.normalized && querySchema != null) {
539
713
  const normalizedSearch = buildCombinedSearch({
@@ -618,7 +792,9 @@ export default function createRouter(routes, options = {}) {
618
792
  segmentIndex: preparedRoute.segmentIndex,
619
793
  routeNode: preparedRoute.routeNode,
620
794
  preparedResource: preparedRoute.preparedResource,
795
+ preparedHydration: preparedRoute.preparedHydration,
621
796
  redirectTo: preparedRoute.redirectTo,
797
+ redirectStatus: preparedRoute.redirectStatus,
622
798
  resourcePage: preparedRoute.resourcePage,
623
799
  suspenseBoundary: preparedRoute.suspenseBoundary,
624
800
  fallback: preparedRoute.fallback,
@@ -790,4 +966,4 @@ export default function createRouter(routes, options = {}) {
790
966
  }
791
967
  return { context, cleanup };
792
968
  }
793
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sbUJBQW1CLE1BQU0saUNBQWlDLENBQUM7QUFpQmxFLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUNMLGdCQUFnQixHQUdqQixNQUFNLGtDQUFrQyxDQUFDO0FBb0IxQyxTQUFTLHlCQUF5QixDQUFDLEtBSWxDO0lBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQztJ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QUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgYnVpbGRDb21iaW5lZFNlYXJjaCBmcm9tICcuLi90b29scy9idWlsZENvbWJpbmVkU2VhcmNoLmpzJztcbmltcG9ydCB0eXBlIHsgUGFyYW1EYXRhIH0gZnJvbSAncGF0aC10by1yZWdleHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBSb3V0ZUVudHJ5LFxuICB0eXBlIFJvdXRpbmdDb250ZXh0VHlwZSxcbiAgdHlwZSBTdWJzY3JpYmVDYWxsYmFjayxcbiAgdHlwZSBSb3V0ZU5vZGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG4gIHR5cGUgUHJlbG9hZFRhcmdldCxcbiAgdHlwZSBQcmVwYXJlZFJvdXRlU2VnbWVudFNuYXBzaG90LFxuICB0eXBlIFJhd1F1ZXJ5LFxuICB0eXBlIFJvdXRlck1hdGNoZWRSb3V0ZSxcbiAgdHlwZSBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gIHR5cGUgVW5rbm93bkZpbHRlcnMsXG4gIHR5cGUgVW5rbm93blF1ZXJ5U2hhcGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LFxuICB0eXBlIEluc3RydW1lbnRhdGlvbkFQSSxcbiAgdHlwZSBSb3V0ZXJFbnRyeVNuYXBzaG90LFxuICB0eXBlIFJvdXRlckxvY2F0aW9uU25hcHNob3QsXG4gIHR5cGUgUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJFdmVudCxcbn0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL0luc3RydW1lbnRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJIaXN0b3J5QWN0aW9uVmFsdWUsXG4gIHR5cGUgUm91dGVyUHJlbG9hZE1vZGVWYWx1ZSxcbn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGVzdGluYXRpb25TZWFyY2gsXG4gIHJlc29sdmVSb3V0ZXJEZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9kZXN0aW5hdGlvbi5qcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVMb2FkU3RhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9yb3V0ZXJMb2FkU3RhdGUuanMnO1xuaW1wb3J0IHtcbiAgcGFyc2VTZWFyY2hTdGF0ZSxcbiAgdHlwZSBQYXJzZWRTZWFyY2hTdGF0ZSxcbiAgdHlwZSBSb3V0ZXJRdWVyeVNjaGVtYSxcbn0gZnJvbSAnLi4vaW50ZXJuYWwvcm91dGVyU2VhcmNoU3RhdGUuanMnO1xuXG50eXBlIFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gUm91dGVFbnRyeTxcbiAgUGFyYW1EYXRhLFxuICBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgVENvbnRleHRcbj47XG50eXBlIFByZXBhcmVRdWVyeUlucHV0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG50eXBlIFByZWxvYWRlZFByZXBhcmVkTWF0Y2g8VENvbnRleHQ+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgY29udGV4dDogVENvbnRleHQ7XG4gIHJvdXRlOiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGw7XG4gIHByZXBhcmVkTWF0Y2g6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ107XG4gIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgc2VhcmNoOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJvdXRlIHByZXBhcmUgY2FsbGJhY2sgc2hvdWxkIHJ1biBhZnRlciBuYXZpZ2F0aW9uLlxuICovXG5mdW5jdGlvbiBzaG91bGRQcmVwYXJlT25OYXZpZ2F0aW9uKGlucHV0OiB7XG4gIHNhbWVQYXRobmFtZTogYm9vbGVhbjtcbiAgc2FtZVNlYXJjaDogYm9vbGVhbjtcbiAgcm91dGU6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbDtcbn0pOiBib29sZWFuIHtcbiAgaWYgKCFpbnB1dC5zYW1lUGF0aG5hbWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpbnB1dC5zYW1lU2VhcmNoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgcm91dGVTZWdtZW50cyA9IGlucHV0LnJvdXRlPy5yb3V0ZS5yb3V0ZXMgPz8gW107XG4gIHJldHVybiByb3V0ZVNlZ21lbnRzLnNvbWUoKHJvdXRlKSA9PiB7XG4gICAgcmV0dXJuIHJvdXRlLnByZXBhcmUgIT0gbnVsbCAmJiByb3V0ZS5wcmVwYXJlU2VhcmNoQmVoYXZpb3IgIT09ICdwYXRoJztcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybjxUQ29udGV4dCwgUiBleHRlbmRzIFJvdXRlTm9kZVtdPiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8XG4gICAgUGFyYW1EYXRhLFxuICAgIFJvdXRlclF1ZXJ5U2NoZW1hLFxuICAgIFVua25vd25RdWVyeVNoYXBlLFxuICAgIFRDb250ZXh0XG4gID4gJlxuICAgIFByZXBhcmVkQWNjZXNzPFI+ICYge1xuICAgICAgbmF2aWdhdGU6IE5hdmlnYXRlT3ZlcmxvYWRzPFI+O1xuICAgIH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciBmYWxsYmFjaz17PGRpdj5Mb2FkaW5nLi4uPC9kaXY+fSAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciAodHlwZWQgb3ZlcmxvYWQpLiBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3QgdHVwbGUgb2Ygcm91dGVzLCBnZW5lcmljcyBhcmUgcHJlc2VydmVkLlxuICovXG4vKipcbiAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGBjcmVhdGVSb3V0ZXJgLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJPcHRpb25zPFRDb250ZXh0PiA9IHtcbiAgLyoqIEluc3RydW1lbnRhdGlvbnMgdG8gYXR0YWNoIHRvIHRoZSByb3V0ZXIgKERldlRvb2xzIGJyaWRnZSwgbG9nZ2VyLCAuLi4pLiAqL1xuICBpbnN0cnVtZW50YXRpb25zPzogSW5zdHJ1bWVudGF0aW9uQVBJW107XG4gIC8qKiBTdGF0aWMgY29udGV4dCB2YWx1ZSBvciBsYXp5IGluaXRpYWxpemVyIGZvciB0aGUgcm91dGVyLiAqL1xuICBjb250ZXh0PzogVENvbnRleHQgfCAoKCkgPT4gVENvbnRleHQpO1xuICAvKiogUmVzb2x2ZSBhIGZyZXNoIGNvbnRleHQgdmFsdWUgcGVyIG5hdmlnYXRpb24uICovXG4gIGdldENvbnRleHQ/OiAoKSA9PiBUQ29udGV4dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvdXRlciBpbnN0YW5jZSBmcm9tIGEgcm91dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gUm91dGUgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGluc3RydW1lbnRhdGlvbiBzZXR0aW5ncyB1c2VkIGZvciBleHBvc2luZyBkZXZlbG9wbWVudCB0b29saW5nLlxuICogQHBhcmFtIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyAtIEluc3RydW1lbnRhdGlvbnMgaW52b2tlZCBvbiByb3V0ZXIgZXZlbnRzIChkZXZlbG9wbWVudCBvbmx5KS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlUm91dGVyPFxuICBUQ29udGV4dCA9IHVua25vd24sXG4gIFIgZXh0ZW5kcyBSb3V0ZU5vZGVbXSA9IFJvdXRlTm9kZVtdLFxuPihcbiAgcm91dGVzOiBbLi4uUl0gfCBSb3V0ZU5vZGVbXSxcbiAgb3B0aW9uczogQ3JlYXRlUm91dGVyT3B0aW9uczxUQ29udGV4dD4gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybjxUQ29udGV4dCwgUj4ge1xuICAvLyBJbml0aWFsaXplIGJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VyXG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgQnJvd3Nlckhpc3RvcnkoKTtcblxuICBjb25zdCByZWdpc3RyeSA9IGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5KFxuICAgIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyA/PyBbXSxcbiAgKTtcblxuICBsZXQgc3RhdGljQ29udGV4dDogVENvbnRleHQgfCB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmdldENvbnRleHQgPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0aWNDb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dCBhcyAoKSA9PiBUQ29udGV4dCkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGljQ29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUNvbnRleHQoKTogVENvbnRleHQge1xuICAgIGlmIChvcHRpb25zLmdldENvbnRleHQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGljQ29udGV4dCBhcyBUQ29udGV4dDtcbiAgfVxuXG4gIGxldCBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3ROYXZpZ2F0aW9uT3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ2V4dGVybmFsJztcbiAgbGV0IGxhc3RQcmVsb2FkU2lnbmF0dXJlOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcbiAgbGV0IHJvdXRlckRpc3Bvc2VkID0gZmFsc2U7XG4gIGxldCBhY3RpdmVFbnRyeUlkID0gMDtcbiAgbGV0IGxvYWRTdGF0ZVZlcnNpb24gPSAwO1xuICBjb25zdCBwcmVsb2FkZWRNYXRjaGVzID0gbmV3IE1hcDxzdHJpbmcsIFByZWxvYWRlZFByZXBhcmVkTWF0Y2g8VENvbnRleHQ+PigpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHBhcnRpYWwgbG9jYXRpb24gb2JqZWN0IGludG8gYSBmdWxsIGxvY2F0aW9uIHN0cnVjdHVyZSB3aXRoIHN0cmluZyBmaWVsZHMuXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbjoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIGhhc2g/OiBzdHJpbmc7XG4gIH0pOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nOyBoYXNoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHBhdGhuYW1lVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnBhdGhuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aG5hbWVWYWx1ZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNlYXJjaFZhbHVlID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIH1cbiAgICBsZXQgaGFzaFZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5oYXNoID09PSAnc3RyaW5nJykge1xuICAgICAgaGFzaFZhbHVlID0gbG9jYXRpb24uaGFzaDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBwYXRobmFtZVZhbHVlLFxuICAgICAgc2VhcmNoOiBzZWFyY2hWYWx1ZSxcbiAgICAgIGhhc2g6IGhhc2hWYWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgcm91dGVyIGV2ZW50IHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgaW5zdHJ1bWVudGF0aW9uLiAqL1xuICBmdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQ6IFJvdXRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHJvdXRlckRpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlZ2lzdHJ5LmVtaXRFdmVudChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gY29lcmNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGtub3duIG5hdmlnYXRpb24gc291cmNlLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwT3JpZ2luKHJhdz86IHN0cmluZyk6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc1JvdXRlck5hdmlnYXRpb25Tb3VyY2UocmF3KSkge1xuICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG9yaWdpbiBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBldmVudC5cbiAgICovXG4gIC8qKiBSZXNvbHZlcyB0aGUgbmF2aWdhdGlvbiBzb3VyY2UgY29tYmluaW5nIGhpc3RvcnkgY29udGV4dCBhbmQgcGVuZGluZyBpbnRlbnQuICovXG4gIGZ1bmN0aW9uIHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKFxuICAgIGNvbnRleHQ/OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgbnVsbCxcbiAgKTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB7XG4gICAgY29uc3QgZmFsbGJhY2tPcmlnaW4gPSBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbjtcbiAgICBsZXQgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29udGV4dE9yaWdpbiA9IGNvbnRleHQ/Lm9yaWdpbjtcbiAgICBpZiAoY29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcmlnaW4gPSBtYXBPcmlnaW4oY29udGV4dE9yaWdpbik7XG4gICAgfVxuXG4gICAgb3JpZ2luID8/PSBmYWxsYmFja09yaWdpbjtcbiAgICBvcmlnaW4gPz89ICdleHRlcm5hbCc7XG4gICAgcGVuZGluZ05hdmlnYXRpb25PcmlnaW4gPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9yaWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgaW5uZXItbW9zdCBtYXRjaGVkIHJvdXRlIHBhdGggZnJvbSBhIHJvdXRlIGVudHJ5IHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSBpZiBhdmFpbGFibGUuICovXG4gIGZ1bmN0aW9uIHJlYWRNYXRjaGVkUm91dGVQYXRoKFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gZW50cnkucm91dGU7XG4gICAgaWYgKG1hdGNoZWRSb3V0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBtYXRjaGVkUm91dGUucm91dGUucm91dGVzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkUm91dGVzKSkge1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gY2hpbGRSb3V0ZXMuYXQoLTEpO1xuICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZFJlY29yZCA9IGxhc3RDaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gbGFzdENoaWxkUmVjb3JkLnBhdGg7XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm9vdFBhdGggPSBtYXRjaGVkUm91dGUucm91dGUucGF0aDtcbiAgICBpZiAodHlwZW9mIHJvb3RQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJvb3RQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgYWN0aXZlIHF1ZXJ5IHNjaGVtYSBmb3IgYSBtYXRjaGVkIHJvdXRlLiAqL1xuICBmdW5jdGlvbiByZWFkQWN0aXZlUXVlcnlTY2hlbWEoXG4gICAgcm91dGU6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+Wydyb3V0ZSddLFxuICApOiBSb3V0ZXJRdWVyeVNjaGVtYSB7XG4gICAgcmV0dXJuIHJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpPy5xdWVyeVNjaGVtYTtcbiAgfVxuXG4gIC8qKiBSZWFkcyBhIHBhZ2UgbnVtYmVyIGZyb20gZWl0aGVyIGBwYWdlYCBvciBgcGFnZS5lcWAgZmlsdGVyIHNoYXBlcy4gKi9cbiAgZnVuY3Rpb24gcmVhZFBhZ2VWYWx1ZShmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnMpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3UGFnZSA9IGZpbHRlcnMucGFnZTtcbiAgICBpZiAodHlwZW9mIHJhd1BhZ2UgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmF3UGFnZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcmF3UGFnZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgcmF3UGFnZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHJhd1BhZ2UpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgeyBlcT86IHVua25vd24gfSkuZXEgPT09ICdudW1iZXInXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHJhd1BhZ2UgYXMgeyBlcTogbnVtYmVyIH0pLmVxO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZXMgdGhlIHBhZ2UgZmlsdGVyIHRvIGEgbWluaW11bSB2YWx1ZSBvZiAxIHdoZW4gcHJlc2VudC4gKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGFnZUZpbHRlcnMoZmlsdGVycz86IFVua25vd25GaWx0ZXJzKToge1xuICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICBub3JtYWxpemVkOiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBwYWdlVmFsdWUgPSByZWFkUGFnZVZhbHVlKGZpbHRlcnMpO1xuICAgIGlmIChwYWdlVmFsdWUgPT0gbnVsbCB8fCBwYWdlVmFsdWUgPj0gMSB8fCBmaWx0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIG5vcm1hbGl6ZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICBwYWdlOiB7IGVxOiAxIH0sXG4gICAgICB9LFxuICAgICAgbm9ybWFsaXplZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnZlcnRzIHJvdXRlciBzZWFyY2ggc3RhdGUgaW50byB0aGUgb2JqZWN0IGZvcndhcmRlZCB0byBgcHJlcGFyZWAuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQoc3RhdGU6IFBhcnNlZFNlYXJjaFN0YXRlKTogUHJlcGFyZVF1ZXJ5SW5wdXQge1xuICAgIHJldHVybiBzdGF0ZS5xdWVyeTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSByb3V0ZSBlbnRyeSB3aXRoIGEgZnJlc2hseSBjYWxjdWxhdGVkIGFjdGl2ZSBsb2FkIHN0YXRlLiAqL1xuICBmdW5jdGlvbiB3aXRoTG9hZFN0YXRlKFxuICAgIGVudHJ5OiBPbWl0PFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LCAnYWN0aXZlTG9hZFN0YXRlJyB8ICdsb2FkU3RhdGUnPixcbiAgKTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4ge1xuICAgIGNvbnN0IHsgYWN0aXZlTG9hZFN0YXRlLCBsb2FkU3RhdGUgfSA9IGNhbGN1bGF0ZUxvYWRTdGF0ZShcbiAgICAgIGVudHJ5LnByZXBhcmVkTWF0Y2gsXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlLFxuICAgIH07XG4gIH1cblxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY3RpdmUgcm91dGUgbG9hZCBzdGF0ZSBjaGFuZ2VkIGluIGEgbWVhbmluZ2Z1bCB3YXkuICovXG4gIGZ1bmN0aW9uIGlzU2FtZUFjdGl2ZUxvYWRTdGF0ZShcbiAgICBjdXJyZW50OiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gICAgbmV4dDogUm91dGVyQWN0aXZlTG9hZFN0YXRlLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY3VycmVudC5zdGF0dXMgPT09IG5leHQuc3RhdHVzICYmXG4gICAgICBjdXJyZW50LnBlbmRpbmdDb3VudCA9PT0gbmV4dC5wZW5kaW5nQ291bnQgJiZcbiAgICAgIGN1cnJlbnQucmVqZWN0ZWRDb3VudCA9PT0gbmV4dC5yZWplY3RlZENvdW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBzbmFwc2hvdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCByb3V0ZXIgZW50cnkuICovXG4gIGZ1bmN0aW9uIGJ1aWxkRW50cnlTbmFwc2hvdChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICk6IFJvdXRlckVudHJ5U25hcHNob3Qge1xuICAgIGNvbnN0IHByZXBhcmVkU2VnbWVudHMgPSBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogc2VnbWVudC5wYXRoLFxuICAgICAgICBmdWxsUGF0aDogc2VnbWVudC5mdWxsUGF0aCxcbiAgICAgICAgc2VnbWVudEtleTogc2VnbWVudC5zZWdtZW50S2V5LFxuICAgICAgICBwYXJhbU5hbWVzOiBzZWdtZW50LnBhcmFtTmFtZXMsXG4gICAgICAgIHNlZ21lbnRJbmRleDogc2VnbWVudC5zZWdtZW50SW5kZXgsXG4gICAgICAgIHJvdXRlTm9kZTogc2VnbWVudC5yb3V0ZU5vZGUsXG4gICAgICAgIHByZXBhcmVkUmVzb3VyY2U6IHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZSxcbiAgICAgICAgcmVkaXJlY3RUbzogc2VnbWVudC5yZWRpcmVjdFRvLFxuICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5OiBzZWdtZW50LnN1c3BlbnNlQm91bmRhcnksXG4gICAgICAgIGZhbGxiYWNrOiBzZWdtZW50LmZhbGxiYWNrLFxuICAgICAgICBoaWdobGlnaHRJZDogc2VnbWVudC5oaWdobGlnaHRJZCxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNlZ21lbnQucXVlcnlTY2hlbWEsXG4gICAgICAgIHByZXBhcmVkU3RhdHVzOiBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2U/LmdldFN0YXR1cygpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oZW50cnkubG9jYXRpb24pLFxuICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChlbnRyeSksXG4gICAgICBwcmVwYXJlZE1hdGNoOiB7XG4gICAgICAgIHNlZ21lbnRzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZTogZW50cnkuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiBlbnRyeS5sb2FkU3RhdGUsXG4gICAgICBmaWx0ZXJzOiBlbnRyeS5maWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgYWN0aXZlUXVlcnlTY2hlbWE6IGVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hLFxuICAgIH07XG4gIH1cblxuICAvKiogTm90aWZpZXMgaW5zdHJ1bWVudGF0aW9ucyBvZiBhIG5ldyBhY3RpdmUgZW50cnkuICovXG4gIGZ1bmN0aW9uIG5vdGlmeUVudHJ5KGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHJlZ2lzdHJ5Lm5vdGlmeUVudHJ5Q2hhbmdlKGJ1aWxkRW50cnlTbmFwc2hvdChlbnRyeSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgYSBkZWR1cGxpY2F0aW9uIGtleSBmb3IgcHJlbG9hZCBldmVudHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZEtleShcbiAgICBtb2RlOiBSb3V0ZXJQcmVsb2FkTW9kZVZhbHVlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgc2VhcmNoID0gJycsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke21vZGV9OiR7cGF0aG5hbWV9JHtzZWFyY2h9YDtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBub3JtYWxpemVkIGxvb2t1cCBrZXkgZm9yIHByZXBhcmVkIGZ1bGwtcm91dGUgcHJlbG9hZHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkocGF0aG5hbWU6IHN0cmluZywgc2VhcmNoID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRobmFtZX0ke3NlYXJjaH1gO1xuICB9XG5cbiAgLyoqIENvbXBhcmVzIHBhdGggcGFyYW1ldGVyIHZhbHVlcywgaW5jbHVkaW5nIHdpbGRjYXJkIGFycmF5cy4gKi9cbiAgZnVuY3Rpb24gaXNQYXJhbVZhbHVlRXF1YWwoXG4gICAgbGVmdDogUGFyYW1EYXRhW3N0cmluZ10sXG4gICAgcmlnaHQ6IFBhcmFtRGF0YVtzdHJpbmddLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxlZnQpIHx8ICFBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gcmlnaHRbaW5kZXhdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdHdvIG1hdGNoZWQgcm91dGUgc25hcHNob3RzIGRlc2NyaWJlIHRoZSBzYW1lIHJvdXRlIGFuZCBwYXJhbXMuICovXG4gIGZ1bmN0aW9uIGFyZU1hdGNoZWRSb3V0ZXNFcXVpdmFsZW50KFxuICAgIGxlZnQ6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbCxcbiAgICByaWdodDogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnQucm91dGUgIT09IHJpZ2h0LnJvdXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobGVmdC5wYXJhbXMpO1xuICAgIGNvbnN0IHJpZ2h0S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmlnaHQucGFyYW1zKSk7XG4gICAgaWYgKGxlZnRFbnRyaWVzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnRFbnRyaWVzLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiByaWdodEtleXMuaGFzKGtleSkgJiYgaXNQYXJhbVZhbHVlRXF1YWwodmFsdWUsIHJpZ2h0LnBhcmFtc1trZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHByZWxvYWQgb3IgcHJlbG9hZC1jb2RlIGluc3RydW1lbnRhdGlvbiBldmVudC4gKi9cbiAgZnVuY3Rpb24gZW1pdFByZWxvYWRFdmVudChcbiAgICBtb2RlOiAnY29kZScgfCAnZnVsbCcsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRQcmVsb2FkS2V5KG1vZGUsIHBhdGhuYW1lLCBzZWFyY2gpO1xuICAgIGNvbnN0IHJlY2VudGx5UmVjb3JkZWQgPVxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgIT09IG51bGwgJiZcbiAgICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlLmtleSA9PT0ga2V5ICYmXG4gICAgICBub3cgLSBsYXN0UHJlbG9hZFNpZ25hdHVyZS50aW1lc3RhbXAgPCA1MDtcblxuICAgIGlmICghcmVjZW50bHlSZWNvcmRlZCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3ByZWxvYWQnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgbW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0geyBrZXksIHRpbWVzdGFtcDogbm93IH07XG4gIH1cblxuICAvKiogRW1pdHMgYSBoaXN0b3J5IG11dGF0aW9uIGV2ZW50IChwdXNoL3JlcGxhY2Uvbm9ybWFsaXplKS4gKi9cbiAgZnVuY3Rpb24gZW1pdEhpc3RvcnlFdmVudChcbiAgICBhY3Rpb246IFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICAgbG9jYXRpb246IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nOyBoYXNoPzogc3RyaW5nIH0sXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHNvdXJjZTtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2hpc3RvcnknLFxuICAgICAgc291cmNlLFxuICAgICAgYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKSxcbiAgICAgIGRldGFpbHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRWFnZXJseSBzdGFydHMgZXZlcnkgcmVzb3VyY2UgaW4gYSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMoXG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXSxcbiAgKTogdm9pZCB7XG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZC5zZWdtZW50cy5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgICAgaWYgKHJvdXRlLnByZXBhcmVkUmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJvdXRlLnByZXBhcmVkUmVzb3VyY2UubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBjYWNoZWQgZnVsbCBwcmVsb2FkIGlmIGl0IGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gY29uc3VtZVByZWxvYWRlZE1hdGNoKGlucHV0OiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBjb250ZXh0OiBUQ29udGV4dDtcbiAgICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgfSk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoaW5wdXQucGF0aG5hbWUsIGlucHV0LnNlYXJjaCk7XG4gICAgY29uc3QgY2FjaGVkID0gcHJlbG9hZGVkTWF0Y2hlcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHByZWxvYWRlZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkLmNvbnRleHQgIT09IGlucHV0LmNvbnRleHQgfHxcbiAgICAgICFhcmVNYXRjaGVkUm91dGVzRXF1aXZhbGVudChjYWNoZWQucm91dGUsIGlucHV0LnJvdXRlKSB8fFxuICAgICAgY2FjaGVkLnF1ZXJ5U2NoZW1hICE9PSBpbnB1dC5xdWVyeVNjaGVtYSB8fFxuICAgICAgY2FjaGVkLnNlYXJjaCAhPT0gaW5wdXQuc2VhcmNoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkLnByZXBhcmVkTWF0Y2g7XG4gIH1cblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxVbmlmaWVkU2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKHJvdXRlKTtcbiAgY29uc3QgaW5pdGlhbFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgKTtcbiAgY29uc3Qgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMoXG4gICAgaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICk7XG4gIGNvbnN0IGluaXRpYWxMb2NhdGlvblNuYXBzaG90ID0gbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbik7XG4gIGxldCBpbml0aWFsSW5zdHJ1bWVudGF0aW9uOlxuICAgIHwge1xuICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICB9LFxuICAgICAgc291cmNlOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgICAgIGxvY2F0aW9uOiBpbml0aWFsTG9jYXRpb25TbmFwc2hvdCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICByb3V0ZSxcbiAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KHtcbiAgICAgIC4uLmluaXRpYWxTZWFyY2hTdGF0ZSxcbiAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzLFxuICAgIH0pLFxuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24sXG4gICAgaW5pdGlhbENvbnRleHQsXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgIHJhd1F1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICB9LFxuICApO1xuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgU3Vic2NyaWJlQ2FsbGJhY2s8UGFyYW1EYXRhLCBSb3V0ZXJRdWVyeVNjaGVtYSwgVENvbnRleHQ+XG4gID4oKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gd2l0aExvYWRTdGF0ZSh7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgfSk7XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGlmIChcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMubm9ybWFsaXplZCAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyAhPSBudWxsXG4gICkge1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnM7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHdpdGhMb2FkU3RhdGUoe1xuICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgIGxvY2F0aW9uOiB7IC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbiwgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoIH0sXG4gICAgICAgIHJhd1NlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgYWN0aXZlIHJvdXRlIGxvYWQtc3RhdGUgZXZlbnQuICovXG4gIGZ1bmN0aW9uIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2FjdGl2ZS1sb2FkLXN0YXRlJyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihlbnRyeS5sb2NhdGlvbiksXG4gICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGVudHJ5KSxcbiAgICAgIHN0YXR1czogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnN0YXR1cyxcbiAgICAgIHBlbmRpbmdDb3VudDogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnBlbmRpbmdDb3VudCxcbiAgICAgIHJlamVjdGVkQ291bnQ6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5yZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbjogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogTm90aWZpZXMgUmVhY3Qgc3Vic2NyaWJlcnMgYW5kIGluc3RydW1lbnRhdGlvbiBlbnRyeSBvYnNlcnZlcnMuICovXG4gIGZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhlbnRyeSk7XG4gICAgfSk7XG4gICAgbm90aWZ5RW50cnkoZW50cnkpO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgYWN0aXZlIGVudHJ5IGFmdGVyIGEgcm91dGUgcmVzb3VyY2Ugc2V0dGxlcy4gKi9cbiAgZnVuY3Rpb24gcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShcbiAgICBlbnRyeUlkOiBudW1iZXIsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQgfHwgZW50cnlJZCAhPT0gYWN0aXZlRW50cnlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2gsXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgaXNTYW1lQWN0aXZlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeS5hY3RpdmVMb2FkU3RhdGUsIG5leHQuYWN0aXZlTG9hZFN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2FkU3RhdGVWZXJzaW9uICs9IDE7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2gsXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlOiByZWZyZXNoZWQuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiByZWZyZXNoZWQubG9hZFN0YXRlLFxuICAgIH07XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoY3VycmVudEVudHJ5KTtcbiAgICBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoY3VycmVudEVudHJ5LCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqIE9ic2VydmVzIHBlbmRpbmcgcmVzb3VyY2VzIGZvciB0aGUgYWN0aXZlIGVudHJ5IGFuZCByZXB1Ymxpc2hlcyBvbiBzZXR0bGUuICovXG4gIGZ1bmN0aW9uIG9ic2VydmVBY3RpdmVFbnRyeUxvYWQoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICAgIGVudHJ5SWQ6IG51bWJlcixcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgICAgaWYgKHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZT8uZ2V0U3RhdHVzKCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc2VnbWVudC5yZXNvdXJjZVBhZ2U/LmdldFN0YXR1cygpID09PSAncGVuZGluZycpIHtcbiAgICAgICAgc2VnbWVudC5yZXNvdXJjZVBhZ2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHVibGlzaGVzIGEgbmV3IGFjdGl2ZSByb3V0ZSBlbnRyeSBhbmQgc3RhcnRzIG9ic2VydmluZyBpdHMgcm91dGUgd29yay4gKi9cbiAgZnVuY3Rpb24gcHVibGlzaEVudHJ5KGlucHV0OiB7XG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+O1xuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICBlbWl0U25hcHNob3Q6IGJvb2xlYW47XG4gIH0pOiB2b2lkIHtcbiAgICBhY3RpdmVFbnRyeUlkICs9IDE7XG4gICAgY3VycmVudEVudHJ5ID0gaW5wdXQuZW50cnk7XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoaW5wdXQuZW50cnkpO1xuICAgIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChpbnB1dC5lbnRyeSwgaW5wdXQuc291cmNlKTtcbiAgICBpZiAoaW5wdXQuZW1pdFNuYXBzaG90KSB7XG4gICAgICBlbWl0RXZlbnQoe1xuICAgICAgICBraW5kOiAnc25hcHNob3QnLFxuICAgICAgICBzb3VyY2U6IGlucHV0LnNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaW5wdXQuZW50cnkubG9jYXRpb24pLFxuICAgICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGlucHV0LmVudHJ5KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYnNlcnZlQWN0aXZlRW50cnlMb2FkKGlucHV0LmVudHJ5LCBhY3RpdmVFbnRyeUlkLCBpbnB1dC5zb3VyY2UpO1xuICB9XG5cbiAgcHVibGlzaEVudHJ5KHtcbiAgICBlbnRyeTogY3VycmVudEVudHJ5LFxuICAgIHNvdXJjZTogbGFzdE5hdmlnYXRpb25PcmlnaW4sXG4gICAgZW1pdFNuYXBzaG90OiB0cnVlLFxuICB9KTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdDb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGhpc3RvcnlEZXRhaWxzOiB7IGhpc3RvcnlJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGVidWdDb250ZXh0Py5oaXN0b3J5SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaGlzdG9yeURldGFpbHMgPSB7IGhpc3RvcnlJbmRleDogZGVidWdDb250ZXh0Lmhpc3RvcnlJbmRleCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS11bmtub3duJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgZGlyZWN0aW9uOiAnYmFjaycgfCAnZm9yd2FyZCcgfCAndW5rbm93bicgPSAndW5rbm93bic7XG4gICAgICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAnYmFjayc7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1mb3J3YXJkJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0RXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ3BvcHN0YXRlJyxcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgd2Ugc3RpbGwgd2FudCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZS5cbiAgICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG5cbiAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobmV4dFJvdXRlKTtcbiAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMocGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVycyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZFJlcHJlcGFyZSA9IHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oe1xuICAgICAgICBzYW1lUGF0aG5hbWUsXG4gICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNob3VsZFJlcHJlcGFyZSkge1xuICAgICAgICBjb25zdCBwcmVsb2FkZWRNYXRjaCA9IGNvbnN1bWVQcmVsb2FkZWRNYXRjaCh7XG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICAgIGNvbnRleHQ6IG5leHRDb250ZXh0LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJlbG9hZGVkTWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlbG9hZGVkTWF0Y2g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVwZGF0ZUluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluc3RydW1lbnRhdGlvbiA9IHtcbiAgICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHJldXNlUHJlcGFyZWRTZWdtZW50czpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IHR5cGVvZiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cztcbiAgICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogUGFyYW1EYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHNhbWVTZWFyY2g6IGJvb2xlYW47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgICAgICByZXVzZVByZXBhcmVkU2VnbWVudHMgPSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLFxuICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogY3VycmVudEVudHJ5LnJvdXRlPy5wYXJhbXMsXG4gICAgICAgICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgICAgbmV4dFJvdXRlLFxuICAgICAgICAgICAgYnVpbGRQcmVwYXJlUXVlcnlJbnB1dCh7XG4gICAgICAgICAgICAgIC4uLnBhcnNlZFNlYXJjaFN0YXRlLFxuICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24sXG4gICAgICAgICAgICBuZXh0Q29udGV4dCxcbiAgICAgICAgICAgIHJldXNlUHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmF3UXVlcnk6IHBhcnNlZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvYWRTdGF0ZVZlcnNpb24gKz0gMTtcbiAgICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gPSB3aXRoTG9hZFN0YXRlKHtcbiAgICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgICBjb250ZXh0OiBuZXh0Q29udGV4dCxcbiAgICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IHBhcnNlZFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgICBhY3RpdmVRdWVyeVNjaGVtYTogcXVlcnlTY2hlbWEsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgICBpZiAobm9ybWFsaXplZEZpbHRlcnMubm9ybWFsaXplZCAmJiBxdWVyeVNjaGVtYSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgICAgaWYgKCFuZXh0U2VhcmNoU3RyLnN0YXJ0c1dpdGgoJz8nKSAmJiBuZXh0U2VhcmNoU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVhc29uOiAncnVudGltZS1wYWdlLWNsYW1wJyB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcnVudGltZU5vcm1hbGl6ZUNvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgICAgICBvcmlnaW46ICdub3JtYWxpemUnLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ25vcm1hbGl6ZScsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIGRlYnVnQ29udGV4dDogcnVudGltZU5vcm1hbGl6ZUNvbnRleHQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVibGlzaEVudHJ5KHtcbiAgICAgICAgZW50cnk6IG5leHRFbnRyeSxcbiAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgIGVtaXRTbmFwc2hvdDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgLyoqIE5vcm1hbGl6ZXMgdXNlci1wcm92aWRlZCBwcmVsb2FkIHRhcmdldHMgaW50byBjb25zaXN0ZW50IHN0cnVjdHVyZXMuICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0OiBQcmVsb2FkVGFyZ2V0KToge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICB9IHtcbiAgICBsZXQgbm9ybWFsaXplZFBhdGhuYW1lID0gaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodHlwZW9mIHRhcmdldC5wYXRobmFtZSA9PT0gJ3N0cmluZycgJiYgdGFyZ2V0LnBhdGhuYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vcm1hbGl6ZWRQYXRobmFtZSA9IHRhcmdldC5wYXRobmFtZTtcbiAgICB9XG5cbiAgICBsZXQgbm9ybWFsaXplZFNlYXJjaCA9ICcnO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vcm1hbGl6ZWRTZWFyY2ggPSB0YXJnZXQuc2VhcmNoO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgY29uc3QgbWFwcGVkU291cmNlID0gbWFwT3JpZ2luKHRhcmdldC5zb3VyY2UpO1xuICAgIGlmIChtYXBwZWRTb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9ybWFsaXplZFNvdXJjZSA9IG1hcHBlZFNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkUGF0aG5hbWUsXG4gICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICBzb3VyY2U6IG5vcm1hbGl6ZWRTb3VyY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcmVwYXJlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBzZWdtZW50IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvdXRlIHNlZ21lbnQgcGF0aCBvciBmdWxsIHBhdGggdG8gaW5zcGVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByZXBhcmVkKHBhdGg6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGZvciAoY29uc3QgcHJlcGFyZWRSb3V0ZSBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzKSB7XG4gICAgICAgIGlmIChwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnByZXBhcmVkUmVzb3VyY2U/LmdldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBldmVyeSBhY3RpdmUgcHJlcGFyZWQgc2VnbWVudCBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSb3V0ZSBzZWdtZW50IHBhdGggb3IgZnVsbCBwYXRoIHRvIGluc3BlY3QuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVwYXJlZFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IFByZXBhcmVkUm91dGVTZWdtZW50U25hcHNob3RbXSB7XG4gICAgcmV0dXJuIGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzXG4gICAgICAuZmlsdGVyKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aDtcbiAgICAgIH0pXG4gICAgICAubWFwKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aDogcHJlcGFyZWRSb3V0ZS5wYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoOiBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoLFxuICAgICAgICAgIHNlZ21lbnRLZXk6IHByZXBhcmVkUm91dGUuc2VnbWVudEtleSxcbiAgICAgICAgICBwYXJhbU5hbWVzOiBwcmVwYXJlZFJvdXRlLnBhcmFtTmFtZXMsXG4gICAgICAgICAgc2VnbWVudEluZGV4OiBwcmVwYXJlZFJvdXRlLnNlZ21lbnRJbmRleCxcbiAgICAgICAgICByb3V0ZU5vZGU6IHByZXBhcmVkUm91dGUucm91dGVOb2RlLFxuICAgICAgICAgIHByZXBhcmVkUmVzb3VyY2U6IHByZXBhcmVkUm91dGUucHJlcGFyZWRSZXNvdXJjZSxcbiAgICAgICAgICByZWRpcmVjdFRvOiBwcmVwYXJlZFJvdXRlLnJlZGlyZWN0VG8sXG4gICAgICAgICAgcmVzb3VyY2VQYWdlOiBwcmVwYXJlZFJvdXRlLnJlc291cmNlUGFnZSxcbiAgICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5OiBwcmVwYXJlZFJvdXRlLnN1c3BlbnNlQm91bmRhcnksXG4gICAgICAgICAgZmFsbGJhY2s6IHByZXBhcmVkUm91dGUuZmFsbGJhY2ssXG4gICAgICAgICAgaGlnaGxpZ2h0SWQ6IHByZXBhcmVkUm91dGUuaGlnaGxpZ2h0SWQsXG4gICAgICAgICAgcXVlcnlTY2hlbWE6IHByZXBhcmVkUm91dGUucXVlcnlTY2hlbWEsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBxdWVyeSBzY2hlbWEgZ292ZXJuaW5nIGEgbmF2aWdhdGlvbiBkZXN0aW5hdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEocGF0aG5hbWU6IHN0cmluZyk6IFJvdXRlclF1ZXJ5U2NoZW1hIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvblJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICBwYXRobmFtZSxcbiAgICB9KTtcbiAgICBpZiAoZGVzdGluYXRpb25Sb3V0ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKGRlc3RpbmF0aW9uUm91dGUpO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZXMgbmF2aWdhdGlvbiBzdGF0ZSB3aXRoIHRoZSBkZXN0aW5hdGlvbiByb3V0ZSBzY2hlbWEuICovXG4gIGZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblNlYXJjaChpbnB1dDoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHF1ZXJ5U2NoZW1hID0gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEoaW5wdXQucGF0aG5hbWUpO1xuICAgIHJldHVybiBidWlsZERlc3RpbmF0aW9uU2VhcmNoKHtcbiAgICAgIGZpbHRlcnM6IGlucHV0LmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5wdXQucXVlcnksXG4gICAgICBxdWVyeVNjaGVtYSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgYnVpbGRTZWFyY2goe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnMsXG4gICAgfToge1xuICAgICAgcGF0aG5hbWU/OiBzdHJpbmc7XG4gICAgICBxdWVyeT86IFVua25vd25RdWVyeVNoYXBlO1xuICAgICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICAgIH0pIHtcbiAgICAgIHJldHVybiBidWlsZE5hdmlnYXRpb25TZWFyY2goe1xuICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudChcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICApO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudChcbiAgICAgICAgJ2Z1bGwnLFxuICAgICAgICBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICApO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvblNuYXBzaG90OiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90ID0ge1xuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICB9O1xuICAgICAgbGV0IGluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgbG9jYXRpb246IFJvdXRlckxvY2F0aW9uU25hcHNob3Q7XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtYXRjaGVzICE9IG51bGwpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uID0ge1xuICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3VyY2U6IG5vcm1hbGl6ZWQuc291cmNlLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNuYXBzaG90LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJlbG9hZENvbnRleHQgPSByZXNvbHZlQ29udGV4dCgpO1xuICAgICAgY29uc3QgcHJlbG9hZFF1ZXJ5U2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKG1hdGNoZXMpO1xuICAgICAgY29uc3QgcHJlbG9hZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICAgIHByZWxvYWRRdWVyeVNjaGVtYSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KHByZWxvYWRTZWFyY2hTdGF0ZSksXG4gICAgICAgIGluc3RydW1lbnRhdGlvbixcbiAgICAgICAgcHJlbG9hZENvbnRleHQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIHJhd1F1ZXJ5OiBwcmVsb2FkU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICAgICAgZmlsdGVyczogcHJlbG9hZFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMocHJlcGFyZWRNYXRjaCk7XG4gICAgICBjb25zdCBwcmVsb2FkS2V5ID0gYnVpbGRQcmVsb2FkZWRNYXRjaEtleShcbiAgICAgICAgbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICApO1xuICAgICAgcHJlbG9hZGVkTWF0Y2hlcy5zZXQocHJlbG9hZEtleSwge1xuICAgICAgICBrZXk6IHByZWxvYWRLZXksXG4gICAgICAgIGNvbnRleHQ6IHByZWxvYWRDb250ZXh0LFxuICAgICAgICByb3V0ZTogbWF0Y2hlcyxcbiAgICAgICAgcHJlcGFyZWRNYXRjaCxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHByZWxvYWRRdWVyeVNjaGVtYSxcbiAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLyoqIFJlbW92ZXMgdGhlIHN1YnNjcmliZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBzdWJzY3JpYmUuICovXG4gICAgICBmdW5jdGlvbiBkaXNwb3NlQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlQ2FsbGJhY2s7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSh7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmlsdGVyczogbmF2RmlsdGVycyxcbiAgICAgIGhhc2gsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICAgIGhhc2g/OiBzdHJpbmc7XG4gICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgbGV0IHRhcmdldFBhdGhuYW1lID0gcGF0aG5hbWU7XG4gICAgICB0YXJnZXRQYXRobmFtZSA/Pz0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcblxuICAgICAgY29uc3QgZmlsdGVyc0lucHV0ID0gbmF2RmlsdGVycyA/PyBjdXJyZW50LmZpbHRlcnM7XG4gICAgICBjb25zdCByYXdRdWVyeUlucHV0OiBVbmtub3duUXVlcnlTaGFwZSB8IFJhd1F1ZXJ5IHwgdW5kZWZpbmVkID1cbiAgICAgICAgcXVlcnkgPz8gY3VycmVudC5xdWVyeTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkTmF2aWdhdGlvblNlYXJjaCh7XG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc0lucHV0LFxuICAgICAgICBxdWVyeTogcmF3UXVlcnlJbnB1dCxcbiAgICAgIH0pO1xuICAgICAgbGV0IGN1cnJlbnRIcmVmOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGN1cnJlbnRIcmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBjb25zdCByZXNvbHZlZERlc3RpbmF0aW9uID0gcmVzb2x2ZVJvdXRlckRlc3RpbmF0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgIGhhc2g6IGhhc2ggPz8gY3VycmVudC5sb2NhdGlvbi5oYXNoLFxuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50SHJlZixcbiAgICAgICAgYnVpbGRTZWFyY2g6IGJ1aWxkTmF2aWdhdGlvblNlYXJjaCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7XG4gICAgICAgIHBhdGhuYW1lOiByZXNvbHZlZERlc3RpbmF0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IHJlc29sdmVkRGVzdGluYXRpb24uc2VhcmNoLFxuICAgICAgICBoYXNoOiByZXNvbHZlZERlc3RpbmF0aW9uLmhhc2gsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgICBjb25zdCBkZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVwbGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdyZXBsYWNlJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdwdXNoJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAuLi5sb2NhdGlvbk9iaixcbiAgICAgICAgICBkZWJ1Z0NvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQsXG4gICAgZ2V0UHJlcGFyZWRTZWdtZW50cyxcbiAgfSBhcyBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+Wydjb250ZXh0J107XG5cbiAgLyoqIFJlbGVhc2VzIHJvdXRlciByZXNvdXJjZXMgYW5kIGRldGFjaGVzIGFsbCBpbnN0cnVtZW50YXRpb25zLiAqL1xuICBmdW5jdGlvbiBjbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb3V0ZXJEaXNwb3NlZCA9IHRydWU7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBoaXN0b3J5LmRpc3Bvc2UoKTtcbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHJlZ2lzdHJ5LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==
969
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sbUJBQW1CLE1BQU0saUNBQWlDLENBQUM7QUFvQmxFLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFDTCxnQkFBZ0IsR0FHakIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQW9CN0QsU0FBUyx5QkFBeUIsQ0FBQyxLQUlsQztJQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN0RCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxL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Q0FBQztnQkFDckIsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7b0JBQy9DLE9BQU8sRUFBRSxjQUFjO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQztvQkFDVixHQUFHLFdBQVc7b0JBQ2QsWUFBWTtpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7b0JBQzVDLE9BQU8sRUFBRSxjQUFjO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxHQUFHLFdBQVc7b0JBQ2QsWUFBWTtpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELFdBQVc7UUFDWCxtQkFBbUI7S0FDMEIsQ0FBQztJQUdoRCxTQUFTLE9BQU87UUFDZCxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBQ0QsY0FBYyxHQUFHLElBQUksQ0FBQztRQUN0QixjQUFjLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBR0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCBidWlsZENvbWJpbmVkU2VhcmNoIGZyb20gJy4uL3Rvb2xzL2J1aWxkQ29tYmluZWRTZWFyY2guanMnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbURhdGEgfSBmcm9tICdwYXRoLXRvLXJlZ2V4cCc7XG5pbXBvcnQge1xuICB0eXBlIFJvdXRlRW50cnksXG4gIHR5cGUgUm91dGluZ0NvbnRleHRUeXBlLFxuICB0eXBlIFN1YnNjcmliZUNhbGxiYWNrLFxuICB0eXBlIFJvdXRlTm9kZSxcbiAgdHlwZSBQcmVwYXJlZEFjY2VzcyxcbiAgdHlwZSBOYXZpZ2F0ZU92ZXJsb2FkcyxcbiAgdHlwZSBQcmVsb2FkVGFyZ2V0LFxuICB0eXBlIFByZXBhcmVkUm91dGVTZWdtZW50U25hcHNob3QsXG4gIHR5cGUgUmF3UXVlcnksXG4gIHR5cGUgUm91dGVyTWF0Y2hlZFJvdXRlLFxuICB0eXBlIFJvdXRlckFjdGl2ZUxvYWRTdGF0ZSxcbiAgdHlwZSBSb3V0ZXJSZWRpcmVjdFN0YXR1cyxcbiAgdHlwZSBSb3V0ZXJIeWRyYXRpb25TbmFwc2hvdCxcbiAgdHlwZSBSb3V0ZXJKc29uVmFsdWUsXG4gIHR5cGUgVW5rbm93bkZpbHRlcnMsXG4gIHR5cGUgVW5rbm93blF1ZXJ5U2hhcGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LFxuICB0eXBlIEluc3RydW1lbnRhdGlvbkFQSSxcbiAgdHlwZSBSb3V0ZXJFbnRyeVNuYXBzaG90LFxuICB0eXBlIFJvdXRlckxvY2F0aW9uU25hcHNob3QsXG4gIHR5cGUgUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJFdmVudCxcbn0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL0luc3RydW1lbnRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJIaXN0b3J5QWN0aW9uVmFsdWUsXG4gIHR5cGUgUm91dGVyUHJlbG9hZE1vZGVWYWx1ZSxcbn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGVzdGluYXRpb25TZWFyY2gsXG4gIHJlc29sdmVSb3V0ZXJEZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9kZXN0aW5hdGlvbi5qcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVMb2FkU3RhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9yb3V0ZXJMb2FkU3RhdGUuanMnO1xuaW1wb3J0IHsgSHR0cFJlZGlyZWN0IH0gZnJvbSAnLi4vZXJyb3JzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIHBhcnNlU2VhcmNoU3RhdGUsXG4gIHR5cGUgUGFyc2VkU2VhcmNoU3RhdGUsXG4gIHR5cGUgUm91dGVyUXVlcnlTY2hlbWEsXG59IGZyb20gJy4uL2ludGVybmFsL3JvdXRlclNlYXJjaFN0YXRlLmpzJztcbmltcG9ydCB7IGFzc2VydFJvdXRlckpzb25WYWx1ZSB9IGZyb20gJy4vcm91dGVySHlkcmF0aW9uLmpzJztcblxudHlwZSBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiA9IFJvdXRlRW50cnk8XG4gIFBhcmFtRGF0YSxcbiAgUm91dGVyUXVlcnlTY2hlbWEsXG4gIFRDb250ZXh0XG4+O1xudHlwZSBQcmVwYXJlUXVlcnlJbnB1dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xudHlwZSBQcmVsb2FkZWRQcmVwYXJlZE1hdGNoPFRDb250ZXh0PiA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xuICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICBwcmVwYXJlZE1hdGNoOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PlsncHJlcGFyZWRNYXRjaCddO1xuICBxdWVyeVNjaGVtYTogUm91dGVyUXVlcnlTY2hlbWE7XG4gIHNlYXJjaDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByb3V0ZSBwcmVwYXJlIGNhbGxiYWNrIHNob3VsZCBydW4gYWZ0ZXIgbmF2aWdhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUHJlcGFyZU9uTmF2aWdhdGlvbihpbnB1dDoge1xuICBzYW1lUGF0aG5hbWU6IGJvb2xlYW47XG4gIHNhbWVTZWFyY2g6IGJvb2xlYW47XG4gIHJvdXRlOiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGw7XG59KTogYm9vbGVhbiB7XG4gIGlmICghaW5wdXQuc2FtZVBhdGhuYW1lKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaW5wdXQuc2FtZVNlYXJjaCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJvdXRlU2VnbWVudHMgPSBpbnB1dC5yb3V0ZT8ucm91dGUucm91dGVzID8/IFtdO1xuICByZXR1cm4gcm91dGVTZWdtZW50cy5zb21lKChyb3V0ZSkgPT4ge1xuICAgIHJldHVybiByb3V0ZS5wcmVwYXJlICE9IG51bGwgJiYgcm91dGUucHJlcGFyZVNlYXJjaEJlaGF2aW9yICE9PSAncGF0aCc7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFIgZXh0ZW5kcyBSb3V0ZU5vZGVbXT4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPFxuICAgIFBhcmFtRGF0YSxcbiAgICBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgICBVbmtub3duUXVlcnlTaGFwZSxcbiAgICBUQ29udGV4dFxuICA+ICZcbiAgICBQcmVwYXJlZEFjY2VzczxSPiAmIHtcbiAgICAgIG5hdmlnYXRlOiBOYXZpZ2F0ZU92ZXJsb2FkczxSPjtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgcm91dGVyIHN5c3RlbSBmcm9tIHJvdXRlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFRoaXMgcm91dGVyIGlzIGJ1aWx0IGZyb20gdGhlIHNhbWUgcHJpbWl0aXZlcyBhcyByZWFjdC1yb3V0ZXIgYnV0IHdpdGggYWRkaXRpb25hbFxuICogZmVhdHVyZXMgZm9yIGRhdGEgcHJlbG9hZGluZyBhbmQgY29kZSBzcGxpdHRpbmcuIEVhY2ggcm91dGUgY2FuIGNvbnRhaW4gYm90aCBhXG4gKiBDb21wb25lbnQgYW5kIGEgcHJlcGFyZSgpIGZ1bmN0aW9uIHRoYXQgY2FuIHByZWxvYWQgZGF0YSBmb3IgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgcm91dGVyIHdhdGNoZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gdmlhIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSxcbiAqIG1hcHMgdGhlIGxvY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRlIGVudHJ5LCBhbmQgdGhlbiBwcmVsb2FkcyB0aGUgY29kZVxuICogYW5kIGRhdGEgZm9yIHRoZSByb3V0ZSBiZWZvcmUgcmVuZGVyaW5nLlxuICpcbiAqIEBwYXJhbSByb3V0ZXMgLSBBcnJheSBvZiByb3V0ZSBjb25maWd1cmF0aW9uc1xuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdXRlciBjb250ZXh0IGFuZCBjbGVhbnVwIGZ1bmN0aW9uXG4gKlxuICBwcmVwYXJlZE1hdGNoOiBwcmVwYXJlTWF0Y2gocm91dGUsIHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpKSxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJvdXRlcyA9IFtcbiAqICAge1xuICogICAgIHBhdGg6ICcvdXNlcnMvOmlkJyxcbiAqICAgICByZXNvdXJjZVBhZ2U6IGdldFJlc291cmNlUGFnZSgnVXNlclByb2ZpbGUnLCAoKSA9PiBpbXBvcnQoJy4vVXNlclByb2ZpbGUnKSksXG4gKiAgICAgcHJlcGFyZTogKHsgdmFyaWFibGVzIH0pID0+ICh7IHVzZXJJZDogdmFyaWFibGVzLmlkIH0pXG4gKiAgIH1cbiAqIF07XG4gKlxuICogY29uc3QgeyBjb250ZXh0LCBjbGVhbnVwIH0gPSBjcmVhdGVSb3V0ZXIocm91dGVzKTtcbiAqXG4gKiAvLyBVc2UgaW4gUmVhY3QgYXBwXG4gKiA8Um91dGluZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9PlxuICogICA8Um91dGVyUmVuZGVyZXIgZmFsbGJhY2s9ezxkaXY+TG9hZGluZy4uLjwvZGl2Pn0gLz5cbiAqIDwvUm91dGluZ0NvbnRleHQuUHJvdmlkZXI+XG4gKiBgYGBcbiAqL1xuLyoqXG4gKiBDcmVhdGUgYSByb3V0ZXIgKHR5cGVkIG92ZXJsb2FkKS4gV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0IHR1cGxlIG9mIHJvdXRlcywgZ2VuZXJpY3MgYXJlIHByZXNlcnZlZC5cbiAqL1xuLyoqXG4gKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBgY3JlYXRlUm91dGVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyT3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIC8qKiBJbnN0cnVtZW50YXRpb25zIHRvIGF0dGFjaCB0byB0aGUgcm91dGVyIChEZXZUb29scyBicmlkZ2UsIGxvZ2dlciwgLi4uKS4gKi9cbiAgaW5zdHJ1bWVudGF0aW9ucz86IEluc3RydW1lbnRhdGlvbkFQSVtdO1xuICAvKiogU3RhdGljIGNvbnRleHQgdmFsdWUgb3IgbGF6eSBpbml0aWFsaXplciBmb3IgdGhlIHJvdXRlci4gKi9cbiAgY29udGV4dD86IFRDb250ZXh0IHwgKCgpID0+IFRDb250ZXh0KTtcbiAgLyoqIFJlc29sdmUgYSBmcmVzaCBjb250ZXh0IHZhbHVlIHBlciBuYXZpZ2F0aW9uLiAqL1xuICBnZXRDb250ZXh0PzogKCkgPT4gVENvbnRleHQ7XG4gIC8qKiBWZXJzaW9uZWQgcHJlcGFyZWQtZGF0YSBzbmFwc2hvdCBwcm9kdWNlZCBmb3IgdGhlIGluaXRpYWwgYnJvd3NlciBVUkwuICovXG4gIGh5ZHJhdGlvblNuYXBzaG90PzogUm91dGVySHlkcmF0aW9uU25hcHNob3Q7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZXIgaW5zdGFuY2UgZnJvbSBhIHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIFJvdXRlIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBpbnN0cnVtZW50YXRpb24gc2V0dGluZ3MgdXNlZCBmb3IgZXhwb3NpbmcgZGV2ZWxvcG1lbnQgdG9vbGluZy5cbiAqIEBwYXJhbSBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgLSBJbnN0cnVtZW50YXRpb25zIGludm9rZWQgb24gcm91dGVyIGV2ZW50cyAoZGV2ZWxvcG1lbnQgb25seSkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcjxcbiAgVENvbnRleHQgPSB1bmtub3duLFxuICBSIGV4dGVuZHMgUm91dGVOb2RlW10gPSBSb3V0ZU5vZGVbXSxcbj4oXG4gIHJvdXRlczogWy4uLlJdIHwgUm91dGVOb2RlW10sXG4gIG9wdGlvbnM6IENyZWF0ZVJvdXRlck9wdGlvbnM8VENvbnRleHQ+ID0ge30sXG4pOiBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+IHtcbiAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIGhpc3RvcnkgbWFuYWdlclxuICBjb25zdCBoaXN0b3J5ID0gbmV3IEJyb3dzZXJIaXN0b3J5KCk7XG5cbiAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVJbnN0cnVtZW50YXRpb25SZWdpc3RyeShcbiAgICBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgPz8gW10sXG4gICk7XG5cbiAgbGV0IHN0YXRpY0NvbnRleHQ6IFRDb250ZXh0IHwgdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ID09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGljQ29udGV4dCA9IChvcHRpb25zLmNvbnRleHQgYXMgKCkgPT4gVENvbnRleHQpKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRpY0NvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uICovXG4gIGZ1bmN0aW9uIHJlc29sdmVDb250ZXh0KCk6IFRDb250ZXh0IHtcbiAgICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmdldENvbnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpY0NvbnRleHQgYXMgVENvbnRleHQ7XG4gIH1cblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdleHRlcm5hbCc7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIGxldCByb3V0ZXJEaXNwb3NlZCA9IGZhbHNlO1xuICBsZXQgYWN0aXZlRW50cnlJZCA9IDA7XG4gIGxldCBsb2FkU3RhdGVWZXJzaW9uID0gMDtcbiAgY29uc3QgcHJlbG9hZGVkTWF0Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcmVsb2FkZWRQcmVwYXJlZE1hdGNoPFRDb250ZXh0Pj4oKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYSBwYXJ0aWFsIGxvY2F0aW9uIG9iamVjdCBpbnRvIGEgZnVsbCBsb2NhdGlvbiBzdHJ1Y3R1cmUgd2l0aCBzdHJpbmcgZmllbGRzLlxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb24obG9jYXRpb246IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICBoYXNoPzogc3RyaW5nO1xuICB9KTogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZzsgaGFzaDogc3RyaW5nIH0ge1xuICAgIGxldCBwYXRobmFtZVZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5wYXRobmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhdGhuYW1lVmFsdWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgbGV0IHNlYXJjaFZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5zZWFyY2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBzZWFyY2hWYWx1ZSA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB9XG4gICAgbGV0IGhhc2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uaGFzaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGhhc2hWYWx1ZSA9IGxvY2F0aW9uLmhhc2g7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRobmFtZTogcGF0aG5hbWVWYWx1ZSxcbiAgICAgIHNlYXJjaDogc2VhcmNoVmFsdWUsXG4gICAgICBoYXNoOiBoYXNoVmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHJvdXRlciBldmVudCB0byBldmVyeSByZWdpc3RlcmVkIGluc3RydW1lbnRhdGlvbi4gKi9cbiAgZnVuY3Rpb24gZW1pdEV2ZW50KGV2ZW50OiBSb3V0ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWdpc3RyeS5lbWl0RXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGNvZXJjZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGludG8gYSBrbm93biBuYXZpZ2F0aW9uIHNvdXJjZS5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcE9yaWdpbihyYXc/OiBzdHJpbmcpOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNSb3V0ZXJOYXZpZ2F0aW9uU291cmNlKHJhdykpIHtcbiAgICAgIHJldHVybiByYXc7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvcmlnaW4gZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gZXZlbnQuXG4gICAqL1xuICAvKiogUmVzb2x2ZXMgdGhlIG5hdmlnYXRpb24gc291cmNlIGNvbWJpbmluZyBoaXN0b3J5IGNvbnRleHQgYW5kIHBlbmRpbmcgaW50ZW50LiAqL1xuICBmdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihcbiAgICBjb250ZXh0PzogSGlzdG9yeURlYnVnQ29udGV4dCB8IG51bGwsXG4gICk6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2Uge1xuICAgIGNvbnN0IGZhbGxiYWNrT3JpZ2luID0gcGVuZGluZ05hdmlnYXRpb25PcmlnaW47XG4gICAgbGV0IG9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbnRleHRPcmlnaW4gPSBjb250ZXh0Py5vcmlnaW47XG4gICAgaWYgKGNvbnRleHRPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3JpZ2luID0gbWFwT3JpZ2luKGNvbnRleHRPcmlnaW4pO1xuICAgIH1cblxuICAgIG9yaWdpbiA/Pz0gZmFsbGJhY2tPcmlnaW47XG4gICAgb3JpZ2luID8/PSAnZXh0ZXJuYWwnO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGlubmVyLW1vc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIC8qKiBSZXR1cm5zIHRoZSBkZWVwZXN0IG1hdGNoZWQgcm91dGUgcGF0aCBmcm9tIGEgcm91dGUgZW50cnkgaWYgYXZhaWxhYmxlLiAqL1xuICBmdW5jdGlvbiByZWFkTWF0Y2hlZFJvdXRlUGF0aChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gfCB1bmRlZmluZWQsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRSb3V0ZSA9IGVudHJ5LnJvdXRlO1xuICAgIGlmIChtYXRjaGVkUm91dGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUm91dGVzID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnJvdXRlcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZFJvdXRlcykpIHtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNoaWxkUm91dGVzLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0Q2hpbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsYXN0Q2hpbGRSZWNvcmQgPSBsYXN0Q2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGxhc3RDaGlsZFJlY29yZC5wYXRoO1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkUGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvb3RQYXRoID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnBhdGg7XG4gICAgaWYgKHR5cGVvZiByb290UGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByb290UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBkZWVwZXN0IGFjdGl2ZSBxdWVyeSBzY2hlbWEgZm9yIGEgbWF0Y2hlZCByb3V0ZS4gKi9cbiAgZnVuY3Rpb24gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKFxuICAgIHJvdXRlOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Plsncm91dGUnXSxcbiAgKTogUm91dGVyUXVlcnlTY2hlbWEge1xuICAgIHJldHVybiByb3V0ZT8ucm91dGUucm91dGVzLmF0KC0xKT8ucXVlcnlTY2hlbWE7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgSFRUUC1vcmllbnRlZCBzdGF0dXMgb2YgdGhlIGRlZXBlc3QgbWF0Y2hlZCByb3V0ZS4gKi9cbiAgZnVuY3Rpb24gcmVhZFJlbmRlclN0YXR1cyhcbiAgICByb3V0ZTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3JvdXRlJ10sXG4gICk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydzdGF0dXMnXSB7XG4gICAgcmV0dXJuIHJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpPy5zdGF0dXMgPz8gMjAwO1xuICB9XG5cbiAgLyoqIFJlYWRzIGEgcGFnZSBudW1iZXIgZnJvbSBlaXRoZXIgYHBhZ2VgIG9yIGBwYWdlLmVxYCBmaWx0ZXIgc2hhcGVzLiAqL1xuICBmdW5jdGlvbiByZWFkUGFnZVZhbHVlKGZpbHRlcnM/OiBVbmtub3duRmlsdGVycyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXdQYWdlID0gZmlsdGVycy5wYWdlO1xuICAgIGlmICh0eXBlb2YgcmF3UGFnZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiByYXdQYWdlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICByYXdQYWdlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiByYXdQYWdlID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkocmF3UGFnZSkgJiZcbiAgICAgIHR5cGVvZiAocmF3UGFnZSBhcyB7IGVxPzogdW5rbm93biB9KS5lcSA9PT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHJldHVybiAocmF3UGFnZSBhcyB7IGVxOiBudW1iZXIgfSkuZXE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogTm9ybWFsaXplcyB0aGUgcGFnZSBmaWx0ZXIgdG8gYSBtaW5pbXVtIHZhbHVlIG9mIDEgd2hlbiBwcmVzZW50LiAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYWdlRmlsdGVycyhmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnMpOiB7XG4gICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICAgIG5vcm1hbGl6ZWQ6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IHBhZ2VWYWx1ZSA9IHJlYWRQYWdlVmFsdWUoZmlsdGVycyk7XG4gICAgaWYgKHBhZ2VWYWx1ZSA9PSBudWxsIHx8IHBhZ2VWYWx1ZSA+PSAxIHx8IGZpbHRlcnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIC4uLmZpbHRlcnMsXG4gICAgICAgIHBhZ2U6IHsgZXE6IDEgfSxcbiAgICAgIH0sXG4gICAgICBub3JtYWxpemVkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udmVydHMgcm91dGVyIHNlYXJjaCBzdGF0ZSBpbnRvIHRoZSBvYmplY3QgZm9yd2FyZGVkIHRvIGBwcmVwYXJlYC4gKi9cbiAgZnVuY3Rpb24gYnVpbGRQcmVwYXJlUXVlcnlJbnB1dChzdGF0ZTogUGFyc2VkU2VhcmNoU3RhdGUpOiBQcmVwYXJlUXVlcnlJbnB1dCB7XG4gICAgcmV0dXJuIHN0YXRlLnF1ZXJ5O1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIHJvdXRlIGVudHJ5IHdpdGggYSBmcmVzaGx5IGNhbGN1bGF0ZWQgYWN0aXZlIGxvYWQgc3RhdGUuICovXG4gIGZ1bmN0aW9uIHdpdGhMb2FkU3RhdGUoXG4gICAgZW50cnk6IE9taXQ8Um91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sICdhY3RpdmVMb2FkU3RhdGUnIHwgJ2xvYWRTdGF0ZSc+LFxuICApOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiB7XG4gICAgY29uc3QgeyBhY3RpdmVMb2FkU3RhdGUsIGxvYWRTdGF0ZSB9ID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgZW50cnkucHJlcGFyZWRNYXRjaCxcbiAgICAgIGxvYWRTdGF0ZVZlcnNpb24sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZW50cnksXG4gICAgICBhY3RpdmVMb2FkU3RhdGUsXG4gICAgICBsb2FkU3RhdGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjdGl2ZSByb3V0ZSBsb2FkIHN0YXRlIGNoYW5nZWQgaW4gYSBtZWFuaW5nZnVsIHdheS4gKi9cbiAgZnVuY3Rpb24gaXNTYW1lQWN0aXZlTG9hZFN0YXRlKFxuICAgIGN1cnJlbnQ6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZSxcbiAgICBuZXh0OiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjdXJyZW50LnN0YXR1cyA9PT0gbmV4dC5zdGF0dXMgJiZcbiAgICAgIGN1cnJlbnQucGVuZGluZ0NvdW50ID09PSBuZXh0LnBlbmRpbmdDb3VudCAmJlxuICAgICAgY3VycmVudC5yZWplY3RlZENvdW50ID09PSBuZXh0LnJlamVjdGVkQ291bnRcbiAgICApO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIHNuYXBzaG90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHJvdXRlciBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gYnVpbGRFbnRyeVNuYXBzaG90KFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PixcbiAgKTogUm91dGVyRW50cnlTbmFwc2hvdCB7XG4gICAgY29uc3QgcHJlcGFyZWRTZWdtZW50cyA9IGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBzZWdtZW50LnBhdGgsXG4gICAgICAgIGZ1bGxQYXRoOiBzZWdtZW50LmZ1bGxQYXRoLFxuICAgICAgICBzZWdtZW50S2V5OiBzZWdtZW50LnNlZ21lbnRLZXksXG4gICAgICAgIHBhcmFtTmFtZXM6IHNlZ21lbnQucGFyYW1OYW1lcyxcbiAgICAgICAgc2VnbWVudEluZGV4OiBzZWdtZW50LnNlZ21lbnRJbmRleCxcbiAgICAgICAgcm91dGVOb2RlOiBzZWdtZW50LnJvdXRlTm9kZSxcbiAgICAgICAgcHJlcGFyZWRSZXNvdXJjZTogc2VnbWVudC5wcmVwYXJlZFJlc291cmNlLFxuICAgICAgICBwcmVwYXJlZEh5ZHJhdGlvbjogc2VnbWVudC5wcmVwYXJlZEh5ZHJhdGlvbixcbiAgICAgICAgcmVuZGVyOiBzZWdtZW50LnJlbmRlcixcbiAgICAgICAgcmVkaXJlY3RUbzogc2VnbWVudC5yZWRpcmVjdFRvLFxuICAgICAgICByZWRpcmVjdFN0YXR1czogc2VnbWVudC5yZWRpcmVjdFN0YXR1cyxcbiAgICAgICAgcmVzb3VyY2VQYWdlOiBzZWdtZW50LnJlc291cmNlUGFnZSxcbiAgICAgICAgc3VzcGVuc2VCb3VuZGFyeTogc2VnbWVudC5zdXNwZW5zZUJvdW5kYXJ5LFxuICAgICAgICBmYWxsYmFjazogc2VnbWVudC5mYWxsYmFjayxcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHNlZ21lbnQuaGlnaGxpZ2h0SWQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBzZWdtZW50LnF1ZXJ5U2NoZW1hLFxuICAgICAgICBwcmVwYXJlZFN0YXR1czogc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRTdGF0dXMoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGVudHJ5LmxvY2F0aW9uKSxcbiAgICAgIHJhd1NlYXJjaDogZW50cnkucmF3U2VhcmNoLFxuICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChlbnRyeSksXG4gICAgICBwYXJhbXM6IGVudHJ5LnJvdXRlPy5wYXJhbXMsXG4gICAgICBxdWVyeTogZW50cnkucXVlcnksXG4gICAgICBwcmVwYXJlZE1hdGNoOiB7XG4gICAgICAgIHNlZ21lbnRzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZTogZW50cnkuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiBlbnRyeS5sb2FkU3RhdGUsXG4gICAgICBmaWx0ZXJzOiBlbnRyeS5maWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgYWN0aXZlUXVlcnlTY2hlbWE6IGVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hLFxuICAgICAgZm9yY2VSZXJlbmRlcjogZW50cnkuZm9yY2VSZXJlbmRlcixcbiAgICAgIHN0YXR1czogZW50cnkuc3RhdHVzLFxuICAgIH07XG4gIH1cblxuICAvKiogTm90aWZpZXMgaW5zdHJ1bWVudGF0aW9ucyBvZiBhIG5ldyBhY3RpdmUgZW50cnkuICovXG4gIGZ1bmN0aW9uIG5vdGlmeUVudHJ5KGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHJlZ2lzdHJ5Lm5vdGlmeUVudHJ5Q2hhbmdlKGJ1aWxkRW50cnlTbmFwc2hvdChlbnRyeSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgYSBkZWR1cGxpY2F0aW9uIGtleSBmb3IgcHJlbG9hZCBldmVudHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZEtleShcbiAgICBtb2RlOiBSb3V0ZXJQcmVsb2FkTW9kZVZhbHVlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgc2VhcmNoID0gJycsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke21vZGV9OiR7cGF0aG5hbWV9JHtzZWFyY2h9YDtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBub3JtYWxpemVkIGxvb2t1cCBrZXkgZm9yIHByZXBhcmVkIGZ1bGwtcm91dGUgcHJlbG9hZHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkocGF0aG5hbWU6IHN0cmluZywgc2VhcmNoID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRobmFtZX0ke3NlYXJjaH1gO1xuICB9XG5cbiAgLyoqIENvbXBhcmVzIHBhdGggcGFyYW1ldGVyIHZhbHVlcywgaW5jbHVkaW5nIHdpbGRjYXJkIGFycmF5cy4gKi9cbiAgZnVuY3Rpb24gaXNQYXJhbVZhbHVlRXF1YWwoXG4gICAgbGVmdDogUGFyYW1EYXRhW3N0cmluZ10sXG4gICAgcmlnaHQ6IFBhcmFtRGF0YVtzdHJpbmddLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxlZnQpIHx8ICFBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gcmlnaHRbaW5kZXhdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdHdvIG1hdGNoZWQgcm91dGUgc25hcHNob3RzIGRlc2NyaWJlIHRoZSBzYW1lIHJvdXRlIGFuZCBwYXJhbXMuICovXG4gIGZ1bmN0aW9uIGFyZU1hdGNoZWRSb3V0ZXNFcXVpdmFsZW50KFxuICAgIGxlZnQ6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbCxcbiAgICByaWdodDogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnQucm91dGUgIT09IHJpZ2h0LnJvdXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobGVmdC5wYXJhbXMpO1xuICAgIGNvbnN0IHJpZ2h0S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmlnaHQucGFyYW1zKSk7XG4gICAgaWYgKGxlZnRFbnRyaWVzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnRFbnRyaWVzLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiByaWdodEtleXMuaGFzKGtleSkgJiYgaXNQYXJhbVZhbHVlRXF1YWwodmFsdWUsIHJpZ2h0LnBhcmFtc1trZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHByZWxvYWQgb3IgcHJlbG9hZC1jb2RlIGluc3RydW1lbnRhdGlvbiBldmVudC4gKi9cbiAgZnVuY3Rpb24gZW1pdFByZWxvYWRFdmVudChcbiAgICBtb2RlOiAnY29kZScgfCAnZnVsbCcsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRQcmVsb2FkS2V5KG1vZGUsIHBhdGhuYW1lLCBzZWFyY2gpO1xuICAgIGNvbnN0IHJlY2VudGx5UmVjb3JkZWQgPVxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgIT09IG51bGwgJiZcbiAgICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlLmtleSA9PT0ga2V5ICYmXG4gICAgICBub3cgLSBsYXN0UHJlbG9hZFNpZ25hdHVyZS50aW1lc3RhbXAgPCA1MDtcblxuICAgIGlmICghcmVjZW50bHlSZWNvcmRlZCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3ByZWxvYWQnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgbW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0geyBrZXksIHRpbWVzdGFtcDogbm93IH07XG4gIH1cblxuICAvKiogRW1pdHMgYSBoaXN0b3J5IG11dGF0aW9uIGV2ZW50IChwdXNoL3JlcGxhY2Uvbm9ybWFsaXplKS4gKi9cbiAgZnVuY3Rpb24gZW1pdEhpc3RvcnlFdmVudChcbiAgICBhY3Rpb246IFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICAgbG9jYXRpb246IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nOyBoYXNoPzogc3RyaW5nIH0sXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHNvdXJjZTtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2hpc3RvcnknLFxuICAgICAgc291cmNlLFxuICAgICAgYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKSxcbiAgICAgIGRldGFpbHMsXG4gICAgfSk7XG4gIH1cblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZy5cbiAgY29uc3QgZmxhdFJvdXRlcyA9IGJ1aWxkUm91dGVzKHJvdXRlcyk7XG5cbiAgLyoqIFNlcmlhbGl6ZXMgYSByZWRpcmVjdCB1c2luZyB0aGUgZGVzdGluYXRpb24gcm91dGUncyBxdWVyeSBzY2hlbWEuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUmVkaXJlY3RTZWFyY2goaW5wdXQ6IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHF1ZXJ5PzogVW5rbm93blF1ZXJ5U2hhcGU7XG4gICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICB9KTogc3RyaW5nIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvblJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICBwYXRobmFtZTogaW5wdXQucGF0aG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1aWxkRGVzdGluYXRpb25TZWFyY2goe1xuICAgICAgZmlsdGVyczogaW5wdXQuZmlsdGVycyxcbiAgICAgIHF1ZXJ5OiBpbnB1dC5xdWVyeSxcbiAgICAgIHF1ZXJ5U2NoZW1hOiByZWFkQWN0aXZlUXVlcnlTY2hlbWEoZGVzdGluYXRpb25Sb3V0ZSksXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVwbGFjZXMgYnJvd3NlciBoaXN0b3J5IGZvciBhIHVuaXZlcnNhbCByZWRpcmVjdCByb3V0ZSBvciBwcmVwYXJhdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVdpdGhSZWRpcmVjdChcbiAgICByZWRpcmVjdFRvOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBSb3V0ZXJSZWRpcmVjdFN0YXR1cyxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRMb2NhdGlvbiA9IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pO1xuICAgIGNvbnN0IGN1cnJlbnRIcmVmID0gYGh0dHA6Ly9wbHVtaWxlLmxvY2FsJHtjdXJyZW50TG9jYXRpb24ucGF0aG5hbWV9JHtjdXJyZW50TG9jYXRpb24uc2VhcmNofSR7Y3VycmVudExvY2F0aW9uLmhhc2h9YDtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHJlc29sdmVSb3V0ZXJEZXN0aW5hdGlvbih7XG4gICAgICBkZXN0aW5hdGlvbjogcmVkaXJlY3RUbyxcbiAgICAgIGN1cnJlbnRIcmVmLFxuICAgICAgYnVpbGRTZWFyY2g6IGJ1aWxkUmVkaXJlY3RTZWFyY2gsXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0ge1xuICAgICAgcGF0aG5hbWU6IGRlc3RpbmF0aW9uLnBhdGhuYW1lLFxuICAgICAgc2VhcmNoOiBkZXN0aW5hdGlvbi5zZWFyY2gsXG4gICAgICBoYXNoOiBkZXN0aW5hdGlvbi5oYXNoLFxuICAgIH07XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGAke2N1cnJlbnRMb2NhdGlvbi5wYXRobmFtZX0ke2N1cnJlbnRMb2NhdGlvbi5zZWFyY2h9JHtjdXJyZW50TG9jYXRpb24uaGFzaH1gO1xuICAgIGNvbnN0IG5leHRUYXJnZXQgPSBgJHt0YXJnZXQucGF0aG5hbWV9JHt0YXJnZXQuc2VhcmNofSR7dGFyZ2V0Lmhhc2h9YDtcbiAgICBpZiAoY3VycmVudFRhcmdldCA9PT0gbmV4dFRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZXIgcmVkaXJlY3QgbG9vcDogJHtuZXh0VGFyZ2V0fWApO1xuICAgIH1cbiAgICBlbWl0SGlzdG9yeUV2ZW50KCdyZXBsYWNlJywgc291cmNlLCB0YXJnZXQsIHtcbiAgICAgIHRyaWdnZXI6ICdyZWRpcmVjdCcsXG4gICAgICByZWRpcmVjdFN0YXR1czogc3RhdHVzLFxuICAgIH0pO1xuICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgIC4uLnRhcmdldCxcbiAgICAgIGRlYnVnQ29udGV4dDoge1xuICAgICAgICBvcmlnaW46IHNvdXJjZSxcbiAgICAgICAgdHJpZ2dlcjogJ3JlZGlyZWN0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogRWFnZXJseSBzdGFydHMgZXZlcnkgcmVzb3VyY2UgaW4gYSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMoXG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXSxcbiAgKTogdm9pZCB7XG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZC5zZWdtZW50cy5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgICAgaWYgKHJvdXRlLnByZXBhcmVkUmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJvdXRlLnByZXBhcmVkUmVzb3VyY2UubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBjYWNoZWQgZnVsbCBwcmVsb2FkIGlmIGl0IGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gY29uc3VtZVByZWxvYWRlZE1hdGNoKGlucHV0OiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBjb250ZXh0OiBUQ29udGV4dDtcbiAgICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgfSk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoaW5wdXQucGF0aG5hbWUsIGlucHV0LnNlYXJjaCk7XG4gICAgY29uc3QgY2FjaGVkID0gcHJlbG9hZGVkTWF0Y2hlcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHByZWxvYWRlZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkLmNvbnRleHQgIT09IGlucHV0LmNvbnRleHQgfHxcbiAgICAgICFhcmVNYXRjaGVkUm91dGVzRXF1aXZhbGVudChjYWNoZWQucm91dGUsIGlucHV0LnJvdXRlKSB8fFxuICAgICAgY2FjaGVkLnF1ZXJ5U2NoZW1hICE9PSBpbnB1dC5xdWVyeVNjaGVtYSB8fFxuICAgICAgY2FjaGVkLnNlYXJjaCAhPT0gaW5wdXQuc2VhcmNoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkLnByZXBhcmVkTWF0Y2g7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3QgbWF0Y2hlZEluaXRpYWxSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbERlY2xhcmF0aXZlUmVkaXJlY3QgPSBtYXRjaGVkSW5pdGlhbFJvdXRlPy5yb3V0ZS5yZWRpcmVjdFRvO1xuICBjb25zdCBpbml0aWFsRGVjbGFyYXRpdmVSZWRpcmVjdFN0YXR1cyA9XG4gICAgbWF0Y2hlZEluaXRpYWxSb3V0ZT8ucm91dGUucmVkaXJlY3RTdGF0dXMgPz8gMzAyO1xuICBpZiAoaW5pdGlhbERlY2xhcmF0aXZlUmVkaXJlY3QgIT0gbnVsbCkge1xuICAgIHJlcGxhY2VXaXRoUmVkaXJlY3QoXG4gICAgICBpbml0aWFsRGVjbGFyYXRpdmVSZWRpcmVjdCxcbiAgICAgIGluaXRpYWxEZWNsYXJhdGl2ZVJlZGlyZWN0U3RhdHVzLFxuICAgICAgJ2V4dGVybmFsJyxcbiAgICApO1xuICB9XG4gIGxldCByb3V0ZSA9IG1hdGNoZWRJbml0aWFsUm91dGU7XG4gIGlmIChpbml0aWFsRGVjbGFyYXRpdmVSZWRpcmVjdCAhPSBudWxsKSB7XG4gICAgcm91dGUgPSBudWxsO1xuICB9XG4gIGNvbnN0IGluaXRpYWxVbmlmaWVkU2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKHJvdXRlKTtcbiAgY29uc3QgaW5pdGlhbFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgKTtcbiAgY29uc3Qgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMoXG4gICAgaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICk7XG4gIGNvbnN0IGluaXRpYWxMb2NhdGlvblNuYXBzaG90ID0gbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbik7XG4gIGxldCBoeWRyYXRpb25WYWx1ZXM6IE1hcDxzdHJpbmcsIFJvdXRlckpzb25WYWx1ZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmh5ZHJhdGlvblNuYXBzaG90ICE9IG51bGwpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IG9wdGlvbnMuaHlkcmF0aW9uU25hcHNob3Q7XG4gICAgY29uc3Qgc25hcHNob3RWZXJzaW9uOiB1bmtub3duID0gc25hcHNob3QudmVyc2lvbjtcbiAgICBjb25zdCBzbmFwc2hvdFNlZ21lbnRzOiB1bmtub3duID0gc25hcHNob3Quc2VnbWVudHM7XG4gICAgaWYgKHNuYXBzaG90VmVyc2lvbiAhPT0gMSB8fCAhQXJyYXkuaXNBcnJheShzbmFwc2hvdFNlZ21lbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb3V0ZXIgaHlkcmF0aW9uIHNuYXBzaG90IGlzIG1hbGZvcm1lZCcpO1xuICAgIH1cbiAgICBjb25zdCBzbmFwc2hvdExvY2F0aW9uID0gbm9ybWFsaXplTG9jYXRpb24oc25hcHNob3QubG9jYXRpb24pO1xuICAgIGlmIChcbiAgICAgIHNuYXBzaG90TG9jYXRpb24ucGF0aG5hbWUgIT09IGluaXRpYWxMb2NhdGlvblNuYXBzaG90LnBhdGhuYW1lIHx8XG4gICAgICBzbmFwc2hvdExvY2F0aW9uLnNlYXJjaCAhPT0gaW5pdGlhbExvY2F0aW9uU25hcHNob3Quc2VhcmNoIHx8XG4gICAgICBzbmFwc2hvdExvY2F0aW9uLmhhc2ggIT09IGluaXRpYWxMb2NhdGlvblNuYXBzaG90Lmhhc2hcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JvdXRlciBoeWRyYXRpb24gbG9jYXRpb24gZG9lcyBub3QgbWF0Y2ggdGhlIGluaXRpYWwgbG9jYXRpb24nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlckpzb25WYWx1ZT4oKTtcbiAgICBoeWRyYXRpb25WYWx1ZXMgPSB2YWx1ZXM7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBzbmFwc2hvdFNlZ21lbnRzIGFzIHVua25vd25bXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBzZWdtZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBzZWdtZW50ID09IG51bGwgfHxcbiAgICAgICAgISgncHJlcGFyZWQnIGluIHNlZ21lbnQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb3V0ZXIgaHlkcmF0aW9uIHNuYXBzaG90IGlzIG1hbGZvcm1lZCcpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VnbWVudFJlY29yZCA9IHNlZ21lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBzZWdtZW50S2V5ID0gc2VnbWVudFJlY29yZC5rZXk7XG4gICAgICBpZiAodHlwZW9mIHNlZ21lbnRLZXkgIT09ICdzdHJpbmcnIHx8IHNlZ21lbnRLZXkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm91dGVyIGh5ZHJhdGlvbiBzbmFwc2hvdCBpcyBtYWxmb3JtZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZXMuaGFzKHNlZ21lbnRLZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHJvdXRlciBoeWRyYXRpb24gc2VnbWVudDogJHtzZWdtZW50S2V5fWApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0Um91dGVySnNvblZhbHVlKHNlZ21lbnRSZWNvcmQucHJlcGFyZWQpO1xuICAgICAgdmFsdWVzLnNldChzZWdtZW50S2V5LCBzZWdtZW50UmVjb3JkLnByZXBhcmVkKTtcbiAgICB9KTtcbiAgfVxuICBsZXQgaW5pdGlhbEluc3RydW1lbnRhdGlvbjpcbiAgICB8IHtcbiAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4gdm9pZDtcbiAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKHJvdXRlICE9IG51bGwpIHtcbiAgICBpbml0aWFsSW5zdHJ1bWVudGF0aW9uID0ge1xuICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHNvdXJjZTogbGFzdE5hdmlnYXRpb25PcmlnaW4sXG4gICAgICBsb2NhdGlvbjogaW5pdGlhbExvY2F0aW9uU25hcHNob3QsXG4gICAgfTtcbiAgfVxuICBjb25zdCBpbml0aWFsQ29udGV4dCA9IHJlc29sdmVDb250ZXh0KCk7XG4gIGNvbnN0IGh5ZHJhdGlvbkNvbnN1bWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGxldCBoeWRyYXRpb246XG4gICAgeyB2YWx1ZXM6IE1hcDxzdHJpbmcsIFJvdXRlckpzb25WYWx1ZT47IGNvbnN1bWVkOiBTZXQ8c3RyaW5nPiB9IHwgdW5kZWZpbmVkO1xuICBpZiAoaHlkcmF0aW9uVmFsdWVzICE9IG51bGwpIHtcbiAgICBoeWRyYXRpb24gPSB7IHZhbHVlczogaHlkcmF0aW9uVmFsdWVzLCBjb25zdW1lZDogaHlkcmF0aW9uQ29uc3VtZWQgfTtcbiAgfVxuICBsZXQgcHJlcGFyZWRNYXRjaDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXTtcbiAgdHJ5IHtcbiAgICBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgcm91dGUsXG4gICAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KHtcbiAgICAgICAgLi4uaW5pdGlhbFNlYXJjaFN0YXRlLFxuICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICAgIH0pLFxuICAgICAgaW5pdGlhbEluc3RydW1lbnRhdGlvbixcbiAgICAgIGluaXRpYWxDb250ZXh0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICByYXdRdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICAgIH0sXG4gICAgICBoeWRyYXRpb24sXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEh0dHBSZWRpcmVjdCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXBsYWNlV2l0aFJlZGlyZWN0KGVycm9yLnJlZGlyZWN0VG8sIGVycm9yLnN0YXR1c0NvZGUsICdleHRlcm5hbCcpO1xuICAgIHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gobnVsbCk7XG4gIH1cbiAgaWYgKGh5ZHJhdGlvblZhbHVlcyAhPSBudWxsKSB7XG4gICAgaHlkcmF0aW9uVmFsdWVzLmZvckVhY2goKF92YWx1ZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ1NlZ21lbnRzID0gcHJlcGFyZWRNYXRjaC5zZWdtZW50cy5maWx0ZXIoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnQuc2VnbWVudEtleSA9PT0ga2V5O1xuICAgICAgfSk7XG4gICAgICBpZiAobWF0Y2hpbmdTZWdtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJvdXRlciBoeWRyYXRpb24gc2VnbWVudDogJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hpbmdTZWdtZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbWJpZ3VvdXMgcm91dGVyIGh5ZHJhdGlvbiBzZWdtZW50OiAke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICghaHlkcmF0aW9uQ29uc3VtZWQuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZXIgaHlkcmF0aW9uIHNlZ21lbnQgd2FzIG5vdCBjb25zdW1lZDogJHtrZXl9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbFByZXBhcmVSZWRpcmVjdCA9IHByZXBhcmVkTWF0Y2guc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4gc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRFcnJvcigpO1xuICAgIH0pXG4gICAgLmZpbmQoKGVycm9yKTogZXJyb3IgaXMgSHR0cFJlZGlyZWN0ID0+IHtcbiAgICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEh0dHBSZWRpcmVjdDtcbiAgICB9KTtcbiAgaWYgKGluaXRpYWxQcmVwYXJlUmVkaXJlY3QgIT0gbnVsbCkge1xuICAgIHJlcGxhY2VXaXRoUmVkaXJlY3QoXG4gICAgICBpbml0aWFsUHJlcGFyZVJlZGlyZWN0LnJlZGlyZWN0VG8sXG4gICAgICBpbml0aWFsUHJlcGFyZVJlZGlyZWN0LnN0YXR1c0NvZGUsXG4gICAgICAnZXh0ZXJuYWwnLFxuICAgICk7XG4gICAgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChudWxsKTtcbiAgfVxuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgU3Vic2NyaWJlQ2FsbGJhY2s8UGFyYW1EYXRhLCBSb3V0ZXJRdWVyeVNjaGVtYSwgVENvbnRleHQ+XG4gID4oKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gd2l0aExvYWRTdGF0ZSh7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgICBzdGF0dXM6IHJlYWRSZW5kZXJTdGF0dXMocm91dGUpLFxuICAgIG5hdmlnYXRpb246IGhpc3RvcnkubmF2aWdhdGlvbixcbiAgfSk7XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGlmIChcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMubm9ybWFsaXplZCAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyAhPSBudWxsXG4gICkge1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnM7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHdpdGhMb2FkU3RhdGUoe1xuICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgIGxvY2F0aW9uOiB7IC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbiwgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoIH0sXG4gICAgICAgIHJhd1NlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgYWN0aXZlIHJvdXRlIGxvYWQtc3RhdGUgZXZlbnQuICovXG4gIGZ1bmN0aW9uIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2FjdGl2ZS1sb2FkLXN0YXRlJyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihlbnRyeS5sb2NhdGlvbiksXG4gICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGVudHJ5KSxcbiAgICAgIHN0YXR1czogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnN0YXR1cyxcbiAgICAgIHBlbmRpbmdDb3VudDogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnBlbmRpbmdDb3VudCxcbiAgICAgIHJlamVjdGVkQ291bnQ6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5yZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbjogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogTm90aWZpZXMgUmVhY3Qgc3Vic2NyaWJlcnMgYW5kIGluc3RydW1lbnRhdGlvbiBlbnRyeSBvYnNlcnZlcnMuICovXG4gIGZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhlbnRyeSk7XG4gICAgfSk7XG4gICAgbm90aWZ5RW50cnkoZW50cnkpO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgYWN0aXZlIGVudHJ5IGFmdGVyIGEgcm91dGUgcmVzb3VyY2Ugc2V0dGxlcy4gKi9cbiAgZnVuY3Rpb24gcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShcbiAgICBlbnRyeUlkOiBudW1iZXIsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQgfHwgZW50cnlJZCAhPT0gYWN0aXZlRW50cnlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2gsXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgaXNTYW1lQWN0aXZlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeS5hY3RpdmVMb2FkU3RhdGUsIG5leHQuYWN0aXZlTG9hZFN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2FkU3RhdGVWZXJzaW9uICs9IDE7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2gsXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlOiByZWZyZXNoZWQuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiByZWZyZXNoZWQubG9hZFN0YXRlLFxuICAgIH07XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoY3VycmVudEVudHJ5KTtcbiAgICBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoY3VycmVudEVudHJ5LCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqIE9ic2VydmVzIHBlbmRpbmcgcmVzb3VyY2VzIGZvciB0aGUgYWN0aXZlIGVudHJ5IGFuZCByZXB1Ymxpc2hlcyBvbiBzZXR0bGUuICovXG4gIGZ1bmN0aW9uIG9ic2VydmVBY3RpdmVFbnRyeUxvYWQoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICAgIGVudHJ5SWQ6IG51bWJlcixcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgICAgaWYgKHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZT8uZ2V0U3RhdHVzKCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVdpdGhSZWRpcmVjdChlcnJvci5yZWRpcmVjdFRvLCBlcnJvci5zdGF0dXNDb2RlLCBzb3VyY2UpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWZyZXNoQWN0aXZlTG9hZFN0YXRlKGVudHJ5SWQsIHNvdXJjZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWdtZW50LnJlc291cmNlUGFnZT8uZ2V0U3RhdHVzKCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBzZWdtZW50LnJlc291cmNlUGFnZS5sb2FkKCkudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZWZyZXNoQWN0aXZlTG9hZFN0YXRlKGVudHJ5SWQsIHNvdXJjZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZWZyZXNoQWN0aXZlTG9hZFN0YXRlKGVudHJ5SWQsIHNvdXJjZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQdWJsaXNoZXMgYSBuZXcgYWN0aXZlIHJvdXRlIGVudHJ5IGFuZCBzdGFydHMgb2JzZXJ2aW5nIGl0cyByb3V0ZSB3b3JrLiAqL1xuICBmdW5jdGlvbiBwdWJsaXNoRW50cnkoaW5wdXQ6IHtcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD47XG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgIGVtaXRTbmFwc2hvdDogYm9vbGVhbjtcbiAgfSk6IHZvaWQge1xuICAgIGFjdGl2ZUVudHJ5SWQgKz0gMTtcbiAgICBjdXJyZW50RW50cnkgPSBpbnB1dC5lbnRyeTtcbiAgICBub3RpZnlTdWJzY3JpYmVycyhpbnB1dC5lbnRyeSk7XG4gICAgZW1pdEFjdGl2ZUxvYWRTdGF0ZUV2ZW50KGlucHV0LmVudHJ5LCBpbnB1dC5zb3VyY2UpO1xuICAgIGlmIChpbnB1dC5lbWl0U25hcHNob3QpIHtcbiAgICAgIGVtaXRFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdzbmFwc2hvdCcsXG4gICAgICAgIHNvdXJjZTogaW5wdXQuc291cmNlLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihpbnB1dC5lbnRyeS5sb2NhdGlvbiksXG4gICAgICAgIHJvdXRlUGF0aDogcmVhZE1hdGNoZWRSb3V0ZVBhdGgoaW5wdXQuZW50cnkpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIG9ic2VydmVBY3RpdmVFbnRyeUxvYWQoaW5wdXQuZW50cnksIGFjdGl2ZUVudHJ5SWQsIGlucHV0LnNvdXJjZSk7XG4gIH1cblxuICBwdWJsaXNoRW50cnkoe1xuICAgIGVudHJ5OiBjdXJyZW50RW50cnksXG4gICAgc291cmNlOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgICBlbWl0U25hcHNob3Q6IHRydWUsXG4gIH0pO1xuXG4gIC8vIExpc3RlbiBmb3IgbG9jYXRpb24gY2hhbmdlcywgbWF0Y2ggdG8gdGhlIHJvdXRlIGVudHJ5LCBwcmVwYXJlIHRoZSBlbnRyeSxcbiAgLy8gYW5kIG5vdGlmeSBzdWJzY3JpYmVycy4gVGhpcyBwYXR0ZXJuIGVuc3VyZXMgdGhhdCBkYXRhLWxvYWRpbmdcbiAgLy8gb2NjdXJzICpvdXRzaWRlKiBvZiAtIGFuZCAqYmVmb3JlKiAtIHJlbmRlcmluZy5cbiAgY29uc3QgZGlzcG9zZUhpc3RvcnkgPSBoaXN0b3J5LnN1YnNjcmliZShcbiAgICAobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIsIGRlYnVnQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luID0gcmVzb2x2ZU5hdmlnYXRpb25PcmlnaW4oZGVidWdDb250ZXh0KTtcbiAgICAgIGxhc3ROYXZpZ2F0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgY29uc3QgbG9jYXRpb25QYXlsb2FkID0gbm9ybWFsaXplTG9jYXRpb24obG9jYXRpb24pO1xuXG4gICAgICBjb25zdCBkZWJ1Z0NvbnRleHRPcmlnaW4gPSBkZWJ1Z0NvbnRleHQ/Lm9yaWdpbjtcbiAgICAgIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgaGlzdG9yeURldGFpbHM6IHsgaGlzdG9yeUluZGV4OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWJ1Z0NvbnRleHQ/Lmhpc3RvcnlJbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBoaXN0b3J5RGV0YWlscyA9IHsgaGlzdG9yeUluZGV4OiBkZWJ1Z0NvbnRleHQuaGlzdG9yeUluZGV4IH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtYmFjaycgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1mb3J3YXJkJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLXVua25vd24nIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICkge1xuICAgICAgICAgIGxldCBkaXJlY3Rpb246ICdiYWNrJyB8ICdmb3J3YXJkJyB8ICd1bmtub3duJyA9ICd1bmtub3duJztcbiAgICAgICAgICBpZiAoZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtYmFjaycpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdiYWNrJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWZvcndhcmQnKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXRFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAncG9wc3RhdGUnLFxuICAgICAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgZGV0YWlsczogaGlzdG9yeURldGFpbHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2FtZVBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICAgIGlmICghZm9yY2VSZXJlbmRlciAmJiBzYW1lUGF0aG5hbWUgJiYgc2FtZVNlYXJjaCkge1xuICAgICAgICAvLyBOb3RoaW5nIGNoYW5nZWQgdGhhdCB3ZSBjYXJlIGFib3V0XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dENvbnRleHQgPSByZXNvbHZlQ29udGV4dCgpO1xuXG4gICAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgICAgLy8gS2VlcCB0aGUgZXhpc3RpbmcgcHJlcGFyZWRNYXRjaCB3aGVuIHBhdGhuYW1lIGlzIGlkZW50aWNhbCB0byBhdm9pZCByZWR1bmRhbnQgd29yay5cbiAgICAgIGxldCBuZXh0UHJlcGFyZWRNYXRjaCA9IGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoO1xuICAgICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgICAgaWYgKCFzYW1lUGF0aG5hbWUpIHtcbiAgICAgICAgbmV4dFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjbGFyYXRpdmVSZWRpcmVjdCA9IG5leHRSb3V0ZT8ucm91dGUucmVkaXJlY3RUbztcbiAgICAgIGlmIChkZWNsYXJhdGl2ZVJlZGlyZWN0ICE9IG51bGwpIHtcbiAgICAgICAgcmVwbGFjZVdpdGhSZWRpcmVjdChcbiAgICAgICAgICBkZWNsYXJhdGl2ZVJlZGlyZWN0LFxuICAgICAgICAgIG5leHRSb3V0ZT8ucm91dGUucmVkaXJlY3RTdGF0dXMgPz8gMzAyLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICAgIGNvbnN0IHF1ZXJ5U2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKG5leHRSb3V0ZSk7XG4gICAgICBjb25zdCBwYXJzZWRTZWFyY2hTdGF0ZSA9IHBhcnNlU2VhcmNoU3RhdGUobG9jYXRpb24uc2VhcmNoLCBxdWVyeVNjaGVtYSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsdGVycyA9IG5vcm1hbGl6ZVBhZ2VGaWx0ZXJzKHBhcnNlZFNlYXJjaFN0YXRlLmZpbHRlcnMpO1xuXG4gICAgICBjb25zdCBzaG91bGRSZXByZXBhcmUgPSBzaG91bGRQcmVwYXJlT25OYXZpZ2F0aW9uKHtcbiAgICAgICAgc2FtZVBhdGhuYW1lLFxuICAgICAgICBzYW1lU2VhcmNoLFxuICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChzaG91bGRSZXByZXBhcmUpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkTWF0Y2ggPSBjb25zdW1lUHJlbG9hZGVkTWF0Y2goe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgICBjb250ZXh0OiBuZXh0Q29udGV4dCxcbiAgICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5U2NoZW1hLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByZWxvYWRlZE1hdGNoICE9IG51bGwpIHtcbiAgICAgICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZWxvYWRlZE1hdGNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCB1cGRhdGVJbnN0cnVtZW50YXRpb246XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzb3VyY2U6IG9yaWdpbixcbiAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZXVzZVByZXBhcmVkU2VnbWVudHM6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlZ21lbnRzOiB0eXBlb2YgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHM7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNQYXJhbXM6IFBhcmFtRGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzYW1lU2VhcmNoOiBib29sZWFuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgICAgICAgcmV1c2VQcmVwYXJlZFNlZ21lbnRzID0ge1xuICAgICAgICAgICAgICBwcmV2aW91c1NlZ21lbnRzOiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cyxcbiAgICAgICAgICAgICAgcHJldmlvdXNQYXJhbXM6IGN1cnJlbnRFbnRyeS5yb3V0ZT8ucGFyYW1zLFxuICAgICAgICAgICAgICBzYW1lU2VhcmNoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgICAgICAgICAgIG5leHRSb3V0ZSxcbiAgICAgICAgICAgICAgYnVpbGRQcmVwYXJlUXVlcnlJbnB1dCh7XG4gICAgICAgICAgICAgICAgLi4ucGFyc2VkU2VhcmNoU3RhdGUsXG4gICAgICAgICAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHVwZGF0ZUluc3RydW1lbnRhdGlvbixcbiAgICAgICAgICAgICAgbmV4dENvbnRleHQsXG4gICAgICAgICAgICAgIHJldXNlUHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhd1F1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBIdHRwUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwbGFjZVdpdGhSZWRpcmVjdChlcnJvci5yZWRpcmVjdFRvLCBlcnJvci5zdGF0dXNDb2RlLCBvcmlnaW4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwcmVwYXJlUmVkaXJlY3QgPSBuZXh0UHJlcGFyZWRNYXRjaC5zZWdtZW50c1xuICAgICAgICAgICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRFcnJvcigpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maW5kKChlcnJvcik6IGVycm9yIGlzIEh0dHBSZWRpcmVjdCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEh0dHBSZWRpcmVjdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChwcmVwYXJlUmVkaXJlY3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVwbGFjZVdpdGhSZWRpcmVjdChcbiAgICAgICAgICAgICAgcHJlcGFyZVJlZGlyZWN0LnJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgIHByZXBhcmVSZWRpcmVjdC5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uICs9IDE7XG4gICAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gd2l0aExvYWRTdGF0ZSh7XG4gICAgICAgIGZvcmNlUmVyZW5kZXI6IGZvcmNlUmVyZW5kZXIgfHwgKHNhbWVQYXRobmFtZSAmJiAhc2FtZVNlYXJjaCksXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgICBwcmVwYXJlZE1hdGNoOiBuZXh0UHJlcGFyZWRNYXRjaCxcbiAgICAgICAgY29udGV4dDogbmV4dENvbnRleHQsXG4gICAgICAgIHJhd1NlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBxdWVyeTogcGFyc2VkU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICAgIGZpbHRlckRpYWdub3N0aWNzOiBwYXJzZWRTZWFyY2hTdGF0ZS5maWx0ZXJEaWFnbm9zdGljcyxcbiAgICAgICAgYWN0aXZlUXVlcnlTY2hlbWE6IHF1ZXJ5U2NoZW1hLFxuICAgICAgICBzdGF0dXM6IHJlYWRSZW5kZXJTdGF0dXMobmV4dFJvdXRlKSxcbiAgICAgICAgbmF2aWdhdGlvbjogaGlzdG9yeS5uYXZpZ2F0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWx0ZXJzLm5vcm1hbGl6ZWQgJiYgcXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgICBxdWVyeTogcGFyc2VkU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gbG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgbGV0IG5leHRTZWFyY2hTdHIgPSBub3JtYWxpemVkU2VhcmNoO1xuICAgICAgICAgIGlmICghbmV4dFNlYXJjaFN0ci5zdGFydHNXaXRoKCc/JykgJiYgbmV4dFNlYXJjaFN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0U2VhcmNoU3RyID0gYD8ke25leHRTZWFyY2hTdHJ9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHJlYXNvbjogJ3J1bnRpbWUtcGFnZS1jbGFtcCcgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0ID0ge1xuICAgICAgICAgICAgb3JpZ2luOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgaGFzaDogJycsXG4gICAgICAgICAgICBkZWJ1Z0NvbnRleHQ6IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjsgLy8gZWFybHk6IHN1YnNlcXVlbnQgc2V0IHdpbGwgdHJpZ2dlciByZXJ1blxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1Ymxpc2hFbnRyeSh7XG4gICAgICAgIGVudHJ5OiBuZXh0RW50cnksXG4gICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICBlbWl0U25hcHNob3Q6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuXG4gIC8qKiBOb3JtYWxpemVzIHVzZXItcHJvdmlkZWQgcHJlbG9hZCB0YXJnZXRzIGludG8gY29uc2lzdGVudCBzdHJ1Y3R1cmVzLiAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQcmVsb2FkVGFyZ2V0KHRhcmdldDogUHJlbG9hZFRhcmdldCk6IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgfSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRobmFtZSA9IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQucGF0aG5hbWUgPT09ICdzdHJpbmcnICYmIHRhcmdldC5wYXRobmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICBub3JtYWxpemVkUGF0aG5hbWUgPSB0YXJnZXQucGF0aG5hbWU7XG4gICAgfVxuXG4gICAgbGV0IG5vcm1hbGl6ZWRTZWFyY2ggPSAnJztcbiAgICBpZiAodHlwZW9mIHRhcmdldC5zZWFyY2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBub3JtYWxpemVkU2VhcmNoID0gdGFyZ2V0LnNlYXJjaDtcbiAgICB9XG5cbiAgICBsZXQgbm9ybWFsaXplZFNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdwcm9ncmFtbWF0aWMnO1xuICAgIGNvbnN0IG1hcHBlZFNvdXJjZSA9IG1hcE9yaWdpbih0YXJnZXQuc291cmNlKTtcbiAgICBpZiAobWFwcGVkU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5vcm1hbGl6ZWRTb3VyY2UgPSBtYXBwZWRTb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRobmFtZTogbm9ybWFsaXplZFBhdGhuYW1lLFxuICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgc291cmNlOiBub3JtYWxpemVkU291cmNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJlcGFyZWQgdmFsdWUgZm9yIHRoZSBmaXJzdCBhY3RpdmUgc2VnbWVudCBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSb3V0ZSBzZWdtZW50IHBhdGggb3IgZnVsbCBwYXRoIHRvIGluc3BlY3QuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVwYXJlZChwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cnkgPSBjdXJyZW50RW50cnk7XG4gICAgICBmb3IgKGNvbnN0IHByZXBhcmVkUm91dGUgb2YgZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cykge1xuICAgICAgICBpZiAocHJlcGFyZWRSb3V0ZS5wYXRoID09PSBwYXRoIHx8IHByZXBhcmVkUm91dGUuZnVsbFBhdGggPT09IHBhdGgpIHtcbiAgICAgICAgICByZXR1cm4gcHJlcGFyZWRSb3V0ZS5wcmVwYXJlZFJlc291cmNlPy5nZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXZlcnkgYWN0aXZlIHByZXBhcmVkIHNlZ21lbnQgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm91dGUgc2VnbWVudCBwYXRoIG9yIGZ1bGwgcGF0aCB0byBpbnNwZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlcGFyZWRTZWdtZW50cyhwYXRoOiBzdHJpbmcpOiBQcmVwYXJlZFJvdXRlU2VnbWVudFNuYXBzaG90W10ge1xuICAgIHJldHVybiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50c1xuICAgICAgLmZpbHRlcigocHJlcGFyZWRSb3V0ZSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJlcGFyZWRSb3V0ZS5wYXRoID09PSBwYXRoIHx8IHByZXBhcmVkUm91dGUuZnVsbFBhdGggPT09IHBhdGg7XG4gICAgICB9KVxuICAgICAgLm1hcCgocHJlcGFyZWRSb3V0ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhdGg6IHByZXBhcmVkUm91dGUucGF0aCxcbiAgICAgICAgICBmdWxsUGF0aDogcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCxcbiAgICAgICAgICBzZWdtZW50S2V5OiBwcmVwYXJlZFJvdXRlLnNlZ21lbnRLZXksXG4gICAgICAgICAgcGFyYW1OYW1lczogcHJlcGFyZWRSb3V0ZS5wYXJhbU5hbWVzLFxuICAgICAgICAgIHNlZ21lbnRJbmRleDogcHJlcGFyZWRSb3V0ZS5zZWdtZW50SW5kZXgsXG4gICAgICAgICAgcm91dGVOb2RlOiBwcmVwYXJlZFJvdXRlLnJvdXRlTm9kZSxcbiAgICAgICAgICBwcmVwYXJlZFJlc291cmNlOiBwcmVwYXJlZFJvdXRlLnByZXBhcmVkUmVzb3VyY2UsXG4gICAgICAgICAgcHJlcGFyZWRIeWRyYXRpb246IHByZXBhcmVkUm91dGUucHJlcGFyZWRIeWRyYXRpb24sXG4gICAgICAgICAgcmVkaXJlY3RUbzogcHJlcGFyZWRSb3V0ZS5yZWRpcmVjdFRvLFxuICAgICAgICAgIHJlZGlyZWN0U3RhdHVzOiBwcmVwYXJlZFJvdXRlLnJlZGlyZWN0U3RhdHVzLFxuICAgICAgICAgIHJlc291cmNlUGFnZTogcHJlcGFyZWRSb3V0ZS5yZXNvdXJjZVBhZ2UsXG4gICAgICAgICAgc3VzcGVuc2VCb3VuZGFyeTogcHJlcGFyZWRSb3V0ZS5zdXNwZW5zZUJvdW5kYXJ5LFxuICAgICAgICAgIGZhbGxiYWNrOiBwcmVwYXJlZFJvdXRlLmZhbGxiYWNrLFxuICAgICAgICAgIGhpZ2hsaWdodElkOiBwcmVwYXJlZFJvdXRlLmhpZ2hsaWdodElkLFxuICAgICAgICAgIHF1ZXJ5U2NoZW1hOiBwcmVwYXJlZFJvdXRlLnF1ZXJ5U2NoZW1hLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcXVlcnkgc2NoZW1hIGdvdmVybmluZyBhIG5hdmlnYXRpb24gZGVzdGluYXRpb24uICovXG4gIGZ1bmN0aW9uIHJlc29sdmVEZXN0aW5hdGlvblF1ZXJ5U2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBSb3V0ZXJRdWVyeVNjaGVtYSB7XG4gICAgY29uc3QgZGVzdGluYXRpb25Sb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgcGF0aG5hbWUsXG4gICAgfSk7XG4gICAgaWYgKGRlc3RpbmF0aW9uUm91dGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeS5hY3RpdmVRdWVyeVNjaGVtYTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRBY3RpdmVRdWVyeVNjaGVtYShkZXN0aW5hdGlvblJvdXRlKTtcbiAgfVxuXG4gIC8qKiBTZXJpYWxpemVzIG5hdmlnYXRpb24gc3RhdGUgd2l0aCB0aGUgZGVzdGluYXRpb24gcm91dGUgc2NoZW1hLiAqL1xuICBmdW5jdGlvbiBidWlsZE5hdmlnYXRpb25TZWFyY2goaW5wdXQ6IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHF1ZXJ5PzogVW5rbm93blF1ZXJ5U2hhcGU7XG4gICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICB9KTogc3RyaW5nIHtcbiAgICBjb25zdCBxdWVyeVNjaGVtYSA9IHJlc29sdmVEZXN0aW5hdGlvblF1ZXJ5U2NoZW1hKGlucHV0LnBhdGhuYW1lKTtcbiAgICByZXR1cm4gYnVpbGREZXN0aW5hdGlvblNlYXJjaCh7XG4gICAgICBmaWx0ZXJzOiBpbnB1dC5maWx0ZXJzLFxuICAgICAgcXVlcnk6IGlucHV0LnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWEsXG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgcm91dGVyIGNvbnRleHQgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gUmVhY3QgQ29udGV4dFxuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIGJ1aWxkU2VhcmNoKHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcXVlcnksXG4gICAgICBmaWx0ZXJzLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICB9KSB7XG4gICAgICByZXR1cm4gYnVpbGROYXZpZ2F0aW9uU2VhcmNoKHtcbiAgICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGhpc3RvcnksXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHRhcmdldCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGVtaXRQcmVsb2FkRXZlbnQoXG4gICAgICAgICdjb2RlJyxcbiAgICAgICAgbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICAgIG5vcm1hbGl6ZWQuc291cmNlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHRhcmdldCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGVtaXRQcmVsb2FkRXZlbnQoXG4gICAgICAgICdmdWxsJyxcbiAgICAgICAgbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICAgIG5vcm1hbGl6ZWQuc291cmNlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25TbmFwc2hvdDogUm91dGVyTG9jYXRpb25TbmFwc2hvdCA9IHtcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfTtcbiAgICAgIGxldCBpbnN0cnVtZW50YXRpb246XG4gICAgICAgIHwge1xuICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4gdm9pZDtcbiAgICAgICAgICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICAgICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWF0Y2hlcyAhPSBudWxsKSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbiA9IHtcbiAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlOiBub3JtYWxpemVkLnNvdXJjZSxcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25TbmFwc2hvdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZWxvYWRDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcbiAgICAgIGNvbnN0IHByZWxvYWRRdWVyeVNjaGVtYSA9IHJlYWRBY3RpdmVRdWVyeVNjaGVtYShtYXRjaGVzKTtcbiAgICAgIGNvbnN0IHByZWxvYWRTZWFyY2hTdGF0ZSA9IHBhcnNlU2VhcmNoU3RhdGUoXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBwcmVsb2FkUXVlcnlTY2hlbWEsXG4gICAgICApO1xuICAgICAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgYnVpbGRQcmVwYXJlUXVlcnlJbnB1dChwcmVsb2FkU2VhcmNoU3RhdGUpLFxuICAgICAgICBpbnN0cnVtZW50YXRpb24sXG4gICAgICAgIHByZWxvYWRDb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHtcbiAgICAgICAgICByYXdRdWVyeTogcHJlbG9hZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIGZpbHRlcnM6IHByZWxvYWRTZWFyY2hTdGF0ZS5maWx0ZXJzLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGxvYWRQcmVwYXJlZE1hdGNoUmVzb3VyY2VzKHByZXBhcmVkTWF0Y2gpO1xuICAgICAgY29uc3QgcHJlbG9hZEtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgKTtcbiAgICAgIHByZWxvYWRlZE1hdGNoZXMuc2V0KHByZWxvYWRLZXksIHtcbiAgICAgICAga2V5OiBwcmVsb2FkS2V5LFxuICAgICAgICBjb250ZXh0OiBwcmVsb2FkQ29udGV4dCxcbiAgICAgICAgcm91dGU6IG1hdGNoZXMsXG4gICAgICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBwcmVsb2FkUXVlcnlTY2hlbWEsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8qKiBSZW1vdmVzIHRoZSBzdWJzY3JpYmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB2aWEgc3Vic2NyaWJlLiAqL1xuICAgICAgZnVuY3Rpb24gZGlzcG9zZUNhbGxiYWNrKCkge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZUNhbGxiYWNrO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IG5hdkZpbHRlcnMsXG4gICAgICBoYXNoLFxuICAgICAgcmVwbGFjZSxcbiAgICB9OiB7XG4gICAgICBwYXRobmFtZT86IHN0cmluZztcbiAgICAgIHF1ZXJ5PzogVW5rbm93blF1ZXJ5U2hhcGU7XG4gICAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gICAgICBoYXNoPzogc3RyaW5nO1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGxldCB0YXJnZXRQYXRobmFtZSA9IHBhdGhuYW1lO1xuICAgICAgdGFyZ2V0UGF0aG5hbWUgPz89IGN1cnJlbnQubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgICAgIGNvbnN0IGZpbHRlcnNJbnB1dCA9IG5hdkZpbHRlcnMgPz8gY3VycmVudC5maWx0ZXJzO1xuICAgICAgY29uc3QgcmF3UXVlcnlJbnB1dDogVW5rbm93blF1ZXJ5U2hhcGUgfCBSYXdRdWVyeSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHF1ZXJ5ID8/IGN1cnJlbnQucXVlcnk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBidWlsZE5hdmlnYXRpb25TZWFyY2goe1xuICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgIGZpbHRlcnM6IGZpbHRlcnNJbnB1dCxcbiAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5SW5wdXQsXG4gICAgICB9KTtcbiAgICAgIGxldCBjdXJyZW50SHJlZjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBjdXJyZW50SHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgY29uc3QgcmVzb2x2ZWREZXN0aW5hdGlvbiA9IHJlc29sdmVSb3V0ZXJEZXN0aW5hdGlvbih7XG4gICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICBoYXNoOiBoYXNoID8/IGN1cnJlbnQubG9jYXRpb24uaGFzaCxcbiAgICAgICAgfSxcbiAgICAgICAgY3VycmVudEhyZWYsXG4gICAgICAgIGJ1aWxkU2VhcmNoOiBidWlsZE5hdmlnYXRpb25TZWFyY2gsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uT2JqID0ge1xuICAgICAgICBwYXRobmFtZTogcmVzb2x2ZWREZXN0aW5hdGlvbi5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiByZXNvbHZlZERlc3RpbmF0aW9uLnNlYXJjaCxcbiAgICAgICAgaGFzaDogcmVzb2x2ZWREZXN0aW5hdGlvbi5oYXNoLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdwcm9ncmFtbWF0aWMnO1xuICAgICAgY29uc3QgZGVidWdDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0ID0ge1xuICAgICAgICBvcmlnaW4sXG4gICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgfTtcblxuICAgICAgaWYgKHJlcGxhY2UgPT09IHRydWUpIHtcbiAgICAgICAgZW1pdEhpc3RvcnlFdmVudCgncmVwbGFjZScsIG9yaWdpbiwgbG9jYXRpb25PYmosIHtcbiAgICAgICAgICB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICAuLi5sb2NhdGlvbk9iaixcbiAgICAgICAgICBkZWJ1Z0NvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdEhpc3RvcnlFdmVudCgncHVzaCcsIG9yaWdpbiwgbG9jYXRpb25PYmosIHtcbiAgICAgICAgICB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGhpc3RvcnkucHVzaCh7XG4gICAgICAgICAgLi4ubG9jYXRpb25PYmosXG4gICAgICAgICAgZGVidWdDb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFByZXBhcmVkLFxuICAgIGdldFByZXBhcmVkU2VnbWVudHMsXG4gIH0gYXMgQ3JlYXRlUm91dGVyUmV0dXJuPFRDb250ZXh0LCBSPlsnY29udGV4dCddO1xuXG4gIC8qKiBSZWxlYXNlcyByb3V0ZXIgcmVzb3VyY2VzIGFuZCBkZXRhY2hlcyBhbGwgaW5zdHJ1bWVudGF0aW9ucy4gKi9cbiAgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm91dGVyRGlzcG9zZWQgPSB0cnVlO1xuICAgIGRpc3Bvc2VIaXN0b3J5KCk7XG4gICAgaGlzdG9yeS5kaXNwb3NlKCk7XG4gICAgc3Vic2NyaWJlcnMuY2xlYXIoKTtcbiAgICByZWdpc3RyeS5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBSZXR1cm4gYm90aCB0aGUgY29udGV4dCBvYmplY3QgYW5kIGEgY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4geyBjb250ZXh0LCBjbGVhbnVwIH07XG59XG4iXX0=