@firestitch/report 18.0.18 → 18.0.20

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 (28) hide show
  1. package/app/reports/data/report.data.d.ts +8 -2
  2. package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +5 -3
  3. package/app/reports/export/report-export-collector.service.d.ts +1 -0
  4. package/app/reports/format.d.ts +1 -1
  5. package/app/reports/interfaces/report.interface.d.ts +27 -0
  6. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  7. package/app/reports/views/report/fs-ai-report.component.d.ts +2 -0
  8. package/app/reports/views/report/report.component.d.ts +2 -0
  9. package/app/reports/views/reports/fs-ai-reports.component.d.ts +28 -8
  10. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +2 -2
  11. package/esm2022/app/reports/data/report.data.mjs +51 -3
  12. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +11 -6
  13. package/esm2022/app/reports/export/report-export-collector.service.mjs +31 -11
  14. package/esm2022/app/reports/export/report-pdf.service.mjs +2 -2
  15. package/esm2022/app/reports/export/report-pptx.service.mjs +2 -2
  16. package/esm2022/app/reports/format.mjs +21 -6
  17. package/esm2022/app/reports/interfaces/report.interface.mjs +12 -1
  18. package/esm2022/app/reports/services/report-filter-state.service.mjs +28 -2
  19. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +22 -3
  20. package/esm2022/app/reports/views/report/report.component.mjs +22 -3
  21. package/esm2022/app/reports/views/reports/fs-ai-reports.component.mjs +342 -74
  22. package/fesm2022/{firestitch-report-echarts-CMOBB-Er.mjs → firestitch-report-echarts-D4VLD05J.mjs} +2 -2
  23. package/fesm2022/{firestitch-report-echarts-CMOBB-Er.mjs.map → firestitch-report-echarts-D4VLD05J.mjs.map} +1 -1
  24. package/fesm2022/{firestitch-report-firestitch-report-DwgbMhwr.mjs → firestitch-report-firestitch-report-D5cx4IJg.mjs} +535 -108
  25. package/fesm2022/firestitch-report-firestitch-report-D5cx4IJg.mjs.map +1 -0
  26. package/fesm2022/firestitch-report.mjs +1 -1
  27. package/package.json +1 -1
  28. package/fesm2022/firestitch-report-firestitch-report-DwgbMhwr.mjs.map +0 -1
@@ -42,6 +42,10 @@ export class SemanticDatabaseComponent {
42
42
  K: 'Stopped',
43
43
  F: 'Failed',
44
44
  };
45
+ // The streamed frames that carry a line for the feed: progress, and the final
46
+ // frame the backend sends when a run ends badly. Without the error kind the
47
+ // feed stops on the last progress line and never says what went wrong.
48
+ static LOG_KINDS = ['log', 'error'];
45
49
  // A row that is still owed content says so; a built one says nothing. On a
46
50
  // finished build every stage is done on every row, so chipping them all was
47
51
  // noise that buried the one row that mattered.
@@ -181,7 +185,7 @@ export class SemanticDatabaseComponent {
181
185
  // A hard stream/transport failure (the build couldn't even start)
182
186
  // finalizes here — completed$ won't fire in that case.
183
187
  tap({ error: (error) => this._finalizeBuild(error) }), filter((event) => event?.type === StreamEventType.Data
184
- && event.data?.kind === 'log'
188
+ && SemanticDatabaseComponent.LOG_KINDS.includes(event.data?.kind)
185
189
  && typeof event.data.line === 'string'), map((event) => event.data.line));
186
190
  this._process
187
191
  .run('Semantic database build', target$)
@@ -193,9 +197,10 @@ export class SemanticDatabaseComponent {
193
197
  * Wrap up one build run exactly once. On a hard stream error, surface the
194
198
  * actual server-side reason pulled off the broken stream — the generic
195
199
  * "could not run" line only when the failure carried no server text at all;
196
- * otherwise refresh the status and announce how the build actually ended — a
197
- * build that failed (e.g. the AI couldn't be reached) reports 'Failed' with
198
- * a reason, and that must surface instead of the run silently doing nothing.
200
+ * otherwise refresh the status and announce how the build actually ended. A
201
+ * failed build always names its reason on the row (the backend records one for
202
+ * every way a run can die, fatals included), and that reason must surface
203
+ * instead of the run silently doing nothing.
199
204
  */
200
205
  _finalizeBuild(streamError) {
201
206
  if (this._buildFinalized) {
@@ -207,7 +212,7 @@ export class SemanticDatabaseComponent {
207
212
  const detail = this._streamErrorDetail(streamError);
208
213
  this._message.error(detail
209
214
  ? `The semantic database build failed — ${detail}`
210
- : 'The semantic database build could not run — check the AI connection and try again.');
215
+ : 'The semantic database build could not run — the connection to the server was lost.');
211
216
  this._refreshStatus();
212
217
  return;
213
218
  }
@@ -333,4 +338,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
333
338
  FsSkeletonModule,
334
339
  ], template: "<div class=\"fs-column tab-body\">\n <p class=\"hint\">\n The semantic database is what the report AI uses to understand your data \u2014\n tables, relationships and the calculations in code. Rebuild it after\n significant application updates. The build runs in the background; progress\n appears in the dock at the bottom right and this dialog can be closed while\n it runs.\n </p>\n\n <div *fsSkeleton=\"status()\">\n @if (status(); as buildStatus) {\n <div class=\"build-status\">\n @if (buildStatus.detail.generatedAt) {\n <div class=\"stat\">\n <span class=\"label\">Last built</span>\n <fs-date\n [date]=\"buildStatus.detail.generatedAt\"\n format=\"date-time\">\n </fs-date>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Coverage</span>\n <span>{{ coverage() }}</span>\n </div>\n } @else {\n <fs-message-warning>\n The semantic database has not been built yet \u2014 the report AI can't\n answer data questions until it is. Run the first build.\n </fs-message-warning>\n }\n @if (buildStatus.build) {\n <div class=\"stat\">\n <span class=\"label\">Last build run</span>\n <span>\n {{ buildStateLabel() }}\n @if (buildStatus.build.message) {\n \u2014 {{ buildStatus.build.message }}\n }\n </span>\n </div>\n }\n </div>\n\n <!-- Everything the build read, in one list: entities (a table + a model +\n a handler) and standalone code classes (domain logic with no table).\n The AI reads code from both, so splitting them into two sections\n would hide half of what was built. Each row drills into its shape,\n enum values, computed fields and cached function counts \u2014 the counts\n link into the functions dialog. -->\n @if (units().length) {\n <h2>Included ({{ units().length }})</h2>\n <div class=\"subheading\">\n Everything the report AI was built from. Entities can be queried;\n code classes are logic it reads and translates into SQL.\n </div>\n\n <input\n class=\"unit-filter\"\n type=\"search\"\n placeholder=\"Filter by name, class or key\u2026\"\n [value]=\"filter()\"\n (input)=\"setFilter($any($event.target).value)\">\n\n <mat-accordion class=\"entities\">\n @for (unit of filteredUnits(); track unit.key) {\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>{{ unit.name }}</mat-panel-title>\n <mat-panel-description>\n <div class=\"stage-chips\">\n @if (!unit.hasTable) {\n <fs-chip size=\"tiny\" matTooltip=\"Domain logic with no table \u2014 read, never queried\">\n code\n </fs-chip>\n }\n <!-- Silence means built. A chip here means an interrupted\n build left this row owing content. -->\n @for (stage of pendingStages(unit); track stage) {\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"pendingColor()\"\n color=\"#ffffff\"\n matTooltip=\"Needs building\">\n {{ stage }}\n </fs-chip>\n }\n </div>\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <!-- Deferred: the body only exists once expanded. -->\n <ng-template matExpansionPanelContent>\n <div class=\"entity-detail\">\n @if (unit.model) {\n <div class=\"stat\">\n <span class=\"label\">Class</span>\n <span>{{ unit.model }}</span>\n </div>\n }\n @if (unit.entity; as entity) {\n <div class=\"stat\">\n <span class=\"label\">Table</span>\n <span>{{ entity.table }}</span>\n </div>\n <!-- The handle the report AI addresses this entity by in\n describe_entity / compile_query. -->\n <div class=\"stat\">\n <span class=\"label\">Entity key</span>\n <span>{{ entity.key }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Columns</span>\n <span>{{ entity.columns }}</span>\n </div>\n <div class=\"stat\">\n <span class=\"label\">Relationships</span>\n <span>{{ entity.relationships }}</span>\n </div>\n @if (entity.enums.length) {\n <div class=\"stat\">\n <span class=\"label\">Enumeration values</span>\n <div class=\"pair-list\">\n @for (enumColumn of entity.enums; track enumColumn.column) {\n <div class=\"pair-row\">\n <span class=\"pair-name\">{{ enumColumn.column }}</span>\n <span>{{ enumColumn.values.join(', ') }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (entity.computedFields.length) {\n <div class=\"stat\">\n <span class=\"label\">Computed fields</span>\n <span>{{ entity.computedFields.join(', ') }}</span>\n </div>\n }\n <div class=\"stat\">\n <span class=\"label\">Model functions</span>\n @if (entity.modelFunctionCount) {\n <a\n class=\"count-link\"\n (click)=\"openFunctions(unit, 'model')\">\n {{ entity.modelFunctionCount }}\n </a>\n } @else {\n <span>0</span>\n }\n </div>\n <div class=\"stat\">\n <span class=\"label\">Handler functions</span>\n @if (entity.handlerFunctionCount) {\n <a\n class=\"count-link\"\n (click)=\"openFunctions(unit, 'handler')\">\n {{ entity.handlerFunctionCount }}\n </a>\n } @else {\n <span>0</span>\n }\n </div>\n } @else {\n <div class=\"stat\">\n <span class=\"label\">Code functions</span>\n @if (unit.functionCount) {\n <a\n class=\"count-link\"\n (click)=\"openFunctions(unit, 'class')\">\n {{ unit.functionCount }}\n </a>\n } @else {\n <span>0</span>\n }\n </div>\n }\n </div>\n </ng-template>\n </mat-expansion-panel>\n }\n </mat-accordion>\n\n @if (!filteredUnits().length) {\n <div class=\"subheading\">Nothing matches \u201C{{ filter() }}\u201D.</div>\n }\n }\n\n <!-- The other half of the picture: tables the AI can't reach. Excluded\n ones have no model; unlinked junctions have a composite primary key\n but were folded into no relationship, so nothing can navigate to\n them. Both are invisible by omission \u2014 no error, just a capability\n that silently isn't there. Collapsed by default: the excluded list is\n long and mostly framework plumbing. -->\n @if (hasCatalog()) {\n <h2>Not in the semantic database</h2>\n <div class=\"subheading\">\n Tables the report AI can't see. Give one a model to promote it to an\n entity, then rebuild.\n </div>\n <mat-accordion class=\"catalog\">\n @if (excludedTables().length) {\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n Tables excluded ({{ excludedTables().length }})\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <!-- Deferred: the body only exists once expanded. -->\n <ng-template matExpansionPanelContent>\n <div class=\"pair-list\">\n @for (table of excludedTables(); track table.table) {\n <div class=\"pair-row\">\n <span class=\"pair-name\">{{ table.table }}</span>\n <span>{{ table.reason }}</span>\n </div>\n }\n </div>\n </ng-template>\n </mat-expansion-panel>\n }\n @if (unlinkedJunctions().length) {\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n Junctions not linked ({{ unlinkedJunctions().length }})\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <ng-template matExpansionPanelContent>\n <p class=\"small\">\n Link tables the build couldn't fold into a relationship \u2014 so\n neither they nor what they link can be reported on.\n </p>\n <div class=\"pair-list\">\n @for (table of unlinkedJunctions(); track table.table) {\n <div class=\"pair-row\">\n <span class=\"pair-name\">{{ table.table }}</span>\n <span>{{ table.reason }}</span>\n </div>\n }\n </div>\n </ng-template>\n </mat-expansion-panel>\n }\n </mat-accordion>\n }\n }\n </div>\n</div>\n", styles: [".hint{margin:0 0 12px;color:#0009;font-size:13px;line-height:1.5}.stat{display:flex;align-items:baseline;gap:12px}.stat>.label{flex:0 0 150px;white-space:nowrap;color:#0009}.build-status{display:flex;flex-direction:column;gap:8px}.pair-list{display:flex;flex-direction:column;gap:3px}.pair-row{display:flex;gap:12px}.pair-name{flex:0 0 140px;white-space:nowrap;color:#0009}.unit-filter{width:100%;box-sizing:border-box;margin:8px 0 4px;padding:6px 10px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font:inherit}.unit-filter:focus{outline:none;border-color:#00000080}.entities{display:block;padding:3px}.entities mat-panel-description{justify-content:flex-end;margin-right:8px}.entities .stage-chips{display:flex;gap:4px}.entities .entity-detail{display:flex;flex-direction:column;gap:8px}.catalog{display:block;padding:3px}.catalog .pair-name{flex-basis:220px}\n"] }]
