@firestitch/report 18.10.2 → 18.11.0

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 (81) hide show
  1. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -1
  2. package/app/reports/data/report.data.d.ts +8 -12
  3. package/app/reports/export/report-export-collector.service.d.ts +0 -1
  4. package/app/reports/export/report-filter-lines.d.ts +0 -2
  5. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +0 -2
  6. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -3
  7. package/app/reports/interfaces/report-saved-filter-changes.interface.d.ts +4 -0
  8. package/app/reports/interfaces/report-saved-filter.interface.d.ts +6 -0
  9. package/app/reports/interfaces/{report-view-config.interface.d.ts → report-state-snapshot.interface.d.ts} +1 -2
  10. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
  11. package/app/reports/report-chat-viewer-state.d.ts +3 -3
  12. package/app/reports/report-saved-filters.d.ts +3 -0
  13. package/app/reports/report-state.d.ts +15 -0
  14. package/app/reports/services/report-filter-state.service.d.ts +9 -25
  15. package/app/reports/tile-data-state.d.ts +5 -5
  16. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -5
  17. package/esm2022/app/reports/canvas-landing-page.mjs +3 -3
  18. package/esm2022/app/reports/components/component-list/component-list.component.mjs +3 -3
  19. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -12
  20. package/esm2022/app/reports/components/report-component/report-component.component.mjs +16 -21
  21. package/esm2022/app/reports/data/report.data.mjs +24 -41
  22. package/esm2022/app/reports/export/report-export-collector.service.mjs +11 -18
  23. package/esm2022/app/reports/export/report-filter-lines.mjs +5 -15
  24. package/esm2022/app/reports/filter-settings-rules.mjs +2 -2
  25. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  26. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  27. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  28. package/esm2022/app/reports/interfaces/report-saved-filter-changes.interface.mjs +2 -0
  29. package/esm2022/app/reports/interfaces/report-saved-filter.interface.mjs +2 -0
  30. package/esm2022/app/reports/interfaces/report-state-snapshot.interface.mjs +2 -0
  31. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  32. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +1 -1
  33. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
  34. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  35. package/esm2022/app/reports/mark-click.mjs +2 -2
  36. package/esm2022/app/reports/report-chat-viewer-state.mjs +3 -3
  37. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  38. package/esm2022/app/reports/report-saved-filters.mjs +92 -0
  39. package/esm2022/app/reports/report-state.mjs +169 -0
  40. package/esm2022/app/reports/report-viewer-features.mjs +2 -4
  41. package/esm2022/app/reports/services/report-filter-state.service.mjs +83 -310
  42. package/esm2022/app/reports/tile-data-state.mjs +4 -4
  43. package/esm2022/app/reports/tile-loads.mjs +5 -6
  44. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +165 -94
  45. package/esm2022/app/reports/views/report/report.component.mjs +14 -16
  46. package/esm2022/public_api.mjs +4 -8
  47. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs → firestitch-report-echarts-DKXlgu1D.mjs} +2 -2
  48. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs.map → firestitch-report-echarts-DKXlgu1D.mjs.map} +1 -1
  49. package/fesm2022/{firestitch-report-firestitch-report-DftB7M1o.mjs → firestitch-report-firestitch-report-Bnv62suw.mjs} +445 -1434
  50. package/fesm2022/firestitch-report-firestitch-report-Bnv62suw.mjs.map +1 -0
  51. package/fesm2022/firestitch-report.mjs +1 -1
  52. package/package.json +1 -1
  53. package/public_api.d.ts +3 -7
  54. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +0 -21
  55. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +0 -13
  56. package/app/reports/interfaces/report-view-create.interface.d.ts +0 -7
  57. package/app/reports/interfaces/report-view-deleted.interface.d.ts +0 -4
  58. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +0 -7
  59. package/app/reports/interfaces/report-view-dropped.interface.d.ts +0 -5
  60. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +0 -10
  61. package/app/reports/interfaces/report-view-summary.interface.d.ts +0 -11
  62. package/app/reports/interfaces/report-view.interface.d.ts +0 -7
  63. package/app/reports/interfaces/report-views.interface.d.ts +0 -7
  64. package/app/reports/report-view-config.d.ts +0 -34
  65. package/app/reports/report-view-menu.d.ts +0 -15
  66. package/app/reports/services/report-view.service.d.ts +0 -39
  67. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +0 -115
  68. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +0 -52
  69. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +0 -2
  70. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +0 -2
  71. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +0 -2
  72. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +0 -2
  73. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +0 -2
  74. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +0 -2
  75. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +0 -2
  76. package/esm2022/app/reports/interfaces/report-view.interface.mjs +0 -2
  77. package/esm2022/app/reports/interfaces/report-views.interface.mjs +0 -2
  78. package/esm2022/app/reports/report-view-config.mjs +0 -587
  79. package/esm2022/app/reports/report-view-menu.mjs +0 -119
  80. package/esm2022/app/reports/services/report-view.service.mjs +0 -218
  81. package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +0 -1
@@ -14,11 +14,10 @@ import { isTile } from '../report-tile';
14
14
  import { offeredViewerFeatures } from '../report-viewer-features';
15
15
  import { ReportFilterOptionsService } from '../services/report-filter-options.service';
16
16
  import { ReportFilterStateService } from '../services/report-filter-state.service';
17
- import { ReportViewService } from '../services/report-view.service';
18
17
  import { fillTitleTokens, textPlain } from '../text';
19
18
  import { tileDataState, valuesMatchAnyGroupIds } from '../tile-data-state';
20
19
  import { failedValueKeys, reportComponents, shownValues, textValues, valueKeys, } from '../values';
21
- import { exportLines, matchLineText, valuePicks, viewLineText } from './report-filter-lines';
20
+ import { exportLines, matchLineText, valuePicks } from './report-filter-lines';
22
21
  import * as i0 from "@angular/core";
23
22
  // How far a KPI card's rows shrink to fit a short tile. A tile shorter still
24
23
  // lets the card run past its foot rather than print it unreadably small.
@@ -292,20 +291,18 @@ function showsFailedValue(components, failed) {
292
291
  .flatMap((component) => valueKeys(component.config?.html)));
293
292
  return failed.some((key) => shown.has(key));
294
293
  }
295
- // The cover's filter lines: the open view, the export's filter lines, then
296
- // the match while the report bar's filters match any. A drilled chart's line
294
+ // The cover's filter lines: the export's filter lines, then the match while the report bar's filters match any. A drilled chart's line
297
295
  // is its title as the canvas header reads it (`titles`, by component id) and
298
296
  // the crumbs of the path its answer applied (the ones its title prints), not
299
297
  // the path the screen asked for: the server may have cut that path short or
300
298
  // refused it.
301
299
  export function coverFilterLines(snapshot, lines, pages, titles = {}) {
302
- const match = snapshot.features.includes('matchAny') ? matchLineText(snapshot.view.match, 'line') : null;
300
+ const match = snapshot.features.includes('matchAny') ? matchLineText(snapshot.state.match, 'line') : null;
303
301
  const drilled = pages
304
302
  .flatMap((page) => page.components)
305
303
  .filter((item) => !!item.crumbs?.length)
306
304
  .map((item) => crumbedTitle(titles[item.component.id] ?? item.component.title, item.crumbs));
307
305
  return [
308
- snapshot.viewLine,
309
306
  ...lines.filter((line) => line.kind !== 'drill').map((line) => line.text),
310
307
  ...drilled,
311
308
  match,
@@ -332,9 +329,6 @@ export class ReportExportCollectorService {
332
329
  _reportData = inject(ReportData);
333
330
  _filterState = inject(ReportFilterStateService);
334
331
  _filterOptions = inject(ReportFilterOptionsService);
335
- // The open saved view, for the cover's view line. Only a view that keeps
336
- // saved views provides it.
337
- _views = inject(ReportViewService, { optional: true });
338
332
  // listRows is how many rows each list fetches: the renderer's own cap, since
339
333
  // a PDF table continues onto extra pages and a slide table cannot.
340
334
  //
@@ -372,30 +366,29 @@ export class ReportExportCollectorService {
372
366
  };
373
367
  }));
374
368
  }
375
- // The screen as one export reads it: the view document, each group's value
369
+ // The screen as one export reads it: the state snapshot, each group's value
376
370
  // and live preset, each tile's filter entries and state (tileDataState),
377
- // each value's filter entries, the grain, the features served, the format
378
- // and the open view's line. A value's entries are read here too, so the
371
+ // each value's filter entries, the grain, the features served and the
372
+ // format. A value's entries are read here too, so the
379
373
  // numbers in a file's text are filtered as its tiles are, whatever the bar
380
374
  // does while the export runs.
381
375
  snapshot(report) {
382
- const view = this._filterState.snapshot();
376
+ const state = this._filterState.snapshot();
383
377
  const tiles = (report.pages ?? [])
384
378
  .flatMap((page) => page.components ?? [])
385
379
  .filter((component) => isTile(component));
386
380
  const values = reportComponents(report)
387
381
  .filter((component) => component.type === 'value');
388
382
  return {
389
- view,
383
+ state,
390
384
  ...this._groupValues(report),
391
385
  filters: Object.fromEntries(tiles.map((tile) => [tile.id, this._filterState.resolveForComponent(tile)])),
392
386
  valueFilters: Object.fromEntries(values
393
387
  .map((value) => [value.id, this._filterState.resolveForComponent(value)])),
394
- states: Object.fromEntries(tiles.map((tile) => [tile.id, tileDataState(report, tile, view)])),
388
+ states: Object.fromEntries(tiles.map((tile) => [tile.id, tileDataState(report, tile, state)])),
395
389
  frequency: this._filterState.frequency(),
396
390
  features: offeredViewerFeatures(report.viewerFeatures),
397
391
  formatContext: this._filterState.formatContext(),
398
- viewLine: viewLineText(this._views?.openView(), !!this._views?.viewChanged()),
399
392
  };
400
393
  }
401
394
  // How an export words the screen, over a snapshot (`pageId` for a This
