@porscheinformatik/material-addons 17.4.2 → 17.4.3

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 (23) hide show
  1. package/esm2022/lib/data-table/configuration/data-table-global-configuration.mjs +2 -2
  2. package/esm2022/lib/data-table/data-table.component.mjs +32 -13
  3. package/esm2022/lib/data-table/util/data-table-sort-util.mjs +9 -6
  4. package/esm2022/lib/layout/sidebar/sidebar.component.mjs +6 -4
  5. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +3 -3
  6. package/esm2022/lib/quick-list/quick-list.component.mjs +3 -3
  7. package/esm2022/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.mjs +3 -3
  8. package/esm2022/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.mjs +3 -3
  9. package/esm2022/lib/readonly/readonly-form-field/readonly-form-field.component.mjs +6 -3
  10. package/fesm2022/porscheinformatik-material-addons.mjs +57 -30
  11. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -1
  12. package/lib/data-table/configuration/data-table-global-configuration.d.ts +1 -1
  13. package/lib/data-table/configuration/data-table-global-configuration.d.ts.map +1 -1
  14. package/lib/data-table/data-table.component.d.ts +8 -3
  15. package/lib/data-table/data-table.component.d.ts.map +1 -1
  16. package/lib/data-table/util/data-table-sort-util.d.ts +2 -2
  17. package/lib/data-table/util/data-table-sort-util.d.ts.map +1 -1
  18. package/lib/layout/sidebar/sidebar.component.d.ts +1 -1
  19. package/lib/layout/sidebar/sidebar.component.d.ts.map +1 -1
  20. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts.map +1 -1
  21. package/lib/readonly/readonly-form-field/readonly-form-field.component.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/themes/common/styles.scss +8 -4
@@ -149,6 +149,25 @@ export class DataTableComponent {
149
149
  this.openColumnModal();
150
150
  }
151
151
  }
152
+ // we need to have this as a setter due to the *ngIf it is in
153
+ set matSort(matSort) {
154
+ this._sort = matSort;
155
+ this.dataSource.sort = this._sort;
156
+ }
157
+ set columnDefs(columnDefs) {
158
+ this._columnDefs = columnDefs;
159
+ this.changeDetectorRef.detectChanges();
160
+ }
161
+ get columnDefs() {
162
+ return this._columnDefs;
163
+ }
164
+ set expandableDef(expandableDef) {
165
+ this._expandableDef = expandableDef;
166
+ this.changeDetectorRef.detectChanges();
167
+ }
168
+ get expandableDef() {
169
+ return this._expandableDef;
170
+ }
152
171
  constructor(changeDetectorRef, matDialog, persistenceService, dataTableGlobalConfig) {
153
172
  this.changeDetectorRef = changeDetectorRef;
154
173
  this.matDialog = matDialog;
@@ -208,7 +227,7 @@ export class DataTableComponent {
208
227
  ngAfterViewInit() {
209
228
  if (!this._useAsync) {
210
229
  this.dataSource.paginator = this.paginator;
211
- this.dataSource.sort = this.sort;
230
+ this.dataSource.sort = this._sort;
212
231
  }
213
232
  this.applySortData();
214
233
  this.initState();
@@ -245,14 +264,14 @@ export class DataTableComponent {
245
264
  return 'PLAIN';
246
265
  }
247
266
  getCustomCellTemplate(columnId) {
248
- const columnDef = this.columnDefs.find((it) => it.madColumnDef === columnId);
267
+ const columnDef = this._columnDefs?.find((it) => it.madColumnDef === columnId);
249
268
  return columnDef && columnDef.cellDef ? columnDef.cellDef.getCellTemplate() : null;
250
269
  }
251
270
  getCustomExpandableTemplate() {
252
- return this.expandableDef?.getCellTemplate() || null;
271
+ return this._expandableDef?.getCellTemplate() || null;
253
272
  }
254
273
  get expandableColumnDef() {
255
- return this.expandableDef?.columnDef.madExpandableColumnDef || '';
274
+ return this._expandableDef?.columnDef.madExpandableColumnDef || '';
256
275
  }
257
276
  onExpand(event, element) {
258
277
  this.expandedElement = this.expandedElement === element ? null : element;
@@ -319,7 +338,7 @@ export class DataTableComponent {
319
338
  return this.dataSource?._pageData(this.dataSource.filteredData);
320
339
  }
321
340
  get showActionColumn() {
322
- return !(this.selectionEmitMode === 'NONE' || this.hideActionColumn) || !!this.expandableDef;
341
+ return !(this.selectionEmitMode === 'NONE' || this.hideActionColumn) || !!this._expandableDef;
323
342
  }
324
343
  showCheckbox(displayedData) {
325
344
  return !displayedData.parentId && this.selectionMode === 'BATCH' && !this.hideActionColumn;
@@ -331,7 +350,7 @@ export class DataTableComponent {
331
350
  return !displayedData.parentId && this.selectionEmitMode === 'ON_SELECTION' && this.selectionMode === 'SINGLE';
332
351
  }
333
352
  showExpandableButton(displayedData) {
334
- return !displayedData.parentId && !!this.expandableDef;
353
+ return !displayedData.parentId && !!this._expandableDef;
335
354
  }
336
355
  isSelected(rowId) {
337
356
  return this._selectionModel.isSelected(rowId);
@@ -418,7 +437,7 @@ export class DataTableComponent {
418
437
  applySortData() {
419
438
  this.dataSource.sortData = this._useAsync
420
439
  ? DataTableSortUtil.sortNothing()
421
- : DataTableSortUtil.sortData(this.dataTableGlobalConfig.dateTimeFormat, this.dataTableGlobalConfig.numberFormat);
440
+ : DataTableSortUtil.sortData([...this.dataTableGlobalConfig.dateTimeFormat], this.dataTableGlobalConfig.numberFormat);
422
441
  }
423
442
  /** FILTER HANDLING */
424
443
  get filterMode() {
@@ -512,9 +531,9 @@ export class DataTableComponent {
512
531
  }
513
532
  }
514
533
  setSort(sort) {
515
- this.sort.active = sort.active;
516
- this.sort.direction = sort.direction;
517
- this.sort.sortChange.emit(sort);
534
+ this._sort.active = sort.active;
535
+ this._sort.direction = sort.direction;
536
+ this._sort.sortChange.emit(sort);
518
537
  }
519
538
  initFilterState() {
520
539
  const filter = this.persistenceService.loadFilter(this.id);
@@ -572,7 +591,7 @@ export class DataTableComponent {
572
591
  });
573
592
  }
574
593
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MatDialog }, { token: MAD_DATA_TABLE_PERSISTENCE_SERVICE }, { token: MAD_DATA_TABLE_GLOBAL_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Component }); }
575
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: DataTableComponent, isStandalone: true, selector: "mad-data-table", inputs: { id: "id", filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", showEmptyTable: "showEmptyTable", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", translateLabels: "translateLabels", useAsync: "useAsync", stateful: "stateful", persistenceConfig: "persistenceConfig", loading: "loading", tableData: "tableData", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", defaultSort: "defaultSort", externalFilter: "externalFilter", paginationEnabled: "paginationEnabled", page: "page", pageSizeOptions: "pageSizeOptions", actions: "actions", selectionEmitType: "selectionEmitType", showDeleteFilterAction: "showDeleteFilterAction", disableRowClick: "disableRowClick", deleteDefinitionAllowed: "deleteDefinitionAllowed", selection: "selection", filterEnabled: "filterEnabled", filterMode: "filterMode", filterValue: "filterValue", externalPaginator: "externalPaginator", defaultPageSize: "defaultPageSize", selectionEmitMode: "selectionEmitMode", forceMode: "forceMode", forceSelectionMode: "forceSelectionMode", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", columnDefinitions: "columnDefinitions", allColumns: "allColumns" }, outputs: { actionEvent: "actionEvent", selectionEvent: "selectionEvent", sortEvent: "sortEvent", filterEvent: "filterEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], queries: [{ propertyName: "expandableDef", first: true, predicate: DataTableTemplateExpandableCellDefinition, descendants: true }, { propertyName: "columnDefs", predicate: DataTableTemplateColumnDefinition }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filter", first: true, predicate: DataTableFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!filteredPageData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled", "color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i9.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title", "color"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MadButtonGroupComponent, selector: "mad-button-group" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex", "id", "name", "aria-label", "aria-labelledby", "aria-describedby", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: DataTableFilterHeader, selector: "th[mad-filter-header]", inputs: ["mad-filter-header", "madFilterColumnRightAligned", "madFilterOptions"] }, { kind: "directive", type: DataTableFilter, selector: "[madFilter]", outputs: ["madFilterChange"] }], animations: [
594
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: DataTableComponent, isStandalone: true, selector: "mad-data-table", inputs: { id: "id", filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", showEmptyTable: "showEmptyTable", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", translateLabels: "translateLabels", useAsync: "useAsync", stateful: "stateful", persistenceConfig: "persistenceConfig", loading: "loading", tableData: "tableData", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", defaultSort: "defaultSort", externalFilter: "externalFilter", paginationEnabled: "paginationEnabled", page: "page", pageSizeOptions: "pageSizeOptions", actions: "actions", selectionEmitType: "selectionEmitType", showDeleteFilterAction: "showDeleteFilterAction", disableRowClick: "disableRowClick", deleteDefinitionAllowed: "deleteDefinitionAllowed", selection: "selection", filterEnabled: "filterEnabled", filterMode: "filterMode", filterValue: "filterValue", externalPaginator: "externalPaginator", defaultPageSize: "defaultPageSize", selectionEmitMode: "selectionEmitMode", forceMode: "forceMode", forceSelectionMode: "forceSelectionMode", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", columnDefinitions: "columnDefinitions", allColumns: "allColumns" }, outputs: { actionEvent: "actionEvent", selectionEvent: "selectionEvent", sortEvent: "sortEvent", filterEvent: "filterEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], queries: [{ propertyName: "expandableDef", first: true, predicate: DataTableTemplateExpandableCellDefinition, descendants: true }, { propertyName: "columnDefs", predicate: DataTableTemplateColumnDefinition }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filter", first: true, predicate: DataTableFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!filteredPageData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled", "color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i9.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title", "color"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MadButtonGroupComponent, selector: "mad-button-group" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex", "id", "name", "aria-label", "aria-labelledby", "aria-describedby", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: DataTableFilterHeader, selector: "th[mad-filter-header]", inputs: ["mad-filter-header", "madFilterColumnRightAligned", "madFilterOptions"] }, { kind: "directive", type: DataTableFilter, selector: "[madFilter]", outputs: ["madFilterChange"] }], animations: [
576
595
  trigger('detailExpand', [
577
596
  state('collapsed,void', style({ height: '0px', minHeight: '0' })),
578
597
  state('expanded', style({ height: '*' })),
@@ -730,7 +749,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
730
749
  }], paginator: [{
731
750
  type: ViewChild,
732
751
  args: [MatPaginator]
733
- }], sort: [{
752
+ }], matSort: [{
734
753
  type: ViewChild,
735
754
  args: [MatSort]
736
755
  }], filter: [{
@@ -743,4 +762,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
743
762
  type: ContentChild,
744
763
  args: [DataTableTemplateExpandableCellDefinition]
745
764
  }] } });