335
340
  }], ctorParameters: () => [] });
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2NvbXBvbmVudHMvc2VtYW50aWMtZGF0YWJhc2Uvc2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2NvbXBvbmVudHMvc2VtYW50aWMtZGF0YWJhc2Uvc2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5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VyxDQUFDLE1BQU0sQ0FBQztZQUNuRSxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7YUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsQ0FBQyxNQUEyQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7d0dBMVdVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDBHQ3JFdEMsb2dWQXlQQSw0NUJENUxJLGtCQUFrQixxMEJBQ2xCLGdCQUFnQiw0VEFDaEIsWUFBWSxxWEFDWixZQUFZLDRJQUNaLGVBQWUseUhBQ2YsZ0JBQWdCOzs0RkFHUCx5QkFBeUI7a0JBZnJDLFNBQVM7K0JBQ0UsZ0RBQWdELG1CQUd6Qyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgU3RyZWFtRXZlbnRUeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7IEZzQ2hpcE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2NoaXAnO1xuaW1wb3J0IHsgRnNEYXRlTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGF0ZSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvY2Vzcyc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBGc1NrZWxldG9uTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2tlbGV0b24nO1xuXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIFNlbWFudGljQnVpbGRDbGFzcyxcbiAgU2VtYW50aWNCdWlsZEVudGl0eSxcbiAgU2VtYW50aWNCdWlsZFN0YXR1cyxcbiAgU2VtYW50aWNCdWlsZFRhYmxlLFxuICBTZW1hbnRpY0Z1bmN0aW9uU291cmNlLFxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudCc7XG5cblxuLy8gT25lIHJvdyBvZiB0aGUgc2NvcmVib2FyZC4gVGhlIGJ1aWxkIGNhY2hlcyB0d28ga2luZHMgb2YgdW5pdCBhbmQgdGhlIHJlcG9ydFxuLy8gQUkgcmVhZHMgY29kZSBmcm9tIGJvdGgsIHNvIHRoZXkgYmVsb25nIGluIE9ORSBsaXN0OiBhbiBlbnRpdHkgKGEgdGFibGUgcGx1c1xuLy8gaXRzIG1vZGVsIGFuZCBoYW5kbGVyKSBhbmQgYSBzdGFuZGFsb25lIGNvZGUgY2xhc3MgKGRvbWFpbiBsb2dpYyB3aXRoIG5vXG4vLyB0YWJsZSDigJQgYSBzdW1tYXJ5IG1vZGVsLCBhIGNhbGN1bGF0aW9uIHNlcnZpY2UpLiBBIGNsYXNzIHJvdyBzaW1wbHkgaGFzIG5vXG4vLyB0YWJsZSwgY29sdW1ucyBvciByZWxhdGlvbnNoaXBzIHRvIHNob3cuXG5pbnRlcmZhY2UgU2VtYW50aWNVbml0VmlldyB7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGhhc1RhYmxlOiBib29sZWFuO1xuICBlbnRpdHk6IFNlbWFudGljQnVpbGRFbnRpdHkgfCBudWxsO1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgZnVuY3Rpb25Db3VudDogbnVtYmVyO1xufVxuXG5cbi8vIFRoZSBTZW1hbnRpYyBEYXRhYmFzZSB0YWI6IHRoZSBzY29yZWJvYXJkIG9mIGV2ZXJ5dGhpbmcgdGhlIHJlcG9ydCBBSSB3YXNcbi8vIGJ1aWx0IGZyb20uIFNob3dzIHRoZSBsYXN0IGJ1aWxkJ3Mgc3RhdHVzLCBydW5zIChvciBzdG9wcykgYSBidWlsZCDigJQgc3RyZWFtZWRcbi8vIGludG8gdGhlIEZzUHJvY2VzcyBkb2NrIHNvIGl0IHN1cnZpdmVzIHRoZSBkaWFsb2cgY2xvc2luZyDigJQgYW5kIGRyaWxscyBpbnRvXG4vLyBldmVyeSB1bml0IHRvIHJldmVhbCBpdHMgc2hhcGUsIGlubGluZWQgZW51bSB2YWx1ZXMsIGNvbXB1dGVkIGZpZWxkcyBhbmQgaXRzXG4vLyBjYWNoZWQgZnVuY3Rpb24gY291bnRzLCB3aG9zZSBsaW5rcyBvcGVuIHRoZSBmdW5jdGlvbnMgZGlhbG9nICh0aGUgZnVsbFxuLy8gZnVuY3Rpb24gc2V0IGlzIGZhciB0b28gYmlnIHRvIHNoaXAgd2l0aCB0aGUgc2NvcmVib2FyZCkuXG4vL1xuLy8gSXQgYWxzbyByZXBvcnRzIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBwaWN0dXJlOiB0aGUgdGFibGVzIHRoZSBBSSBDQU5OT1Qgc2VlIOKAlFxuLy8gZXhjbHVkZWQgb25lcyAobm8gbW9kZWwpIGFuZCBqdW5jdGlvbnMgdGhhdCBicmlkZ2VkIG5vdGhpbmcuIFRob3NlIGFyZVxuLy8gaW52aXNpYmxlIGJ5IG9taXNzaW9uIG90aGVyd2lzZTogbm90aGluZyBlcnJvcnMsIHRoZSBjYXBhYmlsaXR5IGp1c3QgaXNuJ3Rcbi8vIHRoZXJlLCBhbmQgdGhlIGZpcnN0IGFueW9uZSBsZWFybnMgaXMgYSB3cm9uZyBhbnN3ZXIgb3IgYSByZWZ1c2FsLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1zZW1hbnRpYy1kYXRhYmFzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZW1hbnRpYy1kYXRhYmFzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbWFudGljLWRhdGFiYXNlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgRnNDaGlwTW9kdWxlLFxuICAgIEZzRGF0ZU1vZHVsZSxcbiAgICBGc01lc3NhZ2VNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudCB7XG5cbiAgLy8gVGhlIGJ1aWxkLWluLWZsaWdodCBzdGF0ZXMgb2YgdGhlIGZmX3Byb2Nlc3NlcyByb3cgKHF1ZXVlZC9ydW5uaW5nL3N0b3BwaW5nKS5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUNUSVZFX1NUQVRFUyA9IFsnUScsICdSJywgJ1gnXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVEFURV9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgUTogJ1F1ZXVlZCcsXG4gICAgUjogJ1J1bm5pbmcnLFxuICAgIFg6ICdTdG9wcGluZycsXG4gICAgQzogJ0NvbXBsZXRlZCcsXG4gICAgSzogJ1N0b3BwZWQnLFxuICAgIEY6ICdGYWlsZWQnLFxuICB9O1xuXG4gIC8vIEEgcm93IHRoYXQgaXMgc3RpbGwgb3dlZCBjb250ZW50IHNheXMgc287IGEgYnVpbHQgb25lIHNheXMgbm90aGluZy4gT24gYVxuICAvLyBmaW5pc2hlZCBidWlsZCBldmVyeSBzdGFnZSBpcyBkb25lIG9uIGV2ZXJ5IHJvdywgc28gY2hpcHBpbmcgdGhlbSBhbGwgd2FzXG4gIC8vIG5vaXNlIHRoYXQgYnVyaWVkIHRoZSBvbmUgcm93IHRoYXQgbWF0dGVyZWQuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBFTkRJTkdfQ09MT1IgPSAnI2IyNjUwMCc7XG5cbiAgLy8gQ2xhc3MtbmFtZSBzdWZmaXggc3RyaXBwZWQgZm9yIGRpc3BsYXk6IGBCdWRnZXRTdW1tYXJ5TW9kZWxgIHJlYWRzIGFzXG4gIC8vIGBCdWRnZXRTdW1tYXJ5YC4gT25seSBgTW9kZWxgIOKAlCBzdHJpcHBpbmcgYEhhbmRsZXJgIHRvbyB3b3VsZCBjb2xsaWRlXG4gIC8vIGBXb3JrT3JkZXJPbmVUaW1lSGFuZGxlcmAgd2l0aCBgV29ya09yZGVyT25lVGltZU1vZGVsYCwgd2hpY2ggYXJlIHR3b1xuICAvLyBzZXBhcmF0ZSB1bml0cy5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkFNRV9TVUZGSVggPSAnTW9kZWwnO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgdGFiIGJlaGluZCB0aGUgc2tlbGV0b24uXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSBzaWduYWw8U2VtYW50aWNCdWlsZFN0YXR1cyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEZyZWUtdGV4dCBmaWx0ZXIgb3ZlciB0aGUgdW5pdCBsaXN0IOKAlCBhdCBhIGZldyBodW5kcmVkIHJvd3MgdGhlIGFjY29yZGlvblxuICAvLyBpcyBvbmx5IHVzYWJsZSBpZiB5b3UgY2FuIG5hcnJvdyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICAvLyBUcnVlIHdoaWxlIGEgYnVpbGQgc3RhcnRlZCBmcm9tIHRoaXMgdGFiIGlzIHN0cmVhbWluZyBpbnRvIHRoZSBkb2NrLlxuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHB1YmxpYyByZWFkb25seSBidWlsZEFjdGl2ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+XG4gICAgdGhpcy5idWlsZGluZygpXG4gICAgICB8fCBTZW1hbnRpY0RhdGFiYXNlQ29tcG9uZW50LkFDVElWRV9TVEFURVMuaW5jbHVkZXModGhpcy5zdGF0dXMoKT8uYnVpbGQ/LnN0YXRlKSxcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRTdGF0ZUxhYmVsID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PlxuICAgIFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuU1RBVEVfTEFCRUxTW3RoaXMuc3RhdHVzKCk/LmJ1aWxkPy5zdGF0ZV0gPz8gJycsXG4gICk7XG5cbiAgLy8gQW4gYXJ0aWZhY3QgYnVpbHQgYmVmb3JlIHRoZSBjYXRhbG9nIGV4aXN0ZWQgY2FycmllcyBubyB0YWJsZXMuIEV2ZXJ5dGhpbmdcbiAgLy8gY2F0YWxvZy1kcml2ZW4gc3RheXMgaGlkZGVuIHJhdGhlciB0aGFuIGNsYWltaW5nIFwiMCBleGNsdWRlZFwiLCB3aGljaCB3b3VsZFxuICAvLyBiZSBhIGxpZSDigJQgYSByZWJ1aWxkIGZpbGxzIGl0IGluLlxuICBwdWJsaWMgcmVhZG9ubHkgaGFzQ2F0YWxvZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+ICEhdGhpcy5zdGF0dXMoKT8uZGV0YWlsPy50YWJsZXM/Lmxlbmd0aCk7XG5cbiAgLy8gVGFibGVzIHdpdGggbm8gbW9kZWw6IHRoZSByZXBvcnQgQUkgY2FuJ3Qgc2VlIHRoZW0gYXQgYWxsLiBBZGQgYSBtb2RlbCB0b1xuICAvLyBwcm9tb3RlIG9uZSB0byBhbiBlbnRpdHkuXG4gIHB1YmxpYyByZWFkb25seSBleGNsdWRlZFRhYmxlcyA9IGNvbXB1dGVkPFNlbWFudGljQnVpbGRUYWJsZVtdPigoKSA9PlxuICAgIHRoaXMuX3RhYmxlcygpLmZpbHRlcigodGFibGUpID0+IHRhYmxlLmNsYXNzaWZpY2F0aW9uID09PSAnZXhjbHVkZWQnKSxcbiAgKTtcblxuICAvLyBMaW5rIHRhYmxlcyB0aGF0IGJyaWRnZWQgbm90aGluZyDigJQgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXkgbWFkZSB0aGVtIGFcbiAgLy8ganVuY3Rpb24sIGJ1dCB0aGV5IHdlcmUgZm9sZGVkIGludG8gbm8gcmVsYXRpb25zaGlwLCBzbyBuZWl0aGVyIHRoZXkgbm9yXG4gIC8vIHdoYXQgdGhleSBsaW5rIGFyZSByZWFjaGFibGUuXG4gIHB1YmxpYyByZWFkb25seSB1bmxpbmtlZEp1bmN0aW9ucyA9IGNvbXB1dGVkPFNlbWFudGljQnVpbGRUYWJsZVtdPigoKSA9PlxuICAgIHRoaXMuX3RhYmxlcygpLmZpbHRlcigodGFibGUpID0+IHRhYmxlLmNsYXNzaWZpY2F0aW9uID09PSAnanVuY3Rpb24nICYmICEhdGFibGUucmVhc29uKSxcbiAgKTtcblxuICAvLyBFdmVyeXRoaW5nIHRoZSBidWlsZCBjYWNoZWQsIGVudGl0aWVzIGFuZCBzdGFuZGFsb25lIGNvZGUgY2xhc3NlcyB0b2dldGhlcixcbiAgLy8gaW4gb25lIGxpc3Qgb3JkZXJlZCBieSB0aGUgbmFtZSBhIHJlYWRlciByZWNvZ25pemVzLiBUd28gYXJyYXlzIG9uIHRoZSB3aXJlXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgZ2VudWluZWx5IGRpZmZlcmVudCBzaGFwZXM7IG9uZSBsaXN0IG9uIHNjcmVlbiBiZWNhdXNlXG4gIC8vIFwid2hhdCBkaWQgdGhlIGJ1aWxkIHJlYWQ/XCIgaXMgYSBzaW5nbGUgcXVlc3Rpb24uXG4gIHB1YmxpYyByZWFkb25seSB1bml0cyA9IGNvbXB1dGVkPFNlbWFudGljVW5pdFZpZXdbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGRldGFpbCA9IHRoaXMuc3RhdHVzKCk/LmRldGFpbDtcbiAgICBpZiAoIWRldGFpbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0aWVzID0gKGRldGFpbC5lbnRpdGllcyA/PyBbXSkubWFwKChlbnRpdHkpID0+ICh7XG4gICAgICBrZXk6IGVudGl0eS5rZXksXG4gICAgICBuYW1lOiB0aGlzLl9kaXNwbGF5TmFtZShlbnRpdHkubW9kZWwsIGVudGl0eS5rZXkpLFxuICAgICAgaGFzVGFibGU6IHRydWUsXG4gICAgICBlbnRpdHksXG4gICAgICBtb2RlbDogZW50aXR5Lm1vZGVsLFxuICAgICAgZnVuY3Rpb25Db3VudDogZW50aXR5LmZ1bmN0aW9uQ291bnQsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY2xhc3NlcyA9IChkZXRhaWwuY2xhc3NlcyA/PyBbXSkubWFwKCh1bml0OiBTZW1hbnRpY0J1aWxkQ2xhc3MpID0+ICh7XG4gICAgICBrZXk6IHVuaXQua2V5LFxuICAgICAgbmFtZTogdGhpcy5fZGlzcGxheU5hbWUodW5pdC5tb2RlbCwgdW5pdC5rZXkpLFxuICAgICAgaGFzVGFibGU6IGZhbHNlLFxuICAgICAgZW50aXR5OiBudWxsLFxuICAgICAgbW9kZWw6IHVuaXQubW9kZWwsXG4gICAgICBmdW5jdGlvbkNvdW50OiB1bml0LmZ1bmN0aW9uQ291bnQsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIFsuLi5lbnRpdGllcywgLi4uY2xhc3Nlc11cbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGZpbHRlciBtYXRjaGVzIHRoZSBkaXNwbGF5IG5hbWUsIHRoZSBjbGFzcyBhbmQgdGhlIGVudGl0eSBrZXksIHNvXG4gIC8vIGh1bnRpbmcgYnkgYW55IG9mIHRoZSB0aHJlZSB3b3Jrcy5cbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlcmVkVW5pdHMgPSBjb21wdXRlZDxTZW1hbnRpY1VuaXRWaWV3W10+KCgpID0+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcigpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy51bml0cygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVuaXRzKCkuZmlsdGVyKCh1bml0KSA9PlxuICAgICAgYCR7dW5pdC5uYW1lfSAke3VuaXQubW9kZWwgPz8gJyd9ICR7dW5pdC5rZXl9YC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikpO1xuICB9KTtcblxuICAvLyBUaGUgQ292ZXJhZ2UgbGluZS4gQXNzZW1ibGVkIGhlcmUgYmVjYXVzZSB0aGUgY2F0YWxvZyBwYXJ0cyBkcm9wIG91dFxuICAvLyBlbnRpcmVseSBvbiBhIHByZS1jYXRhbG9nIGFydGlmYWN0LCB3aGljaCByZWFkcyBiYWRseSBhcyB0ZW1wbGF0ZSBicmFuY2hlcy5cbiAgcHVibGljIHJlYWRvbmx5IGNvdmVyYWdlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgY29uc3QgZGV0YWlsID0gdGhpcy5zdGF0dXMoKT8uZGV0YWlsO1xuICAgIGlmICghZGV0YWlsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBbYCR7ZGV0YWlsLmVudGl0eUNvdW50fSBlbnRpdGllc2AsIGAke2RldGFpbC5jbGFzc0NvdW50fSBjb2RlIGNsYXNzZXNgXTtcblxuICAgIGlmICh0aGlzLmhhc0NhdGFsb2coKSkge1xuICAgICAgcGFydHMucHVzaChkZXRhaWwudW5saW5rZWRKdW5jdGlvbkNvdW50XG4gICAgICAgID8gYCR7ZGV0YWlsLmp1bmN0aW9uQ291bnR9IGp1bmN0aW9ucyAoJHtkZXRhaWwudW5saW5rZWRKdW5jdGlvbkNvdW50fSBub3QgbGlua2VkKWBcbiAgICAgICAgOiBgJHtkZXRhaWwuanVuY3Rpb25Db3VudH0ganVuY3Rpb25zYCk7XG4gICAgfVxuXG4gICAgcGFydHMucHVzaChgJHtkZXRhaWwuZnVuY3Rpb25Db3VudH0gY29kZSBmdW5jdGlvbnNgKTtcblxuICAgIGlmICh0aGlzLmhhc0NhdGFsb2coKSkge1xuICAgICAgcGFydHMucHVzaChgJHtkZXRhaWwuZXhjbHVkZWRDb3VudH0gdGFibGVzIGV4Y2x1ZGVkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyDCtyAnKTtcbiAgfSk7XG5cbiAgLy8gVGhlIHRhYmxlIGNhdGFsb2csIG9yIFtdIHdoZW4gdGhlIHN0YXR1cyBoYXNuJ3QgbG9hZGVkIG9yIHRoZSBhcnRpZmFjdFxuICAvLyBwcmVkYXRlcyBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGFibGVzID0gY29tcHV0ZWQ8U2VtYW50aWNCdWlsZFRhYmxlW10+KCgpID0+IHRoaXMuc3RhdHVzKCk/LmRldGFpbD8udGFibGVzID8/IFtdKTtcblxuICAvLyBHdWFyZHMgdGhlIG91dGNvbWUgbWVzc2FnZSB0byBmaXJlIGV4YWN0bHkgb25jZSBwZXIgcnVuIOKAlCB3aGV0aGVyIHRoZSBzdHJlYW1cbiAgLy8gY29tcGxldGVzIChidWlsZCBmaW5pc2hlZCwgcG9zc2libHkgZmFpbGVkKSBvciBlcnJvcnMgb3V0cmlnaHQuXG4gIHByaXZhdGUgX2J1aWxkRmluYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIC8vIENvbmZpcm0gYmVmb3JlIGtpY2tpbmcgb2ZmIGEgYnVpbGQg4oCUIGEgcmVidWlsZCByZXBsYWNlcyB0aGUgY3VycmVudFxuICAvLyBzZW1hbnRpYyBkYXRhYmFzZSwgc28gaXQgc2hvdWxkIG5ldmVyIGZpcmUgb24gYSBzdHJheSBjbGljay5cbiAgcHVibGljIGJ1aWxkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlYnVpbGQgPSAhIXRoaXMuc3RhdHVzKCk/LmRldGFpbD8uZ2VuZXJhdGVkQXQ7XG5cbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogcmVidWlsZCA/ICdSZWJ1aWxkIHNlbWFudGljIGRhdGFiYXNlJyA6ICdCdWlsZCBzZW1hbnRpYyBkYXRhYmFzZScsXG4gICAgICB0ZW1wbGF0ZTogcmVidWlsZFxuICAgICAgICA/ICdSZWJ1aWxkIHRoZSBzZW1hbnRpYyBkYXRhYmFzZT8gSXQgcnVucyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgcmVwbGFjZXMgdGhlIGN1cnJlbnQgb25lIHdoZW4gaXQgZmluaXNoZXMuJ1xuICAgICAgICA6ICdCdWlsZCB0aGUgc2VtYW50aWMgZGF0YWJhc2U/IEl0IHJ1bnMgaW4gdGhlIGJhY2tncm91bmQuJyxcbiAgICAgIGNvbW1pdExhYmVsOiByZWJ1aWxkID8gJ1JlYnVpbGQnIDogJ0J1aWxkJyxcbiAgICB9KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9ydW5CdWlsZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wQnVpbGQoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdTdG9wIGJ1aWxkJyxcbiAgICAgIHRlbXBsYXRlOiAnU3RvcCB0aGUgcnVubmluZyBidWlsZD8gVGhlIGN1cnJlbnQgc2VtYW50aWMgZGF0YWJhc2Ugc3RheXMgaW4gcGxhY2UgdW50aWwgYSBidWlsZCBmaW5pc2hlcy4nLFxuICAgICAgY29tbWl0TGFiZWw6ICdTdG9wJyxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLnNlbWFudGljQnVpbGRTdG9wKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5idWlsZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1N0b3BwaW5nIHRoZSBidWlsZOKApicpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoU3RhdHVzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJ1biB0aGUgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQuIFRoZSBsaXZlIGZlZWQgc3RyZWFtcyBpbnRvIHRoZSBGc1Byb2Nlc3NcbiAgLy8gZG9jayAoYm90dG9tLXJpZ2h0KSwgd2hvc2Ugc3Vic2NyaXB0aW9uIHN1cnZpdmVzIHRoaXMgZGlhbG9nIGNsb3Npbmcg4oCUIHNvXG4gIC8vIGRpc21pc3NpbmcgdGhlIGRpYWxvZyBuZXZlciBpbnRlcnJ1cHRzIGEgcnVubmluZyBidWlsZC5cbiAgcHJpdmF0ZSBfcnVuQnVpbGQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5fYnVpbGRGaW5hbGl6ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHRhcmdldCQgPSB0aGlzLl9yZXBvcnREYXRhLnNlbWFudGljQnVpbGQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIEEgaGFyZCBzdHJlYW0vdHJhbnNwb3J0IGZhaWx1cmUgKHRoZSBidWlsZCBjb3VsZG4ndCBldmVuIHN0YXJ0KVxuICAgICAgICAvLyBmaW5hbGl6ZXMgaGVyZSDigJQgY29tcGxldGVkJCB3b24ndCBmaXJlIGluIHRoYXQgY2FzZS5cbiAgICAgICAgdGFwKHsgZXJyb3I6IChlcnJvcikgPT4gdGhpcy5fZmluYWxpemVCdWlsZChlcnJvcikgfSksXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+XG4gICAgICAgICAgZXZlbnQ/LnR5cGUgPT09IFN0cmVhbUV2ZW50VHlwZS5EYXRhXG4gICAgICAgICAgJiYgZXZlbnQuZGF0YT8ua2luZCA9PT0gJ2xvZydcbiAgICAgICAgICAmJiB0eXBlb2YgZXZlbnQuZGF0YS5saW5lID09PSAnc3RyaW5nJyksXG4gICAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50LmRhdGEubGluZSBhcyBzdHJpbmcpLFxuICAgICAgKTtcblxuICAgIHRoaXMuX3Byb2Nlc3NcbiAgICAgIC5ydW4oJ1NlbWFudGljIGRhdGFiYXNlIGJ1aWxkJywgdGFyZ2V0JClcbiAgICAgIC5jb21wbGV0ZWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9maW5hbGl6ZUJ1aWxkKG51bGwpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHVwIG9uZSBidWlsZCBydW4gZXhhY3RseSBvbmNlLiBPbiBhIGhhcmQgc3RyZWFtIGVycm9yLCBzdXJmYWNlIHRoZVxuICAgKiBhY3R1YWwgc2VydmVyLXNpZGUgcmVhc29uIHB1bGxlZCBvZmYgdGhlIGJyb2tlbiBzdHJlYW0g4oCUIHRoZSBnZW5lcmljXG4gICAqIFwiY291bGQgbm90IHJ1blwiIGxpbmUgb25seSB3aGVuIHRoZSBmYWlsdXJlIGNhcnJpZWQgbm8gc2VydmVyIHRleHQgYXQgYWxsO1xuICAgKiBvdGhlcndpc2UgcmVmcmVzaCB0aGUgc3RhdHVzIGFuZCBhbm5vdW5jZSBob3cgdGhlIGJ1aWxkIGFjdHVhbGx5IGVuZGVkIOKAlCBhXG4gICAqIGJ1aWxkIHRoYXQgZmFpbGVkIChlLmcuIHRoZSBBSSBjb3VsZG4ndCBiZSByZWFjaGVkKSByZXBvcnRzICdGYWlsZWQnIHdpdGhcbiAgICogYSByZWFzb24sIGFuZCB0aGF0IG11c3Qgc3VyZmFjZSBpbnN0ZWFkIG9mIHRoZSBydW4gc2lsZW50bHkgZG9pbmcgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmFsaXplQnVpbGQoc3RyZWFtRXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYnVpbGRGaW5hbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYnVpbGRGaW5hbGl6ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5idWlsZGluZy5zZXQoZmFsc2UpO1xuXG4gICAgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSB0aGlzLl9zdHJlYW1FcnJvckRldGFpbChzdHJlYW1FcnJvcik7XG5cbiAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoZGV0YWlsXG4gICAgICAgID8gYFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBidWlsZCBmYWlsZWQg4oCUICR7ZGV0YWlsfWBcbiAgICAgICAgOiAnVGhlIHNlbWFudGljIGRhdGFiYXNlIGJ1aWxkIGNvdWxkIG5vdCBydW4g4oCUIGNoZWNrIHRoZSBBSSBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uJyk7XG4gICAgICB0aGlzLl9yZWZyZXNoU3RhdHVzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnNlbWFudGljQnVpbGRTdGF0dXMoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBTZW1hbnRpY0J1aWxkU3RhdHVzKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzLnNldChzdGF0dXMpO1xuICAgICAgICB0aGlzLl9hbm5vdW5jZU91dGNvbWUoc3RhdHVzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWFsIHJlYXNvbiBhIGJyb2tlbiBidWlsZCBzdHJlYW0gYnJva2UsIGZyb20gd2hhdCB0aGUgc2VydmVyIGFjdHVhbGx5XG4gICAqIHNlbnQuIEEgc3RydWN0dXJlZCBlcnJvciBmcmFtZSBhcnJpdmVzIGFzIHttZXNzYWdlfSBvbiB0aGUgZXJyb3IgYm9keTsgYVxuICAgKiBtaWQtc3RyZWFtIGNyYXNoIGR1bXBzIHJhdyB0ZXh0IGludG8gdGhlIHN0cmVhbSAodGhlIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBoYW5kcyBpdCBiYWNrIGFzIHN0YXR1c1RleHQpLCB3aGVyZSB0aGUgZnJhbWVzIGFyZSBKU09OIGxpbmVzIGFuZCB0aGVcbiAgICogZmlyc3Qgbm9uLUpTT04gbGluZXMgYXJlIHRoZSBlcnJvciBhbmQgaXRzIGxvY2F0aW9uLiAnJyB3aGVuIHRoZSBmYWlsdXJlXG4gICAqIGNhcnJpZWQgbm8gc2VydmVyIHRleHQgYXQgYWxsICh0cmFuc3BvcnQgZG93biAvIHNlcnZlciB1bnJlYWNoYWJsZSkuXG4gICAqL1xuICBwcml2YXRlIF9zdHJlYW1FcnJvckRldGFpbChzdHJlYW1FcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgZXJyb3IgPSBzdHJlYW1FcnJvciBhcyB7IGVycm9yPzogeyBtZXNzYWdlPzogc3RyaW5nIH07IHN0YXR1c1RleHQ/OiBzdHJpbmcgfTtcblxuICAgIGlmIChlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBlcnJvci5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBlcnJvcj8uc3RhdHVzVGV4dDtcbiAgICBpZiAoIXN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCA9PT0gJ1Vua25vd24gRXJyb3InKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBzdGF0dXNUZXh0LnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiB7XG4gICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgSlNPTi5wYXJzZShsaW5lKTtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIDIpLmpvaW4oJyDigJQgJykuc3Vic3RyaW5nKDAsIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgb3BlcmF0b3IgaG93IHRoZSBidWlsZCBlbmRlZDogYSBmYWlsZWQvc3RvcHBlZCBidWlsZCBzdXJmYWNlcyBpdHNcbiAgICogcmVhc29uIChzbyBhbiBBSSBjb25uZWN0aW9uIHByb2JsZW0gaXMgbmV2ZXIgc2lsZW50KSwgYSBjb21wbGV0ZWQgb25lXG4gICAqIGNvbmZpcm1zIHN1Y2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIF9hbm5vdW5jZU91dGNvbWUoc3RhdHVzOiBTZW1hbnRpY0J1aWxkU3RhdHVzKTogdm9pZCB7XG4gICAgY29uc3QgYnVpbGQgPSBzdGF0dXM/LmJ1aWxkO1xuICAgIGlmIChidWlsZD8uc3RhdGUgPT09ICdGJyB8fCBidWlsZD8uc3RhdGUgPT09ICdLJykge1xuICAgICAgdGhpcy5fbWVzc2FnZS5lcnJvcihidWlsZC5tZXNzYWdlIHx8ICdUaGUgc2VtYW50aWMgZGF0YWJhc2UgYnVpbGQgZGlkIG5vdCBmaW5pc2guJyk7XG4gICAgfSBlbHNlIGlmIChidWlsZD8uc3RhdGUgPT09ICdDJykge1xuICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTZW1hbnRpYyBkYXRhYmFzZSBidWlsZCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGVuZGluZ0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuUEVORElOR19DT0xPUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgc3RhZ2VzIHRoaXMgcm93IGlzIHN0aWxsIG93ZWQsIG9yIFtdIHdoZW4gaXQgaXMgZnVsbHkgYnVpbHQuIEFcbiAgICogc3RvcHBlZCBvciBpbnRlcnJ1cHRlZCBidWlsZCBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGEgbm9uLWVtcHR5IGxpc3QuXG4gICAqL1xuICBwdWJsaWMgcGVuZGluZ1N0YWdlcyh1bml0OiBTZW1hbnRpY1VuaXRWaWV3KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YWdlcyA9IHVuaXQuZW50aXR5Py5zdGFnZXM7XG5cbiAgICByZXR1cm4gc3RhZ2VzXG4gICAgICA/IE9iamVjdC5rZXlzKHN0YWdlcykuZmlsdGVyKChzdGFnZSkgPT4gc3RhZ2VzW3N0YWdlXSAhPT0gJ2RvbmUnKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyLnNldCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgY2hpbGQgZGlhbG9nIGxpc3Rpbmcgb25lIGdyb3VwIG9mIGEgdW5pdCdzIGNhY2hlZCBmdW5jdGlvbnMg4oCUIGFuXG4gICAqIGVudGl0eSdzIG1vZGVsIG9yIGhhbmRsZXIgY2xhc3MsIG9yIGEgc3RhbmRhbG9uZSBjbGFzcydzIGNvZGUuIFRoZSBkaWFsb2dcbiAgICogZmV0Y2hlcyBmcmVzaCBvbiBvcGVuLCBzbyB0aGUgdGFiIG5ldmVyIGhvbGRzIGZ1bmN0aW9uIHBheWxvYWRzLlxuICAgKi9cbiAgcHVibGljIG9wZW5GdW5jdGlvbnModW5pdDogU2VtYW50aWNVbml0Vmlldywgc291cmNlOiBTZW1hbnRpY0Z1bmN0aW9uU291cmNlKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzcwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTV2dycsXG4gICAgICBtYXhIZWlnaHQ6ICc4NXZoJyxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7IGVudGl0eUtleTogdW5pdC5rZXksIHNvdXJjZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoU3RhdHVzKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIHJlYWRlciByZWNvZ25pemVzIHRoZSB1bml0IGJ5OiBpdHMgY2xhc3MncyBzaG9ydCBuYW1lLCBtaW51cyB0aGVcbiAgICogYE1vZGVsYCBzdWZmaXggdGhhdCBldmVyeSBtb2RlbCBjYXJyaWVzIGFuZCBub25lIG9mIHRoZW0gYXJlIGRpc3Rpbmd1aXNoZWRcbiAgICogYnkuIEZhbGxzIGJhY2sgdG8gdGhlIGNhY2hlIGtleSBmb3IgYSB1bml0IHdob3NlIGNsYXNzIGNvdWxkIG5vdCBiZVxuICAgKiByZXNvbHZlZCwgc28gYSByb3cgbmV2ZXIgcmVuZGVycyBuYW1lbGVzcy5cbiAgICovXG4gIHByaXZhdGUgX2Rpc3BsYXlOYW1lKG1vZGVsOiBzdHJpbmcgfCBudWxsLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG9ydE5hbWUgPSBtb2RlbC5zcGxpdCgnXFxcXCcpLnBvcCgpO1xuXG4gICAgcmV0dXJuIHNob3J0TmFtZS5sZW5ndGggPiBTZW1hbnRpY0RhdGFiYXNlQ29tcG9uZW50Lk5BTUVfU1VGRklYLmxlbmd0aFxuICAgICAgJiYgc2hvcnROYW1lLmVuZHNXaXRoKFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuTkFNRV9TVUZGSVgpXG4gICAgICA/IHNob3J0TmFtZS5zbGljZSgwLCAtU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudC5OQU1FX1NVRkZJWC5sZW5ndGgpXG4gICAgICA6IHNob3J0TmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zZW1hbnRpY0J1aWxkU3RhdHVzKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1czogU2VtYW50aWNCdWlsZFN0YXR1cykgPT4gdGhpcy5zdGF0dXMuc2V0KHN0YXR1cykpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gIDxwIGNsYXNzPVwiaGludFwiPlxuICAgIFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBpcyB3aGF0IHRoZSByZXBvcnQgQUkgdXNlcyB0byB1bmRlcnN0YW5kIHlvdXIgZGF0YSDigJRcbiAgICB0YWJsZXMsIHJlbGF0aW9uc2hpcHMgYW5kIHRoZSBjYWxjdWxhdGlvbnMgaW4gY29kZS4gUmVidWlsZCBpdCBhZnRlclxuICAgIHNpZ25pZmljYW50IGFwcGxpY2F0aW9uIHVwZGF0ZXMuIFRoZSBidWlsZCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kOyBwcm9ncmVzc1xuICAgIGFwcGVhcnMgaW4gdGhlIGRvY2sgYXQgdGhlIGJvdHRvbSByaWdodCBhbmQgdGhpcyBkaWFsb2cgY2FuIGJlIGNsb3NlZCB3aGlsZVxuICAgIGl0IHJ1bnMuXG4gIDwvcD5cblxuICA8ZGl2ICpmc1NrZWxldG9uPVwic3RhdHVzKClcIj5cbiAgICBAaWYgKHN0YXR1cygpOyBhcyBidWlsZFN0YXR1cykge1xuICAgICAgPGRpdiBjbGFzcz1cImJ1aWxkLXN0YXR1c1wiPlxuICAgICAgICBAaWYgKGJ1aWxkU3RhdHVzLmRldGFpbC5nZW5lcmF0ZWRBdCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+TGFzdCBidWlsdDwvc3Bhbj5cbiAgICAgICAgICAgIDxmcy1kYXRlXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwiYnVpbGRTdGF0dXMuZGV0YWlsLmdlbmVyYXRlZEF0XCJcbiAgICAgICAgICAgICAgICBmb3JtYXQ9XCJkYXRlLXRpbWVcIj5cbiAgICAgICAgICAgIDwvZnMtZGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkNvdmVyYWdlPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+e3sgY292ZXJhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGZzLW1lc3NhZ2Utd2FybmluZz5cbiAgICAgICAgICAgIFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBoYXMgbm90IGJlZW4gYnVpbHQgeWV0IOKAlCB0aGUgcmVwb3J0IEFJIGNhbid0XG4gICAgICAgICAgICBhbnN3ZXIgZGF0YSBxdWVzdGlvbnMgdW50aWwgaXQgaXMuIFJ1biB0aGUgZmlyc3QgYnVpbGQuXG4gICAgICAgICAgPC9mcy1tZXNzYWdlLXdhcm5pbmc+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChidWlsZFN0YXR1cy5idWlsZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+TGFzdCBidWlsZCBydW48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAge3sgYnVpbGRTdGF0ZUxhYmVsKCkgfX1cbiAgICAgICAgICAgICAgQGlmIChidWlsZFN0YXR1cy5idWlsZC5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAg4oCUIHt7IGJ1aWxkU3RhdHVzLmJ1aWxkLm1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFdmVyeXRoaW5nIHRoZSBidWlsZCByZWFkLCBpbiBvbmUgbGlzdDogZW50aXRpZXMgKGEgdGFibGUgKyBhIG1vZGVsICtcbiAgICAgICAgICAgYSBoYW5kbGVyKSBhbmQgc3RhbmRhbG9uZSBjb2RlIGNsYXNzZXMgKGRvbWFpbiBsb2dpYyB3aXRoIG5vIHRhYmxlKS5cbiAgICAgICAgICAgVGhlIEFJIHJlYWRzIGNvZGUgZnJvbSBib3RoLCBzbyBzcGxpdHRpbmcgdGhlbSBpbnRvIHR3byBzZWN0aW9uc1xuICAgICAgICAgICB3b3VsZCBoaWRlIGhhbGYgb2Ygd2hhdCB3YXMgYnVpbHQuIEVhY2ggcm93IGRyaWxscyBpbnRvIGl0cyBzaGFwZSxcbiAgICAgICAgICAgZW51bSB2YWx1ZXMsIGNvbXB1dGVkIGZpZWxkcyBhbmQgY2FjaGVkIGZ1bmN0aW9uIGNvdW50cyDigJQgdGhlIGNvdW50c1xuICAgICAgICAgICBsaW5rIGludG8gdGhlIGZ1bmN0aW9ucyBkaWFsb2cuIC0tPlxuICAgICAgQGlmICh1bml0cygpLmxlbmd0aCkge1xuICAgICAgICA8aDI+SW5jbHVkZWQgKHt7IHVuaXRzKCkubGVuZ3RoIH19KTwvaDI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nXCI+XG4gICAgICAgICAgRXZlcnl0aGluZyB0aGUgcmVwb3J0IEFJIHdhcyBidWlsdCBmcm9tLiBFbnRpdGllcyBjYW4gYmUgcXVlcmllZDtcbiAgICAgICAgICBjb2RlIGNsYXNzZXMgYXJlIGxvZ2ljIGl0IHJlYWRzIGFuZCB0cmFuc2xhdGVzIGludG8gU1FMLlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwidW5pdC1maWx0ZXJcIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBieSBuYW1lLCBjbGFzcyBvciBrZXnigKZcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlcigpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZXRGaWx0ZXIoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIj5cblxuICAgICAgICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cImVudGl0aWVzXCI+XG4gICAgICAgICAgQGZvciAodW5pdCBvZiBmaWx0ZXJlZFVuaXRzKCk7IHRyYWNrIHVuaXQua2V5KSB7XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+e3sgdW5pdC5uYW1lIH19PC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFnZS1jaGlwc1wiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCF1bml0Lmhhc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWNoaXAgc2l6ZT1cInRpbnlcIiBtYXRUb29sdGlwPVwiRG9tYWluIGxvZ2ljIHdpdGggbm8gdGFibGUg4oCUIHJlYWQsIG5ldmVyIHF1ZXJpZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTaWxlbmNlIG1lYW5zIGJ1aWx0LiBBIGNoaXAgaGVyZSBtZWFucyBhbiBpbnRlcnJ1cHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIGxlZnQgdGhpcyByb3cgb3dpbmcgY29udGVudC4gLS0+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHN0YWdlIG9mIHBlbmRpbmdTdGFnZXModW5pdCk7IHRyYWNrIHN0YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInRpbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cInBlbmRpbmdDb2xvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5lZWRzIGJ1aWxkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzdGFnZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBEZWZlcnJlZDogdGhlIGJvZHkgb25seSBleGlzdHMgb25jZSBleHBhbmRlZC4gLS0+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRFeHBhbnNpb25QYW5lbENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudGl0eS1kZXRhaWxcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAodW5pdC5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DbGFzczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB1bml0Lm1vZGVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAodW5pdC5lbnRpdHk7IGFzIGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5UYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkudGFibGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBoYW5kbGUgdGhlIHJlcG9ydCBBSSBhZGRyZXNzZXMgdGhpcyBlbnRpdHkgYnkgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZV9lbnRpdHkgLyBjb21waWxlX3F1ZXJ5LiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+RW50aXR5IGtleTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q29sdW1uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkuY29sdW1ucyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlbGF0aW9uc2hpcHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZW50aXR5LnJlbGF0aW9uc2hpcHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGVudGl0eS5lbnVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkVudW1lcmF0aW9uIHZhbHVlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWlyLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZW51bUNvbHVtbiBvZiBlbnRpdHkuZW51bXM7IHRyYWNrIGVudW1Db2x1bW4uY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhaXItbmFtZVwiPnt7IGVudW1Db2x1bW4uY29sdW1uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZW51bUNvbHVtbi52YWx1ZXMuam9pbignLCAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChlbnRpdHkuY29tcHV0ZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Db21wdXRlZCBmaWVsZHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkuY29tcHV0ZWRGaWVsZHMuam9pbignLCAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Nb2RlbCBmdW5jdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChlbnRpdHkubW9kZWxGdW5jdGlvbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnQtbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdW5jdGlvbnModW5pdCwgJ21vZGVsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW50aXR5Lm1vZGVsRnVuY3Rpb25Db3VudCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5IYW5kbGVyIGZ1bmN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVudGl0eS5oYW5kbGVyRnVuY3Rpb25Db3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdW50LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVuY3Rpb25zKHVuaXQsICdoYW5kbGVyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW50aXR5LmhhbmRsZXJGdW5jdGlvbkNvdW50IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4wPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q29kZSBmdW5jdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICh1bml0LmZ1bmN0aW9uQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudC1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bmN0aW9ucyh1bml0LCAnY2xhc3MnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB1bml0LmZ1bmN0aW9uQ291bnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cblxuICAgICAgICBAaWYgKCFmaWx0ZXJlZFVuaXRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1YmhlYWRpbmdcIj5Ob3RoaW5nIG1hdGNoZXMg4oCce3sgZmlsdGVyKCkgfX3igJ0uPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgcGljdHVyZTogdGFibGVzIHRoZSBBSSBjYW4ndCByZWFjaC4gRXhjbHVkZWRcbiAgICAgICAgICAgb25lcyBoYXZlIG5vIG1vZGVsOyB1bmxpbmtlZCBqdW5jdGlvbnMgaGF2ZSBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVxuICAgICAgICAgICBidXQgd2VyZSBmb2xkZWQgaW50byBubyByZWxhdGlvbnNoaXAsIHNvIG5vdGhpbmcgY2FuIG5hdmlnYXRlIHRvXG4gICAgICAgICAgIHRoZW0uIEJvdGggYXJlIGludmlzaWJsZSBieSBvbWlzc2lvbiDigJQgbm8gZXJyb3IsIGp1c3QgYSBjYXBhYmlsaXR5XG4gICAgICAgICAgIHRoYXQgc2lsZW50bHkgaXNuJ3QgdGhlcmUuIENvbGxhcHNlZCBieSBkZWZhdWx0OiB0aGUgZXhjbHVkZWQgbGlzdCBpc1xuICAgICAgICAgICBsb25nIGFuZCBtb3N0bHkgZnJhbWV3b3JrIHBsdW1iaW5nLiAtLT5cbiAgICAgIEBpZiAoaGFzQ2F0YWxvZygpKSB7XG4gICAgICAgIDxoMj5Ob3QgaW4gdGhlIHNlbWFudGljIGRhdGFiYXNlPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YmhlYWRpbmdcIj5cbiAgICAgICAgICBUYWJsZXMgdGhlIHJlcG9ydCBBSSBjYW4ndCBzZWUuIEdpdmUgb25lIGEgbW9kZWwgdG8gcHJvbW90ZSBpdCB0byBhblxuICAgICAgICAgIGVudGl0eSwgdGhlbiByZWJ1aWxkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJjYXRhbG9nXCI+XG4gICAgICAgICAgQGlmIChleGNsdWRlZFRhYmxlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgVGFibGVzIGV4Y2x1ZGVkICh7eyBleGNsdWRlZFRhYmxlcygpLmxlbmd0aCB9fSlcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICA8IS0tIERlZmVycmVkOiB0aGUgYm9keSBvbmx5IGV4aXN0cyBvbmNlIGV4cGFuZGVkLiAtLT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFpci1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWJsZSBvZiBleGNsdWRlZFRhYmxlcygpOyB0cmFjayB0YWJsZS50YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFpci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhaXItbmFtZVwiPnt7IHRhYmxlLnRhYmxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRhYmxlLnJlYXNvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAodW5saW5rZWRKdW5jdGlvbnMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIEp1bmN0aW9ucyBub3QgbGlua2VkICh7eyB1bmxpbmtlZEp1bmN0aW9ucygpLmxlbmd0aCB9fSlcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgIExpbmsgdGFibGVzIHRoZSBidWlsZCBjb3VsZG4ndCBmb2xkIGludG8gYSByZWxhdGlvbnNoaXAg4oCUIHNvXG4gICAgICAgICAgICAgICAgICBuZWl0aGVyIHRoZXkgbm9yIHdoYXQgdGhleSBsaW5rIGNhbiBiZSByZXBvcnRlZCBvbi5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFibGUgb2YgdW5saW5rZWRKdW5jdGlvbnMoKTsgdHJhY2sgdGFibGUudGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWlyLW5hbWVcIj57eyB0YWJsZS50YWJsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0YWJsZS5yZWFzb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2NvbXBvbmVudHMvc2VtYW50aWMtZGF0YWJhc2Uvc2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2NvbXBvbmVudHMvc2VtYW50aWMtZGF0YWJhc2Uvc2VtYW50aWMtZGF0YWJhc2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5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QUFDLE1BQU07ZUFDakUsU0FBUyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNuRSxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7YUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsQ0FBQyxNQUEyQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7d0dBaFhVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDBHQ3JFdEMsb2dWQXlQQSw0NUJENUxJLGtCQUFrQixxMEJBQ2xCLGdCQUFnQiw0VEFDaEIsWUFBWSxxWEFDWixZQUFZLDRJQUNaLGVBQWUseUhBQ2YsZ0JBQWdCOzs0RkFHUCx5QkFBeUI7a0JBZnJDLFNBQVM7K0JBQ0UsZ0RBQWdELG1CQUd6Qyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgU3RyZWFtRXZlbnRUeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7IEZzQ2hpcE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2NoaXAnO1xuaW1wb3J0IHsgRnNEYXRlTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGF0ZSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvY2Vzcyc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBGc1NrZWxldG9uTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2tlbGV0b24nO1xuXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIFNlbWFudGljQnVpbGRDbGFzcyxcbiAgU2VtYW50aWNCdWlsZEVudGl0eSxcbiAgU2VtYW50aWNCdWlsZFN0YXR1cyxcbiAgU2VtYW50aWNCdWlsZFRhYmxlLFxuICBTZW1hbnRpY0Z1bmN0aW9uU291cmNlLFxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudCc7XG5cblxuLy8gT25lIHJvdyBvZiB0aGUgc2NvcmVib2FyZC4gVGhlIGJ1aWxkIGNhY2hlcyB0d28ga2luZHMgb2YgdW5pdCBhbmQgdGhlIHJlcG9ydFxuLy8gQUkgcmVhZHMgY29kZSBmcm9tIGJvdGgsIHNvIHRoZXkgYmVsb25nIGluIE9ORSBsaXN0OiBhbiBlbnRpdHkgKGEgdGFibGUgcGx1c1xuLy8gaXRzIG1vZGVsIGFuZCBoYW5kbGVyKSBhbmQgYSBzdGFuZGFsb25lIGNvZGUgY2xhc3MgKGRvbWFpbiBsb2dpYyB3aXRoIG5vXG4vLyB0YWJsZSDigJQgYSBzdW1tYXJ5IG1vZGVsLCBhIGNhbGN1bGF0aW9uIHNlcnZpY2UpLiBBIGNsYXNzIHJvdyBzaW1wbHkgaGFzIG5vXG4vLyB0YWJsZSwgY29sdW1ucyBvciByZWxhdGlvbnNoaXBzIHRvIHNob3cuXG5pbnRlcmZhY2UgU2VtYW50aWNVbml0VmlldyB7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGhhc1RhYmxlOiBib29sZWFuO1xuICBlbnRpdHk6IFNlbWFudGljQnVpbGRFbnRpdHkgfCBudWxsO1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgZnVuY3Rpb25Db3VudDogbnVtYmVyO1xufVxuXG5cbi8vIFRoZSBTZW1hbnRpYyBEYXRhYmFzZSB0YWI6IHRoZSBzY29yZWJvYXJkIG9mIGV2ZXJ5dGhpbmcgdGhlIHJlcG9ydCBBSSB3YXNcbi8vIGJ1aWx0IGZyb20uIFNob3dzIHRoZSBsYXN0IGJ1aWxkJ3Mgc3RhdHVzLCBydW5zIChvciBzdG9wcykgYSBidWlsZCDigJQgc3RyZWFtZWRcbi8vIGludG8gdGhlIEZzUHJvY2VzcyBkb2NrIHNvIGl0IHN1cnZpdmVzIHRoZSBkaWFsb2cgY2xvc2luZyDigJQgYW5kIGRyaWxscyBpbnRvXG4vLyBldmVyeSB1bml0IHRvIHJldmVhbCBpdHMgc2hhcGUsIGlubGluZWQgZW51bSB2YWx1ZXMsIGNvbXB1dGVkIGZpZWxkcyBhbmQgaXRzXG4vLyBjYWNoZWQgZnVuY3Rpb24gY291bnRzLCB3aG9zZSBsaW5rcyBvcGVuIHRoZSBmdW5jdGlvbnMgZGlhbG9nICh0aGUgZnVsbFxuLy8gZnVuY3Rpb24gc2V0IGlzIGZhciB0b28gYmlnIHRvIHNoaXAgd2l0aCB0aGUgc2NvcmVib2FyZCkuXG4vL1xuLy8gSXQgYWxzbyByZXBvcnRzIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBwaWN0dXJlOiB0aGUgdGFibGVzIHRoZSBBSSBDQU5OT1Qgc2VlIOKAlFxuLy8gZXhjbHVkZWQgb25lcyAobm8gbW9kZWwpIGFuZCBqdW5jdGlvbnMgdGhhdCBicmlkZ2VkIG5vdGhpbmcuIFRob3NlIGFyZVxuLy8gaW52aXNpYmxlIGJ5IG9taXNzaW9uIG90aGVyd2lzZTogbm90aGluZyBlcnJvcnMsIHRoZSBjYXBhYmlsaXR5IGp1c3QgaXNuJ3Rcbi8vIHRoZXJlLCBhbmQgdGhlIGZpcnN0IGFueW9uZSBsZWFybnMgaXMgYSB3cm9uZyBhbnN3ZXIgb3IgYSByZWZ1c2FsLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1zZW1hbnRpYy1kYXRhYmFzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZW1hbnRpYy1kYXRhYmFzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbWFudGljLWRhdGFiYXNlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgRnNDaGlwTW9kdWxlLFxuICAgIEZzRGF0ZU1vZHVsZSxcbiAgICBGc01lc3NhZ2VNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudCB7XG5cbiAgLy8gVGhlIGJ1aWxkLWluLWZsaWdodCBzdGF0ZXMgb2YgdGhlIGZmX3Byb2Nlc3NlcyByb3cgKHF1ZXVlZC9ydW5uaW5nL3N0b3BwaW5nKS5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUNUSVZFX1NUQVRFUyA9IFsnUScsICdSJywgJ1gnXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVEFURV9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgUTogJ1F1ZXVlZCcsXG4gICAgUjogJ1J1bm5pbmcnLFxuICAgIFg6ICdTdG9wcGluZycsXG4gICAgQzogJ0NvbXBsZXRlZCcsXG4gICAgSzogJ1N0b3BwZWQnLFxuICAgIEY6ICdGYWlsZWQnLFxuICB9O1xuXG4gIC8vIFRoZSBzdHJlYW1lZCBmcmFtZXMgdGhhdCBjYXJyeSBhIGxpbmUgZm9yIHRoZSBmZWVkOiBwcm9ncmVzcywgYW5kIHRoZSBmaW5hbFxuICAvLyBmcmFtZSB0aGUgYmFja2VuZCBzZW5kcyB3aGVuIGEgcnVuIGVuZHMgYmFkbHkuIFdpdGhvdXQgdGhlIGVycm9yIGtpbmQgdGhlXG4gIC8vIGZlZWQgc3RvcHMgb24gdGhlIGxhc3QgcHJvZ3Jlc3MgbGluZSBhbmQgbmV2ZXIgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExPR19LSU5EUyA9IFsnbG9nJywgJ2Vycm9yJ107XG5cbiAgLy8gQSByb3cgdGhhdCBpcyBzdGlsbCBvd2VkIGNvbnRlbnQgc2F5cyBzbzsgYSBidWlsdCBvbmUgc2F5cyBub3RoaW5nLiBPbiBhXG4gIC8vIGZpbmlzaGVkIGJ1aWxkIGV2ZXJ5IHN0YWdlIGlzIGRvbmUgb24gZXZlcnkgcm93LCBzbyBjaGlwcGluZyB0aGVtIGFsbCB3YXNcbiAgLy8gbm9pc2UgdGhhdCBidXJpZWQgdGhlIG9uZSByb3cgdGhhdCBtYXR0ZXJlZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUEVORElOR19DT0xPUiA9ICcjYjI2NTAwJztcblxuICAvLyBDbGFzcy1uYW1lIHN1ZmZpeCBzdHJpcHBlZCBmb3IgZGlzcGxheTogYEJ1ZGdldFN1bW1hcnlNb2RlbGAgcmVhZHMgYXNcbiAgLy8gYEJ1ZGdldFN1bW1hcnlgLiBPbmx5IGBNb2RlbGAg4oCUIHN0cmlwcGluZyBgSGFuZGxlcmAgdG9vIHdvdWxkIGNvbGxpZGVcbiAgLy8gYFdvcmtPcmRlck9uZVRpbWVIYW5kbGVyYCB3aXRoIGBXb3JrT3JkZXJPbmVUaW1lTW9kZWxgLCB3aGljaCBhcmUgdHdvXG4gIC8vIHNlcGFyYXRlIHVuaXRzLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOQU1FX1NVRkZJWCA9ICdNb2RlbCc7XG5cbiAgLy8gbnVsbCB1bnRpbCBsb2FkZWQg4oCUIGdhdGVzIHRoZSB0YWIgYmVoaW5kIHRoZSBza2VsZXRvbi5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cyA9IHNpZ25hbDxTZW1hbnRpY0J1aWxkU3RhdHVzIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gRnJlZS10ZXh0IGZpbHRlciBvdmVyIHRoZSB1bml0IGxpc3Qg4oCUIGF0IGEgZmV3IGh1bmRyZWQgcm93cyB0aGUgYWNjb3JkaW9uXG4gIC8vIGlzIG9ubHkgdXNhYmxlIGlmIHlvdSBjYW4gbmFycm93IGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8vIFRydWUgd2hpbGUgYSBidWlsZCBzdGFydGVkIGZyb20gdGhpcyB0YWIgaXMgc3RyZWFtaW5nIGludG8gdGhlIGRvY2suXG4gIHB1YmxpYyByZWFkb25seSBidWlsZGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkQWN0aXZlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT5cbiAgICB0aGlzLmJ1aWxkaW5nKClcbiAgICAgIHx8IFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuQUNUSVZFX1NUQVRFUy5pbmNsdWRlcyh0aGlzLnN0YXR1cygpPy5idWlsZD8uc3RhdGUpLFxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBidWlsZFN0YXRlTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+XG4gICAgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudC5TVEFURV9MQUJFTFNbdGhpcy5zdGF0dXMoKT8uYnVpbGQ/LnN0YXRlXSA/PyAnJyxcbiAgKTtcblxuICAvLyBBbiBhcnRpZmFjdCBidWlsdCBiZWZvcmUgdGhlIGNhdGFsb2cgZXhpc3RlZCBjYXJyaWVzIG5vIHRhYmxlcy4gRXZlcnl0aGluZ1xuICAvLyBjYXRhbG9nLWRyaXZlbiBzdGF5cyBoaWRkZW4gcmF0aGVyIHRoYW4gY2xhaW1pbmcgXCIwIGV4Y2x1ZGVkXCIsIHdoaWNoIHdvdWxkXG4gIC8vIGJlIGEgbGllIOKAlCBhIHJlYnVpbGQgZmlsbHMgaXQgaW4uXG4gIHB1YmxpYyByZWFkb25seSBoYXNDYXRhbG9nID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gISF0aGlzLnN0YXR1cygpPy5kZXRhaWw/LnRhYmxlcz8ubGVuZ3RoKTtcblxuICAvLyBUYWJsZXMgd2l0aCBubyBtb2RlbDogdGhlIHJlcG9ydCBBSSBjYW4ndCBzZWUgdGhlbSBhdCBhbGwuIEFkZCBhIG1vZGVsIHRvXG4gIC8vIHByb21vdGUgb25lIHRvIGFuIGVudGl0eS5cbiAgcHVibGljIHJlYWRvbmx5IGV4Y2x1ZGVkVGFibGVzID0gY29tcHV0ZWQ8U2VtYW50aWNCdWlsZFRhYmxlW10+KCgpID0+XG4gICAgdGhpcy5fdGFibGVzKCkuZmlsdGVyKCh0YWJsZSkgPT4gdGFibGUuY2xhc3NpZmljYXRpb24gPT09ICdleGNsdWRlZCcpLFxuICApO1xuXG4gIC8vIExpbmsgdGFibGVzIHRoYXQgYnJpZGdlZCBub3RoaW5nIOKAlCBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBtYWRlIHRoZW0gYVxuICAvLyBqdW5jdGlvbiwgYnV0IHRoZXkgd2VyZSBmb2xkZWQgaW50byBubyByZWxhdGlvbnNoaXAsIHNvIG5laXRoZXIgdGhleSBub3JcbiAgLy8gd2hhdCB0aGV5IGxpbmsgYXJlIHJlYWNoYWJsZS5cbiAgcHVibGljIHJlYWRvbmx5IHVubGlua2VkSnVuY3Rpb25zID0gY29tcHV0ZWQ8U2VtYW50aWNCdWlsZFRhYmxlW10+KCgpID0+XG4gICAgdGhpcy5fdGFibGVzKCkuZmlsdGVyKCh0YWJsZSkgPT4gdGFibGUuY2xhc3NpZmljYXRpb24gPT09ICdqdW5jdGlvbicgJiYgISF0YWJsZS5yZWFzb24pLFxuICApO1xuXG4gIC8vIEV2ZXJ5dGhpbmcgdGhlIGJ1aWxkIGNhY2hlZCwgZW50aXRpZXMgYW5kIHN0YW5kYWxvbmUgY29kZSBjbGFzc2VzIHRvZ2V0aGVyLFxuICAvLyBpbiBvbmUgbGlzdCBvcmRlcmVkIGJ5IHRoZSBuYW1lIGEgcmVhZGVyIHJlY29nbml6ZXMuIFR3byBhcnJheXMgb24gdGhlIHdpcmVcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSBnZW51aW5lbHkgZGlmZmVyZW50IHNoYXBlczsgb25lIGxpc3Qgb24gc2NyZWVuIGJlY2F1c2VcbiAgLy8gXCJ3aGF0IGRpZCB0aGUgYnVpbGQgcmVhZD9cIiBpcyBhIHNpbmdsZSBxdWVzdGlvbi5cbiAgcHVibGljIHJlYWRvbmx5IHVuaXRzID0gY29tcHV0ZWQ8U2VtYW50aWNVbml0Vmlld1tdPigoKSA9PiB7XG4gICAgY29uc3QgZGV0YWlsID0gdGhpcy5zdGF0dXMoKT8uZGV0YWlsO1xuICAgIGlmICghZGV0YWlsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXRpZXMgPSAoZGV0YWlsLmVudGl0aWVzID8/IFtdKS5tYXAoKGVudGl0eSkgPT4gKHtcbiAgICAgIGtleTogZW50aXR5LmtleSxcbiAgICAgIG5hbWU6IHRoaXMuX2Rpc3BsYXlOYW1lKGVudGl0eS5tb2RlbCwgZW50aXR5LmtleSksXG4gICAgICBoYXNUYWJsZTogdHJ1ZSxcbiAgICAgIGVudGl0eSxcbiAgICAgIG1vZGVsOiBlbnRpdHkubW9kZWwsXG4gICAgICBmdW5jdGlvbkNvdW50OiBlbnRpdHkuZnVuY3Rpb25Db3VudCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjbGFzc2VzID0gKGRldGFpbC5jbGFzc2VzID8/IFtdKS5tYXAoKHVuaXQ6IFNlbWFudGljQnVpbGRDbGFzcykgPT4gKHtcbiAgICAgIGtleTogdW5pdC5rZXksXG4gICAgICBuYW1lOiB0aGlzLl9kaXNwbGF5TmFtZSh1bml0Lm1vZGVsLCB1bml0LmtleSksXG4gICAgICBoYXNUYWJsZTogZmFsc2UsXG4gICAgICBlbnRpdHk6IG51bGwsXG4gICAgICBtb2RlbDogdW5pdC5tb2RlbCxcbiAgICAgIGZ1bmN0aW9uQ291bnQ6IHVuaXQuZnVuY3Rpb25Db3VudCxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gWy4uLmVudGl0aWVzLCAuLi5jbGFzc2VzXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9KTtcblxuICAvLyBUaGUgZmlsdGVyIG1hdGNoZXMgdGhlIGRpc3BsYXkgbmFtZSwgdGhlIGNsYXNzIGFuZCB0aGUgZW50aXR5IGtleSwgc29cbiAgLy8gaHVudGluZyBieSBhbnkgb2YgdGhlIHRocmVlIHdvcmtzLlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyZWRVbml0cyA9IGNvbXB1dGVkPFNlbWFudGljVW5pdFZpZXdbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuaXRzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudW5pdHMoKS5maWx0ZXIoKHVuaXQpID0+XG4gICAgICBgJHt1bml0Lm5hbWV9ICR7dW5pdC5tb2RlbCA/PyAnJ30gJHt1bml0LmtleX1gLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBDb3ZlcmFnZSBsaW5lLiBBc3NlbWJsZWQgaGVyZSBiZWNhdXNlIHRoZSBjYXRhbG9nIHBhcnRzIGRyb3Agb3V0XG4gIC8vIGVudGlyZWx5IG9uIGEgcHJlLWNhdGFsb2cgYXJ0aWZhY3QsIHdoaWNoIHJlYWRzIGJhZGx5IGFzIHRlbXBsYXRlIGJyYW5jaGVzLlxuICBwdWJsaWMgcmVhZG9ubHkgY292ZXJhZ2UgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBjb25zdCBkZXRhaWwgPSB0aGlzLnN0YXR1cygpPy5kZXRhaWw7XG4gICAgaWYgKCFkZXRhaWwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IFtgJHtkZXRhaWwuZW50aXR5Q291bnR9IGVudGl0aWVzYCwgYCR7ZGV0YWlsLmNsYXNzQ291bnR9IGNvZGUgY2xhc3Nlc2BdO1xuXG4gICAgaWYgKHRoaXMuaGFzQ2F0YWxvZygpKSB7XG4gICAgICBwYXJ0cy5wdXNoKGRldGFpbC51bmxpbmtlZEp1bmN0aW9uQ291bnRcbiAgICAgICAgPyBgJHtkZXRhaWwuanVuY3Rpb25Db3VudH0ganVuY3Rpb25zICgke2RldGFpbC51bmxpbmtlZEp1bmN0aW9uQ291bnR9IG5vdCBsaW5rZWQpYFxuICAgICAgICA6IGAke2RldGFpbC5qdW5jdGlvbkNvdW50fSBqdW5jdGlvbnNgKTtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKGAke2RldGFpbC5mdW5jdGlvbkNvdW50fSBjb2RlIGZ1bmN0aW9uc2ApO1xuXG4gICAgaWYgKHRoaXMuaGFzQ2F0YWxvZygpKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2RldGFpbC5leGNsdWRlZENvdW50fSB0YWJsZXMgZXhjbHVkZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignIMK3ICcpO1xuICB9KTtcblxuICAvLyBUaGUgdGFibGUgY2F0YWxvZywgb3IgW10gd2hlbiB0aGUgc3RhdHVzIGhhc24ndCBsb2FkZWQgb3IgdGhlIGFydGlmYWN0XG4gIC8vIHByZWRhdGVzIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXMgPSBjb21wdXRlZDxTZW1hbnRpY0J1aWxkVGFibGVbXT4oKCkgPT4gdGhpcy5zdGF0dXMoKT8uZGV0YWlsPy50YWJsZXMgPz8gW10pO1xuXG4gIC8vIEd1YXJkcyB0aGUgb3V0Y29tZSBtZXNzYWdlIHRvIGZpcmUgZXhhY3RseSBvbmNlIHBlciBydW4g4oCUIHdoZXRoZXIgdGhlIHN0cmVhbVxuICAvLyBjb21wbGV0ZXMgKGJ1aWxkIGZpbmlzaGVkLCBwb3NzaWJseSBmYWlsZWQpIG9yIGVycm9ycyBvdXRyaWdodC5cbiAgcHJpdmF0ZSBfYnVpbGRGaW5hbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgLy8gQ29uZmlybSBiZWZvcmUga2lja2luZyBvZmYgYSBidWlsZCDigJQgYSByZWJ1aWxkIHJlcGxhY2VzIHRoZSBjdXJyZW50XG4gIC8vIHNlbWFudGljIGRhdGFiYXNlLCBzbyBpdCBzaG91bGQgbmV2ZXIgZmlyZSBvbiBhIHN0cmF5IGNsaWNrLlxuICBwdWJsaWMgYnVpbGQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVidWlsZCA9ICEhdGhpcy5zdGF0dXMoKT8uZGV0YWlsPy5nZW5lcmF0ZWRBdDtcblxuICAgIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgIHRpdGxlOiByZWJ1aWxkID8gJ1JlYnVpbGQgc2VtYW50aWMgZGF0YWJhc2UnIDogJ0J1aWxkIHNlbWFudGljIGRhdGFiYXNlJyxcbiAgICAgIHRlbXBsYXRlOiByZWJ1aWxkXG4gICAgICAgID8gJ1JlYnVpbGQgdGhlIHNlbWFudGljIGRhdGFiYXNlPyBJdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kIGFuZCByZXBsYWNlcyB0aGUgY3VycmVudCBvbmUgd2hlbiBpdCBmaW5pc2hlcy4nXG4gICAgICAgIDogJ0J1aWxkIHRoZSBzZW1hbnRpYyBkYXRhYmFzZT8gSXQgcnVucyBpbiB0aGUgYmFja2dyb3VuZC4nLFxuICAgICAgY29tbWl0TGFiZWw6IHJlYnVpbGQgPyAnUmVidWlsZCcgOiAnQnVpbGQnLFxuICAgIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3J1bkJ1aWxkKCkpO1xuICB9XG5cbiAgcHVibGljIHN0b3BCdWlsZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ1N0b3AgYnVpbGQnLFxuICAgICAgdGVtcGxhdGU6ICdTdG9wIHRoZSBydW5uaW5nIGJ1aWxkPyBUaGUgY3VycmVudCBzZW1hbnRpYyBkYXRhYmFzZSBzdGF5cyBpbiBwbGFjZSB1bnRpbCBhIGJ1aWxkIGZpbmlzaGVzLicsXG4gICAgICBjb21taXRMYWJlbDogJ1N0b3AnLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3JlcG9ydERhdGEuc2VtYW50aWNCdWlsZFN0b3AoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmJ1aWxkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU3RvcHBpbmcgdGhlIGJ1aWxk4oCmJyk7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hTdGF0dXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gUnVuIHRoZSBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZC4gVGhlIGxpdmUgZmVlZCBzdHJlYW1zIGludG8gdGhlIEZzUHJvY2Vzc1xuICAvLyBkb2NrIChib3R0b20tcmlnaHQpLCB3aG9zZSBzdWJzY3JpcHRpb24gc3Vydml2ZXMgdGhpcyBkaWFsb2cgY2xvc2luZyDigJQgc29cbiAgLy8gZGlzbWlzc2luZyB0aGUgZGlhbG9nIG5ldmVyIGludGVycnVwdHMgYSBydW5uaW5nIGJ1aWxkLlxuICBwcml2YXRlIF9ydW5CdWlsZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLl9idWlsZEZpbmFsaXplZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdGFyZ2V0JCA9IHRoaXMuX3JlcG9ydERhdGEuc2VtYW50aWNCdWlsZCgpXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gQSBoYXJkIHN0cmVhbS90cmFuc3BvcnQgZmFpbHVyZSAodGhlIGJ1aWxkIGNvdWxkbid0IGV2ZW4gc3RhcnQpXG4gICAgICAgIC8vIGZpbmFsaXplcyBoZXJlIOKAlCBjb21wbGV0ZWQkIHdvbid0IGZpcmUgaW4gdGhhdCBjYXNlLlxuICAgICAgICB0YXAoeyBlcnJvcjogKGVycm9yKSA9PiB0aGlzLl9maW5hbGl6ZUJ1aWxkKGVycm9yKSB9KSxcbiAgICAgICAgZmlsdGVyKChldmVudCkgPT5cbiAgICAgICAgICBldmVudD8udHlwZSA9PT0gU3RyZWFtRXZlbnRUeXBlLkRhdGFcbiAgICAgICAgICAmJiBTZW1hbnRpY0RhdGFiYXNlQ29tcG9uZW50LkxPR19LSU5EUy5pbmNsdWRlcyhldmVudC5kYXRhPy5raW5kKVxuICAgICAgICAgICYmIHR5cGVvZiBldmVudC5kYXRhLmxpbmUgPT09ICdzdHJpbmcnKSxcbiAgICAgICAgbWFwKChldmVudCkgPT4gZXZlbnQuZGF0YS5saW5lIGFzIHN0cmluZyksXG4gICAgICApO1xuXG4gICAgdGhpcy5fcHJvY2Vzc1xuICAgICAgLnJ1bignU2VtYW50aWMgZGF0YWJhc2UgYnVpbGQnLCB0YXJnZXQkKVxuICAgICAgLmNvbXBsZXRlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZpbmFsaXplQnVpbGQobnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdXAgb25lIGJ1aWxkIHJ1biBleGFjdGx5IG9uY2UuIE9uIGEgaGFyZCBzdHJlYW0gZXJyb3IsIHN1cmZhY2UgdGhlXG4gICAqIGFjdHVhbCBzZXJ2ZXItc2lkZSByZWFzb24gcHVsbGVkIG9mZiB0aGUgYnJva2VuIHN0cmVhbSDigJQgdGhlIGdlbmVyaWNcbiAgICogXCJjb3VsZCBub3QgcnVuXCIgbGluZSBvbmx5IHdoZW4gdGhlIGZhaWx1cmUgY2FycmllZCBubyBzZXJ2ZXIgdGV4dCBhdCBhbGw7XG4gICAqIG90aGVyd2lzZSByZWZyZXNoIHRoZSBzdGF0dXMgYW5kIGFubm91bmNlIGhvdyB0aGUgYnVpbGQgYWN0dWFsbHkgZW5kZWQuIEFcbiAgICogZmFpbGVkIGJ1aWxkIGFsd2F5cyBuYW1lcyBpdHMgcmVhc29uIG9uIHRoZSByb3cgKHRoZSBiYWNrZW5kIHJlY29yZHMgb25lIGZvclxuICAgKiBldmVyeSB3YXkgYSBydW4gY2FuIGRpZSwgZmF0YWxzIGluY2x1ZGVkKSwgYW5kIHRoYXQgcmVhc29uIG11c3Qgc3VyZmFjZVxuICAgKiBpbnN0ZWFkIG9mIHRoZSBydW4gc2lsZW50bHkgZG9pbmcgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmFsaXplQnVpbGQoc3RyZWFtRXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYnVpbGRGaW5hbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYnVpbGRGaW5hbGl6ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5idWlsZGluZy5zZXQoZmFsc2UpO1xuXG4gICAgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSB0aGlzLl9zdHJlYW1FcnJvckRldGFpbChzdHJlYW1FcnJvcik7XG5cbiAgICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoZGV0YWlsXG4gICAgICAgID8gYFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBidWlsZCBmYWlsZWQg4oCUICR7ZGV0YWlsfWBcbiAgICAgICAgOiAnVGhlIHNlbWFudGljIGRhdGFiYXNlIGJ1aWxkIGNvdWxkIG5vdCBydW4g4oCUIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgd2FzIGxvc3QuJyk7XG4gICAgICB0aGlzLl9yZWZyZXNoU3RhdHVzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnNlbWFudGljQnVpbGRTdGF0dXMoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBTZW1hbnRpY0J1aWxkU3RhdHVzKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzLnNldChzdGF0dXMpO1xuICAgICAgICB0aGlzLl9hbm5vdW5jZU91dGNvbWUoc3RhdHVzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWFsIHJlYXNvbiBhIGJyb2tlbiBidWlsZCBzdHJlYW0gYnJva2UsIGZyb20gd2hhdCB0aGUgc2VydmVyIGFjdHVhbGx5XG4gICAqIHNlbnQuIEEgc3RydWN0dXJlZCBlcnJvciBmcmFtZSBhcnJpdmVzIGFzIHttZXNzYWdlfSBvbiB0aGUgZXJyb3IgYm9keTsgYVxuICAgKiBtaWQtc3RyZWFtIGNyYXNoIGR1bXBzIHJhdyB0ZXh0IGludG8gdGhlIHN0cmVhbSAodGhlIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBoYW5kcyBpdCBiYWNrIGFzIHN0YXR1c1RleHQpLCB3aGVyZSB0aGUgZnJhbWVzIGFyZSBKU09OIGxpbmVzIGFuZCB0aGVcbiAgICogZmlyc3Qgbm9uLUpTT04gbGluZXMgYXJlIHRoZSBlcnJvciBhbmQgaXRzIGxvY2F0aW9uLiAnJyB3aGVuIHRoZSBmYWlsdXJlXG4gICAqIGNhcnJpZWQgbm8gc2VydmVyIHRleHQgYXQgYWxsICh0cmFuc3BvcnQgZG93biAvIHNlcnZlciB1bnJlYWNoYWJsZSkuXG4gICAqL1xuICBwcml2YXRlIF9zdHJlYW1FcnJvckRldGFpbChzdHJlYW1FcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgZXJyb3IgPSBzdHJlYW1FcnJvciBhcyB7IGVycm9yPzogeyBtZXNzYWdlPzogc3RyaW5nIH07IHN0YXR1c1RleHQ/OiBzdHJpbmcgfTtcblxuICAgIGlmIChlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBlcnJvci5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBlcnJvcj8uc3RhdHVzVGV4dDtcbiAgICBpZiAoIXN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCA9PT0gJ1Vua25vd24gRXJyb3InKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBzdGF0dXNUZXh0LnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiB7XG4gICAgICAgIGlmICghbGluZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgSlNPTi5wYXJzZShsaW5lKTtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIDIpLmpvaW4oJyDigJQgJykuc3Vic3RyaW5nKDAsIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgb3BlcmF0b3IgaG93IHRoZSBidWlsZCBlbmRlZDogYSBmYWlsZWQvc3RvcHBlZCBidWlsZCBzdXJmYWNlcyBpdHNcbiAgICogcmVhc29uIChzbyBhbiBBSSBjb25uZWN0aW9uIHByb2JsZW0gaXMgbmV2ZXIgc2lsZW50KSwgYSBjb21wbGV0ZWQgb25lXG4gICAqIGNvbmZpcm1zIHN1Y2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIF9hbm5vdW5jZU91dGNvbWUoc3RhdHVzOiBTZW1hbnRpY0J1aWxkU3RhdHVzKTogdm9pZCB7XG4gICAgY29uc3QgYnVpbGQgPSBzdGF0dXM/LmJ1aWxkO1xuICAgIGlmIChidWlsZD8uc3RhdGUgPT09ICdGJyB8fCBidWlsZD8uc3RhdGUgPT09ICdLJykge1xuICAgICAgdGhpcy5fbWVzc2FnZS5lcnJvcihidWlsZC5tZXNzYWdlIHx8ICdUaGUgc2VtYW50aWMgZGF0YWJhc2UgYnVpbGQgZGlkIG5vdCBmaW5pc2guJyk7XG4gICAgfSBlbHNlIGlmIChidWlsZD8uc3RhdGUgPT09ICdDJykge1xuICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTZW1hbnRpYyBkYXRhYmFzZSBidWlsZCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGVuZGluZ0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuUEVORElOR19DT0xPUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgc3RhZ2VzIHRoaXMgcm93IGlzIHN0aWxsIG93ZWQsIG9yIFtdIHdoZW4gaXQgaXMgZnVsbHkgYnVpbHQuIEFcbiAgICogc3RvcHBlZCBvciBpbnRlcnJ1cHRlZCBidWlsZCBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGEgbm9uLWVtcHR5IGxpc3QuXG4gICAqL1xuICBwdWJsaWMgcGVuZGluZ1N0YWdlcyh1bml0OiBTZW1hbnRpY1VuaXRWaWV3KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YWdlcyA9IHVuaXQuZW50aXR5Py5zdGFnZXM7XG5cbiAgICByZXR1cm4gc3RhZ2VzXG4gICAgICA/IE9iamVjdC5rZXlzKHN0YWdlcykuZmlsdGVyKChzdGFnZSkgPT4gc3RhZ2VzW3N0YWdlXSAhPT0gJ2RvbmUnKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyLnNldCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgY2hpbGQgZGlhbG9nIGxpc3Rpbmcgb25lIGdyb3VwIG9mIGEgdW5pdCdzIGNhY2hlZCBmdW5jdGlvbnMg4oCUIGFuXG4gICAqIGVudGl0eSdzIG1vZGVsIG9yIGhhbmRsZXIgY2xhc3MsIG9yIGEgc3RhbmRhbG9uZSBjbGFzcydzIGNvZGUuIFRoZSBkaWFsb2dcbiAgICogZmV0Y2hlcyBmcmVzaCBvbiBvcGVuLCBzbyB0aGUgdGFiIG5ldmVyIGhvbGRzIGZ1bmN0aW9uIHBheWxvYWRzLlxuICAgKi9cbiAgcHVibGljIG9wZW5GdW5jdGlvbnModW5pdDogU2VtYW50aWNVbml0Vmlldywgc291cmNlOiBTZW1hbnRpY0Z1bmN0aW9uU291cmNlKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzcwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTV2dycsXG4gICAgICBtYXhIZWlnaHQ6ICc4NXZoJyxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICBkYXRhOiB7IGVudGl0eUtleTogdW5pdC5rZXksIHNvdXJjZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoU3RhdHVzKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIHJlYWRlciByZWNvZ25pemVzIHRoZSB1bml0IGJ5OiBpdHMgY2xhc3MncyBzaG9ydCBuYW1lLCBtaW51cyB0aGVcbiAgICogYE1vZGVsYCBzdWZmaXggdGhhdCBldmVyeSBtb2RlbCBjYXJyaWVzIGFuZCBub25lIG9mIHRoZW0gYXJlIGRpc3Rpbmd1aXNoZWRcbiAgICogYnkuIEZhbGxzIGJhY2sgdG8gdGhlIGNhY2hlIGtleSBmb3IgYSB1bml0IHdob3NlIGNsYXNzIGNvdWxkIG5vdCBiZVxuICAgKiByZXNvbHZlZCwgc28gYSByb3cgbmV2ZXIgcmVuZGVycyBuYW1lbGVzcy5cbiAgICovXG4gIHByaXZhdGUgX2Rpc3BsYXlOYW1lKG1vZGVsOiBzdHJpbmcgfCBudWxsLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG9ydE5hbWUgPSBtb2RlbC5zcGxpdCgnXFxcXCcpLnBvcCgpO1xuXG4gICAgcmV0dXJuIHNob3J0TmFtZS5sZW5ndGggPiBTZW1hbnRpY0RhdGFiYXNlQ29tcG9uZW50Lk5BTUVfU1VGRklYLmxlbmd0aFxuICAgICAgJiYgc2hvcnROYW1lLmVuZHNXaXRoKFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQuTkFNRV9TVUZGSVgpXG4gICAgICA/IHNob3J0TmFtZS5zbGljZSgwLCAtU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudC5OQU1FX1NVRkZJWC5sZW5ndGgpXG4gICAgICA6IHNob3J0TmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hTdGF0dXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zZW1hbnRpY0J1aWxkU3RhdHVzKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1czogU2VtYW50aWNCdWlsZFN0YXR1cykgPT4gdGhpcy5zdGF0dXMuc2V0KHN0YXR1cykpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gIDxwIGNsYXNzPVwiaGludFwiPlxuICAgIFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBpcyB3aGF0IHRoZSByZXBvcnQgQUkgdXNlcyB0byB1bmRlcnN0YW5kIHlvdXIgZGF0YSDigJRcbiAgICB0YWJsZXMsIHJlbGF0aW9uc2hpcHMgYW5kIHRoZSBjYWxjdWxhdGlvbnMgaW4gY29kZS4gUmVidWlsZCBpdCBhZnRlclxuICAgIHNpZ25pZmljYW50IGFwcGxpY2F0aW9uIHVwZGF0ZXMuIFRoZSBidWlsZCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kOyBwcm9ncmVzc1xuICAgIGFwcGVhcnMgaW4gdGhlIGRvY2sgYXQgdGhlIGJvdHRvbSByaWdodCBhbmQgdGhpcyBkaWFsb2cgY2FuIGJlIGNsb3NlZCB3aGlsZVxuICAgIGl0IHJ1bnMuXG4gIDwvcD5cblxuICA8ZGl2ICpmc1NrZWxldG9uPVwic3RhdHVzKClcIj5cbiAgICBAaWYgKHN0YXR1cygpOyBhcyBidWlsZFN0YXR1cykge1xuICAgICAgPGRpdiBjbGFzcz1cImJ1aWxkLXN0YXR1c1wiPlxuICAgICAgICBAaWYgKGJ1aWxkU3RhdHVzLmRldGFpbC5nZW5lcmF0ZWRBdCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+TGFzdCBidWlsdDwvc3Bhbj5cbiAgICAgICAgICAgIDxmcy1kYXRlXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwiYnVpbGRTdGF0dXMuZGV0YWlsLmdlbmVyYXRlZEF0XCJcbiAgICAgICAgICAgICAgICBmb3JtYXQ9XCJkYXRlLXRpbWVcIj5cbiAgICAgICAgICAgIDwvZnMtZGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkNvdmVyYWdlPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+e3sgY292ZXJhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGZzLW1lc3NhZ2Utd2FybmluZz5cbiAgICAgICAgICAgIFRoZSBzZW1hbnRpYyBkYXRhYmFzZSBoYXMgbm90IGJlZW4gYnVpbHQgeWV0IOKAlCB0aGUgcmVwb3J0IEFJIGNhbid0XG4gICAgICAgICAgICBhbnN3ZXIgZGF0YSBxdWVzdGlvbnMgdW50aWwgaXQgaXMuIFJ1biB0aGUgZmlyc3QgYnVpbGQuXG4gICAgICAgICAgPC9mcy1tZXNzYWdlLXdhcm5pbmc+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChidWlsZFN0YXR1cy5idWlsZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+TGFzdCBidWlsZCBydW48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAge3sgYnVpbGRTdGF0ZUxhYmVsKCkgfX1cbiAgICAgICAgICAgICAgQGlmIChidWlsZFN0YXR1cy5idWlsZC5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAg4oCUIHt7IGJ1aWxkU3RhdHVzLmJ1aWxkLm1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFdmVyeXRoaW5nIHRoZSBidWlsZCByZWFkLCBpbiBvbmUgbGlzdDogZW50aXRpZXMgKGEgdGFibGUgKyBhIG1vZGVsICtcbiAgICAgICAgICAgYSBoYW5kbGVyKSBhbmQgc3RhbmRhbG9uZSBjb2RlIGNsYXNzZXMgKGRvbWFpbiBsb2dpYyB3aXRoIG5vIHRhYmxlKS5cbiAgICAgICAgICAgVGhlIEFJIHJlYWRzIGNvZGUgZnJvbSBib3RoLCBzbyBzcGxpdHRpbmcgdGhlbSBpbnRvIHR3byBzZWN0aW9uc1xuICAgICAgICAgICB3b3VsZCBoaWRlIGhhbGYgb2Ygd2hhdCB3YXMgYnVpbHQuIEVhY2ggcm93IGRyaWxscyBpbnRvIGl0cyBzaGFwZSxcbiAgICAgICAgICAgZW51bSB2YWx1ZXMsIGNvbXB1dGVkIGZpZWxkcyBhbmQgY2FjaGVkIGZ1bmN0aW9uIGNvdW50cyDigJQgdGhlIGNvdW50c1xuICAgICAgICAgICBsaW5rIGludG8gdGhlIGZ1bmN0aW9ucyBkaWFsb2cuIC0tPlxuICAgICAgQGlmICh1bml0cygpLmxlbmd0aCkge1xuICAgICAgICA8aDI+SW5jbHVkZWQgKHt7IHVuaXRzKCkubGVuZ3RoIH19KTwvaDI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nXCI+XG4gICAgICAgICAgRXZlcnl0aGluZyB0aGUgcmVwb3J0IEFJIHdhcyBidWlsdCBmcm9tLiBFbnRpdGllcyBjYW4gYmUgcXVlcmllZDtcbiAgICAgICAgICBjb2RlIGNsYXNzZXMgYXJlIGxvZ2ljIGl0IHJlYWRzIGFuZCB0cmFuc2xhdGVzIGludG8gU1FMLlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwidW5pdC1maWx0ZXJcIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBieSBuYW1lLCBjbGFzcyBvciBrZXnigKZcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlcigpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZXRGaWx0ZXIoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIj5cblxuICAgICAgICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cImVudGl0aWVzXCI+XG4gICAgICAgICAgQGZvciAodW5pdCBvZiBmaWx0ZXJlZFVuaXRzKCk7IHRyYWNrIHVuaXQua2V5KSB7XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+e3sgdW5pdC5uYW1lIH19PC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFnZS1jaGlwc1wiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCF1bml0Lmhhc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWNoaXAgc2l6ZT1cInRpbnlcIiBtYXRUb29sdGlwPVwiRG9tYWluIGxvZ2ljIHdpdGggbm8gdGFibGUg4oCUIHJlYWQsIG5ldmVyIHF1ZXJpZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWNoaXA+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTaWxlbmNlIG1lYW5zIGJ1aWx0LiBBIGNoaXAgaGVyZSBtZWFucyBhbiBpbnRlcnJ1cHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIGxlZnQgdGhpcyByb3cgb3dpbmcgY29udGVudC4gLS0+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHN0YWdlIG9mIHBlbmRpbmdTdGFnZXModW5pdCk7IHRyYWNrIHN0YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInRpbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cInBlbmRpbmdDb2xvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5lZWRzIGJ1aWxkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzdGFnZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgPCEtLSBEZWZlcnJlZDogdGhlIGJvZHkgb25seSBleGlzdHMgb25jZSBleHBhbmRlZC4gLS0+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRFeHBhbnNpb25QYW5lbENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudGl0eS1kZXRhaWxcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAodW5pdC5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5DbGFzczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB1bml0Lm1vZGVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAodW5pdC5lbnRpdHk7IGFzIGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5UYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkudGFibGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBoYW5kbGUgdGhlIHJlcG9ydCBBSSBhZGRyZXNzZXMgdGhpcyBlbnRpdHkgYnkgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZV9lbnRpdHkgLyBjb21waWxlX3F1ZXJ5LiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+RW50aXR5IGtleTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q29sdW1uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkuY29sdW1ucyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJlbGF0aW9uc2hpcHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZW50aXR5LnJlbGF0aW9uc2hpcHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGVudGl0eS5lbnVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPkVudW1lcmF0aW9uIHZhbHVlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWlyLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZW51bUNvbHVtbiBvZiBlbnRpdHkuZW51bXM7IHRyYWNrIGVudW1Db2x1bW4uY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhaXItbmFtZVwiPnt7IGVudW1Db2x1bW4uY29sdW1uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZW51bUNvbHVtbi52YWx1ZXMuam9pbignLCAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChlbnRpdHkuY29tcHV0ZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Db21wdXRlZCBmaWVsZHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbnRpdHkuY29tcHV0ZWRGaWVsZHMuam9pbignLCAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5Nb2RlbCBmdW5jdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChlbnRpdHkubW9kZWxGdW5jdGlvbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnQtbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdW5jdGlvbnModW5pdCwgJ21vZGVsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW50aXR5Lm1vZGVsRnVuY3Rpb25Db3VudCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5IYW5kbGVyIGZ1bmN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVudGl0eS5oYW5kbGVyRnVuY3Rpb25Db3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdW50LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVuY3Rpb25zKHVuaXQsICdoYW5kbGVyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZW50aXR5LmhhbmRsZXJGdW5jdGlvbkNvdW50IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4wPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+Q29kZSBmdW5jdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICh1bml0LmZ1bmN0aW9uQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudC1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bmN0aW9ucyh1bml0LCAnY2xhc3MnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB1bml0LmZ1bmN0aW9uQ291bnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cblxuICAgICAgICBAaWYgKCFmaWx0ZXJlZFVuaXRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1YmhlYWRpbmdcIj5Ob3RoaW5nIG1hdGNoZXMg4oCce3sgZmlsdGVyKCkgfX3igJ0uPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgcGljdHVyZTogdGFibGVzIHRoZSBBSSBjYW4ndCByZWFjaC4gRXhjbHVkZWRcbiAgICAgICAgICAgb25lcyBoYXZlIG5vIG1vZGVsOyB1bmxpbmtlZCBqdW5jdGlvbnMgaGF2ZSBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVxuICAgICAgICAgICBidXQgd2VyZSBmb2xkZWQgaW50byBubyByZWxhdGlvbnNoaXAsIHNvIG5vdGhpbmcgY2FuIG5hdmlnYXRlIHRvXG4gICAgICAgICAgIHRoZW0uIEJvdGggYXJlIGludmlzaWJsZSBieSBvbWlzc2lvbiDigJQgbm8gZXJyb3IsIGp1c3QgYSBjYXBhYmlsaXR5XG4gICAgICAgICAgIHRoYXQgc2lsZW50bHkgaXNuJ3QgdGhlcmUuIENvbGxhcHNlZCBieSBkZWZhdWx0OiB0aGUgZXhjbHVkZWQgbGlzdCBpc1xuICAgICAgICAgICBsb25nIGFuZCBtb3N0bHkgZnJhbWV3b3JrIHBsdW1iaW5nLiAtLT5cbiAgICAgIEBpZiAoaGFzQ2F0YWxvZygpKSB7XG4gICAgICAgIDxoMj5Ob3QgaW4gdGhlIHNlbWFudGljIGRhdGFiYXNlPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YmhlYWRpbmdcIj5cbiAgICAgICAgICBUYWJsZXMgdGhlIHJlcG9ydCBBSSBjYW4ndCBzZWUuIEdpdmUgb25lIGEgbW9kZWwgdG8gcHJvbW90ZSBpdCB0byBhblxuICAgICAgICAgIGVudGl0eSwgdGhlbiByZWJ1aWxkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJjYXRhbG9nXCI+XG4gICAgICAgICAgQGlmIChleGNsdWRlZFRhYmxlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgVGFibGVzIGV4Y2x1ZGVkICh7eyBleGNsdWRlZFRhYmxlcygpLmxlbmd0aCB9fSlcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICA8IS0tIERlZmVycmVkOiB0aGUgYm9keSBvbmx5IGV4aXN0cyBvbmNlIGV4cGFuZGVkLiAtLT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFpci1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWJsZSBvZiBleGNsdWRlZFRhYmxlcygpOyB0cmFjayB0YWJsZS50YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFpci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhaXItbmFtZVwiPnt7IHRhYmxlLnRhYmxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHRhYmxlLnJlYXNvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAodW5saW5rZWRKdW5jdGlvbnMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICAgIEp1bmN0aW9ucyBub3QgbGlua2VkICh7eyB1bmxpbmtlZEp1bmN0aW9ucygpLmxlbmd0aCB9fSlcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgIExpbmsgdGFibGVzIHRoZSBidWlsZCBjb3VsZG4ndCBmb2xkIGludG8gYSByZWxhdGlvbnNoaXAg4oCUIHNvXG4gICAgICAgICAgICAgICAgICBuZWl0aGVyIHRoZXkgbm9yIHdoYXQgdGhleSBsaW5rIGNhbiBiZSByZXBvcnRlZCBvbi5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFibGUgb2YgdW5saW5rZWRKdW5jdGlvbnMoKTsgdHJhY2sgdGFibGUudGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWlyLW5hbWVcIj57eyB0YWJsZS50YWJsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0YWJsZS5yZWFzb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -4,6 +4,7 @@ import { catchError } from 'rxjs/operators';
4
4
  import { format } from 'date-fns';