@@ -544,7 +537,7 @@ export class ReportExportCollectorService {
544
537
  _pageValues(report, pageId, values, shown, snapshot) {
545
538
  const formatContext = snapshot.formatContext;
546
539
  const filters = values.flatMap((component) => snapshot.valueFilters[component.id] ?? []);
547
- const matchAnyGroupIds = valuesMatchAnyGroupIds(report, pageId, snapshot.view);
540
+ const matchAnyGroupIds = valuesMatchAnyGroupIds(report, pageId, snapshot.state);
548
541
  return this._reportData.pageValues(report.id, pageId, filters, true, { handlers: false }, matchAnyGroupIds)
549
542
  .pipe(map((rows) => new Map((rows ?? []).map((row) => [row.id, row]))), catchError(() => of(new Map())), map((rows) => ({
550
543
  values: textValues(values, { rows }, formatContext),
@@ -629,4 +622,4 @@ export class ReportExportCollectorService {
629
622
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
630
623
  type: Injectable
631
624
  }] });
632
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixxQkFBcUIsR0FDdEIsTUFBTSxXQUFXLENBQUM7QUFvQm5CLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsR0FDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVB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Q0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsaUVBQWlFO0lBQ2pFLEVBQUU7SUFDRix5RUFBeUU7SUFDekUsOEVBQThFO0lBQzlFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUscUVBQXFFO0lBQ3JFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDbkUsVUFBVSxDQUFDLE1BQWM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJELE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQ3pCLE1BQU0sRUFDTixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FDdEQ7YUFDRSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDcEQsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pELENBQUM7SUFDTixDQUFDO3dHQWpaVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgY3J1bWJlZFRpdGxlLCBkcmlsbENydW1iTGFiZWxzIH0gZnJvbSAnLi4vZHJpbGwtY3J1bWJzJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgbGF5ZXJGaWx0ZXJGaWVsZHMsIHRleHRGaWx0ZXJGaWVsZHMgfSBmcm9tICcuLi9maWx0ZXItdGV4dCc7XG5pbXBvcnQge1xuICBEQVlfTE9ORyxcbiAgZm9ybWF0TG9jYWxEYXRlLFxuICBmb3JtYXROdW1iZXIsXG4gIGZvcm1hdE91dHB1dFZhbHVlLFxuICBmb3JtYXRSZXBvcnREYXRlLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0TGluZXNJbnB1dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1saW5lcy1pbnB1dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtc25hcHNob3QuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydExvY2FsZVRhZyxcbiAgUmVwb3J0TWFzdGVyLFxuICBSZXBvcnRQYWdlLFxuICBSZXBvcnRQYWdlVmFsdWUsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBLcGlDYXJkVmlldyB9IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7XG4gIExJU1RfVE9UQUxfTEFCRUwsXG4gIExpc3RPdXRwdXRDb2x1bW4sXG4gIGxpc3RIaWRkZW5Db2x1bW5zLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFRvdGFsc0xhYmVsQ29sdW1uLFxufSBmcm9tICcuLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBwaXZvdENvbHVtblNwZWNzIH0gZnJvbSAnLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgY29tcG9uZW50Tm90ZUxpbmVzLCBjb21wb25lbnRXaW5kb3dzTGluZSB9IGZyb20gJy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBncm91cE9wdGlvbnNSZWFkZXIsIHJlc29sdmVPcHRpb25WYWx1ZXMgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7IG9mZmVyZWRWaWV3ZXJGZWF0dXJlcyB9IGZyb20gJy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7IFRleHRGaWx0ZXJGaWVsZCwgVGV4dFRva2VuQ29udGV4dCwgVGV4dFZhbHVlLCBmaWxsVGl0bGVUb2tlbnMsIHRleHRQbGFpbiB9IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHsgdGlsZURhdGFTdGF0ZSwgdmFsdWVzTWF0Y2hBbnlHcm91cElkcyB9IGZyb20gJy4uL3RpbGUtZGF0YS1zdGF0ZSc7XG5pbXBvcnQge1xuICBmYWlsZWRWYWx1ZUtleXMsIHJlcG9ydENvbXBvbmVudHMsIHNob3duVmFsdWVzLCB0ZXh0VmFsdWVzLCB2YWx1ZUtleXMsXG59IGZyb20gJy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB7IGV4cG9ydExpbmVzLCBtYXRjaExpbmVUZXh0LCB2YWx1ZVBpY2tzLCB2aWV3TGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbiAgLy8gVGhlIHRleHQgYSBsaXN0IHdhcyBzZWFyY2hlZCBieSB3aGVuIGl0IHdhcyBmZXRjaGVkOyBhYnNlbnQgd2hlbiBpdHNcbiAgLy8gc2VhcmNoIGJveCB3YXMgZW1wdHksIGFuZCBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBwbGFpbiBsaXN0LCB3aGljaCBpdHMgdGFibGUgbGVhdmVzXG4gIC8vIG91dCAobGlzdENvbHVtbnMpOyBlbXB0eSBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXTtcbiAgLy8gVGhlIGJyZWFkY3J1bWIgb2YgdGhlIGRyaWxsIHBhdGggYSBjaGFydCB3YXMgcmVhZCBhdCAodGhlIHBhdGggaXRzXG4gIC8vIGFuc3dlciBhcHBsaWVkKSwgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTsgYWJzZW50IGF0IHRoZSBjaGFydCdzIHRvcC5cbiAgY3J1bWJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUGFnZSB7XG4gIHBhZ2U6IFJlcG9ydFBhZ2U7XG4gIGNvbXBvbmVudHM6IENvbGxlY3RlZENvbXBvbmVudFtdO1xuICAvLyBXaGF0IHRoZSBwYWdlJ3MgdGV4dCBibG9ja3MgZmlsbCB0aGVpciB7e3ZhbHVlLjxrZXk+fX0gdG9rZW5zIHdpdGgsIGJ5IGtleVxuICAvLyAodGV4dFZhbHVlcyksIGFuZCB0aGUga2V5cyBvZiB0aGUgdmFsdWVzIGl0cyB0ZXh0IHNob3dzIHdob3NlIG51bWJlcnMgZGlkXG4gIC8vIG5vdCBjb21lIGJhY2s6IHRoZSByZXF1ZXN0IGZhaWxlZCwgb3IgdGhlIHZhbHVlJ3Mgb3duIHF1ZXJ5IGRpZC5cbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+O1xuICBmYWlsZWRWYWx1ZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFJlcG9ydCB7XG4gIHJlcG9ydDogUmVwb3J0O1xuICBwYWdlczogQ29sbGVjdGVkUGFnZVtdO1xuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIncyB2YWx1ZXMsIGFzIGEgcGFnZSdzOiByZWFkIG9uY2UgZm9yIHRoZSB3aG9sZVxuICAvLyBmaWxlLCBzaW5jZSBldmVyeSBwYWdlIHRoYXQgc2hvd3MgdGhlIG1hc3RlciBzaG93cyB0aGUgc2FtZSBudW1iZXJzLlxuICBtYXN0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIG1hc3RlckZhaWxlZFZhbHVlczogc3RyaW5nW107XG4gIC8vIFRoZSBmaWx0ZXIgbGluZXMgb2YgdGhlIHRpdGxlIHNsaWRlL3BhZ2UsIGluIG9yZGVyOiB0aGUgb3BlbiB2aWV3LCB0aGVcbiAgLy8gZXhwb3J0J3MgZmlsdGVyIGxpbmVzIChjb3ZlckZpbHRlckxpbmVzKSwgdGhlbiB0aGUgbWF0Y2ggd2hpbGUgaXQgaXNcbiAgLy8gJ2FueScuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IGVhY2gge3tmaWx0ZXIuPGlkPn19IHRva2VuIHByaW50cywgYnkgZmlsdGVyIGdyb3VwIGlkOiB0aGUgZmlsdGVyXG4gIC8vIGJhcidzIHZhbHVlcyBhcyB0aGUgc2NyZWVuIHdvcmRzIHRoZW0sIHJlYWQgb25jZSBzbyBldmVyeSBwYWdlIG9mIHRoZVxuICAvLyBmaWxlIGFncmVlcy4gRXZlcnkgZ3JvdXAnczogYSBwYWdlIHJlYWRzIGl0cyBvd24gKGxheWVyRmlsdGVyRmllbGRzKS5cbiAgZmlsdGVyRmllbGRzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSBhbmRcbiAgLy8gdGhlIGN1cnJlbmN5IHRoZSBzZXJ2ZXIgcmVzb2x2ZWQgZm9yIHRoZSByZXBvcnQuIEVhY2ggaXMgbGVmdCBvdXQgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGRvZXMgbm90IHNlbmQgaXQsIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlclxuICAvLyB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKGl0cyBsb2NhbGUsIGN1cnJlbmN5XG4gIC8vIGFuZCBwZXJjZW50IGZvcm0pLCByZWFkIG9uY2Ugc28gZXZlcnkgcGFnZSBvZiB0aGUgZmlsZSBhZ3JlZXMuXG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG59XG5cbi8vIEhvdyBhbiBleHBvcnQgd29yZHMgdGhlIHNjcmVlbiAoZXhwb3J0V29yZGluZyk6IHRoZSBmaWx0ZXIgbGluZXMgKHRoZVxuLy8gY292ZXIncywgYW5kIHRoZSB6aXAncyBub3RlcyksIHdoYXQgZWFjaCB7e2ZpbHRlci48aWQ+fX0gdG9rZW4gcHJpbnRzLCBieVxuLy8gZmlsdGVyIGdyb3VwIGlkLCBhbmQgZWFjaCB0aWxlJ3MgdGl0bGUgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQsIGJ5XG4vLyBjb21wb25lbnQgaWQsIHdoaWNoIHRoZSB6aXAgbmFtZXMgdGhlIHRpbGUncyBmaWxlIGFmdGVyLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRFeHBvcnRXb3JkaW5nIHtcbiAgbGluZXM6IFJlcG9ydEV4cG9ydExpbmVbXTtcbiAgZmlsdGVyRmllbGRzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICB0aXRsZXM6IFJlY29yZDxudW1iZXIsIHN0cmluZz47XG59XG5cbi8vIEEgdGV4dCBibG9jayB3aG9zZSB3b3JkcyBkbyBub3QgZml0IGl0cyBib3ggaW4gYSBidWlsdCBmaWxlOiB0aGUgYmxvY2ssIHRoZVxuLy8gcGFnZSB0aGUgb3ZlcmZsb3cgZ2F0ZSBuYW1lcyBpdCB1bmRlciAoSEVBREVSX0ZPT1RFUl9OQU1FIGZvciBhIGhlYWRlciBvclxuLy8gZm9vdGVyIGJsb2NrKSBhbmQgdGhlIHN0YXJ0IG9mIGl0cyB0ZXh0LCBzbyB0aGUgcmVhZGVyIGNhbiBmaW5kIGl0LlxuZXhwb3J0IGludGVyZmFjZSBUZXh0T3ZlcmZsb3cge1xuICBjb21wb25lbnRJZDogbnVtYmVyO1xuICBwYWdlOiBzdHJpbmc7XG4gIHNuaXBwZXQ6IHN0cmluZztcbn1cblxuLy8gQSBmaWxlIGJ1aWx0IGFuZCBub3QgeWV0IHNhdmVkLiBXaGV0aGVyIHRleHQgZml0cyBpdHMgYm94IGlzIGtub3duIG9ubHkgb25jZVxuLy8gdGhlIGZpbGUgaXMgYnVpbHQsIHNvIHRoZSBleHBvcnQgYXNrcyBhYm91dCB0aGUgb3ZlcmZsb3dzIGJldHdlZW4gdGhlIGJ1aWxkXG4vLyBhbmQgdGhlIHNhdmU6IGBvdmVyZmxvd05vdGVgIHNheXMgd2hhdCB0aGlzIGZvcm1hdCBkb2VzIHdpdGggc3VjaCB0ZXh0LCBhbmRcbi8vIGBzYXZlYCB3cml0ZXMgdGhlIGZpbGUuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0RXhwb3J0IHtcbiAgb3ZlcmZsb3dzOiBUZXh0T3ZlcmZsb3dbXTtcbiAgb3ZlcmZsb3dOb3RlOiBzdHJpbmc7XG4gIHNhdmU6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyBPbmUgZXhwb3J0ZWQgbGlzdCBjb2x1bW46IHRoZSBjZWxsIGtleSwgaXRzIGhlYWRpbmcgYW5kIGl0cyBmb3JtYXQsIGFuZFxuLy8gd2hldGhlciBpdHMgY2VsbHMgYXJlIGZvcm1hdHRlZCBudW1iZXJzLCB3aGljaCBldmVyeSBleHBvcnQgcmlnaHQtYWxpZ25zXG4vLyAoaGVhZGVyIGluY2x1ZGVkKSBhcyB0aGUgc2NyZWVuIGRvZXMuIEEgY29sdW1uIHRoYXQgaG9sZHMgYSBjb21wYXJlZCxcbi8vIHdpbmRvd2VkLCByYW5rZWQgb3Igc2hhcmVkIG91dHB1dCBjYXJyaWVzIGhvdyBpdCBpcyB3cml0dGVuIChvdXRwdXQpLCBhbmRcbi8vIGhvbGRzIG51bWJlcnMgd2hldGhlciBvciBub3QgaXQgbmFtZXMgYSBmb3JtYXQuXG5leHBvcnQgdHlwZSBFeHBvcnRMaXN0Q29sdW1uID0gTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbjsgb3V0cHV0PzogTGlzdE91dHB1dENvbHVtbiB9O1xuXG4vLyBIb3cgdGFsbCBlYWNoIHBhcnQgb2YgYW4gZXhwb3J0ZWQgS1BJIGNhcmQgaXMsIGluIHRoZSByZW5kZXJlcidzIHVuaXRcbi8vIChwb2ludHMgaW4gdGhlIFBERiwgaW5jaGVzIGluIHRoZSBkZWNrKS4gQSBub3RlIGlzIG9uZSBsaW5lLlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRIZWlnaHRzIHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgbGFiZWw6IG51bWJlcjtcbiAgZGVsdGE6IG51bWJlcjtcbiAgd2luZG93OiBudW1iZXI7XG4gIHRhcmdldDogbnVtYmVyO1xuICBzcGFya2xpbmU6IG51bWJlcjtcbiAgbm90ZTogbnVtYmVyO1xufVxuXG4vLyBUaGUgcGFydHMgb2YgYSBLUEkgY2FyZCBhbiBleHBvcnQgZHJhd3M6IHRoZSB2YWx1ZSBhbmQgaXRzIGxhYmVsIGFsd2F5cyxcbi8vIHRoZSByZXN0IHdoZW4gdGhlIGNhcmQgaGFzIHRoZW0gYW5kIHRoZSB0aWxlIGhhcyByb29tIChrcGlFeHBvcnRQYXJ0cykuXG4vLyBzY2FsZSBzaHJpbmtzIHRoZSByb3dzIGFuZCB0aGVpciB0ZXh0IHdoZW4gdGhlIHBhcnRzIHRoYXQgYWx3YXlzIHN0YXkgc3RpbGxcbi8vIHN0YW5kIHRhbGxlciB0aGFuIHRoZSB0aWxlIChzY2FsZWRLcGlIZWlnaHRzKTogMSB3aGVuIHRoZXkgZml0LlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRQYXJ0cyB7XG4gIGRlbHRhOiBib29sZWFuO1xuICB3aW5kb3c6IGJvb2xlYW47XG4gIHRhcmdldDogYm9vbGVhbjtcbiAgc3BhcmtsaW5lOiBib29sZWFuO1xuICBub3Rlczogc3RyaW5nW107XG4gIHNjYWxlOiBudW1iZXI7XG59XG5cbi8vIEhvdyBmYXIgYSBLUEkgY2FyZCdzIHJvd3Mgc2hyaW5rIHRvIGZpdCBhIHNob3J0IHRpbGUuIEEgdGlsZSBzaG9ydGVyIHN0aWxsXG4vLyBsZXRzIHRoZSBjYXJkIHJ1biBwYXN0IGl0cyBmb290IHJhdGhlciB0aGFuIHByaW50IGl0IHVucmVhZGFibHkgc21hbGwuXG5jb25zdCBLUElfRVhQT1JUX01JTl9TQ0FMRSA9IDAuNTtcblxuLy8gSG93IG1hbnkgdGlsZSBxdWVyaWVzIGFuIGV4cG9ydCBydW5zIGF0IG9uY2UuXG4vL1xuLy8gTm90IGEgcG9saXRlbmVzcyBzZXR0aW5nIOKAlCBpdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgZGVjayBhbmQgYSBicm9rZW5cbi8vIG9uZS4gVGhlc2UgcXVlcmllcyBhcmUgaGVhdnkgYW5kIHJlYWQgdGhlIHNhbWUgdGFibGVzLCBzbyBmaXJpbmcgYWxsIG9mIHRoZW1cbi8vIHRvZ2V0aGVyIHB1dHMgZXZlcnkgb25lIGluIGNvbnRlbnRpb24gZm9yIHRoZSBzYW1lIGRhdGFiYXNlIGF0IHRoZSBzYW1lXG4vLyBtb21lbnQgYW5kIHRoZXkgY3Jvc3MgdGhlIHN0YXRlbWVudCBjZWlsaW5nIGFzIGEgZ3JvdXA6IG1lYXN1cmVkIG9uIHJlcG9ydFxuLy8gMjgsIHRlbiB0aWxlcyB0aGF0IGVhY2ggYW5zd2VyIGluIDktMjRzIHJ1biBvbmUgYWZ0ZXIgYW5vdGhlciBhbGwgZmFpbGVkIGF0XG4vLyB+MzBzIHdoZW4gcmVsZWFzZWQgdG9nZXRoZXIuIENvbmN1cnJlbmN5IGJ1eXMgd2FsbC1jbG9jayBvbmx5IHVwIHRvIHRoZSBwb2ludFxuLy8gd2hlcmUgdGhlIHF1ZXJpZXMgc3RhcnQgdGFraW5nIGl0IGJhY2sgb2ZmIGVhY2ggb3RoZXIsIGFuZCBwYXN0IHRoYXQgaXQgYnV5c1xuLy8gZmFpbHVyZXMuXG5jb25zdCBFWFBPUlRfQ09OQ1VSUkVOQ1kgPSAzO1xuXG4vLyBXaGF0IHRoZSBleHBvcnQgZ2F0ZXMgY2FsbCB0aGUgaGVhZGVyIGFuZCBmb290ZXI6IHdoZW4gYSB2YWx1ZSB0aGV5IHNob3dcbi8vIGNhbWUgYmFjayB3aXRob3V0IGl0cyBudW1iZXIsIGFuZCB3aGVuIG9uZSBvZiB0aGVpciB0ZXh0IGJsb2NrcyBkb2VzIG5vdFxuLy8gZml0IGl0cyBib3guXG5leHBvcnQgY29uc3QgSEVBREVSX0ZPT1RFUl9OQU1FID0gJ0hlYWRlciAmIGZvb3Rlcic7XG5cbi8vIEhvdyBtdWNoIG9mIGEgdGV4dCBibG9jaydzIHdvcmRzIHRoZSBleHBvcnQgZ2F0ZXMgcXVvdGUgdG8gbmFtZSBhIGJsb2NrIHRoYXRcbi8vIGRvZXMgbm90IGZpdCBpdHMgYm94LlxuY29uc3QgT1ZFUkZMT1dfU05JUFBFVF9MRU5HVEggPSA0MDtcblxuLy8gT25lIHJlcXVlc3QgaW4gYW4gZXhwb3J0J3MgcXVldWU6IGEgdGlsZSdzIGRhdGEsIG9yIHRoZSBudW1iZXJzIG9mIHRoZVxuLy8gdmFsdWVzIG9uZSBsYXllcidzIHRleHQgcmVhZHMsIHJlYWQgdG9nZXRoZXIuIEEgdmFsdWVzIGpvYidzIHBhZ2VJbmRleCBpc1xuLy8gbnVsbCBmb3IgdGhlIGhlYWRlciBhbmQgZm9vdGVyICh0aGUgbWFzdGVyKTsgYHZhbHVlc2AgaXMgZXZlcnkgdmFsdWUgb2YgdGhlXG4vLyBsYXllciwgd2hpY2ggbmFtZXMgaXRzIHRva2VucyBhbmQgd2hvc2UgZmlsdGVyIHZhbHVlcyB0aGUgcmVxdWVzdCBjYXJyaWVzLFxuLy8gYW5kIGBjb21wb25lbnRzYCB0aGUgb25lcyBpdHMgdGV4dCBzaG93cywgd2hvc2UgbnVtYmVycyB0aGUgZmFpbHVyZSBnYXRlXG4vLyByZXF1aXJlcy5cbnR5cGUgQ29sbGVjdEpvYiA9XG4gIHwgeyBraW5kOiAnY29tcG9uZW50JzsgcGFnZUluZGV4OiBudW1iZXI7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH1cbiAgfCB7XG4gICAga2luZDogJ3ZhbHVlcyc7XG4gICAgcGFnZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIHBhZ2VJZDogbnVtYmVyO1xuICAgIHZhbHVlczogUmVwb3J0Q29tcG9uZW50W107XG4gICAgY29tcG9uZW50czogUmVwb3J0Q29tcG9uZW50W107XG4gIH07XG5cbi8vIE9uZSBsYXllcidzIHZhbHVlcyBhcyB0aGUgZmlsZSBwcmludHMgdGhlbS5cbnR5cGUgQ29sbGVjdGVkVmFsdWVzID0gUGljazxDb2xsZWN0ZWRQYWdlLCAndmFsdWVzJyB8ICdmYWlsZWRWYWx1ZXMnPjtcblxuLy8gV2hhdCBhIGpvYiBjYW1lIGJhY2sgd2l0aCwgYW5kIHRoZSBwYWdlIGl0IGlzIGZpbGVkIHVuZGVyLlxudHlwZSBDb2xsZWN0UmVzdWx0ID1cbiAgfCB7IGtpbmQ6ICdjb21wb25lbnQnOyBwYWdlSW5kZXg6IG51bWJlcjsgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50IH1cbiAgfCB7IGtpbmQ6ICd2YWx1ZXMnOyBwYWdlSW5kZXg6IG51bWJlciB8IG51bGw7IGNvbGxlY3RlZDogQ29sbGVjdGVkVmFsdWVzIH07XG5cbi8vIFdoYXQgYSBjb21wb25lbnQgd2l0aCBub3RoaW5nIHRvIGRyYXcgcHJpbnRzIGluIHRoZSBleHBvcnRlZCBmaWxlLlxuLy9cbi8vIFRoZSB0d28gY2FzZXMgbXVzdCBub3QgcmVhZCBhbGlrZS4gQSB0aWxlIHRoYXQgcmV0dXJuZWQgbm8gcm93cyBpcyBhIGZpbmRpbmdcbi8vIGFib3V0IHRoZSBwZXJpb2Qg4oCUIHRoZSByZXBvcnQgd29ya2VkIGFuZCB0aGUgYW5zd2VyIGlzIFwibm9uZVwiLiBBIHRpbGUgd2hvc2Vcbi8vIHF1ZXJ5IGZhaWxlZCBpcyBhIGhvbGUgaW4gdGhlIGZpbGUsIGFuZCBjYWxsaW5nIHRoYXQgXCJEYXRhIHVuYXZhaWxhYmxlXCIgdGVsbHNcbi8vIHRoZSByZWFkZXIgdGhlIGRhdGEgZG9lcyBub3QgZXhpc3Qgd2hlbiB3aGF0IGhhcHBlbmVkIGlzIHRoYXQgbm9ib2R5IG1hbmFnZWRcbi8vIHRvIGFzayBmb3IgaXQuIFNoYXJlZCBieSBib3RoIHJlbmRlcmVycyBzbyB0aGUgUERGIGFuZCB0aGUgZGVjayBjYW5ub3QgZW5kIHVwXG4vLyBkZXNjcmliaW5nIHRoZSBzYW1lIGhvbGUgdHdvIGRpZmZlcmVudCB3YXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5TGFiZWwoaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGl0ZW0uZGF0YSA/ICdObyBkYXRhJyA6ICdDb3VsZCBub3QgYmUgZ2VuZXJhdGVkJztcbn1cblxuLy8gQSBjb21wb25lbnQncyB0aXRsZSBhcyBhbiBleHBvcnRlZCBmaWxlIHByaW50cyBpdDogaXRzIHRva2VucyBmaWxsZWQgd2l0aFxuLy8gdGhlIHBhZ2UgaXQgaXMgZHJhd24gb24gKHRoZSBwaHlzaWNhbCBwYWdlIHdoZXJlIHRoZSBQREYgbnVtYmVycyBhXG4vLyBjb250aW51YXRpb24gcGFnZSksIGFzIHRoZSBjYW52YXMgaGVhZGVyIHJlYWRzIGl0LiBBIGRyaWxsZWQgY2hhcnQncyB0aXRsZVxuLy8gaXMgZm9sbG93ZWQgYnkgaXRzIGJyZWFkY3J1bWIsIGBjcnVtYnNgIChkcmlsbENydW1iTGFiZWxzKTogJ09yZGVycyBieVxuLy8gUGVyaW9kIOKAuiAyMDI2IOKAuiBRMycuIEEgc2VhcmNoZWQgbGlzdCBzYXlzIHNvLCBzaW5jZSBpdHMgdGFibGUgaG9sZHMgb25seVxuLy8gdGhlIG1hdGNoaW5nIHJvd3M6ICdPcmRlcnMgKG1hdGNoaW5nIFwibm9ydGhcIiknLiBBbiB1bnRpdGxlZCBvbmUgcmVhZHNcbi8vICdNYXRjaGluZyBcIm5vcnRoXCInLiAnJyB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcHJpbnQuIFNoYXJlZCBieSB0aGUgUERGXG4vLyBhbmQgdGhlIGRlY2ssIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZC5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRUaXRsZShcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCxcbiAgY3J1bWJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGUgPSBjcnVtYmVkVGl0bGUoZmlsbFRpdGxlVG9rZW5zKGNvbXBvbmVudC50aXRsZSwgdG9rZW5zKSwgY3J1bWJzID8/IFtdKTtcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIEEgdGV4dCBibG9jayB0aGF0IGRvZXMgbm90IGZpdCBpdHMgYm94IGluIGEgYnVpbHQgZmlsZSwgYXMgdGhlIG92ZXJmbG93IGdhdGVcbi8vIG5hbWVzIGl0OiB1bmRlciBpdHMgcGFnZSAoSEVBREVSX0ZPT1RFUl9OQU1FIGZvciBhIGhlYWRlciBvciBmb290ZXIgYmxvY2spXG4vLyBhbmQgYnkgdGhlIHN0YXJ0IG9mIGl0cyB3b3Jkcywgb24gb25lIGxpbmUuIFNoYXJlZCBieSB0aGUgUERGIGFuZCB0aGUgZGVjay5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T3ZlcmZsb3coY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHBhZ2U6IHN0cmluZywgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogVGV4dE92ZXJmbG93IHtcbiAgY29uc3QgdGV4dCA9IHRleHRQbGFpbihjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnLCB0b2tlbnMpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLFxuICAgIHBhZ2UsXG4gICAgc25pcHBldDogdGV4dC5sZW5ndGggPiBPVkVSRkxPV19TTklQUEVUX0xFTkdUSCA/IGAke3RleHQuc2xpY2UoMCwgT1ZFUkZMT1dfU05JUFBFVF9MRU5HVEgpLnRyaW1FbmQoKX3igKZgIDogdGV4dCxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIHVuZGVyIHRoZSByZXBvcnQncyBuYW1lIG9uIHRoZSBQREYgdGl0bGUgcGFnZSBhbmQgdGhlIHRpdGxlIHNsaWRlOlxuLy8gdGhlIGV4cG9ydCBkYXRlLCB0aGUgYWN0aXZlIGZpbHRlcnMsIHRoZW4gd2hhdCB0aGUgbnVtYmVycyBhcmUgbWVhc3VyZWQgaW4uXG4vLyBUaGUgZGF0ZSBhbHdheXMgbGVhZHMgKHRoZSBQb3dlclBvaW50IG1hcmtzIHRoYXQgbGluZSBhcyB3cml0dGVuIGluIHRoZVxuLy8gcmVwb3J0J3MgbG9jYWxlKS4gSXQgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVyc1xuLy8gcmVzb2x2ZSBcInRvZGF5XCIgdG8sIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cbmV4cG9ydCBmdW5jdGlvbiBjb3ZlckxpbmVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGZvcm1hdExvY2FsRGF0ZShcbiAgICAgIG5ldyBEYXRlKCksXG4gICAgICBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dC5sb2NhbGUsXG4gICAgICBEQVlfTE9ORyxcbiAgICAgIHJlc29sdmVSZXBvcnRUaW1lem9uZShjb2xsZWN0ZWQucmVwb3J0KSxcbiAgICApLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbCwgdGhyb3VnaCB0aGUgc2FtZVxuLy8gZnVuY3Rpb25zIGFzIHRoZSBzY3JlZW46IGEgZGF0ZSBjb2x1bW4gcmVuZGVycyBpbiB0aGUgcmVwb3J0J3Mgem9uZSBhbmRcbi8vIGxvY2FsZSwgYW5kIGEgY29sdW1uIHdpdGggbnVtYmVyLWZvcm1hdCBrZXlzIChhIGNyb3NzLXRhYidzIGNlbGxzIHRocm91Z2hcbi8vIGl0cyBjZWxsRm9ybWF0KSBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlIGFuZCBjdXJyZW5jeS4gQW55IG90aGVyIHZhbHVlIGdvZXNcbi8vIG91dCB2ZXJiYXRpbSwgYW5kIGFuIGVtcHR5IG9uZSBhcyAnJy4gQ1NWIG5ldmVyIGNvbWVzIHRocm91Z2ggaGVyZTogaXRzXG4vLyB2YWx1ZXMgc3RheSByYXcuXG4vL1xuLy8gQW4gb3V0cHV0IGNvbHVtbiBpcyB3cml0dGVuIGJ5IHdoYXQgaXQgaG9sZHMsIGFzIHRoZSBzY3JlZW4ncyBjZWxsIGlzXG4vLyAoZm9ybWF0T3V0cHV0VmFsdWUpOiBhIHNpZ25lZCBjaGFuZ2UsIGEgcGVyY2VudCBjaGFuZ2UsIGEgY2hhbmdlIG9mIGEgcmF0ZVxuLy8gaW4gcG9pbnRzLCBhIHJhbmssIGEgc2hhcmUuIEl0cyByb3cgZ2l2ZXMgYSBjaGFuZ2UgdGhlIHByaW9yIGJlc2lkZSBpdCwgc29cbi8vIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIHJlYWRzIGFwYXJ0IGZyb20gYSB6ZXJvIG9uZSAoJ24vYScpLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENlbGwoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IExpc3RDb2x1bW4gJiB7IG91dHB1dD86IExpc3RPdXRwdXRDb2x1bW4gfSxcbiAgdGltZXpvbmU6IHN0cmluZyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcm93PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gY29sdW1uLm91dHB1dDtcblxuICBpZiAob3V0cHV0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHZhbHVlLCBvdXRwdXQub3V0cHV0LCBjb2x1bW4sIGNvbnRleHQsIHtcbiAgICAgIG1lYXN1cmVTcGVjOiBvdXRwdXQubWVhc3VyZVNwZWMsXG4gICAgICBwcmlvcjogb3V0cHV0LnByaW9yQWxpYXMgJiYgcm93ID8gcm93W291dHB1dC5wcmlvckFsaWFzXSA6IHVuZGVmaW5lZCxcbiAgICAgIGZsb29yOiBvdXRwdXQuZmxvb3IsXG4gICAgICBlbXB0eTogJycsXG4gICAgfSkudGV4dDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCB0aW1lem9uZSwgY29udGV4dC5sb2NhbGUpO1xuICB9XG5cbiAgcmV0dXJuIGhhc051bWJlckZvcm1hdChjb2x1bW4pID8gZm9ybWF0TnVtYmVyKHZhbHVlLCBjb2x1bW4sIGNvbnRleHQsIHsgZW1wdHk6ICcnIH0pIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuLy8gVGhlIGNvbHVtbnMgYW4gZXhwb3J0ZWQgbGlzdCB0YWJsZSBkcmF3cy4gQSBjcm9zcy10YWIncyBhcnJpdmUgd2l0aCBpdHNcbi8vIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZSByZXN1bHRcbi8vIGtub3dzIHRoZSBwaXZvdCB2YWx1ZXMsIGFuZCBhcmUgYnVpbHQgYnkgcGl2b3RDb2x1bW5TcGVjcygpIGFzIG9uIHNjcmVlbjpcbi8vIGhlYWRlZCBieSBpdHMgcGVyaW9kcyBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBlYWNoIHBpdm90IHZhbHVlIGZvcm1hdHRlZCBieVxuLy8gY2VsbEZvcm1hdC4gQSBwbGFpbiBsaXN0IGRyYXdzIGl0cyBjb25maWd1cmVkIGNvbHVtbnMgYnV0IHRoZSBvbmVzIHRoZVxuLy8gdmlld2VyIGhpZCAoYGhpZGRlbmAsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnMsIHNvIG5ldmVyIGFsbCBvZiB0aGVtKSxcbi8vIGVsc2UgZXZlcnkgY29sdW1uIHRoZSBxdWVyeSByZXR1cm5lZCwgYXMgaXQgY2FtZS4gT3V0cHV0IGNvbHVtbnMgKHRoZVxuLy8gZGF0YSdzIG91dHB1dHMsIGEgY3Jvc3MtdGFiIGNlbGwgdGhyb3VnaCBjZWxsTWVhc3VyZXMpIGNhcnJ5IGhvdyB0aGV5IGFyZVxuLy8gd3JpdHRlbjsgd2l0aG91dCB0aG9zZSBrZXlzIHRoZSBjb2x1bW5zIGFyZSBleGFjdGx5IGFzIGJlZm9yZS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q29sdW1ucyhcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBoaWRkZW46IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4pOiBFeHBvcnRMaXN0Q29sdW1uW10ge1xuICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcblxuICBpZiAoY29uZmlnLnBpdm90Qnk/LmNvbHVtbikge1xuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgbG9jYWxlKSwgZGF0YSwgW10pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICBjb25zdCBoaWRkZW5OYW1lcyA9IGxpc3RIaWRkZW5Db2x1bW5zKGNvbmZpZywgaGlkZGVuKTtcblxuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgICAgIGNvbmZpZy5jb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gIWhpZGRlbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpLFxuICAgICAgZGF0YSxcbiAgICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMoZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIG51bWVyaWM6IGZhbHNlIH0pKSwgZGF0YSwgW10pO1xufVxuXG4vLyBUaGUgY29sdW1ucyB3aXRoIHRoZWlyIG91dHB1dCBtZXRhZGF0YSBhdHRhY2hlZCAobGlzdE91dHB1dENvbHVtbnMsIGFzIHRoZVxuLy8gc2NyZWVuJ3MgbGlzdCByZXNvbHZlcyBpdCk6IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgbnVtYmVycyBhbmQgaXMgd3JpdHRlblxuLy8gYnkgd2hhdCBpdCBob2xkcy4gVW5jaGFuZ2VkIHdoZW4gdGhlIGRhdGEgaGFzIG5vIG91dHB1dHMuXG5mdW5jdGlvbiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgY29sdW1uczogRXhwb3J0TGlzdENvbHVtbltdLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBhdXRob3JlZDogcmVhZG9ubHkgTGlzdENvbHVtbltdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgaWYgKCFkYXRhLm91dHB1dHMpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHMgPSBsaXN0T3V0cHV0Q29sdW1ucyhjb2x1bW5zLCBkYXRhLCBhdXRob3JlZCk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChvdXRwdXRzW2NvbHVtbi5jb2x1bW5dXG4gICAgPyB7IC4uLmNvbHVtbiwgbnVtZXJpYzogdHJ1ZSwgb3V0cHV0OiBvdXRwdXRzW2NvbHVtbi5jb2x1bW5dIH1cbiAgICA6IGNvbHVtbikpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGEgcGxhaW4gbGlzdCdzIGNvbmZpZ3VyZWRcbi8vIGxhYmVsLCBlbHNlIGl0cyBjb2x1bW47IGEgY3Jvc3MtdGFiJ3MgaGVhZGluZyBmcm9tIHBpdm90Q29sdW1uU3BlY3MoKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0SGVhZGluZ3MoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhLCBsb2NhbGUsIGhpZGRlbikubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKTtcbn1cblxuLy8gQW4gZXhwb3J0ZWQgbGlzdCdzIHRvdGFscyByb3csIG9uZSBjZWxsIHBlciBjb2x1bW4gb2YgbGlzdENvbHVtbnMoKTogZWFjaFxuLy8gdG90YWwgd3JpdHRlbiBsaWtlIGl0cyBjb2x1bW4ncyBjZWxscywgYW5kIExJU1RfVE9UQUxfTEFCRUwgaW4gdGhlIGZpcnN0XG4vLyBjb2x1bW4gd2hlbiB0aGF0IGNvbHVtbiBob2xkcyBubyB0b3RhbCAoYSBjcm9zcy10YWIncyByb3cga2V5KS4gbnVsbCB3aGVuXG4vLyB0aGUgbGlzdCBoYXMgbm8gdG90YWxzLiBUaGUgQ1NWIG5ldmVyIGNhcnJpZXMgb25lOiBpdHMgcm93cyBzdGF5IHJhdy5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0VG90YWxzUm93KFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjb2x1bW5zOiByZWFkb25seSBFeHBvcnRMaXN0Q29sdW1uW10sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmdbXSB8IG51bGwge1xuICBjb25zdCB0b3RhbHMgPSBkYXRhLnRvdGFscztcblxuICBpZiAoIXRvdGFscykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBsaXN0VG90YWxzTGFiZWxDb2x1bW4oY29sdW1ucywgdG90YWxzKTtcblxuICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKGNvbHVtbi5jb2x1bW4gPT09IGxhYmVsXG4gICAgPyBMSVNUX1RPVEFMX0xBQkVMXG4gICAgOiBleHBvcnRDZWxsKHRvdGFsc1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCB0aW1lem9uZSwgY29udGV4dCwgdG90YWxzKSkpO1xufVxuXG4vLyBUaGUgc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlOiB0aGUgZGF5cyBpdCByZWFkcywgYW5kIHRoZVxuLy8gZGF5cyBlYWNoIGNvbXBhcmlzb24gbGFuZSByZWFkcyAoJ1NlcCAxIOKAkyAxNSwgMjAyNiDCtyB2cyBwcmV2aW91cyBtb250aDpcbi8vIEF1ZyAxIOKAkyAxNSwgMjAyNicpLCBhcyB0aGUgc2NyZWVuJ3Mgbm90ZSBvcGVucyB3aXRoLiAnJyB3aXRob3V0IGFcbi8vIGNvbXBhcmlzb24gb3IgYSB0aW1lZnJhbWUsIGFuZCBmb3IgYSBLUEksIHdob3NlIGNhcmQgcHJpbnRzIGl0cyBvd24gd2luZG93XG4vLyBsaW5lLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFdpbmRvd3NMaW5lKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBpZiAoIWl0ZW0uZGF0YSB8fCBpdGVtLmNvbXBvbmVudC50eXBlID09PSAna3BpJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRXaW5kb3dzTGluZShpdGVtLmRhdGEsIHsgbG9jYWxlLCB0aW1lem9uZSB9KTtcbn1cblxuLy8gVGhlIG5vdGUgbGluZXMgdW5kZXIgYSBjb21wb25lbnQncyBib3g6IHdoeSBhIGNvbXBhcmlzb24gcmVhZHMgYXMgaXQgZG9lcyxcbi8vIGEgS1BJJ3MgZGVsdGEgbm90ZSwgYW5kIHdoYXQgZWFjaCB3aW5kb3dlZCB2YWx1ZSBpcyBhbmQgd2h5LiBUaGUgZGF5cyBhcmVcbi8vIGxlZnQgb3V0ICh0aGUgc3VidGl0bGUgb3IgdGhlIEtQSSBjYXJkIHByaW50cyB0aGVtKSwgYW5kIHRoZSB3aW5kb3dcbi8vIGRlc2NyaXB0aW9ucyBhcmUgaW4sIHNpbmNlIGEgZmlsZSBoYXMgbm8gdG9vbHRpcCBvciBoZWFkZXIgdG8gY2FycnkgdGhlbS5cbi8vIEVtcHR5IHdoZW4gdGhlIGRhdGEgaGFzIG5vbmUgb2YgdGhlIGtleXMuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Tm90ZUxpbmVzKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROb3RlTGluZXMoaXRlbS5kYXRhLCB7IGxvY2FsZSwgdGltZXpvbmUgfSwgeyB3aW5kb3dzOiBmYWxzZSwgd2luZG93RGVzY3JpcHRpb25zOiB0cnVlIH0pO1xufVxuXG4vLyBXaGV0aGVyIGEgS1BJIGNhcmQgaGFzIG1vcmUgdG8gZHJhdyB0aGFuIGl0cyB2YWx1ZSBhbmQgbGFiZWwuIFdpdGhvdXQsIGJvdGhcbi8vIGV4cG9ydHMgZHJhdyB0aGUgdGlsZSBleGFjdGx5IGFzIHRoZXkgYWx3YXlzIGhhdmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpQ2FyZEhhc0V4dHJhcyh2aWV3OiBLcGlDYXJkVmlldywgbm90ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhISh2aWV3LmRlbHRhIHx8IHZpZXcud2luZG93IHx8IHZpZXcudGFyZ2V0IHx8IHZpZXcuc3BhcmtsaW5lIHx8IG5vdGVzLmxlbmd0aCk7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIGEgS1BJIGNhcmQgZml0IGEgdGlsZSBgYXZhaWxhYmxlYCB0YWxsLiBBIHNob3J0IHRpbGUgc2hlZHMgdGhlXG4vLyBzcGFya2xpbmUgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBsaW5lLCB0aGVuIHRoZSBub3RlczsgdGhlIHZhbHVlLCBpdHMgbGFiZWxcbi8vIGFuZCB0aGUgZGVsdGEgcm93IGFsd2F5cyBzdGF5LCBhbmQgdGhlIHdpbmRvdyBsaW5lIHN0YXlzIHdoZW5ldmVyIHRoZSBjYXJkXG4vLyBzaG93cyBhIGNvbXBhcmlzb24gKGl0cyBkYXlzIGFyZSB3aGF0IHRoZSBkZWx0YSBpcyBtZWFzdXJlZCBvdmVyKS4gVGhlXG4vLyBzcGFya2xpbmUgbmVlZHMgdmFsdWVzIHRvIGRyYXcuIFdoZW4gd2hhdCBzdGF5cyBpcyBzdGlsbCB0b28gdGFsbCwgZXZlcnlcbi8vIHJvdyBzaHJpbmtzIGJ5IHRoZSBzYW1lIHNjYWxlLCBkb3duIHRvIEtQSV9FWFBPUlRfTUlOX1NDQUxFOyBieSB0aGVuIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGUgdGFyZ2V0IGFuZCB0aGUgbm90ZXMgYXJlIGdvbmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpRXhwb3J0UGFydHMoXG4gIHZpZXc6IEtwaUNhcmRWaWV3LFxuICBub3RlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGF2YWlsYWJsZTogbnVtYmVyLFxuICBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLFxuKTogS3BpRXhwb3J0UGFydHMge1xuICBjb25zdCBwYXJ0czogS3BpRXhwb3J0UGFydHMgPSB7XG4gICAgZGVsdGE6ICEhdmlldy5kZWx0YSxcbiAgICB3aW5kb3c6ICEhdmlldy53aW5kb3csXG4gICAgdGFyZ2V0OiAhIXZpZXcudGFyZ2V0LFxuICAgIHNwYXJrbGluZTogISF2aWV3LnNwYXJrbGluZT8udmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gbnVsbCksXG4gICAgbm90ZXM6IFsuLi5ub3Rlc10sXG4gICAgc2NhbGU6IDEsXG4gIH07XG4gIGNvbnN0IGhlaWdodCA9ICgpID0+IGtwaUV4cG9ydEhlaWdodCh2aWV3LCBwYXJ0cywgaGVpZ2h0cyk7XG5cbiAgaWYgKGhlaWdodCgpID4gYXZhaWxhYmxlKSB7XG4gICAgcGFydHMuc3BhcmtsaW5lID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaGVpZ2h0KCkgPiBhdmFpbGFibGUpIHtcbiAgICBwYXJ0cy50YXJnZXQgPSBmYWxzZTtcbiAgfVxuXG4gIHdoaWxlIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiBwYXJ0cy5ub3Rlcy5sZW5ndGgpIHtcbiAgICBwYXJ0cy5ub3Rlcy5wb3AoKTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiAhcGFydHMuZGVsdGEpIHtcbiAgICBwYXJ0cy53aW5kb3cgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSkge1xuICAgIHBhcnRzLnNjYWxlID0gTWF0aC5tYXgoS1BJX0VYUE9SVF9NSU5fU0NBTEUsIE1hdGgubWF4KDAsIGF2YWlsYWJsZSkgLyBoZWlnaHQoKSk7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFRoZSBoZWlnaHRzIHNjYWxlZCBieSB0aGUgcGFydHMnIHNjYWxlOiB3aGF0IHRoZSByZW5kZXJlciBsYXlzIHRoZSBjYXJkXG4vLyBvdXQgd2l0aCwgaXRzIHRleHQgc2l6ZWQgYnkgdGhlIHNhbWUgc2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVkS3BpSGVpZ2h0cyhoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLCBzY2FsZTogbnVtYmVyKTogS3BpRXhwb3J0SGVpZ2h0cyB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IGhlaWdodHMudmFsdWUgKiBzY2FsZSxcbiAgICBsYWJlbDogaGVpZ2h0cy5sYWJlbCAqIHNjYWxlLFxuICAgIGRlbHRhOiBoZWlnaHRzLmRlbHRhICogc2NhbGUsXG4gICAgd2luZG93OiBoZWlnaHRzLndpbmRvdyAqIHNjYWxlLFxuICAgIHRhcmdldDogaGVpZ2h0cy50YXJnZXQgKiBzY2FsZSxcbiAgICBzcGFya2xpbmU6IGhlaWdodHMuc3BhcmtsaW5lICogc2NhbGUsXG4gICAgbm90ZTogaGVpZ2h0cy5ub3RlICogc2NhbGUsXG4gIH07XG59XG5cbi8vIEhvdyB0YWxsIHRoZSBjYXJkJ3MgZHJhd24gcGFydHMgc3RhbmQgdG9nZXRoZXIsIGluIHRoZSBoZWlnaHRzJyB1bml0LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydEhlaWdodCh2aWV3OiBLcGlDYXJkVmlldywgcGFydHM6IEtwaUV4cG9ydFBhcnRzLCBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzKTogbnVtYmVyIHtcbiAgcmV0dXJuIGhlaWdodHMudmFsdWVcbiAgICArICh2aWV3LmxhYmVsID8gaGVpZ2h0cy5sYWJlbCA6IDApXG4gICAgKyAocGFydHMuZGVsdGEgPyBoZWlnaHRzLmRlbHRhIDogMClcbiAgICArIChwYXJ0cy53aW5kb3cgPyBoZWlnaHRzLndpbmRvdyA6IDApXG4gICAgKyAocGFydHMudGFyZ2V0ID8gaGVpZ2h0cy50YXJnZXQgOiAwKVxuICAgICsgKHBhcnRzLnNwYXJrbGluZSA/IGhlaWdodHMuc3BhcmtsaW5lIDogMClcbiAgICArIHBhcnRzLm5vdGVzLmxlbmd0aCAqIGhlaWdodHMubm90ZTtcbn1cblxuLy8gVGhlIGxhc3Qgcm93IG9mIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgdGhhdCBzdG9wcyBzaG9ydCBvZiBpdHMgcmVzdWx0OiBob3dcbi8vIG1hbnkgcm93cyB0aGUgZmlsZSBsZWF2ZXMgb3V0IGFuZCB3aGVyZSB0aGUgd2hvbGUgc2V0IGNhbiBiZSBoYWQuIEVhY2hcbi8vIGZvcm1hdCBmZXRjaGVzIGl0cyBvd24gbnVtYmVyIG9mIHJvd3MgKFBERl9MSVNUX1JPV1MsIFBQVFhfTElTVF9ST1dTKSwgYW5kXG4vLyBib3RoIG5hbWUgd2hhdCBpcyBsZWZ0IHdpdGggdGhpcyBvbmUgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gbW9yZVJvd3NOb3RpY2UocmVtYWluaW5nOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYOKApiAke3JlbWFpbmluZ30gbW9yZSByb3cocykg4oCUIHVzZSB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydCBmb3IgdGhlIGZ1bGwgZGF0YXNldGA7XG59XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNvbGxlY3RlZCByZXBvcnQgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB0aWxlIHdob3NlIHF1ZXJ5XG4vLyBmYWlsZWQsIG9yIHdob3NlIHRleHQgc2hvd3MgYSB2YWx1ZSB0aGF0IGNhbWUgYmFjayB3aXRob3V0IGl0cyBudW1iZXIsIHRoZW5cbi8vIEhFQURFUl9GT09URVJfTkFNRSB3aGVuIHRoZSBoZWFkZXIgb3IgZm9vdGVyIHNob3dzIG9uZSBvbiBhIHBhZ2UgdGhhdCBzaG93c1xuLy8gdGhlIG1hc3RlciDigJQgd2hhdCB0aGUgZmFpbHVyZSBnYXRlIG5hbWVzIHRvIHRoZSB1c2VyLCBhbmQgd2hhdCBtYWtlcyBcInNvbWVcbi8vIG9mIHRoaXMgZmlsZSBpcyBtaXNzaW5nXCIgYSBmYWN0IHRoZSBjYWxsZXIgY2FuIGFjdCBvbiByYXRoZXIgdGhhbiBhIHRoaW5nXG4vLyB0aGV5IG5vdGljZSBpbiB0aGUgUERGIGFmdGVyd2FyZHMuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICAvLyBOdW1iZXJlZCBiZWZvcmUgdGhlIGZpbHRlciDigJQgYW4gdW5uYW1lZCBwYWdlIDQgdGhhdCBmYWlsZWQgaGFzIHRvIHJlYWRcbiAgLy8gXCJQYWdlIDRcIiwgbm90IFwiUGFnZSAxXCIgYmVjYXVzZSBpdCBoYXBwZW5lZCB0byBiZSB0aGUgZmlyc3QgZmFpbHVyZS5cbiAgY29uc3QgbmFtZXMgPSBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKVxuICAgICAgfHwgc2hvd3NGYWlsZWRWYWx1ZShwYWdlLmNvbXBvbmVudHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbXBvbmVudCksIHBhZ2UuZmFpbGVkVmFsdWVzKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbiAgY29uc3QgbWFzdGVyID0gY29sbGVjdGVkLnJlcG9ydC5tYXN0ZXI7XG4gIGNvbnN0IHNob3dzTWFzdGVyID0gY29sbGVjdGVkLnBhZ2VzLnNvbWUoKHsgcGFnZSB9KSA9PiAhcGFnZS5tYXN0ZXJIaWRkZW4pO1xuXG4gIGlmIChtYXN0ZXIgJiYgc2hvd3NNYXN0ZXIgJiYgc2hvd3NGYWlsZWRWYWx1ZShtYXN0ZXIuY29tcG9uZW50cywgY29sbGVjdGVkLm1hc3RlckZhaWxlZFZhbHVlcykpIHtcbiAgICBuYW1lcy5wdXNoKEhFQURFUl9GT09URVJfTkFNRSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8vIFdoZXRoZXIgYW55IG9mIHRoZSB0ZXh0IGJsb2NrcyBzaG93cyBvbmUgb2YgdGhlIGZhaWxlZCB2YWx1ZSBrZXlzLlxuZnVuY3Rpb24gc2hvd3NGYWlsZWRWYWx1ZShjb21wb25lbnRzOiBSZXBvcnRDb21wb25lbnRbXSwgZmFpbGVkOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzaG93biA9IG5ldyBTZXQoY29tcG9uZW50c1xuICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0JylcbiAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB2YWx1ZUtleXMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCkpKTtcblxuICByZXR1cm4gZmFpbGVkLnNvbWUoKGtleSkgPT4gc2hvd24uaGFzKGtleSkpO1xufVxuXG4vLyBUaGUgY292ZXIncyBmaWx0ZXIgbGluZXM6IHRoZSBvcGVuIHZpZXcsIHRoZSBleHBvcnQncyBmaWx0ZXIgbGluZXMsIHRoZW5cbi8vIHRoZSBtYXRjaCB3aGlsZSB0aGUgcmVwb3J0IGJhcidzIGZpbHRlcnMgbWF0Y2ggYW55LiBBIGRyaWxsZWQgY2hhcnQncyBsaW5lXG4vLyBpcyBpdHMgdGl0bGUgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQgKGB0aXRsZXNgLCBieSBjb21wb25lbnQgaWQpIGFuZFxuLy8gdGhlIGNydW1icyBvZiB0aGUgcGF0aCBpdHMgYW5zd2VyIGFwcGxpZWQgKHRoZSBvbmVzIGl0cyB0aXRsZSBwcmludHMpLCBub3Rcbi8vIHRoZSBwYXRoIHRoZSBzY3JlZW4gYXNrZWQgZm9yOiB0aGUgc2VydmVyIG1heSBoYXZlIGN1dCB0aGF0IHBhdGggc2hvcnQgb3Jcbi8vIHJlZnVzZWQgaXQuXG5leHBvcnQgZnVuY3Rpb24gY292ZXJGaWx0ZXJMaW5lcyhcbiAgc25hcHNob3Q6IFJlcG9ydEV4cG9ydFNuYXBzaG90LFxuICBsaW5lczogcmVhZG9ubHkgUmVwb3J0RXhwb3J0TGluZVtdLFxuICBwYWdlczogcmVhZG9ubHkgUGljazxDb2xsZWN0ZWRQYWdlLCAnY29tcG9uZW50cyc+W10sXG4gIHRpdGxlczogUmVhZG9ubHk8UmVjb3JkPG51bWJlciwgc3RyaW5nPj4gPSB7fSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2ggPSBzbmFwc2hvdC5mZWF0dXJlcy5pbmNsdWRlcygnbWF0Y2hBbnknKSA/IG1hdGNoTGluZVRleHQoc25hcHNob3Qudmlldy5tYXRjaCwgJ2xpbmUnKSA6IG51bGw7XG4gIGNvbnN0IGRyaWxsZWQgPSBwYWdlc1xuICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMpXG4gICAgLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtLmNydW1icz8ubGVuZ3RoKVxuICAgIC5tYXAoKGl0ZW0pID0+IGNydW1iZWRUaXRsZSh0aXRsZXNbaXRlbS5jb21wb25lbnQuaWRdID8/IGl0ZW0uY29tcG9uZW50LnRpdGxlLCBpdGVtLmNydW1icykpO1xuXG4gIHJldHVybiBbXG4gICAgc25hcHNob3Qudmlld0xpbmUsXG4gICAgLi4ubGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmtpbmQgIT09ICdkcmlsbCcpLm1hcCgobGluZSkgPT4gbGluZS50ZXh0KSxcbiAgICAuLi5kcmlsbGVkLFxuICAgIG1hdGNoLFxuICBdXG4gICAgLmZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+ICEhbGluZSk7XG59XG5cbi8vIFdoZXRoZXIgYSBQREYgb3IgUG93ZXJQb2ludCBleHBvcnQgbGF5cyBhIGNvbXBvbmVudCBvdXQ6IGV2ZXJ5IHRpbGUsIGFuZFxuLy8gZXZlcnkgdGV4dCBibG9jaywgd2hpY2ggaGFzIG5vdGhpbmcgdG8gZmV0Y2ggYW5kIHJpZGVzIHRocm91Z2ggd2l0aCBub1xuLy8gZGF0YS4gQW55IG90aGVyIHR5cGUgKGFuIGlubGluZSB2YWx1ZSwgb3IgYSB0eXBlIHRoaXMgdmlld2VyIGRvZXMgbm90XG4vLyBrbm93KSBuZXZlciBpczogYSB2YWx1ZSBpcyByZWFkIG9ubHkgdGhyb3VnaCBpdHMgbGF5ZXIncyB2YWx1ZXMgam9iLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwb3J0U2xvdChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUaWxlKGNvbXBvbmVudCkgfHwgY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jztcbn1cblxuLy8gR2F0aGVycyBldmVyeXRoaW5nIGFuIGV4cG9ydCBuZWVkczogZXZlcnkgY29tcG9uZW50J3MgZGF0YSBhY3Jvc3MgQUxMIHBhZ2VzXG4vLyAodGhlIGNhbnZhcyBvbmx5IHJlbmRlcnMgdGhlIGFjdGl2ZSBwYWdlLCBzbyBleHBvcnRzIGNhbid0IHNjcmFwZSB0aGVcbi8vIHNjcmVlbiksIGFuZCB0aGUgbnVtYmVycyBvZiB0aGUgdmFsdWVzIHRoZWlyIHRleHQgcmVhZHMsIGZldGNoZWQgZnJlc2ggd2l0aFxuLy8gdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgLCBhbmQgYSBmYWlsZWQgdmFsdWUgdG8gYSBrZXkgaW5cbi8vIGl0cyBwYWdlJ3MgZmFpbGVkVmFsdWVzLCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdFxuLy8gaXMgc28gdGhlIGNhbGxlciBjYW4gUkVQT1JUIHdoYXQgZmFpbGVkLCBub3Qgc28gaXQgY2FuIGJlIGlnbm9yZWQ6IHNlZVxuLy8gZmFpbGVkUGFnZU5hbWVzKCkgYW5kIHRoZSBmYWlsdXJlIGdhdGUgdGhhdCB1c2VzIGl0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnMgPSBpbmplY3QoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpO1xuICAvLyBUaGUgb3BlbiBzYXZlZCB2aWV3LCBmb3IgdGhlIGNvdmVyJ3MgdmlldyBsaW5lLiBPbmx5IGEgdmlldyB0aGF0IGtlZXBzXG4gIC8vIHNhdmVkIHZpZXdzIHByb3ZpZGVzIGl0LlxuICBwcml2YXRlIF92aWV3cyA9IGluamVjdChSZXBvcnRWaWV3U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvLyBsaXN0Um93cyBpcyBob3cgbWFueSByb3dzIGVhY2ggbGlzdCBmZXRjaGVzOiB0aGUgcmVuZGVyZXIncyBvd24gY2FwLCBzaW5jZVxuICAvLyBhIFBERiB0YWJsZSBjb250aW51ZXMgb250byBleHRyYSBwYWdlcyBhbmQgYSBzbGlkZSB0YWJsZSBjYW5ub3QuXG4gIC8vXG4gIC8vIFRoZSBzY3JlZW4gaXMgcmVhZCBvbmNlLCB3aGVuIHRoZSBleHBvcnQgc3RhcnRzIChzbmFwc2hvdCk6IGV2ZXJ5IHRpbGUsXG4gIC8vIGV2ZXJ5IHZhbHVlcyBqb2IsIHRoZSBmaWx0ZXIgbGluZXMgYW5kIHRoZSBjb3ZlciByZWFkIHRoYXQgY29weSwgc28gYVxuICAvLyBmaWx0ZXIgY2hhbmdlZCB3aGlsZSB0aGUgdGlsZXMgYXJlIGZldGNoZWQgcmVhY2hlcyBub25lIG9mIHRoZW0uIEEgcmV0cnlcbiAgLy8gY29sbGVjdHMgYWdhaW4sIGFuZCBzbyByZWFkcyB0aGUgc2NyZWVuIGFzIGl0IGlzIHRoZW4uXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBqb2JzID0gdGhpcy5fam9icyhyZXBvcnQpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdChyZXBvcnQpO1xuICAgIGNvbnN0IGZvcm1hdENvbnRleHQgPSBzbmFwc2hvdC5mb3JtYXRDb250ZXh0O1xuXG4gICAgLy8gUmVsZWFzZWQgYSBmZXcgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLCBhIHBhZ2UncyB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gc2FtZSBxdWV1ZSBhcyB0aGUgdGlsZXMsIHNvIHRoZXkgbmV2ZXIgYWRkIHRvIHRoZSBxdWVyaWVzIGFscmVhZHlcbiAgICAvLyBydW5uaW5nLiBtZXJnZU1hcCBjb21wbGV0ZXMgb3V0IG9mIG9yZGVyLCBzbyBlYWNoIHJlc3VsdCBjYXJyaWVzIHRoZSBqb2JcbiAgICAvLyBpdCBjYW1lIGZyb20gYW5kIHRoZSByb3dzIGFyZSBmaWxlZCBieSBpbmRleCDigJQgdGhlIGRlY2sncyBwYWdlIG9yZGVyXG4gICAgLy8gY2FuJ3QgZGVwZW5kIG9uIHdoaWNoIHF1ZXJ5IGhhcHBlbmVkIHRvIGZpbmlzaCBmaXJzdC5cbiAgICBjb25zdCBhbGwkID0gam9icy5sZW5ndGhcbiAgICAgID8gZnJvbShqb2JzLm1hcCgoam9iLCBpbmRleCkgPT4gKHsgam9iLCBpbmRleCB9KSkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKFxuICAgICAgICAgICAgKHsgam9iLCBpbmRleCB9KSA9PiB0aGlzLl9ydW5Kb2IocmVwb3J0LCBqb2IsIGxpc3RSb3dzLCBzbmFwc2hvdClcbiAgICAgICAgICAgICAgLnBpcGUobWFwKChyZXN1bHQpID0+ICh7IHJlc3VsdCwgaW5kZXggfSkpKSxcbiAgICAgICAgICAgIEVYUE9SVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihbXSBhcyB7IHJlc3VsdDogQ29sbGVjdFJlc3VsdDsgaW5kZXg6IG51bWJlciB9W10pO1xuXG4gICAgLy8gVGhlIGxpbmVzIGFuZCB0aGUgZmlsdGVyIHRva2VucyByaWRlIGFsb25nc2lkZSB0aGUgY29tcG9uZW50IGRhdGFcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdCB0aGUgZW5kLCBiZWNhdXNlIG5hbWluZyBhIHNlbGVjdCBmaWx0ZXInc1xuICAgIC8vIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgd29yZGluZzogdGhpcy5leHBvcnRXb3JkaW5nKHJlcG9ydCwgc25hcHNob3QpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgd29yZGluZyB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuX2ZpbGUocmVwb3J0LCBjb2xsZWN0ZWQsIGZvcm1hdENvbnRleHQpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgICAgIC4uLmZpbGUsXG4gICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5OiBjb3ZlckZpbHRlckxpbmVzKHNuYXBzaG90LCB3b3JkaW5nLmxpbmVzLCBmaWxlLnBhZ2VzLCB3b3JkaW5nLnRpdGxlcyksXG4gICAgICAgICAgICBmaWx0ZXJGaWVsZHM6IHdvcmRpbmcuZmlsdGVyRmllbGRzLFxuICAgICAgICAgICAgY29udGV4dExpbmVzOiB0aGlzLl9jb250ZXh0TGluZXMocmVwb3J0KSxcbiAgICAgICAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIHNjcmVlbiBhcyBvbmUgZXhwb3J0IHJlYWRzIGl0OiB0aGUgdmlldyBkb2N1bWVudCwgZWFjaCBncm91cCdzIHZhbHVlXG4gIC8vIGFuZCBsaXZlIHByZXNldCwgZWFjaCB0aWxlJ3MgZmlsdGVyIGVudHJpZXMgYW5kIHN0YXRlICh0aWxlRGF0YVN0YXRlKSxcbiAgLy8gZWFjaCB2YWx1ZSdzIGZpbHRlciBlbnRyaWVzLCB0aGUgZ3JhaW4sIHRoZSBmZWF0dXJlcyBzZXJ2ZWQsIHRoZSBmb3JtYXRcbiAgLy8gYW5kIHRoZSBvcGVuIHZpZXcncyBsaW5lLiBBIHZhbHVlJ3MgZW50cmllcyBhcmUgcmVhZCBoZXJlIHRvbywgc28gdGhlXG4gIC8vIG51bWJlcnMgaW4gYSBmaWxlJ3MgdGV4dCBhcmUgZmlsdGVyZWQgYXMgaXRzIHRpbGVzIGFyZSwgd2hhdGV2ZXIgdGhlIGJhclxuICAvLyBkb2VzIHdoaWxlIHRoZSBleHBvcnQgcnVucy5cbiAgcHVibGljIHNuYXBzaG90KHJlcG9ydDogUmVwb3J0KTogUmVwb3J0RXhwb3J0U25hcHNob3Qge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHRpbGVzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd2YWx1ZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXcsXG4gICAgICAuLi50aGlzLl9ncm91cFZhbHVlcyhyZXBvcnQpLFxuICAgICAgZmlsdGVyczogT2JqZWN0LmZyb21FbnRyaWVzKHRpbGVzLm1hcCgodGlsZSkgPT4gW3RpbGUuaWQsIHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGlsZSldKSksXG4gICAgICB2YWx1ZUZpbHRlcnM6IE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZXNcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IFt2YWx1ZS5pZCwgdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudCh2YWx1ZSldKSksXG4gICAgICBzdGF0ZXM6IE9iamVjdC5mcm9tRW50cmllcyh0aWxlcy5tYXAoKHRpbGUpID0+IFt0aWxlLmlkLCB0aWxlRGF0YVN0YXRlKHJlcG9ydCwgdGlsZSwgdmlldyldKSksXG4gICAgICBmcmVxdWVuY3k6IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpLFxuICAgICAgZmVhdHVyZXM6IG9mZmVyZWRWaWV3ZXJGZWF0dXJlcyhyZXBvcnQudmlld2VyRmVhdHVyZXMpLFxuICAgICAgZm9ybWF0Q29udGV4dDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgdmlld0xpbmU6IHZpZXdMaW5lVGV4dCh0aGlzLl92aWV3cz8ub3BlblZpZXcoKSwgISF0aGlzLl92aWV3cz8udmlld0NoYW5nZWQoKSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvdyBhbiBleHBvcnQgd29yZHMgdGhlIHNjcmVlbiwgb3ZlciBhIHNuYXBzaG90IChgcGFnZUlkYCBmb3IgYSBUaGlzXG4gIC8vIFBhZ2UgemlwKTogaXRzIGZpbHRlciBsaW5lcyAoZXhwb3J0TGluZXM6IHRoZSBjb3ZlcidzLCBhbmQgdGhlIHppcCdzXG4gIC8vIGZpbHRlckxpbmVzKSwgd2hhdCBlYWNoIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiBwcmludHMsIGFuZCBlYWNoIHRpbGUnc1xuICAvLyB0aXRsZSBhcyB0aGUgY2FudmFzIGhlYWRlciByZWFkcyBpdCAodGhlIHppcCBuYW1lcyBpdHMgZmlsZXMgYWZ0ZXJcbiAgLy8gdGhlbSkuIEEgc2VsZWN0J3MgcGlja3MgYXJlIG5hbWVkIG9uY2UgZm9yIGFsbCB0aHJlZSwgYXMgdGhlIHJlcG9ydCBiYXJcbiAgLy8gbmFtZXMgdGhlbSwgc28gbm8gdG9rZW4gaW4gYSBmaWxlIHJlYWRzIGFzIGxvYWRpbmcuXG4gIHB1YmxpYyBleHBvcnRXb3JkaW5nKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgICBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydEV4cG9ydFdvcmRpbmc+IHtcbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuX3BpY2tOYW1lcihyZXBvcnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckZpZWxkcyhyZXBvcnQsIHNuYXBzaG90LCBuYW1lcylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlckZpZWxkcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHRpdGxlcyA9IHRoaXMuX2V4cG9ydFRpdGxlcyhyZXBvcnQsIHBhZ2VJZCwgZmlsdGVyRmllbGRzKTtcblxuICAgICAgICAgIHJldHVybiBleHBvcnRMaW5lcyh7IHJlcG9ydCwgc25hcHNob3QsIHBhZ2VJZCwgbmFtZXMsIHRpdGxlcyB9KVxuICAgICAgICAgICAgLnBpcGUobWFwKChsaW5lcykgPT4gKHsgbGluZXMsIGZpbHRlckZpZWxkcywgdGl0bGVzIH0pKSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB0aXRsZSBvZiBlYWNoIHRpbGUsIGJ5IGNvbXBvbmVudCBpZCwgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQ6XG4gIC8vIGl0cyB0b2tlbnMgZmlsbGVkIHdpdGggaXRzIHBhZ2UncyBmaWVsZHMgYW5kIHRoZSBmaWx0ZXJzIHRoZSBwYWdlIHJlYWRzXG4gIC8vIChsYXllckZpbHRlckZpZWxkcykuIFRoZSB3aG9sZSByZXBvcnQncyBvciBvbmUgcGFnZSdzIChwYWdlSWQpLiBBblxuICAvLyB1bnRpdGxlZCB0aWxlIGlzIGxlZnQgb3V0OiB0aGUgc2VydmVyIG5hbWVzIGl0cyBmaWxlIGJ5IGl0cyB0eXBlLlxuICBwcml2YXRlIF9leHBvcnRUaXRsZXMoXG4gICAgcmVwb3J0OiBSZXBvcnQsXG4gICAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICAgIGZpZWxkczogUmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPixcbiAgKTogUmVjb3JkPG51bWJlciwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIGluZGV4IH0pKVxuICAgICAgLmZpbHRlcigoeyBwYWdlIH0pID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKVxuICAgICAgLmZsYXRNYXAoKHsgcGFnZSwgaW5kZXggfSkgPT4ge1xuICAgICAgICBjb25zdCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQgPSB7XG4gICAgICAgICAgcGFnZU51bWJlcjogaW5kZXggKyAxLFxuICAgICAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICAgICAgICBmaWx0ZXJzOiBsYXllckZpbHRlckZpZWxkcyhmaWVsZHMsIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10sIHBhZ2UuaWQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkgJiYgISFjb21wb25lbnQudGl0bGUpXG4gICAgICAgICAgLm1hcCgoY29tcG9uZW50KTogW251bWJlciwgc3RyaW5nXSA9PiBbY29tcG9uZW50LmlkLCBmaWxsVGl0bGVUb2tlbnMoY29tcG9uZW50LnRpdGxlLCB0b2tlbnMpXSk7XG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBFdmVyeSByZXF1ZXN0IHRoZSBleHBvcnQgbWFrZXMsIGluIHBhZ2Ugb3JkZXI6IGVhY2ggcGFnZSdzIHRpbGVzLCB0aGVuIHRoZVxuICAvLyB2YWx1ZXMgaXRzIHRleHQgc2hvd3M7IHRoZSBoZWFkZXIgYW5kIGZvb3RlcidzIHZhbHVlcyBsYXN0LCB3aGVuIHNvbWUgcGFnZVxuICAvLyBzaG93cyB0aGUgbWFzdGVyLiBUZXh0IGJsb2NrcyBoYXZlIG5vdGhpbmcgdG8gZmV0Y2ggb2YgdGhlaXIgb3duIOKAlCB0aGV5XG4gIC8vIHJpZGUgdGhyb3VnaCB3aXRoIG5vIGRhdGEsIGFuZCB0aGVpciB0b2tlbnMgYXJlIGZpbGxlZCBmcm9tIHRoZWlyIGxheWVyJ3NcbiAgLy8gdmFsdWVzLiBBIHZhbHVlIGlzIHJlYWQgb25seSB0aHJvdWdoIGl0cyBsYXllcidzIHJlcXVlc3QsIG5ldmVyIGFzIGEgdGlsZVxuICAvLyAoaXNFeHBvcnRTbG90KS4gVGhlIGhlYWRlci9mb290ZXIgYmxvY2tzIChyZXBvcnQubWFzdGVyKSBhcmUgcmVhZCBieSB0aGVcbiAgLy8gcmVuZGVyZXJzIHN0cmFpZ2h0IG9mZiB0aGUgcmVwb3J0LlxuICBwcml2YXRlIF9qb2JzKHJlcG9ydDogUmVwb3J0KTogQ29sbGVjdEpvYltdIHtcbiAgICBjb25zdCBqb2JzOiBDb2xsZWN0Sm9iW10gPSBbXTtcblxuICAgIHJlcG9ydC5wYWdlcy5mb3JFYWNoKChwYWdlLCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIHBhZ2UuY29tcG9uZW50c1xuICAgICAgICAuZmlsdGVyKGlzRXhwb3J0U2xvdClcbiAgICAgICAgLmZvckVhY2goKGNvbXBvbmVudCkgPT4gam9icy5wdXNoKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleCwgY29tcG9uZW50IH0pKTtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHBhZ2UsIHBhZ2VJbmRleCkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlcG9ydC5tYXN0ZXIgJiYgcmVwb3J0LnBhZ2VzLnNvbWUoKHBhZ2UpID0+ICFwYWdlLm1hc3RlckhpZGRlbikpIHtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHJlcG9ydC5tYXN0ZXIsIG51bGwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9icztcbiAgfVxuXG4gIC8vIEEgbGF5ZXIncyBvbmUgdmFsdWVzIGpvYiwgb3Igbm9uZSB3aGVuIGl0cyB0ZXh0IHNob3dzIG5vIHZhbHVlLlxuICBwcml2YXRlIF92YWx1ZXNKb2JzKGxheWVyOiBSZXBvcnRQYWdlIHwgUmVwb3J0TWFzdGVyLCBwYWdlSW5kZXg6IG51bWJlciB8IG51bGwpOiBDb2xsZWN0Sm9iW10ge1xuICAgIGNvbnN0IHRleHRzID0gbGF5ZXIuY29tcG9uZW50cy5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jyk7XG4gICAgY29uc3QgdmFsdWVzID0gbGF5ZXIudmFsdWVzID8/IFtdO1xuICAgIGNvbnN0IHNob3duID0gc2hvd25WYWx1ZXModmFsdWVzLCB0ZXh0cyk7XG5cbiAgICByZXR1cm4gc2hvd24ubGVuZ3RoXG4gICAgICA/IFt7IGtpbmQ6ICd2YWx1ZXMnLCBwYWdlSW5kZXgsIHBhZ2VJZDogbGF5ZXIuaWQsIHZhbHVlcywgY29tcG9uZW50czogc2hvd24gfV1cbiAgICAgIDogW107XG4gIH1cblxuICAvLyBPbmUgcXVldWVkIGpvYiwgaXRzIHJlc3VsdCB0YWdnZWQgd2l0aCB0aGUgcGFnZSBpdCBpcyBmaWxlZCB1bmRlci5cbiAgcHJpdmF0ZSBfcnVuSm9iKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGpvYjogQ29sbGVjdEpvYixcbiAgICBsaXN0Um93czogbnVtYmVyLFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgKTogT2JzZXJ2YWJsZTxDb2xsZWN0UmVzdWx0PiB7XG4gICAgaWYgKGpvYi5raW5kID09PSAnY29tcG9uZW50Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBqb2IuY29tcG9uZW50LCBsaXN0Um93cywgc25hcHNob3QpXG4gICAgICAgIC5waXBlKG1hcCgoaXRlbSk6IENvbGxlY3RSZXN1bHQgPT4gKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleDogam9iLnBhZ2VJbmRleCwgaXRlbSB9KSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wYWdlVmFsdWVzKHJlcG9ydCwgam9iLnBhZ2VJZCwgam9iLnZhbHVlcywgam9iLmNvbXBvbmVudHMsIHNuYXBzaG90KVxuICAgICAgLnBpcGUobWFwKChjb2xsZWN0ZWQpOiBDb2xsZWN0UmVzdWx0ID0+ICh7IGtpbmQ6ICd2YWx1ZXMnLCBwYWdlSW5kZXg6IGpvYi5wYWdlSW5kZXgsIGNvbGxlY3RlZCB9KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBsaXN0Um93czogbnVtYmVyLFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zOiBbXSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gc25hcHNob3QuZmlsdGVyc1tjb21wb25lbnQuaWRdID8/IFtdO1xuICAgIC8vIFRoZSB0aWxlJ3Mgb3duIHN0YXRlLCB0aGUgb25lIGl0cyBzY3JlZW4gYW5kIGl0cyBDU1YgY2FycnlcbiAgICAvLyAodGlsZURhdGFTdGF0ZSk6IGEgdGltZS1zZXJpZXMgY2hhcnQgcmUtYnVja2V0cyBhdCB0aGUgdmlld2VyJ3MgZ3JhaW5cbiAgICAvLyBhbmQga2VlcHMgaXRzIGRyaWxsIHBhdGgsIGEgbGlzdCByZWFkcyBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIgYW5kIGhvbGRzXG4gICAgLy8gdGhlIHNjcmVlbidzIHJvd3MuIEEgbGlzdCBhZGRzIGl0cyBleHBvcnQgcGFnaW5nLlxuICAgIGNvbnN0IHRpbGVTdGF0ZSA9IHNuYXBzaG90LnN0YXRlc1tjb21wb25lbnQuaWRdID8/IHt9O1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgLi4udGlsZVN0YXRlLCBwYWdlOiAxLCBwYWdlU2l6ZTogbGlzdFJvd3MgfVxuICAgICAgOiB7IC4uLnRpbGVTdGF0ZSB9O1xuICAgIC8vIFRoZSB0YWJsZSBsZWF2ZXMgb3V0IHRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkLiBUaGUgcm93cyBhcmUgZmV0Y2hlZFxuICAgIC8vIHdob2xlLCBhcyB0aGUgc2NyZWVuIGZldGNoZXMgdGhlbSAodGhlIHNlcnZlciByZWFkcyBoaWRkZW5Db2x1bW5zIGZvciBhXG4gICAgLy8gQ1NWIG9ubHkpLCBhbmQgdGhlIHJlbmRlcmVycyBkcm9wIHRoZSBjZWxscy5cbiAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gWy4uLihzdGF0ZS5oaWRkZW5Db2x1bW5zID8/IFtdKV07XG5cbiAgICAvLyBoYW5kbGVyczogZmFsc2Uga2VlcHMgdGhlIGFwcCdzIGdsb2JhbCBlcnJvciBkaWFsb2cgb3V0IG9mIHRoaXMuIEEgZmFpbGVkXG4gICAgLy8gdGlsZSBpcyByZXBvcnRlZCBvbmNlLCBieSB0aGUgZmFpbHVyZSBnYXRlLCBuYW1pbmcgdGhlIHBhZ2VzIGl0IGNvc3Qg4oCUXG4gICAgLy8gbmV2ZXIgYXMgdGVuIHN0YWNrZWQgbW9kYWxzIGNhcnJ5aW5nIHRoZSBkYXRhYmFzZSdzIG93biB3b3JkaW5nLlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEocmVwb3J0LmlkLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4gdGhpcy5fY29sbGVjdGVkKGNvbXBvbmVudCwgZGF0YSwgc3RhdGUuc2VhcmNoLCBoaWRkZW5Db2x1bW5zLCBzbmFwc2hvdCkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBPbmUgdGlsZSdzIGFuc3dlciBhcyB0aGUgcmVuZGVyZXJzIHRha2UgaXQuIEEgc2VhcmNoIHRoZSBzZXJ2ZXIgY291bGRcbiAgLy8gbm90IGFwcGx5IChzZWFyY2hOb3RlOiB0aGUgbGlzdCBoYXMgbm8gdGV4dCBjb2x1bW4pIG5hcnJvd2VkIG5vdGhpbmcsIHNvXG4gIC8vIHRoZSBpdGVtIGRvZXMgbm90IGNhcnJ5IGl0LiBBIGRyaWxsZWQgY2hhcnQgY2FycmllcyB0aGUgYnJlYWRjcnVtYiBvZiB0aGVcbiAgLy8gcGF0aCBpdHMgYW5zd2VyIGFwcGxpZWQsIHdoaWNoIGlzIHdoYXQgaXRzIG51bWJlcnMgd2VyZSByZWFkIGF0LlxuICBwcml2YXRlIF9jb2xsZWN0ZWQoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXSxcbiAgICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gICk6IENvbGxlY3RlZENvbXBvbmVudCB7XG4gICAgY29uc3QgcGF0aCA9IGRhdGE/LmRyaWxsPy5wYXRoID8/IFtdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGRhdGEsXG4gICAgICAuLi4oc2VhcmNoICYmICFkYXRhPy5zZWFyY2hOb3RlID8geyBzZWFyY2ggfSA6IHt9KSxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICAuLi4ocGF0aC5sZW5ndGggPyB7IGNydW1iczogZHJpbGxDcnVtYkxhYmVscyhwYXRoLCBzbmFwc2hvdC5mb3JtYXRDb250ZXh0KSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBFYWNoIGdyb3VwJ3MgdmFsdWUgYXMgdGhlIGJhciBob2xkcyBpdCBub3csIHdpdGggdGhlIHJlbGF0aXZlIHJhbmdlIGFcbiAgLy8gZGF0ZSB2YWx1ZSBzdGlsbCBpcy4gVGhlIHBpY2tzIGFyZSBjb3BpZWQsIHNvIHRoZSBzbmFwc2hvdCBrZWVwcyB0aGVtXG4gIC8vIHdoYXRldmVyIHRoZSBiYXIgZG9lcyBuZXh0LlxuICBwcml2YXRlIF9ncm91cFZhbHVlcyhyZXBvcnQ6IFJlcG9ydCk6IFBpY2s8UmVwb3J0RXhwb3J0U25hcHNob3QsICd2YWx1ZXMnIHwgJ3ByZXNldHMnPiB7XG4gICAgY29uc3QgdmFsdWVzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPiA9IHt9O1xuICAgIGNvbnN0IHByZXNldHM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFJlbGF0aXZlUmFuZ2U+ID0ge307XG5cbiAgICAocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fZmlsdGVyU3RhdGUubGl2ZVByZXNldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZXNbZ3JvdXAuaWRdID0ge1xuICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgIC4uLih2YWx1ZS52YWx1ZXMgPyB7IHZhbHVlczogWy4uLnZhbHVlLnZhbHVlc10gfSA6IHt9KSxcbiAgICAgICAgICAuLi4odmFsdWUuZXhjbHVkZVZhbHVlcyA/IHsgZXhjbHVkZVZhbHVlczogWy4uLnZhbHVlLmV4Y2x1ZGVWYWx1ZXNdIH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0KSB7XG4gICAgICAgIHByZXNldHNbZ3JvdXAuaWRdID0gcHJlc2V0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgdmFsdWVzLCBwcmVzZXRzIH07XG4gIH1cblxuICAvLyBPbmUgbGF5ZXIncyB2YWx1ZXMsIHJlYWQgaW4gb25lIHJlcXVlc3QsIGFzIGl0cyB0ZXh0J3MgdG9rZW5zIHByaW50IHRoZW0uXG4gIC8vIFRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGZpbHRlciB2YWx1ZXMgb2YgZXZlcnkgdmFsdWUgb24gdGhlIGxheWVyLCBhcyB0aGVcbiAgLy8gY2FudmFzJ3MgZG9lcywgcmVhZCBmcm9tIHRoZSBleHBvcnQncyBzbmFwc2hvdCBsaWtlIGV2ZXJ5IHRpbGUncywgYW5kXG4gIC8vIHdoaWxlIHRoZSBncm91cHMgbWF0Y2ggJ2FueScgdGhlIGdyb3VwcyB0aGF0IGNvbWJpbmVcbiAgLy8gKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpOiB0aGUgc2VydmVyIGRlY2lkZXMgd2hpY2ggdmFsdWVzIGl0IHJlYWRzICh0aGVcbiAgLy8gc2hvd24gb25lcyBhbmQgdGhlIG9wZXJhbmRzIG9mIHRoZSBmb3JtdWxhcyBhbW9uZyB0aGVtKSBhbmQgYXBwbGllcyB0b1xuICAvLyBlYWNoIG9ubHkgdGhlIGVudHJpZXMgbmFtaW5nIGl0cyBvd24gZmlsdGVycy4gaGFuZGxlcnM6IGZhbHNlIGtlZXBzIHRoZVxuICAvLyBlcnJvciBkaWFsb2cgb3V0IG9mIGl0LCBhcyBmb3IgYSB0aWxlLiBBIGZhaWxlZCByZXF1ZXN0IHJlYWRzIGFzIG5vIHJvd3MsXG4gIC8vIHNvIGV2ZXJ5IHZhbHVlIHRoZSB0ZXh0IHNob3dzIGZhaWxlZCBhbmQgdGhlIGZhaWx1cmUgZ2F0ZSBuYW1lcyBpdHMgcGFnZTtcbiAgLy8gb25lIHZhbHVlJ3Mgb3duIGVycm9yIGZhaWxzIG9ubHkgdGhhdCB2YWx1ZSwgYW5kIGEgZmFpbGVkIG9wZXJhbmQgZmFpbHNcbiAgLy8gdGhlIGZvcm11bGEgdGhhdCByZWFkcyBpdC5cbiAgcHJpdmF0ZSBfcGFnZVZhbHVlcyhcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBwYWdlSWQ6IG51bWJlcixcbiAgICB2YWx1ZXM6IFJlcG9ydENvbXBvbmVudFtdLFxuICAgIHNob3duOiBSZXBvcnRDb21wb25lbnRbXSxcbiAgICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gICk6IE9ic2VydmFibGU8Q29sbGVjdGVkVmFsdWVzPiB7XG4gICAgY29uc3QgZm9ybWF0Q29udGV4dCA9IHNuYXBzaG90LmZvcm1hdENvbnRleHQ7XG4gICAgY29uc3QgZmlsdGVycyA9IHZhbHVlcy5mbGF0TWFwKChjb21wb25lbnQpID0+IHNuYXBzaG90LnZhbHVlRmlsdGVyc1tjb21wb25lbnQuaWRdID8/IFtdKTtcbiAgICBjb25zdCBtYXRjaEFueUdyb3VwSWRzID0gdmFsdWVzTWF0Y2hBbnlHcm91cElkcyhyZXBvcnQsIHBhZ2VJZCwgc25hcHNob3Qudmlldyk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5wYWdlVmFsdWVzKHJlcG9ydC5pZCwgcGFnZUlkLCBmaWx0ZXJzLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9LCBtYXRjaEFueUdyb3VwSWRzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocm93cykgPT4gbmV3IE1hcCgocm93cyA/PyBbXSkubWFwKChyb3cpID0+IFtyb3cuaWQsIHJvd10pKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobmV3IE1hcDxudW1iZXIsIFJlcG9ydFBhZ2VWYWx1ZT4oKSkpLFxuICAgICAgICBtYXAoKHJvd3MpID0+ICh7XG4gICAgICAgICAgdmFsdWVzOiB0ZXh0VmFsdWVzKHZhbHVlcywgeyByb3dzIH0sIGZvcm1hdENvbnRleHQpLFxuICAgICAgICAgIGZhaWxlZFZhbHVlczogZmFpbGVkVmFsdWVLZXlzKHNob3duLCByb3dzKSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXN1bHRzIGZpbGVkIGJ5IHBhZ2UgaW4gam9iIG9yZGVyLiBBIGxheWVyIHdpdGggbm8gdmFsdWVzIGpvYiAoaXRzXG4gIC8vIHRleHQgc2hvd3Mgbm8gdmFsdWUpIGhhcyBubyBudW1iZXJzIHRvIHdhaXQgZm9yOiBpdHMgdmFsdWVzIHJlYWQgYXMgdGhlXG4gIC8vIGVtIGRhc2gsIGFuZCBub25lIG9mIHRoZW0gZmFpbGVkLlxuICBwcml2YXRlIF9maWxlKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHJlc3VsdHM6IHsgcmVzdWx0OiBDb2xsZWN0UmVzdWx0OyBpbmRleDogbnVtYmVyIH1bXSxcbiAgICBmb3JtYXRDb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICApOiBQaWNrPENvbGxlY3RlZFJlcG9ydCwgJ3BhZ2VzJyB8ICdtYXN0ZXJWYWx1ZXMnIHwgJ21hc3RlckZhaWxlZFZhbHVlcyc+IHtcbiAgICBjb25zdCB1bnJlYWQgPSAodmFsdWVzOiBSZXBvcnRDb21wb25lbnRbXSB8IHVuZGVmaW5lZCk6IENvbGxlY3RlZFZhbHVlcyA9PiAoe1xuICAgICAgdmFsdWVzOiB0ZXh0VmFsdWVzKHZhbHVlcyA/PyBbXSwgeyByb3dzOiBuZXcgTWFwKCkgfSwgZm9ybWF0Q29udGV4dCksXG4gICAgICBmYWlsZWRWYWx1ZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW10gPSByZXBvcnQucGFnZXMubWFwKChwYWdlKSA9PiAoeyBwYWdlLCBjb21wb25lbnRzOiBbXSwgLi4udW5yZWFkKHBhZ2UudmFsdWVzKSB9KSk7XG4gICAgbGV0IG1hc3RlciA9IHVucmVhZChyZXBvcnQubWFzdGVyPy52YWx1ZXMpO1xuXG4gICAgWy4uLnJlc3VsdHNdXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAuZm9yRWFjaCgoeyByZXN1bHQgfSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmtpbmQgPT09ICdjb21wb25lbnQnKSB7XG4gICAgICAgICAgcGFnZXNbcmVzdWx0LnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKHJlc3VsdC5pdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQucGFnZUluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgbWFzdGVyID0gcmVzdWx0LmNvbGxlY3RlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHBhZ2VzW3Jlc3VsdC5wYWdlSW5kZXhdLCByZXN1bHQuY29sbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBwYWdlcywgbWFzdGVyVmFsdWVzOiBtYXN0ZXIudmFsdWVzLCBtYXN0ZXJGYWlsZWRWYWx1ZXM6IG1hc3Rlci5mYWlsZWRWYWx1ZXMgfTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLCBhbmQgdGhlIGN1cnJlbmN5IGl0IHNheXNcbiAgLy8gdGhlIHJlcG9ydCdzIG1vbmV5IGlzIGluIChhIGxhYmVsOiBub3RoaW5nIGlzIGNvbnZlcnRlZCkuIE9ubHkgdGhlXG4gIC8vIHNlcnZlcidzIHZhbHVlcyBhcmUgcHJpbnRlZDogdGhlIGJyb3dzZXIncyB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUnc1xuICAvLyBmYWxsYmFjayBmb3IgYW4gb2xkZXIgc2VydmVyKSBpcyBub3Qgd2hhdCB0aGUgbnVtYmVycyB3ZXJlIG1lYXN1cmVkIGluLFxuICAvLyBhbmQgYW4gb2xkZXIgc2VydmVyIG5hbWVzIG5vIGN1cnJlbmN5IGF0IGFsbC5cbiAgcHJpdmF0ZSBfY29udGV4dExpbmVzKHJlcG9ydDogUmVwb3J0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXSksXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5ID8gW2BDdXJyZW5jeTogJHtyZXBvcnQuZWZmZWN0aXZlQ3VycmVuY3l9YF0gOiBbXSksXG4gICAgXTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGZpbHRlciBncm91cCBvZiB0aGUgcmVwb3J0IGFzIGl0cyB7e2ZpbHRlci48aWQ+fX0gdG9rZW4gcHJpbnRzIGl0XG4gIC8vIGluIHRoZSBmaWxlLCBhdCB0aGUgc25hcHNob3QncyB2YWx1ZXMgYW5kIGluIGl0cyBmb3JtYXQsIGFzIHRoZSBjYW52YXNcbiAgLy8gd29yZHMgaXQuIEEgc2VsZWN0J3MgcGlja3MgYXJlIG5hbWVkIGZpcnN0LCBzbyBubyB0b2tlbiBpbiB0aGUgZmlsZVxuICAvLyByZWFkcyBhcyBsb2FkaW5nLiBFYWNoIHBhZ2UgYW5kIHRoZSBoZWFkZXIgYW5kIGZvb3RlciByZWFkIHRoZWlyIG93blxuICAvLyBncm91cHMgb2YgdGhlc2UgKGxheWVyRmlsdGVyRmllbGRzKS5cbiAgcHJpdmF0ZSBfZmlsdGVyRmllbGRzKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgICBuYW1lczogUmVwb3J0RXhwb3J0TGluZXNJbnB1dFsnbmFtZXMnXSxcbiAgKTogT2JzZXJ2YWJsZTxSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXTtcbiAgICBjb25zdCBwaWNrZWQgPSBncm91cHNcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiAoeyBncm91cCwgdmFsdWVzOiB2YWx1ZVBpY2tzKHNuYXBzaG90LnZhbHVlc1tncm91cC5pZF0pIH0pKVxuICAgICAgLmZpbHRlcigoeyBncm91cCwgdmFsdWVzIH0pID0+IGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnICYmIHZhbHVlcy5sZW5ndGgpO1xuICAgIGNvbnN0IG5hbWVzJCA9IHBpY2tlZC5sZW5ndGhcbiAgICAgID8gZm9ya0pvaW4ocGlja2VkLm1hcCgoeyBncm91cCwgdmFsdWVzIH0pID0+IG5hbWVzKGdyb3VwLCB2YWx1ZXMpKSlcbiAgICAgIDogb2YoW10gYXMgc3RyaW5nW11bXSk7XG5cbiAgICByZXR1cm4gbmFtZXMkLnBpcGUoXG4gICAgICBtYXAoKG5hbWVkKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5R3JvdXAgPSBuZXcgTWFwKHBpY2tlZC5tYXAoKHsgZ3JvdXAgfSwgaW5kZXgpID0+IFtncm91cC5pZCwgbmFtZWRbaW5kZXhdXSkpO1xuXG4gICAgICAgIHJldHVybiB0ZXh0RmlsdGVyRmllbGRzKFxuICAgICAgICAgIGdyb3VwcyxcbiAgICAgICAgICAoZ3JvdXBJZCkgPT4gc25hcHNob3QudmFsdWVzW2dyb3VwSWRdLFxuICAgICAgICAgIHNuYXBzaG90LmZvcm1hdENvbnRleHQubG9jYWxlLFxuICAgICAgICAgIChncm91cCkgPT4gYnlHcm91cC5nZXQoZ3JvdXAuaWQpLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIE5hbWVzIGEgc2VsZWN0IGdyb3VwJ3MgcGlja3MgKGtlcHQgb3IgbGVmdCBvdXQpIGZvciBvbmUgZXhwb3J0LCB0aGVpclxuICAvLyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZSBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlclxuICAvLyByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXRcbiAgLy8gdGhlIHJlcG9ydCBjb3ZlcnMuIEVhY2ggZ3JvdXAncyBmdWxsIGxpc3QgaXMgcmVhZCBvbmNlIGZvciB0aGUgZXhwb3J0LFxuICAvLyB3aGF0ZXZlciBuYW1lcyBpdHMgcGlja3M6IGl0cyBmaWx0ZXIgbGluZSwgaXRzIHRva2VuLCBhIHRpdGxlLlxuICAvL1xuICAvLyBVc2VzIHRoZSByZXBvcnQgYmFyJ3Mgb3duIG5hbWVzIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0OiBhXG4gIC8vIG5hbWUgdGhlIGJhcidzIGxpc3RzIHRhdWdodCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpIGNvbWVzIGZpcnN0LFxuICAvLyBzbyBhIHBpY2sgYSBjdXQgb3IgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0IHJlYWRzIGFzIGl0cyBjaGlwIGRvZXMsIGFuZFxuICAvLyB0aGUgZnVsbCBsaXN0IG5hbWVzIHRoZSByZXN0LiBBIHZhbHVlIHdob3NlIGVudGl0eSB3YXMgZGVsZXRlZCBrZWVwc1xuICAvLyBzaG93aW5nIGl0cyByYXcgaWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgb2ZmIHRoZSBjb3ZlciBhbmQgc2lsZW50bHlcbiAgLy8gdW5kZXJzdGF0aW5nIHRoZSBmaWx0ZXIuIEEgZmFpbGVkIG9wdGlvbiBmZXRjaCBkZWdyYWRlcyB0aGUgd2hvbGUgbGluZSB0b1xuICAvLyBpZHMgZm9yIHRoZSBzYW1lIHJlYXNvbjogYW4gZXhwb3J0IG11c3QgbmV2ZXIgZmFpbCBvbiBhIGNvc21ldGljIGxvb2t1cC5cbiAgcHJpdmF0ZSBfcGlja05hbWVyKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0RXhwb3J0TGluZXNJbnB1dFsnbmFtZXMnXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGdyb3VwT3B0aW9uc1JlYWRlcih0aGlzLl9yZXBvcnREYXRhKTtcblxuICAgIHJldHVybiAoZ3JvdXAsIHZhbHVlcykgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhcbiAgICAgIG9wdGlvbnMoZ3JvdXAsIHJlcG9ydC5pZCksXG4gICAgICB2YWx1ZXMsXG4gICAgICAodmFsdWUpID0+IHRoaXMuX2ZpbHRlck9wdGlvbnMubGFiZWwoZ3JvdXAuaWQsIHZhbHVlKSxcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gcmVzb2x2ZWQubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpKSksXG4gICAgICApO1xuICB9XG59XG4iXX0=
625
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixxQkFBcUIsR0FDdEIsTUFBTSxXQUFXLENBQUM7QUFvQm5CLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixxQkFBcUIsR0FDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVB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QUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQ3pCLE1BQU0sRUFDTixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FDdEQ7YUFDRSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDcEQsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pELENBQUM7SUFDTixDQUFDO3dHQTdZVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgY3J1bWJlZFRpdGxlLCBkcmlsbENydW1iTGFiZWxzIH0gZnJvbSAnLi4vZHJpbGwtY3J1bWJzJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgbGF5ZXJGaWx0ZXJGaWVsZHMsIHRleHRGaWx0ZXJGaWVsZHMgfSBmcm9tICcuLi9maWx0ZXItdGV4dCc7XG5pbXBvcnQge1xuICBEQVlfTE9ORyxcbiAgZm9ybWF0TG9jYWxEYXRlLFxuICBmb3JtYXROdW1iZXIsXG4gIGZvcm1hdE91dHB1dFZhbHVlLFxuICBmb3JtYXRSZXBvcnREYXRlLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0TGluZXNJbnB1dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1saW5lcy1pbnB1dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtc25hcHNob3QuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydExvY2FsZVRhZyxcbiAgUmVwb3J0TWFzdGVyLFxuICBSZXBvcnRQYWdlLFxuICBSZXBvcnRQYWdlVmFsdWUsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBLcGlDYXJkVmlldyB9IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7XG4gIExJU1RfVE9UQUxfTEFCRUwsXG4gIExpc3RPdXRwdXRDb2x1bW4sXG4gIGxpc3RIaWRkZW5Db2x1bW5zLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFRvdGFsc0xhYmVsQ29sdW1uLFxufSBmcm9tICcuLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBwaXZvdENvbHVtblNwZWNzIH0gZnJvbSAnLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgY29tcG9uZW50Tm90ZUxpbmVzLCBjb21wb25lbnRXaW5kb3dzTGluZSB9IGZyb20gJy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBncm91cE9wdGlvbnNSZWFkZXIsIHJlc29sdmVPcHRpb25WYWx1ZXMgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7IG9mZmVyZWRWaWV3ZXJGZWF0dXJlcyB9IGZyb20gJy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dEZpbHRlckZpZWxkLCBUZXh0VG9rZW5Db250ZXh0LCBUZXh0VmFsdWUsIGZpbGxUaXRsZVRva2VucywgdGV4dFBsYWluIH0gZnJvbSAnLi4vdGV4dCc7XG5pbXBvcnQgeyB0aWxlRGF0YVN0YXRlLCB2YWx1ZXNNYXRjaEFueUdyb3VwSWRzIH0gZnJvbSAnLi4vdGlsZS1kYXRhLXN0YXRlJztcbmltcG9ydCB7XG4gIGZhaWxlZFZhbHVlS2V5cywgcmVwb3J0Q29tcG9uZW50cywgc2hvd25WYWx1ZXMsIHRleHRWYWx1ZXMsIHZhbHVlS2V5cyxcbn0gZnJvbSAnLi4vdmFsdWVzJztcblxuaW1wb3J0IHsgZXhwb3J0TGluZXMsIG1hdGNoTGluZVRleHQsIHZhbHVlUGlja3MgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbiAgLy8gVGhlIHRleHQgYSBsaXN0IHdhcyBzZWFyY2hlZCBieSB3aGVuIGl0IHdhcyBmZXRjaGVkOyBhYnNlbnQgd2hlbiBpdHNcbiAgLy8gc2VhcmNoIGJveCB3YXMgZW1wdHksIGFuZCBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBwbGFpbiBsaXN0LCB3aGljaCBpdHMgdGFibGUgbGVhdmVzXG4gIC8vIG91dCAobGlzdENvbHVtbnMpOyBlbXB0eSBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXTtcbiAgLy8gVGhlIGJyZWFkY3J1bWIgb2YgdGhlIGRyaWxsIHBhdGggYSBjaGFydCB3YXMgcmVhZCBhdCAodGhlIHBhdGggaXRzXG4gIC8vIGFuc3dlciBhcHBsaWVkKSwgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTsgYWJzZW50IGF0IHRoZSBjaGFydCdzIHRvcC5cbiAgY3J1bWJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUGFnZSB7XG4gIHBhZ2U6IFJlcG9ydFBhZ2U7XG4gIGNvbXBvbmVudHM6IENvbGxlY3RlZENvbXBvbmVudFtdO1xuICAvLyBXaGF0IHRoZSBwYWdlJ3MgdGV4dCBibG9ja3MgZmlsbCB0aGVpciB7e3ZhbHVlLjxrZXk+fX0gdG9rZW5zIHdpdGgsIGJ5IGtleVxuICAvLyAodGV4dFZhbHVlcyksIGFuZCB0aGUga2V5cyBvZiB0aGUgdmFsdWVzIGl0cyB0ZXh0IHNob3dzIHdob3NlIG51bWJlcnMgZGlkXG4gIC8vIG5vdCBjb21lIGJhY2s6IHRoZSByZXF1ZXN0IGZhaWxlZCwgb3IgdGhlIHZhbHVlJ3Mgb3duIHF1ZXJ5IGRpZC5cbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+O1xuICBmYWlsZWRWYWx1ZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFJlcG9ydCB7XG4gIHJlcG9ydDogUmVwb3J0O1xuICBwYWdlczogQ29sbGVjdGVkUGFnZVtdO1xuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIncyB2YWx1ZXMsIGFzIGEgcGFnZSdzOiByZWFkIG9uY2UgZm9yIHRoZSB3aG9sZVxuICAvLyBmaWxlLCBzaW5jZSBldmVyeSBwYWdlIHRoYXQgc2hvd3MgdGhlIG1hc3RlciBzaG93cyB0aGUgc2FtZSBudW1iZXJzLlxuICBtYXN0ZXJWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT47XG4gIG1hc3RlckZhaWxlZFZhbHVlczogc3RyaW5nW107XG4gIC8vIFRoZSBmaWx0ZXIgbGluZXMgb2YgdGhlIHRpdGxlIHNsaWRlL3BhZ2UsIGluIG9yZGVyOiB0aGVcbiAgLy8gZXhwb3J0J3MgZmlsdGVyIGxpbmVzIChjb3ZlckZpbHRlckxpbmVzKSwgdGhlbiB0aGUgbWF0Y2ggd2hpbGUgaXQgaXNcbiAgLy8gJ2FueScuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IGVhY2gge3tmaWx0ZXIuPGlkPn19IHRva2VuIHByaW50cywgYnkgZmlsdGVyIGdyb3VwIGlkOiB0aGUgZmlsdGVyXG4gIC8vIGJhcidzIHZhbHVlcyBhcyB0aGUgc2NyZWVuIHdvcmRzIHRoZW0sIHJlYWQgb25jZSBzbyBldmVyeSBwYWdlIG9mIHRoZVxuICAvLyBmaWxlIGFncmVlcy4gRXZlcnkgZ3JvdXAnczogYSBwYWdlIHJlYWRzIGl0cyBvd24gKGxheWVyRmlsdGVyRmllbGRzKS5cbiAgZmlsdGVyRmllbGRzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSBhbmRcbiAgLy8gdGhlIGN1cnJlbmN5IHRoZSBzZXJ2ZXIgcmVzb2x2ZWQgZm9yIHRoZSByZXBvcnQuIEVhY2ggaXMgbGVmdCBvdXQgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGRvZXMgbm90IHNlbmQgaXQsIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlclxuICAvLyB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKGl0cyBsb2NhbGUsIGN1cnJlbmN5XG4gIC8vIGFuZCBwZXJjZW50IGZvcm0pLCByZWFkIG9uY2Ugc28gZXZlcnkgcGFnZSBvZiB0aGUgZmlsZSBhZ3JlZXMuXG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG59XG5cbi8vIEhvdyBhbiBleHBvcnQgd29yZHMgdGhlIHNjcmVlbiAoZXhwb3J0V29yZGluZyk6IHRoZSBmaWx0ZXIgbGluZXMgKHRoZVxuLy8gY292ZXIncywgYW5kIHRoZSB6aXAncyBub3RlcyksIHdoYXQgZWFjaCB7e2ZpbHRlci48aWQ+fX0gdG9rZW4gcHJpbnRzLCBieVxuLy8gZmlsdGVyIGdyb3VwIGlkLCBhbmQgZWFjaCB0aWxlJ3MgdGl0bGUgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQsIGJ5XG4vLyBjb21wb25lbnQgaWQsIHdoaWNoIHRoZSB6aXAgbmFtZXMgdGhlIHRpbGUncyBmaWxlIGFmdGVyLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRFeHBvcnRXb3JkaW5nIHtcbiAgbGluZXM6IFJlcG9ydEV4cG9ydExpbmVbXTtcbiAgZmlsdGVyRmllbGRzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICB0aXRsZXM6IFJlY29yZDxudW1iZXIsIHN0cmluZz47XG59XG5cbi8vIEEgdGV4dCBibG9jayB3aG9zZSB3b3JkcyBkbyBub3QgZml0IGl0cyBib3ggaW4gYSBidWlsdCBmaWxlOiB0aGUgYmxvY2ssIHRoZVxuLy8gcGFnZSB0aGUgb3ZlcmZsb3cgZ2F0ZSBuYW1lcyBpdCB1bmRlciAoSEVBREVSX0ZPT1RFUl9OQU1FIGZvciBhIGhlYWRlciBvclxuLy8gZm9vdGVyIGJsb2NrKSBhbmQgdGhlIHN0YXJ0IG9mIGl0cyB0ZXh0LCBzbyB0aGUgcmVhZGVyIGNhbiBmaW5kIGl0LlxuZXhwb3J0IGludGVyZmFjZSBUZXh0T3ZlcmZsb3cge1xuICBjb21wb25lbnRJZDogbnVtYmVyO1xuICBwYWdlOiBzdHJpbmc7XG4gIHNuaXBwZXQ6IHN0cmluZztcbn1cblxuLy8gQSBmaWxlIGJ1aWx0IGFuZCBub3QgeWV0IHNhdmVkLiBXaGV0aGVyIHRleHQgZml0cyBpdHMgYm94IGlzIGtub3duIG9ubHkgb25jZVxuLy8gdGhlIGZpbGUgaXMgYnVpbHQsIHNvIHRoZSBleHBvcnQgYXNrcyBhYm91dCB0aGUgb3ZlcmZsb3dzIGJldHdlZW4gdGhlIGJ1aWxkXG4vLyBhbmQgdGhlIHNhdmU6IGBvdmVyZmxvd05vdGVgIHNheXMgd2hhdCB0aGlzIGZvcm1hdCBkb2VzIHdpdGggc3VjaCB0ZXh0LCBhbmRcbi8vIGBzYXZlYCB3cml0ZXMgdGhlIGZpbGUuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0RXhwb3J0IHtcbiAgb3ZlcmZsb3dzOiBUZXh0T3ZlcmZsb3dbXTtcbiAgb3ZlcmZsb3dOb3RlOiBzdHJpbmc7XG4gIHNhdmU6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyBPbmUgZXhwb3J0ZWQgbGlzdCBjb2x1bW46IHRoZSBjZWxsIGtleSwgaXRzIGhlYWRpbmcgYW5kIGl0cyBmb3JtYXQsIGFuZFxuLy8gd2hldGhlciBpdHMgY2VsbHMgYXJlIGZvcm1hdHRlZCBudW1iZXJzLCB3aGljaCBldmVyeSBleHBvcnQgcmlnaHQtYWxpZ25zXG4vLyAoaGVhZGVyIGluY2x1ZGVkKSBhcyB0aGUgc2NyZWVuIGRvZXMuIEEgY29sdW1uIHRoYXQgaG9sZHMgYSBjb21wYXJlZCxcbi8vIHdpbmRvd2VkLCByYW5rZWQgb3Igc2hhcmVkIG91dHB1dCBjYXJyaWVzIGhvdyBpdCBpcyB3cml0dGVuIChvdXRwdXQpLCBhbmRcbi8vIGhvbGRzIG51bWJlcnMgd2hldGhlciBvciBub3QgaXQgbmFtZXMgYSBmb3JtYXQuXG5leHBvcnQgdHlwZSBFeHBvcnRMaXN0Q29sdW1uID0gTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbjsgb3V0cHV0PzogTGlzdE91dHB1dENvbHVtbiB9O1xuXG4vLyBIb3cgdGFsbCBlYWNoIHBhcnQgb2YgYW4gZXhwb3J0ZWQgS1BJIGNhcmQgaXMsIGluIHRoZSByZW5kZXJlcidzIHVuaXRcbi8vIChwb2ludHMgaW4gdGhlIFBERiwgaW5jaGVzIGluIHRoZSBkZWNrKS4gQSBub3RlIGlzIG9uZSBsaW5lLlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRIZWlnaHRzIHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgbGFiZWw6IG51bWJlcjtcbiAgZGVsdGE6IG51bWJlcjtcbiAgd2luZG93OiBudW1iZXI7XG4gIHRhcmdldDogbnVtYmVyO1xuICBzcGFya2xpbmU6IG51bWJlcjtcbiAgbm90ZTogbnVtYmVyO1xufVxuXG4vLyBUaGUgcGFydHMgb2YgYSBLUEkgY2FyZCBhbiBleHBvcnQgZHJhd3M6IHRoZSB2YWx1ZSBhbmQgaXRzIGxhYmVsIGFsd2F5cyxcbi8vIHRoZSByZXN0IHdoZW4gdGhlIGNhcmQgaGFzIHRoZW0gYW5kIHRoZSB0aWxlIGhhcyByb29tIChrcGlFeHBvcnRQYXJ0cykuXG4vLyBzY2FsZSBzaHJpbmtzIHRoZSByb3dzIGFuZCB0aGVpciB0ZXh0IHdoZW4gdGhlIHBhcnRzIHRoYXQgYWx3YXlzIHN0YXkgc3RpbGxcbi8vIHN0YW5kIHRhbGxlciB0aGFuIHRoZSB0aWxlIChzY2FsZWRLcGlIZWlnaHRzKTogMSB3aGVuIHRoZXkgZml0LlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRQYXJ0cyB7XG4gIGRlbHRhOiBib29sZWFuO1xuICB3aW5kb3c6IGJvb2xlYW47XG4gIHRhcmdldDogYm9vbGVhbjtcbiAgc3BhcmtsaW5lOiBib29sZWFuO1xuICBub3Rlczogc3RyaW5nW107XG4gIHNjYWxlOiBudW1iZXI7XG59XG5cbi8vIEhvdyBmYXIgYSBLUEkgY2FyZCdzIHJvd3Mgc2hyaW5rIHRvIGZpdCBhIHNob3J0IHRpbGUuIEEgdGlsZSBzaG9ydGVyIHN0aWxsXG4vLyBsZXRzIHRoZSBjYXJkIHJ1biBwYXN0IGl0cyBmb290IHJhdGhlciB0aGFuIHByaW50IGl0IHVucmVhZGFibHkgc21hbGwuXG5jb25zdCBLUElfRVhQT1JUX01JTl9TQ0FMRSA9IDAuNTtcblxuLy8gSG93IG1hbnkgdGlsZSBxdWVyaWVzIGFuIGV4cG9ydCBydW5zIGF0IG9uY2UuXG4vL1xuLy8gTm90IGEgcG9saXRlbmVzcyBzZXR0aW5nIOKAlCBpdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgZGVjayBhbmQgYSBicm9rZW5cbi8vIG9uZS4gVGhlc2UgcXVlcmllcyBhcmUgaGVhdnkgYW5kIHJlYWQgdGhlIHNhbWUgdGFibGVzLCBzbyBmaXJpbmcgYWxsIG9mIHRoZW1cbi8vIHRvZ2V0aGVyIHB1dHMgZXZlcnkgb25lIGluIGNvbnRlbnRpb24gZm9yIHRoZSBzYW1lIGRhdGFiYXNlIGF0IHRoZSBzYW1lXG4vLyBtb21lbnQgYW5kIHRoZXkgY3Jvc3MgdGhlIHN0YXRlbWVudCBjZWlsaW5nIGFzIGEgZ3JvdXA6IG1lYXN1cmVkIG9uIHJlcG9ydFxuLy8gMjgsIHRlbiB0aWxlcyB0aGF0IGVhY2ggYW5zd2VyIGluIDktMjRzIHJ1biBvbmUgYWZ0ZXIgYW5vdGhlciBhbGwgZmFpbGVkIGF0XG4vLyB+MzBzIHdoZW4gcmVsZWFzZWQgdG9nZXRoZXIuIENvbmN1cnJlbmN5IGJ1eXMgd2FsbC1jbG9jayBvbmx5IHVwIHRvIHRoZSBwb2ludFxuLy8gd2hlcmUgdGhlIHF1ZXJpZXMgc3RhcnQgdGFraW5nIGl0IGJhY2sgb2ZmIGVhY2ggb3RoZXIsIGFuZCBwYXN0IHRoYXQgaXQgYnV5c1xuLy8gZmFpbHVyZXMuXG5jb25zdCBFWFBPUlRfQ09OQ1VSUkVOQ1kgPSAzO1xuXG4vLyBXaGF0IHRoZSBleHBvcnQgZ2F0ZXMgY2FsbCB0aGUgaGVhZGVyIGFuZCBmb290ZXI6IHdoZW4gYSB2YWx1ZSB0aGV5IHNob3dcbi8vIGNhbWUgYmFjayB3aXRob3V0IGl0cyBudW1iZXIsIGFuZCB3aGVuIG9uZSBvZiB0aGVpciB0ZXh0IGJsb2NrcyBkb2VzIG5vdFxuLy8gZml0IGl0cyBib3guXG5leHBvcnQgY29uc3QgSEVBREVSX0ZPT1RFUl9OQU1FID0gJ0hlYWRlciAmIGZvb3Rlcic7XG5cbi8vIEhvdyBtdWNoIG9mIGEgdGV4dCBibG9jaydzIHdvcmRzIHRoZSBleHBvcnQgZ2F0ZXMgcXVvdGUgdG8gbmFtZSBhIGJsb2NrIHRoYXRcbi8vIGRvZXMgbm90IGZpdCBpdHMgYm94LlxuY29uc3QgT1ZFUkZMT1dfU05JUFBFVF9MRU5HVEggPSA0MDtcblxuLy8gT25lIHJlcXVlc3QgaW4gYW4gZXhwb3J0J3MgcXVldWU6IGEgdGlsZSdzIGRhdGEsIG9yIHRoZSBudW1iZXJzIG9mIHRoZVxuLy8gdmFsdWVzIG9uZSBsYXllcidzIHRleHQgcmVhZHMsIHJlYWQgdG9nZXRoZXIuIEEgdmFsdWVzIGpvYidzIHBhZ2VJbmRleCBpc1xuLy8gbnVsbCBmb3IgdGhlIGhlYWRlciBhbmQgZm9vdGVyICh0aGUgbWFzdGVyKTsgYHZhbHVlc2AgaXMgZXZlcnkgdmFsdWUgb2YgdGhlXG4vLyBsYXllciwgd2hpY2ggbmFtZXMgaXRzIHRva2VucyBhbmQgd2hvc2UgZmlsdGVyIHZhbHVlcyB0aGUgcmVxdWVzdCBjYXJyaWVzLFxuLy8gYW5kIGBjb21wb25lbnRzYCB0aGUgb25lcyBpdHMgdGV4dCBzaG93cywgd2hvc2UgbnVtYmVycyB0aGUgZmFpbHVyZSBnYXRlXG4vLyByZXF1aXJlcy5cbnR5cGUgQ29sbGVjdEpvYiA9XG4gIHwgeyBraW5kOiAnY29tcG9uZW50JzsgcGFnZUluZGV4OiBudW1iZXI7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH1cbiAgfCB7XG4gICAga2luZDogJ3ZhbHVlcyc7XG4gICAgcGFnZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIHBhZ2VJZDogbnVtYmVyO1xuICAgIHZhbHVlczogUmVwb3J0Q29tcG9uZW50W107XG4gICAgY29tcG9uZW50czogUmVwb3J0Q29tcG9uZW50W107XG4gIH07XG5cbi8vIE9uZSBsYXllcidzIHZhbHVlcyBhcyB0aGUgZmlsZSBwcmludHMgdGhlbS5cbnR5cGUgQ29sbGVjdGVkVmFsdWVzID0gUGljazxDb2xsZWN0ZWRQYWdlLCAndmFsdWVzJyB8ICdmYWlsZWRWYWx1ZXMnPjtcblxuLy8gV2hhdCBhIGpvYiBjYW1lIGJhY2sgd2l0aCwgYW5kIHRoZSBwYWdlIGl0IGlzIGZpbGVkIHVuZGVyLlxudHlwZSBDb2xsZWN0UmVzdWx0ID1cbiAgfCB7IGtpbmQ6ICdjb21wb25lbnQnOyBwYWdlSW5kZXg6IG51bWJlcjsgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50IH1cbiAgfCB7IGtpbmQ6ICd2YWx1ZXMnOyBwYWdlSW5kZXg6IG51bWJlciB8IG51bGw7IGNvbGxlY3RlZDogQ29sbGVjdGVkVmFsdWVzIH07XG5cbi8vIFdoYXQgYSBjb21wb25lbnQgd2l0aCBub3RoaW5nIHRvIGRyYXcgcHJpbnRzIGluIHRoZSBleHBvcnRlZCBmaWxlLlxuLy9cbi8vIFRoZSB0d28gY2FzZXMgbXVzdCBub3QgcmVhZCBhbGlrZS4gQSB0aWxlIHRoYXQgcmV0dXJuZWQgbm8gcm93cyBpcyBhIGZpbmRpbmdcbi8vIGFib3V0IHRoZSBwZXJpb2Qg4oCUIHRoZSByZXBvcnQgd29ya2VkIGFuZCB0aGUgYW5zd2VyIGlzIFwibm9uZVwiLiBBIHRpbGUgd2hvc2Vcbi8vIHF1ZXJ5IGZhaWxlZCBpcyBhIGhvbGUgaW4gdGhlIGZpbGUsIGFuZCBjYWxsaW5nIHRoYXQgXCJEYXRhIHVuYXZhaWxhYmxlXCIgdGVsbHNcbi8vIHRoZSByZWFkZXIgdGhlIGRhdGEgZG9lcyBub3QgZXhpc3Qgd2hlbiB3aGF0IGhhcHBlbmVkIGlzIHRoYXQgbm9ib2R5IG1hbmFnZWRcbi8vIHRvIGFzayBmb3IgaXQuIFNoYXJlZCBieSBib3RoIHJlbmRlcmVycyBzbyB0aGUgUERGIGFuZCB0aGUgZGVjayBjYW5ub3QgZW5kIHVwXG4vLyBkZXNjcmliaW5nIHRoZSBzYW1lIGhvbGUgdHdvIGRpZmZlcmVudCB3YXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5TGFiZWwoaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGl0ZW0uZGF0YSA/ICdObyBkYXRhJyA6ICdDb3VsZCBub3QgYmUgZ2VuZXJhdGVkJztcbn1cblxuLy8gQSBjb21wb25lbnQncyB0aXRsZSBhcyBhbiBleHBvcnRlZCBmaWxlIHByaW50cyBpdDogaXRzIHRva2VucyBmaWxsZWQgd2l0aFxuLy8gdGhlIHBhZ2UgaXQgaXMgZHJhd24gb24gKHRoZSBwaHlzaWNhbCBwYWdlIHdoZXJlIHRoZSBQREYgbnVtYmVycyBhXG4vLyBjb250aW51YXRpb24gcGFnZSksIGFzIHRoZSBjYW52YXMgaGVhZGVyIHJlYWRzIGl0LiBBIGRyaWxsZWQgY2hhcnQncyB0aXRsZVxuLy8gaXMgZm9sbG93ZWQgYnkgaXRzIGJyZWFkY3J1bWIsIGBjcnVtYnNgIChkcmlsbENydW1iTGFiZWxzKTogJ09yZGVycyBieVxuLy8gUGVyaW9kIOKAuiAyMDI2IOKAuiBRMycuIEEgc2VhcmNoZWQgbGlzdCBzYXlzIHNvLCBzaW5jZSBpdHMgdGFibGUgaG9sZHMgb25seVxuLy8gdGhlIG1hdGNoaW5nIHJvd3M6ICdPcmRlcnMgKG1hdGNoaW5nIFwibm9ydGhcIiknLiBBbiB1bnRpdGxlZCBvbmUgcmVhZHNcbi8vICdNYXRjaGluZyBcIm5vcnRoXCInLiAnJyB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcHJpbnQuIFNoYXJlZCBieSB0aGUgUERGXG4vLyBhbmQgdGhlIGRlY2ssIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZC5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRUaXRsZShcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgc2VhcmNoPzogc3RyaW5nIHwgbnVsbCxcbiAgY3J1bWJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGUgPSBjcnVtYmVkVGl0bGUoZmlsbFRpdGxlVG9rZW5zKGNvbXBvbmVudC50aXRsZSwgdG9rZW5zKSwgY3J1bWJzID8/IFtdKTtcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIEEgdGV4dCBibG9jayB0aGF0IGRvZXMgbm90IGZpdCBpdHMgYm94IGluIGEgYnVpbHQgZmlsZSwgYXMgdGhlIG92ZXJmbG93IGdhdGVcbi8vIG5hbWVzIGl0OiB1bmRlciBpdHMgcGFnZSAoSEVBREVSX0ZPT1RFUl9OQU1FIGZvciBhIGhlYWRlciBvciBmb290ZXIgYmxvY2spXG4vLyBhbmQgYnkgdGhlIHN0YXJ0IG9mIGl0cyB3b3Jkcywgb24gb25lIGxpbmUuIFNoYXJlZCBieSB0aGUgUERGIGFuZCB0aGUgZGVjay5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T3ZlcmZsb3coY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHBhZ2U6IHN0cmluZywgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogVGV4dE92ZXJmbG93IHtcbiAgY29uc3QgdGV4dCA9IHRleHRQbGFpbihjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnLCB0b2tlbnMpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLFxuICAgIHBhZ2UsXG4gICAgc25pcHBldDogdGV4dC5sZW5ndGggPiBPVkVSRkxPV19TTklQUEVUX0xFTkdUSCA/IGAke3RleHQuc2xpY2UoMCwgT1ZFUkZMT1dfU05JUFBFVF9MRU5HVEgpLnRyaW1FbmQoKX3igKZgIDogdGV4dCxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIHVuZGVyIHRoZSByZXBvcnQncyBuYW1lIG9uIHRoZSBQREYgdGl0bGUgcGFnZSBhbmQgdGhlIHRpdGxlIHNsaWRlOlxuLy8gdGhlIGV4cG9ydCBkYXRlLCB0aGUgYWN0aXZlIGZpbHRlcnMsIHRoZW4gd2hhdCB0aGUgbnVtYmVycyBhcmUgbWVhc3VyZWQgaW4uXG4vLyBUaGUgZGF0ZSBhbHdheXMgbGVhZHMgKHRoZSBQb3dlclBvaW50IG1hcmtzIHRoYXQgbGluZSBhcyB3cml0dGVuIGluIHRoZVxuLy8gcmVwb3J0J3MgbG9jYWxlKS4gSXQgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVyc1xuLy8gcmVzb2x2ZSBcInRvZGF5XCIgdG8sIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cbmV4cG9ydCBmdW5jdGlvbiBjb3ZlckxpbmVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGZvcm1hdExvY2FsRGF0ZShcbiAgICAgIG5ldyBEYXRlKCksXG4gICAgICBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dC5sb2NhbGUsXG4gICAgICBEQVlfTE9ORyxcbiAgICAgIHJlc29sdmVSZXBvcnRUaW1lem9uZShjb2xsZWN0ZWQucmVwb3J0KSxcbiAgICApLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbCwgdGhyb3VnaCB0aGUgc2FtZVxuLy8gZnVuY3Rpb25zIGFzIHRoZSBzY3JlZW46IGEgZGF0ZSBjb2x1bW4gcmVuZGVycyBpbiB0aGUgcmVwb3J0J3Mgem9uZSBhbmRcbi8vIGxvY2FsZSwgYW5kIGEgY29sdW1uIHdpdGggbnVtYmVyLWZvcm1hdCBrZXlzIChhIGNyb3NzLXRhYidzIGNlbGxzIHRocm91Z2hcbi8vIGl0cyBjZWxsRm9ybWF0KSBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlIGFuZCBjdXJyZW5jeS4gQW55IG90aGVyIHZhbHVlIGdvZXNcbi8vIG91dCB2ZXJiYXRpbSwgYW5kIGFuIGVtcHR5IG9uZSBhcyAnJy4gQ1NWIG5ldmVyIGNvbWVzIHRocm91Z2ggaGVyZTogaXRzXG4vLyB2YWx1ZXMgc3RheSByYXcuXG4vL1xuLy8gQW4gb3V0cHV0IGNvbHVtbiBpcyB3cml0dGVuIGJ5IHdoYXQgaXQgaG9sZHMsIGFzIHRoZSBzY3JlZW4ncyBjZWxsIGlzXG4vLyAoZm9ybWF0T3V0cHV0VmFsdWUpOiBhIHNpZ25lZCBjaGFuZ2UsIGEgcGVyY2VudCBjaGFuZ2UsIGEgY2hhbmdlIG9mIGEgcmF0ZVxuLy8gaW4gcG9pbnRzLCBhIHJhbmssIGEgc2hhcmUuIEl0cyByb3cgZ2l2ZXMgYSBjaGFuZ2UgdGhlIHByaW9yIGJlc2lkZSBpdCwgc29cbi8vIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIHJlYWRzIGFwYXJ0IGZyb20gYSB6ZXJvIG9uZSAoJ24vYScpLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENlbGwoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IExpc3RDb2x1bW4gJiB7IG91dHB1dD86IExpc3RPdXRwdXRDb2x1bW4gfSxcbiAgdGltZXpvbmU6IHN0cmluZyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcm93PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gY29sdW1uLm91dHB1dDtcblxuICBpZiAob3V0cHV0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHZhbHVlLCBvdXRwdXQub3V0cHV0LCBjb2x1bW4sIGNvbnRleHQsIHtcbiAgICAgIG1lYXN1cmVTcGVjOiBvdXRwdXQubWVhc3VyZVNwZWMsXG4gICAgICBwcmlvcjogb3V0cHV0LnByaW9yQWxpYXMgJiYgcm93ID8gcm93W291dHB1dC5wcmlvckFsaWFzXSA6IHVuZGVmaW5lZCxcbiAgICAgIGZsb29yOiBvdXRwdXQuZmxvb3IsXG4gICAgICBlbXB0eTogJycsXG4gICAgfSkudGV4dDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCB0aW1lem9uZSwgY29udGV4dC5sb2NhbGUpO1xuICB9XG5cbiAgcmV0dXJuIGhhc051bWJlckZvcm1hdChjb2x1bW4pID8gZm9ybWF0TnVtYmVyKHZhbHVlLCBjb2x1bW4sIGNvbnRleHQsIHsgZW1wdHk6ICcnIH0pIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuLy8gVGhlIGNvbHVtbnMgYW4gZXhwb3J0ZWQgbGlzdCB0YWJsZSBkcmF3cy4gQSBjcm9zcy10YWIncyBhcnJpdmUgd2l0aCBpdHNcbi8vIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZSByZXN1bHRcbi8vIGtub3dzIHRoZSBwaXZvdCB2YWx1ZXMsIGFuZCBhcmUgYnVpbHQgYnkgcGl2b3RDb2x1bW5TcGVjcygpIGFzIG9uIHNjcmVlbjpcbi8vIGhlYWRlZCBieSBpdHMgcGVyaW9kcyBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBlYWNoIHBpdm90IHZhbHVlIGZvcm1hdHRlZCBieVxuLy8gY2VsbEZvcm1hdC4gQSBwbGFpbiBsaXN0IGRyYXdzIGl0cyBjb25maWd1cmVkIGNvbHVtbnMgYnV0IHRoZSBvbmVzIHRoZVxuLy8gdmlld2VyIGhpZCAoYGhpZGRlbmAsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnMsIHNvIG5ldmVyIGFsbCBvZiB0aGVtKSxcbi8vIGVsc2UgZXZlcnkgY29sdW1uIHRoZSBxdWVyeSByZXR1cm5lZCwgYXMgaXQgY2FtZS4gT3V0cHV0IGNvbHVtbnMgKHRoZVxuLy8gZGF0YSdzIG91dHB1dHMsIGEgY3Jvc3MtdGFiIGNlbGwgdGhyb3VnaCBjZWxsTWVhc3VyZXMpIGNhcnJ5IGhvdyB0aGV5IGFyZVxuLy8gd3JpdHRlbjsgd2l0aG91dCB0aG9zZSBrZXlzIHRoZSBjb2x1bW5zIGFyZSBleGFjdGx5IGFzIGJlZm9yZS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Q29sdW1ucyhcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBoaWRkZW46IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4pOiBFeHBvcnRMaXN0Q29sdW1uW10ge1xuICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcblxuICBpZiAoY29uZmlnLnBpdm90Qnk/LmNvbHVtbikge1xuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgbG9jYWxlKSwgZGF0YSwgW10pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICBjb25zdCBoaWRkZW5OYW1lcyA9IGxpc3RIaWRkZW5Db2x1bW5zKGNvbmZpZywgaGlkZGVuKTtcblxuICAgIHJldHVybiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgICAgIGNvbmZpZy5jb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gIWhpZGRlbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpLFxuICAgICAgZGF0YSxcbiAgICAgIGNvbmZpZy5jb2x1bW5zLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMoZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIG51bWVyaWM6IGZhbHNlIH0pKSwgZGF0YSwgW10pO1xufVxuXG4vLyBUaGUgY29sdW1ucyB3aXRoIHRoZWlyIG91dHB1dCBtZXRhZGF0YSBhdHRhY2hlZCAobGlzdE91dHB1dENvbHVtbnMsIGFzIHRoZVxuLy8gc2NyZWVuJ3MgbGlzdCByZXNvbHZlcyBpdCk6IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgbnVtYmVycyBhbmQgaXMgd3JpdHRlblxuLy8gYnkgd2hhdCBpdCBob2xkcy4gVW5jaGFuZ2VkIHdoZW4gdGhlIGRhdGEgaGFzIG5vIG91dHB1dHMuXG5mdW5jdGlvbiB3aXRoT3V0cHV0Q29sdW1ucyhcbiAgY29sdW1uczogRXhwb3J0TGlzdENvbHVtbltdLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBhdXRob3JlZDogcmVhZG9ubHkgTGlzdENvbHVtbltdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgaWYgKCFkYXRhLm91dHB1dHMpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHMgPSBsaXN0T3V0cHV0Q29sdW1ucyhjb2x1bW5zLCBkYXRhLCBhdXRob3JlZCk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChvdXRwdXRzW2NvbHVtbi5jb2x1bW5dXG4gICAgPyB7IC4uLmNvbHVtbiwgbnVtZXJpYzogdHJ1ZSwgb3V0cHV0OiBvdXRwdXRzW2NvbHVtbi5jb2x1bW5dIH1cbiAgICA6IGNvbHVtbikpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGEgcGxhaW4gbGlzdCdzIGNvbmZpZ3VyZWRcbi8vIGxhYmVsLCBlbHNlIGl0cyBjb2x1bW47IGEgY3Jvc3MtdGFiJ3MgaGVhZGluZyBmcm9tIHBpdm90Q29sdW1uU3BlY3MoKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0SGVhZGluZ3MoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhLCBsb2NhbGUsIGhpZGRlbikubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKTtcbn1cblxuLy8gQW4gZXhwb3J0ZWQgbGlzdCdzIHRvdGFscyByb3csIG9uZSBjZWxsIHBlciBjb2x1bW4gb2YgbGlzdENvbHVtbnMoKTogZWFjaFxuLy8gdG90YWwgd3JpdHRlbiBsaWtlIGl0cyBjb2x1bW4ncyBjZWxscywgYW5kIExJU1RfVE9UQUxfTEFCRUwgaW4gdGhlIGZpcnN0XG4vLyBjb2x1bW4gd2hlbiB0aGF0IGNvbHVtbiBob2xkcyBubyB0b3RhbCAoYSBjcm9zcy10YWIncyByb3cga2V5KS4gbnVsbCB3aGVuXG4vLyB0aGUgbGlzdCBoYXMgbm8gdG90YWxzLiBUaGUgQ1NWIG5ldmVyIGNhcnJpZXMgb25lOiBpdHMgcm93cyBzdGF5IHJhdy5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0VG90YWxzUm93KFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjb2x1bW5zOiByZWFkb25seSBFeHBvcnRMaXN0Q29sdW1uW10sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmdbXSB8IG51bGwge1xuICBjb25zdCB0b3RhbHMgPSBkYXRhLnRvdGFscztcblxuICBpZiAoIXRvdGFscykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBsaXN0VG90YWxzTGFiZWxDb2x1bW4oY29sdW1ucywgdG90YWxzKTtcblxuICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKGNvbHVtbi5jb2x1bW4gPT09IGxhYmVsXG4gICAgPyBMSVNUX1RPVEFMX0xBQkVMXG4gICAgOiBleHBvcnRDZWxsKHRvdGFsc1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCB0aW1lem9uZSwgY29udGV4dCwgdG90YWxzKSkpO1xufVxuXG4vLyBUaGUgc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlOiB0aGUgZGF5cyBpdCByZWFkcywgYW5kIHRoZVxuLy8gZGF5cyBlYWNoIGNvbXBhcmlzb24gbGFuZSByZWFkcyAoJ1NlcCAxIOKAkyAxNSwgMjAyNiDCtyB2cyBwcmV2aW91cyBtb250aDpcbi8vIEF1ZyAxIOKAkyAxNSwgMjAyNicpLCBhcyB0aGUgc2NyZWVuJ3Mgbm90ZSBvcGVucyB3aXRoLiAnJyB3aXRob3V0IGFcbi8vIGNvbXBhcmlzb24gb3IgYSB0aW1lZnJhbWUsIGFuZCBmb3IgYSBLUEksIHdob3NlIGNhcmQgcHJpbnRzIGl0cyBvd24gd2luZG93XG4vLyBsaW5lLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFdpbmRvd3NMaW5lKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBpZiAoIWl0ZW0uZGF0YSB8fCBpdGVtLmNvbXBvbmVudC50eXBlID09PSAna3BpJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRXaW5kb3dzTGluZShpdGVtLmRhdGEsIHsgbG9jYWxlLCB0aW1lem9uZSB9KTtcbn1cblxuLy8gVGhlIG5vdGUgbGluZXMgdW5kZXIgYSBjb21wb25lbnQncyBib3g6IHdoeSBhIGNvbXBhcmlzb24gcmVhZHMgYXMgaXQgZG9lcyxcbi8vIGEgS1BJJ3MgZGVsdGEgbm90ZSwgYW5kIHdoYXQgZWFjaCB3aW5kb3dlZCB2YWx1ZSBpcyBhbmQgd2h5LiBUaGUgZGF5cyBhcmVcbi8vIGxlZnQgb3V0ICh0aGUgc3VidGl0bGUgb3IgdGhlIEtQSSBjYXJkIHByaW50cyB0aGVtKSwgYW5kIHRoZSB3aW5kb3dcbi8vIGRlc2NyaXB0aW9ucyBhcmUgaW4sIHNpbmNlIGEgZmlsZSBoYXMgbm8gdG9vbHRpcCBvciBoZWFkZXIgdG8gY2FycnkgdGhlbS5cbi8vIEVtcHR5IHdoZW4gdGhlIGRhdGEgaGFzIG5vbmUgb2YgdGhlIGtleXMuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Tm90ZUxpbmVzKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgdGltZXpvbmU6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROb3RlTGluZXMoaXRlbS5kYXRhLCB7IGxvY2FsZSwgdGltZXpvbmUgfSwgeyB3aW5kb3dzOiBmYWxzZSwgd2luZG93RGVzY3JpcHRpb25zOiB0cnVlIH0pO1xufVxuXG4vLyBXaGV0aGVyIGEgS1BJIGNhcmQgaGFzIG1vcmUgdG8gZHJhdyB0aGFuIGl0cyB2YWx1ZSBhbmQgbGFiZWwuIFdpdGhvdXQsIGJvdGhcbi8vIGV4cG9ydHMgZHJhdyB0aGUgdGlsZSBleGFjdGx5IGFzIHRoZXkgYWx3YXlzIGhhdmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpQ2FyZEhhc0V4dHJhcyh2aWV3OiBLcGlDYXJkVmlldywgbm90ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhISh2aWV3LmRlbHRhIHx8IHZpZXcud2luZG93IHx8IHZpZXcudGFyZ2V0IHx8IHZpZXcuc3BhcmtsaW5lIHx8IG5vdGVzLmxlbmd0aCk7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIGEgS1BJIGNhcmQgZml0IGEgdGlsZSBgYXZhaWxhYmxlYCB0YWxsLiBBIHNob3J0IHRpbGUgc2hlZHMgdGhlXG4vLyBzcGFya2xpbmUgZmlyc3QsIHRoZW4gdGhlIHRhcmdldCBsaW5lLCB0aGVuIHRoZSBub3RlczsgdGhlIHZhbHVlLCBpdHMgbGFiZWxcbi8vIGFuZCB0aGUgZGVsdGEgcm93IGFsd2F5cyBzdGF5LCBhbmQgdGhlIHdpbmRvdyBsaW5lIHN0YXlzIHdoZW5ldmVyIHRoZSBjYXJkXG4vLyBzaG93cyBhIGNvbXBhcmlzb24gKGl0cyBkYXlzIGFyZSB3aGF0IHRoZSBkZWx0YSBpcyBtZWFzdXJlZCBvdmVyKS4gVGhlXG4vLyBzcGFya2xpbmUgbmVlZHMgdmFsdWVzIHRvIGRyYXcuIFdoZW4gd2hhdCBzdGF5cyBpcyBzdGlsbCB0b28gdGFsbCwgZXZlcnlcbi8vIHJvdyBzaHJpbmtzIGJ5IHRoZSBzYW1lIHNjYWxlLCBkb3duIHRvIEtQSV9FWFBPUlRfTUlOX1NDQUxFOyBieSB0aGVuIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGUgdGFyZ2V0IGFuZCB0aGUgbm90ZXMgYXJlIGdvbmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpRXhwb3J0UGFydHMoXG4gIHZpZXc6IEtwaUNhcmRWaWV3LFxuICBub3RlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGF2YWlsYWJsZTogbnVtYmVyLFxuICBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLFxuKTogS3BpRXhwb3J0UGFydHMge1xuICBjb25zdCBwYXJ0czogS3BpRXhwb3J0UGFydHMgPSB7XG4gICAgZGVsdGE6ICEhdmlldy5kZWx0YSxcbiAgICB3aW5kb3c6ICEhdmlldy53aW5kb3csXG4gICAgdGFyZ2V0OiAhIXZpZXcudGFyZ2V0LFxuICAgIHNwYXJrbGluZTogISF2aWV3LnNwYXJrbGluZT8udmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gbnVsbCksXG4gICAgbm90ZXM6IFsuLi5ub3Rlc10sXG4gICAgc2NhbGU6IDEsXG4gIH07XG4gIGNvbnN0IGhlaWdodCA9ICgpID0+IGtwaUV4cG9ydEhlaWdodCh2aWV3LCBwYXJ0cywgaGVpZ2h0cyk7XG5cbiAgaWYgKGhlaWdodCgpID4gYXZhaWxhYmxlKSB7XG4gICAgcGFydHMuc3BhcmtsaW5lID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaGVpZ2h0KCkgPiBhdmFpbGFibGUpIHtcbiAgICBwYXJ0cy50YXJnZXQgPSBmYWxzZTtcbiAgfVxuXG4gIHdoaWxlIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiBwYXJ0cy5ub3Rlcy5sZW5ndGgpIHtcbiAgICBwYXJ0cy5ub3Rlcy5wb3AoKTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSAmJiAhcGFydHMuZGVsdGEpIHtcbiAgICBwYXJ0cy53aW5kb3cgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSkge1xuICAgIHBhcnRzLnNjYWxlID0gTWF0aC5tYXgoS1BJX0VYUE9SVF9NSU5fU0NBTEUsIE1hdGgubWF4KDAsIGF2YWlsYWJsZSkgLyBoZWlnaHQoKSk7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFRoZSBoZWlnaHRzIHNjYWxlZCBieSB0aGUgcGFydHMnIHNjYWxlOiB3aGF0IHRoZSByZW5kZXJlciBsYXlzIHRoZSBjYXJkXG4vLyBvdXQgd2l0aCwgaXRzIHRleHQgc2l6ZWQgYnkgdGhlIHNhbWUgc2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVkS3BpSGVpZ2h0cyhoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzLCBzY2FsZTogbnVtYmVyKTogS3BpRXhwb3J0SGVpZ2h0cyB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IGhlaWdodHMudmFsdWUgKiBzY2FsZSxcbiAgICBsYWJlbDogaGVpZ2h0cy5sYWJlbCAqIHNjYWxlLFxuICAgIGRlbHRhOiBoZWlnaHRzLmRlbHRhICogc2NhbGUsXG4gICAgd2luZG93OiBoZWlnaHRzLndpbmRvdyAqIHNjYWxlLFxuICAgIHRhcmdldDogaGVpZ2h0cy50YXJnZXQgKiBzY2FsZSxcbiAgICBzcGFya2xpbmU6IGhlaWdodHMuc3BhcmtsaW5lICogc2NhbGUsXG4gICAgbm90ZTogaGVpZ2h0cy5ub3RlICogc2NhbGUsXG4gIH07XG59XG5cbi8vIEhvdyB0YWxsIHRoZSBjYXJkJ3MgZHJhd24gcGFydHMgc3RhbmQgdG9nZXRoZXIsIGluIHRoZSBoZWlnaHRzJyB1bml0LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydEhlaWdodCh2aWV3OiBLcGlDYXJkVmlldywgcGFydHM6IEtwaUV4cG9ydFBhcnRzLCBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzKTogbnVtYmVyIHtcbiAgcmV0dXJuIGhlaWdodHMudmFsdWVcbiAgICArICh2aWV3LmxhYmVsID8gaGVpZ2h0cy5sYWJlbCA6IDApXG4gICAgKyAocGFydHMuZGVsdGEgPyBoZWlnaHRzLmRlbHRhIDogMClcbiAgICArIChwYXJ0cy53aW5kb3cgPyBoZWlnaHRzLndpbmRvdyA6IDApXG4gICAgKyAocGFydHMudGFyZ2V0ID8gaGVpZ2h0cy50YXJnZXQgOiAwKVxuICAgICsgKHBhcnRzLnNwYXJrbGluZSA/IGhlaWdodHMuc3BhcmtsaW5lIDogMClcbiAgICArIHBhcnRzLm5vdGVzLmxlbmd0aCAqIGhlaWdodHMubm90ZTtcbn1cblxuLy8gVGhlIGxhc3Qgcm93IG9mIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgdGhhdCBzdG9wcyBzaG9ydCBvZiBpdHMgcmVzdWx0OiBob3dcbi8vIG1hbnkgcm93cyB0aGUgZmlsZSBsZWF2ZXMgb3V0IGFuZCB3aGVyZSB0aGUgd2hvbGUgc2V0IGNhbiBiZSBoYWQuIEVhY2hcbi8vIGZvcm1hdCBmZXRjaGVzIGl0cyBvd24gbnVtYmVyIG9mIHJvd3MgKFBERl9MSVNUX1JPV1MsIFBQVFhfTElTVF9ST1dTKSwgYW5kXG4vLyBib3RoIG5hbWUgd2hhdCBpcyBsZWZ0IHdpdGggdGhpcyBvbmUgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gbW9yZVJvd3NOb3RpY2UocmVtYWluaW5nOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYOKApiAke3JlbWFpbmluZ30gbW9yZSByb3cocykg4oCUIHVzZSB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydCBmb3IgdGhlIGZ1bGwgZGF0YXNldGA7XG59XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNvbGxlY3RlZCByZXBvcnQgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB0aWxlIHdob3NlIHF1ZXJ5XG4vLyBmYWlsZWQsIG9yIHdob3NlIHRleHQgc2hvd3MgYSB2YWx1ZSB0aGF0IGNhbWUgYmFjayB3aXRob3V0IGl0cyBudW1iZXIsIHRoZW5cbi8vIEhFQURFUl9GT09URVJfTkFNRSB3aGVuIHRoZSBoZWFkZXIgb3IgZm9vdGVyIHNob3dzIG9uZSBvbiBhIHBhZ2UgdGhhdCBzaG93c1xuLy8gdGhlIG1hc3RlciDigJQgd2hhdCB0aGUgZmFpbHVyZSBnYXRlIG5hbWVzIHRvIHRoZSB1c2VyLCBhbmQgd2hhdCBtYWtlcyBcInNvbWVcbi8vIG9mIHRoaXMgZmlsZSBpcyBtaXNzaW5nXCIgYSBmYWN0IHRoZSBjYWxsZXIgY2FuIGFjdCBvbiByYXRoZXIgdGhhbiBhIHRoaW5nXG4vLyB0aGV5IG5vdGljZSBpbiB0aGUgUERGIGFmdGVyd2FyZHMuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICAvLyBOdW1iZXJlZCBiZWZvcmUgdGhlIGZpbHRlciDigJQgYW4gdW5uYW1lZCBwYWdlIDQgdGhhdCBmYWlsZWQgaGFzIHRvIHJlYWRcbiAgLy8gXCJQYWdlIDRcIiwgbm90IFwiUGFnZSAxXCIgYmVjYXVzZSBpdCBoYXBwZW5lZCB0byBiZSB0aGUgZmlyc3QgZmFpbHVyZS5cbiAgY29uc3QgbmFtZXMgPSBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKVxuICAgICAgfHwgc2hvd3NGYWlsZWRWYWx1ZShwYWdlLmNvbXBvbmVudHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbXBvbmVudCksIHBhZ2UuZmFpbGVkVmFsdWVzKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbiAgY29uc3QgbWFzdGVyID0gY29sbGVjdGVkLnJlcG9ydC5tYXN0ZXI7XG4gIGNvbnN0IHNob3dzTWFzdGVyID0gY29sbGVjdGVkLnBhZ2VzLnNvbWUoKHsgcGFnZSB9KSA9PiAhcGFnZS5tYXN0ZXJIaWRkZW4pO1xuXG4gIGlmIChtYXN0ZXIgJiYgc2hvd3NNYXN0ZXIgJiYgc2hvd3NGYWlsZWRWYWx1ZShtYXN0ZXIuY29tcG9uZW50cywgY29sbGVjdGVkLm1hc3RlckZhaWxlZFZhbHVlcykpIHtcbiAgICBuYW1lcy5wdXNoKEhFQURFUl9GT09URVJfTkFNRSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59XG5cbi8vIFdoZXRoZXIgYW55IG9mIHRoZSB0ZXh0IGJsb2NrcyBzaG93cyBvbmUgb2YgdGhlIGZhaWxlZCB2YWx1ZSBrZXlzLlxuZnVuY3Rpb24gc2hvd3NGYWlsZWRWYWx1ZShjb21wb25lbnRzOiBSZXBvcnRDb21wb25lbnRbXSwgZmFpbGVkOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzaG93biA9IG5ldyBTZXQoY29tcG9uZW50c1xuICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0JylcbiAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB2YWx1ZUtleXMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCkpKTtcblxuICByZXR1cm4gZmFpbGVkLnNvbWUoKGtleSkgPT4gc2hvd24uaGFzKGtleSkpO1xufVxuXG4vLyBUaGUgY292ZXIncyBmaWx0ZXIgbGluZXM6IHRoZSBleHBvcnQncyBmaWx0ZXIgbGluZXMsIHRoZW4gdGhlIG1hdGNoIHdoaWxlIHRoZSByZXBvcnQgYmFyJ3MgZmlsdGVycyBtYXRjaCBhbnkuIEEgZHJpbGxlZCBjaGFydCdzIGxpbmVcbi8vIGlzIGl0cyB0aXRsZSBhcyB0aGUgY2FudmFzIGhlYWRlciByZWFkcyBpdCAoYHRpdGxlc2AsIGJ5IGNvbXBvbmVudCBpZCkgYW5kXG4vLyB0aGUgY3J1bWJzIG9mIHRoZSBwYXRoIGl0cyBhbnN3ZXIgYXBwbGllZCAodGhlIG9uZXMgaXRzIHRpdGxlIHByaW50cyksIG5vdFxuLy8gdGhlIHBhdGggdGhlIHNjcmVlbiBhc2tlZCBmb3I6IHRoZSBzZXJ2ZXIgbWF5IGhhdmUgY3V0IHRoYXQgcGF0aCBzaG9ydCBvclxuLy8gcmVmdXNlZCBpdC5cbmV4cG9ydCBmdW5jdGlvbiBjb3ZlckZpbHRlckxpbmVzKFxuICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gIGxpbmVzOiByZWFkb25seSBSZXBvcnRFeHBvcnRMaW5lW10sXG4gIHBhZ2VzOiByZWFkb25seSBQaWNrPENvbGxlY3RlZFBhZ2UsICdjb21wb25lbnRzJz5bXSxcbiAgdGl0bGVzOiBSZWFkb25seTxSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+PiA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBtYXRjaCA9IHNuYXBzaG90LmZlYXR1cmVzLmluY2x1ZGVzKCdtYXRjaEFueScpID8gbWF0Y2hMaW5lVGV4dChzbmFwc2hvdC5zdGF0ZS5tYXRjaCwgJ2xpbmUnKSA6IG51bGw7XG4gIGNvbnN0IGRyaWxsZWQgPSBwYWdlc1xuICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMpXG4gICAgLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtLmNydW1icz8ubGVuZ3RoKVxuICAgIC5tYXAoKGl0ZW0pID0+IGNydW1iZWRUaXRsZSh0aXRsZXNbaXRlbS5jb21wb25lbnQuaWRdID8/IGl0ZW0uY29tcG9uZW50LnRpdGxlLCBpdGVtLmNydW1icykpO1xuXG4gIHJldHVybiBbXG4gICAgLi4ubGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmtpbmQgIT09ICdkcmlsbCcpLm1hcCgobGluZSkgPT4gbGluZS50ZXh0KSxcbiAgICAuLi5kcmlsbGVkLFxuICAgIG1hdGNoLFxuICBdXG4gICAgLmZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+ICEhbGluZSk7XG59XG5cbi8vIFdoZXRoZXIgYSBQREYgb3IgUG93ZXJQb2ludCBleHBvcnQgbGF5cyBhIGNvbXBvbmVudCBvdXQ6IGV2ZXJ5IHRpbGUsIGFuZFxuLy8gZXZlcnkgdGV4dCBibG9jaywgd2hpY2ggaGFzIG5vdGhpbmcgdG8gZmV0Y2ggYW5kIHJpZGVzIHRocm91Z2ggd2l0aCBub1xuLy8gZGF0YS4gQW55IG90aGVyIHR5cGUgKGFuIGlubGluZSB2YWx1ZSwgb3IgYSB0eXBlIHRoaXMgdmlld2VyIGRvZXMgbm90XG4vLyBrbm93KSBuZXZlciBpczogYSB2YWx1ZSBpcyByZWFkIG9ubHkgdGhyb3VnaCBpdHMgbGF5ZXIncyB2YWx1ZXMgam9iLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwb3J0U2xvdChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUaWxlKGNvbXBvbmVudCkgfHwgY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jztcbn1cblxuLy8gR2F0aGVycyBldmVyeXRoaW5nIGFuIGV4cG9ydCBuZWVkczogZXZlcnkgY29tcG9uZW50J3MgZGF0YSBhY3Jvc3MgQUxMIHBhZ2VzXG4vLyAodGhlIGNhbnZhcyBvbmx5IHJlbmRlcnMgdGhlIGFjdGl2ZSBwYWdlLCBzbyBleHBvcnRzIGNhbid0IHNjcmFwZSB0aGVcbi8vIHNjcmVlbiksIGFuZCB0aGUgbnVtYmVycyBvZiB0aGUgdmFsdWVzIHRoZWlyIHRleHQgcmVhZHMsIGZldGNoZWQgZnJlc2ggd2l0aFxuLy8gdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgLCBhbmQgYSBmYWlsZWQgdmFsdWUgdG8gYSBrZXkgaW5cbi8vIGl0cyBwYWdlJ3MgZmFpbGVkVmFsdWVzLCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdFxuLy8gaXMgc28gdGhlIGNhbGxlciBjYW4gUkVQT1JUIHdoYXQgZmFpbGVkLCBub3Qgc28gaXQgY2FuIGJlIGlnbm9yZWQ6IHNlZVxuLy8gZmFpbGVkUGFnZU5hbWVzKCkgYW5kIHRoZSBmYWlsdXJlIGdhdGUgdGhhdCB1c2VzIGl0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnMgPSBpbmplY3QoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpO1xuXG4gIC8vIGxpc3RSb3dzIGlzIGhvdyBtYW55IHJvd3MgZWFjaCBsaXN0IGZldGNoZXM6IHRoZSByZW5kZXJlcidzIG93biBjYXAsIHNpbmNlXG4gIC8vIGEgUERGIHRhYmxlIGNvbnRpbnVlcyBvbnRvIGV4dHJhIHBhZ2VzIGFuZCBhIHNsaWRlIHRhYmxlIGNhbm5vdC5cbiAgLy9cbiAgLy8gVGhlIHNjcmVlbiBpcyByZWFkIG9uY2UsIHdoZW4gdGhlIGV4cG9ydCBzdGFydHMgKHNuYXBzaG90KTogZXZlcnkgdGlsZSxcbiAgLy8gZXZlcnkgdmFsdWVzIGpvYiwgdGhlIGZpbHRlciBsaW5lcyBhbmQgdGhlIGNvdmVyIHJlYWQgdGhhdCBjb3B5LCBzbyBhXG4gIC8vIGZpbHRlciBjaGFuZ2VkIHdoaWxlIHRoZSB0aWxlcyBhcmUgZmV0Y2hlZCByZWFjaGVzIG5vbmUgb2YgdGhlbS4gQSByZXRyeVxuICAvLyBjb2xsZWN0cyBhZ2FpbiwgYW5kIHNvIHJlYWRzIHRoZSBzY3JlZW4gYXMgaXQgaXMgdGhlbi5cbiAgcHVibGljIGNvbGxlY3QocmVwb3J0OiBSZXBvcnQsIGxpc3RSb3dzOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbGxlY3RlZFJlcG9ydD4ge1xuICAgIGNvbnN0IGpvYnMgPSB0aGlzLl9qb2JzKHJlcG9ydCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KHJlcG9ydCk7XG4gICAgY29uc3QgZm9ybWF0Q29udGV4dCA9IHNuYXBzaG90LmZvcm1hdENvbnRleHQ7XG5cbiAgICAvLyBSZWxlYXNlZCBhIGZldyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UsIGEgcGFnZSdzIHZhbHVlcyBpbiB0aGVcbiAgICAvLyBzYW1lIHF1ZXVlIGFzIHRoZSB0aWxlcywgc28gdGhleSBuZXZlciBhZGQgdG8gdGhlIHF1ZXJpZXMgYWxyZWFkeVxuICAgIC8vIHJ1bm5pbmcuIG1lcmdlTWFwIGNvbXBsZXRlcyBvdXQgb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIGpvYlxuICAgIC8vIGl0IGNhbWUgZnJvbSBhbmQgdGhlIHJvd3MgYXJlIGZpbGVkIGJ5IGluZGV4IOKAlCB0aGUgZGVjaydzIHBhZ2Ugb3JkZXJcbiAgICAvLyBjYW4ndCBkZXBlbmQgb24gd2hpY2ggcXVlcnkgaGFwcGVuZWQgdG8gZmluaXNoIGZpcnN0LlxuICAgIGNvbnN0IGFsbCQgPSBqb2JzLmxlbmd0aFxuICAgICAgPyBmcm9tKGpvYnMubWFwKChqb2IsIGluZGV4KSA9PiAoeyBqb2IsIGluZGV4IH0pKSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAoeyBqb2IsIGluZGV4IH0pID0+IHRoaXMuX3J1bkpvYihyZXBvcnQsIGpvYiwgbGlzdFJvd3MsIHNuYXBzaG90KVxuICAgICAgICAgICAgICAucGlwZShtYXAoKHJlc3VsdCkgPT4gKHsgcmVzdWx0LCBpbmRleCB9KSkpLFxuICAgICAgICAgICAgRVhQT1JUX0NPTkNVUlJFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdIGFzIHsgcmVzdWx0OiBDb2xsZWN0UmVzdWx0OyBpbmRleDogbnVtYmVyIH1bXSk7XG5cbiAgICAvLyBUaGUgbGluZXMgYW5kIHRoZSBmaWx0ZXIgdG9rZW5zIHJpZGUgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YVxuICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIGJ1aWx0IGF0IHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzXG4gICAgLy8gdmFsdWVzIGlzIGl0c2VsZiBhIHJlcXVlc3QuXG4gICAgcmV0dXJuIGZvcmtKb2luKHsgY29sbGVjdGVkOiBhbGwkLCB3b3JkaW5nOiB0aGlzLmV4cG9ydFdvcmRpbmcocmVwb3J0LCBzbmFwc2hvdCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgY29sbGVjdGVkLCB3b3JkaW5nIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5fZmlsZShyZXBvcnQsIGNvbGxlY3RlZCwgZm9ybWF0Q29udGV4dCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwb3J0LFxuICAgICAgICAgICAgLi4uZmlsZSxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnk6IGNvdmVyRmlsdGVyTGluZXMoc25hcHNob3QsIHdvcmRpbmcubGluZXMsIGZpbGUucGFnZXMsIHdvcmRpbmcudGl0bGVzKSxcbiAgICAgICAgICAgIGZpbHRlckZpZWxkczogd29yZGluZy5maWx0ZXJGaWVsZHMsXG4gICAgICAgICAgICBjb250ZXh0TGluZXM6IHRoaXMuX2NvbnRleHRMaW5lcyhyZXBvcnQpLFxuICAgICAgICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgc2NyZWVuIGFzIG9uZSBleHBvcnQgcmVhZHMgaXQ6IHRoZSBzdGF0ZSBzbmFwc2hvdCwgZWFjaCBncm91cCdzIHZhbHVlXG4gIC8vIGFuZCBsaXZlIHByZXNldCwgZWFjaCB0aWxlJ3MgZmlsdGVyIGVudHJpZXMgYW5kIHN0YXRlICh0aWxlRGF0YVN0YXRlKSxcbiAgLy8gZWFjaCB2YWx1ZSdzIGZpbHRlciBlbnRyaWVzLCB0aGUgZ3JhaW4sIHRoZSBmZWF0dXJlcyBzZXJ2ZWQgYW5kIHRoZVxuICAvLyBmb3JtYXQuIEEgdmFsdWUncyBlbnRyaWVzIGFyZSByZWFkIGhlcmUgdG9vLCBzbyB0aGVcbiAgLy8gbnVtYmVycyBpbiBhIGZpbGUncyB0ZXh0IGFyZSBmaWx0ZXJlZCBhcyBpdHMgdGlsZXMgYXJlLCB3aGF0ZXZlciB0aGUgYmFyXG4gIC8vIGRvZXMgd2hpbGUgdGhlIGV4cG9ydCBydW5zLlxuICBwdWJsaWMgc25hcHNob3QocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRFeHBvcnRTbmFwc2hvdCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHRpbGVzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKTtcbiAgICBjb25zdCB2YWx1ZXMgPSByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd2YWx1ZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlLFxuICAgICAgLi4udGhpcy5fZ3JvdXBWYWx1ZXMocmVwb3J0KSxcbiAgICAgIGZpbHRlcnM6IE9iamVjdC5mcm9tRW50cmllcyh0aWxlcy5tYXAoKHRpbGUpID0+IFt0aWxlLmlkLCB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KHRpbGUpXSkpLFxuICAgICAgdmFsdWVGaWx0ZXJzOiBPYmplY3QuZnJvbUVudHJpZXModmFsdWVzXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiBbdmFsdWUuaWQsIHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodmFsdWUpXSkpLFxuICAgICAgc3RhdGVzOiBPYmplY3QuZnJvbUVudHJpZXModGlsZXMubWFwKCh0aWxlKSA9PiBbdGlsZS5pZCwgdGlsZURhdGFTdGF0ZShyZXBvcnQsIHRpbGUsIHN0YXRlKV0pKSxcbiAgICAgIGZyZXF1ZW5jeTogdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCksXG4gICAgICBmZWF0dXJlczogb2ZmZXJlZFZpZXdlckZlYXR1cmVzKHJlcG9ydC52aWV3ZXJGZWF0dXJlcyksXG4gICAgICBmb3JtYXRDb250ZXh0OiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvdyBhbiBleHBvcnQgd29yZHMgdGhlIHNjcmVlbiwgb3ZlciBhIHNuYXBzaG90IChgcGFnZUlkYCBmb3IgYSBUaGlzXG4gIC8vIFBhZ2UgemlwKTogaXRzIGZpbHRlciBsaW5lcyAoZXhwb3J0TGluZXM6IHRoZSBjb3ZlcidzLCBhbmQgdGhlIHppcCdzXG4gIC8vIGZpbHRlckxpbmVzKSwgd2hhdCBlYWNoIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiBwcmludHMsIGFuZCBlYWNoIHRpbGUnc1xuICAvLyB0aXRsZSBhcyB0aGUgY2FudmFzIGhlYWRlciByZWFkcyBpdCAodGhlIHppcCBuYW1lcyBpdHMgZmlsZXMgYWZ0ZXJcbiAgLy8gdGhlbSkuIEEgc2VsZWN0J3MgcGlja3MgYXJlIG5hbWVkIG9uY2UgZm9yIGFsbCB0aHJlZSwgYXMgdGhlIHJlcG9ydCBiYXJcbiAgLy8gbmFtZXMgdGhlbSwgc28gbm8gdG9rZW4gaW4gYSBmaWxlIHJlYWRzIGFzIGxvYWRpbmcuXG4gIHB1YmxpYyBleHBvcnRXb3JkaW5nKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgICBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydEV4cG9ydFdvcmRpbmc+IHtcbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuX3BpY2tOYW1lcihyZXBvcnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckZpZWxkcyhyZXBvcnQsIHNuYXBzaG90LCBuYW1lcylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlckZpZWxkcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHRpdGxlcyA9IHRoaXMuX2V4cG9ydFRpdGxlcyhyZXBvcnQsIHBhZ2VJZCwgZmlsdGVyRmllbGRzKTtcblxuICAgICAgICAgIHJldHVybiBleHBvcnRMaW5lcyh7IHJlcG9ydCwgc25hcHNob3QsIHBhZ2VJZCwgbmFtZXMsIHRpdGxlcyB9KVxuICAgICAgICAgICAgLnBpcGUobWFwKChsaW5lcykgPT4gKHsgbGluZXMsIGZpbHRlckZpZWxkcywgdGl0bGVzIH0pKSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB0aXRsZSBvZiBlYWNoIHRpbGUsIGJ5IGNvbXBvbmVudCBpZCwgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQ6XG4gIC8vIGl0cyB0b2tlbnMgZmlsbGVkIHdpdGggaXRzIHBhZ2UncyBmaWVsZHMgYW5kIHRoZSBmaWx0ZXJzIHRoZSBwYWdlIHJlYWRzXG4gIC8vIChsYXllckZpbHRlckZpZWxkcykuIFRoZSB3aG9sZSByZXBvcnQncyBvciBvbmUgcGFnZSdzIChwYWdlSWQpLiBBblxuICAvLyB1bnRpdGxlZCB0aWxlIGlzIGxlZnQgb3V0OiB0aGUgc2VydmVyIG5hbWVzIGl0cyBmaWxlIGJ5IGl0cyB0eXBlLlxuICBwcml2YXRlIF9leHBvcnRUaXRsZXMoXG4gICAgcmVwb3J0OiBSZXBvcnQsXG4gICAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICAgIGZpZWxkczogUmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPixcbiAgKTogUmVjb3JkPG51bWJlciwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIGluZGV4IH0pKVxuICAgICAgLmZpbHRlcigoeyBwYWdlIH0pID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKVxuICAgICAgLmZsYXRNYXAoKHsgcGFnZSwgaW5kZXggfSkgPT4ge1xuICAgICAgICBjb25zdCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQgPSB7XG4gICAgICAgICAgcGFnZU51bWJlcjogaW5kZXggKyAxLFxuICAgICAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICAgICAgICBmaWx0ZXJzOiBsYXllckZpbHRlckZpZWxkcyhmaWVsZHMsIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10sIHBhZ2UuaWQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkgJiYgISFjb21wb25lbnQudGl0bGUpXG4gICAgICAgICAgLm1hcCgoY29tcG9uZW50KTogW251bWJlciwgc3RyaW5nXSA9PiBbY29tcG9uZW50LmlkLCBmaWxsVGl0bGVUb2tlbnMoY29tcG9uZW50LnRpdGxlLCB0b2tlbnMpXSk7XG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBFdmVyeSByZXF1ZXN0IHRoZSBleHBvcnQgbWFrZXMsIGluIHBhZ2Ugb3JkZXI6IGVhY2ggcGFnZSdzIHRpbGVzLCB0aGVuIHRoZVxuICAvLyB2YWx1ZXMgaXRzIHRleHQgc2hvd3M7IHRoZSBoZWFkZXIgYW5kIGZvb3RlcidzIHZhbHVlcyBsYXN0LCB3aGVuIHNvbWUgcGFnZVxuICAvLyBzaG93cyB0aGUgbWFzdGVyLiBUZXh0IGJsb2NrcyBoYXZlIG5vdGhpbmcgdG8gZmV0Y2ggb2YgdGhlaXIgb3duIOKAlCB0aGV5XG4gIC8vIHJpZGUgdGhyb3VnaCB3aXRoIG5vIGRhdGEsIGFuZCB0aGVpciB0b2tlbnMgYXJlIGZpbGxlZCBmcm9tIHRoZWlyIGxheWVyJ3NcbiAgLy8gdmFsdWVzLiBBIHZhbHVlIGlzIHJlYWQgb25seSB0aHJvdWdoIGl0cyBsYXllcidzIHJlcXVlc3QsIG5ldmVyIGFzIGEgdGlsZVxuICAvLyAoaXNFeHBvcnRTbG90KS4gVGhlIGhlYWRlci9mb290ZXIgYmxvY2tzIChyZXBvcnQubWFzdGVyKSBhcmUgcmVhZCBieSB0aGVcbiAgLy8gcmVuZGVyZXJzIHN0cmFpZ2h0IG9mZiB0aGUgcmVwb3J0LlxuICBwcml2YXRlIF9qb2JzKHJlcG9ydDogUmVwb3J0KTogQ29sbGVjdEpvYltdIHtcbiAgICBjb25zdCBqb2JzOiBDb2xsZWN0Sm9iW10gPSBbXTtcblxuICAgIHJlcG9ydC5wYWdlcy5mb3JFYWNoKChwYWdlLCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIHBhZ2UuY29tcG9uZW50c1xuICAgICAgICAuZmlsdGVyKGlzRXhwb3J0U2xvdClcbiAgICAgICAgLmZvckVhY2goKGNvbXBvbmVudCkgPT4gam9icy5wdXNoKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleCwgY29tcG9uZW50IH0pKTtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHBhZ2UsIHBhZ2VJbmRleCkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJlcG9ydC5tYXN0ZXIgJiYgcmVwb3J0LnBhZ2VzLnNvbWUoKHBhZ2UpID0+ICFwYWdlLm1hc3RlckhpZGRlbikpIHtcbiAgICAgIGpvYnMucHVzaCguLi50aGlzLl92YWx1ZXNKb2JzKHJlcG9ydC5tYXN0ZXIsIG51bGwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9icztcbiAgfVxuXG4gIC8vIEEgbGF5ZXIncyBvbmUgdmFsdWVzIGpvYiwgb3Igbm9uZSB3aGVuIGl0cyB0ZXh0IHNob3dzIG5vIHZhbHVlLlxuICBwcml2YXRlIF92YWx1ZXNKb2JzKGxheWVyOiBSZXBvcnRQYWdlIHwgUmVwb3J0TWFzdGVyLCBwYWdlSW5kZXg6IG51bWJlciB8IG51bGwpOiBDb2xsZWN0Sm9iW10ge1xuICAgIGNvbnN0IHRleHRzID0gbGF5ZXIuY29tcG9uZW50cy5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jyk7XG4gICAgY29uc3QgdmFsdWVzID0gbGF5ZXIudmFsdWVzID8/IFtdO1xuICAgIGNvbnN0IHNob3duID0gc2hvd25WYWx1ZXModmFsdWVzLCB0ZXh0cyk7XG5cbiAgICByZXR1cm4gc2hvd24ubGVuZ3RoXG4gICAgICA/IFt7IGtpbmQ6ICd2YWx1ZXMnLCBwYWdlSW5kZXgsIHBhZ2VJZDogbGF5ZXIuaWQsIHZhbHVlcywgY29tcG9uZW50czogc2hvd24gfV1cbiAgICAgIDogW107XG4gIH1cblxuICAvLyBPbmUgcXVldWVkIGpvYiwgaXRzIHJlc3VsdCB0YWdnZWQgd2l0aCB0aGUgcGFnZSBpdCBpcyBmaWxlZCB1bmRlci5cbiAgcHJpdmF0ZSBfcnVuSm9iKFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGpvYjogQ29sbGVjdEpvYixcbiAgICBsaXN0Um93czogbnVtYmVyLFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgKTogT2JzZXJ2YWJsZTxDb2xsZWN0UmVzdWx0PiB7XG4gICAgaWYgKGpvYi5raW5kID09PSAnY29tcG9uZW50Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBqb2IuY29tcG9uZW50LCBsaXN0Um93cywgc25hcHNob3QpXG4gICAgICAgIC5waXBlKG1hcCgoaXRlbSk6IENvbGxlY3RSZXN1bHQgPT4gKHsga2luZDogJ2NvbXBvbmVudCcsIHBhZ2VJbmRleDogam9iLnBhZ2VJbmRleCwgaXRlbSB9KSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wYWdlVmFsdWVzKHJlcG9ydCwgam9iLnBhZ2VJZCwgam9iLnZhbHVlcywgam9iLmNvbXBvbmVudHMsIHNuYXBzaG90KVxuICAgICAgLnBpcGUobWFwKChjb2xsZWN0ZWQpOiBDb2xsZWN0UmVzdWx0ID0+ICh7IGtpbmQ6ICd2YWx1ZXMnLCBwYWdlSW5kZXg6IGpvYi5wYWdlSW5kZXgsIGNvbGxlY3RlZCB9KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBsaXN0Um93czogbnVtYmVyLFxuICAgIHNuYXBzaG90OiBSZXBvcnRFeHBvcnRTbmFwc2hvdCxcbiAgKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zOiBbXSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gc25hcHNob3QuZmlsdGVyc1tjb21wb25lbnQuaWRdID8/IFtdO1xuICAgIC8vIFRoZSB0aWxlJ3Mgb3duIHN0YXRlLCB0aGUgb25lIGl0cyBzY3JlZW4gYW5kIGl0cyBDU1YgY2FycnlcbiAgICAvLyAodGlsZURhdGFTdGF0ZSk6IGEgdGltZS1zZXJpZXMgY2hhcnQgcmUtYnVja2V0cyBhdCB0aGUgdmlld2VyJ3MgZ3JhaW5cbiAgICAvLyBhbmQga2VlcHMgaXRzIGRyaWxsIHBhdGgsIGEgbGlzdCByZWFkcyBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIgYW5kIGhvbGRzXG4gICAgLy8gdGhlIHNjcmVlbidzIHJvd3MuIEEgbGlzdCBhZGRzIGl0cyBleHBvcnQgcGFnaW5nLlxuICAgIGNvbnN0IHRpbGVTdGF0ZSA9IHNuYXBzaG90LnN0YXRlc1tjb21wb25lbnQuaWRdID8/IHt9O1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgLi4udGlsZVN0YXRlLCBwYWdlOiAxLCBwYWdlU2l6ZTogbGlzdFJvd3MgfVxuICAgICAgOiB7IC4uLnRpbGVTdGF0ZSB9O1xuICAgIC8vIFRoZSB0YWJsZSBsZWF2ZXMgb3V0IHRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkLiBUaGUgcm93cyBhcmUgZmV0Y2hlZFxuICAgIC8vIHdob2xlLCBhcyB0aGUgc2NyZWVuIGZldGNoZXMgdGhlbSAodGhlIHNlcnZlciByZWFkcyBoaWRkZW5Db2x1bW5zIGZvciBhXG4gICAgLy8gQ1NWIG9ubHkpLCBhbmQgdGhlIHJlbmRlcmVycyBkcm9wIHRoZSBjZWxscy5cbiAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gWy4uLihzdGF0ZS5oaWRkZW5Db2x1bW5zID8/IFtdKV07XG5cbiAgICAvLyBoYW5kbGVyczogZmFsc2Uga2VlcHMgdGhlIGFwcCdzIGdsb2JhbCBlcnJvciBkaWFsb2cgb3V0IG9mIHRoaXMuIEEgZmFpbGVkXG4gICAgLy8gdGlsZSBpcyByZXBvcnRlZCBvbmNlLCBieSB0aGUgZmFpbHVyZSBnYXRlLCBuYW1pbmcgdGhlIHBhZ2VzIGl0IGNvc3Qg4oCUXG4gICAgLy8gbmV2ZXIgYXMgdGVuIHN0YWNrZWQgbW9kYWxzIGNhcnJ5aW5nIHRoZSBkYXRhYmFzZSdzIG93biB3b3JkaW5nLlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEocmVwb3J0LmlkLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlLCB0cnVlLCB7IGhhbmRsZXJzOiBmYWxzZSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4gdGhpcy5fY29sbGVjdGVkKGNvbXBvbmVudCwgZGF0YSwgc3RhdGUuc2VhcmNoLCBoaWRkZW5Db2x1bW5zLCBzbmFwc2hvdCkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBPbmUgdGlsZSdzIGFuc3dlciBhcyB0aGUgcmVuZGVyZXJzIHRha2UgaXQuIEEgc2VhcmNoIHRoZSBzZXJ2ZXIgY291bGRcbiAgLy8gbm90IGFwcGx5IChzZWFyY2hOb3RlOiB0aGUgbGlzdCBoYXMgbm8gdGV4dCBjb2x1bW4pIG5hcnJvd2VkIG5vdGhpbmcsIHNvXG4gIC8vIHRoZSBpdGVtIGRvZXMgbm90IGNhcnJ5IGl0LiBBIGRyaWxsZWQgY2hhcnQgY2FycmllcyB0aGUgYnJlYWRjcnVtYiBvZiB0aGVcbiAgLy8gcGF0aCBpdHMgYW5zd2VyIGFwcGxpZWQsIHdoaWNoIGlzIHdoYXQgaXRzIG51bWJlcnMgd2VyZSByZWFkIGF0LlxuICBwcml2YXRlIF9jb2xsZWN0ZWQoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXSxcbiAgICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gICk6IENvbGxlY3RlZENvbXBvbmVudCB7XG4gICAgY29uc3QgcGF0aCA9IGRhdGE/LmRyaWxsPy5wYXRoID8/IFtdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGRhdGEsXG4gICAgICAuLi4oc2VhcmNoICYmICFkYXRhPy5zZWFyY2hOb3RlID8geyBzZWFyY2ggfSA6IHt9KSxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICAuLi4ocGF0aC5sZW5ndGggPyB7IGNydW1iczogZHJpbGxDcnVtYkxhYmVscyhwYXRoLCBzbmFwc2hvdC5mb3JtYXRDb250ZXh0KSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBFYWNoIGdyb3VwJ3MgdmFsdWUgYXMgdGhlIGJhciBob2xkcyBpdCBub3csIHdpdGggdGhlIHJlbGF0aXZlIHJhbmdlIGFcbiAgLy8gZGF0ZSB2YWx1ZSBzdGlsbCBpcy4gVGhlIHBpY2tzIGFyZSBjb3BpZWQsIHNvIHRoZSBzbmFwc2hvdCBrZWVwcyB0aGVtXG4gIC8vIHdoYXRldmVyIHRoZSBiYXIgZG9lcyBuZXh0LlxuICBwcml2YXRlIF9ncm91cFZhbHVlcyhyZXBvcnQ6IFJlcG9ydCk6IFBpY2s8UmVwb3J0RXhwb3J0U25hcHNob3QsICd2YWx1ZXMnIHwgJ3ByZXNldHMnPiB7XG4gICAgY29uc3QgdmFsdWVzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPiA9IHt9O1xuICAgIGNvbnN0IHByZXNldHM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFJlbGF0aXZlUmFuZ2U+ID0ge307XG5cbiAgICAocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fZmlsdGVyU3RhdGUubGl2ZVByZXNldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZXNbZ3JvdXAuaWRdID0ge1xuICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgIC4uLih2YWx1ZS52YWx1ZXMgPyB7IHZhbHVlczogWy4uLnZhbHVlLnZhbHVlc10gfSA6IHt9KSxcbiAgICAgICAgICAuLi4odmFsdWUuZXhjbHVkZVZhbHVlcyA/IHsgZXhjbHVkZVZhbHVlczogWy4uLnZhbHVlLmV4Y2x1ZGVWYWx1ZXNdIH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0KSB7XG4gICAgICAgIHByZXNldHNbZ3JvdXAuaWRdID0gcHJlc2V0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgdmFsdWVzLCBwcmVzZXRzIH07XG4gIH1cblxuICAvLyBPbmUgbGF5ZXIncyB2YWx1ZXMsIHJlYWQgaW4gb25lIHJlcXVlc3QsIGFzIGl0cyB0ZXh0J3MgdG9rZW5zIHByaW50IHRoZW0uXG4gIC8vIFRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGZpbHRlciB2YWx1ZXMgb2YgZXZlcnkgdmFsdWUgb24gdGhlIGxheWVyLCBhcyB0aGVcbiAgLy8gY2FudmFzJ3MgZG9lcywgcmVhZCBmcm9tIHRoZSBleHBvcnQncyBzbmFwc2hvdCBsaWtlIGV2ZXJ5IHRpbGUncywgYW5kXG4gIC8vIHdoaWxlIHRoZSBncm91cHMgbWF0Y2ggJ2FueScgdGhlIGdyb3VwcyB0aGF0IGNvbWJpbmVcbiAgLy8gKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpOiB0aGUgc2VydmVyIGRlY2lkZXMgd2hpY2ggdmFsdWVzIGl0IHJlYWRzICh0aGVcbiAgLy8gc2hvd24gb25lcyBhbmQgdGhlIG9wZXJhbmRzIG9mIHRoZSBmb3JtdWxhcyBhbW9uZyB0aGVtKSBhbmQgYXBwbGllcyB0b1xuICAvLyBlYWNoIG9ubHkgdGhlIGVudHJpZXMgbmFtaW5nIGl0cyBvd24gZmlsdGVycy4gaGFuZGxlcnM6IGZhbHNlIGtlZXBzIHRoZVxuICAvLyBlcnJvciBkaWFsb2cgb3V0IG9mIGl0LCBhcyBmb3IgYSB0aWxlLiBBIGZhaWxlZCByZXF1ZXN0IHJlYWRzIGFzIG5vIHJvd3MsXG4gIC8vIHNvIGV2ZXJ5IHZhbHVlIHRoZSB0ZXh0IHNob3dzIGZhaWxlZCBhbmQgdGhlIGZhaWx1cmUgZ2F0ZSBuYW1lcyBpdHMgcGFnZTtcbiAgLy8gb25lIHZhbHVlJ3Mgb3duIGVycm9yIGZhaWxzIG9ubHkgdGhhdCB2YWx1ZSwgYW5kIGEgZmFpbGVkIG9wZXJhbmQgZmFpbHNcbiAgLy8gdGhlIGZvcm11bGEgdGhhdCByZWFkcyBpdC5cbiAgcHJpdmF0ZSBfcGFnZVZhbHVlcyhcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBwYWdlSWQ6IG51bWJlcixcbiAgICB2YWx1ZXM6IFJlcG9ydENvbXBvbmVudFtdLFxuICAgIHNob3duOiBSZXBvcnRDb21wb25lbnRbXSxcbiAgICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gICk6IE9ic2VydmFibGU8Q29sbGVjdGVkVmFsdWVzPiB7XG4gICAgY29uc3QgZm9ybWF0Q29udGV4dCA9IHNuYXBzaG90LmZvcm1hdENvbnRleHQ7XG4gICAgY29uc3QgZmlsdGVycyA9IHZhbHVlcy5mbGF0TWFwKChjb21wb25lbnQpID0+IHNuYXBzaG90LnZhbHVlRmlsdGVyc1tjb21wb25lbnQuaWRdID8/IFtdKTtcbiAgICBjb25zdCBtYXRjaEFueUdyb3VwSWRzID0gdmFsdWVzTWF0Y2hBbnlHcm91cElkcyhyZXBvcnQsIHBhZ2VJZCwgc25hcHNob3Quc3RhdGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEucGFnZVZhbHVlcyhyZXBvcnQuaWQsIHBhZ2VJZCwgZmlsdGVycywgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSwgbWF0Y2hBbnlHcm91cElkcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJvd3MpID0+IG5ldyBNYXAoKHJvd3MgPz8gW10pLm1hcCgocm93KSA9PiBbcm93LmlkLCByb3ddKSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRQYWdlVmFsdWU+KCkpKSxcbiAgICAgICAgbWFwKChyb3dzKSA9PiAoe1xuICAgICAgICAgIHZhbHVlczogdGV4dFZhbHVlcyh2YWx1ZXMsIHsgcm93cyB9LCBmb3JtYXRDb250ZXh0KSxcbiAgICAgICAgICBmYWlsZWRWYWx1ZXM6IGZhaWxlZFZhbHVlS2V5cyhzaG93biwgcm93cyksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVzdWx0cyBmaWxlZCBieSBwYWdlIGluIGpvYiBvcmRlci4gQSBsYXllciB3aXRoIG5vIHZhbHVlcyBqb2IgKGl0c1xuICAvLyB0ZXh0IHNob3dzIG5vIHZhbHVlKSBoYXMgbm8gbnVtYmVycyB0byB3YWl0IGZvcjogaXRzIHZhbHVlcyByZWFkIGFzIHRoZVxuICAvLyBlbSBkYXNoLCBhbmQgbm9uZSBvZiB0aGVtIGZhaWxlZC5cbiAgcHJpdmF0ZSBfZmlsZShcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICByZXN1bHRzOiB7IHJlc3VsdDogQ29sbGVjdFJlc3VsdDsgaW5kZXg6IG51bWJlciB9W10sXG4gICAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgKTogUGljazxDb2xsZWN0ZWRSZXBvcnQsICdwYWdlcycgfCAnbWFzdGVyVmFsdWVzJyB8ICdtYXN0ZXJGYWlsZWRWYWx1ZXMnPiB7XG4gICAgY29uc3QgdW5yZWFkID0gKHZhbHVlczogUmVwb3J0Q29tcG9uZW50W10gfCB1bmRlZmluZWQpOiBDb2xsZWN0ZWRWYWx1ZXMgPT4gKHtcbiAgICAgIHZhbHVlczogdGV4dFZhbHVlcyh2YWx1ZXMgPz8gW10sIHsgcm93czogbmV3IE1hcCgpIH0sIGZvcm1hdENvbnRleHQpLFxuICAgICAgZmFpbGVkVmFsdWVzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10sIC4uLnVucmVhZChwYWdlLnZhbHVlcykgfSkpO1xuICAgIGxldCBtYXN0ZXIgPSB1bnJlYWQocmVwb3J0Lm1hc3Rlcj8udmFsdWVzKTtcblxuICAgIFsuLi5yZXN1bHRzXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KVxuICAgICAgLmZvckVhY2goKHsgcmVzdWx0IH0pID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5raW5kID09PSAnY29tcG9uZW50Jykge1xuICAgICAgICAgIHBhZ2VzW3Jlc3VsdC5wYWdlSW5kZXhdLmNvbXBvbmVudHMucHVzaChyZXN1bHQuaXRlbSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnBhZ2VJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgIG1hc3RlciA9IHJlc3VsdC5jb2xsZWN0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihwYWdlc1tyZXN1bHQucGFnZUluZGV4XSwgcmVzdWx0LmNvbGxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgcGFnZXMsIG1hc3RlclZhbHVlczogbWFzdGVyLnZhbHVlcywgbWFzdGVyRmFpbGVkVmFsdWVzOiBtYXN0ZXIuZmFpbGVkVmFsdWVzIH07XG4gIH1cblxuICAvLyBUaGUgem9uZSB0aGUgc2VydmVyIHJlc29sdmVkLCBhcyBpdHMgSUFOQSBpZCwgYW5kIHRoZSBjdXJyZW5jeSBpdCBzYXlzXG4gIC8vIHRoZSByZXBvcnQncyBtb25leSBpcyBpbiAoYSBsYWJlbDogbm90aGluZyBpcyBjb252ZXJ0ZWQpLiBPbmx5IHRoZVxuICAvLyBzZXJ2ZXIncyB2YWx1ZXMgYXJlIHByaW50ZWQ6IHRoZSBicm93c2VyJ3Mgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lJ3NcbiAgLy8gZmFsbGJhY2sgZm9yIGFuIG9sZGVyIHNlcnZlcikgaXMgbm90IHdoYXQgdGhlIG51bWJlcnMgd2VyZSBtZWFzdXJlZCBpbixcbiAgLy8gYW5kIGFuIG9sZGVyIHNlcnZlciBuYW1lcyBubyBjdXJyZW5jeSBhdCBhbGwuXG4gIHByaXZhdGUgX2NvbnRleHRMaW5lcyhyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/IFtgVGltZXpvbmU6ICR7cmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lfWBdIDogW10pLFxuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSA/IFtgQ3VycmVuY3k6ICR7cmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5fWBdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvLyBFdmVyeSBmaWx0ZXIgZ3JvdXAgb2YgdGhlIHJlcG9ydCBhcyBpdHMge3tmaWx0ZXIuPGlkPn19IHRva2VuIHByaW50cyBpdFxuICAvLyBpbiB0aGUgZmlsZSwgYXQgdGhlIHNuYXBzaG90J3MgdmFsdWVzIGFuZCBpbiBpdHMgZm9ybWF0LCBhcyB0aGUgY2FudmFzXG4gIC8vIHdvcmRzIGl0LiBBIHNlbGVjdCdzIHBpY2tzIGFyZSBuYW1lZCBmaXJzdCwgc28gbm8gdG9rZW4gaW4gdGhlIGZpbGVcbiAgLy8gcmVhZHMgYXMgbG9hZGluZy4gRWFjaCBwYWdlIGFuZCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgcmVhZCB0aGVpciBvd25cbiAgLy8gZ3JvdXBzIG9mIHRoZXNlIChsYXllckZpbHRlckZpZWxkcykuXG4gIHByaXZhdGUgX2ZpbHRlckZpZWxkcyhcbiAgICByZXBvcnQ6IFJlcG9ydCxcbiAgICBzbmFwc2hvdDogUmVwb3J0RXhwb3J0U25hcHNob3QsXG4gICAgbmFtZXM6IFJlcG9ydEV4cG9ydExpbmVzSW5wdXRbJ25hbWVzJ10sXG4gICk6IE9ic2VydmFibGU8UmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPj4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW107XG4gICAgY29uc3QgcGlja2VkID0gZ3JvdXBzXG4gICAgICAubWFwKChncm91cCkgPT4gKHsgZ3JvdXAsIHZhbHVlczogdmFsdWVQaWNrcyhzbmFwc2hvdC52YWx1ZXNbZ3JvdXAuaWRdKSB9KSlcbiAgICAgIC5maWx0ZXIoKHsgZ3JvdXAsIHZhbHVlcyB9KSA9PiBncm91cC50eXBlID09PSAnc2VsZWN0JyAmJiB2YWx1ZXMubGVuZ3RoKTtcbiAgICBjb25zdCBuYW1lcyQgPSBwaWNrZWQubGVuZ3RoXG4gICAgICA/IGZvcmtKb2luKHBpY2tlZC5tYXAoKHsgZ3JvdXAsIHZhbHVlcyB9KSA9PiBuYW1lcyhncm91cCwgdmFsdWVzKSkpXG4gICAgICA6IG9mKFtdIGFzIHN0cmluZ1tdW10pO1xuXG4gICAgcmV0dXJuIG5hbWVzJC5waXBlKFxuICAgICAgbWFwKChuYW1lZCkgPT4ge1xuICAgICAgICBjb25zdCBieUdyb3VwID0gbmV3IE1hcChwaWNrZWQubWFwKCh7IGdyb3VwIH0sIGluZGV4KSA9PiBbZ3JvdXAuaWQsIG5hbWVkW2luZGV4XV0pKTtcblxuICAgICAgICByZXR1cm4gdGV4dEZpbHRlckZpZWxkcyhcbiAgICAgICAgICBncm91cHMsXG4gICAgICAgICAgKGdyb3VwSWQpID0+IHNuYXBzaG90LnZhbHVlc1tncm91cElkXSxcbiAgICAgICAgICBzbmFwc2hvdC5mb3JtYXRDb250ZXh0LmxvY2FsZSxcbiAgICAgICAgICAoZ3JvdXApID0+IGJ5R3JvdXAuZ2V0KGdyb3VwLmlkKSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvLyBOYW1lcyBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSBmb3Igb25lIGV4cG9ydCwgdGhlaXJcbiAgLy8gc3RvcmVkIGlkcyByZXNvbHZlZCB0byB0aGUgc2FtZSBuYW1lcyB0aGUgb24tc2NyZWVuIGNoaXBzIHNob3cg4oCUIGEgY292ZXJcbiAgLy8gcmVhZGluZyBcIk9yZ2FuaXphdGlvbjogODc3NCwgODc3N1wiIHRlbGxzIHRoZSByZWFkZXIgbm90aGluZyBhYm91dCB3aGF0XG4gIC8vIHRoZSByZXBvcnQgY292ZXJzLiBFYWNoIGdyb3VwJ3MgZnVsbCBsaXN0IGlzIHJlYWQgb25jZSBmb3IgdGhlIGV4cG9ydCxcbiAgLy8gd2hhdGV2ZXIgbmFtZXMgaXRzIHBpY2tzOiBpdHMgZmlsdGVyIGxpbmUsIGl0cyB0b2tlbiwgYSB0aXRsZS5cbiAgLy9cbiAgLy8gVXNlcyB0aGUgcmVwb3J0IGJhcidzIG93biBuYW1lcyBhbmQgcmVzb2x2ZXIgc28gdGhlIHR3byBjYW4ndCBkcmlmdDogYVxuICAvLyBuYW1lIHRoZSBiYXIncyBsaXN0cyB0YXVnaHQgKFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLmxhYmVsKSBjb21lcyBmaXJzdCxcbiAgLy8gc28gYSBwaWNrIGEgY3V0IG9yIG5hcnJvd2VkIGxpc3QgbGVhdmVzIG91dCByZWFkcyBhcyBpdHMgY2hpcCBkb2VzLCBhbmRcbiAgLy8gdGhlIGZ1bGwgbGlzdCBuYW1lcyB0aGUgcmVzdC4gQSB2YWx1ZSB3aG9zZSBlbnRpdHkgd2FzIGRlbGV0ZWQga2VlcHNcbiAgLy8gc2hvd2luZyBpdHMgcmF3IGlkIHJhdGhlciB0aGFuIGRyb3BwaW5nIG9mZiB0aGUgY292ZXIgYW5kIHNpbGVudGx5XG4gIC8vIHVuZGVyc3RhdGluZyB0aGUgZmlsdGVyLiBBIGZhaWxlZCBvcHRpb24gZmV0Y2ggZGVncmFkZXMgdGhlIHdob2xlIGxpbmUgdG9cbiAgLy8gaWRzIGZvciB0aGUgc2FtZSByZWFzb246IGFuIGV4cG9ydCBtdXN0IG5ldmVyIGZhaWwgb24gYSBjb3NtZXRpYyBsb29rdXAuXG4gIHByaXZhdGUgX3BpY2tOYW1lcihyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydEV4cG9ydExpbmVzSW5wdXRbJ25hbWVzJ10ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBncm91cE9wdGlvbnNSZWFkZXIodGhpcy5fcmVwb3J0RGF0YSk7XG5cbiAgICByZXR1cm4gKGdyb3VwLCB2YWx1ZXMpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMoXG4gICAgICBvcHRpb25zKGdyb3VwLCByZXBvcnQuaWQpLFxuICAgICAgdmFsdWVzLFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLl9maWx0ZXJPcHRpb25zLmxhYmVsKGdyb3VwLmlkLCB2YWx1ZSksXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzb2x2ZWQpID0+IHJlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YodmFsdWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKSkpLFxuICAgICAgKTtcbiAgfVxufVxuIl19