746
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFJTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVUvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFJbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FB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QUF4QixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBRWtCLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDSCxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1UsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxlQUFlO2dCQUMwQixVQUFVO3NCQUE3RCxlQUFlO3VCQUFDLGlDQUFpQztnQkFFbEQsYUFBYTtzQkFEWixZQUFZO3VCQUFDLHlDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUsIFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlLCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW4gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtYWN0aW9uJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5zTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC9kYXRhLXRhYmxlLWNvbHVtbnMtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24sXG4gIERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25DaGFuZ2UsXG4gIERhdGFUYWJsZURpYWxvZ0RhdGEsXG59IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWNvbHVtbi1kZWZpbml0aW9uJztcbmltcG9ydCB7IERhdGFUYWJsZVJvdyB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLXJvdyc7XG5pbXBvcnQgeyBEYXRhVGFibGVIZWFkZXJUeXBlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtaGVhZGVyLXR5cGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyTW9kZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWZpbHRlci1tb2RlJztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlck9iamVjdCB9IGZyb20gJy4vZGF0YS10YWJsZS1maWx0ZXIvZGF0YS10YWJsZS1maWx0ZXItb2JqZWN0JztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlciB9IGZyb20gJy4vZGF0YS10YWJsZS1maWx0ZXIvZGF0YS10YWJsZS1maWx0ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRUeXBlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLWVtaXQtdHlwZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVTZWxlY3Rpb25FbWl0TW9kZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLXNlbGVjdGlvbi1lbWl0LW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLXNlbGVjdGlvbi1tb2RlJztcbmltcG9ydCB7IERhdGFUYWJsZVNvcnRVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtc29ydC11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZUFjdGlvblV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1hY3Rpb24tdXRpbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVEYXRhVXRpbCB9IGZyb20gJy4vdXRpbC9kYXRhLXRhYmxlLWRhdGEtdXRpbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtZmlsdGVyLXV0aWwnO1xuaW1wb3J0IHtcbiAgREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFX1BST1ZJREVSLFxuICBEYXRhVGFibGVQZXJzaXN0ZW5jZVNlcnZpY2UsXG4gIE1BRF9EQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0UsXG59IGZyb20gJy4vZGF0YS10YWJsZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE1BRF9EQVRBX1RBQkxFX0dMT0JBTF9DT05GSUdVUkFUSU9OLFxuICBEYXRhVGFibGVHbG9iYWxDb25maWd1cmF0aW9uLFxuICBNQURfREFUQV9UQUJMX0dMT0JBTF9DT05GSUdVUkFUSU9OX1BST1ZJREVSLFxufSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1nbG9iYWwtY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IERyYWdEcm9wTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJhZGdlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYmFkZ2UnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5tb2R1bGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVySGVhZGVyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci1oZWFkZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gJy4vZGF0YS10YWJsZS10ZW1wbGF0ZS9kYXRhLXRhYmxlLXRlbXBsYXRlLWNvbHVtbi1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVUZW1wbGF0ZUNlbGxEZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtY2VsbC1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbiB9IGZyb20gJy4vZGF0YS10YWJsZS10ZW1wbGF0ZS9kYXRhLXRhYmxlLXRlbXBsYXRlLWV4cGFuZGFibGUtY2VsbC1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtZXhwYW5kYWJsZS1jb2x1bW4tZGVmaW5pdGlvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlUGVyc2lzdGVuY2VDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtcGVyc2lzdGVuY2UtY29uZmlndXJhdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hZC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdkZXRhaWxFeHBhbmQnLCBbXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkLHZvaWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG1pbkhlaWdodDogJzAnIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBNYXRCYWRnZU1vZHVsZSxcbiAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBEYXRhVGFibGVGaWx0ZXJIZWFkZXIsXG4gICAgRGF0YVRhYmxlRmlsdGVyLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbixcbiAgICBEYXRhVGFibGVUZW1wbGF0ZUNlbGxEZWZpbml0aW9uLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNvbHVtbkRlZmluaXRpb24sXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24sXG4gIF0sXG4gIHByb3ZpZGVyczogW0RBVEFfVEFCTEVfUEVSU0lTVEVOQ0VfU0VSVklDRV9QUk9WSURFUiwgTUFEX0RBVEFfVEFCTF9HTE9CQUxfQ09ORklHVVJBVElPTl9QUk9WSURFUl0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG5cbiAgLy8gVHJhbnNsYXRpb25zXG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gJ2NvbW1vbi5maWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJQbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zTGFiZWwgPSAnRmlsdGVyJztcbiAgQElucHV0KCkgZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyID0gJ0ZpbHRlciBhdmFpbGFibGUgY29sdW1ucyc7XG4gIEBJbnB1dCgpIHNob3dFbXB0eVRhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG5vRGF0YVRleHQgPSAnTm8gbWF0Y2hpbmcgZGF0YSBmb3VuZCc7XG4gIEBJbnB1dCgpIGNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsID0gJ0NvbHVtbiBzZXR0aW5ncyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkTGFiZWwgPSAnU2VsZWN0ZWQgY29sdW1ucyc7XG4gIEBJbnB1dCgpIGF2YWlsYWJsZUxhYmVsID0gJ0F2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2F2ZUxhYmVsID0gJ1NhdmUnO1xuICBASW5wdXQoKSBkZWxldGVMYWJlbCA9ICdEZWxldGUnO1xuICBASW5wdXQoKSBjYW5jZWxMYWJlbCA9ICdDYW5jZWwnO1xuICBASW5wdXQoKSBpbmZvVGV4dExhYmVsID0gJ0RyYWcgYW5kIGRyb3AgYSBjb2x1bW4gdG8gc2VsZWN0IG9yIHJlb3JkZXIgaXQuJztcbiAgQElucHV0KCkgdGFibGVDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHRyYW5zbGF0ZUxhYmVscyA9IHRydWU7XG5cbiAgQElucHV0KCkgc2V0IHVzZUFzeW5jKHVzZUFzeW5jOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdXNlQXN5bmMgPSB1c2VBc3luYztcbiAgICB0aGlzLmFwcGx5U29ydERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBQbGVhc2UgdXNlIHRoZSBtb3JlIHNwZWNpZmljIHBlcnNpc3RlbmNlQ29uZmlnIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzdGF0ZWZ1bChzdGF0ZWZ1bDogYm9vbGVhbikge1xuICAgIHRoaXMucGVyc2lzdGVuY2VDb25maWcgPSB7XG4gICAgICBwZXJzaXN0U29ydDogc3RhdGVmdWwsXG4gICAgICBwZXJzaXN0RmlsdGVyOiBzdGF0ZWZ1bCxcbiAgICAgIHBlcnNpc3RQYWdlU2l6ZTogc3RhdGVmdWwsXG4gICAgfTtcbiAgfVxuXG4gIEBJbnB1dCgpIHBlcnNpc3RlbmNlQ29uZmlnOiBEYXRhVGFibGVQZXJzaXN0ZW5jZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgcGVyc2lzdFNvcnQ6IGZhbHNlLFxuICAgIHBlcnNpc3RGaWx0ZXI6IGZhbHNlLFxuICAgIHBlcnNpc3RQYWdlU2l6ZTogZmFsc2UsXG4gIH07XG5cbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHRhYmxlRGF0YTogYW55O1xuICBASW5wdXQoKSBpZEdlbmVyYXRvcjogYW55O1xuICBASW5wdXQoKSBwYXJlbnRJZEdlbmVyYXRvcjogYW55O1xuXG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0OiBTb3J0O1xuICBASW5wdXQoKSBleHRlcm5hbEZpbHRlcjogYW55O1xuICBASW5wdXQoKSBwYWdpbmF0aW9uRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYWdlOiBQYWdlRXZlbnQgPSB7IHBhZ2VJbmRleDogMCwgcGFnZVNpemU6IDUwLCBsZW5ndGg6IDAgfTtcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zID0gWzUsIDEwLCAxNV07XG5cbiAgQElucHV0KCkgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0aW9uRW1pdFR5cGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRUeXBlID0gJ0lEJztcbiAgQElucHV0KCkgc2hvd0RlbGV0ZUZpbHRlckFjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRpc2FibGVSb3dDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFBsZWFzZSB1c2UgXCJmaWx0ZXJNb2RlXCIgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGZpbHRlckVuYWJsZWQoaXNGaWx0ZXJFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZmlsdGVyTW9kZSA9IGlzRmlsdGVyRW5hYmxlZCA/ICdUQUJMRV9CQVNFRCcgOiAnTk9ORSc7XG4gICAgdGhpcy5hcHBseUZpbHRlclByZWRpY2F0ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlck1vZGUoZmlsdGVyTW9kZTogRGF0YVRhYmxlRmlsdGVyTW9kZSkge1xuICAgIHRoaXMuX2ZpbHRlck1vZGUgPSBmaWx0ZXJNb2RlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJQcmVkaWNhdGUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJWYWx1ZShmaWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyVmFsdWUodGhpcy5fZmlsdGVyVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGV4dGVybmFsUGFnaW5hdG9yKHBhZ2luYXRvcjogYW55KSB7XG4gICAgdGhpcy5leHRQYWdpbmF0b3IgPSBwYWdpbmF0b3I7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGVmYXVsdFBhZ2VTaXplKGRlZmF1bHRTaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2UgPSB7XG4gICAgICAuLi50aGlzLnBhZ2UsXG4gICAgICBwYWdlU2l6ZTogZGVmYXVsdFNpemUsXG4gICAgfTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzZWxlY3Rpb25FbWl0TW9kZShzZWxlY3Rpb25FbWl0TW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdE1vZGUpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25FbWl0TW9kZSA9IHNlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFRoaXMgZnVuY3Rpb24gbWl4ZXMgdXAgMiByZXNwb25zaWJpbGl0aWVzOlxuICAgKiAgLSBkZXRlcm1pbmluZyBpZiBhY3Rpb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgLyBoYW5kbGVkXG4gICAqICAtIGRldGVybWluaW5nIHdoZXRoZXIgYWN0aW9ucyBhcmUgcm93IGJhc2VkIChzaW5nbGUpIG9yIHRhYmxlIGJhc2VkIChiYXRjaClcbiAgICogUGxlYXNlIHVzZSBhIGNvbWJpbmF0aW9uIG9mIFwic2VsZWN0aW9uRW1pdE1vZGVcIiBhbmQgXCJzZWxlY3Rpb25Nb2RlXCIgaW5zdGVhZDpcbiAgICogIC0gc2VsZWN0aW9uRW1pdE1vZGUgZGV0ZXJtaW5lcyBob3cgc2VsZWN0ZWQgaXRlbXMgYXJlIGhhbmRsZWQgKGFzIHBhcnQgb2YgYWN0aW9ucywgYXMgc2VsZWN0aW9ucyBvciBub3QgYXQgYWxsKVxuICAgKiAgLSBzZWxlY3Rpb25Nb2RlIGRldGVybWluZXMgaWYgc2VsZWN0ZWQgaXRlbXMgYXJlIHRyZWF0ZWQgc2VwYXJhdGVseSAoc2luZ2xlKSBvciB0b2dldGhlciAoYmF0Y2gpXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZm9yY2VNb2RlKHNlbGVjdGlvbk1vZGU6IHN0cmluZykge1xuICAgIGlmIChzZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyB8fCBzZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25FbWl0TW9kZSA9ICdPTl9BQ1RJT04nO1xuICAgICAgdGhpcy5fZm9yY2VTZWxlY3Rpb25Nb2RlID0gPERhdGFUYWJsZVNlbGVjdGlvbk1vZGU+c2VsZWN0aW9uTW9kZTtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGZvcmNlU2VsZWN0aW9uTW9kZShzZWxlY3Rpb25Nb2RlOiBEYXRhVGFibGVTZWxlY3Rpb25Nb2RlKSB7XG4gICAgdGhpcy5fZm9yY2VTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZTtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRpc3BsYXllZENvbHVtbnMoY29sczogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICBpZiAoIXRoaXMuZGlzcGxheWVkQ29sdW1uRGVmaW5pdGlvbikge1xuICAgICAgdGhpcy5jb2x1bW5zID0gY29scyA/IFsuLi5jb2xzXSA6IFtdO1xuICAgICAgdGhpcy5jb2x1bW5JZHMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5pZCk7XG4gICAgICB0aGlzLmNvbHVtbklkcy51bnNoaWZ0KHRoaXMuQUNUSU9OX0NPTFVNTl9OQU1FKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1uRGVmaW5pdGlvbihkZWY6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBkZWYuZGlzcGxheWVkQ29sdW1ucztcbiAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmlkKTtcbiAgICB0aGlzLmNvbHVtbklkcy51bnNoaWZ0KHRoaXMuQUNUSU9OX0NPTFVNTl9OQU1FKTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gPSBkZWY7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgY29sdW1uRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXSkge1xuICAgIHRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xuICAgIHRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucyA9IFtdO1xuICAgIHRoaXMuX2FsbENvbHVtbkRlZmluaXRpb25zID0gWy4uLmRlZmluaXRpb25zXTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgZGVmaW5pdGlvbnMpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmVkaXRhYmxlKSB7XG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmluaXRpb24uZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsQ29sdW1ucyhhbGxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIHRoaXMuX2FsbEF2YWlsYWJsZUNvbHVtbnMgPSBhbGxDb2x1bW5zO1xuICAgIGlmIChhbGxDb2x1bW5zICYmIHRoaXMuX3Nob3dDb2x1bW5Nb2RhbCkge1xuICAgICAgdGhpcy5vcGVuQ29sdW1uTW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgYWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUFjdGlvbj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBAT3V0cHV0KCkgc29ydEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpO1xuICBAT3V0cHV0KCkgZmlsdGVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZD4oKTtcbiAgQE91dHB1dCgpIHBhZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKSBhbGxDb2x1bW5zRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25DaGFuZ2U+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uPigpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0OiBNYXRTb3J0O1xuICBAVmlld0NoaWxkKERhdGFUYWJsZUZpbHRlcikgZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXI7XG4gIEBDb250ZW50Q2hpbGRyZW4oRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uKSBjb2x1bW5EZWZzOiBRdWVyeUxpc3Q8RGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uPjtcbiAgQENvbnRlbnRDaGlsZChEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbilcbiAgZXhwYW5kYWJsZURlZjogRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueVtdPjtcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBleHRQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcblxuICByZWFkb25seSBBQ1RJT05fQ09MVU1OX05BTUUgPSAnX19hY3Rpb25fXyc7XG4gIHRhYmxlQWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW11bXSA9IFtdO1xuICByb3dBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuXG4gIGNvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdID0gW107XG4gIGNvbHVtbklkczogc3RyaW5nW107XG5cbiAgZXhwYW5kZWRFbGVtZW50OiBEYXRhVGFibGVDb2x1bW4gfCBudWxsO1xuXG4gIGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgdmlld2FibGVDb2x1bW5EZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdO1xuXG4gIHByaXZhdGUgX3VzZUFzeW5jOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfcm93TWFwID0gbmV3IE1hcDxzdHJpbmcsIERhdGFUYWJsZVJvdz4oKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0cnVlKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uOiBzdHJpbmdbXSB8IGFueVtdO1xuXG4gIHByaXZhdGUgX2ZvcmNlU2VsZWN0aW9uTW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uTW9kZTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW1pdE1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2FsbENvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfc2hvd0NvbHVtbk1vZGFsID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZyxcbiAgICBASW5qZWN0KE1BRF9EQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0UpIHByaXZhdGUgcGVyc2lzdGVuY2VTZXJ2aWNlOiBEYXRhVGFibGVQZXJzaXN0ZW5jZVNlcnZpY2UsXG4gICAgQEluamVjdChNQURfREFUQV9UQUJMRV9HTE9CQUxfQ09ORklHVVJBVElPTikgcHJpdmF0ZSBkYXRhVGFibGVHbG9iYWxDb25maWc6IERhdGFUYWJsZUdsb2JhbENvbmZpZ3VyYXRpb24sXG4gICkge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIH1cbiAgICB0aGlzLmFwcGx5U29ydERhdGEoKTtcbiAgICB0aGlzLmluaXRTdGF0ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICgndGFibGVEYXRhJyBpbiBjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFUYWJsZURhdGEoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uTW9kZWwodGhpcy5nZXRTZWxlY3Rpb24oJ0lEJykubGVuZ3RoID8gdGhpcy5nZXRTZWxlY3Rpb24oJ0lEJykgOiB0aGlzLl9zZWxlY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuc2hvd0FsbCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJ2lkR2VuZXJhdG9yJyBpbiBjaGFuZ2VzIHx8ICdkaXNwbGF5ZWRDb2x1bW5zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFUYWJsZURhdGEoKTtcbiAgICB9XG5cbiAgICAvLyBwZXJmb3JtYW5jZSByZWFzb25zIChzYW1lIGJlaGF2aW91ciBjb3VsZCBiZSBhY2hpdmVkIGluIGdldHRlcnMpXG4gICAgaWYgKCdmb3JjZU1vZGUnIGluIGNoYW5nZXMgfHwgJ2ZvcmNlU2VsZWN0aW9uTW9kZScgaW4gY2hhbmdlcyB8fCAnYWN0aW9ucycgaW4gY2hhbmdlcykge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IERhdGFUYWJsZUFjdGlvblV0aWwuZ2V0RGlzcGxheUFjdGlvbnModGhpcy5hY3Rpb25zLCB0aGlzLnNlbGVjdGlvbk1vZGUpO1xuICAgICAgdGhpcy5yb3dBY3Rpb25zID0gYWN0aW9ucy5yb3dBY3Rpb25zO1xuICAgICAgdGhpcy50YWJsZUFjdGlvbnMgPSBhY3Rpb25zLmdyb3VwZWRUYWJsZUFjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRBQkxFIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0RGF0YVRhYmxlSGVhZGVyVHlwZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbik6IERhdGFUYWJsZUhlYWRlclR5cGUge1xuICAgIGlmIChjb2x1bW4uaXNTb3J0YWJsZSAmJiAhY29sdW1uLmlzRmlsdGVyYWJsZSkge1xuICAgICAgcmV0dXJuICdTT1JUJztcbiAgICB9XG4gICAgaWYgKCFjb2x1bW4uaXNTb3J0YWJsZSAmJiBjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ0ZJTFRFUic7XG4gICAgfVxuICAgIGlmIChjb2x1bW4uaXNTb3J0YWJsZSAmJiBjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ1NPUlRfQU5EX0ZJTFRFUic7XG4gICAgfVxuICAgIHJldHVybiAnUExBSU4nO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbUNlbGxUZW1wbGF0ZShjb2x1bW5JZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IGNvbHVtbkRlZiA9IHRoaXMuY29sdW1uRGVmcy5maW5kKChpdCkgPT4gaXQubWFkQ29sdW1uRGVmID09PSBjb2x1bW5JZCk7XG4gICAgcmV0dXJuIGNvbHVtbkRlZiAmJiBjb2x1bW5EZWYuY2VsbERlZiA/IGNvbHVtbkRlZi5jZWxsRGVmLmdldENlbGxUZW1wbGF0ZSgpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXN0b21FeHBhbmRhYmxlVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGFibGVEZWY/LmdldENlbGxUZW1wbGF0ZSgpIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cGFuZGFibGVDb2x1bW5EZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZURlZj8uY29sdW1uRGVmLm1hZEV4cGFuZGFibGVDb2x1bW5EZWYgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gdGhpcy5leHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnQgPyBudWxsIDogZWxlbWVudDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gQlVUVE9OIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgaGFzVmlzaWJsZVJvd0FjdGlvbnMoZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJvd0FjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4gdGhpcy5pc0hpZGRlbkZvckRhdGEoYWN0aW9uLCBbdGhpcy5fcm93TWFwLmdldChkaXNwbGF5ZWREYXRhLnJvd0lkKT8uYWN0dWFsRGF0YV0pKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRm9yRGF0YShhY3Rpb24sIHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbkZvckRhdGEoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIGRhdGE6IGFueVtdKSB7XG4gICAgcmV0dXJuICEhYWN0aW9uLmlzSGlkZGVuICYmIGFjdGlvbi5pc0hpZGRlbihkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uLnR5cGUpIHx8ICghIWFjdGlvbi5pc0Rpc2FibGVkICYmIGFjdGlvbi5pc0Rpc2FibGVkKHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50ICE9PSAxO1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50IDwgMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSAnQkFUQ0gnIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCAoJHtjb3VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBUQUJMRSBEQVRBIENIQU5HRSBIQU5ETElORyAqL1xuXG4gIHByaXZhdGUgdXBkYXRlRGF0YVRhYmxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGltbXV0YWJsZSAtIHdlIGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHJlZmVyZW5jZSBvZiByb3dNYXAgdG8gc3RheSB0aGUgc2FtZVxuICAgIERhdGFUYWJsZURhdGFVdGlsLnVwZGF0ZVJvd01hcCh0aGlzLl9yb3dNYXAsIHRoaXMudGFibGVEYXRhLCB0aGlzLmNvbHVtbnMsIHRoaXMuaWRHZW5lcmF0b3IsIHRoaXMucGFyZW50SWRHZW5lcmF0b3IpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dNYXAudmFsdWVzKCkpLm1hcCgoaXQpID0+IGl0LmRpc3BsYXllZERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIHNlbGVjdGlvbj8uZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yb3dNYXAuZ2V0KGl0KSB8fCBbLi4udGhpcy5fcm93TWFwLnZhbHVlcygpXS5maW5kKChyb3cpID0+IHJvdy5hY3R1YWxEYXRhID09PSBpdCk7XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gJiBTRUxFQ1RJT04gSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkVtaXRNb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyAmJiAhIXRoaXMuYWN0aW9ucy5sZW5ndGggPyAnT05fQUNUSU9OJyA6IHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiAhIXRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA/IHRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA6IHRoaXMuYWN0aW9ucy5maW5kKChpdCkgPT4gaXQudHlwZSA9PT0gJ0JBVENIJykgPyAnQkFUQ0gnIDogJ1NJTkdMRSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcmVkUGFnZURhdGEoKTogYW55W10ge1xuICAgIC8vIG9ubHkgdXNlIGZpbHRlcmVkIGRhdGFcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dBY3Rpb25Db2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ05PTkUnIHx8IHRoaXMuaGlkZUFjdGlvbkNvbHVtbikgfHwgISF0aGlzLmV4cGFuZGFibGVEZWY7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NoZWNrYm94KGRpc3BsYXllZERhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGlzcGxheWVkRGF0YS5wYXJlbnRJZCAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcgJiYgIXRoaXMuaGlkZUFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Um93QWN0aW9uSWNvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyAmJiAhdGhpcy5oaWRlQWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIHNob3dSYWRpb0J1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX1NFTEVDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXhwYW5kYWJsZUJ1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgISF0aGlzLmV4cGFuZGFibGVEZWY7XG4gIH1cblxuICBwdWJsaWMgaXNTZWxlY3RlZChyb3dJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQocm93SWQpO1xuICB9XG5cbiAgcHVibGljIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIC8vIHRvZ2dsZSBhbGwgY2hlY2tib3hcbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gIXRoaXMuYWxsU2VsZWN0ZWQ7XG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcbiAgICAgIC8vIHNlbGVjdCBhbGwgcm93cyBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgICB0aGlzLmZpbHRlcmVkUGFnZURhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmICghcm93LnBhcmVudElkKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHJvdy5yb3dJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkV2ZW50KGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEFjdGlvbiA9IHsgLi4uYWN0aW9uIH07XG4gICAgaWYgKCEhZW1pdEFjdGlvbiAmJiB0aGlzLnNlbGVjdGlvbkVtaXRNb2RlICE9PSAnTk9ORScpIHtcbiAgICAgIGVtaXRBY3Rpb24uc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbkVtaXRUeXBlKTtcbiAgICAgIHRoaXMuYWN0aW9uRXZlbnQuZW1pdChlbWl0QWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZWxlY3Rpb25FdmVudChpZDogYW55KTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGlvbk1vZGUpIHtcbiAgICAgIGNhc2UgJ0JBVENIJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlKGlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGUoaWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Sb3dFdmVudChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnksIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnTk9ORScgfHwgcm93Py5wYXJlbnRJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChyb3cucm93SWQpO1xuICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvbihldmVudCwgYWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRlZmF1bHRBY3Rpb24oKTogRGF0YVRhYmxlQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSAhPT0gJ05PTkUnID8gdGhpcy5yb3dBY3Rpb25zWzBdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaGlkZUFjdGlvbkNvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiYgdGhpcy5hY3Rpb25zLmV2ZXJ5KChpdCkgPT4gaXQudHlwZSA9PT0gJ05PTkUnKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1NlbGVjdGlvbihldmVudDogTW91c2VFdmVudCwgYWN0aW9uPzogRGF0YVRhYmxlQWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiZcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ1NJTkdMRScgJiZcbiAgICAgICEhYWN0aW9uICYmXG4gICAgICAhRGF0YVRhYmxlQ29tcG9uZW50LmlzQ2xpY2tPblJvd01lbnVJY29uKGV2ZW50KVxuICAgICkge1xuICAgICAgdGhpcy5vbkFjdGlvbkV2ZW50KGFjdGlvbik7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9TRUxFQ1RJT04nKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkV2ZW50LmVtaXQodGhpcy5nZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb25FbWl0VHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbkVtaXRUeXBlOiBEYXRhVGFibGVTZWxlY3Rpb25FbWl0VHlwZSk6IGFueVtdIHtcbiAgICBjb25zdCBzZWxlY3Rpb246IGFueVtdID0gW107XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQuZm9yRWFjaCgoaXQpID0+XG4gICAgICAvLyBpZiBJRC1nZW5lcmF0b3IgaXMgcHJvdmlkZWQsIHJldHVybiB0aGUgSUQsIGVsc2UgcmV0dXJuIHRoZSBBQ1RVQUwgZGF0YVxuICAgICAgc2VsZWN0aW9uLnB1c2godGhpcy5pZEdlbmVyYXRvciAmJiBzZWxlY3Rpb25FbWl0VHlwZSA9PT0gJ0lEJyA/IGl0IDogdGhpcy5fcm93TWFwLmdldChpdCk/LmFjdHVhbERhdGEpLFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNDbGlja09uUm93TWVudUljb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50Py50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1pY29uJyk7XG4gIH1cblxuICAvKiogU09SVCBIQU5ETElORyAqL1xuXG4gIG9uU29ydGluZ0V2ZW50KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuc29ydEV2ZW50LmVtaXQoc29ydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFNvcnQpIHtcbiAgICAgIHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLnNhdmVTb3J0KHRoaXMuaWQsIHNvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTb3J0RGF0YSgpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydERhdGEgPSB0aGlzLl91c2VBc3luY1xuICAgICAgPyBEYXRhVGFibGVTb3J0VXRpbC5zb3J0Tm90aGluZygpXG4gICAgICA6IERhdGFUYWJsZVNvcnRVdGlsLnNvcnREYXRhKHRoaXMuZGF0YVRhYmxlR2xvYmFsQ29uZmlnLmRhdGVUaW1lRm9ybWF0LCB0aGlzLmRhdGFUYWJsZUdsb2JhbENvbmZpZy5udW1iZXJGb3JtYXQpO1xuICB9XG5cbiAgLyoqIEZJTFRFUiBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXQgZmlsdGVyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQXN5bmMgJiYgdGhpcy5fZmlsdGVyTW9kZSA9PT0gJ1RBQkxFX0JBU0VEJyA/ICdOT05FJyA6IHRoaXMuX2ZpbHRlck1vZGU7XG4gIH1cblxuICBwdWJsaWMgb25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkZpbHRlcmluZ0V2ZW50KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ29sdW1uQmFzZWRGaWx0ZXJFdmVudChmaWx0ZXI6IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudChmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZUZpbHRlcmFibGVzKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsdGVyaW5nRXZlbnQoZmlsdGVyOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuZmlsdGVyRXZlbnQuZW1pdChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKGZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdEZpbHRlcikge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZUZpbHRlcih0aGlzLmlkLCBmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9XG4gICAgICB0aGlzLmZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnXG4gICAgICAgID8gRGF0YVRhYmxlRmlsdGVyVXRpbC5jb2x1bW5CYXNlZEZpbHRlclByZWRpY2F0ZSh0aGlzLl9yb3dNYXApXG4gICAgICAgIDogRGF0YVRhYmxlRmlsdGVyVXRpbC50YWJsZUJhc2VkRmlsdGVyUHJlZGljYXRlKCk7XG4gICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKHRoaXMuX2ZpbHRlclZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgdGhpcy5fZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAhIXZhbHVlID8gKGlzU3RyaW5nID8gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDogJyc7XG4gIH1cblxuICAvKiogUEFHSU5BVElPTiBIQU5ETElORyAqL1xuXG4gIG9uUGFnZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMucGFnZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZVBhZ2VTaXplKHRoaXMuaWQsIGV2ZW50LnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IDAgOiB0aGlzLnBhZ2UucGFnZUluZGV4O1xuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5wYWdlU2l6ZTtcbiAgfVxuXG4gIGdldCBwYWdlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRvcigpIHtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UuZW1pdCh0aGlzLnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGE/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2hvd0FsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3VzZUFzeW5jICYmICF0aGlzLnBhZ2luYXRpb25FbmFibGVkO1xuICB9XG5cbiAgLyoqIElOSVQgU1RBVEUgKi9cblxuICBwcml2YXRlIGluaXRTdGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBvbmx5IHNldCBkZWZhdWx0IHNvcnQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgc29ydCBwZXJzaXN0ZWRcbiAgICBpZiAoISF0aGlzLmRlZmF1bHRTb3J0ICYmICF0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkU29ydCh0aGlzLmlkKT8uZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNldFNvcnQodGhpcy5kZWZhdWx0U29ydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFNvcnQpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0RmlsdGVyKSB7XG4gICAgICB0aGlzLmluaXRGaWx0ZXJTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0UGFnZVNpemUpIHtcbiAgICAgIHRoaXMuaW5pdFBhZ2luYXRvclN0YXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRTb3J0KHRoaXMuaWQpO1xuICAgIGlmICghIXNvcnQpIHtcbiAgICAgIHRoaXMuc2V0U29ydChzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIHRoaXMuc29ydC5hY3RpdmUgPSBzb3J0LmFjdGl2ZTtcbiAgICB0aGlzLnNvcnQuZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZpbHRlclN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRGaWx0ZXIodGhpcy5pZCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlRmlsdGVyYWJsZXMoZmlsdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2luYXRvclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkUGFnZVNpemUodGhpcy5pZCkgfHwgdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGxlbmd0aDogMCxcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0b3IoKTtcbiAgfVxuXG4gIC8qKiBDT0xVTU4gSEFORExJTkcgKi9cblxuICBwdWJsaWMgb25WaWV3RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtblNldHRpbmdzKGRlZmluaXRpb24/OiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gPSBkZWZpbml0aW9uID8gZGVmaW5pdGlvbiA6IHRoaXMuX2FsbENvbHVtbkRlZmluaXRpb25zWzBdO1xuICAgIGlmICh0aGlzLl9hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiAmJiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Db2x1bW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBEYXRhVGFibGVEaWFsb2dEYXRhID0ge1xuICAgICAgYWxsQ29sdW1uczogdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbixcbiAgICAgIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkOiB0aGlzLmRlbGV0ZURlZmluaXRpb25BbGxvd2VkLFxuICAgICAgZmlsdGVyQ29sdW1uc0xhYmVsOiB0aGlzLmZpbHRlckNvbHVtbnNMYWJlbCxcbiAgICAgIGZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcjogdGhpcy5maWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIsXG4gICAgICBub0RhdGFUZXh0OiB0aGlzLm5vRGF0YVRleHQsXG4gICAgICB0aXRsZUxhYmVsOiB0aGlzLmNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsLFxuICAgICAgc2VsZWN0ZWRMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsLFxuICAgICAgYXZhaWxhYmxlTGFiZWw6IHRoaXMuYXZhaWxhYmxlTGFiZWwsXG4gICAgICBzYXZlTGFiZWw6IHRoaXMuc2F2ZUxhYmVsLFxuICAgICAgZGVsZXRlTGFiZWw6IHRoaXMuZGVsZXRlTGFiZWwsXG4gICAgICBjYW5jZWxMYWJlbDogdGhpcy5jYW5jZWxMYWJlbCxcbiAgICAgIGluZm9UZXh0TGFiZWw6IHRoaXMuaW5mb1RleHRMYWJlbCxcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMubWF0RGlhbG9nLm9wZW4oRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgZGF0YS1jeT1cInRhYmxlLWFjdGlvbi1iYXJcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtYWN0aW9uLWJhclwiPlxuICA8IS0tIFRhYmxlIGFjdGlvbnM6IGRpc3BsYXllZCBiZWZvcmUgdGhlIHRhYmxlIC0tPlxuICA8ZGl2ICpuZ0lmPVwidGFibGVBY3Rpb25zPy5sZW5ndGggfHwgKGZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnICYmIHNob3dEZWxldGVGaWx0ZXJBY3Rpb24pXCI+XG4gICAgPG1hZC1idXR0b24tZ3JvdXAgKm5nRm9yPVwibGV0IGFjdGlvbkdyb3VwIG9mIHRhYmxlQWN0aW9uc1wiIGNsYXNzPVwidGFibGUtYWN0aW9uLWdyb3VwXCI+XG4gICAgICA8bWFkLW91dGxpbmUtYnV0dG9uXG4gICAgICAgIFtoaWRkZW5dPVwiaXNIaWRkZW4odGFibGVBY3Rpb24pXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24pXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIGFjdGlvbkdyb3VwXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uRXZlbnQodGFibGVBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHRhYmxlQWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IHRhYmxlQWN0aW9uLmxhYmVsIH19XG4gICAgICAgIHt7IGdldFNlbGVjdGVkQ291bnQodGFibGVBY3Rpb24udHlwZSkgfX1cbiAgICAgIDwvbWFkLW91dGxpbmUtYnV0dG9uPlxuICAgIDwvbWFkLWJ1dHRvbi1ncm91cD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyAmJiBzaG93RGVsZXRlRmlsdGVyQWN0aW9uXCI+XG4gICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIGNsYXNzPVwiZGVsZXRlLWZpbHRlci1hY3Rpb25cIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25EZWxldGVGaWx0ZXIoKVwiXG4gICAgICA+ZmlsdGVyX2FsdF9vZmY8L21hdC1pY29uXG4gICAgPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGRhdGEtY3k9XCJmaWx0ZXItaW5wdXRcIiAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdUQUJMRV9CQVNFRCdcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRyYW5zbGF0ZUxhYmVscyA/IChmaWx0ZXJMYWJlbCB8IHRyYW5zbGF0ZSkgOiBmaWx0ZXJMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiAoa2V5dXApPVwib25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwie3sgZmlsdGVyUGxhY2Vob2xkZXIgfX1cIiAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjwhLS0gUm93IGFjdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNyb3dBY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93QWN0aW9uIG9mIHJvd0FjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tbWVudS1idXR0b25cIlxuICAgICAgICAqbmdJZj1cIiFpc0hpZGRlbihyb3dBY3Rpb24pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQsIHJvd0FjdGlvbilcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChyb3dBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHJvd0FjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiByb3dBY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBlZGl0YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI2VkaXRhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uKVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pIH1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gdmlld2FibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN2aWV3YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2Ygdmlld2FibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICBtYXQtbWVudS1pdGVtXG4gICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cIm9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKSB9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIFRhYmxlIC0tPlxuPGRpdlxuICAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnIHx8IHNob3dFbXB0eVRhYmxlIHx8ICEhZmlsdGVyZWRQYWdlRGF0YT8ubGVuZ3RoOyBlbHNlIG5vRGF0YVwiXG4gIGNsYXNzPVwiZGF0YXRhYmxlXCJcbiAgW2NsYXNzXT1cInRhYmxlQ2xhc3NcIlxuPlxuICA8ZGl2IGNsYXNzPVwibWFkLWRhdGF0YWJsZS1zcGlubmVyLXdyYXBwZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICA8L2Rpdj5cbiAgPHRhYmxlXG4gICAgW2lkXT1cImlkXCJcbiAgICBtYXQtdGFibGVcbiAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICBtYXRTb3J0XG4gICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0aW5nRXZlbnQoJGV2ZW50KVwiXG4gICAgbWFkRmlsdGVyXG4gICAgKG1hZEZpbHRlckNoYW5nZSk9XCJvbkNvbHVtbkJhc2VkRmlsdGVyRXZlbnQoJGV2ZW50KVwiXG4gICAgW211bHRpVGVtcGxhdGVEYXRhUm93c109XCIhIWV4cGFuZGFibGVEZWZcIlxuICA+XG4gICAgPCEtLSBSb3cgYWN0aW9ucyBjb2x1bW4tLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiQUNUSU9OX0NPTFVNTl9OQU1FXCI+XG4gICAgICA8dGggc2NvcGU9XCJjb2xcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwic2hvd0FjdGlvbkNvbHVtbiA/ICdyb3ctYWN0aW9uLWNlbGwnIDogJ25vLWFjdGlvbi1jZWxsJ1wiPlxuICAgICAgICA8IS0tIEJBVENIOiBtYXN0ZXIgY2hlY2tib3ggLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3Rpb25FbWl0TW9kZSAhPT0gJ05PTkUnICYmIHNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCdcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIm9uVG9nZ2xlU2VsZWN0QWxsKClcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiPiA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU0lOR0xFIC8gTk9ORTogbm90aGluZyBpbiBoZWFkZXIgcm93IC0tPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW25nQ2xhc3NdPVwic2hvd0FjdGlvbkNvbHVtbiA/ICdyb3ctYWN0aW9uLWNlbGwnIDogJ25vLWFjdGlvbi1jZWxsJ1wiPlxuICAgICAgICA8IS0tIEJBVENIOiByb3cgY2hlY2tib3ggLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93Q2hlY2tib3goZWxlbWVudClcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50KVwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XCJuby1wb2ludGVyLWV2ZW50c1wiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoZWxlbWVudC5yb3dJZClcIj4gPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRTogcm93IGFjdGlvbiBtZW51IGljb24gLS0+XG4gICAgICAgIDxtYWQtaWNvbi1idXR0b24gZGF0YS1jeT1cInJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cInNob3dSb3dBY3Rpb25JY29uKGVsZW1lbnQpICYmIGhhc1Zpc2libGVSb3dBY3Rpb25zKGVsZW1lbnQpXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cInsgZWxlbWVudDogZWxlbWVudCB9XCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwicm93QWN0aW9uTWVudVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0aW9uRXZlbnQoZWxlbWVudC5yb3dJZClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIFNJTkdMRTogcm93IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dSYWRpb0J1dHRvbihlbGVtZW50KVwiIGNsYXNzPVwibWFkLWRhdGF0YWJsZS1jaGVja2JveC1jb250YWluZXJcIiAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJuby1wb2ludGVyLWV2ZW50c1wiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoZWxlbWVudC5yb3dJZClcIj4gPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFWFBBTkRBQkxFOiByb3cgaXMgZXhwYW5kYWJsZS9jb2xsYXBzYWJsZSAtLT5cbiAgICAgICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cInNob3dFeHBhbmRhYmxlQnV0dG9uKGVsZW1lbnQpXCIgKGNsaWNrKT1cIm9uRXhwYW5kKCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgIT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIE5PTkU6IG5vdGhpbmcgLS0+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gQ2VsbCBkZWZpbml0aW9ucyBhbmQgcm93cyB3aXRoIGluamVjdGVkIGNlbGxzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4uaWRcIj5cbiAgICAgIDwhLS0gaGVhZGVyIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbilcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlQnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lID8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInRklMVEVSJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIG1hZC1maWx0ZXItaGVhZGVyPVwie3sgY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW21hZEZpbHRlckNvbHVtblJpZ2h0QWxpZ25lZF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgW21hZEZpbHRlck9wdGlvbnNdPVwiY29sdW1uLmZpbHRlclBhcmFtcz8uZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlRfQU5EX0ZJTFRFUidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBtYXQtc29ydC1oZWFkZXI9XCJ7eyBjb2x1bW4ub3JkZXJCeU5hbWUgPyBjb2x1bW4ub3JkZXJCeU5hbWUgOiBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbYXJyb3dQb3NpdGlvbl09XCJjb2x1bW4uaXNSaWdodEFsaWduZWQgPyAnYmVmb3JlJyA6ICdhZnRlcidcIlxuICAgICAgICAgICAgbWFkLWZpbHRlci1oZWFkZXI9XCJ7eyBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyQ29sdW1uUmlnaHRBbGlnbmVkXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyT3B0aW9uc109XCJjb2x1bW4uZmlsdGVyUGFyYW1zPy5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGRhdGEgY2VsbCB0byBiZSBpbmplY3RlZCAtLT5cbiAgICAgIDx0ZFxuICAgICAgICBtYXQtY2VsbFxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCJcbiAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgW2NsYXNzLm1hZC1kdC1jaGlsZC1jZWxsXT1cImVsZW1lbnQucGFyZW50SWRcIlxuICAgICAgICBbbmdTd2l0Y2hdPVwiY29sdW1uLnRyYW5zZm9ybWVyXCJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlUm93Q2xpY2sgJiYgb25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBnZXRDdXN0b21DZWxsVGVtcGxhdGUoY29sdW1uLmlkKSB8fCBkZWZhdWx0Q2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiwgZWxlbWVudDogZWxlbWVudCwgJGltcGxpY2l0OiBlbGVtZW50IH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZXhwYW5kYWJsZURlZlwiIFttYXRDb2x1bW5EZWZdPVwiZXhwYW5kYWJsZUNvbHVtbkRlZlwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1hcmVhXCIgW0BkZXRhaWxFeHBhbmRdPVwiZWxlbWVudCA9PT0gZXhwYW5kZWRFbGVtZW50ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCkgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGVsZW1lbnQsIGVsZW1lbnQ6IGVsZW1lbnQsICRpbXBsaWNpdDogZWxlbWVudCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBoZWFkZXIgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHNcIj48L3RyPlxuICAgIDwhLS0gZGF0YSByb3cgd2hlcmUgY2VsbHMgd2lsbCBiZSBpbmplY3RlZCAtLT5cbiAgICA8dHJcbiAgICAgIG1hdC1yb3dcbiAgICAgIFtjbGFzcy5jbGlja2FibGUtdGFibGUtcm93XT1cIiFyb3cucGFyZW50SWQgJiYgc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJ1wiXG4gICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzXCJcbiAgICAgIChjbGljayk9XCJvbkV4cGFuZCgkZXZlbnQsIHJvdylcIlxuICAgID48L3RyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWV4cGFuZGFibGVEZWZcIj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgZWxlbWVudDsgY29sdW1uczogW2V4cGFuZGFibGVDb2x1bW5EZWZdXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1leHBhbmRhYmxlLXJvd1wiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHRyIGNsYXNzPVwibWF0LXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICA8dGQgY2xhc3M9XCJtYXQtY2VsbCBub0RhdGFUZXh0IGNvbHVtbkJhc2VkRmlsdGVyXCIgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5JZHMubGVuZ3RoXCI+XG4gICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChub0RhdGFUZXh0IHwgdHJhbnNsYXRlKSA6IG5vRGF0YVRleHQgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90YWJsZT5cbjwvZGl2PlxuPGRpdiBkYXRhLWN5PVwidGFibGUtYm90dG9tLWFyZWFcIiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWJvdHRvbS1hcmVhXCI+XG4gIDxkaXYgZGF0YS1jeT1cImRlZmluaXRpb24tYnV0dG9uLWJsb2NrXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20taW5mby1hcmVhXCI+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IDEgZGVmaW5pdGlvbiAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoID09PSAxXCIgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoKVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj52aWV3X2NvbHVtbjwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCIoZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoIHx8IDApID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJlZGl0YWJsZURlZmluaXRpb25NZW51XCI+XG4gICAgICA8bWF0LWljb24+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHZpZXc6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCIodmlld2FibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoIHx8IDApID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ2aWV3YWJsZURlZmluaXRpb25NZW51XCI+XG4gICAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgPG1hdC1wYWdpbmF0b3JcbiAgICBbc3R5bGUuZGlzcGxheV09XCJwYWdpbmF0aW9uRW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgIFtsZW5ndGhdPVwicGFnZUxlbmd0aFwiXG4gICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgIChwYWdlKT1cIm9uUGFnZUV2ZW50KCRldmVudClcIlxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zXG4gID5cbiAgPC9tYXQtcGFnaW5hdG9yPlxuPC9kaXY+XG5cbjwhLS0gTm8gZGF0YSBhbGVydCAtLT5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8ZGl2IGRhdGEtY3k9XCJuby1kYXRhLWJsb2NrXCIgY2xhc3M9XCJub0RhdGFUZXh0XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgIDwvZGl2PlxuICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChub0RhdGFUZXh0IHwgdHJhbnNsYXRlKSA6IG5vRGF0YVRleHQgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIGRlZmF1bHQgY2VsbCB0ZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUZW1wbGF0ZSBsZXQtZWxlbWVudD1cImVsZW1lbnRcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxzcGFuPlxuICAgIHt7IGVsZW1lbnRbY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWVdIH19XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gY3VzdG9tIGNlbGwgdGVtcGxhdGVzIGluamVjdGVkIGZyb20gcGFyZW50IC0tPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
765
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFJTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVUvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFJbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FB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QXNCO3NCQUE5QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBU08sYUFBYTtzQkFBekIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBS08saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBT08saUJBQWlCO3NCQUE3QixLQUFLO2dCQWFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBUU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQUtPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFRTyx5QkFBeUI7c0JBQXJDLEtBQUs7Z0JBT08saUJBQWlCO3NCQUE3QixLQUFLO2dCQWNPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBT0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFFa0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUVDLE9BQU87c0JBQTlCLFNBQVM7dUJBQUMsT0FBTztnQkFJVSxNQUFNO3NCQUFqQyxTQUFTO3VCQUFDLGVBQWU7Z0JBR3RCLFVBQVU7c0JBRGIsZUFBZTt1QkFBQyxpQ0FBaUM7Z0JBVzlDLGFBQWE7c0JBRGhCLFlBQVk7dUJBQUMseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1hY3Rpb24nO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSxcbiAgRGF0YVRhYmxlRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtY29sdW1uLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgRGF0YVRhYmxlUm93IH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtcm93JztcbmltcG9ydCB7IERhdGFUYWJsZUhlYWRlclR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1oZWFkZXItdHlwZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtZmlsdGVyLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci1vYmplY3QnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1zZWxlY3Rpb24tZW1pdC10eXBlJztcbmltcG9ydCB7IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLWVtaXQtbW9kZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU29ydFV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uVXRpbCB9IGZyb20gJy4vdXRpbC9kYXRhLXRhYmxlLWFjdGlvbi11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZURhdGFVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtZGF0YS11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlclV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1maWx0ZXItdXRpbCc7XG5pbXBvcnQge1xuICBEQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0VfUFJPVklERVIsXG4gIERhdGFUYWJsZVBlcnNpc3RlbmNlU2VydmljZSxcbiAgTUFEX0RBVEFfVEFCTEVfUEVSU0lTVEVOQ0VfU0VSVklDRSxcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04sXG4gIERhdGFUYWJsZUdsb2JhbENvbmZpZ3VyYXRpb24sXG4gIE1BRF9EQVRBX1RBQkxfR0xPQkFMX0NPTkZJR1VSQVRJT05fUFJPVklERVIsXG59IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWdsb2JhbC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJIZWFkZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtZmlsdGVyL2RhdGEtdGFibGUtZmlsdGVyLWhlYWRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtY29sdW1uLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtZXhwYW5kYWJsZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1leHBhbmRhYmxlLWNvbHVtbi1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVQZXJzaXN0ZW5jZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1wZXJzaXN0ZW5jZS1jb25maWd1cmF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsdm9pZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgIERyYWdEcm9wTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERhdGFUYWJsZUZpbHRlckhlYWRlcixcbiAgICBEYXRhVGFibGVGaWx0ZXIsXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24sXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgICBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbixcbiAgXSxcbiAgcHJvdmlkZXJzOiBbREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFX1BST1ZJREVSLCBNQURfREFUQV9UQUJMX0dMT0JBTF9DT05GSUdVUkFUSU9OX1BST1ZJREVSXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAvLyBUcmFuc2xhdGlvbnNcbiAgQElucHV0KCkgZmlsdGVyTGFiZWwgPSAnY29tbW9uLmZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2hvd0VtcHR5VGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgdHJhbnNsYXRlTGFiZWxzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgdXNlQXN5bmModXNlQXN5bmM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91c2VBc3luYyA9IHVzZUFzeW5jO1xuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFBsZWFzZSB1c2UgdGhlIG1vcmUgc3BlY2lmaWMgcGVyc2lzdGVuY2VDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0YXRlZnVsKHN0YXRlZnVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZUNvbmZpZyA9IHtcbiAgICAgIHBlcnNpc3RTb3J0OiBzdGF0ZWZ1bCxcbiAgICAgIHBlcnNpc3RGaWx0ZXI6IHN0YXRlZnVsLFxuICAgICAgcGVyc2lzdFBhZ2VTaXplOiBzdGF0ZWZ1bCxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgcGVyc2lzdGVuY2VDb25maWc6IERhdGFUYWJsZVBlcnNpc3RlbmNlQ29uZmlndXJhdGlvbiA9IHtcbiAgICBwZXJzaXN0U29ydDogZmFsc2UsXG4gICAgcGVyc2lzdEZpbHRlcjogZmFsc2UsXG4gICAgcGVyc2lzdFBhZ2VTaXplOiBmYWxzZSxcbiAgfTtcblxuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdGFibGVEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGlkR2VuZXJhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIHBhcmVudElkR2VuZXJhdG9yOiBhbnk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFNvcnQ6IFNvcnQ7XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25FbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2U6IFBhZ2VFdmVudCA9IHsgcGFnZUluZGV4OiAwLCBwYWdlU2l6ZTogNTAsIGxlbmd0aDogMCB9O1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDE1XTtcblxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgPSAnSUQnO1xuICBASW5wdXQoKSBzaG93RGVsZXRlRmlsdGVyQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVJvd0NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVsKHNlbGVjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogUGxlYXNlIHVzZSBcImZpbHRlck1vZGVcIiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyRW5hYmxlZChpc0ZpbHRlckVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJNb2RlID0gaXNGaWx0ZXJFbmFibGVkID8gJ1RBQkxFX0JBU0VEJyA6ICdOT05FJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyUHJlZGljYXRlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyTW9kZShmaWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlKSB7XG4gICAgdGhpcy5fZmlsdGVyTW9kZSA9IGZpbHRlck1vZGU7XG4gICAgdGhpcy5hcHBseUZpbHRlclByZWRpY2F0ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlclZhbHVlKGZpbHRlclZhbHVlOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9maWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZSh0aGlzLl9maWx0ZXJWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXh0ZXJuYWxQYWdpbmF0b3IocGFnaW5hdG9yOiBhbnkpIHtcbiAgICB0aGlzLmV4dFBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIC4uLnRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkZWZhdWx0U2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbkVtaXRNb2RlKHNlbGVjdGlvbkVtaXRNb2RlOiBEYXRhVGFibGVTZWxlY3Rpb25FbWl0TW9kZSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gc2VsZWN0aW9uRW1pdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhpcyBmdW5jdGlvbiBtaXhlcyB1cCAyIHJlc3BvbnNpYmlsaXRpZXM6XG4gICAqICAtIGRldGVybWluaW5nIGlmIGFjdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZCAvIGhhbmRsZWRcbiAgICogIC0gZGV0ZXJtaW5pbmcgd2hldGhlciBhY3Rpb25zIGFyZSByb3cgYmFzZWQgKHNpbmdsZSkgb3IgdGFibGUgYmFzZWQgKGJhdGNoKVxuICAgKiBQbGVhc2UgdXNlIGEgY29tYmluYXRpb24gb2YgXCJzZWxlY3Rpb25FbWl0TW9kZVwiIGFuZCBcInNlbGVjdGlvbk1vZGVcIiBpbnN0ZWFkOlxuICAgKiAgLSBzZWxlY3Rpb25FbWl0TW9kZSBkZXRlcm1pbmVzIGhvdyBzZWxlY3RlZCBpdGVtcyBhcmUgaGFuZGxlZCAoYXMgcGFydCBvZiBhY3Rpb25zLCBhcyBzZWxlY3Rpb25zIG9yIG5vdCBhdCBhbGwpXG4gICAqICAtIHNlbGVjdGlvbk1vZGUgZGV0ZXJtaW5lcyBpZiBzZWxlY3RlZCBpdGVtcyBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IChzaW5nbGUpIG9yIHRvZ2V0aGVyIChiYXRjaClcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmb3JjZU1vZGUoc2VsZWN0aW9uTW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gJ09OX0FDVElPTic7XG4gICAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSA8RGF0YVRhYmxlU2VsZWN0aW9uTW9kZT5zZWxlY3Rpb25Nb2RlO1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9yY2VTZWxlY3Rpb25Nb2RlKHNlbGVjdGlvbk1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUpIHtcbiAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1ucyhjb2xzOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2xzID8gWy4uLmNvbHNdIDogW107XG4gICAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuY29sdW1ucyA9IGRlZi5kaXNwbGF5ZWRDb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uaWQpO1xuICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiA9IGRlZjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5EZWZpbml0aW9ucyhkZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdKSB7XG4gICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy5fYWxsQ29sdW1uRGVmaW5pdGlvbnMgPSBbLi4uZGVmaW5pdGlvbnNdO1xuICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBkZWZpbml0aW9ucykge1xuICAgICAgaWYgKGRlZmluaXRpb24uZWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5pdGlvbi5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhbGxDb2x1bW5zKGFsbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5fc2hvd0NvbHVtbk1vZGFsKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIGFsbENvbHVtbnNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZT4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAvLyB3ZSBuZWVkIHRvIGhhdmUgdGhpcyBhcyBhIHNldHRlciBkdWUgdG8gdGhlICpuZ0lmIGl0IGlzIGluXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IG1hdFNvcnQobWF0U29ydDogTWF0U29ydCkge1xuICAgIHRoaXMuX3NvcnQgPSBtYXRTb3J0O1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5fc29ydDtcbiAgfVxuICBAVmlld0NoaWxkKERhdGFUYWJsZUZpbHRlcikgZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXI7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24pXG4gIHNldCBjb2x1bW5EZWZzKGNvbHVtbkRlZnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uRGVmcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmcztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24pXG4gIHNldCBleHBhbmRhYmxlRGVmKGV4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZXhwYW5kYWJsZURlZiA9IGV4cGFuZGFibGVEZWY7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgZXhwYW5kYWJsZURlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZjtcbiAgfVxuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnlbXT47XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcmVhZG9ubHkgQUNUSU9OX0NPTFVNTl9OQU1FID0gJ19fYWN0aW9uX18nO1xuICB0YWJsZUFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbltdW10gPSBbXTtcbiAgcm93QWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcblxuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuXG4gIGV4cGFuZGVkRWxlbWVudDogRGF0YVRhYmxlQ29sdW1uIHwgbnVsbDtcblxuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcblxuICBwcml2YXRlIF91c2VBc3luYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3Jvd01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhVGFibGVSb3c+KCk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odHJ1ZSk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXTtcblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0O1xuXG4gIHByaXZhdGUgX2ZvcmNlU2VsZWN0aW9uTW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uTW9kZTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW1pdE1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2FsbENvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfc2hvd0NvbHVtbk1vZGFsID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbj4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2V4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgQEluamVjdChNQURfREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFKSBwcml2YXRlIHBlcnNpc3RlbmNlU2VydmljZTogRGF0YVRhYmxlUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04pIHByaXZhdGUgZGF0YVRhYmxlR2xvYmFsQ29uZmlnOiBEYXRhVGFibGVHbG9iYWxDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuX3NvcnQ7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCd0YWJsZURhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLmdldFNlbGVjdGlvbignSUQnKS5sZW5ndGggPyB0aGlzLmdldFNlbGVjdGlvbignSUQnKSA6IHRoaXMuX3NlbGVjdGlvbik7XG4gICAgICBpZiAodGhpcy5zaG93QWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnaWRHZW5lcmF0b3InIGluIGNoYW5nZXMgfHwgJ2Rpc3BsYXllZENvbHVtbnMnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHNhbWUgYmVoYXZpb3VyIGNvdWxkIGJlIGFjaGl2ZWQgaW4gZ2V0dGVycylcbiAgICBpZiAoJ2ZvcmNlTW9kZScgaW4gY2hhbmdlcyB8fCAnZm9yY2VTZWxlY3Rpb25Nb2RlJyBpbiBjaGFuZ2VzIHx8ICdhY3Rpb25zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gRGF0YVRhYmxlQWN0aW9uVXRpbC5nZXREaXNwbGF5QWN0aW9ucyh0aGlzLmFjdGlvbnMsIHRoaXMuc2VsZWN0aW9uTW9kZSk7XG4gICAgICB0aGlzLnJvd0FjdGlvbnMgPSBhY3Rpb25zLnJvd0FjdGlvbnM7XG4gICAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IGFjdGlvbnMuZ3JvdXBlZFRhYmxlQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKiogVEFCTEUgRElTUExBWSBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKTogRGF0YVRhYmxlSGVhZGVyVHlwZSB7XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmICFjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ1NPUlQnO1xuICAgIH1cbiAgICBpZiAoIWNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnRklMVEVSJztcbiAgICB9XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnU09SVF9BTkRfRklMVEVSJztcbiAgICB9XG4gICAgcmV0dXJuICdQTEFJTic7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbklkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy5fY29sdW1uRGVmcz8uZmluZCgoaXQpID0+IGl0Lm1hZENvbHVtbkRlZiA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5EZWYgJiYgY29sdW1uRGVmLmNlbGxEZWYgPyBjb2x1bW5EZWYuY2VsbERlZi5nZXRDZWxsVGVtcGxhdGUoKSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uZ2V0Q2VsbFRlbXBsYXRlKCkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwYW5kYWJsZUNvbHVtbkRlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uY29sdW1uRGVmLm1hZEV4cGFuZGFibGVDb2x1bW5EZWYgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gdGhpcy5leHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnQgPyBudWxsIDogZWxlbWVudDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gQlVUVE9OIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgaGFzVmlzaWJsZVJvd0FjdGlvbnMoZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJvd0FjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4gdGhpcy5pc0hpZGRlbkZvckRhdGEoYWN0aW9uLCBbdGhpcy5fcm93TWFwLmdldChkaXNwbGF5ZWREYXRhLnJvd0lkKT8uYWN0dWFsRGF0YV0pKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRm9yRGF0YShhY3Rpb24sIHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbkZvckRhdGEoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIGRhdGE6IGFueVtdKSB7XG4gICAgcmV0dXJuICEhYWN0aW9uLmlzSGlkZGVuICYmIGFjdGlvbi5pc0hpZGRlbihkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uLnR5cGUpIHx8ICghIWFjdGlvbi5pc0Rpc2FibGVkICYmIGFjdGlvbi5pc0Rpc2FibGVkKHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50ICE9PSAxO1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50IDwgMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSAnQkFUQ0gnIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCAoJHtjb3VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBUQUJMRSBEQVRBIENIQU5HRSBIQU5ETElORyAqL1xuXG4gIHByaXZhdGUgdXBkYXRlRGF0YVRhYmxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGltbXV0YWJsZSAtIHdlIGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHJlZmVyZW5jZSBvZiByb3dNYXAgdG8gc3RheSB0aGUgc2FtZVxuICAgIERhdGFUYWJsZURhdGFVdGlsLnVwZGF0ZVJvd01hcCh0aGlzLl9yb3dNYXAsIHRoaXMudGFibGVEYXRhLCB0aGlzLmNvbHVtbnMsIHRoaXMuaWRHZW5lcmF0b3IsIHRoaXMucGFyZW50SWRHZW5lcmF0b3IpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dNYXAudmFsdWVzKCkpLm1hcCgoaXQpID0+IGl0LmRpc3BsYXllZERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIHNlbGVjdGlvbj8uZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yb3dNYXAuZ2V0KGl0KSB8fCBbLi4udGhpcy5fcm93TWFwLnZhbHVlcygpXS5maW5kKChyb3cpID0+IHJvdy5hY3R1YWxEYXRhID09PSBpdCk7XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gJiBTRUxFQ1RJT04gSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkVtaXRNb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyAmJiAhIXRoaXMuYWN0aW9ucy5sZW5ndGggPyAnT05fQUNUSU9OJyA6IHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiAhIXRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA/IHRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA6IHRoaXMuYWN0aW9ucy5maW5kKChpdCkgPT4gaXQudHlwZSA9PT0gJ0JBVENIJykgPyAnQkFUQ0gnIDogJ1NJTkdMRSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcmVkUGFnZURhdGEoKTogYW55W10ge1xuICAgIC8vIG9ubHkgdXNlIGZpbHRlcmVkIGRhdGFcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dBY3Rpb25Db2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ05PTkUnIHx8IHRoaXMuaGlkZUFjdGlvbkNvbHVtbikgfHwgISF0aGlzLl9leHBhbmRhYmxlRGVmO1xuICB9XG5cbiAgcHVibGljIHNob3dDaGVja2JveChkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnICYmICF0aGlzLmhpZGVBY3Rpb25Db2x1bW47XG4gIH1cblxuICBwdWJsaWMgc2hvd1Jvd0FjdGlvbkljb24oZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFkaXNwbGF5ZWREYXRhLnBhcmVudElkICYmIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ1NJTkdMRScgJiYgIXRoaXMuaGlkZUFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93UmFkaW9CdXR0b24oZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFkaXNwbGF5ZWREYXRhLnBhcmVudElkICYmIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9TRUxFQ1RJT04nICYmIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ1NJTkdMRSc7XG4gIH1cblxuICBwdWJsaWMgc2hvd0V4cGFuZGFibGVCdXR0b24oZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFkaXNwbGF5ZWREYXRhLnBhcmVudElkICYmICEhdGhpcy5fZXhwYW5kYWJsZURlZjtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlbGVjdGVkKHJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChyb3dJZCk7XG4gIH1cblxuICBwdWJsaWMgb25Ub2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgLy8gY2xlYXIgYWxsIHNlbGVjdGlvbiBmaXJzdFxuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZmlsdGVyZWRQYWdlRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgaWYgKCFyb3cucGFyZW50SWQpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Qocm93LnJvd0lkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uRXZlbnQoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBlbWl0QWN0aW9uID0geyAuLi5hY3Rpb24gfTtcbiAgICBpZiAoISFlbWl0QWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJykge1xuICAgICAgZW1pdEFjdGlvbi5zZWxlY3RlZCA9IHRoaXMuZ2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uRW1pdFR5cGUpO1xuICAgICAgdGhpcy5hY3Rpb25FdmVudC5lbWl0KGVtaXRBY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdGlvbkV2ZW50KGlkOiBhbnkpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0aW9uTW9kZSkge1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGUoaWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1NJTkdMRSc6XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZShpZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJvd0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IGFueSwgYWN0aW9uID0gdGhpcy5kZWZhdWx0QWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyB8fCByb3c/LnBhcmVudElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vblNlbGVjdGlvbkV2ZW50KHJvdy5yb3dJZCk7XG4gICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uKGV2ZW50LCBhY3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGVmYXVsdEFjdGlvbigpOiBEYXRhVGFibGVBY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkVtaXRNb2RlICE9PSAnTk9ORScgPyB0aGlzLnJvd0FjdGlvbnNbMF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBoaWRlQWN0aW9uQ29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnT05fQUNUSU9OJyAmJiB0aGlzLmFjdGlvbnMuZXZlcnkoKGl0KSA9PiBpdC50eXBlID09PSAnTk9ORScpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50LCBhY3Rpb24/OiBEYXRhVGFibGVBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnT05fQUNUSU9OJyAmJlxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyAmJlxuICAgICAgISFhY3Rpb24gJiZcbiAgICAgICFEYXRhVGFibGVDb21wb25lbnQuaXNDbGlja09uUm93TWVudUljb24oZXZlbnQpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uQWN0aW9uRXZlbnQoYWN0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX1NFTEVDVElPTicpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRXZlbnQuZW1pdCh0aGlzLmdldFNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbkVtaXRUeXBlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3Rpb24oc2VsZWN0aW9uRW1pdFR5cGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRUeXBlKTogYW55W10ge1xuICAgIGNvbnN0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5mb3JFYWNoKChpdCkgPT5cbiAgICAgIC8vIGlmIElELWdlbmVyYXRvciBpcyBwcm92aWRlZCwgcmV0dXJuIHRoZSBJRCwgZWxzZSByZXR1cm4gdGhlIEFDVFVBTCBkYXRhXG4gICAgICBzZWxlY3Rpb24ucHVzaCh0aGlzLmlkR2VuZXJhdG9yICYmIHNlbGVjdGlvbkVtaXRUeXBlID09PSAnSUQnID8gaXQgOiB0aGlzLl9yb3dNYXAuZ2V0KGl0KT8uYWN0dWFsRGF0YSksXG4gICAgKTtcblxuICAgIHJldHVybiBzZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0NsaWNrT25Sb3dNZW51SWNvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWljb24nKTtcbiAgfVxuXG4gIC8qKiBTT1JUIEhBTkRMSU5HICovXG5cbiAgb25Tb3J0aW5nRXZlbnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl91c2VBc3luYykge1xuICAgICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0U29ydCkge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZVNvcnQodGhpcy5pZCwgc29ydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnREYXRhKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0RGF0YSA9IHRoaXMuX3VzZUFzeW5jXG4gICAgICA/IERhdGFUYWJsZVNvcnRVdGlsLnNvcnROb3RoaW5nKClcbiAgICAgIDogRGF0YVRhYmxlU29ydFV0aWwuc29ydERhdGEoWy4uLnRoaXMuZGF0YVRhYmxlR2xvYmFsQ29uZmlnLmRhdGVUaW1lRm9ybWF0XSwgdGhpcy5kYXRhVGFibGVHbG9iYWxDb25maWcubnVtYmVyRm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBGSUxURVIgSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IGZpbHRlck1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZUFzeW5jICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09ICdUQUJMRV9CQVNFRCcgPyAnTk9ORScgOiB0aGlzLl9maWx0ZXJNb2RlO1xuICB9XG5cbiAgcHVibGljIG9uVGFibGVCYXNlZEZpbHRlckV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQpLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtbkJhc2VkRmlsdGVyRXZlbnQoZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uRmlsdGVyaW5nRXZlbnQoZmlsdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlbGV0ZUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLm9uRmlsdGVyaW5nRXZlbnQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmZpbHRlci51cGRhdGVGaWx0ZXJhYmxlcyh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbHRlcmluZ0V2ZW50KGZpbHRlcjogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLmZpbHRlckV2ZW50LmVtaXQoZmlsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RGaWx0ZXIpIHtcbiAgICAgIHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLnNhdmVGaWx0ZXIodGhpcy5pZCwgZmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVyUHJlZGljYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPVxuICAgICAgdGhpcy5maWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJ1xuICAgICAgICA/IERhdGFUYWJsZUZpbHRlclV0aWwuY29sdW1uQmFzZWRGaWx0ZXJQcmVkaWNhdGUodGhpcy5fcm93TWFwKVxuICAgICAgICA6IERhdGFUYWJsZUZpbHRlclV0aWwudGFibGVCYXNlZEZpbHRlclByZWRpY2F0ZSgpO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZSh0aGlzLl9maWx0ZXJWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVyVmFsdWUodmFsdWU6IHN0cmluZyB8IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIHRoaXMuX2ZpbHRlclZhbHVlID09PSAnc3RyaW5nJztcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gISF2YWx1ZSA/IChpc1N0cmluZyA/IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpKSA6ICcnO1xuICB9XG5cbiAgLyoqIFBBR0lOQVRJT04gSEFORExJTkcgKi9cblxuICBvblBhZ2VFdmVudChldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLnBhZ2VFdmVudC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0UGFnZVNpemUpIHtcbiAgICAgIHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLnNhdmVQYWdlU2l6ZSh0aGlzLmlkLCBldmVudC5wYWdlU2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhZ2VJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGwgPyAwIDogdGhpcy5wYWdlLnBhZ2VJbmRleDtcbiAgfVxuXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGwgPyB0aGlzLmRhdGFMZW5ndGggOiB0aGlzLnBhZ2UucGFnZVNpemU7XG4gIH1cblxuICBnZXQgcGFnZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGwgPyB0aGlzLmRhdGFMZW5ndGggOiB0aGlzLnBhZ2UubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0b3IoKSB7XG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlLmVtaXQodGhpcy5wYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBkYXRhTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5kYXRhPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNob3dBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl91c2VBc3luYyAmJiAhdGhpcy5wYWdpbmF0aW9uRW5hYmxlZDtcbiAgfVxuXG4gIC8qKiBJTklUIFNUQVRFICovXG5cbiAgcHJpdmF0ZSBpbml0U3RhdGUoKTogdm9pZCB7XG4gICAgLy8gb25seSBzZXQgZGVmYXVsdCBzb3J0IGlmIHRoZXJlIGlzIG5vIG90aGVyIHNvcnQgcGVyc2lzdGVkXG4gICAgaWYgKCEhdGhpcy5kZWZhdWx0U29ydCAmJiAhdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2UubG9hZFNvcnQodGhpcy5pZCk/LmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5zZXRTb3J0KHRoaXMuZGVmYXVsdFNvcnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RTb3J0KSB7XG4gICAgICB0aGlzLmluaXRTb3J0U3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdEZpbHRlcikge1xuICAgICAgdGhpcy5pbml0RmlsdGVyU3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFBhZ2VTaXplKSB7XG4gICAgICB0aGlzLmluaXRQYWdpbmF0b3JTdGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U29ydFN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvcnQgPSB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkU29ydCh0aGlzLmlkKTtcbiAgICBpZiAoISFzb3J0KSB7XG4gICAgICB0aGlzLnNldFNvcnQoc29ydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTb3J0KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zb3J0LmFjdGl2ZSA9IHNvcnQuYWN0aXZlO1xuICAgIHRoaXMuX3NvcnQuZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgdGhpcy5fc29ydC5zb3J0Q2hhbmdlLmVtaXQoc29ydCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGaWx0ZXJTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkRmlsdGVyKHRoaXMuaWQpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZUZpbHRlcmFibGVzKGZpbHRlcik7XG4gIH1cblxuICBwcml2YXRlIGluaXRQYWdpbmF0b3JTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2UgPSB7XG4gICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2UubG9hZFBhZ2VTaXplKHRoaXMuaWQpIHx8IHRoaXMucGFnZVNpemUsXG4gICAgICBsZW5ndGg6IDAsXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlUGFnaW5hdG9yKCk7XG4gIH1cblxuICAvKiogQ09MVU1OIEhBTkRMSU5HICovXG5cbiAgcHVibGljIG9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy52aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50LmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBwdWJsaWMgb25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uPzogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3Nob3dDb2x1bW5Nb2RhbCA9IHRydWU7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uID0gZGVmaW5pdGlvbiA/IGRlZmluaXRpb24gOiB0aGlzLl9hbGxDb2x1bW5EZWZpbml0aW9uc1swXTtcbiAgICBpZiAodGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucykge1xuICAgICAgdGhpcy5vcGVuQ29sdW1uTW9kYWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgbm8gY29tcGxldGUgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIGxvYWRlZCB5ZXQgc2VuZCBhbiBldmVudCBzbyB0aGUgYXBwIGNhbiBsb2FkIGl0XG4gICAgICB0aGlzLmFsbENvbHVtbnNFdmVudC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzQ3VycmVudERlZmluaXRpb24oZGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gJiYgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uLmlkID09PSBkZWZpbml0aW9uLmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nRGF0YTogRGF0YVRhYmxlRGlhbG9nRGF0YSA9IHtcbiAgICAgIGFsbENvbHVtbnM6IHRoaXMuX2FsbEF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICBkZWZpbml0aW9uOiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24sXG4gICAgICBkZWxldGVEZWZpbml0aW9uQWxsb3dlZDogdGhpcy5kZWxldGVEZWZpbml0aW9uQWxsb3dlZCxcbiAgICAgIGZpbHRlckNvbHVtbnNMYWJlbDogdGhpcy5maWx0ZXJDb2x1bW5zTGFiZWwsXG4gICAgICBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXI6IHRoaXMuZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyLFxuICAgICAgbm9EYXRhVGV4dDogdGhpcy5ub0RhdGFUZXh0LFxuICAgICAgdGl0bGVMYWJlbDogdGhpcy5jb2x1bW5TZXR0aW5nc01vZGFsVGl0bGVMYWJlbCxcbiAgICAgIHNlbGVjdGVkTGFiZWw6IHRoaXMuc2VsZWN0ZWRMYWJlbCxcbiAgICAgIGF2YWlsYWJsZUxhYmVsOiB0aGlzLmF2YWlsYWJsZUxhYmVsLFxuICAgICAgc2F2ZUxhYmVsOiB0aGlzLnNhdmVMYWJlbCxcbiAgICAgIGRlbGV0ZUxhYmVsOiB0aGlzLmRlbGV0ZUxhYmVsLFxuICAgICAgY2FuY2VsTGFiZWw6IHRoaXMuY2FuY2VsTGFiZWwsXG4gICAgICBpbmZvVGV4dExhYmVsOiB0aGlzLmluZm9UZXh0TGFiZWwsXG4gICAgfTtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLm1hdERpYWxvZy5vcGVuKERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCwgeyBkYXRhOiBkaWFsb2dEYXRhIH0pO1xuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAvLyBubyBldmVudCBvbiBDQU5DRUxcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChyZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGRhdGEtY3k9XCJ0YWJsZS1hY3Rpb24tYmFyXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWFjdGlvbi1iYXJcIj5cbiAgPCEtLSBUYWJsZSBhY3Rpb25zOiBkaXNwbGF5ZWQgYmVmb3JlIHRoZSB0YWJsZSAtLT5cbiAgPGRpdiAqbmdJZj1cInRhYmxlQWN0aW9ucz8ubGVuZ3RoIHx8IChmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyAmJiBzaG93RGVsZXRlRmlsdGVyQWN0aW9uKVwiPlxuICAgIDxtYWQtYnV0dG9uLWdyb3VwICpuZ0Zvcj1cImxldCBhY3Rpb25Hcm91cCBvZiB0YWJsZUFjdGlvbnNcIiBjbGFzcz1cInRhYmxlLWFjdGlvbi1ncm91cFwiPlxuICAgICAgPG1hZC1vdXRsaW5lLWJ1dHRvblxuICAgICAgICBbaGlkZGVuXT1cImlzSGlkZGVuKHRhYmxlQWN0aW9uKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKHRhYmxlQWN0aW9uKVwiXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YWJsZUFjdGlvbiBvZiBhY3Rpb25Hcm91cFwiXG4gICAgICAgIChjbGljayk9XCJvbkFjdGlvbkV2ZW50KHRhYmxlQWN0aW9uKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/ICh0YWJsZUFjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiB0YWJsZUFjdGlvbi5sYWJlbCB9fVxuICAgICAgICB7eyBnZXRTZWxlY3RlZENvdW50KHRhYmxlQWN0aW9uLnR5cGUpIH19XG4gICAgICA8L21hZC1vdXRsaW5lLWJ1dHRvbj5cbiAgICA8L21hZC1idXR0b24tZ3JvdXA+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyTW9kZSA9PT0gJ0NPTFVNTl9CQVNFRCcgJiYgc2hvd0RlbGV0ZUZpbHRlckFjdGlvblwiPlxuICAgIDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIiBjbGFzcz1cImRlbGV0ZS1maWx0ZXItYWN0aW9uXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm9uRGVsZXRlRmlsdGVyKClcIlxuICAgICAgPmZpbHRlcl9hbHRfb2ZmPC9tYXQtaWNvblxuICAgID5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxtYXQtZm9ybS1maWVsZCBkYXRhLWN5PVwiZmlsdGVyLWlucHV0XCIgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnVEFCTEVfQkFTRUQnXCI+XG4gICAgPG1hdC1sYWJlbD57eyB0cmFuc2xhdGVMYWJlbHMgPyAoZmlsdGVyTGFiZWwgfCB0cmFuc2xhdGUpIDogZmlsdGVyTGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGtleXVwKT1cIm9uVGFibGVCYXNlZEZpbHRlckV2ZW50KCRldmVudClcIiBwbGFjZWhvbGRlcj1cInt7IGZpbHRlclBsYWNlaG9sZGVyIH19XCIgLz5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuXG48IS0tIFJvdyBhY3Rpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjcm93QWN0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1lbGVtZW50PVwiZWxlbWVudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0FjdGlvbiBvZiByb3dBY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGRhdGEtY3k9XCJyb3ctYWN0aW9uLW1lbnUtYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCIhaXNIaWRkZW4ocm93QWN0aW9uKVwiXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgY2xhc3M9XCJyb3ctYWN0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50LCByb3dBY3Rpb24pXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQocm93QWN0aW9uKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChyb3dBY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUpIDogcm93QWN0aW9uLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gZWRpdGFibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNlZGl0YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2YgZWRpdGFibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICBtYXQtbWVudS1pdGVtXG4gICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoZGVmaW5pdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKSB9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIHZpZXdhYmxlIGRlZmluaXRpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjdmlld2FibGVEZWZpbml0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIDxidXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBkZWZpbml0aW9uIG9mIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnNcIlxuICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgY2xhc3M9XCJyb3ctYWN0aW9uXCJcbiAgICAgIChjbGljayk9XCJvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb24pXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZS1jb2x1bW4tZGVmaW5pdGlvbic6IGlzQ3VycmVudERlZmluaXRpb24oZGVmaW5pdGlvbikgfVwiXG4gICAgPlxuICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGRlZmluaXRpb24ubGFiZWwgfCB0cmFuc2xhdGUpIDogZGVmaW5pdGlvbi5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBUYWJsZSAtLT5cbjxkaXZcbiAgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyB8fCBzaG93RW1wdHlUYWJsZSB8fCAhIWZpbHRlcmVkUGFnZURhdGE/Lmxlbmd0aDsgZWxzZSBub0RhdGFcIlxuICBjbGFzcz1cImRhdGF0YWJsZVwiXG4gIFtjbGFzc109XCJ0YWJsZUNsYXNzXCJcbj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDx0YWJsZVxuICAgIFtpZF09XCJpZFwiXG4gICAgbWF0LXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgbWF0U29ydFxuICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydGluZ0V2ZW50KCRldmVudClcIlxuICAgIG1hZEZpbHRlclxuICAgIChtYWRGaWx0ZXJDaGFuZ2UpPVwib25Db2x1bW5CYXNlZEZpbHRlckV2ZW50KCRldmVudClcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiISFleHBhbmRhYmxlRGVmXCJcbiAgPlxuICAgIDwhLS0gUm93IGFjdGlvbnMgY29sdW1uLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIkFDVElPTl9DT0xVTU5fTkFNRVwiPlxuICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogbWFzdGVyIGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyAmJiBzZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCJvblRvZ2dsZVNlbGVjdEFsbCgpXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIj4gPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRSAvIE5PTkU6IG5vdGhpbmcgaW4gaGVhZGVyIHJvdyAtLT5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogcm93IGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NoZWNrYm94KGVsZW1lbnQpXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIChjbGljayk9XCJvblJvd0V2ZW50KCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uIGRhdGEtY3k9XCJyb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCJzaG93Um93QWN0aW9uSWNvbihlbGVtZW50KSAmJiBoYXNWaXNpYmxlUm93QWN0aW9ucyhlbGVtZW50KVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IGVsZW1lbnQ6IGVsZW1lbnQgfVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInJvd0FjdGlvbk1lbnVcIlxuICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdGlvbkV2ZW50KGVsZW1lbnQucm93SWQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyByYWRpbyBidXR0b24gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UmFkaW9CdXR0b24oZWxlbWVudClcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50KVwiPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRVhQQU5EQUJMRTogcm93IGlzIGV4cGFuZGFibGUvY29sbGFwc2FibGUgLS0+XG4gICAgICAgIDxtYWQtaWNvbi1idXR0b24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUJ1dHRvbihlbGVtZW50KVwiIChjbGljayk9XCJvbkV4cGFuZCgkZXZlbnQsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZXhwYW5kZWRFbGVtZW50ICE9PSBlbGVtZW50XCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZXhwYW5kZWRFbGVtZW50ID09PSBlbGVtZW50XCI+a2V5Ym9hcmRfYXJyb3dfdXA8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBOT05FOiBub3RoaW5nIC0tPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIENlbGwgZGVmaW5pdGlvbnMgYW5kIHJvd3Mgd2l0aCBpbmplY3RlZCBjZWxscyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICA8IS0tIGhlYWRlciBjZWxsIHRvIGJlIGluamVjdGVkIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZ2V0RGF0YVRhYmxlSGVhZGVyVHlwZShjb2x1bW4pXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidTT1JUJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIG1hdC1zb3J0LWhlYWRlcj1cInt7IGNvbHVtbi5vcmRlckJ5TmFtZSA/IGNvbHVtbi5vcmRlckJ5TmFtZSA6IGNvbHVtbi5kYXRhUHJvcGVydHlOYW1lIH19XCJcbiAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZCA/ICdiZWZvcmUnIDogJ2FmdGVyJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0ZJTFRFUidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBtYWQtZmlsdGVyLWhlYWRlcj1cInt7IGNvbHVtbi5kYXRhUHJvcGVydHlOYW1lIH19XCJcbiAgICAgICAgICAgIFttYWRGaWx0ZXJDb2x1bW5SaWdodEFsaWduZWRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIFttYWRGaWx0ZXJPcHRpb25zXT1cImNvbHVtbi5maWx0ZXJQYXJhbXM/LmZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidTT1JUX0FORF9GSUxURVInXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lID8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICAgIG1hZC1maWx0ZXItaGVhZGVyPVwie3sgY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW21hZEZpbHRlckNvbHVtblJpZ2h0QWxpZ25lZF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgW21hZEZpbHRlck9wdGlvbnNdPVwiY29sdW1uLmZpbHRlclBhcmFtcz8uZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIj5cbiAgICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBkYXRhIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiXG4gICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgIFtjbGFzcy5tYWQtZHQtY2hpbGQtY2VsbF09XCJlbGVtZW50LnBhcmVudElkXCJcbiAgICAgICAgW25nU3dpdGNoXT1cImNvbHVtbi50cmFuc2Zvcm1lclwiXG4gICAgICAgIChjbGljayk9XCIhZGlzYWJsZVJvd0NsaWNrICYmIG9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbi5pZCkgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4sIGVsZW1lbnQ6IGVsZW1lbnQsICRpbXBsaWNpdDogZWxlbWVudCB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgcm93IGlzIG1hZGUgdXAgb2YgdGhpcyBvbmUgY29sdW1uIHRoYXQgc3BhbnMgYWNyb3NzIGFsbCBjb2x1bW5zIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWV4cGFuZGFibGVEZWZcIiBbbWF0Q29sdW1uRGVmXT1cImV4cGFuZGFibGVDb2x1bW5EZWZcIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zLmxlbmd0aCArIDFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWV4cGFuZGFibGUtYXJlYVwiIFtAZGV0YWlsRXhwYW5kXT1cImVsZW1lbnQgPT09IGV4cGFuZGVkRWxlbWVudCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGdldEN1c3RvbUV4cGFuZGFibGVUZW1wbGF0ZSgpIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBlbGVtZW50LCBlbGVtZW50OiBlbGVtZW50LCAkaW1wbGljaXQ6IGVsZW1lbnQgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gaGVhZGVyIHJvdyB3aGVyZSBjZWxscyB3aWxsIGJlIGluamVjdGVkIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzXCI+PC90cj5cbiAgICA8IS0tIGRhdGEgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyXG4gICAgICBtYXQtcm93XG4gICAgICBbY2xhc3MuY2xpY2thYmxlLXRhYmxlLXJvd109XCIhcm93LnBhcmVudElkICYmIHNlbGVjdGlvbkVtaXRNb2RlICE9PSAnTk9ORSdcIlxuICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkc1wiXG4gICAgICAoY2xpY2spPVwib25FeHBhbmQoJGV2ZW50LCByb3cpXCJcbiAgICA+PC90cj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFleHBhbmRhYmxlRGVmXCI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IFtleHBhbmRhYmxlQ29sdW1uRGVmXVwiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1yb3dcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgbm9EYXRhVGV4dCBjb2x1bW5CYXNlZEZpbHRlclwiIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uSWRzLmxlbmd0aFwiPlxuICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbjxkaXYgZGF0YS1jeT1cInRhYmxlLWJvdHRvbS1hcmVhXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20tYXJlYVwiPlxuICA8ZGl2IGRhdGEtY3k9XCJkZWZpbml0aW9uLWJ1dHRvbi1ibG9ja1wiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtYm90dG9tLWluZm8tYXJlYVwiPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiAxIGRlZmluaXRpb24gLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA9PT0gMVwiIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZWRpdGFibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnZpZXdfY29sdW1uPC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICA8IS0tIGNvbHVtbiB2aWV3OiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld2FibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnByZXZpZXc8L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gIDxtYXQtcGFnaW5hdG9yXG4gICAgW3N0eWxlLmRpc3BsYXldPVwicGFnaW5hdGlvbkVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnXCJcbiAgICBbbGVuZ3RoXT1cInBhZ2VMZW5ndGhcIlxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAocGFnZSk9XCJvblBhZ2VFdmVudCgkZXZlbnQpXCJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+XG4gIDwvbWF0LXBhZ2luYXRvcj5cbjwvZGl2PlxuXG48IS0tIE5vIGRhdGEgYWxlcnQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YT5cbiAgPGRpdiBkYXRhLWN5PVwibm8tZGF0YS1ibG9ja1wiIGNsYXNzPVwibm9EYXRhVGV4dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLXNwaW5uZXItd3JhcHBlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBkZWZhdWx0IGNlbGwgdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVGVtcGxhdGUgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3Bhbj5cbiAgICB7eyBlbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXSB9fVxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIGN1c3RvbSBjZWxsIHRlbXBsYXRlcyBpbmplY3RlZCBmcm9tIHBhcmVudCAtLT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==