5
5
  import { ReportData } from '../data/report.data';
6
6
  import { FREQUENCY_OPTIONS, } from '../interfaces/report.interface';
7
+ import { loadGroupOptions, resolveOptionValues } from '../report-filter-items';
7
8
  import { ReportFilterStateService } from '../services/report-filter-state.service';
8
9
  import * as i0 from "@angular/core";
9
10
  // Rows fetched for a list component's export table — enough to fill a
@@ -26,8 +27,10 @@ export class ReportExportCollectorService {
26
27
  }
27
28
  });
28
29
  const all$ = requests.length ? forkJoin(requests) : of([]);
29
- return all$
30
- .pipe(map((collected) => {
30
+ // The summary rides alongside the component data rather than being built at
31
+ // the end, because naming a select filter's values is itself a request.
32
+ return forkJoin({ collected: all$, filterSummary: this._filterSummary(report) })
33
+ .pipe(map(({ collected, filterSummary }) => {
31
34
  const pages = report.pages.map((page) => ({ page, components: [] }));
32
35
  collected.forEach((item, index) => {
33
36
  pages[slots[index].pageIndex].components.push(item);
@@ -35,7 +38,7 @@ export class ReportExportCollectorService {
35
38
  return {
36
39
  report,
37
40
  pages,
38
- filterSummary: this._filterSummary(report),
41
+ filterSummary,
39
42
  };
40
43
  }));
41
44
  }
@@ -51,8 +54,12 @@ export class ReportExportCollectorService {
51
54
  return this._reportData.componentData(report.id, component.id, filters, state)
52
55
  .pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
53
56
  }
54
- // "Report Period: Jun 12, 2025 – Jun 12, 2026", "Organization: A, B" — one
55
- // line per filter group that has an active session value.
57
+ // "Report Period: Jun 12, 2025 – Jun 12, 2026", "Organization: Alnylam - AHP,
58
+ // Alnylam - PH1" — one line per filter group that has an active session value.
59
+ //
60
+ // A select group stores ids, so its line has to be named off the option list
61
+ // before it can be printed; a date or keyword group already holds its own
62
+ // display value and resolves synchronously.
56
63
  _filterSummary(report) {
57
64
  const lines = [];
58
65
  for (const group of report.filterGroups ?? []) {
@@ -62,21 +69,34 @@ export class ReportExportCollectorService {
62
69
  }
63
70
  const label = group.label || 'Filter';
64
71
  if (value.start || value.end) {
65
- lines.push(`${label}: ${this._date(value.start)} – ${this._date(value.end)}`);
72
+ lines.push(of(`${label}: ${this._date(value.start)} – ${this._date(value.end)}`));
66
73
  }
67
74
  else if (value.values?.length) {
68
- lines.push(`${label}: ${value.values.map((item) => String(item)).join(', ')}`);
75
+ lines.push(this._selectLine(label, group, report.id, value.values));
69
76
  }
70
77
  else if (value.value?.trim()) {
71
- lines.push(`${label}: "${value.value.trim()}"`);
78
+ lines.push(of(`${label}: "${value.value.trim()}"`));
72
79
  }
73
80
  }
74
81
  const frequency = this._filterState.frequency();
75
82
  if (frequency) {
76
83
  const option = FREQUENCY_OPTIONS.find((item) => item.value === frequency);
77
- lines.push(`Frequency: ${option?.name ?? frequency}`);
84
+ lines.push(of(`Frequency: ${option?.name ?? frequency}`));
78
85
  }
79
- return lines;
86
+ return lines.length ? forkJoin(lines) : of([]);
87
+ }
88
+ // One select group's line, with its stored ids resolved to the same names the
89
+ // on-screen chips show — a cover reading "Organization: 8774, 8777" tells the
90
+ // client nothing about what the report covers.
91
+ //
92
+ // Uses the report bar's own loader and resolver so the two can't drift, which
93
+ // also means a value whose entity was deleted keeps showing its raw id rather
94
+ // than dropping off the cover and silently understating the filter. A failed
95
+ // option fetch degrades the whole line to ids for the same reason: an export
96
+ // must never fail on a cosmetic lookup.
97
+ _selectLine(label, group, reportId, values) {
98
+ return resolveOptionValues(loadGroupOptions(group, this._reportData, reportId), values)
99
+ .pipe(map((resolved) => `${label}: ${resolved.map((item) => item.name).join(', ')}`), catchError(() => of(`${label}: ${values.map((item) => String(item)).join(', ')}`)));
80
100
  }
81
101
  _date(value) {
82
102
  if (!value) {
@@ -91,4 +111,4 @@ export class ReportExportCollectorService {
91
111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
92
112
  type: Injectable
93
113
  }] });
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxpQkFBaUIsR0FJbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFvQm5GLHNFQUFzRTtBQUN0RSxrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0IsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsbUVBQW1FO0FBRW5FLE1BQU0sT0FBTyw0QkFBNEI7SUFFL0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFakQsT0FBTyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxRQUFRLEdBQXFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFDO1FBRTFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFO1lBQ3ZDLEtBQUssTUFBTSxT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RUFBRSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQXVDO1FBQ25ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEYsQ0FBQzt3R0EzRlUsNEJBQTRCOzRHQUE1Qiw0QkFBNEI7OzRGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgRlJFUVVFTkNZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZENvbXBvbmVudCB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDsgLy8gbnVsbCA9IGl0cyBxdWVyeSBmYWlsZWQ7IGV4cG9ydHMgc2hvdyBhIG5vdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xufVxuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCBjb21wb25lbnQncyBleHBvcnQgdGFibGUg4oCUIGVub3VnaCB0byBmaWxsIGFcbi8vIHNsaWRlL3BhZ2UgdGFibGU7IHRoZSBjYXAgbm90ZSBjb3ZlcnMgdGhlIHJlc3QuXG5jb25zdCBMSVNUX0VYUE9SVF9ST1dTID0gMTAwO1xuXG4vLyBHYXRoZXJzIGV2ZXJ5dGhpbmcgYW4gZXhwb3J0IG5lZWRzOiBldmVyeSBjb21wb25lbnQncyBkYXRhIGFjcm9zcyBBTEwgcGFnZXNcbi8vICh0aGUgY2FudmFzIG9ubHkgcmVuZGVycyB0aGUgYWN0aXZlIHBhZ2UsIHNvIGV4cG9ydHMgY2FuJ3Qgc2NyYXBlIHRoZVxuLy8gc2NyZWVuKSwgZmV0Y2hlZCBmcmVzaCB3aXRoIHRoZSB2aWV3ZXIncyBjdXJyZW50IGZpbHRlciBzdGF0ZS4gT25lIGZhaWxlZFxuLy8gY29tcG9uZW50IGRlZ3JhZGVzIHRvIGEgbm90ZSBpbiB0aGUgZGVjaywgbmV2ZXIgYSBmYWlsZWQgZXhwb3J0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgcHVibGljIGNvbGxlY3QocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPENvbGxlY3RlZFJlcG9ydD4ge1xuICAgIGNvbnN0IHJlcXVlc3RzOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD5bXSA9IFtdO1xuICAgIGNvbnN0IHNsb3RzOiB7IHBhZ2VJbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgcmVwb3J0LnBhZ2VzLmZvckVhY2goKHBhZ2UsIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgcGFnZS5jb21wb25lbnRzKSB7XG4gICAgICAgIHNsb3RzLnB1c2goeyBwYWdlSW5kZXggfSk7XG4gICAgICAgIHJlcXVlc3RzLnB1c2godGhpcy5fY29tcG9uZW50RGF0YShyZXBvcnQsIGNvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxsJCA9IHJlcXVlc3RzLmxlbmd0aCA/IGZvcmtKb2luKHJlcXVlc3RzKSA6IG9mKFtdIGFzIENvbGxlY3RlZENvbXBvbmVudFtdKTtcblxuICAgIHJldHVybiBhbGwkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChjb2xsZWN0ZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10gfSkpO1xuICAgICAgICAgIGNvbGxlY3RlZC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcGFnZXNbc2xvdHNbaW5kZXhdLnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgICAgIHBhZ2VzLFxuICAgICAgICAgICAgZmlsdGVyU3VtbWFyeTogdGhpcy5fZmlsdGVyU3VtbWFyeShyZXBvcnQpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBvbmVudERhdGEocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIC8vIEEgdGltZS1zZXJpZXMgY2hhcnQgY2FycmllcyB0aGUgdmlld2VyJ3MgRnJlcXVlbmN5IG92ZXJyaWRlIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nLlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IExJU1RfRVhQT1JUX1JPV1MgfVxuICAgICAgOiAoaXNUaW1lU2VyaWVzICYmIGZyZXF1ZW5jeSA/IHsgZnJlcXVlbmN5IH0gOiB7fSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+ICh7IGNvbXBvbmVudCwgZGF0YSB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFwiUmVwb3J0IFBlcmlvZDogSnVuIDEyLCAyMDI1IOKAkyBKdW4gMTIsIDIwMjZcIiwgXCJPcmdhbml6YXRpb246IEEsIEJcIiDigJQgb25lXG4gIC8vIGxpbmUgcGVyIGZpbHRlciBncm91cCB0aGF0IGhhcyBhbiBhY3RpdmUgc2Vzc2lvbiB2YWx1ZS5cbiAgcHJpdmF0ZSBfZmlsdGVyU3VtbWFyeShyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCk7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGdyb3VwLmxhYmVsIHx8ICdGaWx0ZXInO1xuXG4gICAgICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bGFiZWx9OiAke3RoaXMuX2RhdGUodmFsdWUuc3RhcnQpfSDigJMgJHt0aGlzLl9kYXRlKHZhbHVlLmVuZCl9YCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bGFiZWx9OiAke3ZhbHVlLnZhbHVlcy5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSkuam9pbignLCAnKX1gKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGlmIChmcmVxdWVuY3kpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEZSRVFVRU5DWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGZyZXF1ZW5jeSk7XG4gICAgICBsaW5lcy5wdXNoKGBGcmVxdWVuY3k6ICR7b3B0aW9uPy5uYW1lID8/IGZyZXF1ZW5jeX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuICfigKYnO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcblxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdChkYXRlLCAnTU1NIGQsIHl5eXknKTtcbiAgfVxufVxuIl19
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxpQkFBaUIsR0FLbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUFvQm5GLHNFQUFzRTtBQUN0RSxrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0IsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsbUVBQW1FO0FBRW5FLE1BQU0sT0FBTyw0QkFBNEI7SUFFL0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFakQsT0FBTyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxRQUFRLEdBQXFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFDO1FBRTFDLE1BQU0sQ0FBQyxLQUFLLENBQUMs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QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNuRixDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUF1QztRQUNuRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7d0dBdkhVLDRCQUE0Qjs0R0FBNUIsNEJBQTRCOzs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBtYXAsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIEZSRVFVRU5DWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIGRhdGE6IENvbXBvbmVudERhdGEgfCBudWxsOyAvLyBudWxsID0gaXRzIHF1ZXJ5IGZhaWxlZDsgZXhwb3J0cyBzaG93IGEgbm90ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFBhZ2Uge1xuICBwYWdlOiBSZXBvcnRQYWdlO1xuICBjb21wb25lbnRzOiBDb2xsZWN0ZWRDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRSZXBvcnQge1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXTtcbiAgLy8gSHVtYW4tcmVhZGFibGUgbGluZXMgZGVzY3JpYmluZyB0aGUgYWN0aXZlIGZpbHRlcnMsIGZvciB0aGUgdGl0bGUgc2xpZGUvcGFnZS5cbiAgZmlsdGVyU3VtbWFyeTogc3RyaW5nW107XG59XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0IGNvbXBvbmVudCdzIGV4cG9ydCB0YWJsZSDigJQgZW5vdWdoIHRvIGZpbGwgYVxuLy8gc2xpZGUvcGFnZSB0YWJsZTsgdGhlIGNhcCBub3RlIGNvdmVycyB0aGUgcmVzdC5cbmNvbnN0IExJU1RfRVhQT1JUX1JPV1MgPSAxMDA7XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLiBPbmUgZmFpbGVkXG4vLyBjb21wb25lbnQgZGVncmFkZXMgdG8gYSBub3RlIGluIHRoZSBkZWNrLCBuZXZlciBhIGZhaWxlZCBleHBvcnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgY29sbGVjdChyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8Q29sbGVjdGVkUmVwb3J0PiB7XG4gICAgY29uc3QgcmVxdWVzdHM6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PltdID0gW107XG4gICAgY29uc3Qgc2xvdHM6IHsgcGFnZUluZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCB9KTtcbiAgICAgICAgcmVxdWVzdHMucHVzaCh0aGlzLl9jb21wb25lbnREYXRhKHJlcG9ydCwgY29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGwkID0gcmVxdWVzdHMubGVuZ3RoID8gZm9ya0pvaW4ocmVxdWVzdHMpIDogb2YoW10gYXMgQ29sbGVjdGVkQ29tcG9uZW50W10pO1xuXG4gICAgLy8gVGhlIHN1bW1hcnkgcmlkZXMgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YSByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdFxuICAgIC8vIHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgZmlsdGVyU3VtbWFyeTogdGhpcy5fZmlsdGVyU3VtbWFyeShyZXBvcnQpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgZmlsdGVyU3VtbWFyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXSA9IHJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IHBhZ2UsIGNvbXBvbmVudHM6IFtdIH0pKTtcbiAgICAgICAgICBjb2xsZWN0ZWQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHBhZ2VzW3Nsb3RzW2luZGV4XS5wYWdlSW5kZXhdLmNvbXBvbmVudHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBwYWdlcyxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgLy8gQSB0aW1lLXNlcmllcyBjaGFydCBjYXJyaWVzIHRoZSB2aWV3ZXIncyBGcmVxdWVuY3kgb3ZlcnJpZGUgc28gdGhlIGV4cG9ydFxuICAgIC8vIHJlLWJ1Y2tldHMgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGRvZXM7IGxpc3RzIGNhcnJ5IHRoZWlyIGV4cG9ydCBwYWdpbmcuXG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3QgaXNUaW1lU2VyaWVzID0gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJztcbiAgICBjb25zdCBzdGF0ZSA9IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgID8geyBwYWdlOiAxLCBwYWdlU2l6ZTogTElTVF9FWFBPUlRfUk9XUyB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEocmVwb3J0LmlkLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4gKHsgY29tcG9uZW50LCBkYXRhIH0pKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCB9KSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gXCJSZXBvcnQgUGVyaW9kOiBKdW4gMTIsIDIwMjUg4oCTIEp1biAxMiwgMjAyNlwiLCBcIk9yZ2FuaXphdGlvbjogQWxueWxhbSAtIEFIUCxcbiAgLy8gQWxueWxhbSAtIFBIMVwiIOKAlCBvbmUgbGluZSBwZXIgZmlsdGVyIGdyb3VwIHRoYXQgaGFzIGFuIGFjdGl2ZSBzZXNzaW9uIHZhbHVlLlxuICAvL1xuICAvLyBBIHNlbGVjdCBncm91cCBzdG9yZXMgaWRzLCBzbyBpdHMgbGluZSBoYXMgdG8gYmUgbmFtZWQgb2ZmIHRoZSBvcHRpb24gbGlzdFxuICAvLyBiZWZvcmUgaXQgY2FuIGJlIHByaW50ZWQ7IGEgZGF0ZSBvciBrZXl3b3JkIGdyb3VwIGFscmVhZHkgaG9sZHMgaXRzIG93blxuICAvLyBkaXNwbGF5IHZhbHVlIGFuZCByZXNvbHZlcyBzeW5jaHJvbm91c2x5LlxuICBwcml2YXRlIF9maWx0ZXJTdW1tYXJ5KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGxpbmVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgJ0ZpbHRlcic7XG5cbiAgICAgIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7dGhpcy5fZGF0ZSh2YWx1ZS5zdGFydCl9IOKAkyAke3RoaXMuX2RhdGUodmFsdWUuZW5kKX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5fc2VsZWN0TGluZShsYWJlbCwgZ3JvdXAsIHJlcG9ydC5pZCwgdmFsdWUudmFsdWVzKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06IFwiJHt2YWx1ZS52YWx1ZS50cmltKCl9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGZyZXF1ZW5jeSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gRlJFUVVFTkNZX09QVElPTlMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gZnJlcXVlbmN5KTtcbiAgICAgIGxpbmVzLnB1c2gob2YoYEZyZXF1ZW5jeTogJHtvcHRpb24/Lm5hbWUgPz8gZnJlcXVlbmN5fWApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMubGVuZ3RoID8gZm9ya0pvaW4obGluZXMpIDogb2YoW10pO1xuICB9XG5cbiAgLy8gT25lIHNlbGVjdCBncm91cCdzIGxpbmUsIHdpdGggaXRzIHN0b3JlZCBpZHMgcmVzb2x2ZWQgdG8gdGhlIHNhbWUgbmFtZXMgdGhlXG4gIC8vIG9uLXNjcmVlbiBjaGlwcyBzaG93IOKAlCBhIGNvdmVyIHJlYWRpbmcgXCJPcmdhbml6YXRpb246IDg3NzQsIDg3NzdcIiB0ZWxscyB0aGVcbiAgLy8gY2xpZW50IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGUgcmVwb3J0IGNvdmVycy5cbiAgLy9cbiAgLy8gVXNlcyB0aGUgcmVwb3J0IGJhcidzIG93biBsb2FkZXIgYW5kIHJlc29sdmVyIHNvIHRoZSB0d28gY2FuJ3QgZHJpZnQsIHdoaWNoXG4gIC8vIGFsc28gbWVhbnMgYSB2YWx1ZSB3aG9zZSBlbnRpdHkgd2FzIGRlbGV0ZWQga2VlcHMgc2hvd2luZyBpdHMgcmF3IGlkIHJhdGhlclxuICAvLyB0aGFuIGRyb3BwaW5nIG9mZiB0aGUgY292ZXIgYW5kIHNpbGVudGx5IHVuZGVyc3RhdGluZyB0aGUgZmlsdGVyLiBBIGZhaWxlZFxuICAvLyBvcHRpb24gZmV0Y2ggZGVncmFkZXMgdGhlIHdob2xlIGxpbmUgdG8gaWRzIGZvciB0aGUgc2FtZSByZWFzb246IGFuIGV4cG9ydFxuICAvLyBtdXN0IG5ldmVyIGZhaWwgb24gYSBjb3NtZXRpYyBsb29rdXAuXG4gIHByaXZhdGUgX3NlbGVjdExpbmUoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICB2YWx1ZXM6IHVua25vd25bXSxcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCksIHZhbHVlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc29sdmVkKSA9PiBgJHtsYWJlbH06ICR7cmVzb2x2ZWQubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpLmpvaW4oJywgJyl9YCksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoYCR7bGFiZWx9OiAke3ZhbHVlcy5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSkuam9pbignLCAnKX1gKSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAn4oCmJztcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IFN0cmluZyh2YWx1ZSkgOiBmb3JtYXQoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG4gIH1cbn1cbiJdfQ==
@@ -118,7 +118,7 @@ export class ReportPdfService {
118
118
  const config = component.config;
119
119
  const row = data.rows[0] ?? {};
120
120
  const column = config.measure?.column ?? Object.keys(row)[0];
121
- const value = formatMeasureValue(row[column], config.measure?.format);
121
+ const value = formatMeasureValue(row[column], config.measure?.format, config.measure?.precision);
122
122
  doc.setFont('helvetica', 'bold');
123
123
  doc.setFontSize(26);
124
124
  doc.setTextColor('#1f2933');
@@ -153,4 +153,4 @@ export class ReportPdfService {
153
153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
154
154
  type: Injectable
155
155
  }] });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU8vQyxPQUFPLEVBQXFCLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFJckQsa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbkIsdUVBQXVFO0FBQ3ZFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSx3RUFBd0U7QUFDeEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUVoRixNQUFNLE9BQU8sZ0JBQWdCO0lBRXBCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBMEI7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUU1RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcs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ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBmb3JtYXRNZWFzdXJlVmFsdWUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7IC8vIENvbXBvbmVudERhdGEgdXNlZCBpbiBtZXRob2Qgc2lnbmF0dXJlcyBiZWxvd1xuaW1wb3J0IHsgQ29tcG9uZW50R2VvbWV0cnksIHBhZ2VHZW9tZXRyeSB9IGZyb20gJy4uL2xheW91dCc7XG5pbXBvcnQgeyByZW5kZXJDaGFydEltYWdlIH0gZnJvbSAnLi9vZmZzY3JlZW4tY2hhcnQnO1xuaW1wb3J0IHsgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRSZXBvcnQgfSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuLy8gQXBwcm94aW1hdGUgdGFibGUgcm93IGhlaWdodCwgcG9pbnRzIOKAlCBkcml2ZXMgdGhlIHJvd3MtdGhhdC1maXQgY2FwLlxuY29uc3QgVEFCTEVfUk9XX0ggPSAxNjtcblxuLy8gQnVpbGRzIHRoZSBQREYgY2xpZW50LXNpZGUgd2l0aCBqc3BkZi4gVGhlIHJlcG9ydCdzIHVuaXQgaXMgaW5jaGVzIGFuZCBQREZzXG4vLyBhcmUgcG9pbnRzIGF0IGV4YWN0bHkgNzIvaW5jaCwgc28gZWFjaCByZXBvcnQgcGFnZSBiZWNvbWVzIG9uZSBQREYgcGFnZSBvZlxuLy8gdGhlIGV4YWN0IHBoeXNpY2FsIHNpemUgYW5kIGNvbXBvbmVudHMgbGFuZCBhdCB0aGVpciBwcmVjaXNlIHBvc2l0aW9ucy5cbi8vIENoYXJ0cyBhcmUgcmVuZGVyZWQgdGhyb3VnaCBhbiBvZmZzY3JlZW4gRUNoYXJ0cyBpbnN0YW5jZSBhdCAzw5cgcGl4ZWxcbi8vIHJhdGlvIOKAlCBwaXhlbC1pZGVudGljYWwgdG8gdGhlIHNjcmVlbiwgY3Jpc3AgYXQgcHJpbnQgc2l6ZSDigJQgYW5kIHRhYmxlcyBhcmVcbi8vIGRyYXduIHdpdGgganNwZGYtYXV0b3RhYmxlLiBCb3RoIGxpYnJhcmllcyBsb2FkIGxhemlseSBpbnRvIHRoZWlyIG93biBjaHVua3MuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsganNQREYgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgICBjb25zdCBhdXRvVGFibGUgPSAoYXdhaXQgaW1wb3J0KCdqc3BkZi1hdXRvdGFibGUnKSkuZGVmYXVsdDtcblxuICAgIGNvbnN0IHJlcG9ydCA9IGNvbGxlY3RlZC5yZXBvcnQ7XG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHtcbiAgICAgIG9yaWVudGF0aW9uOiBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JyxcbiAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdGl0bGVQYWdlKGRvYywgY29sbGVjdGVkLCBwYWdlVywgcGFnZUgpO1xuXG4gICAgZm9yIChjb25zdCBjb2xsZWN0ZWRQYWdlIG9mIGNvbGxlY3RlZC5wYWdlcykge1xuICAgICAgZG9jLmFkZFBhZ2UoW3BhZ2VXLCBwYWdlSF0sIHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnKTtcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gcGFnZUdlb21ldHJ5KHJlcG9ydCwgY29sbGVjdGVkUGFnZS5wYWdlKTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoZG9jLCBhdXRvVGFibGUsIGl0ZW0sIGdlb21ldHJ5LmdldChpdGVtLmNvbXBvbmVudC5pZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvYy5zYXZlKGAke3RoaXMuX3NsdWcocmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgZm9ybWF0KG5ldyBEYXRlKCksICdNTU1NIGQsIHl5eXknKSxcbiAgICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIF07XG4gICAgZG9jLnRleHQobGluZXMsIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoZG9jOiBhbnksIGF1dG9UYWJsZTogYW55LCBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIGdlb21ldHJ5PzogQ29tcG9uZW50R2VvbWV0cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtLmNvbXBvbmVudDtcbiAgICAvLyBHZW9tZXRyeSBhcnJpdmVzIGluIGluY2hlcyAoZmxvdyBsYXlvdXQgcHJlLXJlc29sdmVkKTsgdGhlIFBERiBkcmF3cyBpblxuICAgIC8vIHBvaW50cy5cbiAgICBjb25zdCBpbmNoZXMgPSBnZW9tZXRyeSA/PyBjb21wb25lbnQ7XG4gICAgY29uc3QgeCA9IGluY2hlcy54ICogUFQ7XG4gICAgY29uc3QgeSA9IGluY2hlcy55ICogUFQ7XG4gICAgY29uc3QgdyA9IGluY2hlcy53ICogUFQ7XG4gICAgY29uc3QgaCA9IGluY2hlcy5oICogUFQ7XG5cbiAgICBpZiAoY29tcG9uZW50LnRpdGxlKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICAgIGRvYy50ZXh0KGNvbXBvbmVudC50aXRsZSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHlZID0geSArIFRJVExFX0g7XG4gICAgY29uc3QgYm9keUggPSBNYXRoLm1heCgyMCwgaCAtIFRJVExFX0gpO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEgfHwgIWl0ZW0uZGF0YS5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnaXRhbGljJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICBkb2MudGV4dChpdGVtLmRhdGEgPyAnTm8gZGF0YScgOiAnRGF0YSB1bmF2YWlsYWJsZScsIHggKyB3IC8gMiwgYm9keVkgKyBib2R5SCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShkb2MsIGF1dG9UYWJsZSwgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGRvYywgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGRvYzogYW55LFxuICAgIGF1dG9UYWJsZTogYW55LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIExpc3RDb25maWc7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZy5jb2x1bW5zPy5sZW5ndGhcbiAgICAgID8gY29uZmlnLmNvbHVtbnNcbiAgICAgIDogZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIGxhYmVsOiBjb2x1bW4gfSkpO1xuXG4gICAgY29uc3QgY2FwID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihoIC8gVEFCTEVfUk9XX0gpIC0gMSk7XG4gICAgY29uc3Qgcm93cyA9IGRhdGEucm93cy5zbGljZSgwLCBjYXApO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IChkYXRhLnBhZ2luZz8udG90YWwgPz8gZGF0YS5yb3dzLmxlbmd0aCkgLSByb3dzLmxlbmd0aDtcblxuICAgIGNvbnN0IGJvZHkgPSByb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9jZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLmZvcm1hdCkpKTtcblxuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBib2R5LnB1c2goW2DigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgXSk7XG4gICAgfVxuXG4gICAgYXV0b1RhYmxlKGRvYywge1xuICAgICAgaGVhZDogW2NvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKV0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZOiB5LFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHggfSxcbiAgICAgIHRhYmxlV2lkdGg6IHcsXG4gICAgICBzdHlsZXM6IHsgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgZG9jOiBhbnksXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHJvdyA9IGRhdGEucm93c1swXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb25maWcubWVhc3VyZT8uY29sdW1uID8/IE9iamVjdC5rZXlzKHJvdylbMF07XG4gICAgY29uc3QgdmFsdWUgPSBmb3JtYXRNZWFzdXJlVmFsdWUocm93W2NvbHVtbl0sIGNvbmZpZy5tZWFzdXJlPy5mb3JtYXQpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI2KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgIGlmIChjb25maWcubWVhc3VyZT8ubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICBkb2MudGV4dChjb25maWcubWVhc3VyZS5sYWJlbCwgeCArIHcgLyAyLCB5ICsgaCAvIDIgKyAxNiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGV4cG9ydGVkIGNlbGwgbXVzdCByZWFkIGxpa2UgdGhlIG9uLXNjcmVlbiBjZWxsOiB0aGUgU1FMIGFscmVhZHlcbiAgLy8gY2FycmllcyB0aGUgZm9ybWF0dGluZywgc28gdGhlIHZhbHVlIGdvZXMgb3V0IHZlcmJhdGltLiBBIHJhdyBkYXRlIGlzIHRoZVxuICAvLyBvbmUgdmFsdWUgdGhlIGNsaWVudCByZW5kZXJzICh0aGUgY29sdW1uIHN0YXlzIGEgUkFXIHRpbWVzdGFtcCBmb3IgdGhlXG4gIC8vIHJlcG9ydCB0aW1lem9uZSksIGFuZCBpdCBpcyByZW5kZXJlZCBoZXJlIHRvby5cbiAgcHJpdmF0ZSBfY2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IFN0cmluZyh2YWx1ZSkgOiBmb3JtYXQoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU8vQyxPQUFPLEVBQXFCLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFJckQsa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbkIsdUVBQXVFO0FBQ3ZFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSx3RUFBd0U7QUFDeEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUVoRixNQUFNLE9BQU8sZ0JBQWdCO0lBRXBCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBMEI7UUFDNUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUU1RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcs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QUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBmb3JtYXRNZWFzdXJlVmFsdWUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7IC8vIENvbXBvbmVudERhdGEgdXNlZCBpbiBtZXRob2Qgc2lnbmF0dXJlcyBiZWxvd1xuaW1wb3J0IHsgQ29tcG9uZW50R2VvbWV0cnksIHBhZ2VHZW9tZXRyeSB9IGZyb20gJy4uL2xheW91dCc7XG5pbXBvcnQgeyByZW5kZXJDaGFydEltYWdlIH0gZnJvbSAnLi9vZmZzY3JlZW4tY2hhcnQnO1xuaW1wb3J0IHsgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRSZXBvcnQgfSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuLy8gQXBwcm94aW1hdGUgdGFibGUgcm93IGhlaWdodCwgcG9pbnRzIOKAlCBkcml2ZXMgdGhlIHJvd3MtdGhhdC1maXQgY2FwLlxuY29uc3QgVEFCTEVfUk9XX0ggPSAxNjtcblxuLy8gQnVpbGRzIHRoZSBQREYgY2xpZW50LXNpZGUgd2l0aCBqc3BkZi4gVGhlIHJlcG9ydCdzIHVuaXQgaXMgaW5jaGVzIGFuZCBQREZzXG4vLyBhcmUgcG9pbnRzIGF0IGV4YWN0bHkgNzIvaW5jaCwgc28gZWFjaCByZXBvcnQgcGFnZSBiZWNvbWVzIG9uZSBQREYgcGFnZSBvZlxuLy8gdGhlIGV4YWN0IHBoeXNpY2FsIHNpemUgYW5kIGNvbXBvbmVudHMgbGFuZCBhdCB0aGVpciBwcmVjaXNlIHBvc2l0aW9ucy5cbi8vIENoYXJ0cyBhcmUgcmVuZGVyZWQgdGhyb3VnaCBhbiBvZmZzY3JlZW4gRUNoYXJ0cyBpbnN0YW5jZSBhdCAzw5cgcGl4ZWxcbi8vIHJhdGlvIOKAlCBwaXhlbC1pZGVudGljYWwgdG8gdGhlIHNjcmVlbiwgY3Jpc3AgYXQgcHJpbnQgc2l6ZSDigJQgYW5kIHRhYmxlcyBhcmVcbi8vIGRyYXduIHdpdGgganNwZGYtYXV0b3RhYmxlLiBCb3RoIGxpYnJhcmllcyBsb2FkIGxhemlseSBpbnRvIHRoZWlyIG93biBjaHVua3MuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsganNQREYgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgICBjb25zdCBhdXRvVGFibGUgPSAoYXdhaXQgaW1wb3J0KCdqc3BkZi1hdXRvdGFibGUnKSkuZGVmYXVsdDtcblxuICAgIGNvbnN0IHJlcG9ydCA9IGNvbGxlY3RlZC5yZXBvcnQ7XG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuXG4gICAgY29uc3QgZG9jID0gbmV3IGpzUERGKHtcbiAgICAgIG9yaWVudGF0aW9uOiBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JyxcbiAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fdGl0bGVQYWdlKGRvYywgY29sbGVjdGVkLCBwYWdlVywgcGFnZUgpO1xuXG4gICAgZm9yIChjb25zdCBjb2xsZWN0ZWRQYWdlIG9mIGNvbGxlY3RlZC5wYWdlcykge1xuICAgICAgZG9jLmFkZFBhZ2UoW3BhZ2VXLCBwYWdlSF0sIHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnKTtcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gcGFnZUdlb21ldHJ5KHJlcG9ydCwgY29sbGVjdGVkUGFnZS5wYWdlKTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoZG9jLCBhdXRvVGFibGUsIGl0ZW0sIGdlb21ldHJ5LmdldChpdGVtLmNvbXBvbmVudC5pZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRvYy5zYXZlKGAke3RoaXMuX3NsdWcocmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgZm9ybWF0KG5ldyBEYXRlKCksICdNTU1NIGQsIHl5eXknKSxcbiAgICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIF07XG4gICAgZG9jLnRleHQobGluZXMsIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoZG9jOiBhbnksIGF1dG9UYWJsZTogYW55LCBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIGdlb21ldHJ5PzogQ29tcG9uZW50R2VvbWV0cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtLmNvbXBvbmVudDtcbiAgICAvLyBHZW9tZXRyeSBhcnJpdmVzIGluIGluY2hlcyAoZmxvdyBsYXlvdXQgcHJlLXJlc29sdmVkKTsgdGhlIFBERiBkcmF3cyBpblxuICAgIC8vIHBvaW50cy5cbiAgICBjb25zdCBpbmNoZXMgPSBnZW9tZXRyeSA/PyBjb21wb25lbnQ7XG4gICAgY29uc3QgeCA9IGluY2hlcy54ICogUFQ7XG4gICAgY29uc3QgeSA9IGluY2hlcy55ICogUFQ7XG4gICAgY29uc3QgdyA9IGluY2hlcy53ICogUFQ7XG4gICAgY29uc3QgaCA9IGluY2hlcy5oICogUFQ7XG5cbiAgICBpZiAoY29tcG9uZW50LnRpdGxlKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICAgIGRvYy50ZXh0KGNvbXBvbmVudC50aXRsZSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHlZID0geSArIFRJVExFX0g7XG4gICAgY29uc3QgYm9keUggPSBNYXRoLm1heCgyMCwgaCAtIFRJVExFX0gpO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEgfHwgIWl0ZW0uZGF0YS5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnaXRhbGljJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICBkb2MudGV4dChpdGVtLmRhdGEgPyAnTm8gZGF0YScgOiAnRGF0YSB1bmF2YWlsYWJsZScsIHggKyB3IC8gMiwgYm9keVkgKyBib2R5SCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShkb2MsIGF1dG9UYWJsZSwgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGRvYywgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGRvYzogYW55LFxuICAgIGF1dG9UYWJsZTogYW55LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIExpc3RDb25maWc7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZy5jb2x1bW5zPy5sZW5ndGhcbiAgICAgID8gY29uZmlnLmNvbHVtbnNcbiAgICAgIDogZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIGxhYmVsOiBjb2x1bW4gfSkpO1xuXG4gICAgY29uc3QgY2FwID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihoIC8gVEFCTEVfUk9XX0gpIC0gMSk7XG4gICAgY29uc3Qgcm93cyA9IGRhdGEucm93cy5zbGljZSgwLCBjYXApO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IChkYXRhLnBhZ2luZz8udG90YWwgPz8gZGF0YS5yb3dzLmxlbmd0aCkgLSByb3dzLmxlbmd0aDtcblxuICAgIGNvbnN0IGJvZHkgPSByb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9jZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLmZvcm1hdCkpKTtcblxuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBib2R5LnB1c2goW2DigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgXSk7XG4gICAgfVxuXG4gICAgYXV0b1RhYmxlKGRvYywge1xuICAgICAgaGVhZDogW2NvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKV0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZOiB5LFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHggfSxcbiAgICAgIHRhYmxlV2lkdGg6IHcsXG4gICAgICBzdHlsZXM6IHsgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgZG9jOiBhbnksXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHJvdyA9IGRhdGEucm93c1swXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb25maWcubWVhc3VyZT8uY29sdW1uID8/IE9iamVjdC5rZXlzKHJvdylbMF07XG4gICAgY29uc3QgdmFsdWUgPSBmb3JtYXRNZWFzdXJlVmFsdWUocm93W2NvbHVtbl0sIGNvbmZpZy5tZWFzdXJlPy5mb3JtYXQsIGNvbmZpZy5tZWFzdXJlPy5wcmVjaXNpb24pO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI2KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgIGlmIChjb25maWcubWVhc3VyZT8ubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICBkb2MudGV4dChjb25maWcubWVhc3VyZS5sYWJlbCwgeCArIHcgLyAyLCB5ICsgaCAvIDIgKyAxNiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGV4cG9ydGVkIGNlbGwgbXVzdCByZWFkIGxpa2UgdGhlIG9uLXNjcmVlbiBjZWxsOiB0aGUgU1FMIGFscmVhZHlcbiAgLy8gY2FycmllcyB0aGUgZm9ybWF0dGluZywgc28gdGhlIHZhbHVlIGdvZXMgb3V0IHZlcmJhdGltLiBBIHJhdyBkYXRlIGlzIHRoZVxuICAvLyBvbmUgdmFsdWUgdGhlIGNsaWVudCByZW5kZXJzICh0aGUgY29sdW1uIHN0YXlzIGEgUkFXIHRpbWVzdGFtcCBmb3IgdGhlXG4gIC8vIHJlcG9ydCB0aW1lem9uZSksIGFuZCBpdCBpcyByZW5kZXJlZCBoZXJlIHRvby5cbiAgcHJpdmF0ZSBfY2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IFN0cmluZyh2YWx1ZSkgOiBmb3JtYXQoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==