@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
@@ -249,14 +249,11 @@ export class ReportData {
249
249
  // filterSummary too, for a server that does not read filterLines; the
250
250
  // lines are left out when there are none. `states` is each tile's own
251
251
  // state by component id (zipExportStates), so each file holds what its
252
- // tile shows; it is left out when no tile has any. `viewId` names the open
253
- // saved view, which the server names in the notes, and `viewChanged` says
254
- // whether the screen differs from it; both are left out with no view open.
255
- // `titles` holds each component's title as the viewer reads it, its tokens
252
+ // tile shows; it is left out when no tile has any. `titles` holds each component's title as the viewer reads it, its tokens
256
253
  // filled, by component id, which the server names the component's file
257
254
  // after; left out when there are none. Same keep-alive contract as
258
255
  // exportComponent, over a longer run; consume through FsProcess.download.
259
- exportReport(reportId, filters = [], pageId = null, frequency = null, filterLines = [], states = {}, viewId = null, viewChanged = false, titles = {}, config = {}) {
256
+ exportReport(reportId, filters = [], pageId = null, frequency = null, filterLines = [], states = {}, titles = {}, config = {}) {
260
257
  return this._api.post(this._path(`${reportId}/export`), {
261
258
  filters,
262
259
  ...(pageId ? { pageId } : {}),
@@ -264,7 +261,6 @@ export class ReportData {
264
261
  filterSummary: filterLines.map((line) => line.text),
265
262
  ...(filterLines.length ? { filterLines } : {}),
266
263
  ...(Object.keys(states).length ? { states } : {}),
267
- ...(viewId ? { viewId, viewChanged } : {}),
268
264
  ...(Object.keys(titles).length ? { titles } : {}),
269
265
  }, {
270
266
  key: 'url',
@@ -424,52 +420,39 @@ export class ReportData {
424
420
  ...config,
425
421
  });
426
422
  }
427
- // The report's saved views the viewer may see: names and flags, whether it
428
- // may share, and its own default view in full. No `key`: the whole payload
429
- // is the answer, as tree() reads it. Only for a report whose server lists
430
- // 'views' (Report.viewerFeatures).
431
- views(reportId, config = {}) {
432
- return this._api.get(this._path(`${reportId}/views`), {}, config);
433
- }
434
- // One saved view with its config, pruned to the report as it is now.
435
- view(reportId, reportViewId, config = {}) {
436
- return this._api.get(this._path(`${reportId}/views/${reportViewId}`), {}, {
437
- key: 'view',
438
- ...config,
439
- });
440
- }
441
- createView(reportId, view, config = {}) {
442
- return this._api.post(this._path(`${reportId}/views`), view, {
443
- key: 'view',
423
+ // The report's saved filters, in their order. Shared by everyone who may
424
+ // open the report.
425
+ savedFilters(reportId, config = {}) {
426
+ return this._api.get(this._path(`${reportId}/savedfilters`), {}, {
427
+ key: 'savedFilters',
444
428
  ...config,
445
429
  });
446
430
  }
447
- // Renames a view or replaces its config; only the keys given change.
448
- updateView(reportId, reportViewId, changes, config = {}) {
449
- return this._api.put(this._path(`${reportId}/views/${reportViewId}`), changes, {
450
- key: 'view',
431
+ // A new saved filter: its name and the report-wide filter values it holds.
432
+ createSavedFilter(reportId, savedFilter, config = {}) {
433
+ return this._api.post(this._path(`${reportId}/savedfilters`), savedFilter, {
434
+ key: 'savedFilter',
451
435
  ...config,
452
436
  });
453
437
  }
454
- // Resolves to the deleted view's id and its state.
455
- deleteView(reportId, reportViewId, config = {}) {
456
- return this._api.delete(this._path(`${reportId}/views/${reportViewId}`), {}, {
457
- key: 'view',
438
+ // Renames a saved filter or replaces its values; only the keys given change.
439
+ updateSavedFilter(reportId, reportSavedFilterId, changes, config = {}) {
440
+ return this._api.put(this._path(`${reportId}/savedfilters/${reportSavedFilterId}`), changes, {
441
+ key: 'savedFilter',
458
442
  ...config,
459
443
  });
460
444
  }
461
- // Shares a view with everyone who may open the report, or stops sharing it.
462
- shareView(reportId, reportViewId, shared, config = {}) {
463
- return this._api.post(this._path(`${reportId}/views/${reportViewId}/share`), { shared }, {
464
- key: 'view',
445
+ deleteSavedFilter(reportId, reportSavedFilterId, config = {}) {
446
+ return this._api.delete(this._path(`${reportId}/savedfilters/${reportSavedFilterId}`), {}, {
447
+ key: 'savedFilter',
465
448
  ...config,
466
449
  });
467
450
  }
468
- // Makes a view the viewer's default, or stops opening it by default. The
469
- // server clears the viewer's previous default.
470
- setViewDefault(reportId, reportViewId, personalDefault, config = {}) {
471
- return this._api.post(this._path(`${reportId}/views/${reportViewId}/default`), { personalDefault }, {
472
- key: 'view',
451
+ // Persist the saved filters' order after a drag: every id, in its new
452
+ // order. Resolves to the list in that order.
453
+ saveSavedFilterPositions(reportId, reportSavedFilterIds, config = {}) {
454
+ return this._api.put(this._path(`${reportId}/savedfilters/positions`), { reportSavedFilterIds }, {
455
+ key: 'savedFilters',
473
456
  ...config,
474
457
  });
475
458
  }
@@ -482,4 +465,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
482
465
  providedIn: 'root',
483
466
  }]
484
467
  }] });
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBc0J2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRzVELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUscUZBQXFGO0FBSXJGLE1BQU0sT0FBTyxVQUFVO0lBQ2IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU3Qiw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQ3ZFLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFFNUIsa0ZBQWtGO0lBQ2xGLGtEQUFrRDtJQUMxQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUU7UUFDdkIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMvRCxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQWEsRUFBRSxFQUFFLFNBQXdCLEVBQUU7UUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEtBQUssRUFDTDtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQ3ZFLElBQUksQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0wsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTSxDQUFDLElBQVksRUFBRSxpQkFBeUIsSUFBSSxFQUFFLFNBQXdCLEVBQUU7UUFDbkYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxFQUN4QjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsNEJBQTRCO0lBQ3JCLFVBQVUsQ0FBQyxRQUFnQixFQUFFLGNBQTZCLEVBQUUsU0FBd0IsRUFBRTtRQUMzRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFDekIsRUFBRSxjQUFjLEVBQUUsRUFDbEI7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxZQUFZLENBQ2pCLElBQVksRUFDWix1QkFBK0IsSUFBSSxFQUNuQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQ3JCLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLEVBQzlCO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLDRFQUE0RTtJQUNyRSxZQUFZLENBQ2pCLGNBQXNCLEVBQ3RCLE1BQStCLEVBQy9CLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGNBQWMsRUFBRSxDQUFDLEVBQ3ZDLE1BQU0sRUFDTjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxnREFBZ0Q7SUFDekMsWUFBWSxDQUFDLGNBQXNCLEVBQUUsU0FBd0IsRUFBRTtRQUNwRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsY0FBYyxFQUFFLENBQUMsRUFDdkMsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLCtFQUErRTtJQUMvRSw4QkFBOEI7SUFDdkIsY0FBYyxDQUFDLGNBQXNCLEVBQUUsU0FBd0IsRUFBRTtRQUN0RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsY0FBYyxXQUFXLENBQUMsRUFDaEQsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQWdCLEVBQUUsSUFBWSxFQUFFLFNBQXdCLEVBQUU7UUFDdEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQ3pCLEVBQUUsSUFBSSxFQUFFLEVBQ1I7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsOERBQThEO0lBQzlELG9FQUFvRTtJQUNwRSxzRUFBc0U7SUFDdEUsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSxnRUFBZ0U7SUFDekQsTUFBTSxDQUFDLFFBQWdCLEVBQUUsUUFBaUMsRUFBRSxTQUF3QixFQUFFO1FBQzNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUN6QixRQUFRLEVBQ1I7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwrREFBK0Q7SUFDeEQsT0FBTyxDQUFDLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUN6RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxRQUFRLENBQUMsRUFDL0IsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSxrRUFBa0U7SUFDM0QsVUFBVSxDQUNmLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxJQUErQyxFQUMvQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxFQUFFLENBQUMsRUFDekMsSUFBSSxFQUNKO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSxhQUFhO0lBQ04sVUFBVSxDQUFDLFFBQWdCLEVBQUUsTUFBYyxFQUFFLFNBQXdCLEVBQUU7UUFDNUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsVUFBVSxNQUFNLEVBQUUsQ0FBQyxFQUN6QyxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsTUFBTTtZQUNYLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsb0VBQW9FO0lBQzdELGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixTQUE4QyxFQUM5QyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGtCQUFrQixDQUFDLEVBQ3pDLEVBQUUsU0FBUyxFQUFFLEVBQ2I7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLG9FQUFvRTtJQUM3RCxlQUFlLENBQ3BCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFFBQWlDLEVBQ2pDLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLFdBQVcsQ0FBQyxFQUM1RCxRQUFRLEVBQ1I7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSwyREFBMkQ7SUFDcEQsT0FBTyxDQUNaLFFBQWdCLEVBQ2hCLElBQW9GLEVBQ3BGLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsYUFBYSxDQUFDLEVBQ3BDLElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUNqRSxlQUFlLENBQ3BCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLEVBQUUsQ0FBQyxFQUNuRCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsV0FBVztZQUNoQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLDJEQUEyRDtJQUNwRCxNQUFNLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUN6QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLGdFQUFnRTtJQUN6RCxRQUFRLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQzFELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFdBQVcsQ0FBQyxFQUNsQyxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSxzQkFBc0I7SUFDZixHQUFHLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUN6QixFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQ3ZDO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLDJCQUEyQjtJQUNwQixhQUFhLENBQ2xCLFFBQWdCLEVBQ2hCLFNBQWdHLEVBQ2hHLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsdUJBQXVCLENBQUMsRUFDOUMsRUFBRSxTQUFTLEVBQUUsRUFDYjtZQUNFLEdBQUcsRUFBRSxJQUFJO1lBQ1QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxvRUFBb0U7SUFDcEUsRUFBRTtJQUNGLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHVDQUF1QztJQUNoQyxhQUFhLENBQ2xCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFVBQWlDLEVBQUUsRUFDbkMsUUFBNEIsRUFBRSxFQUM5QixRQUFRLEdBQUcsS0FBSyxFQUNoQixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxPQUFPLENBQUMsRUFDeEQsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFDcEM7WUFDRSxHQUFHLEVBQUUsTUFBTTtZQUNYLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsaUVBQWlFO0lBQ2pFLEVBQUU7SUFDRixzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSxvRkFBb0Y7SUFDcEYseUVBQXlFO0lBQ3pFLG9CQUFvQjtJQUNwQixFQUFFO0lBQ0Ysd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsVUFBVTtJQUNILFVBQVUsQ0FDZixRQUFnQixFQUNoQixNQUFjLEVBQ2QsVUFBaUMsRUFBRSxFQUNuQyxRQUFRLEdBQUcsS0FBSyxFQUNoQixTQUF3QixFQUFFLEVBQzFCLG1CQUE2QixFQUFFO1FBRS9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFDaEQsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQ3ZGO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsbUNBQW1DO0lBQzVCLGVBQWUsQ0FDcEIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsVUFBaUMsRUFBRSxFQUNuQyxRQUE0QixFQUFFLEVBQzlCLEtBQUssR0FBRyxFQUFFLEVBQ1YsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxlQUFlLFdBQVcsU0FBUyxDQUFDLEVBQzFELEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFDekI7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLGtFQUFrRTtJQUNsRSxpRUFBaUU7SUFDakUsc0VBQXNFO0lBQ3RFLHNFQUFzRTtJQUN0RSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLHVFQUF1RTtJQUN2RSxtRUFBbUU7SUFDbkUsMEVBQTBFO0lBQ25FLFlBQVksQ0FDakIsUUFBZ0IsRUFDaEIsVUFBaUMsRUFBRSxFQUNuQyxTQUF3QixJQUFJLEVBQzVCLFlBQXFDLElBQUksRUFDekMsY0FBa0MsRUFBRSxFQUNwQyxTQUE2QyxFQUFFLEVBQy9DLFNBQXdCLElBQUksRUFDNUIsV0FBVyxHQUFHLEtBQUssRUFDbkIsU0FBaUMsRUFBRSxFQUNuQyxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFNBQVMsQ0FBQyxFQUNoQztZQUNFLE9BQU87WUFDUCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25DLGFBQWEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsRCxFQUNEO1lBQ0UsR0FBRyxFQUFFLEtBQUs7WUFDVixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNqRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxFQUFFO0lBQ0YsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLEVBQUU7SUFDRiw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLGtDQUFrQztJQUMzQixZQUFZLENBQ2pCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLE1BQU0sQ0FBQyxFQUN2RCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNERBQTREO0lBQ3JELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsV0FBbUIsRUFBRSxTQUF3QixFQUFFO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGVBQWUsV0FBVyxVQUFVLENBQUMsRUFDM0QsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDbEUsU0FBUyxDQUNkLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLE1BQXNILEVBQ3RILFNBQXdCLEVBQUU7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFBZSxXQUFXLFVBQVUsQ0FBQyxFQUMzRCxNQUFNLEVBQ047WUFDRSxHQUFHLEVBQUUsUUFBUTtZQUNiLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrRUFBa0U7SUFDM0QsWUFBWSxDQUNqQixRQUFnQixFQUNoQixRQUFnQixFQUNoQixPQUFtRSxFQUNuRSxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUMsRUFDN0MsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsa0VBQWtFO0lBQzNELFlBQVksQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBd0IsRUFBRTtRQUNoRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsRUFBRSxDQUFDLEVBQzdDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSw0REFBNEQ7SUFDckQsWUFBWSxDQUFDLFNBQXdCLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFDMUIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUN0RSxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsU0FBd0IsRUFBRTtRQUNqRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUMxQixFQUFFLE9BQU8sRUFBRSxFQUNYO1lBQ0UsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQ3BFLGtCQUFrQixDQUFDLGFBQXFCLEVBQUUsU0FBd0IsRUFBRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixhQUFhLFVBQVUsQ0FBQyxFQUNuRCxFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUN0RSxhQUFhLENBQUMsU0FBd0IsRUFBRTtRQUM3QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDaEIsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsOERBQThEO0lBQ3ZELG1CQUFtQixDQUFDLFNBQXdCLEVBQUU7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDbEUsaUJBQWlCLENBQUMsU0FBd0IsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQ2pDLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsc0NBQXNDO0lBQy9CLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxTQUF3QixFQUFFO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLE1BQU0sWUFBWSxDQUFDLEVBQ25ELEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxpQkFBaUI7WUFDdEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGtGQUFrRjtJQUMzRSxRQUFRLENBQUMsU0FBd0IsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUN0QixFQUFFLEVBQ0Y7WUFDRSxHQUFHLEVBQUUsVUFBVTtZQUNmLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDbkUsT0FBTyxDQUFDLFNBQXdCLEVBQUU7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDckIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELFlBQVksQ0FBQyxRQUE4QyxFQUFFLFNBQXdCLEVBQUU7UUFDNUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFDdEIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsK0NBQStDO0lBQ3hDLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBaUMsRUFDakMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLENBQUMsRUFDakQsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLGFBQWE7WUFDbEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLGdDQUFnQztJQUN6QixxQkFBcUIsQ0FDMUIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsSUFBZ0MsRUFDaEMsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxZQUFZLFFBQVEsVUFBVSxDQUFDLEVBQ3JELElBQUksRUFDSjtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLG1DQUFtQztJQUM1QixLQUFLLENBQUMsUUFBZ0IsRUFBRSxTQUF3QixFQUFFO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFFBQVEsQ0FBQyxFQUMvQixFQUFFLEVBQ0YsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQscUVBQXFFO0lBQzlELElBQUksQ0FBQyxRQUFnQixFQUFFLFlBQW9CLEVBQUUsU0FBd0IsRUFBRTtRQUM1RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLFlBQVksRUFBRSxDQUFDLEVBQy9DLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVUsQ0FBQyxRQUFnQixFQUFFLElBQXNCLEVBQUUsU0FBd0IsRUFBRTtRQUNwRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxRQUFRLENBQUMsRUFDL0IsSUFBSSxFQUNKO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQscUVBQXFFO0lBQzlELFVBQVUsQ0FDZixRQUFnQixFQUNoQixZQUFvQixFQUNwQixPQUEyRCxFQUMzRCxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsWUFBWSxFQUFFLENBQUMsRUFDL0MsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLE1BQU07WUFDWCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsbURBQW1EO0lBQzVDLFVBQVUsQ0FBQyxRQUFnQixFQUFFLFlBQW9CLEVBQUUsU0FBd0IsRUFBRTtRQUNsRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxVQUFVLFlBQVksRUFBRSxDQUFDLEVBQy9DLEVBQUUsRUFDRjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDRFQUE0RTtJQUNyRSxTQUFTLENBQUMsUUFBZ0IsRUFBRSxZQUFvQixFQUFFLE1BQWUsRUFBRSxTQUF3QixFQUFFO1FBQ2xHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsWUFBWSxRQUFRLENBQUMsRUFDckQsRUFBRSxNQUFNLEVBQUUsRUFDVjtZQUNFLEdBQUcsRUFBRSxNQUFNO1lBQ1gsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwrQ0FBK0M7SUFDeEMsY0FBYyxDQUNuQixRQUFnQixFQUNoQixZQUFvQixFQUNwQixlQUF3QixFQUN4QixTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLFVBQVUsWUFBWSxVQUFVLENBQUMsRUFDdkQsRUFBRSxlQUFlLEVBQUUsRUFDbkI7WUFDRSxHQUFHLEVBQUUsTUFBTTtZQUNYLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7d0dBcHpCVSxVQUFVOzRHQUFWLFVBQVUsY0FGVCxNQUFNOzs0RkFFUCxVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGc0FwaSwgUmVxdWVzdENvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RXhwb3J0TGluZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1saW5lLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItZ3JvdXAtY2hhbmdlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1JlcXVlc3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy1yZXF1ZXN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdDcmVhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LWNyZWF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0RlbGV0ZWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LWRlbGV0ZWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3cyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdzLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIENvbXBvbmVudEV4cG9ydFJlc3BvbnNlLFxuICBSZXBvcnRDb21wb25lbnRTcWwsXG4gIFJlcG9ydExvY2FsZXMsXG4gIFJlcG9ydFBhZ2VWYWx1ZSxcbiAgUmVwb3J0VHJlZSxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZJRVdFUl9GRUFUVVJFUyB9IGZyb20gJy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCB0aW1lem9uZSxcbiAgLy8gbG9jYWxlLCBjdXJyZW5jeSwgc3R5bGVzLCBoZWFkZXJGb290ZXIgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZVxuICAvLyByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy4gaGVhZGluZyBzaXplKSwgaGVhZGVyRm9vdGVyIHRoZVxuICAvLyBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzIGluIGluY2hlcy4gVGhlIHBhZ2Ugc2l6ZSBpcyBpbiBpbmNoZXMgYW5kXG4gIC8vIHdpZHRoL2hlaWdodCBnbyB0b2dldGhlci4gbG9jYWxlIChhIEJDUCA0NyB0YWcpIGFuZCBjdXJyZW5jeSAoYW4gSVNPIDQyMTdcbiAgLy8gY29kZSkgYXJlIGVhY2ggc2VudCBvbmx5IHRvIGNoYW5nZSB0aGVtOyAnJyByZXR1cm5zIHRoZSByZXBvcnQgdG8gdGhlXG4gIC8vIGRlZmF1bHQsIGFuZCB0aGUgY3VycmVuY3kgb25seSBuYW1lcyB3aGF0IHRoZSBhbW91bnRzIGFyZSBpbi5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFueSBzdWJzZXQgb2YgeyBuYW1lLCBtYXN0ZXJIaWRkZW4gfS4gQW4gZW1wdHkgbmFtZSBpcyBzdG9yZWQgYXMgbnVsbFxuICAvLyBzZXJ2ZXItc2lkZSwgd2hpY2ggcHV0cyB0aGUgdGFiIGJhY2sgb24gaXRzIHBvc2l0aW9uYWwgXCJQYWdlIE5cIiBsYWJlbDtcbiAgLy8gbWFzdGVySGlkZGVuIGhpZGVzIHRoZSByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBvbiB0aGlzIHBhZ2UuXG4gIHB1YmxpYyB1cGRhdGVQYWdlKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgcGFnZTogeyBuYW1lPzogc3RyaW5nOyBtYXN0ZXJIaWRkZW4/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICBwYWdlLFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgcGFnZSBhbmQgZXZlcnl0aGluZyBvbiBpdC4gUmVmdXNlZCBzZXJ2ZXItc2lkZSBmb3IgdGhlIGxhc3RcbiAgLy8gcmVtYWluaW5nIHBhZ2Ug4oCUIGEgcmVwb3J0IHdpdGggbm8gY2FudmFzIGlzIGEgZGVsZXRlZCByZXBvcnQsIG5vdCBhIHBhZ2VcbiAgLy8gb3BlcmF0aW9uLlxuICBwdWJsaWMgZGVsZXRlUGFnZShyZXBvcnRJZDogbnVtYmVyLCBwYWdlSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IHRoZSB0YWIgb3JkZXIgYWZ0ZXIgYSBkcmFnIOKAlCB0aGUgd2hvbGUgbGlzdCwgaW4gaXRzIG5ldyBvcmRlciwgc29cbiAgLy8gdGhlIHNlcXVlbmNlIHN0YXlzIGdhcGxlc3Mgd2l0aG91dCB0aGUgc2VydmVyIGluZmVycmluZyB0aGUgbW92ZS5cbiAgcHVibGljIHNhdmVQYWdlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiB7IHBhZ2VJZDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH1bXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgdGl0bGUsIHBhZGRpbmcgfSDigJQgdGhlIGh1bWFuLWZhY2luZ1xuICAvLyBkaWFsb2cgZWRpdHMg4oCUIG9yIGEgdGV4dCBibG9jaydzIHsgaHRtbCB9IGZyb20gaXRzIGlubGluZSBlZGl0b3I7IGdlb21ldHJ5XG4gIC8vICh4L3kvdy9oKSBpcyBwZXJzaXN0ZWQgdmlhIHNhdmVQb3NpdGlvbnMgZnJvbSB0aGUgY2FudmFzIGluc3RlYWQuXG4gIHB1YmxpYyB1cGRhdGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NldHRpbmdzYCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGxhY2UgYSB0ZXh0IGJsb2NrIOKAlCBvbiBhIHBhZ2UsIG9yIGluIHRoZSBoZWFkZXIvZm9vdGVyIHdoZW4gcGFnZUlkIGlzXG4gIC8vIG9taXR0ZWQuIFRoZSBvbmx5IGNvbXBvbmVudCB0aGUgVUkgY3JlYXRlcyBpdHNlbGY6IGNoYXJ0cywgbGlzdHMgYW5kIEtQSXNcbiAgLy8gbmVlZCBhIHF1ZXJ5IGFuZCBjb21lIGZyb20gdGhlIGNoYXQuIFJlc29sdmVzIHRvIHsgaWQgfS5cbiAgcHVibGljIGFkZFRleHQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB0ZXh0OiB7IHBhZ2VJZD86IG51bWJlcjsgaHRtbD86IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHNgKSxcbiAgICAgIHRleHQsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBvbmUgY29tcG9uZW50IGZyb20gdGhlIGNhbnZhcywgdG9nZXRoZXIgd2l0aCBpdHMgZmlsdGVycyBhbmQgYW55XG4gIC8vIGZpbHRlciBncm91cCB0aGV5IGxlYXZlIGVtcHR5LiBTb2Z0IHNlcnZlci1zaWRlLCBidXQgdGhlcmUgaXMgbm8gcmVzdG9yZVxuICAvLyBhbnl3aGVyZSBpbiB0aGUgVUksIHNvIHRoZSBkaWFsb2cncyBjb25maXJtIHByZXNlbnRzIGl0IGFzIHBlcm1hbmVudC5cbiAgcHVibGljIGRlbGV0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlOiB0aGUgcmVwb3J0IGxlYXZlcyB0aGUgbGlzdGluZyBidXQga2VlcHMgaXRzIHBhZ2VzIGFuZFxuICAvLyBjb21wb25lbnRzLCBzbyB1bmRlbGV0ZSgpIGJyaW5ncyBiYWNrIHRoZSBzYW1lIGRvY3VtZW50LlxuICBwdWJsaWMgZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgcmVwb3J0IHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSByZXBvcnRcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBJdHMgZm9sZGVyIGlzIHJlc3RvcmVkIHRvbyB3aGVuIGl0IGlzIGRlbGV0ZWQsXG4gIC8vIG9yIGluc2lkZSBvbmUgdGhhdCBpcywgc28gdGhlIHJlcG9ydCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgYXNzZW1ibGVkIHN0cnVjdHVyZTogcGFnZXMg4oaSIGNvbXBvbmVudHMgKCsgdGhlaXIgZmlsdGVycykgYW5kIHRoZVxuICAvLyByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzLiBgZmVhdHVyZXNgIG5hbWVzIHdoYXQgdGhpcyB2aWV3ZXIgaW1wbGVtZW50c1xuICAvLyAoVklFV0VSX0ZFQVRVUkVTKSwgc28gdGhlIHNlcnZlciBzZW5kcyBldmVyeSBncm91cCBpbiBhIHNoYXBlIHRoZSB2aWV3ZXJcbiAgLy8gY2FuIHNob3cgYW5kIGNsZWFyLlxuICBwdWJsaWMgZ2V0KHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyBmZWF0dXJlczogVklFV0VSX0ZFQVRVUkVTLmpvaW4oJywnKSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IGdlb21ldHJ5IGZvciB0aGUgbW92ZWQgY29tcG9uZW50cyBvbmx5IOKAlCBhbnkgc3Vic2V0IG9mXG4gIC8vIHsgeCwgeSwgdywgaCB9IChpbmNoZXMpLlxuICBwdWJsaWMgc2F2ZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogKHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUGFydGlhbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9PilbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgY29tcG9uZW50J3MgZGF0YS4gVGhlIGJvZHkgY2FycmllcyBldmVyeXRoaW5nIHNlc3Npb24tc2NvcGVkOiB0aGVcbiAgLy8gcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBpbnRlcmFjdGlvbiBzdGF0ZS5cbiAgLy9cbiAgLy8gYGlzRXhwb3J0YCBtYXJrcyB0aGUgcmVhZCBhcyBwYXJ0IG9mIGEgUERGL1Bvd2VyUG9pbnQgcmVuZGVyLiBUaGUgc2VydmVyXG4gIC8vIGdpdmVzIHRob3NlIGEgbG9uZ2VyIHBlci1zdGF0ZW1lbnQgY2VpbGluZyB0aGFuIGFuIG9uLXNjcmVlbiB0aWxlLCBiZWNhdXNlXG4gIC8vIGEgcmVhZGVyIHdhdGNoaW5nIGFuIGV4cG9ydCBwcm9ncmVzcyBiYXIgY2FuIHdhaXQgZm9yIGEgcXVlcnkgbm9ib2R5IHdvdWxkXG4gIC8vIHRvbGVyYXRlIHdhaXRpbmcgZm9yIG9uIGEgZGFzaGJvYXJkLlxuICBwdWJsaWMgY29tcG9uZW50RGF0YShcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIG51bWJlcnMgb2YgYSBwYWdlJ3MgdmFsdWVzIOKAlCBvciB0aGUgbWFzdGVyJ3MsIGZvciB0aGUgaGVhZGVyIGFuZFxuICAvLyBmb290ZXIg4oCUIGluIG9uZSByZXF1ZXN0OiBhIHJvdyBwZXIgdmFsdWUgdGhhdCBwYWdlIHJlYWRzLCBzaG93biBieSBzb21lXG4gIC8vIHRleHQgb3IgcmVhZCBieSBhIGZvcm11bGEgaXQgc2hvd3MgKFJlcG9ydFBhZ2VWYWx1ZSkuIGBmaWx0ZXJzYCBjYXJyaWVzXG4gIC8vIHRoZSByZXNvbHZlZCB2YWx1ZXMgZm9yIGV2ZXJ5IHZhbHVlIG9mIHRoZSBsYXllciB0b2dldGhlcjsgZWFjaCB2YWx1ZSB0aGVcbiAgLy8gc2VydmVyIHJlYWRzIHBpY2tzIG91dCBpdHMgb3duLiBgaXNFeHBvcnRgIGlzIGNvbXBvbmVudERhdGEncy5cbiAgLy9cbiAgLy8gVGhlIHNlcnZlciByZWFkcyBvbmUgc3RhdGVtZW50IHBlciBkaXN0aW5jdCBxdWVyeSAodmFsdWVzIHNoYXJpbmcgYVxuICAvLyBxdWVyeSBhbmQgaXRzIGZpbHRlcnMgYXJlIGZvbGRlZCBpbnRvIG9uZTsgYSBmb3JtdWxhIHJ1bnMgbm9uZSkgYW5kIG1heVxuICAvLyBzdHJlYW0gYSBrZWVwQWxpdmUgcHVsc2UgYmVmb3JlIGVhY2gsIHNvIGEgc2xvdyBwYWdlIG5ldmVyIHNpdHMgc2lsZW50XG4gIC8vIHVudGlsIHRoZSBjb25uZWN0aW9uIGRyb3BzLiBUaGUgYm9keSBzdGF5cyBvbmUgSlNPTiB3aXRoIHRoZSByb3dzIGF0IGRhdGEudmFsdWVzLFxuICAvLyB3aGljaCBGc0FwaSByZWFkcyB3aXRoIHRoZSAndmFsdWVzJyBrZXksIGFzIGV4cG9ydENvbXBvbmVudCdzIHN0cmVhbWVkXG4gIC8vIHJlc3BvbnNlIGlzIHJlYWQuXG4gIC8vXG4gIC8vIGBtYXRjaEFueUdyb3VwSWRzYCBpcyBhIHRpbGUncyAoQ29tcG9uZW50RGF0YVN0YXRlKTogd2hpbGUgdGhlIGdyb3Vwc1xuICAvLyBtYXRjaCAnYW55JywgdGhlIGdyb3VwcyB0aGF0IGNvbWJpbmUgKHZhbHVlc01hdGNoQW55R3JvdXBJZHMpLiBTZW50IG9ubHlcbiAgLy8gd2hlbiBpdCBsaXN0cyBhbnk7IHRoZSBzZXJ2ZXIgY2hlY2tzIGVhY2ggdmFsdWUgYWdhaW5zdCBpdCBhcyBpdCBjaGVja3NcbiAgLy8gYSB0aWxlLlxuICBwdWJsaWMgcGFnZVZhbHVlcyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBhZ2VJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICAgbWF0Y2hBbnlHcm91cElkczogbnVtYmVyW10gPSBbXSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRQYWdlVmFsdWVbXT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfS92YWx1ZXNgKSxcbiAgICAgIHsgZmlsdGVycywgZXhwb3J0OiBpc0V4cG9ydCwgLi4uKG1hdGNoQW55R3JvdXBJZHMubGVuZ3RoID8geyBtYXRjaEFueUdyb3VwSWRzIH0gOiB7fSkgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndmFsdWVzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0cyBvbmUgY29tcG9uZW50IHRvIENTViBzZXJ2ZXItc2lkZTogdGhlIGZpbGUgaXMgd2hhdCB0aGUgc2NyZWVuXG4gIC8vIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyByZW5kZXJlZCwgYSBsaXN0IGluIGZ1bGwgaW4gdGhlIHNjcmVlbidzIG9yZGVyKS5cbiAgLy8gVGhlIGJhY2tlbmQgc3RyZWFtcyBwZXJjZW50YWdlIHByb2dyZXNzIHdoaWxlIGl0IHdyaXRlcy5cbiAgLy9cbiAgLy8ga2V5OiBudWxsIG9uIHB1cnBvc2UsIHVubGlrZSB0aGUga2V5OiAndXJsJyBwcmVzaWduZWQtZXhwb3J0IHBhdHRlcm46IHRoZVxuICAvLyByZXNwb25zZSBhbHNvIGNhcnJpZXMgYG5vdGVzYCwgdGhlIHNlbnRlbmNlcyBzYXlpbmcgaG93IHRoZSBmaWxlIGZhbGxzXG4gIC8vIHNob3J0IG9mIHRoZSBmdWxsIHJlc3VsdCwgYW5kIHRoZSBjYWxsZXIgaGFzIHRvIHNob3cgdGhlbSBiZWZvcmUgaXQgaGFuZHNcbiAgLy8gdGhlIHVybCB0byBGc1Byb2Nlc3MuZG93bmxvYWQuIGB0aXRsZWAgaXMgdGhlIGNvbXBvbmVudCdzIHRpdGxlIGFzIHRoZVxuICAvLyB2aWV3ZXIgcmVhZHMgaXQsIGl0cyB0b2tlbnMgZmlsbGVkICgnU2lnbi11cHMg4oCUIFNlcHRlbWJlciAyMDI2JyksIHdoaWNoXG4gIC8vIHRoZSBzZXJ2ZXIgbmFtZXMgdGhlIGZpbGUgYWZ0ZXIuXG4gIHB1YmxpYyBleHBvcnRDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7fSxcbiAgICB0aXRsZSA9ICcnLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPENvbXBvbmVudEV4cG9ydFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9leHBvcnRgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUsIHRpdGxlIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0cyBFVkVSWSBjb21wb25lbnQgb24gdGhlIHJlcG9ydCDigJQgb3Igb24gb25lIHBhZ2Ug4oCUIHNlcnZlci1zaWRlIGFuZFxuICAvLyByZXNvbHZlcyB0byBhIHByZXNpZ25lZCBVUkwgZm9yIGEgemlwIG9mIG9uZSBDU1YgcGVyIGNvbXBvbmVudCwgZm9sZGVyZWQgYnlcbiAgLy8gcGFnZSwgcGx1cyBhbiAnRXhwb3J0IE5vdGVzLnR4dCcuIGBmaWx0ZXJzYCBjYXJyaWVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgZm9yXG4gIC8vIGV2ZXJ5IGNvbXBvbmVudCB0b2dldGhlcjsgZWFjaCBvbmUgcGlja3Mgb3V0IGl0cyBvd24uIGBmcmVxdWVuY3lgIGlzIHRoZVxuICAvLyByZXBvcnQncyBncm91cC1ieSBncmFpbiAodGhlIHNlcnZlciByZS1idWNrZXRzIG9ubHkgdGltZS1zZXJpZXMgY2hhcnRzIHRvXG4gIC8vIGl0KSwgYW5kIGBmaWx0ZXJMaW5lc2AgaXMgdGhlIGZpbHRlciBiYXIgYXMgdGhlIHZpZXdlciByZWFkcyBpdFxuICAvLyAoZXhwb3J0TGluZXMpLCB3aGljaCB0aGUgbm90ZXMgZmlsZSB3cml0ZXMuIFRoZWlyIHRleHQgZ29lcyBhc1xuICAvLyBmaWx0ZXJTdW1tYXJ5IHRvbywgZm9yIGEgc2VydmVyIHRoYXQgZG9lcyBub3QgcmVhZCBmaWx0ZXJMaW5lczsgdGhlXG4gIC8vIGxpbmVzIGFyZSBsZWZ0IG91dCB3aGVuIHRoZXJlIGFyZSBub25lLiBgc3RhdGVzYCBpcyBlYWNoIHRpbGUncyBvd25cbiAgLy8gc3RhdGUgYnkgY29tcG9uZW50IGlkICh6aXBFeHBvcnRTdGF0ZXMpLCBzbyBlYWNoIGZpbGUgaG9sZHMgd2hhdCBpdHNcbiAgLy8gdGlsZSBzaG93czsgaXQgaXMgbGVmdCBvdXQgd2hlbiBubyB0aWxlIGhhcyBhbnkuIGB2aWV3SWRgIG5hbWVzIHRoZSBvcGVuXG4gIC8vIHNhdmVkIHZpZXcsIHdoaWNoIHRoZSBzZXJ2ZXIgbmFtZXMgaW4gdGhlIG5vdGVzLCBhbmQgYHZpZXdDaGFuZ2VkYCBzYXlzXG4gIC8vIHdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gaXQ7IGJvdGggYXJlIGxlZnQgb3V0IHdpdGggbm8gdmlldyBvcGVuLlxuICAvLyBgdGl0bGVzYCBob2xkcyBlYWNoIGNvbXBvbmVudCdzIHRpdGxlIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQsIGl0cyB0b2tlbnNcbiAgLy8gZmlsbGVkLCBieSBjb21wb25lbnQgaWQsIHdoaWNoIHRoZSBzZXJ2ZXIgbmFtZXMgdGhlIGNvbXBvbmVudCdzIGZpbGVcbiAgLy8gYWZ0ZXI7IGxlZnQgb3V0IHdoZW4gdGhlcmUgYXJlIG5vbmUuIFNhbWUga2VlcC1hbGl2ZSBjb250cmFjdCBhc1xuICAvLyBleHBvcnRDb21wb25lbnQsIG92ZXIgYSBsb25nZXIgcnVuOyBjb25zdW1lIHRocm91Z2ggRnNQcm9jZXNzLmRvd25sb2FkLlxuICBwdWJsaWMgZXhwb3J0UmVwb3J0KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICBmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbCxcbiAgICBmaWx0ZXJMaW5lczogUmVwb3J0RXhwb3J0TGluZVtdID0gW10sXG4gICAgc3RhdGVzOiBSZWNvcmQ8bnVtYmVyLCBDb21wb25lbnREYXRhU3RhdGU+ID0ge30sXG4gICAgdmlld0lkOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICB2aWV3Q2hhbmdlZCA9IGZhbHNlLFxuICAgIHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9leHBvcnRgKSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgLi4uKHBhZ2VJZCA/IHsgcGFnZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pLFxuICAgICAgICBmaWx0ZXJTdW1tYXJ5OiBmaWx0ZXJMaW5lcy5tYXAoKGxpbmUpID0+IGxpbmUudGV4dCksXG4gICAgICAgIC4uLihmaWx0ZXJMaW5lcy5sZW5ndGggPyB7IGZpbHRlckxpbmVzIH0gOiB7fSksXG4gICAgICAgIC4uLihPYmplY3Qua2V5cyhzdGF0ZXMpLmxlbmd0aCA/IHsgc3RhdGVzIH0gOiB7fSksXG4gICAgICAgIC4uLih2aWV3SWQgPyB7IHZpZXdJZCwgdmlld0NoYW5nZWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKHRpdGxlcykubGVuZ3RoID8geyB0aXRsZXMgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3VybCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERpc3RpbmN0IG9wdGlvbnMgZm9yIGEgc2VsZWN0IGZpbHRlciAoZHJpdmVzIG11bHRpc2VsZWN0IGNvbnRyb2xzKS5cbiAgcHVibGljIGZpbHRlck9wdGlvbnMocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH0vb3B0aW9uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ29wdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgc3RhdGVtZW50IGEgY29tcG9uZW50IHJ1bnMsIGZvciB0aGUgU1FMIHRhYi5cbiAgLy9cbiAgLy8gRmV0Y2hlZCByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgY29tcG9uZW50LCBiZWNhdXNlIGEgREVSSVZFRCBjb21wb25lbnQgaGFzXG4gIC8vIG5vIHN0b3JlZCBTUUwg4oCUIGl0IHN0b3JlcyBhIGRvY3VtZW50LCBhbmQgaXRzIHN0YXRlbWVudCBvbmx5IGV4aXN0cyBvbmNlXG4gIC8vIHRoZSBiYWNrZW5kIGNvbXBpbGVzIHRoYXQgZG9jdW1lbnQuIENvbXBpbGVkIHBlciByZXF1ZXN0LCBmb3IgdGhlIG9uZVxuICAvLyBjb21wb25lbnQgYmVpbmcgbG9va2VkIGF0LCBzbyBvcGVuaW5nIGEgcmVwb3J0IG5ldmVyIHBheXMgZm9yIGl0LlxuICAvL1xuICAvLyBga2V5OiBudWxsYCBiZWNhdXNlIHRoZSB3aG9sZSBlbnZlbG9wZSBpcyB0aGUgYW5zd2VyIGhlcmU6IGEgc3RhbGUgZG9jdW1lbnRcbiAgLy8gY29tZXMgYmFjayBhcyB7IHNxbDogbnVsbCwgZXJyb3IsIGVycm9yVHlwZSB9IGFuZCB1bndyYXBwaW5nIG9uZSBmaWVsZFxuICAvLyB3b3VsZCB0aHJvdyB0aGUgZGlhZ25vc2lzIGF3YXkuXG4gIHB1YmxpYyBjb21wb25lbnRTcWwoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydENvbXBvbmVudFNxbD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9zcWxgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjb21wb25lbnQgU1FMJ3MgZmlsdGVyYWJsZSBvdXRwdXQgY29sdW1ucyDigJQgZHJpdmVzIHRoZSBjb2x1bW4gcGlja2VyXG4gIC8vIGluIHRoZSBmaWx0ZXIgVUkgc28gYSBjb2x1bW4gbmFtZSBpcyBuZXZlciB0eXBlZCBieSBoYW5kLlxuICBwdWJsaWMgY29tcG9uZW50Q29sdW1ucyhyZXBvcnRJZDogbnVtYmVyLCBjb21wb25lbnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9jb2x1bW5zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29sdW1ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2Ugb25lIGNvbHVtbiBmaWx0ZXJhYmxlLiBgbGV2ZWxgIChjb21wb25lbnQgfCByZXBvcnQpIHBsYWNlcyBhIG5ld1xuICAvLyBncm91cDsgYGdyb3VwSWRgIGluc3RlYWQgbGlua3MgaW50byBhbiBleGlzdGluZyBncm91cC4gQSBzZWxlY3QgZmlsdGVyJ3NcbiAgLy8gb3B0aW9ucyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQgU1FMIHdoZW4gb3B0aW9uc1NxbCBpcyBvbWl0dGVkLlxuICBwdWJsaWMgYWRkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXI6IHsgZmlsdGVyQ29sdW1uOiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyBsZXZlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZ3JvdXBJZD86IG51bWJlciB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2ZpbHRlcnNgKSxcbiAgICAgIGZpbHRlcixcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIOKAlCBhbnkgc3Vic2V0IG9mIHsgbGFiZWwsIG9wdGlvbnNTcWwsIGVuYWJsZWQgfS5cbiAgcHVibGljIHVwZGF0ZUZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcklkOiBudW1iZXIsXG4gICAgY2hhbmdlczogeyBsYWJlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZW5hYmxlZD86IGJvb2xlYW4gfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW1vdmUgYSBmaWx0ZXIgKGl0cyBncm91cCBnb2VzIHRvbyB3aGVuIG5vdGhpbmcgZWxzZSB1c2VzIGl0KS5cbiAgcHVibGljIGRlbGV0ZUZpbHRlcihyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBnbG9iYWwgQUkga25vd2xlZGdlIGRvY3VtZW50IChvcGVyYXRvci1hdXRob3JlZCBhZ2VudCBpbnN0cnVjdGlvbnMpXG4gIC8vIGFuZCBpdHMgZnVsbCB2ZXJzaW9uIGhpc3Rvcnk6IHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9LlxuICBwdWJsaWMgaW5zdHJ1Y3Rpb25zKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgKGFwcGVuZC1vbmx5OyBhbiB1bmNoYW5nZWQgc2F2ZSBpcyBhXG4gIC8vIG5vLW9wIHNlcnZlci1zaWRlKS4gUmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0gc2hhcGUuXG4gIHB1YmxpYyBzYXZlSW5zdHJ1Y3Rpb25zKGNvbnRlbnQ6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAgeyBjb250ZW50IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IGN1cnJlbnQgKG5vIG5ldyByb3cgaXMgY3JlYXRlZCkuXG4gIHB1YmxpYyByZXN0b3JlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25JZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGluc3RydWN0aW9ucy8ke2luc3RydWN0aW9uSWR9L3Jlc3RvcmVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1biBhIHNlbWFudGljLWRhdGFiYXNlIGJ1aWxkLCBzdHJlYW1lZDogZW1pdHMgYW4gZXZlbnQgcGVyIE5ESlNPTiBmcmFtZVxuICAvLyAoeyBraW5kOiAnbG9nJywgbGluZSwgcGVyY2VudCB9IGZlZWQgbGluZXMgYW5kIHsga2luZDogJ3NlY3Rpb24nIH0gcGhhc2VcbiAgLy8gbWFya2VycykgYW5kIGNvbXBsZXRlcyB3aGVuIHRoZSBidWlsZCBlbmRzLiBGZWVkIHRoZSBsaW5lcyBpbnRvIEZzUHJvY2Vzcy5cbiAgcHVibGljIHNlbWFudGljQnVpbGQoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuc3RyZWFtKFxuICAgICAgJ1BPU1QnLFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHsgc3RyZWFtOiB0cnVlIH0sXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIC8vIExhdGVzdCBidWlsZCBzdGF0dXMgKyBlbnRpdHkgc2NvcmVib2FyZDogeyBidWlsZCwgZGV0YWlsIH0uXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RhdHVzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU3RvcCB0aGUgcnVubmluZyBidWlsZCAodGhlIGN1cnJlbnQgc2VtYW50aWMgZGF0YWJhc2Ugc3RheXMgaW4gcGxhY2UpLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0b3AoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZC9zdG9wJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYnVpbGQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgZW50aXR5J3MgY2FjaGVkIEFJLWNsYXNzaWZpZWQgY29kZSBmdW5jdGlvbnMg4oCUIGxvYWRlZCBvbiBleHBhbmQsIG9uZVxuICAvLyBlbnRpdHkgYXQgYSB0aW1lLCBiZWNhdXNlIHRoZSBmdWxsIHNldCBhY3Jvc3MgYWxsIGVudGl0aWVzIGlzIGZhciB0b28gYmlnXG4gIC8vIHRvIHNoaXAgaW5zaWRlIHRoZSBzY29yZWJvYXJkIGNhbGwuXG4gIHB1YmxpYyBzZW1hbnRpY0VudGl0eUZ1bmN0aW9ucyhlbnRpdHk6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYHNlbWFudGljL2VudGl0aWVzLyR7ZW50aXR5fS9mdW5jdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdlbnRpdHlGdW5jdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0IG1vZHVsZSdzIEdlbmVyYWwgc2V0dGluZ3MgKHNlbWFudGljLWJ1aWxkIGNvbmN1cnJlbmN5ICsgaXRzIGJvdW5kcykuXG4gIHB1YmxpYyBzZXR0aW5ncyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBsb2NhbGVzIGFuZCBjdXJyZW5jaWVzIGEgcmVwb3J0IGNhbiBiZSB3cml0dGVuIGluLCBmb3IgdGhlIHJlcG9ydFxuICAvLyBzZXR0aW5ncycgTG9jYWxlIGFuZCBDdXJyZW5jeSBzZWxlY3RzOiB0aGUgZGVmYXVsdCBsb2NhbGUsIGVhY2ggb2ZmZXJlZFxuICAvLyBsb2NhbGUgd2l0aCB0aGUgY3VycmVuY3kgYSByZXBvcnQgaW4gaXQgdXNlcyB3aGVuIGl0IG5hbWVzIG5vbmUsIGFuZCBldmVyeVxuICAvLyBjdXJyZW5jeSBjb2RlLiBPbmx5IGEgc2VydmVyIHRoYXQgc2VuZHMgZWZmZWN0aXZlTG9jYWxlIGhhcyB0aGlzIHJvdXRlLlxuICBwdWJsaWMgbG9jYWxlcyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0TG9jYWxlcz4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnbG9jYWxlcycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2xvY2FsZXMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTYXZlIHRoZSBHZW5lcmFsIHNldHRpbmdzOyByZXNvbHZlcyB0byB0aGUgc2FtZSB7IHNldHRpbmdzIH0gc2hhcGUuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3Moc2V0dGluZ3M6IHsgc2VtYW50aWNCdWlsZENvbmN1cnJlbmN5OiBudW1iZXIgfSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoJ3NldHRpbmdzJyksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V0dGluZ3MnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBVcGRhdGUgYSBmaWx0ZXIgZ3JvdXAg4oCUIGl0cyBleHBvc3VyZSBsZXZlbCAoJ2NvbXBvbmVudCcgfCAncmVwb3J0JyB8ICdib3RoJyksXG4gIC8vIGl0cyBuYW1lIChhbiBpZGVudGlmaWVyLCB1bmlxdWUgaW4gdGhlIHJlcG9ydDsgdGhlIHNlcnZlciByZWZ1c2VzIG9uZSB0aGF0XG4gIC8vIGJyZWFrcyB0aGUgcnVsZSwgd2l0aCBhIG1lc3NhZ2UgbmFtaW5nIHRoZSBwcm9ibGVtKSwgaXRzIGxhYmVsIChuZXZlclxuICAvLyBjaGFuZ2VzIHRoZSBuYW1lKSBhbmQvb3IgaXRzIGRlZmF1bHQgdmFsdWUgKHRoZSB2YWx1ZSBzZWVkaW5nIHRoZSByZXBvcnRcbiAgLy8gYmFyIG9uIG9wZW4pLiBTZW5kIGBkZWZhdWx0OiBudWxsYCAob3IgYW4gZW1wdHkgZGVmYXVsdCkgdG8gY2xlYXIgaXQuIE9ubHlcbiAgLy8gdGhlIGtleXMgcHJvdmlkZWQgYXJlIGNoYW5nZWQsIGluIHRoZSBvcmRlciBuYW1lLCBsYWJlbCwgbGV2ZWwsIGRlZmF1bHQsXG4gIC8vIHNvIGEgcmVmdXNlZCBuYW1lIGxlYXZlcyB0aGUgcmVzdCB1bndyaXR0ZW4uXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXJHcm91cChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGdyb3VwSWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVyZ3JvdXBzLyR7Z3JvdXBJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlckdyb3VwJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQSBzZWxlY3QgZmlsdGVyJ3Mgb3B0aW9ucyBuYXJyb3dlZCBieSB0aGUgb3RoZXIgZW50cmllcyBvZiBpdHMgdGlsZVxuICAvLyAoUmVwb3J0RmlsdGVyT3B0aW9uc1JlcXVlc3QpLCB3aXRoIHRoZSBwaWNrcyBpdCBuYW1lcyBsYWJlbGVkLiBPbmx5IGZvclxuICAvLyBhIHJlcG9ydCB3aG9zZSBzZXJ2ZXIgbGlzdHMgY2FzY2FkaW5nT3B0aW9uczsgYW55IG90aGVyIHJlYWRzIHRoZSBmdWxsXG4gIC8vIGxpc3QgdGhyb3VnaCBmaWx0ZXJPcHRpb25zKCkuXG4gIHB1YmxpYyBmaWx0ZXJPcHRpb25zTmFycm93ZWQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJJZDogbnVtYmVyLFxuICAgIGJvZHk6IFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9L29wdGlvbnNgKSxcbiAgICAgIGJvZHksXG4gICAgICB7XG4gICAgICAgIGtleTogJ29wdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3Mgc2F2ZWQgdmlld3MgdGhlIHZpZXdlciBtYXkgc2VlOiBuYW1lcyBhbmQgZmxhZ3MsIHdoZXRoZXIgaXRcbiAgLy8gbWF5IHNoYXJlLCBhbmQgaXRzIG93biBkZWZhdWx0IHZpZXcgaW4gZnVsbC4gTm8gYGtleWA6IHRoZSB3aG9sZSBwYXlsb2FkXG4gIC8vIGlzIHRoZSBhbnN3ZXIsIGFzIHRyZWUoKSByZWFkcyBpdC4gT25seSBmb3IgYSByZXBvcnQgd2hvc2Ugc2VydmVyIGxpc3RzXG4gIC8vICd2aWV3cycgKFJlcG9ydC52aWV3ZXJGZWF0dXJlcykuXG4gIHB1YmxpYyB2aWV3cyhyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0Vmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3ZpZXdzYCksXG4gICAgICB7fSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIHNhdmVkIHZpZXcgd2l0aCBpdHMgY29uZmlnLCBwcnVuZWQgdG8gdGhlIHJlcG9ydCBhcyBpdCBpcyBub3cuXG4gIHB1YmxpYyB2aWV3KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydFZpZXdJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdmlld3MvJHtyZXBvcnRWaWV3SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndmlldycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaWV3KHJlcG9ydElkOiBudW1iZXIsIHZpZXc6IFJlcG9ydFZpZXdDcmVhdGUsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdmlld3NgKSxcbiAgICAgIHZpZXcsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3ZpZXcnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW5hbWVzIGEgdmlldyBvciByZXBsYWNlcyBpdHMgY29uZmlnOyBvbmx5IHRoZSBrZXlzIGdpdmVuIGNoYW5nZS5cbiAgcHVibGljIHVwZGF0ZVZpZXcoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICByZXBvcnRWaWV3SWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiBQYXJ0aWFsPFBpY2s8UmVwb3J0Vmlld0NyZWF0ZSwgJ25hbWUnIHwgJ2NvbmZpZyc+PixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS92aWV3cy8ke3JlcG9ydFZpZXdJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3ZpZXcnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXNvbHZlcyB0byB0aGUgZGVsZXRlZCB2aWV3J3MgaWQgYW5kIGl0cyBzdGF0ZS5cbiAgcHVibGljIGRlbGV0ZVZpZXcocmVwb3J0SWQ6IG51bWJlciwgcmVwb3J0Vmlld0lkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3RGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vdmlld3MvJHtyZXBvcnRWaWV3SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndmlldycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNoYXJlcyBhIHZpZXcgd2l0aCBldmVyeW9uZSB3aG8gbWF5IG9wZW4gdGhlIHJlcG9ydCwgb3Igc3RvcHMgc2hhcmluZyBpdC5cbiAgcHVibGljIHNoYXJlVmlldyhyZXBvcnRJZDogbnVtYmVyLCByZXBvcnRWaWV3SWQ6IG51bWJlciwgc2hhcmVkOiBib29sZWFuLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3ZpZXdzLyR7cmVwb3J0Vmlld0lkfS9zaGFyZWApLFxuICAgICAgeyBzaGFyZWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndmlldycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2VzIGEgdmlldyB0aGUgdmlld2VyJ3MgZGVmYXVsdCwgb3Igc3RvcHMgb3BlbmluZyBpdCBieSBkZWZhdWx0LiBUaGVcbiAgLy8gc2VydmVyIGNsZWFycyB0aGUgdmlld2VyJ3MgcHJldmlvdXMgZGVmYXVsdC5cbiAgcHVibGljIHNldFZpZXdEZWZhdWx0KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcmVwb3J0Vmlld0lkOiBudW1iZXIsXG4gICAgcGVyc29uYWxEZWZhdWx0OiBib29sZWFuLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS92aWV3cy8ke3JlcG9ydFZpZXdJZH0vZGVmYXVsdGApLFxuICAgICAgeyBwZXJzb25hbERlZmF1bHQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndmlldycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIl19
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBb0J2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRzVELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUscUZBQXFGO0FBSXJGLE1BQU0sT0FBTyxVQUFVO0lBQ2IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU3Qiw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQ3ZFLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFFNUIsa0ZBQWtGO0lBQ2xGLGtEQUFrRDtJQUMxQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUU7UUFDdkIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMvRCxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQWEsRUFBRSxFQUFFLFNBQXdCLEVBQUU7UUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEtBQUssRUFDTDtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQ3ZFLElBQUksQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xC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QTl4QlUsVUFBVTs0R0FBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNBcGksIFJlcXVlc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMtcmVxdWVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlZEZpbHRlckNoYW5nZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXItY2hhbmdlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0U2F2ZWRGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zYXZlZC1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgQ29tcG9uZW50RXhwb3J0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudFNxbCxcbiAgUmVwb3J0TG9jYWxlcyxcbiAgUmVwb3J0UGFnZVZhbHVlLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVklFV0VSX0ZFQVRVUkVTIH0gZnJvbSAnLi4vcmVwb3J0LXZpZXdlci1mZWF0dXJlcyc7XG5cblxuLy8gQVBJIGdhdGV3YXkgZm9yIHRoZSBSZXBvcnRzIG1vZHVsZS4gRXZlcnkgZW5kcG9pbnQgaGFuZ3Mgb2ZmIFtiYXNlUGF0aF0sXG4vLyB3aGljaCBkZWZhdWx0cyB0byBcInJlcG9ydHNcIiAodGhlIGZyYW1ld29yayByZXBvcnRzIGJhY2tlbmQgYXQgL2FwaS9yZXBvcnRzKVxuLy8gYW5kIGNhbiBiZSByZXBvaW50ZWQgYnkgdGhlIGhvc3Qgc28gdGhlIHBhY2thZ2Ugc3RheXMgc2VsZi1jb250YWluZWQgYW5kIHBvcnRhYmxlLlxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydERhdGE8VCA9IGFueT4ge1xuICBwcml2YXRlIF9hcGkgPSBpbmplY3QoRnNBcGkpO1xuXG4gIC8vIFRoZSBBUEkgcm9vdCBmb3IgZXZlcnkgcmVwb3J0cyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gdGhlIGZyYW1ld29yayByZXBvcnRzXG4gIC8vIGNvbnRleHQ7IHNldCBpdCBvbmNlIChlLmcuIGZyb20gdGhlIGhvc3QncyByZXBvcnQgcGFnZSkgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgYmFzZVBhdGggPSAncmVwb3J0cyc7XG5cbiAgLy8gQnVpbGQgYW4gZW5kcG9pbnQgcGF0aCB1bmRlciB0aGUgY29uZmlndXJlZCBiYXNlLCBlLmcuIF9wYXRoKCkgPT4gXCJhaS9yZXBvcnRzXCIsXG4gIC8vIF9wYXRoKGAke2lkfS9wYWdlc2ApID0+IFwiYWkvcmVwb3J0cy8xMjMvcGFnZXNcIi5cbiAgcHJpdmF0ZSBfcGF0aChzdWZmaXggPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1ZmZpeCA/IGAke3RoaXMuYmFzZVBhdGh9LyR7c3VmZml4fWAgOiB0aGlzLmJhc2VQYXRoO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydHMocXVlcnk6IGFueSA9IHt9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgcXVlcnksXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydHMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBCb3RoIGhhbHZlcyBvZiB0aGUgbGlzdGluZyDigJQgcmVwb3J0cyBBTkQgdGhlIGZvbGRlcnMgdGhleSBhcmUgZmlsZWQgaW50byDigJRcbiAgLy8gZnJvbSB0aGUgb25lIEdFVC4gTm8gYGtleWAsIGJlY2F1c2UgdGhlIHdob2xlIHBheWxvYWQgaXMgdGhlIGFuc3dlciBoZXJlO1xuICAvLyByZXBvcnRzKCkga2VlcHMgaXRzICdyZXBvcnRzJyBrZXkgZm9yIGNhbGxlcnMgdGhhdCBvbmx5IHdhbnQgdGhlIGZsYXQgbGlzdC5cbiAgcHVibGljIHRyZWUocXVlcnk6IGFueSA9IHt9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0VHJlZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgcXVlcnksXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobmFtZTogc3RyaW5nLCByZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gbnVsbCwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCksXG4gICAgICB7IG5hbWUsIHJlcG9ydEZvbGRlcklkIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEZpbGUgYSByZXBvcnQgdW5kZXIgYSBmb2xkZXIsIG9yIHBhc3MgbnVsbCB0byBtb3ZlIGl0IHRvIHRoZSByb290LiBTZW50XG4gIC8vIGV4cGxpY2l0bHkgKG5ldmVyIG9taXR0ZWQpIHNvIHRoZSBiYWNrZW5kIGNhbiB0ZWxsIFwibW92ZSB0byByb290XCIgZnJvbVxuICAvLyBcImxlYXZlIHRoZSBmb2xkZXIgYWxvbmVcIi5cbiAgcHVibGljIG1vdmVSZXBvcnQocmVwb3J0SWQ6IG51bWJlciwgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRm9sZGVyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gbnVsbCxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnZm9sZGVycycpLFxuICAgICAgeyBuYW1lLCBwYXJlbnRSZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW5hbWUgYW5kL29yIG1vdmUgYSBmb2xkZXIuIE9ubHkgdGhlIGtleXMgcGFzc2VkIGFyZSBhY3RlZCBvbiBzZXJ2ZXItc2lkZSxcbiAgLy8gc28gYSByZW5hbWUgbmV2ZXIgZGlzdHVyYnMgdGhlIHBhcmVudCBhbmQgYSBkcmFnIG5ldmVyIGRpc3R1cmJzIHRoZSBuYW1lLlxuICBwdWJsaWMgdXBkYXRlRm9sZGVyKFxuICAgIHJlcG9ydEZvbGRlcklkOiBudW1iZXIsXG4gICAgZm9sZGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGBmb2xkZXJzLyR7cmVwb3J0Rm9sZGVySWR9YCksXG4gICAgICBmb2xkZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlLCB3aGF0ZXZlciB0aGUgZm9sZGVyIGhvbGRzOiBpdHMgY29udGVudHMgbGVhdmUgdGhlIGxpc3Rpbmcgd2l0aFxuICAvLyBpdCwgYW5kIHVuZGVsZXRlRm9sZGVyKCkgYnJpbmdzIHRoZSBsb3QgYmFjay5cbiAgcHVibGljIGRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgZm9sZGVyIHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSBmb2xkZXJcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBBbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgaXQgaXMgcmVzdG9yZWQgdG9vLCBzb1xuICAvLyBpdCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlRm9sZGVyKHJlcG9ydEZvbGRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfS91bmRlbGV0ZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWUocmVwb3J0SWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgbmFtZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3M6IGFueSBzdWJzZXQgb2YgeyBuYW1lLCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQsIHRpbWV6b25lLFxuICAvLyBsb2NhbGUsIGN1cnJlbmN5LCBzdHlsZXMsIGhlYWRlckZvb3RlciB9IOKAlCBzdHlsZXMgY2FycnkgdGhlXG4gIC8vIHJlcG9ydCdzIHR5cG9ncmFwaGljIGNvbmZpZyAoZS5nLiBoZWFkaW5nIHNpemUpLCBoZWFkZXJGb290ZXIgdGhlXG4gIC8vIGhlYWRlci9mb290ZXIgYmFuZCBkZXB0aHMgaW4gaW5jaGVzLiBUaGUgcGFnZSBzaXplIGlzIGluIGluY2hlcyBhbmRcbiAgLy8gd2lkdGgvaGVpZ2h0IGdvIHRvZ2V0aGVyLiBsb2NhbGUgKGEgQkNQIDQ3IHRhZykgYW5kIGN1cnJlbmN5IChhbiBJU08gNDIxN1xuICAvLyBjb2RlKSBhcmUgZWFjaCBzZW50IG9ubHkgdG8gY2hhbmdlIHRoZW07ICcnIHJldHVybnMgdGhlIHJlcG9ydCB0byB0aGVcbiAgLy8gZGVmYXVsdCwgYW5kIHRoZSBjdXJyZW5jeSBvbmx5IG5hbWVzIHdoYXQgdGhlIGFtb3VudHMgYXJlIGluLlxuICBwdWJsaWMgdXBkYXRlKHJlcG9ydElkOiBudW1iZXIsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQXBwZW5kIGEgYmxhbmsgcGFnZSB0byB0aGUgcmVwb3J0OyByZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UuXG4gIHB1YmxpYyBhZGRQYWdlKHJlcG9ydElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQW55IHN1YnNldCBvZiB7IG5hbWUsIG1hc3RlckhpZGRlbiB9LiBBbiBlbXB0eSBuYW1lIGlzIHN0b3JlZCBhcyBudWxsXG4gIC8vIHNlcnZlci1zaWRlLCB3aGljaCBwdXRzIHRoZSB0YWIgYmFjayBvbiBpdHMgcG9zaXRpb25hbCBcIlBhZ2UgTlwiIGxhYmVsO1xuICAvLyBtYXN0ZXJIaWRkZW4gaGlkZXMgdGhlIHJlcG9ydCdzIGhlYWRlciBhbmQgZm9vdGVyIG9uIHRoaXMgcGFnZS5cbiAgcHVibGljIHVwZGF0ZVBhZ2UoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBwYWdlSWQ6IG51bWJlcixcbiAgICBwYWdlOiB7IG5hbWU/OiBzdHJpbmc7IG1hc3RlckhpZGRlbj86IGJvb2xlYW4gfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy8ke3BhZ2VJZH1gKSxcbiAgICAgIHBhZ2UsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEZWxldGUgYSBwYWdlIGFuZCBldmVyeXRoaW5nIG9uIGl0LiBSZWZ1c2VkIHNlcnZlci1zaWRlIGZvciB0aGUgbGFzdFxuICAvLyByZW1haW5pbmcgcGFnZSDigJQgYSByZXBvcnQgd2l0aCBubyBjYW52YXMgaXMgYSBkZWxldGVkIHJlcG9ydCwgbm90IGEgcGFnZVxuICAvLyBvcGVyYXRpb24uXG4gIHB1YmxpYyBkZWxldGVQYWdlKHJlcG9ydElkOiBudW1iZXIsIHBhZ2VJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgdGhlIHRhYiBvcmRlciBhZnRlciBhIGRyYWcg4oCUIHRoZSB3aG9sZSBsaXN0LCBpbiBpdHMgbmV3IG9yZGVyLCBzb1xuICAvLyB0aGUgc2VxdWVuY2Ugc3RheXMgZ2FwbGVzcyB3aXRob3V0IHRoZSBzZXJ2ZXIgaW5mZXJyaW5nIHRoZSBtb3ZlLlxuICBwdWJsaWMgc2F2ZVBhZ2VQb3NpdGlvbnMoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBwb3NpdGlvbnM6IHsgcGFnZUlkOiBudW1iZXI7IG9yZGVyOiBudW1iZXIgfVtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3M6IGFueSBzdWJzZXQgb2YgeyB0aXRsZSwgcGFkZGluZyB9IOKAlCB0aGUgaHVtYW4tZmFjaW5nXG4gIC8vIGRpYWxvZyBlZGl0cyDigJQgb3IgYSB0ZXh0IGJsb2NrJ3MgeyBodG1sIH0gZnJvbSBpdHMgaW5saW5lIGVkaXRvcjsgZ2VvbWV0cnlcbiAgLy8gKHgveS93L2gpIGlzIHBlcnNpc3RlZCB2aWEgc2F2ZVBvc2l0aW9ucyBmcm9tIHRoZSBjYW52YXMgaW5zdGVhZC5cbiAgcHVibGljIHVwZGF0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc2V0dGluZ3NgKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb21wb25lbnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQbGFjZSBhIHRleHQgYmxvY2sg4oCUIG9uIGEgcGFnZSwgb3IgaW4gdGhlIGhlYWRlci9mb290ZXIgd2hlbiBwYWdlSWQgaXNcbiAgLy8gb21pdHRlZC4gVGhlIG9ubHkgY29tcG9uZW50IHRoZSBVSSBjcmVhdGVzIGl0c2VsZjogY2hhcnRzLCBsaXN0cyBhbmQgS1BJc1xuICAvLyBuZWVkIGEgcXVlcnkgYW5kIGNvbWUgZnJvbSB0aGUgY2hhdC4gUmVzb2x2ZXMgdG8geyBpZCB9LlxuICBwdWJsaWMgYWRkVGV4dChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHRleHQ6IHsgcGFnZUlkPzogbnVtYmVyOyBodG1sPzogc3RyaW5nOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50c2ApLFxuICAgICAgdGV4dCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIG9uZSBjb21wb25lbnQgZnJvbSB0aGUgY2FudmFzLCB0b2dldGhlciB3aXRoIGl0cyBmaWx0ZXJzIGFuZCBhbnlcbiAgLy8gZmlsdGVyIGdyb3VwIHRoZXkgbGVhdmUgZW1wdHkuIFNvZnQgc2VydmVyLXNpZGUsIGJ1dCB0aGVyZSBpcyBubyByZXN0b3JlXG4gIC8vIGFueXdoZXJlIGluIHRoZSBVSSwgc28gdGhlIGRpYWxvZydzIGNvbmZpcm0gcHJlc2VudHMgaXQgYXMgcGVybWFuZW50LlxuICBwdWJsaWMgZGVsZXRlQ29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU29mdC1kZWxldGU6IHRoZSByZXBvcnQgbGVhdmVzIHRoZSBsaXN0aW5nIGJ1dCBrZWVwcyBpdHMgcGFnZXMgYW5kXG4gIC8vIGNvbXBvbmVudHMsIHNvIHVuZGVsZXRlKCkgYnJpbmdzIGJhY2sgdGhlIHNhbWUgZG9jdW1lbnQuXG4gIHB1YmxpYyBkZWxldGUocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCByZXBvcnQgdGhyb3VnaCBpdHMgb3duIGFjdGlvbiBlbmRwb2ludCDigJQgdGhlIHJlcG9ydFxuICAvLyBQVVQgZG9lcyBub3QgYWNjZXB0IGBzdGF0ZWAuIEl0cyBmb2xkZXIgaXMgcmVzdG9yZWQgdG9vIHdoZW4gaXQgaXMgZGVsZXRlZCxcbiAgLy8gb3IgaW5zaWRlIG9uZSB0aGF0IGlzLCBzbyB0aGUgcmVwb3J0IGxhbmRzIGJhY2sgd2hlcmUgaXQgd2FzLlxuICBwdWJsaWMgdW5kZWxldGUocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS91bmRlbGV0ZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBhc3NlbWJsZWQgc3RydWN0dXJlOiBwYWdlcyDihpIgY29tcG9uZW50cyAoKyB0aGVpciBmaWx0ZXJzKSBhbmQgdGhlXG4gIC8vIHJlcG9ydCdzIGZpbHRlciBncm91cHMuIGBmZWF0dXJlc2AgbmFtZXMgd2hhdCB0aGlzIHZpZXdlciBpbXBsZW1lbnRzXG4gIC8vIChWSUVXRVJfRkVBVFVSRVMpLCBzbyB0aGUgc2VydmVyIHNlbmRzIGV2ZXJ5IGdyb3VwIGluIGEgc2hhcGUgdGhlIHZpZXdlclxuICAvLyBjYW4gc2hvdyBhbmQgY2xlYXIuXG4gIHB1YmxpYyBnZXQocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IGZlYXR1cmVzOiBWSUVXRVJfRkVBVFVSRVMuam9pbignLCcpIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBlcnNpc3QgZ2VvbWV0cnkgZm9yIHRoZSBtb3ZlZCBjb21wb25lbnRzIG9ubHkg4oCUIGFueSBzdWJzZXQgb2ZcbiAgLy8geyB4LCB5LCB3LCBoIH0gKGluY2hlcykuXG4gIHB1YmxpYyBzYXZlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiAoeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBQYXJ0aWFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0+KVtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvcG9zaXRpb25zYCksXG4gICAgICB7IHBvc2l0aW9ucyB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBjb21wb25lbnQncyBkYXRhLiBUaGUgYm9keSBjYXJyaWVzIGV2ZXJ5dGhpbmcgc2Vzc2lvbi1zY29wZWQ6IHRoZVxuICAvLyByZXNvbHZlZCBmaWx0ZXIgdmFsdWVzIGFuZCB0aGUgY29tcG9uZW50J3Mgb3duIGludGVyYWN0aW9uIHN0YXRlLlxuICAvL1xuICAvLyBgaXNFeHBvcnRgIG1hcmtzIHRoZSByZWFkIGFzIHBhcnQgb2YgYSBQREYvUG93ZXJQb2ludCByZW5kZXIuIFRoZSBzZXJ2ZXJcbiAgLy8gZ2l2ZXMgdGhvc2UgYSBsb25nZXIgcGVyLXN0YXRlbWVudCBjZWlsaW5nIHRoYW4gYW4gb24tc2NyZWVuIHRpbGUsIGJlY2F1c2VcbiAgLy8gYSByZWFkZXIgd2F0Y2hpbmcgYW4gZXhwb3J0IHByb2dyZXNzIGJhciBjYW4gd2FpdCBmb3IgYSBxdWVyeSBub2JvZHkgd291bGRcbiAgLy8gdG9sZXJhdGUgd2FpdGluZyBmb3Igb24gYSBkYXNoYm9hcmQuXG4gIHB1YmxpYyBjb21wb25lbnREYXRhKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9kYXRhYCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlLCBleHBvcnQ6IGlzRXhwb3J0IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2RhdGEnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbnVtYmVycyBvZiBhIHBhZ2UncyB2YWx1ZXMg4oCUIG9yIHRoZSBtYXN0ZXIncywgZm9yIHRoZSBoZWFkZXIgYW5kXG4gIC8vIGZvb3RlciDigJQgaW4gb25lIHJlcXVlc3Q6IGEgcm93IHBlciB2YWx1ZSB0aGF0IHBhZ2UgcmVhZHMsIHNob3duIGJ5IHNvbWVcbiAgLy8gdGV4dCBvciByZWFkIGJ5IGEgZm9ybXVsYSBpdCBzaG93cyAoUmVwb3J0UGFnZVZhbHVlKS4gYGZpbHRlcnNgIGNhcnJpZXNcbiAgLy8gdGhlIHJlc29sdmVkIHZhbHVlcyBmb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGxheWVyIHRvZ2V0aGVyOyBlYWNoIHZhbHVlIHRoZVxuICAvLyBzZXJ2ZXIgcmVhZHMgcGlja3Mgb3V0IGl0cyBvd24uIGBpc0V4cG9ydGAgaXMgY29tcG9uZW50RGF0YSdzLlxuICAvL1xuICAvLyBUaGUgc2VydmVyIHJlYWRzIG9uZSBzdGF0ZW1lbnQgcGVyIGRpc3RpbmN0IHF1ZXJ5ICh2YWx1ZXMgc2hhcmluZyBhXG4gIC8vIHF1ZXJ5IGFuZCBpdHMgZmlsdGVycyBhcmUgZm9sZGVkIGludG8gb25lOyBhIGZvcm11bGEgcnVucyBub25lKSBhbmQgbWF5XG4gIC8vIHN0cmVhbSBhIGtlZXBBbGl2ZSBwdWxzZSBiZWZvcmUgZWFjaCwgc28gYSBzbG93IHBhZ2UgbmV2ZXIgc2l0cyBzaWxlbnRcbiAgLy8gdW50aWwgdGhlIGNvbm5lY3Rpb24gZHJvcHMuIFRoZSBib2R5IHN0YXlzIG9uZSBKU09OIHdpdGggdGhlIHJvd3MgYXQgZGF0YS52YWx1ZXMsXG4gIC8vIHdoaWNoIEZzQXBpIHJlYWRzIHdpdGggdGhlICd2YWx1ZXMnIGtleSwgYXMgZXhwb3J0Q29tcG9uZW50J3Mgc3RyZWFtZWRcbiAgLy8gcmVzcG9uc2UgaXMgcmVhZC5cbiAgLy9cbiAgLy8gYG1hdGNoQW55R3JvdXBJZHNgIGlzIGEgdGlsZSdzIChDb21wb25lbnREYXRhU3RhdGUpOiB3aGlsZSB0aGUgZ3JvdXBzXG4gIC8vIG1hdGNoICdhbnknLCB0aGUgZ3JvdXBzIHRoYXQgY29tYmluZSAodmFsdWVzTWF0Y2hBbnlHcm91cElkcykuIFNlbnQgb25seVxuICAvLyB3aGVuIGl0IGxpc3RzIGFueTsgdGhlIHNlcnZlciBjaGVja3MgZWFjaCB2YWx1ZSBhZ2FpbnN0IGl0IGFzIGl0IGNoZWNrc1xuICAvLyBhIHRpbGUuXG4gIHB1YmxpYyBwYWdlVmFsdWVzKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgICBtYXRjaEFueUdyb3VwSWRzOiBudW1iZXJbXSA9IFtdLFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFBhZ2VWYWx1ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9L3ZhbHVlc2ApLFxuICAgICAgeyBmaWx0ZXJzLCBleHBvcnQ6IGlzRXhwb3J0LCAuLi4obWF0Y2hBbnlHcm91cElkcy5sZW5ndGggPyB7IG1hdGNoQW55R3JvdXBJZHMgfSA6IHt9KSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd2YWx1ZXMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIG9uZSBjb21wb25lbnQgdG8gQ1NWIHNlcnZlci1zaWRlOiB0aGUgZmlsZSBpcyB3aGF0IHRoZSBzY3JlZW5cbiAgLy8gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIHJlbmRlcmVkLCBhIGxpc3QgaW4gZnVsbCBpbiB0aGUgc2NyZWVuJ3Mgb3JkZXIpLlxuICAvLyBUaGUgYmFja2VuZCBzdHJlYW1zIHBlcmNlbnRhZ2UgcHJvZ3Jlc3Mgd2hpbGUgaXQgd3JpdGVzLlxuICAvL1xuICAvLyBrZXk6IG51bGwgb24gcHVycG9zZSwgdW5saWtlIHRoZSBrZXk6ICd1cmwnIHByZXNpZ25lZC1leHBvcnQgcGF0dGVybjogdGhlXG4gIC8vIHJlc3BvbnNlIGFsc28gY2FycmllcyBgbm90ZXNgLCB0aGUgc2VudGVuY2VzIHNheWluZyBob3cgdGhlIGZpbGUgZmFsbHNcbiAgLy8gc2hvcnQgb2YgdGhlIGZ1bGwgcmVzdWx0LCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gc2hvdyB0aGVtIGJlZm9yZSBpdCBoYW5kc1xuICAvLyB0aGUgdXJsIHRvIEZzUHJvY2Vzcy5kb3dubG9hZC4gYHRpdGxlYCBpcyB0aGUgY29tcG9uZW50J3MgdGl0bGUgYXMgdGhlXG4gIC8vIHZpZXdlciByZWFkcyBpdCwgaXRzIHRva2VucyBmaWxsZWQgKCdTaWduLXVwcyDigJQgU2VwdGVtYmVyIDIwMjYnKSwgd2hpY2hcbiAgLy8gdGhlIHNlcnZlciBuYW1lcyB0aGUgZmlsZSBhZnRlci5cbiAgcHVibGljIGV4cG9ydENvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIHRpdGxlID0gJycsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8Q29tcG9uZW50RXhwb3J0UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2V4cG9ydGApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgdGl0bGUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnRzIEVWRVJZIGNvbXBvbmVudCBvbiB0aGUgcmVwb3J0IOKAlCBvciBvbiBvbmUgcGFnZSDigJQgc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIFVSTCBmb3IgYSB6aXAgb2Ygb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZCBieVxuICAvLyBwYWdlLCBwbHVzIGFuICdFeHBvcnQgTm90ZXMudHh0Jy4gYGZpbHRlcnNgIGNhcnJpZXMgdGhlIHJlc29sdmVkIHZhbHVlcyBmb3JcbiAgLy8gZXZlcnkgY29tcG9uZW50IHRvZ2V0aGVyOyBlYWNoIG9uZSBwaWNrcyBvdXQgaXRzIG93bi4gYGZyZXF1ZW5jeWAgaXMgdGhlXG4gIC8vIHJlcG9ydCdzIGdyb3VwLWJ5IGdyYWluICh0aGUgc2VydmVyIHJlLWJ1Y2tldHMgb25seSB0aW1lLXNlcmllcyBjaGFydHMgdG9cbiAgLy8gaXQpLCBhbmQgYGZpbHRlckxpbmVzYCBpcyB0aGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0XG4gIC8vIChleHBvcnRMaW5lcyksIHdoaWNoIHRoZSBub3RlcyBmaWxlIHdyaXRlcy4gVGhlaXIgdGV4dCBnb2VzIGFzXG4gIC8vIGZpbHRlclN1bW1hcnkgdG9vLCBmb3IgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGZpbHRlckxpbmVzOyB0aGVcbiAgLy8gbGluZXMgYXJlIGxlZnQgb3V0IHdoZW4gdGhlcmUgYXJlIG5vbmUuIGBzdGF0ZXNgIGlzIGVhY2ggdGlsZSdzIG93blxuICAvLyBzdGF0ZSBieSBjb21wb25lbnQgaWQgKHppcEV4cG9ydFN0YXRlcyksIHNvIGVhY2ggZmlsZSBob2xkcyB3aGF0IGl0c1xuICAvLyB0aWxlIHNob3dzOyBpdCBpcyBsZWZ0IG91dCB3aGVuIG5vIHRpbGUgaGFzIGFueS4gYHRpdGxlc2AgaG9sZHMgZWFjaCBjb21wb25lbnQncyB0aXRsZSBhcyB0aGUgdmlld2VyIHJlYWRzIGl0LCBpdHMgdG9rZW5zXG4gIC8vIGZpbGxlZCwgYnkgY29tcG9uZW50IGlkLCB3aGljaCB0aGUgc2VydmVyIG5hbWVzIHRoZSBjb21wb25lbnQncyBmaWxlXG4gIC8vIGFmdGVyOyBsZWZ0IG91dCB3aGVuIHRoZXJlIGFyZSBub25lLiBTYW1lIGtlZXAtYWxpdmUgY29udHJhY3QgYXNcbiAgLy8gZXhwb3J0Q29tcG9uZW50LCBvdmVyIGEgbG9uZ2VyIHJ1bjsgY29uc3VtZSB0aHJvdWdoIEZzUHJvY2Vzcy5kb3dubG9hZC5cbiAgcHVibGljIGV4cG9ydFJlcG9ydChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwsXG4gICAgZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGwsXG4gICAgZmlsdGVyTGluZXM6IFJlcG9ydEV4cG9ydExpbmVbXSA9IFtdLFxuICAgIHN0YXRlczogUmVjb3JkPG51bWJlciwgQ29tcG9uZW50RGF0YVN0YXRlPiA9IHt9LFxuICAgIHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHt9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9leHBvcnRgKSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgLi4uKHBhZ2VJZCA/IHsgcGFnZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pLFxuICAgICAgICBmaWx0ZXJTdW1tYXJ5OiBmaWx0ZXJMaW5lcy5tYXAoKGxpbmUpID0+IGxpbmUudGV4dCksXG4gICAgICAgIC4uLihmaWx0ZXJMaW5lcy5sZW5ndGggPyB7IGZpbHRlckxpbmVzIH0gOiB7fSksXG4gICAgICAgIC4uLihPYmplY3Qua2V5cyhzdGF0ZXMpLmxlbmd0aCA/IHsgc3RhdGVzIH0gOiB7fSksXG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0aXRsZXMpLmxlbmd0aCA/IHsgdGl0bGVzIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICd1cmwnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEaXN0aW5jdCBvcHRpb25zIGZvciBhIHNlbGVjdCBmaWx0ZXIgKGRyaXZlcyBtdWx0aXNlbGVjdCBjb250cm9scykuXG4gIHB1YmxpYyBmaWx0ZXJPcHRpb25zKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9L29wdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHN0YXRlbWVudCBhIGNvbXBvbmVudCBydW5zLCBmb3IgdGhlIFNRTCB0YWIuXG4gIC8vXG4gIC8vIEZldGNoZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIGNvbXBvbmVudCwgYmVjYXVzZSBhIERFUklWRUQgY29tcG9uZW50IGhhc1xuICAvLyBubyBzdG9yZWQgU1FMIOKAlCBpdCBzdG9yZXMgYSBkb2N1bWVudCwgYW5kIGl0cyBzdGF0ZW1lbnQgb25seSBleGlzdHMgb25jZVxuICAvLyB0aGUgYmFja2VuZCBjb21waWxlcyB0aGF0IGRvY3VtZW50LiBDb21waWxlZCBwZXIgcmVxdWVzdCwgZm9yIHRoZSBvbmVcbiAgLy8gY29tcG9uZW50IGJlaW5nIGxvb2tlZCBhdCwgc28gb3BlbmluZyBhIHJlcG9ydCBuZXZlciBwYXlzIGZvciBpdC5cbiAgLy9cbiAgLy8gYGtleTogbnVsbGAgYmVjYXVzZSB0aGUgd2hvbGUgZW52ZWxvcGUgaXMgdGhlIGFuc3dlciBoZXJlOiBhIHN0YWxlIGRvY3VtZW50XG4gIC8vIGNvbWVzIGJhY2sgYXMgeyBzcWw6IG51bGwsIGVycm9yLCBlcnJvclR5cGUgfSBhbmQgdW53cmFwcGluZyBvbmUgZmllbGRcbiAgLy8gd291bGQgdGhyb3cgdGhlIGRpYWdub3NpcyBhd2F5LlxuICBwdWJsaWMgY29tcG9uZW50U3FsKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRDb21wb25lbnRTcWw+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc3FsYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgY29tcG9uZW50IFNRTCdzIGZpbHRlcmFibGUgb3V0cHV0IGNvbHVtbnMg4oCUIGRyaXZlcyB0aGUgY29sdW1uIHBpY2tlclxuICAvLyBpbiB0aGUgZmlsdGVyIFVJIHNvIGEgY29sdW1uIG5hbWUgaXMgbmV2ZXIgdHlwZWQgYnkgaGFuZC5cbiAgcHVibGljIGNvbXBvbmVudENvbHVtbnMocmVwb3J0SWQ6IG51bWJlciwgY29tcG9uZW50SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vY29sdW1uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbHVtbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIG9uZSBjb2x1bW4gZmlsdGVyYWJsZS4gYGxldmVsYCAoY29tcG9uZW50IHwgcmVwb3J0KSBwbGFjZXMgYSBuZXdcbiAgLy8gZ3JvdXA7IGBncm91cElkYCBpbnN0ZWFkIGxpbmtzIGludG8gYW4gZXhpc3RpbmcgZ3JvdXAuIEEgc2VsZWN0IGZpbHRlcidzXG4gIC8vIG9wdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50IFNRTCB3aGVuIG9wdGlvbnNTcWwgaXMgb21pdHRlZC5cbiAgcHVibGljIGFkZEZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyOiB7IGZpbHRlckNvbHVtbjogc3RyaW5nOyB0eXBlPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgbGV2ZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGdyb3VwSWQ/OiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9maWx0ZXJzYCksXG4gICAgICBmaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciDigJQgYW55IHN1YnNldCBvZiB7IGxhYmVsLCBvcHRpb25zU3FsLCBlbmFibGVkIH0uXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGFiZWw/OiBzdHJpbmc7IG9wdGlvbnNTcWw/OiBzdHJpbmc7IGVuYWJsZWQ/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVtb3ZlIGEgZmlsdGVyIChpdHMgZ3JvdXAgZ29lcyB0b28gd2hlbiBub3RoaW5nIGVsc2UgdXNlcyBpdCkuXG4gIHB1YmxpYyBkZWxldGVGaWx0ZXIocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCAob3BlcmF0b3ItYXV0aG9yZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zKVxuICAvLyBhbmQgaXRzIGZ1bGwgdmVyc2lvbiBoaXN0b3J5OiB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfS5cbiAgcHVibGljIGluc3RydWN0aW9ucyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTYXZlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IChhcHBlbmQtb25seTsgYW4gdW5jaGFuZ2VkIHNhdmUgaXMgYVxuICAvLyBuby1vcCBzZXJ2ZXItc2lkZSkuIFJlc29sdmVzIHRvIHRoZSBzYW1lIHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZUluc3RydWN0aW9ucyhjb250ZW50OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHsgY29udGVudCB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2UgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBjdXJyZW50IChubyBuZXcgcm93IGlzIGNyZWF0ZWQpLlxuICBwdWJsaWMgcmVzdG9yZUluc3RydWN0aW9uKGluc3RydWN0aW9uSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGBpbnN0cnVjdGlvbnMvJHtpbnN0cnVjdGlvbklkfS9yZXN0b3JlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSdW4gYSBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZCwgc3RyZWFtZWQ6IGVtaXRzIGFuIGV2ZW50IHBlciBOREpTT04gZnJhbWVcbiAgLy8gKHsga2luZDogJ2xvZycsIGxpbmUsIHBlcmNlbnQgfSBmZWVkIGxpbmVzIGFuZCB7IGtpbmQ6ICdzZWN0aW9uJyB9IHBoYXNlXG4gIC8vIG1hcmtlcnMpIGFuZCBjb21wbGV0ZXMgd2hlbiB0aGUgYnVpbGQgZW5kcy4gRmVlZCB0aGUgbGluZXMgaW50byBGc1Byb2Nlc3MuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnN0cmVhbShcbiAgICAgICdQT1NUJyxcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7IHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICAvLyBMYXRlc3QgYnVpbGQgc3RhdHVzICsgZW50aXR5IHNjb3JlYm9hcmQ6IHsgYnVpbGQsIGRldGFpbCB9LlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0YXR1cyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN0b3AgdGhlIHJ1bm5pbmcgYnVpbGQgKHRoZSBjdXJyZW50IHNlbWFudGljIGRhdGFiYXNlIHN0YXlzIGluIHBsYWNlKS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdG9wKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQvc3RvcCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2J1aWxkJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGVudGl0eSdzIGNhY2hlZCBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb25zIOKAlCBsb2FkZWQgb24gZXhwYW5kLCBvbmVcbiAgLy8gZW50aXR5IGF0IGEgdGltZSwgYmVjYXVzZSB0aGUgZnVsbCBzZXQgYWNyb3NzIGFsbCBlbnRpdGllcyBpcyBmYXIgdG9vIGJpZ1xuICAvLyB0byBzaGlwIGluc2lkZSB0aGUgc2NvcmVib2FyZCBjYWxsLlxuICBwdWJsaWMgc2VtYW50aWNFbnRpdHlGdW5jdGlvbnMoZW50aXR5OiBzdHJpbmcsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGBzZW1hbnRpYy9lbnRpdGllcy8ke2VudGl0eX0vZnVuY3Rpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZW50aXR5RnVuY3Rpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCBtb2R1bGUncyBHZW5lcmFsIHNldHRpbmdzIChzZW1hbnRpYy1idWlsZCBjb25jdXJyZW5jeSArIGl0cyBib3VuZHMpLlxuICBwdWJsaWMgc2V0dGluZ3MoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NldHRpbmdzJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2V0dGluZ3MnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgbG9jYWxlcyBhbmQgY3VycmVuY2llcyBhIHJlcG9ydCBjYW4gYmUgd3JpdHRlbiBpbiwgZm9yIHRoZSByZXBvcnRcbiAgLy8gc2V0dGluZ3MnIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0czogdGhlIGRlZmF1bHQgbG9jYWxlLCBlYWNoIG9mZmVyZWRcbiAgLy8gbG9jYWxlIHdpdGggdGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIGl0IHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLCBhbmQgZXZlcnlcbiAgLy8gY3VycmVuY3kgY29kZS4gT25seSBhIHNlcnZlciB0aGF0IHNlbmRzIGVmZmVjdGl2ZUxvY2FsZSBoYXMgdGhpcyByb3V0ZS5cbiAgcHVibGljIGxvY2FsZXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydExvY2FsZXM+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2xvY2FsZXMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdsb2NhbGVzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpLFxuICAvLyBpdHMgbmFtZSAoYW4gaWRlbnRpZmllciwgdW5pcXVlIGluIHRoZSByZXBvcnQ7IHRoZSBzZXJ2ZXIgcmVmdXNlcyBvbmUgdGhhdFxuICAvLyBicmVha3MgdGhlIHJ1bGUsIHdpdGggYSBtZXNzYWdlIG5hbWluZyB0aGUgcHJvYmxlbSksIGl0cyBsYWJlbCAobmV2ZXJcbiAgLy8gY2hhbmdlcyB0aGUgbmFtZSkgYW5kL29yIGl0cyBkZWZhdWx0IHZhbHVlICh0aGUgdmFsdWUgc2VlZGluZyB0aGUgcmVwb3J0XG4gIC8vIGJhciBvbiBvcGVuKS4gU2VuZCBgZGVmYXVsdDogbnVsbGAgKG9yIGFuIGVtcHR5IGRlZmF1bHQpIHRvIGNsZWFyIGl0LiBPbmx5XG4gIC8vIHRoZSBrZXlzIHByb3ZpZGVkIGFyZSBjaGFuZ2VkLCBpbiB0aGUgb3JkZXIgbmFtZSwgbGFiZWwsIGxldmVsLCBkZWZhdWx0LFxuICAvLyBzbyBhIHJlZnVzZWQgbmFtZSBsZWF2ZXMgdGhlIHJlc3QgdW53cml0dGVuLlxuICBwdWJsaWMgdXBkYXRlRmlsdGVyR3JvdXAoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBncm91cElkOiBudW1iZXIsXG4gICAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcmdyb3Vwcy8ke2dyb3VwSWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXJHcm91cCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEEgc2VsZWN0IGZpbHRlcidzIG9wdGlvbnMgbmFycm93ZWQgYnkgdGhlIG90aGVyIGVudHJpZXMgb2YgaXRzIHRpbGVcbiAgLy8gKFJlcG9ydEZpbHRlck9wdGlvbnNSZXF1ZXN0KSwgd2l0aCB0aGUgcGlja3MgaXQgbmFtZXMgbGFiZWxlZC4gT25seSBmb3JcbiAgLy8gYSByZXBvcnQgd2hvc2Ugc2VydmVyIGxpc3RzIGNhc2NhZGluZ09wdGlvbnM7IGFueSBvdGhlciByZWFkcyB0aGUgZnVsbFxuICAvLyBsaXN0IHRocm91Z2ggZmlsdGVyT3B0aW9ucygpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9uc05hcnJvd2VkKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVySWQ6IG51bWJlcixcbiAgICBib2R5OiBSZXBvcnRGaWx0ZXJPcHRpb25zUmVxdWVzdCxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICBib2R5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHNhdmVkIGZpbHRlcnMsIGluIHRoZWlyIG9yZGVyLiBTaGFyZWQgYnkgZXZlcnlvbmUgd2hvIG1heVxuICAvLyBvcGVuIHRoZSByZXBvcnQuXG4gIHB1YmxpYyBzYXZlZEZpbHRlcnMocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFNhdmVkRmlsdGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3NhdmVkZmlsdGVyc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVycycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEEgbmV3IHNhdmVkIGZpbHRlcjogaXRzIG5hbWUgYW5kIHRoZSByZXBvcnQtd2lkZSBmaWx0ZXIgdmFsdWVzIGl0IGhvbGRzLlxuICBwdWJsaWMgY3JlYXRlU2F2ZWRGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBzYXZlZEZpbHRlcjogUmVxdWlyZWQ8UmVwb3J0U2F2ZWRGaWx0ZXJDaGFuZ2VzPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3NhdmVkZmlsdGVyc2ApLFxuICAgICAgc2F2ZWRGaWx0ZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lcyBhIHNhdmVkIGZpbHRlciBvciByZXBsYWNlcyBpdHMgdmFsdWVzOyBvbmx5IHRoZSBrZXlzIGdpdmVuIGNoYW5nZS5cbiAgcHVibGljIHVwZGF0ZVNhdmVkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcmVwb3J0U2F2ZWRGaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IFJlcG9ydFNhdmVkRmlsdGVyQ2hhbmdlcyxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vc2F2ZWRmaWx0ZXJzLyR7cmVwb3J0U2F2ZWRGaWx0ZXJJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVNhdmVkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcmVwb3J0U2F2ZWRGaWx0ZXJJZDogbnVtYmVyLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydFNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnMvJHtyZXBvcnRTYXZlZEZpbHRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGVyc2lzdCB0aGUgc2F2ZWQgZmlsdGVycycgb3JkZXIgYWZ0ZXIgYSBkcmFnOiBldmVyeSBpZCwgaW4gaXRzIG5ld1xuICAvLyBvcmRlci4gUmVzb2x2ZXMgdG8gdGhlIGxpc3QgaW4gdGhhdCBvcmRlci5cbiAgcHVibGljIHNhdmVTYXZlZEZpbHRlclBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHJlcG9ydFNhdmVkRmlsdGVySWRzOiBudW1iZXJbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSZXBvcnRTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9zYXZlZGZpbHRlcnMvcG9zaXRpb25zYCksXG4gICAgICB7IHJlcG9ydFNhdmVkRmlsdGVySWRzIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NhdmVkRmlsdGVycycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIl19