@sd-angular/core 1.3.21 → 1.3.22

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.
@@ -6,11 +6,11 @@ import { MatSort } from '@angular/material/sort';
6
6
  import { animate, state, style, transition, trigger } from '@angular/animations';
7
7
  import * as uuid from 'uuid';
8
8
  import { GRID_MATERIAL_CONFIG, DEFAULT_GRID_MATERIAL_CONFIG } from './models/grid-configuration.model';
9
- import { Subscription, isObservable, Subject } from 'rxjs';
9
+ import { Subscription, isObservable, BehaviorSubject } from 'rxjs';
10
10
  import { SdNotifyService } from '@sd-angular/core/notify';
11
11
  import { moveItemInArray } from '@angular/cdk/drag-drop';
12
12
  import { SdMaterialCellDefDirective } from './directives/sd-material-cell-def.directive';
13
- import { debounceTime, map, startWith, switchMap } from 'rxjs/operators';
13
+ import { debounceTime, filter, map, startWith, switchMap } from 'rxjs/operators';
14
14
  import { SdGridFilter } from './components/grid-filter/grid-filter.component';
15
15
  import { SdMaterialFilterDefDirective } from './directives/sd-material-filter-def.directive';
16
16
  import { SdMaterialSubInformationDefDirective } from './directives/sd-material-sub-information-def.directive';
@@ -59,7 +59,10 @@ export class SdGridMaterial {
59
59
  this.columnFilter = {};
60
60
  // Subcription
61
61
  _subscription.set(this, new Subscription());
62
- _reload.set(this, new Subject());
62
+ _reload.set(this, new BehaviorSubject({
63
+ force: true,
64
+ source: 'INITIALIZE'
65
+ }));
63
66
  this.isExporting = false;
64
67
  this.isSelectAll = false;
65
68
  this.exportTitle = 'Export';
@@ -241,7 +244,11 @@ export class SdGridMaterial {
241
244
  if (isObservable(result)) {
242
245
  result = result.toPromise();
243
246
  }
244
- return yield result;
247
+ const data = yield result;
248
+ return {
249
+ items: data.items || [],
250
+ total: data.total || 0
251
+ };
245
252
  }
246
253
  else {
247
254
  if (force) {
@@ -862,7 +869,10 @@ export class SdGridMaterial {
862
869
  this.gridFilter = gridFilter;
863
870
  __classPrivateFieldGet(this, _subscription).add(gridFilter.filterChange.pipe(map(() => {
864
871
  __classPrivateFieldGet(this, _paginator).pageIndex = 0;
865
- __classPrivateFieldGet(this, _reload).next(false);
872
+ __classPrivateFieldGet(this, _reload).next({
873
+ force: false,
874
+ source: 'FILTER'
875
+ });
866
876
  })).subscribe());
867
877
  }
868
878
  }
@@ -872,7 +882,9 @@ export class SdGridMaterial {
872
882
  option = __classPrivateFieldGet(this, _initConfiguration).call(this, option);
873
883
  this.gridOption = option;
874
884
  __classPrivateFieldSet(this, _loadCompleted, false);
875
- __classPrivateFieldGet(this, _reload).next(true);
885
+ __classPrivateFieldGet(this, _reload).next({
886
+ force: true
887
+ });
876
888
  (_a = option === null || option === void 0 ? void 0 : option.columns) === null || _a === void 0 ? void 0 : _a.forEach(col => {
877
889
  var _a;
878
890
  if ((_a = col.filter) === null || _a === void 0 ? void 0 : _a.default) {
@@ -888,7 +900,9 @@ export class SdGridMaterial {
888
900
  if (paginator && __classPrivateFieldGet(this, _paginator) !== paginator) {
889
901
  __classPrivateFieldSet(this, _paginator, paginator);
890
902
  __classPrivateFieldGet(this, _subscription).add(paginator.page.pipe(map(() => {
891
- __classPrivateFieldGet(this, _reload).next(false);
903
+ __classPrivateFieldGet(this, _reload).next({
904
+ force: false
905
+ });
892
906
  })).subscribe());
893
907
  }
894
908
  }
@@ -896,7 +910,9 @@ export class SdGridMaterial {
896
910
  if (sort && __classPrivateFieldGet(this, _sort) !== sort) {
897
911
  __classPrivateFieldSet(this, _sort, sort);
898
912
  __classPrivateFieldGet(this, _subscription).add(sort.sortChange.pipe(map(() => {
899
- __classPrivateFieldGet(this, _reload).next(false);
913
+ __classPrivateFieldGet(this, _reload).next({
914
+ force: false
915
+ });
900
916
  })).subscribe());
901
917
  }
902
918
  }
@@ -904,9 +920,18 @@ export class SdGridMaterial {
904
920
  __classPrivateFieldGet(this, _initCellDef).call(this);
905
921
  }
906
922
  ngAfterViewInit() {
907
- __classPrivateFieldGet(this, _subscription).add(__classPrivateFieldGet(this, _reload).pipe(debounceTime(200), startWith(true), switchMap((force) => __awaiter(this, void 0, void 0, function* () {
923
+ __classPrivateFieldGet(this, _subscription).add(__classPrivateFieldGet(this, _reload).pipe(debounceTime(200), startWith(__classPrivateFieldGet(this, _reload).value), filter(data => {
924
+ var _a, _b;
925
+ if (__classPrivateFieldGet(this, _loadCompleted)) {
926
+ return true;
927
+ }
928
+ if (!((_b = (_a = this.gridOption) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.disabled)) {
929
+ return data.source === 'FILTER';
930
+ }
931
+ return data.source === 'INITIALIZE';
932
+ }), switchMap((data) => __awaiter(this, void 0, void 0, function* () {
908
933
  const filterInfo = __classPrivateFieldGet(this, _getFilter).call(this);
909
- const result = yield __classPrivateFieldGet(this, _load).call(this, filterInfo, !__classPrivateFieldGet(this, _loadCompleted) || force);
934
+ const result = yield __classPrivateFieldGet(this, _load).call(this, filterInfo, !__classPrivateFieldGet(this, _loadCompleted) || data.force);
910
935
  __classPrivateFieldSet(this, _loadCompleted, true);
911
936
  return result;
912
937
  }))).subscribe(__classPrivateFieldGet(this, _render)));
@@ -955,7 +980,7 @@ _localItems = new WeakMap(), _paginator = new WeakMap(), _sort = new WeakMap(),
955
980
  SdGridMaterial.decorators = [
956
981
  { type: Component, args: [{
957
982
  selector: 'sd-grid-material',
958
- template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container *ngIf=\"\r\n gridConfiguration\r\n | sdGridConfigurationResult\r\n : gridOption\r\n : sdSubInformation as configuration\r\n \">\r\n <ng-container *ngIf=\"!gridOption.filter?.disabled\">\r\n <sd-grid-filter [filter]=\"gridOption?.filter\" [columns]=\"configuration.firstColumns\" [filterDefs]=\"filterDefs\">\r\n </sd-grid-filter>\r\n </ng-container>\r\n <ng-container *ngIf=\"items | sdGroup:gridOption; $implicit as groupedItems\">\r\n <div class=\"c-container {{ gridOption?.style?.grid }}\" [ngClass]=\"{ 'mat-elevation-z2': gridOption?.shadow }\">\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div class=\"c-table\" sdScroll [ngStyle]=\"{\r\n 'max-height': gridOption?.maxHeight,\r\n 'min-height': gridOption?.minHeight\r\n }\">\r\n <table *ngIf=\"items?.length; else elseEmpty\" mat-table [dataSource]=\"groupedItems\" matSort\r\n [matSortDisabled]=\"!gridOption.sortable\" cdkDropList cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListDisabled]=\"!gridOption.dropDragColumnEnable\"\r\n (cdkDropListDropped)=\"drop($event, configuration.displayedColumns)\" multiTemplateDataRows>\r\n\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdSubInformation?.templateRef\">\r\n <ng-container *ngIf=\"gridOption?.subInformation?.always;else useExpandCollapse\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #useExpandCollapse>\r\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button *ngIf=\"!element.isExpanding && !gridOption?.subInformation?.always\" mat-icon-button\r\n aria-label=\"Expand & Collapse\" (click)=\"onExpand(element)\">\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"text-center px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <ng-container *ngIf=\"items | selectionVisibleSelectAll: gridOption?.selection | async\">\r\n <mat-checkbox *ngIf=\"!gridOption.selection?.single\" class=\"c-selection\" color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\" (change)=\"onSelectAll()\">\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n </th>\r\n <td class=\"text-center px-15\" mat-cell *matCellDef=\"let item\" style=\"min-width: 50px; max-width: 50px\">\r\n <ng-container *ngIf=\"item | selectionVisible:gridOption?.selection\">\r\n <mat-checkbox class=\"c-selection\" color=\"primary\" [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\" [disabled]=\"\r\n selectedItems | selectionDisable: item:gridOption?.selection\r\n \">\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditorValidation\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 2px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0 position-relative\" mat-cell *matCellDef=\"let item; index as idx\">\r\n <sd-desktop-editor-validation [sdId]=\"item.sdId\" [item]=\"item\" [items]=\"items\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-editor-validation>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button class=\"c-btn-add\"\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon-add\">add</mat-icon>\r\n </button>\r\n </th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item; index as idx\">\r\n <ng-container *sdLet=\"item.editorStatus | sdEditorHandlerRow:item:gridOption as editorHandler\">\r\n <div *ngIf=\"editorHandler\" class=\"d-flex align-items-center justify-content-center\">\r\n <button *ngIf=\"editorHandler.editable\" class=\"mx-2\" (click)=\"onUpdate(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">edit</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.removable\" class=\"mx-2\" (click)=\"onRemove(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">delete</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.savable\" class=\"mx-2\" (click)=\"onSave(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">save</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.cancelable\" class=\"mx-2\" (click)=\"onCancel(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">close</mat-icon>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command [commands]=\"gridOption.commands\" [item]=\"item\"></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\"\r\n [attr.colspan]=\"!item?.sdGroup ? 1 : configuration.displayedColumns.length\">\r\n <div [innerHtml]=\"item?.sdGroup?.htmlTemplate | safeHtml\">\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\" [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef cdkDrag class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\" [attr.rowspan]=\"\r\n configuration.multipleHeader && column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div aria-hidden=\"false\" role=\"presentation\" mat-sort-header [disabled]=\"\r\n !column.sortable || column.type === 'children-col'\r\n \" [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell class=\"d-block px-8\" *ngIf=\"!item?.sdGroup\" [sdId]=\"item.sdId\" [key]=\"key\"\r\n [value]=\"item[column.field]\" [column]=\"column\" [item]=\"item\" [idx]=\"i\" [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns; let i = index\"\r\n [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"c-th px-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell class=\"d-block px-8\" [sdId]=\"item.sdId\" [key]=\"key\" [value]=\"item[column.field]\"\r\n [column]=\"column\" [item]=\"item\" [idx]=\"i\" [cellDef]=\"cellDef\" [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\">\r\n </tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: configuration.displayedColumns\" matRipple class=\"c-row\"\r\n [class.selected]=\"row.isSelected\" [style]=\"row | sdStyleRowCss:gridOption\"></tr>\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']\" class=\"c-detail-row\"></tr>\r\n <ng-container *ngIf=\"hasFooter && configuration.displayedFooters?.length\">\r\n <tr mat-footer-row *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditorValidation\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 4px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\">\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button class=\"c-btn-add\"\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon-add\">add</mat-icon>\r\n </button>\r\n </th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td class=\"c-empty\" mat-cell *matCellDef=\"let item\"\r\n [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdEmptyData.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\">leaderboard</mat-icon>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\">\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.columns\" [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\" [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\" [attr.rowspan]=\"\r\n configuration.multipleHeader &&\r\n column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\">\r\n </tr>\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button *ngIf=\"\r\n !gridOption.filter?.disabled && !gridOption.filter?.inlineColumn\r\n \" class=\"mr-10\" [title]=\"'Filter' | sdTranslate\" icon=\"filter_alt\" size=\"sm\" (action)=\"gridFilter.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.reload?.visible\" class=\"mr-10\" [title]=\"'Reload' | sdTranslate\" icon=\"refresh\"\r\n size=\"sm\" (action)=\"reload()\" [disabled]=\"!items?.length\" type=\"link\">\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button class=\"mr-10\" [loading]=\"isExporting\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\"\r\n size=\"sm\" type=\"link\">\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button class=\"mr-10\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" type=\"link\">\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngIf=\"gridOption.export?.visibleExcel !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export excel\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.visibleExcelRaw !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportRaw()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export excel raw\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.visibleCSV !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportCSV()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export CSV\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.key\" mat-menu-item (click)=\"sdPopupExport.open()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">settings</mat-icon>\r\n <span> {{ \"Configure\" | sdTranslate }}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button *ngIf=\"gridOption.config?.visible\" class=\"mr-10\" [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\" size=\"sm\" (action)=\"popupGridConfiguration.open()\" type=\"link\">\r\n </sd-button>\r\n </div>\r\n <mat-paginator [class.d-none]=\"gridOption.paginate?.hidden\" [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\" [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-grid-quick-action [gridOption]=\"gridOption\" [selectedItems]=\"selectedItems\"\r\n (clear)=\"onClearSelection(groupedItems)\">\r\n </sd-grid-quick-action>\r\n <sd-popup-export *ngIf=\"gridOption.export?.visible\" [configuration]=\"configuration\" [gridOption]=\"gridOption\" (export)=\"onExport($event)\"\r\n #sdPopupExport>\r\n </sd-popup-export>\r\n <sd-popup-grid-configuration [gridOption]=\"gridOption\" [key]=\"key\" #popupGridConfiguration>\r\n </sd-popup-grid-configuration>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>",
983
+ template: "<ng-container *ngIf=\"gridConfigurationObserver | async as gridConfiguration\">\r\n <ng-container *ngIf=\"\r\n gridConfiguration\r\n | sdGridConfigurationResult\r\n : gridOption\r\n : sdSubInformation as configuration\r\n \">\r\n <sd-grid-filter *ngIf=\"!gridOption.filter?.disabled\" [filter]=\"gridOption?.filter\"\r\n [columns]=\"configuration.firstColumns\" [filterDefs]=\"filterDefs\">\r\n </sd-grid-filter>\r\n <ng-container *ngIf=\"items | sdGroup:gridOption; $implicit as groupedItems\">\r\n <div class=\"c-container {{ gridOption?.style?.grid }}\" [ngClass]=\"{ 'mat-elevation-z2': gridOption?.shadow }\">\r\n <div class=\"c-loading\" *ngIf=\"isLoading\">\r\n <mat-spinner *ngIf=\"isLoading\"></mat-spinner>\r\n </div>\r\n <ng-container>\r\n <div class=\"c-table\" sdScroll [ngStyle]=\"{\r\n 'max-height': gridOption?.maxHeight,\r\n 'min-height': gridOption?.minHeight\r\n }\">\r\n <table *ngIf=\"items?.length; else elseEmpty\" mat-table [dataSource]=\"groupedItems\" matSort\r\n [matSortDisabled]=\"!gridOption.sortable\" cdkDropList cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListDisabled]=\"!gridOption.dropDragColumnEnable\"\r\n (cdkDropListDropped)=\"drop($event, configuration.displayedColumns)\" multiTemplateDataRows>\r\n\r\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdSubInformation?.templateRef\">\r\n <ng-container *ngIf=\"gridOption?.subInformation?.always;else useExpandCollapse\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #useExpandCollapse>\r\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\r\n <ng-container *ngIf=\"item.isExpanded\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdSubInformation.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button *ngIf=\"!element.isExpanding && !gridOption?.subInformation?.always\" mat-icon-button\r\n aria-label=\"Expand & Collapse\" (click)=\"onExpand(element)\">\r\n <mat-icon *ngIf=\"!element.isExpanded\">expand_more</mat-icon>\r\n <mat-icon *ngIf=\"element.isExpanded\">expand_less</mat-icon>\r\n </button>\r\n <div *ngIf=\"element.isExpanding\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"text-center px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <ng-container *ngIf=\"items | selectionVisibleSelectAll: gridOption?.selection | async\">\r\n <mat-checkbox *ngIf=\"!gridOption.selection?.single\" class=\"c-selection\" color=\"primary\"\r\n [(ngModel)]=\"isSelectAll\" (change)=\"onSelectAll()\">\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n </th>\r\n <td class=\"text-center px-15\" mat-cell *matCellDef=\"let item\" style=\"min-width: 50px; max-width: 50px\">\r\n <ng-container *ngIf=\"item | selectionVisible:gridOption?.selection\">\r\n <mat-checkbox class=\"c-selection\" color=\"primary\" [(ngModel)]=\"item.isSelected\"\r\n (change)=\"onSelect(item)\" [disabled]=\"\r\n selectedItems | selectionDisable: item:gridOption?.selection\r\n \">\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditorValidation\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 2px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0 position-relative\" mat-cell *matCellDef=\"let item; index as idx\">\r\n <sd-desktop-editor-validation [sdId]=\"item.sdId\" [item]=\"item\" [items]=\"items\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-editor-validation>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button class=\"c-btn-add\"\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon-add\">add</mat-icon>\r\n </button>\r\n </th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item; index as idx\">\r\n <ng-container *sdLet=\"item.editorStatus | sdEditorHandlerRow:item:gridOption as editorHandler\">\r\n <div *ngIf=\"editorHandler\" class=\"d-flex align-items-center justify-content-center\">\r\n <button *ngIf=\"editorHandler.editable\" class=\"mx-2\" (click)=\"onUpdate(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">edit</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.removable\" class=\"mx-2\" (click)=\"onRemove(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">delete</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.savable\" class=\"mx-2\" (click)=\"onSave(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">save</mat-icon>\r\n </button>\r\n <button *ngIf=\"editorHandler.cancelable\" class=\"mx-2\" (click)=\"onCancel(item)\" aria-hidden=\"true\"\r\n mat-icon-button>\r\n <mat-icon class=\"c-icon\">close</mat-icon>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-command [commands]=\"gridOption.commands\" [item]=\"item\"></sd-desktop-command>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\"\r\n [attr.colspan]=\"!item?.sdGroup ? 1 : configuration.displayedColumns.length\">\r\n <div [innerHtml]=\"item?.sdGroup?.htmlTemplate | safeHtml\">\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\" [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef cdkDrag class=\"px-8 py-8 c-th\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\" [attr.rowspan]=\"\r\n configuration.multipleHeader && column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div aria-hidden=\"false\" role=\"presentation\" mat-sort-header [disabled]=\"\r\n !column.sortable || column.type === 'children-col'\r\n \" [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell class=\"d-block px-8\" *ngIf=\"!item?.sdGroup\" [sdId]=\"item.sdId\" [key]=\"key\"\r\n [value]=\"item[column.field]\" [column]=\"column\" [item]=\"item\" [idx]=\"i\" [cellDef]=\"cellDef\"\r\n [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns; let i = index\"\r\n [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"c-th px-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\">\r\n </sd-column-inline-filter>\r\n </div>\r\n </th>\r\n <td class=\"c-td px-0\" mat-cell *matCellDef=\"let item\">\r\n <sd-desktop-cell class=\"d-block px-8\" [sdId]=\"item.sdId\" [key]=\"key\" [value]=\"item[column.field]\"\r\n [column]=\"column\" [item]=\"item\" [idx]=\"i\" [cellDef]=\"cellDef\" [gridOption]=\"gridOption\">\r\n </sd-desktop-cell>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef>\r\n <ng-container *ngIf=\"footerDef[column.field]\">\r\n <ng-container *ngTemplateOutlet=\"\r\n footerDef[column.field].templateRef;\r\n context: { items: items, column: column }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\">\r\n </tr>\r\n <ng-container *ngIf=\"configuration.secondHeaders?.length\">\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: configuration.displayedColumns\" matRipple class=\"c-row\"\r\n [class.selected]=\"row.isSelected\" [style]=\"row | sdStyleRowCss:gridOption\"></tr>\r\n\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']\" class=\"c-detail-row\"></tr>\r\n <ng-container *ngIf=\"hasFooter && configuration.displayedFooters?.length\">\r\n <tr mat-footer-row *matFooterRowDef=\"configuration.displayedFooters; sticky: true\"></tr>\r\n </ng-container>\r\n </table>\r\n <ng-template #elseEmpty>\r\n <table mat-table [dataSource]=\"[{}]\">\r\n <ng-container matColumnDef=\"sdSelection\" sticky>\r\n <th class=\"px-15\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditorValidation\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 4px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\">\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEditor\">\r\n <th class=\"px-8 py-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n <button class=\"c-btn-add\"\r\n *ngIf=\"gridOption.editor?.addable && (!gridOption.editor.limit || gridOption.editor.limit > items.length)\"\r\n (click)=\"onCreate()\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon class=\"c-icon-add\">add</mat-icon>\r\n </button>\r\n </th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdCommand\">\r\n <th class=\"px-8\" mat-header-cell *matHeaderCellDef style=\"min-width: 50px; max-width: 50px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdSubInformationAction\">\r\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\"></th>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdEmpty\">\r\n <td class=\"c-empty\" mat-cell *matCellDef=\"let item\"\r\n [attr.colspan]=\"configuration.displayedColumns.length\">\r\n <ng-container *ngIf=\"sdEmptyData?.templateRef; else sdEmptyDataNoRef\">\r\n <ng-container *ngTemplateOutlet=\"\r\n sdEmptyData.templateRef;\r\n context: { item: item }\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #sdEmptyDataNoRef>\r\n <mat-icon fontSet=\"material-icons-outlined\">leaderboard</mat-icon>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"sdGroup\">\r\n <th mat-header-cell *matHeaderCellDef class=\"px-8 py-8\"\r\n [attr.rowspan]=\"configuration.multipleHeader ? 2 : 1\">\r\n </th>\r\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\">\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.columns\" [matColumnDef]=\"column.field\"\r\n [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.firstColumns; let i = index\"\r\n [matColumnDef]=\"column.field\" [sticky]=\"configuration.fixedColumn[column.field]\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': configuration.firstColumns[i].width }\" [attr.rowspan]=\"\r\n configuration.multipleHeader &&\r\n column.type !== 'children-col'\r\n ? 2\r\n : 1\r\n \" [attr.colspan]=\"\r\n column.type === 'children-col' ? column.children?.length : 1\r\n \">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\"\r\n [innerHTML]=\"configuration.firstColumns[i].titleHtml || configuration.firstColumns[i].title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let column of configuration.secondColumns\" [matColumnDef]=\"column.field\">\r\n <th mat-header-cell *matHeaderCellDef class=\"c-th px-8 py-8\"\r\n [ngStyle]=\"{ 'min-width': column.width }\">\r\n <div>\r\n <div [class.text-right]=\"column.align === 'right' || (!column.align && column.type === 'number')\"\r\n [class.text-center]=\"column.align === 'center'\" [innerHTML]=\"column.titleHtml || column.title\">\r\n </div>\r\n <sd-column-inline-filter *ngIf=\"gridOption.filter?.inlineColumn\"\r\n [value]=\"columnFilter[column.field]\" [columnFilter]=\"columnFilter\" [column]=\"column\"\r\n (filterChange)=\"onFilterChange()\"></sd-column-inline-filter>\r\n </div>\r\n </th>\r\n </ng-container>\r\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"configuration.firstHeaders; sticky: true\">\r\n </tr>\r\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"configuration.secondHeaders; sticky: true\">\r\n </tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['sdEmpty']\"></tr>\r\n </table>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n <div class=\"c-paginator\">\r\n <div class=\"c-action\">\r\n <sd-button *ngIf=\"\r\n !gridOption.filter?.disabled && !gridOption.filter?.inlineColumn\r\n \" class=\"mr-10\" [title]=\"'Filter' | sdTranslate\" icon=\"filter_alt\" size=\"sm\" (action)=\"gridFilter.open()\"\r\n type=\"link\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.reload?.visible\" class=\"mr-10\" [title]=\"'Reload' | sdTranslate\" icon=\"refresh\"\r\n size=\"sm\" (action)=\"reload()\" [disabled]=\"!items?.length\" type=\"link\">\r\n </sd-button>\r\n <ng-container *ngIf=\"gridOption.export?.visible && items?.length\">\r\n <ng-container *ngIf=\"isExporting; else unExporting\">\r\n <sd-button class=\"mr-10\" [loading]=\"isExporting\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\"\r\n size=\"sm\" type=\"link\">\r\n </sd-button>\r\n </ng-container>\r\n <ng-template #unExporting>\r\n <sd-button class=\"mr-10\" [title]=\"exportTitle | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" type=\"link\">\r\n </sd-button>\r\n </ng-template>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngIf=\"gridOption.export?.visibleExcel !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportDefault()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export excel\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.visibleExcelRaw !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportRaw()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export excel raw\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.visibleCSV !== false\" mat-menu-item\r\n (click)=\"sdPopupExport.exportCSV()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">file_download</mat-icon>\r\n <span> {{ \"Export CSV\" | sdTranslate }}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.export?.key\" mat-menu-item (click)=\"sdPopupExport.open()\" type=\"button\">\r\n <mat-icon fontSet=\"material-icons-outlined\">settings</mat-icon>\r\n <span> {{ \"Configure\" | sdTranslate }}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button *ngIf=\"gridOption.config?.visible\" class=\"mr-10\" [title]=\"'Configure' | sdTranslate\"\r\n icon=\"settings\" size=\"sm\" (action)=\"popupGridConfiguration.open()\" type=\"link\">\r\n </sd-button>\r\n </div>\r\n <mat-paginator [class.d-none]=\"gridOption.paginate?.hidden\" [length]=\"total\"\r\n [pageSize]=\"gridOption.paginate?.pageSize\" [pageSizeOptions]=\"gridOption.paginate?.pages\"\r\n [showFirstLastButtons]=\"gridOption.paginate?.showFirstLastButtons\"></mat-paginator>\r\n </div>\r\n </div>\r\n <sd-grid-quick-action [gridOption]=\"gridOption\" [selectedItems]=\"selectedItems\"\r\n (clear)=\"onClearSelection(groupedItems)\">\r\n </sd-grid-quick-action>\r\n <sd-popup-export *ngIf=\"gridOption.export?.visible\" [configuration]=\"configuration\" [gridOption]=\"gridOption\"\r\n (export)=\"onExport($event)\" #sdPopupExport>\r\n </sd-popup-export>\r\n <sd-popup-grid-configuration [gridOption]=\"gridOption\" [key]=\"key\" #popupGridConfiguration>\r\n </sd-popup-grid-configuration>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>",
959
984
  animations: [
960
985
  trigger('detailExpand', [
961
986
  state('collapsed', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
@@ -990,4 +1015,4 @@ SdGridMaterial.propDecorators = {
990
1015
  sdFooterDefs: [{ type: ContentChildren, args: [SdMaterialFooterDefDirective,] }],
991
1016
  sdFilterDefs: [{ type: ContentChildren, args: [SdMaterialFilterDefDirective,] }]
992
1017
  };
993
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tYXRlcmlhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvdXNlci9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFFVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUlULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFPN0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw0QkFBNEIsRUFFN0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBYyxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdEQUFnRCxDQUFD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QU87NEJBWWpCLFNBQVMsU0FBQyxhQUFhOytCQUd2QixZQUFZLFNBQUMsb0NBQW9DOzBCQUdqRCxZQUFZLFNBQUMsK0JBQStCO3lCQUc1QyxlQUFlLFNBQUMsMEJBQTBCOzJCQU0xQyxlQUFlLFNBQUMsNEJBQTRCOzJCQU81QyxlQUFlLFNBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgSW5qZWN0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ29udGVudENoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XHJcbmltcG9ydCB7XHJcbiAgU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0XHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1maWx0ZXIubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIFNkR3JpZE1hdGVyaWFsT3B0aW9uXHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1vcHRpb24ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdSSURfTUFURVJJQUxfQ09ORklHLFxyXG4gIERFRkFVTFRfR1JJRF9NQVRFUklBTF9DT05GSUcsXHJcbiAgSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvblxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBkZWZlciwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZE5vdGlmeVNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL25vdGlmeSc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgU2RHcmlkTWF0ZXJpYWxDb2x1bW4gfSBmcm9tICcuL21vZGVscy9ncmlkLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NkLW1hdGVyaWFsLWNlbGwtZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RHcmlkRmlsdGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtc3ViLWluZm9ybWF0aW9uLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NkLW1hdGVyaWFsLWZvb3Rlci1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEVtcHR5RGF0YURlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1lbXB0eS1kYXRhLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZFBvcHVwRXhwb3J0IH0gZnJvbSAnLi9jb21wb25lbnRzL3BvcHVwLWV4cG9ydC9wb3B1cC1leHBvcnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2RFeHBvcnRDb2x1bW4sIFNkRXhwb3J0RmlsZSwgU2RFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9leHBvcnQnO1xyXG5pbXBvcnQgeyBTZEdyaWRDb25maWd1cmF0aW9uLCBTZEdyaWRDb25maWd1cmF0aW9uUmVzdWx0IH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZEdyaWRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZ3JpZC1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbEV4cG9ydENvbHVtbiB9IGZyb20gJy4vbW9kZWxzL2dyaWQtZXhwb3J0Lm1vZGVsJztcclxuaW1wb3J0IHsgU2RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS90cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTZFF1aWNrQWN0aW9uIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9xdWljay1hY3Rpb24nO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbEl0ZW0sIFNkSXRlbSB9IGZyb20gJy4vbW9kZWxzL2dyaWQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZENvbHVtblZhbHVlc1BpcGUgfSBmcm9tICcuL3BpcGVzL2NvbHVtbi12YWx1ZXMucGlwZSc7XHJcbmltcG9ydCB7IFNkRWRpdG9ySGFuZGxlckNvbHVtblBpcGUgfSBmcm9tICcuL3BpcGVzL2VkaXRvci1oYW5kbGVyLWNvbHVtbi5waXBlJztcclxuaW1wb3J0IHsgU2RTY3JvbGxEaXJlY3RpdmUgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NkLWdyaWQtbWF0ZXJpYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRNYXRlcmlhbDxUID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFNkU2Nyb2xsRGlyZWN0aXZlKSBzZFNjcm9sbDogU2RTY3JvbGxEaXJlY3RpdmU7XHJcbiAga2V5ID0gdXVpZC52NCgpO1xyXG4gIGdyaWRDb25maWd1cmF0aW9uT2JzZXJ2ZXI6IE9ic2VydmFibGU8U2RHcmlkQ29uZmlndXJhdGlvbj47XHJcbiAgZ3JpZEZpbHRlcjogU2RHcmlkRmlsdGVyO1xyXG4gIEBWaWV3Q2hpbGQoU2RRdWlja0FjdGlvbikgcXVpY2tBY3Rpb246IFNkUXVpY2tBY3Rpb247XHJcbiAgQFZpZXdDaGlsZChTZEdyaWRGaWx0ZXIpIHNldCBfZ3JpZEZpbHRlcihncmlkRmlsdGVyOiBTZEdyaWRGaWx0ZXIpIHtcclxuICAgIGlmIChncmlkRmlsdGVyICYmIHRoaXMuZ3JpZEZpbHRlciAhPT0gZ3JpZEZpbHRlcikge1xyXG4gICAgICB0aGlzLmdyaWRGaWx0ZXIgPSBncmlkRmlsdGVyO1xyXG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKGdyaWRGaWx0ZXIuZmlsdGVyQ2hhbmdlLnBpcGUoXHJcbiAgICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuI3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgdGhpcy4jcmVsb2FkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBvcHRpb24ob3B0aW9uOiBTZEdyaWRNYXRlcmlhbE9wdGlvbikge1xyXG4gICAgaWYgKG9wdGlvbikge1xyXG4gICAgICBvcHRpb24gPSB0aGlzLiNpbml0Q29uZmlndXJhdGlvbihvcHRpb24pO1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb24gPSBvcHRpb247XHJcbiAgICAgIHRoaXMuI2xvYWRDb21wbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy4jcmVsb2FkLm5leHQodHJ1ZSk7XHJcbiAgICAgIG9wdGlvbj8uY29sdW1ucz8uZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmIChjb2wuZmlsdGVyPy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkZpbHRlcltjb2wuZmllbGRdID0gY29sLmZpbHRlci5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdyaWRDb25maWd1cmF0aW9uU2VydmljZS5pbml0KHRoaXMua2V5LCB0aGlzLmdyaWRPcHRpb24pO1xyXG4gICAgICB0aGlzLmdyaWRDb25maWd1cmF0aW9uT2JzZXJ2ZXIgPSBjb25maWd1cmF0aW9uLm9ic2VydmVyO1xyXG4gICAgICBjb25maWd1cmF0aW9uLmxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyaWRPcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uO1xyXG4gICNsb2NhbEl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIGl0ZW1zOiBTZEdyaWRNYXRlcmlhbEl0ZW08VD5bXSA9IFtdO1xyXG4gIHNlbGVjdGVkSXRlbXM6IFRbXSA9IFtdO1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcblxyXG4gIC8vIExvYWRpbmdcclxuICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgLy8gUGFnaW5hdGVcclxuICBpc0hpZGRlblBhZ2luYXRvciA9IGZhbHNlO1xyXG4gICNwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgc2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG4gICAgaWYgKHBhZ2luYXRvciAmJiB0aGlzLiNwYWdpbmF0b3IgIT09IHBhZ2luYXRvcikge1xyXG4gICAgICB0aGlzLiNwYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQocGFnaW5hdG9yLnBhZ2UucGlwZShcclxuICAgICAgICBtYXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy4jcmVsb2FkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNvcnRpbmdcclxuICAjc29ydDogTWF0U29ydDtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNldCBzb3J0KHNvcnQ6IE1hdFNvcnQpIHtcclxuICAgIGlmIChzb3J0ICYmIHRoaXMuI3NvcnQgIT09IHNvcnQpIHtcclxuICAgICAgdGhpcy4jc29ydCA9IHNvcnQ7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQoc29ydC5zb3J0Q2hhbmdlLnBpcGUoXHJcbiAgICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuI3JlbG9hZC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBFeHBvcnRcclxuICBAVmlld0NoaWxkKFNkUG9wdXBFeHBvcnQpIHNkUG9wdXBFeHBvcnQ6IFNkUG9wdXBFeHBvcnQ7XHJcblxyXG4gIC8vIFN1YiBJbmZvcm1hdGlvblxyXG4gIEBDb250ZW50Q2hpbGQoU2RNYXRlcmlhbFN1YkluZm9ybWF0aW9uRGVmRGlyZWN0aXZlKSBzZFN1YkluZm9ybWF0aW9uOiBTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmU7XHJcblxyXG4gIC8vIEVtcHR5IERhdGFcclxuICBAQ29udGVudENoaWxkKFNkTWF0ZXJpYWxFbXB0eURhdGFEZWZEaXJlY3RpdmUpIHNkRW1wdHlEYXRhOiBTZE1hdGVyaWFsRW1wdHlEYXRhRGVmRGlyZWN0aXZlO1xyXG5cclxuICAvLyBDZWxsIERlZlxyXG4gIEBDb250ZW50Q2hpbGRyZW4oU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmUpIHNkQ2VsbERlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlPigpO1xyXG4gIGNlbGxEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkTWF0ZXJpYWxDZWxsRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG5cclxuICAvLyBGb290ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlKSBzZEZvb3RlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZm9vdGVyRGVmOiB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlXHJcbiAgfSA9IHt9O1xyXG4gIGhhc0Zvb3RlciA9IGZhbHNlO1xyXG5cclxuICAvLyBGaWx0ZXIgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsRmlsdGVyRGVmRGlyZWN0aXZlKSBzZEZpbHRlckRlZnMgPSBuZXcgUXVlcnlMaXN0PFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmU+KCk7XHJcbiAgZmlsdGVyRGVmczogU2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZVtdID0gW107XHJcblxyXG4gIC8vIEZpbHRlclxyXG4gIGNvbHVtbkZpbHRlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gIC8vIFN1YmNyaXB0aW9uXHJcbiAgI3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAjcmVsb2FkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBpc0V4cG9ydGluZyA9IGZhbHNlO1xyXG4gIGlzU2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgZXhwb3J0VGl0bGUgPSAnRXhwb3J0JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBASW5qZWN0KEdSSURfTUFURVJJQUxfQ09ORklHKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlndXJhdGlvbjogSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvbixcclxuICAgIHByaXZhdGUgZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlOiBTZEdyaWRDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZXhwb3J0U2VydmljZTogU2RFeHBvcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZnlTZXJ2aWNlOiBTZE5vdGlmeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFNkVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29sdW1uVmFsdWVzUGlwZTogU2RDb2x1bW5WYWx1ZXNQaXBlLFxyXG4gICAgcHJpdmF0ZSBlZGl0b3JIYW5kbGVyQ29sdW1uUGlwZTogU2RFZGl0b3JIYW5kbGVyQ29sdW1uUGlwZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLiNpbml0Q2VsbERlZigpO1xyXG4gIH1cclxuICAjbG9hZENvbXBsZXRlZCA9IGZhbHNlO1xyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy4jcmVsb2FkLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICBzdGFydFdpdGgodHJ1ZSksXHJcbiAgICAgIHN3aXRjaE1hcChhc3luYyBmb3JjZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVySW5mbyA9IHRoaXMuI2dldEZpbHRlcigpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI2xvYWQoZmlsdGVySW5mbywgIXRoaXMuI2xvYWRDb21wbGV0ZWQgfHwgZm9yY2UpO1xyXG4gICAgICAgIHRoaXMuI2xvYWRDb21wbGV0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSh0aGlzLiNyZW5kZXIpKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZENlbGxEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdENlbGxEZWYpKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5zZEZvb3RlckRlZnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChbXSkpLnN1YnNjcmliZSh0aGlzLiNpbml0Rm9vdGVyRGVmKSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuc2RGaWx0ZXJEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdEZpbHRlckRlZikpO1xyXG5cclxuICAgIC8vIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy4jb3B0aW9uQ2hhbmdlcy5waXBlKFxyXG4gICAgLy8gICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgIC8vICAgc3RhcnRXaXRoKHt9KSxcclxuICAgIC8vICAgbWFwKHRoaXMuI2dldEZpbHRlciksXHJcbiAgICAvLyAgIHN3aXRjaE1hcChmaWx0ZXJJbmZvID0+IHRoaXMuI2xvYWQoZmlsdGVySW5mbywgdHJ1ZSkpXHJcbiAgICAvLyApLnN1YnNjcmliZSh0aGlzLiNyZW5kZXIpKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAjaW5pdENlbGxEZWYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNlbGxEZWYgPSB7fTtcclxuICAgIGZvciAoY29uc3QgY2VsbERlZiBvZiB0aGlzLnNkQ2VsbERlZnMpIHtcclxuICAgICAgaWYgKGNlbGxEZWYuc2RNYXRlcmlhbENlbGxEZWYpIHtcclxuICAgICAgICB0aGlzLmNlbGxEZWZbY2VsbERlZi5zZE1hdGVyaWFsQ2VsbERlZl0gPSBjZWxsRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjaW5pdEZpbHRlckRlZiA9ICgpID0+IHtcclxuICAgIHRoaXMuZmlsdGVyRGVmcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJEZWYgb2YgdGhpcy5zZEZpbHRlckRlZnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJEZWZzLnB1c2goZmlsdGVyRGVmKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICNpbml0Rm9vdGVyRGVmID0gKCkgPT4ge1xyXG4gICAgdGhpcy5mb290ZXJEZWYgPSB7fTtcclxuICAgIHRoaXMuaGFzRm9vdGVyID0gZmFsc2U7XHJcbiAgICBmb3IgKGNvbnN0IGZvb3RlckRlZiBvZiB0aGlzLnNkRm9vdGVyRGVmcykge1xyXG4gICAgICBpZiAoZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWYpIHtcclxuICAgICAgICB0aGlzLmhhc0Zvb3RlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb290ZXJEZWZbZm9vdGVyRGVmLnNkTWF0ZXJpYWxGb290ZXJEZWZdID0gZm9vdGVyRGVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjZmlsdGVyRXhwb3J0SW5mbyA9IChwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmF3Q29sdW1uRmlsdGVyOiAodGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmlubGluZUNvbHVtbiA/IHRoaXMuY29sdW1uRmlsdGVyIDogdGhpcy5ncmlkRmlsdGVyPy5jb2x1bW5GaWx0ZXIpIHx8IHt9LFxyXG4gICAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgICAgcmF3RmlsdGVyRGVmOiB0aGlzLmdyaWRGaWx0ZXI/LmZpbHRlckRlZiB8fCB7fSxcclxuICAgICAgb3JkZXJCeTogdGhpcy4jc29ydD8uYWN0aXZlIHx8ICcnLFxyXG4gICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBwYWdlU2l6ZSxcclxuICAgICAgaXNFeHBvcnRlZDogdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNpbml0Q29uZmlndXJhdGlvbiA9IChvcHRpb246IFNkR3JpZE1hdGVyaWFsT3B0aW9uKSA9PiB7XHJcbiAgICBvcHRpb24ucGFnaW5hdGUgPSB7XHJcbiAgICAgIGhpZGRlbjogb3B0aW9uPy5wYWdpbmF0ZT8uaGlkZGVuLFxyXG4gICAgICBwYWdlU2l6ZTogb3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gdGhpcy5jb25maWd1cmF0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgPz8gREVGQVVMVF9HUklEX01BVEVSSUFMX0NPTkZJRy5wYWdpbmF0ZT8ucGFnZVNpemUsXHJcbiAgICAgIHBhZ2VzOiBvcHRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyB0aGlzLmNvbmZpZ3VyYXRpb24/LnBhZ2luYXRlPy5wYWdlcyA/PyBERUZBVUxUX0dSSURfTUFURVJJQUxfQ09ORklHLnBhZ2luYXRlPy5wYWdlcyxcclxuICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM6IG9wdGlvbj8ucGFnaW5hdGU/LnNob3dGaXJzdExhc3RCdXR0b25zID8/IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG9wdGlvbjtcclxuICB9XHJcblxyXG4gICNmaWx0ZXJMb2NhbCA9IChsb2NhbEl0ZW1zOiBhbnlbXSwgZmlsdGVySW5mbzogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0KSA9PiB7XHJcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGNvbnN0IHsgcmF3Q29sdW1uRmlsdGVyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbiwgcGFnZVNpemUsIHBhZ2VOdW1iZXIgfSA9IGZpbHRlckluZm87XHJcbiAgICBjb25zdCBpdGVtcyA9IGxvY2FsSXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcbiAgICAgICAgY29uc3QgeyBmaWVsZCwgdHlwZSB9ID0gY29sdW1uO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlOiBzdHJpbmcgPSAocmF3Q29sdW1uRmlsdGVyW2ZpZWxkXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZTogc3RyaW5nID0gKGl0ZW1bZmllbGRdIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgaWYgKCFjb2x1bW5WYWx1ZSAmJiB0eXBlICE9PSAnZGF0ZXRpbWUnICYmIHR5cGUgIT09ICdkYXRlJyAmJiB0eXBlICE9PSAndGltZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW5WYWx1ZS5pbmRleE9mKGZpbHRlclZhbHVlKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtblZhbHVlICE9PSBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBjb25zdCBmVmFsdWUgPSArZmlsdGVyVmFsdWUucmVwbGFjZSgnPj0nLCAnJykucmVwbGFjZSgnPD0nLCAnJykucmVwbGFjZSgnPicsICcnKS5yZXBsYWNlKCc8JywgJycpO1xyXG4gICAgICAgICAgICBjb25zdCBjVmFsdWUgPSArY29sdW1uVmFsdWU7XHJcbiAgICAgICAgICAgIGlmIChmVmFsdWUgfHwgZlZhbHVlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFjVmFsdWUgJiYgY1ZhbHVlICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5pbmRleE9mKCc+PScpID4gLTEgJiYgY1ZhbHVlIDwgZlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJWYWx1ZS5pbmRleE9mKCc8PScpID4gLTEgJiYgY1ZhbHVlID4gZlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJWYWx1ZS5pbmRleE9mKCc8JykgPiAtMSAmJiBjVmFsdWUgPj0gZlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJWYWx1ZS5pbmRleE9mKCc+JykgPiAtMSAmJiBjVmFsdWUgPD0gZlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjVmFsdWUgIT09IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbCcpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlID09PSAnMScgJiYgY29sdW1uVmFsdWUgIT09ICcxJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlclZhbHVlID09PSAnMCcgJiYgY29sdW1uVmFsdWUgIT09ICcwJyAmJiBjb2x1bW5WYWx1ZSAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGF0ZXRpbWUnIHx8IHR5cGUgPT09ICdkYXRlJyB8fCB0eXBlID09PSAndGltZScpIHtcclxuICAgICAgICAgICAgY29uc3QgZnJvbSA9IHJhd0NvbHVtbkZpbHRlcltmaWVsZF0/LmZyb20gPz8gcmF3Q29sdW1uRmlsdGVyW2ZpZWxkXTtcclxuICAgICAgICAgICAgY29uc3QgdG8gPSByYXdDb2x1bW5GaWx0ZXJbZmllbGRdPy50byA/PyByYXdDb2x1bW5GaWx0ZXJbZmllbGRdO1xyXG4gICAgICAgICAgICBjb25zdCBmcm9tRGF0ZSA9IERhdGUuYmVnaW4oZnJvbSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGF0ZSA9IERhdGUuZW5kKHRvKTtcclxuICAgICAgICAgICAgaWYgKGZyb21EYXRlICYmIHRvRGF0ZSkge1xyXG4gICAgICAgICAgICAgIGlmICghY29sdW1uVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKGNvbHVtblZhbHVlKS5nZXRUaW1lKCkgPCBmcm9tRGF0ZS5nZXRUaW1lKCkgfHwgbmV3IERhdGUoY29sdW1uVmFsdWUpLmdldFRpbWUoKSA+PSB0b0RhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbiAgICAvLyBTb3J0XHJcbiAgICBpZiAob3JkZXJCeSAmJiBvcmRlckRpcmVjdGlvbikge1xyXG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zLmZpbmQoZSA9PiBlLmZpZWxkID09PSBvcmRlckJ5KTtcclxuICAgICAgaWYgKGNvbHVtbikge1xyXG4gICAgICAgIGNvbnN0IHsgdHlwZSwgZmllbGQgfSA9IGNvbHVtbjtcclxuICAgICAgICBpdGVtcy5zb3J0KChjdXJyZW50LCBuZXh0KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChjdXJyZW50W2ZpZWxkXSB8fCAwKSAtIChuZXh0W2ZpZWxkXSB8fCAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCB0eXBlID09PSAndGltZScpIHtcclxuICAgICAgICAgICAgY29uc3QgZDEgPSBuZXcgRGF0ZShjdXJyZW50W2ZpZWxkXSB8fCAnJykuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBkMiA9IG5ldyBEYXRlKGN1cnJlbnRbZmllbGRdIHx8ICcnKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkMSAtIGQyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgczEgPSAoY3VycmVudFtmaWVsZF0gfHwgJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBjb25zdCBzMiA9IChuZXh0W2ZpZWxkXSB8fCAnJykudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGlmIChzMSA+IHMyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHMxIDwgczIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG9yZGVyRGlyZWN0aW9uID09PSAnZGVzYycpIHtcclxuICAgICAgICAgIGl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1zOiBpdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHBhZ2VOdW1iZXIgKiBwYWdlU2l6ZVxyXG4gICAgICAgICAgJiYgaW5kZXggPCAocGFnZU51bWJlciArIDEpICogcGFnZVNpemU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0b3RhbDogaXRlbXMubGVuZ3RoXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgI2dldEZpbHRlciA9ICgpOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QgPT4gKHtcclxuICAgIHJhd0NvbHVtbkZpbHRlcjogKHRoaXMuZ3JpZE9wdGlvbj8uZmlsdGVyPy5pbmxpbmVDb2x1bW4gPyB0aGlzLmNvbHVtbkZpbHRlciA6IHRoaXMuZ3JpZEZpbHRlcj8uY29sdW1uRmlsdGVyKSB8fCB7fSxcclxuICAgIHJhd0V4dGVybmFsRmlsdGVyOiB0aGlzLmdyaWRGaWx0ZXI/LmV4dGVybmFsRmlsdGVyIHx8IHt9LFxyXG4gICAgcmF3RmlsdGVyRGVmOiB0aGlzLmdyaWRGaWx0ZXI/LmZpbHRlckRlZiB8fCB7fSxcclxuICAgIG9yZGVyQnk6IHRoaXMuI3NvcnQ/LmFjdGl2ZSB8fCAnJyxcclxuICAgIG9yZGVyRGlyZWN0aW9uOiB0aGlzLiNzb3J0Py5kaXJlY3Rpb24gfHwgJycsXHJcbiAgICBwYWdlTnVtYmVyOiB0aGlzLiNwYWdpbmF0b3I/LnBhZ2VJbmRleCB8fCAwLFxyXG4gICAgcGFnZVNpemU6IHRoaXMuI3BhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5ncmlkT3B0aW9uPy5wYWdpbmF0ZT8ucGFnZVNpemUgfHwgNTBcclxuICB9KVxyXG5cclxuICAjbG9hZCA9IGFzeW5jIChmaWx0ZXJSZXE6IFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVxdWVzdCwgZm9yY2U6IGJvb2xlYW4gPSB0cnVlKSA9PiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdzZXJ2ZXInKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcyhmaWx0ZXJSZXEpO1xyXG4gICAgICAgIGlmIChpc09ic2VydmFibGUocmVzdWx0KSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdWx0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmb3JjZSkge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuI2xvY2FsSXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy4jbG9jYWxJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJMb2NhbCh0aGlzLiNsb2NhbEl0ZW1zLCBmaWx0ZXJSZXEpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuaGFuZGxlLmVycm9yKGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICNyZW5kZXIgPSBhc3luYyAoYXJnczogeyBpdGVtczogYW55W10sIHRvdGFsOiBudW1iZXIgfSkgPT4ge1xyXG4gICAgdGhpcy5zZFNjcm9sbD8uc2Nyb2xsVG9wKCk7XHJcbiAgICB0aGlzLml0ZW1zID0gYXJncz8uaXRlbXMgfHwgW107XHJcbiAgICB0aGlzLnRvdGFsID0gYXJncz8udG90YWwgfHwgMDtcclxuICAgIC8vIHRoaXMuaXNIaWRkZW5QYWdpbmF0b3IgPSB0aGlzLmZpbHRlckluZm8ucGFnZU51bWJlciA9PT0gMCAmJiB0aGlzLnRvdGFsIDw9IHRoaXMuZmlsdGVySW5mby5wYWdlU2l6ZTtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbTogU2RJdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0ub3JpZ2luSXRlbSA9IHsgLi4uaXRlbSB9O1xyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmdyaWRPcHRpb24/LnJlbG9hZD8ub25SZWxvYWQ/Lih0aGlzLml0ZW1zKTtcclxuICAgIHRoaXMuaXNTZWxlY3RBbGwgPSB0aGlzLml0ZW1zLmV2ZXJ5KGUgPT4gZS5pc1NlbGVjdGVkKTtcclxuICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICB9XHJcblxyXG4gIHJlbG9hZCA9IGFzeW5jIChmb3JjZTogYm9vbGVhbiA9IHRydWUpID0+IHtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNsb2FkKHRoaXMuI2dldEZpbHRlcigpLCBmb3JjZSk7XHJcbiAgICB0aGlzLiNyZW5kZXIoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAjZXhwb3J0ZWRJdGVtcyA9IGFzeW5jIChwYWdlTnVtYmVyOiBudW1iZXIgPSAwLCBwYWdlU2l6ZTogbnVtYmVyID0gMTAwMDApID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcykge1xyXG4gICAgICAvLyBjb25zdCBleHBvcnRlZEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXModGhpcy4jZmlsdGVyRXhwb3J0SW5mbyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlPGFueVtdPihyZXN1bHQpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvUHJvbWlzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc09ic2VydmFibGU8eyBpdGVtczogYW55W10sIHRvdGFsOiBudW1iZXIgfT4ocmVzdWx0KSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmlsdGVySW5mbyA9IHRoaXMuI2ZpbHRlckV4cG9ydEluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdzZXJ2ZXInKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcyhmaWx0ZXJJbmZvKTtcclxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZXhwb3J0ZWRJdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmdyaWRPcHRpb24uaXRlbXMpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKCk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHBvcnRlZEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlckxvY2FsKGV4cG9ydGVkSXRlbXMsIGZpbHRlckluZm8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4sIGNvbHVtbnM6IHN0cmluZ1tdKSB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkoY29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICB9XHJcblxyXG4gICNhbGxDb2x1bW5zID0gKCk6IFNkR3JpZE1hdGVyaWFsQ29sdW1uW10gPT4ge1xyXG4gICAgY29uc3QgY29sdW1uczogU2RHcmlkTWF0ZXJpYWxDb2x1bW5bXSA9IFtdO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZmlsdGVyKGUgPT4gIWUuZXhwb3J0Py5kaXNhYmxlZCkuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nKSB7XHJcbiAgICAgICAgY29sdW1uLmNoaWxkcmVuPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKS5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbHVtbnMucHVzaChjaGlsZENvbHVtbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuLWNvbCcpIHtcclxuICAgICAgICBjb2x1bW4uY2hpbGRyZW4/LmZpbHRlcihlID0+ICFlLmV4cG9ydD8uZGlzYWJsZWQpLmZvckVhY2goY2hpbGRDb2x1bW4gPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkQ29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNoaWxkQ29sdW1uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgI2FsbEV4cG9ydGVkQ29sdW1ucyA9ICgpOiBTZEdyaWRNYXRlcmlhbEV4cG9ydENvbHVtbltdID0+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5jb2x1bW5zPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKSB8fCBbXTtcclxuICB9XHJcblxyXG4gICNvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4sIGlzUmF3OiBib29sZWFuIH0pID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHsgZmlsZSwgaXNDU1YsIGlzUmF3IH0gPSBhcmdzO1xyXG4gICAgICBsZXQgeyBjb2x1bW5zIH0gPSBhcmdzO1xyXG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5tYXhJdGVtc1BlclJlcXVlc3QgfHwgMTAwMDtcclxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8uYmF0Y2ggfHwgMTtcclxuICAgICAgbGV0IHRvdGFsID0gdGhpcy50b3RhbDtcclxuICAgICAgbGV0IHBhZ2VOdW1iZXIgPSAwO1xyXG4gICAgICBsZXQgZXhwb3J0SXRlbXMgPSBbXTtcclxuICAgICAgdGhpcy5pc0V4cG9ydGluZyA9IHRydWU7XHJcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8YW55W10gfCB7XHJcbiAgICAgICAgaXRlbXM6IGFueVtdO1xyXG4gICAgICAgIHRvdGFsOiBudW1iZXI7XHJcbiAgICAgIH0+W10gPSBbXTtcclxuICAgICAgY29uc3QgaGFuZGxlRGF0YSA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIHByb21pc2VzID0gW107XHJcbiAgICAgICAgZXhwb3J0SXRlbXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XHJcbiAgICAgICAgICBpZiAoJ2l0ZW1zJyBpbiByZXN1bHQpIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBbLi4uZXhwb3J0SXRlbXMsIC4uLnJlc3VsdC5pdGVtc107XHJcbiAgICAgICAgICAgIHRvdGFsID0gcmVzdWx0LnRvdGFsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBbLi4uZXhwb3J0SXRlbXMsIC4uLnJlc3VsdF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5tYXBwaW5nKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXBwaW5nKGV4cG9ydEl0ZW1zKTtcclxuICAgICAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICBleHBvcnRJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHBvcnRJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRvdGFsUGFnZSA9IHRvdGFsIC8gcGFnZVNpemU7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQoKHBhZ2VOdW1iZXIgLSAxKSAqIDEwMC4wIC8gdG90YWxQYWdlKTtcclxuICAgICAgICB0aGlzLmV4cG9ydFRpdGxlID0gYEV4cG9ydGluZy4uLiR7cGVyY2VudH0lYDtcclxuICAgICAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy4jYWxsQ29sdW1ucygpO1xyXG4gICAgICAgIGNvbnN0IGFsbEV4cG9ydGVkQ29sdW1ucyA9IHRoaXMuI2FsbEV4cG9ydGVkQ29sdW1ucygpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHBvcnRJdGVtcykge1xyXG4gICAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGFzeW5jIChleHBvcnRDb2x1bW46IFNkRXhwb3J0Q29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgIG9ialtleHBvcnRDb2x1bW4uZmllbGRdID0gaXRlbVtleHBvcnRDb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZSA9PiBlLmZpZWxkID09PSBleHBvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBleHBvcnRlZENvbHVtbiA9IGFsbEV4cG9ydGVkQ29sdW1ucy5maW5kKGUgPT4gZS5maWVsZCA9PT0gZXhwb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKGV4cG9ydGVkQ29sdW1uPy50cmFuc2Zvcm0pIHtcclxuICAgICAgICAgICAgICBvYmpbZXhwb3J0ZWRDb2x1bW4uZmllbGRdID0gZXhwb3J0ZWRDb2x1bW4udHJhbnNmb3JtKGl0ZW1bZXhwb3J0ZWRDb2x1bW4uZmllbGRdLCBpdGVtKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFjb2x1bW4pIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nIHx8IGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4tY29sJykge1xyXG4gICAgICAgICAgICAgIGNvbHVtbj8uY2hpbGRyZW4uZm9yRWFjaChjaGlsZENvbHVtbiA9PiBoYW5kbGUoY2hpbGRDb2x1bW4pKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFjb2x1bW5zLnNvbWUoZSA9PiBlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29sdW1uLnRyYW5zZm9ybShpdGVtW2NvbHVtbi5maWVsZF0sIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGF3YWl0IHRyYW5zZm9ybTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSB0cmFuc2Zvcm07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bY29sdW1uLmZpZWxkXSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1bY29sdW1uLmZpZWxkXSA9PT0gbnVsbCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSAnJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3N0cmluZycgfHwgY29sdW1uLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgY2VsbCBsw6Agc3RyaW5nIGhv4bq3YyBudW1iZXIgdGjDrCBnw6FuIGLhurFuZyBjaMOtbmggbsOzXHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBpdGVtW2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGzDoCBib29sIHRow6wgZ8OhbiBi4bqxbmcgZ2nDoSB0cuG7iyB0cnVlVmFsdWUgdsOgIGZhbHNlVmFsdWUgKG7hur91IGPDsyksIG3hurdjIMSR4buLbmggbMOgIFRSVUUvRkFMU0VcclxuICAgICAgICAgICAgICBpZiAoaXRlbVtjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi5vcHRpb24/LmRpc3BsYXlPblRydWUgfHwgJ1RydWUnO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqW2NvbHVtbi5maWVsZF0gIT09IHVuZGVmaW5lZCAmJiBvYmpbY29sdW1uLmZpZWxkXSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25GYWxzZSB8fCAnRmFsc2UnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRhdGUgPSBpdGVtW2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm1EYXRlIH0gPSBjb2x1bW47XHJcbiAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybURhdGUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGUgPSB0cmFuc2Zvcm1EYXRlKGRhdGUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBEYXRlLnRvRm9ybWF0KGRhdGUsICdkZC9NTS95eXl5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgICBsZXQgZGF0ZSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybURhdGUgfSA9IGNvbHVtbjtcclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZSA9IHRyYW5zZm9ybURhdGUoZGF0ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIE7hur91IGzDoCBkYXRldGltZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBEYXRlLnRvRm9ybWF0KGRhdGUsICdkZC9NTS95eXl5IEhIOm1tJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICd0aW1lJykge1xyXG4gICAgICAgICAgICAgIGxldCBkYXRlID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtRGF0ZSB9ID0gY29sdW1uO1xyXG4gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlID0gdHJhbnNmb3JtRGF0ZShkYXRlLCBpdGVtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIHRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnSEg6bW0nKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgdmFsdWVzIHRow6wgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSB2YWx1ZSDEkcaw4bujYyBjaOG7jW5cclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGF3YWl0IHRoaXMuY29sdW1uVmFsdWVzUGlwZS50cmFuc2Zvcm0oaXRlbVtjb2x1bW4uZmllbGRdLCBjb2x1bW4pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgLy8gdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgICAgZm9yIChjb25zdCBleHBvcnRDb2x1bW4gb2YgY29sdW1ucykge1xyXG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUoZXhwb3J0Q29sdW1uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW1zLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKHBhZ2VOdW1iZXIgKiBwYWdlU2l6ZSA8IHRvdGFsKSB7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLiNleHBvcnRlZEl0ZW1zKHBhZ2VOdW1iZXIsIHBhZ2VTaXplKSk7XHJcbiAgICAgICAgcGFnZU51bWJlcisrO1xyXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPCBiYXRjaCkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IGhhbmRsZURhdGEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGF3YWl0IGhhbmRsZURhdGEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWZpbGU/LmZpbGVQYXRoKSB7XHJcbiAgICAgICAgaWYgKGlzQ1NWKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0Q1NWKHtcclxuICAgICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8uZmlsZU5hbWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNSYXcpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRFeGNlbFJhdyh7XHJcbiAgICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LmZpbGVOYW1lXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzOiB7XHJcbiAgICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICBpdGVtczogYW55W10sXHJcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdXHJcbiAgICAgICAgfVtdID0gW107XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LnNoZWV0cykpIHtcclxuICAgICAgICAgIGZvciAoY29uc3Qgc2hlZXQgb2YgdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5zaGVldHMpIHtcclxuICAgICAgICAgICAgaWYgKHNoZWV0Lm5hbWUgJiYgc2hlZXQuaXRlbXMgJiYgc2hlZXQuZmllbGRzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlZXQuaXRlbXMpKSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBzaGVldC5pdGVtcyxcclxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBzaGVldC5maWVsZHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzaGVldHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHNoZWV0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiBhd2FpdCBzaGVldC5pdGVtcygpLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IHNoZWV0LmZpZWxkc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnQoe1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsZU5hbWU6IHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5maWxlTmFtZSxcclxuICAgICAgICAgIHNoZWV0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0QnlUZW1wbGF0ZSh7XHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUuZmlsZVBhdGgsXHJcbiAgICAgICAgZmlsZU5hbWU6IGZpbGUuZmlsZU5hbWUsXHJcbiAgICAgICAgY29sdW1ucyxcclxuICAgICAgICBpdGVtc1xyXG4gICAgICB9KTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5leHBvcnRUaXRsZSA9IGBFeHBvcnRgO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydCA9IGFzeW5jIChhcmdzOiB7IGZpbGU6IFNkRXhwb3J0RmlsZSwgY29sdW1uczogU2RFeHBvcnRDb2x1bW5bXSwgaXNDU1Y6IGJvb2xlYW4sIGlzUmF3OiBib29sZWFuIH0pID0+IHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRlIH0gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgICBpZiAoIWFyZ3MuaXNDU1YgJiYgdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXggJiYgdGhpcy50b3RhbCA+IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWF4KSB7XHJcbiAgICAgIGFyZ3MuaXNSYXcgPSB0cnVlO1xyXG4gICAgICB0aGlzLiNvbkV4cG9ydChhcmdzKTtcclxuICAgICAgLy8gdGhpcy5ub3RpZnlTZXJ2aWNlLmNvbmZpcm0odHJhbnNsYXRlKGBUb3RhbCByb3dzIHJlYWNoIGxpbWl0LCBkbyB5b3Ugd2FudCB0byBleHBvcnQgQ1NWYCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAvLyAgIGFyZ3MuaXNDU1YgPSB0cnVlO1xyXG4gICAgICAvLyAgIHRoaXMuI29uRXhwb3J0KGFyZ3MpO1xyXG4gICAgICAvLyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy4jb25FeHBvcnQoYXJncyk7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlckNoYW5nZSA9ICgpID0+IHtcclxuICAgIHRoaXMuI3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5yZWxvYWQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBhbmQgPSBhc3luYyAocm93RGF0YTogU2RHcmlkTWF0ZXJpYWxJdGVtPFQ+KSA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnN1YkluZm9ybWF0aW9uPy5hbHdheXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHJvd0RhdGEuaXNFeHBhbmRlZCkge1xyXG4gICAgICByb3dEYXRhLmlzRXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZE9wdGlvbj8uc3ViSW5mb3JtYXRpb24/Lm9uRXhwYW5kPy4ocm93RGF0YSk7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbi5zdWJJbmZvcm1hdGlvbj8ubXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc0V4cGFuZGluZyA9IGl0ZW0uaXNFeHBhbmRlZCA9IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICByb3dEYXRhLmlzRXhwYW5kaW5nID0gdHJ1ZTtcclxuICAgICAgZGF0YS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgcm93RGF0YS5leHBhbmREZXRhaWwgPSByZXM7XHJcbiAgICAgICAgcm93RGF0YS5pc0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiByb3dEYXRhLmlzRXhwYW5kaW5nID0gZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcm93RGF0YS5leHBhbmREZXRhaWwgPSBkYXRhO1xyXG4gICAgICByb3dEYXRhLmlzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3QgPSAocm93RGF0YTogU2RHcmlkTWF0ZXJpYWxJdGVtPFQ+KSA9PiB7XHJcbiAgICBpZiAocm93RGF0YT8uc2RHcm91cD8uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICByb3dEYXRhPy5zZEdyb3VwPy5pdGVtcy5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gcm93RGF0YS5pc1NlbGVjdGVkKTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9uLnNlbGVjdGlvbj8ub25TZWxlY3Q/Lihyb3dEYXRhLCB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNTZWxlY3RlZCkpO1xyXG4gICAgICB0aGlzLmlzU2VsZWN0QWxsID0gdGhpcy5pdGVtcy5ldmVyeShlID0+IGUuaXNTZWxlY3RlZCk7XHJcbiAgICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24uc2VsZWN0aW9uPy5zaW5nbGUpIHtcclxuICAgICAgICB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUgIT09IHJvd0RhdGEpLmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy4jdXBkYXRlU2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyaWRPcHRpb24uc2VsZWN0aW9uPy5vblNlbGVjdD8uKHJvd0RhdGEsIHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5pc1NlbGVjdGVkKSk7XHJcbiAgICAgIHRoaXMuaXNTZWxlY3RBbGwgPSB0aGlzLml0ZW1zLmV2ZXJ5KGUgPT4gZS5pc1NlbGVjdGVkKTtcclxuICAgICAgdGhpcy4jdXBkYXRlU2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGwgPSAoKSA9PiB7XHJcbiAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICBpZiAoZS5zZWxlY3RhYmxlICYmICghdGhpcy5ncmlkT3B0aW9uPy5zZWxlY3Rpb24/LmFjdGlvbnM/Lmxlbmd0aCB8fCBlLmFjdGlvbnM/Lmxlbmd0aCkpIHtcclxuICAgICAgICBlLmlzU2VsZWN0ZWQgPSB0aGlzLmlzU2VsZWN0QWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbi5zZWxlY3Rpb24/Lm9uU2VsZWN0QWxsPy4odGhpcy5pdGVtcy5maWx0ZXIoZSA9PiBlLmlzU2VsZWN0ZWQpKTtcclxuICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXJTZWxlY3Rpb24gPSAoaXRlbXM/OiBTZEdyaWRNYXRlcmlhbEl0ZW08VD5bXSkgPT4ge1xyXG4gICAgaXRlbXMgPSBpdGVtcyB8fCB0aGlzLml0ZW1zO1xyXG4gICAgdGhpcy5pc1NlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgaXRlbXM/LmZvckVhY2goZSA9PiBlLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICAjdXBkYXRlU2VsZWN0ZWRJdGVtcyA9ICgpID0+IHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc1NlbGVjdGVkKVxyXG4gICAgICAubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgIGlzU2VsZWN0ZWQsXHJcbiAgICAgICAgICBpc0V4cGFuZGVkLFxyXG4gICAgICAgICAgaXNFeHBhbmRpbmcsXHJcbiAgICAgICAgICBleHBhbmREZXRhaWwsXHJcbiAgICAgICAgICBlZGl0b3JFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICBlZGl0b3JIYW5kbGVyQ29sdW1uLFxyXG4gICAgICAgICAgZWRpdG9ySGFuZGxlclJvdyxcclxuICAgICAgICAgIGVkaXRvclN0YXR1cyxcclxuICAgICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgICBzZElkLFxyXG4gICAgICAgICAgc2RWZXJzaW9uLFxyXG4gICAgICAgICAgLy8gR2nhu68gbOG6oWkgY8OhYyB0csaw4budbmcgdGjDtG5nIHRpbiBjaG8gc2VsZWN0YWJsZSAoYWN0aW9uLCBncm91cGVkQWN0aW9uLCBzZEdyb3VwLCBzZWxlY3RhYmxlKVxyXG4gICAgICAgICAgLi4ucmVzdWx0XHJcbiAgICAgICAgfSA9IGl0ZW07XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSkgYXMgVFtdO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXI/Lm9uQ2xlYXJGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIHNldEZpbHRlciA9IChhcmdzOiB7XHJcbiAgICBjb2x1bW5GaWx0ZXI6IGFueSxcclxuICAgIGV4dGVybmFsRmlsdGVyOiBhbnksXHJcbiAgICBmaWx0ZXJEZWY6IGFueVxyXG4gIH0pID0+IHtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcj8uc2V0RmlsdGVyKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgb25DcmVhdGUgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB7IHR5cGUsIGVkaXRvciwgY29sdW1ucyB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaWYgKCFlZGl0b3I/LmFkZGFibGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbTogU2RHcmlkTWF0ZXJpYWxJdGVtID0ge307XHJcbiAgICAvLyBHw6FuIGdpw6EgdHLhu4sgbeG6t2MgxJHhu4tuaFxyXG4gICAgY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5maWVsZF0gPSAnJztcclxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2wnKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5maWVsZF0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgIGVkaXRvci5vbkFkZD8uKGl0ZW0sIHRoaXMuI2xvY2FsSXRlbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWRpdG9yLm9uQWRkPy4oaXRlbSwgdGhpcy5pdGVtcyk7XHJcbiAgICB9XHJcbiAgICAvLyDEkMawYSBpdGVtIGzDqm4gZMOybmcgxJHhuqd1IHRpw6puIG7hur91IHR5cGUga2jDoWMgcG9wdXBcclxuICAgIGlmIChlZGl0b3IudHlwZSAhPT0gJ3BvcHVwJykge1xyXG4gICAgICBpZiAoZWRpdG9yLmFkZFRvTGFzdCkge1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zID0gWy4uLnRoaXMuI2xvY2FsSXRlbXMsIGl0ZW1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXMsIGl0ZW1dO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zID0gW2l0ZW0sIC4uLnRoaXMuI2xvY2FsSXRlbXNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1zID0gW2l0ZW0sIC4uLnRoaXMuaXRlbXNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpdGVtLmVkaXRvclN0YXR1cyA9ICdjcmVhdGUnO1xyXG4gICAgaXRlbS5lZGl0b3JIYW5kbGVyUm93ID0ge1xyXG4gICAgICB0ZW1wb3Jhcnk6IHsgLi4uaXRlbSB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBvblVwZGF0ZSA9IChpdGVtOiBTZEl0ZW0pID0+IHtcclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBpdGVtLmVkaXRvclN0YXR1cyA9ICd1cGRhdGUnO1xyXG4gICAgaXRlbS5lZGl0b3JIYW5kbGVyUm93ID0ge1xyXG4gICAgICAuLi5pdGVtLmVkaXRvckhhbmRsZXJSb3csXHJcbiAgICAgIHRlbXBvcmFyeTogeyAuLi5pdGVtIH1cclxuICAgIH07XHJcbiAgICAvLyB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgIGlmIChlZGl0b3IudHlwZSA9PT0gJ3BvcHVwJykge1xyXG4gICAgICAvLyBY4butIGzDvSBjYXNlIHBvcHVwXHJcbiAgICAgIC8vIHRoaXMuc2RHcmlkUG9wdXBFZGl0b3Iub3BlbihpdGVtLCBjb2x1bW5zLCBpc01vZGlmaWVkKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb25TYXZlID0gYXN5bmMgKGl0ZW06IFNkR3JpZE1hdGVyaWFsSXRlbTxUPikgPT4ge1xyXG4gICAgaWYgKGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zYXZpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgICBpZiAoZWRpdG9yLnZhbGlkYXRlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZWRpdG9yLnZhbGlkYXRlKGl0ZW0sIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBtZXNzYWdlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlc3VsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVkaXRvci5vblNhdmUpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBlZGl0b3Iub25TYXZlKGl0ZW0pO1xyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXRlbS5lZGl0b3JTdGF0dXMgPT09ICdjcmVhdGUnICYmIGVkaXRvci50eXBlID09PSAncG9wdXAnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDAsIGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpdGVtLmVkaXRvclN0YXR1cyA9IHVuZGVmaW5lZDtcclxuICAgICAgLy8gdGhpcy5nZW5lcmF0ZUVkaXRvckhhbmxkZXIoaXRlbSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLm5vdGlmeS53YXJuaW5nKGVycik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpdGVtLmVkaXRvckhhbmRsZXJSb3cuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25DYW5jZWwgPSAoaXRlbTogU2RHcmlkTWF0ZXJpYWxJdGVtPFQ+KSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaWYgKGVkaXRvci50eXBlID09PSAnaW5saW5lJykge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICBjb25zdCBpZHgyID0gdGhpcy4jbG9jYWxJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuI2xvY2FsSXRlbXMuc3BsaWNlKGlkeDIsIDEpO1xyXG4gICAgICAgIHRoaXMuI2xvY2FsSXRlbXMgPSBbLi4udGhpcy4jbG9jYWxJdGVtc107XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWR4MSA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaWR4MSwgMSk7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtc107XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgIGVkaXRvcj8ub25DYW5jZWw/LihpdGVtLCB0aGlzLiNsb2NhbEl0ZW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlZGl0b3I/Lm9uQ2FuY2VsPy4oaXRlbSwgdGhpcy5pdGVtcyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgPT09ICdmb2N1cycpIHtcclxuICAgICAgaWYgKGl0ZW0uZWRpdG9yU3RhdHVzID09PSAnY3JlYXRlJykge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgY29uc3QgaWR4MiA9IHRoaXMuI2xvY2FsSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgIHRoaXMuI2xvY2FsSXRlbXMuc3BsaWNlKGlkeDIsIDEpO1xyXG4gICAgICAgICAgdGhpcy4jbG9jYWxJdGVtcyA9IFsuLi50aGlzLiNsb2NhbEl0ZW1zXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWR4MSA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgxLCAxKTtcclxuICAgICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgaXRlbS5lZGl0b3JIYW5kbGVyUm93LnRlbXBvcmFyeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGl0ZW0uZWRpdG9yU3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvblJlbW92ZSA9IGFzeW5jIChpdGVtOiBTZEdyaWRNYXRlcmlhbEl0ZW08VD4pID0+IHtcclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBpZiAoZWRpdG9yPy5iZWZvcmVSZW1vdmUpIHtcclxuICAgICAgY29uc3QgYmVmb3JlUmVtb3ZlID0gZWRpdG9yPy5iZWZvcmVSZW1vdmUoaXRlbSk7XHJcbiAgICAgIGlmIChiZWZvcmVSZW1vdmUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmVmb3JlUmVtb3ZlO1xyXG4gICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghYmVmb3JlUmVtb3ZlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgPT09ICdpbmxpbmUnKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgIGNvbnN0IGlkeDIgPSB0aGlzLiNsb2NhbEl0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgdGhpcy4jbG9jYWxJdGVtcy5zcGxpY2UoaWR4MiwgMSk7XHJcbiAgICAgICAgdGhpcy4jbG9jYWxJdGVtcyA9IFsuLi50aGlzLiNsb2NhbEl0ZW1zXTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpZHgxID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgxLCAxKTtcclxuICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgZWRpdG9yPy5vblJlbW92ZT8uKGl0ZW0sIHRoaXMuI2xvY2FsSXRlbXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVkaXRvcj8ub25SZW1vdmU/LihpdGVtLCB0aGlzLml0ZW1zKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZCA9IChpZHg6IG51bWJlciwgaXRlbTogVCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID4gaWR4KSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGlkeCwgMCwgaXRlbSk7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtc107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXMsIGl0ZW1dO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlID0gKGlkeDogbnVtYmVyLCBpdGVtOiBUKSA9PiB7XHJcbiAgICBpZiAodGhpcy5pdGVtc1tpZHhdKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5pdGVtc1tpZHhdLCBpdGVtKTtcclxuICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZSA9IChpZHg6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKHRoaXMuaXRlbXNbaWR4XSkge1xyXG4gICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEl0ZW0gPSAoaWR4OiBudW1iZXIpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07XHJcbiAgICB0aGlzLmVkaXRvckhhbmRsZXJDb2x1bW5QaXBlLnRyYW5zZm9ybShpdGVtLnNkVmVyc2lvbiwgaXRlbSwgdGhpcy5ncmlkT3B0aW9uKTtcclxuICB9XHJcblxyXG4gIGdldCBlZGl0ZWRJdGVtcygpOiAoVCAmIHsgZWRpdG9yRXJyb3JNZXNzYWdlOiBzdHJpbmcgfSlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgIGlmICghaXRlbS5vcmlnaW5JdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKE9iamVjdC5rZXlzKGl0ZW0ub3JpZ2luSXRlbSkuc29tZShrZXkgPT4gaXRlbS5vcmlnaW5JdGVtW2tleV0gIT09IGl0ZW1ba2V5XSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGNvbnN0IHtcclxuICAgICAgICBlZGl0b3JTdGF0dXMsXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlclJvdyxcclxuICAgICAgICBlZGl0b3JIYW5kbGVyQ29sdW1uLFxyXG4gICAgICAgIGVkaXRvckVycm9yTWVzc2FnZSxcclxuICAgICAgICBleHBhbmREZXRhaWwsXHJcbiAgICAgICAgaXNFeHBhbmRlZCxcclxuICAgICAgICBpc0V4cGFuZGluZyxcclxuICAgICAgICBpc1NlbGVjdGVkLFxyXG4gICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgc2RJZCxcclxuICAgICAgICBzZFZlcnNpb24sXHJcbiAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICBhY3Rpb25zLFxyXG4gICAgICAgIGdyb3VwZWRBY3Rpb25zLFxyXG4gICAgICAgIHNkR3JvdXAsXHJcbiAgICAgICAgdGVtcG9yYXJ5LFxyXG4gICAgICAgIC4uLnJlc3VsdCB9ID0gaXRlbTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5yZXN1bHQsXHJcbiAgICAgICAgZWRpdG9yRXJyb3JNZXNzYWdlXHJcbiAgICAgIH0gYXMgYW55O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZEl0ZW1zKCk6IFRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGNvbnN0IHtcclxuICAgICAgICBlZGl0b3JTdGF0dXMsXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlclJvdyxcclxuICAgICAgICBlZGl0b3JIYW5kbGVyQ29sdW1uLFxyXG4gICAgICAgIGV4cGFuZERldGFpbCxcclxuICAgICAgICBpc0V4cGFuZGVkLFxyXG4gICAgICAgIGlzRXhwYW5kaW5nLFxyXG4gICAgICAgIGlzU2VsZWN0ZWQsXHJcbiAgICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgICBzZElkLFxyXG4gICAgICAgIHNkVmVyc2lvbixcclxuICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgIGFjdGlvbnMsXHJcbiAgICAgICAgZ3JvdXBlZEFjdGlvbnMsXHJcbiAgICAgICAgc2RHcm91cCxcclxuICAgICAgICB0ZW1wb3JhcnksXHJcbiAgICAgICAgLi4ucmVzdWx0IH0gPSBpdGVtO1xyXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZGV0ZWN0Q2hhbmdlcyA9ICgpID0+IHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgZ2V0IGlzRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLnNvbWUoZSA9PiBlLmVkaXRvclN0YXR1cyAhPT0gdW5kZWZpbmVkKTtcclxuICB9XHJcbn1cclxuIl19
1018
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tYXRlcmlhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvdXNlci9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS9ncmlkLW1hdGVyaWFsLyIsInNvdXJjZXMiOlsic3JjL2xpYi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFFVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUdULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFPN0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw0QkFBNEIsRUFFN0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBYyxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxn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QWMsRUFBRTt3QkFDdEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ2hGLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzt3QkFDaEUsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3FCQUN0RixDQUFDO2lCQUNIOzthQUNGOzs7WUF4REMsaUJBQWlCOzRDQXVMZCxNQUFNLFNBQUMsb0JBQW9CLGNBQUcsUUFBUTtZQW5KbEMsMEJBQTBCO1lBRkksZUFBZTtZQVg3QyxlQUFlO1lBZWYsa0JBQWtCO1lBR2xCLGtCQUFrQjtZQUNsQix5QkFBeUI7Ozt1QkFnQi9CLFNBQVMsU0FBQyxpQkFBaUI7MEJBRzNCLFNBQVMsU0FBQyxhQUFhOzBCQUd2QixTQUFTLFNBQUMsWUFBWTtxQkFldEIsS0FBSzt3QkErQkwsU0FBUyxTQUFDLFlBQVk7bUJBZXRCLFNBQVMsU0FBQyxPQUFPOzRCQWNqQixTQUFTLFNBQUMsYUFBYTsrQkFHdkIsWUFBWSxTQUFDLG9DQUFvQzswQkFHakQsWUFBWSxTQUFDLCtCQUErQjt5QkFHNUMsZUFBZSxTQUFDLDBCQUEwQjsyQkFNMUMsZUFBZSxTQUFDLDRCQUE0QjsyQkFPNUMsZUFBZSxTQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIEluamVjdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQ29udGVudENoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XHJcbmltcG9ydCB7XHJcbiAgU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0XHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1maWx0ZXIubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIFNkR3JpZE1hdGVyaWFsT3B0aW9uXHJcbn0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1vcHRpb24ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdSSURfTUFURVJJQUxfQ09ORklHLFxyXG4gIERFRkFVTFRfR1JJRF9NQVRFUklBTF9DT05GSUcsXHJcbiAgSVNkR3JpZE1hdGVyaWFsQ29uZmlndXJhdGlvblxyXG59IGZyb20gJy4vbW9kZWxzL2dyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2ROb3RpZnlTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9ub3RpZnknO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IFNkR3JpZE1hdGVyaWFsQ29sdW1uIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1jb2x1bW4ubW9kZWwnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsQ2VsbERlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1jZWxsLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RHcmlkRmlsdGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtZmlsdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtbWF0ZXJpYWwtc3ViLWluZm9ybWF0aW9uLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZE1hdGVyaWFsRm9vdGVyRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NkLW1hdGVyaWFsLWZvb3Rlci1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2RNYXRlcmlhbEVtcHR5RGF0YURlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1tYXRlcmlhbC1lbXB0eS1kYXRhLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZFBvcHVwRXhwb3J0IH0gZnJvbSAnLi9jb21wb25lbnRzL3BvcHVwLWV4cG9ydC9wb3B1cC1leHBvcnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2RFeHBvcnRDb2x1bW4sIFNkRXhwb3J0RmlsZSwgU2RFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9leHBvcnQnO1xyXG5pbXBvcnQgeyBTZEdyaWRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZEdyaWRDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZ3JpZC1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbEV4cG9ydENvbHVtbiB9IGZyb20gJy4vbW9kZWxzL2dyaWQtZXhwb3J0Lm1vZGVsJztcclxuaW1wb3J0IHsgU2RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS90cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTZFF1aWNrQWN0aW9uIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9xdWljay1hY3Rpb24nO1xyXG5pbXBvcnQgeyBTZEdyaWRNYXRlcmlhbEl0ZW0sIFNkSXRlbSB9IGZyb20gJy4vbW9kZWxzL2dyaWQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZENvbHVtblZhbHVlc1BpcGUgfSBmcm9tICcuL3BpcGVzL2NvbHVtbi12YWx1ZXMucGlwZSc7XHJcbmltcG9ydCB7IFNkRWRpdG9ySGFuZGxlckNvbHVtblBpcGUgfSBmcm9tICcuL3BpcGVzL2VkaXRvci1oYW5kbGVyLWNvbHVtbi5waXBlJztcclxuaW1wb3J0IHsgU2RTY3JvbGxEaXJlY3RpdmUgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NkLWdyaWQtbWF0ZXJpYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLW1hdGVyaWFsLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWRNYXRlcmlhbDxUID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFNkU2Nyb2xsRGlyZWN0aXZlKSBzZFNjcm9sbDogU2RTY3JvbGxEaXJlY3RpdmU7XHJcbiAga2V5ID0gdXVpZC52NCgpO1xyXG4gIGdyaWRDb25maWd1cmF0aW9uT2JzZXJ2ZXI6IE9ic2VydmFibGU8U2RHcmlkQ29uZmlndXJhdGlvbj47XHJcbiAgQFZpZXdDaGlsZChTZFF1aWNrQWN0aW9uKSBxdWlja0FjdGlvbjogU2RRdWlja0FjdGlvbjtcclxuXHJcbiAgZ3JpZEZpbHRlcjogU2RHcmlkRmlsdGVyO1xyXG4gIEBWaWV3Q2hpbGQoU2RHcmlkRmlsdGVyKSBzZXQgX2dyaWRGaWx0ZXIoZ3JpZEZpbHRlcjogU2RHcmlkRmlsdGVyKSB7XHJcbiAgICBpZiAoZ3JpZEZpbHRlciAmJiB0aGlzLmdyaWRGaWx0ZXIgIT09IGdyaWRGaWx0ZXIpIHtcclxuICAgICAgdGhpcy5ncmlkRmlsdGVyID0gZ3JpZEZpbHRlcjtcclxuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZChncmlkRmlsdGVyLmZpbHRlckNoYW5nZS5waXBlKFxyXG4gICAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLiNwYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuICAgICAgICAgIHRoaXMuI3JlbG9hZC5uZXh0KHtcclxuICAgICAgICAgICAgZm9yY2U6IGZhbHNlLFxyXG4gICAgICAgICAgICBzb3VyY2U6ICdGSUxURVInXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgKS5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgb3B0aW9uKG9wdGlvbjogU2RHcmlkTWF0ZXJpYWxPcHRpb24pIHtcclxuICAgIGlmIChvcHRpb24pIHtcclxuICAgICAgb3B0aW9uID0gdGhpcy4jaW5pdENvbmZpZ3VyYXRpb24ob3B0aW9uKTtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9uID0gb3B0aW9uO1xyXG4gICAgICB0aGlzLiNsb2FkQ29tcGxldGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuI3JlbG9hZC5uZXh0KHtcclxuICAgICAgICBmb3JjZTogdHJ1ZVxyXG4gICAgICB9KTtcclxuICAgICAgb3B0aW9uPy5jb2x1bW5zPy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgaWYgKGNvbC5maWx0ZXI/LmRlZmF1bHQpIHtcclxuICAgICAgICAgIHRoaXMuY29sdW1uRmlsdGVyW2NvbC5maWVsZF0gPSBjb2wuZmlsdGVyLmRlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQodGhpcy5rZXksIHRoaXMuZ3JpZE9wdGlvbik7XHJcbiAgICAgIHRoaXMuZ3JpZENvbmZpZ3VyYXRpb25PYnNlcnZlciA9IGNvbmZpZ3VyYXRpb24ub2JzZXJ2ZXI7XHJcbiAgICAgIGNvbmZpZ3VyYXRpb24ubG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ3JpZE9wdGlvbjogU2RHcmlkTWF0ZXJpYWxPcHRpb247XHJcbiAgI2xvY2FsSXRlbXM6IGFueVtdID0gW107XHJcbiAgaXRlbXM6IFNkR3JpZE1hdGVyaWFsSXRlbTxUPltdID0gW107XHJcbiAgc2VsZWN0ZWRJdGVtczogVFtdID0gW107XHJcbiAgdG90YWw6IG51bWJlcjtcclxuXHJcbiAgLy8gTG9hZGluZ1xyXG4gIGlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAvLyBQYWdpbmF0ZVxyXG4gIGlzSGlkZGVuUGFnaW5hdG9yID0gZmFsc2U7XHJcbiAgI3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcbiAgICBpZiAocGFnaW5hdG9yICYmIHRoaXMuI3BhZ2luYXRvciAhPT0gcGFnaW5hdG9yKSB7XHJcbiAgICAgIHRoaXMuI3BhZ2luYXRvciA9IHBhZ2luYXRvcjtcclxuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZChwYWdpbmF0b3IucGFnZS5waXBlKFxyXG4gICAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLiNyZWxvYWQubmV4dCh7XHJcbiAgICAgICAgICAgIGZvcmNlOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICkuc3Vic2NyaWJlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU29ydGluZ1xyXG4gICNzb3J0OiBNYXRTb3J0O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IHNvcnQoc29ydDogTWF0U29ydCkge1xyXG4gICAgaWYgKHNvcnQgJiYgdGhpcy4jc29ydCAhPT0gc29ydCkge1xyXG4gICAgICB0aGlzLiNzb3J0ID0gc29ydDtcclxuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZChzb3J0LnNvcnRDaGFuZ2UucGlwZShcclxuICAgICAgICBtYXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy4jcmVsb2FkLm5leHQoe1xyXG4gICAgICAgICAgICBmb3JjZTogZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEV4cG9ydFxyXG4gIEBWaWV3Q2hpbGQoU2RQb3B1cEV4cG9ydCkgc2RQb3B1cEV4cG9ydDogU2RQb3B1cEV4cG9ydDtcclxuXHJcbiAgLy8gU3ViIEluZm9ybWF0aW9uXHJcbiAgQENvbnRlbnRDaGlsZChTZE1hdGVyaWFsU3ViSW5mb3JtYXRpb25EZWZEaXJlY3RpdmUpIHNkU3ViSW5mb3JtYXRpb246IFNkTWF0ZXJpYWxTdWJJbmZvcm1hdGlvbkRlZkRpcmVjdGl2ZTtcclxuXHJcbiAgLy8gRW1wdHkgRGF0YVxyXG4gIEBDb250ZW50Q2hpbGQoU2RNYXRlcmlhbEVtcHR5RGF0YURlZkRpcmVjdGl2ZSkgc2RFbXB0eURhdGE6IFNkTWF0ZXJpYWxFbXB0eURhdGFEZWZEaXJlY3RpdmU7XHJcblxyXG4gIC8vIENlbGwgRGVmXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZE1hdGVyaWFsQ2VsbERlZkRpcmVjdGl2ZSkgc2RDZWxsRGVmcyA9IG5ldyBRdWVyeUxpc3Q8U2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmU+KCk7XHJcbiAgY2VsbERlZjoge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogU2RNYXRlcmlhbENlbGxEZWZEaXJlY3RpdmVcclxuICB9ID0ge307XHJcblxyXG4gIC8vIEZvb3RlciBEZWZcclxuICBAQ29udGVudENoaWxkcmVuKFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmUpIHNkRm9vdGVyRGVmcyA9IG5ldyBRdWVyeUxpc3Q8U2RNYXRlcmlhbEZvb3RlckRlZkRpcmVjdGl2ZT4oKTtcclxuICBmb290ZXJEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkTWF0ZXJpYWxGb290ZXJEZWZEaXJlY3RpdmVcclxuICB9ID0ge307XHJcbiAgaGFzRm9vdGVyID0gZmFsc2U7XHJcblxyXG4gIC8vIEZpbHRlciBEZWZcclxuICBAQ29udGVudENoaWxkcmVuKFNkTWF0ZXJpYWxGaWx0ZXJEZWZEaXJlY3RpdmUpIHNkRmlsdGVyRGVmcyA9IG5ldyBRdWVyeUxpc3Q8U2RNYXRlcmlhbEZpbHRlckRlZkRpcmVjdGl2ZT4oKTtcclxuICBmaWx0ZXJEZWZzOiBTZE1hdGVyaWFsRmlsdGVyRGVmRGlyZWN0aXZlW10gPSBbXTtcclxuXHJcbiAgLy8gRmlsdGVyXHJcbiAgY29sdW1uRmlsdGVyOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcclxuICB9ID0ge307XHJcbiAgLy8gU3ViY3JpcHRpb25cclxuICAjc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICNyZWxvYWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcclxuICAgIGZvcmNlOiBib29sZWFuLFxyXG4gICAgc291cmNlPzogJ0lOSVRJQUxJWkUnIHwgJ0ZJTFRFUidcclxuICB9Pih7XHJcbiAgICBmb3JjZTogdHJ1ZSxcclxuICAgIHNvdXJjZTogJ0lOSVRJQUxJWkUnXHJcbiAgfSk7XHJcbiAgaXNFeHBvcnRpbmcgPSBmYWxzZTtcclxuICBpc1NlbGVjdEFsbCA9IGZhbHNlO1xyXG4gIGV4cG9ydFRpdGxlID0gJ0V4cG9ydCc7XHJcbiAgI2xvYWRDb21wbGV0ZWQgPSBmYWxzZTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIEBJbmplY3QoR1JJRF9NQVRFUklBTF9DT05GSUcpIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWd1cmF0aW9uOiBJU2RHcmlkTWF0ZXJpYWxDb25maWd1cmF0aW9uLFxyXG4gICAgcHJpdmF0ZSBncmlkQ29uZmlndXJhdGlvblNlcnZpY2U6IFNkR3JpZENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBleHBvcnRTZXJ2aWNlOiBTZEV4cG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmeVNlcnZpY2U6IFNkTm90aWZ5U2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogU2RUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb2x1bW5WYWx1ZXNQaXBlOiBTZENvbHVtblZhbHVlc1BpcGUsXHJcbiAgICBwcml2YXRlIGVkaXRvckhhbmRsZXJDb2x1bW5QaXBlOiBTZEVkaXRvckhhbmRsZXJDb2x1bW5QaXBlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuI2luaXRDZWxsRGVmKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuI3JlbG9hZC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcclxuICAgICAgc3RhcnRXaXRoKHRoaXMuI3JlbG9hZC52YWx1ZSksXHJcbiAgICAgIGZpbHRlcihkYXRhID0+IHtcclxuICAgICAgICBpZiAodGhpcy4jbG9hZENvbXBsZXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmRpc2FibGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0YS5zb3VyY2UgPT09ICdGSUxURVInO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0YS5zb3VyY2UgPT09ICdJTklUSUFMSVpFJztcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcChhc3luYyBkYXRhID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJJbmZvID0gdGhpcy4jZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jbG9hZChmaWx0ZXJJbmZvLCAhdGhpcy4jbG9hZENvbXBsZXRlZCB8fCBkYXRhLmZvcmNlKTtcclxuICAgICAgICB0aGlzLiNsb2FkQ29tcGxldGVkID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUodGhpcy4jcmVuZGVyKSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuc2RDZWxsRGVmcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKHRoaXMuI2luaXRDZWxsRGVmKSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuc2RGb290ZXJEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUodGhpcy4jaW5pdEZvb3RlckRlZikpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnNkRmlsdGVyRGVmcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKHRoaXMuI2luaXRGaWx0ZXJEZWYpKTtcclxuXHJcbiAgICAvLyB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuI29wdGlvbkNoYW5nZXMucGlwZShcclxuICAgIC8vICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAvLyAgIHN0YXJ0V2l0aCh7fSksXHJcbiAgICAvLyAgIG1hcCh0aGlzLiNnZXRGaWx0ZXIpLFxyXG4gICAgLy8gICBzd2l0Y2hNYXAoZmlsdGVySW5mbyA9PiB0aGlzLiNsb2FkKGZpbHRlckluZm8sIHRydWUpKVxyXG4gICAgLy8gKS5zdWJzY3JpYmUodGhpcy4jcmVuZGVyKSk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgI2luaXRDZWxsRGVmID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jZWxsRGVmID0ge307XHJcbiAgICBmb3IgKGNvbnN0IGNlbGxEZWYgb2YgdGhpcy5zZENlbGxEZWZzKSB7XHJcbiAgICAgIGlmIChjZWxsRGVmLnNkTWF0ZXJpYWxDZWxsRGVmKSB7XHJcbiAgICAgICAgdGhpcy5jZWxsRGVmW2NlbGxEZWYuc2RNYXRlcmlhbENlbGxEZWZdID0gY2VsbERlZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgI2luaXRGaWx0ZXJEZWYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZpbHRlckRlZnMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgZmlsdGVyRGVmIG9mIHRoaXMuc2RGaWx0ZXJEZWZzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyRGVmcy5wdXNoKGZpbHRlckRlZik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjaW5pdEZvb3RlckRlZiA9ICgpID0+IHtcclxuICAgIHRoaXMuZm9vdGVyRGVmID0ge307XHJcbiAgICB0aGlzLmhhc0Zvb3RlciA9IGZhbHNlO1xyXG4gICAgZm9yIChjb25zdCBmb290ZXJEZWYgb2YgdGhpcy5zZEZvb3RlckRlZnMpIHtcclxuICAgICAgaWYgKGZvb3RlckRlZi5zZE1hdGVyaWFsRm9vdGVyRGVmKSB7XHJcbiAgICAgICAgdGhpcy5oYXNGb290ZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9vdGVyRGVmW2Zvb3RlckRlZi5zZE1hdGVyaWFsRm9vdGVyRGVmXSA9IGZvb3RlckRlZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgI2ZpbHRlckV4cG9ydEluZm8gPSAocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0ID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJhd0NvbHVtbkZpbHRlcjogKHRoaXMuZ3JpZE9wdGlvbj8uZmlsdGVyPy5pbmxpbmVDb2x1bW4gPyB0aGlzLmNvbHVtbkZpbHRlciA6IHRoaXMuZ3JpZEZpbHRlcj8uY29sdW1uRmlsdGVyKSB8fCB7fSxcclxuICAgICAgcmF3RXh0ZXJuYWxGaWx0ZXI6IHRoaXMuZ3JpZEZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXIgfHwge30sXHJcbiAgICAgIHJhd0ZpbHRlckRlZjogdGhpcy5ncmlkRmlsdGVyPy5maWx0ZXJEZWYgfHwge30sXHJcbiAgICAgIG9yZGVyQnk6IHRoaXMuI3NvcnQ/LmFjdGl2ZSB8fCAnJyxcclxuICAgICAgb3JkZXJEaXJlY3Rpb246IHRoaXMuI3NvcnQ/LmRpcmVjdGlvbiB8fCAnJyxcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgcGFnZVNpemUsXHJcbiAgICAgIGlzRXhwb3J0ZWQ6IHRydWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAjaW5pdENvbmZpZ3VyYXRpb24gPSAob3B0aW9uOiBTZEdyaWRNYXRlcmlhbE9wdGlvbikgPT4ge1xyXG4gICAgb3B0aW9uLnBhZ2luYXRlID0ge1xyXG4gICAgICBoaWRkZW46IG9wdGlvbj8ucGFnaW5hdGU/LmhpZGRlbixcclxuICAgICAgcGFnZVNpemU6IG9wdGlvbj8ucGFnaW5hdGU/LnBhZ2VTaXplID8/IHRoaXMuY29uZmlndXJhdGlvbj8ucGFnaW5hdGU/LnBhZ2VTaXplID8/IERFRkFVTFRfR1JJRF9NQVRFUklBTF9DT05GSUcucGFnaW5hdGU/LnBhZ2VTaXplLFxyXG4gICAgICBwYWdlczogb3B0aW9uPy5wYWdpbmF0ZT8ucGFnZXMgPz8gdGhpcy5jb25maWd1cmF0aW9uPy5wYWdpbmF0ZT8ucGFnZXMgPz8gREVGQVVMVF9HUklEX01BVEVSSUFMX0NPTkZJRy5wYWdpbmF0ZT8ucGFnZXMsXHJcbiAgICAgIHNob3dGaXJzdExhc3RCdXR0b25zOiBvcHRpb24/LnBhZ2luYXRlPy5zaG93Rmlyc3RMYXN0QnV0dG9ucyA/PyBmYWxzZVxyXG4gICAgfTtcclxuICAgIHJldHVybiBvcHRpb247XHJcbiAgfVxyXG5cclxuICAjZmlsdGVyTG9jYWwgPSAobG9jYWxJdGVtczogYW55W10sIGZpbHRlckluZm86IFNkR3JpZE1hdGVyaWFsRmlsdGVyUmVxdWVzdCkgPT4ge1xyXG4gICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBjb25zdCB7IHJhd0NvbHVtbkZpbHRlciwgb3JkZXJCeSwgb3JkZXJEaXJlY3Rpb24sIHBhZ2VTaXplLCBwYWdlTnVtYmVyIH0gPSBmaWx0ZXJJbmZvO1xyXG4gICAgY29uc3QgaXRlbXMgPSBsb2NhbEl0ZW1zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xyXG4gICAgICAgIGNvbnN0IHsgZmllbGQsIHR5cGUgfSA9IGNvbHVtbjtcclxuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZTogc3RyaW5nID0gKHJhd0NvbHVtbkZpbHRlcltmaWVsZF0gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWU6IHN0cmluZyA9IChpdGVtW2ZpZWxkXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgIGlmICghY29sdW1uVmFsdWUgJiYgdHlwZSAhPT0gJ2RhdGV0aW1lJyAmJiB0eXBlICE9PSAnZGF0ZScgJiYgdHlwZSAhPT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uVmFsdWUuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW5WYWx1ZSAhPT0gZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZlZhbHVlID0gK2ZpbHRlclZhbHVlLnJlcGxhY2UoJz49JywgJycpLnJlcGxhY2UoJzw9JywgJycpLnJlcGxhY2UoJz4nLCAnJykucmVwbGFjZSgnPCcsICcnKTtcclxuICAgICAgICAgICAgY29uc3QgY1ZhbHVlID0gK2NvbHVtblZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoZlZhbHVlIHx8IGZWYWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGlmICghY1ZhbHVlICYmIGNWYWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPj0nKSA+IC0xICYmIGNWYWx1ZSA8IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPD0nKSA+IC0xICYmIGNWYWx1ZSA+IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPCcpID4gLTEgJiYgY1ZhbHVlID49IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyVmFsdWUuaW5kZXhPZignPicpID4gLTEgJiYgY1ZhbHVlIDw9IGZWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlICE9PSBmVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2wnKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZSA9PT0gJzEnICYmIGNvbHVtblZhbHVlICE9PSAnMScgJiYgY29sdW1uVmFsdWUgIT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJWYWx1ZSA9PT0gJzAnICYmIGNvbHVtblZhbHVlICE9PSAnMCcgJiYgY29sdW1uVmFsdWUgIT09ICdmYWxzZScpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RhdGV0aW1lJyB8fCB0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb20gPSByYXdDb2x1bW5GaWx0ZXJbZmllbGRdPy5mcm9tID8/IHJhd0NvbHVtbkZpbHRlcltmaWVsZF07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvID0gcmF3Q29sdW1uRmlsdGVyW2ZpZWxkXT8udG8gPz8gcmF3Q29sdW1uRmlsdGVyW2ZpZWxkXTtcclxuICAgICAgICAgICAgY29uc3QgZnJvbURhdGUgPSBEYXRlLmJlZ2luKGZyb20pO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RhdGUgPSBEYXRlLmVuZCh0byk7XHJcbiAgICAgICAgICAgIGlmIChmcm9tRGF0ZSAmJiB0b0RhdGUpIHtcclxuICAgICAgICAgICAgICBpZiAoIWNvbHVtblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChuZXcgRGF0ZShjb2x1bW5WYWx1ZSkuZ2V0VGltZSgpIDwgZnJvbURhdGUuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKGNvbHVtblZhbHVlKS5nZXRUaW1lKCkgPj0gdG9EYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgLy8gU29ydFxyXG4gICAgaWYgKG9yZGVyQnkgJiYgb3JkZXJEaXJlY3Rpb24pIHtcclxuICAgICAgY29uc3QgY29sdW1uID0gY29sdW1ucy5maW5kKGUgPT4gZS5maWVsZCA9PT0gb3JkZXJCeSk7XHJcbiAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICBjb25zdCB7IHR5cGUsIGZpZWxkIH0gPSBjb2x1bW47XHJcbiAgICAgICAgaXRlbXMuc29ydCgoY3VycmVudCwgbmV4dCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoY3VycmVudFtmaWVsZF0gfHwgMCkgLSAobmV4dFtmaWVsZF0gfHwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdkYXRldGltZScgfHwgdHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGQxID0gbmV3IERhdGUoY3VycmVudFtmaWVsZF0gfHwgJycpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgY29uc3QgZDIgPSBuZXcgRGF0ZShjdXJyZW50W2ZpZWxkXSB8fCAnJykuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZDEgLSBkMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHMxID0gKGN1cnJlbnRbZmllbGRdIHx8ICcnKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgY29uc3QgczIgPSAobmV4dFtmaWVsZF0gfHwgJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBpZiAoczEgPiBzMikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzMSA8IHMyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChvcmRlckRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XHJcbiAgICAgICAgICBpdGVtcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtczogaXRlbXMuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBpbmRleCA+PSBwYWdlTnVtYmVyICogcGFnZVNpemVcclxuICAgICAgICAgICYmIGluZGV4IDwgKHBhZ2VOdW1iZXIgKyAxKSAqIHBhZ2VTaXplO1xyXG4gICAgICB9KSxcclxuICAgICAgdG90YWw6IGl0ZW1zLmxlbmd0aFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gICNnZXRGaWx0ZXIgPSAoKTogU2RHcmlkTWF0ZXJpYWxGaWx0ZXJSZXF1ZXN0ID0+ICh7XHJcbiAgICByYXdDb2x1bW5GaWx0ZXI6ICh0aGlzLmdyaWRPcHRpb24/LmZpbHRlcj8uaW5saW5lQ29sdW1uID8gdGhpcy5jb2x1bW5GaWx0ZXIgOiB0aGlzLmdyaWRGaWx0ZXI/LmNvbHVtbkZpbHRlcikgfHwge30sXHJcbiAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5ncmlkRmlsdGVyPy5leHRlcm5hbEZpbHRlciB8fCB7fSxcclxuICAgIHJhd0ZpbHRlckRlZjogdGhpcy5ncmlkRmlsdGVyPy5maWx0ZXJEZWYgfHwge30sXHJcbiAgICBvcmRlckJ5OiB0aGlzLiNzb3J0Py5hY3RpdmUgfHwgJycsXHJcbiAgICBvcmRlckRpcmVjdGlvbjogdGhpcy4jc29ydD8uZGlyZWN0aW9uIHx8ICcnLFxyXG4gICAgcGFnZU51bWJlcjogdGhpcy4jcGFnaW5hdG9yPy5wYWdlSW5kZXggfHwgMCxcclxuICAgIHBhZ2VTaXplOiB0aGlzLiNwYWdpbmF0b3I/LnBhZ2VTaXplIHx8IHRoaXMuZ3JpZE9wdGlvbj8ucGFnaW5hdGU/LnBhZ2VTaXplIHx8IDUwXHJcbiAgfSlcclxuXHJcbiAgI2xvYWQgPSBhc3luYyAoZmlsdGVyUmVxOiBTZEdyaWRNYXRlcmlhbEZpbHRlclJlcXVlc3QsIGZvcmNlOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnc2VydmVyJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmdyaWRPcHRpb24uaXRlbXMoZmlsdGVyUmVxKTtcclxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3VsdDtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaXRlbXM6IGRhdGEuaXRlbXMgfHwgW10sXHJcbiAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCB8fCAwXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZm9yY2UpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmdyaWRPcHRpb24uaXRlbXMoKTtcclxuICAgICAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zID0gYXdhaXQgcmVzdWx0cztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuI2xvY2FsSXRlbXMgPSByZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy4jZmlsdGVyTG9jYWwodGhpcy4jbG9jYWxJdGVtcywgZmlsdGVyUmVxKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjcmVuZGVyID0gYXN5bmMgKGFyZ3M6IHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0pID0+IHtcclxuICAgIHRoaXMuc2RTY3JvbGw/LnNjcm9sbFRvcCgpO1xyXG4gICAgdGhpcy5pdGVtcyA9IGFyZ3M/Lml0ZW1zIHx8IFtdO1xyXG4gICAgdGhpcy50b3RhbCA9IGFyZ3M/LnRvdGFsIHx8IDA7XHJcbiAgICAvLyB0aGlzLmlzSGlkZGVuUGFnaW5hdG9yID0gdGhpcy5maWx0ZXJJbmZvLnBhZ2VOdW1iZXIgPT09IDAgJiYgdGhpcy50b3RhbCA8PSB0aGlzLmZpbHRlckluZm8ucGFnZVNpemU7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW06IFNkSXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLm9yaWdpbkl0ZW0gPSB7IC4uLml0ZW0gfTtcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5ncmlkT3B0aW9uPy5yZWxvYWQ/Lm9uUmVsb2FkPy4odGhpcy5pdGVtcyk7XHJcbiAgICB0aGlzLmlzU2VsZWN0QWxsID0gdGhpcy5pdGVtcy5ldmVyeShlID0+IGUuaXNTZWxlY3RlZCk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICByZWxvYWQgPSBhc3luYyAoZm9yY2U6IGJvb2xlYW4gPSB0cnVlKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jbG9hZCh0aGlzLiNnZXRGaWx0ZXIoKSwgZm9yY2UpO1xyXG4gICAgdGhpcy4jcmVuZGVyKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgI2V4cG9ydGVkSXRlbXMgPSBhc3luYyAocGFnZU51bWJlcjogbnVtYmVyID0gMCwgcGFnZVNpemU6IG51bWJlciA9IDEwMDAwKSA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXMpIHtcclxuICAgICAgLy8gY29uc3QgZXhwb3J0ZWRJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQ/Lml0ZW1zKHRoaXMuI2ZpbHRlckV4cG9ydEluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpKTtcclxuICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQ/Lml0ZW1zKHRoaXMuI2ZpbHRlckV4cG9ydEluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpKTtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzT2JzZXJ2YWJsZTxhbnlbXT4ocmVzdWx0KSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlPHsgaXRlbXM6IGFueVtdLCB0b3RhbDogbnVtYmVyIH0+KHJlc3VsdCkpIHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHQudG9Qcm9taXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlckluZm8gPSB0aGlzLiNmaWx0ZXJFeHBvcnRJbmZvKHBhZ2VOdW1iZXIsIHBhZ2VTaXplKTtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnc2VydmVyJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmdyaWRPcHRpb24uaXRlbXMoZmlsdGVySW5mbyk7XHJcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGV4cG9ydGVkSXRlbXM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5ncmlkT3B0aW9uLml0ZW1zKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIGV4cG9ydGVkSXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0ZWRJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGV4cG9ydGVkSXRlbXMgPSB0aGlzLmdyaWRPcHRpb24uaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJMb2NhbChleHBvcnRlZEl0ZW1zLCBmaWx0ZXJJbmZvKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+LCBjb2x1bW5zOiBzdHJpbmdbXSkge1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KGNvbHVtbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XHJcbiAgfVxyXG5cclxuICAjYWxsQ29sdW1ucyA9ICgpOiBTZEdyaWRNYXRlcmlhbENvbHVtbltdID0+IHtcclxuICAgIGNvbnN0IGNvbHVtbnM6IFNkR3JpZE1hdGVyaWFsQ29sdW1uW10gPSBbXTtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZpbHRlcihlID0+ICFlLmV4cG9ydD8uZGlzYWJsZWQpLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuJykge1xyXG4gICAgICAgIGNvbHVtbi5jaGlsZHJlbj8uZmlsdGVyKGUgPT4gIWUuZXhwb3J0Py5kaXNhYmxlZCkuZm9yRWFjaChjaGlsZENvbHVtbiA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRDb2x1bW4udHlwZSA9PT0gJ2ltYWdlJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY2hpbGRDb2x1bW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbi1jb2wnKSB7XHJcbiAgICAgICAgY29sdW1uLmNoaWxkcmVuPy5maWx0ZXIoZSA9PiAhZS5leHBvcnQ/LmRpc2FibGVkKS5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbHVtbnMucHVzaChjaGlsZENvbHVtbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY29sdW1ucztcclxuICB9XHJcblxyXG4gICNhbGxFeHBvcnRlZENvbHVtbnMgPSAoKTogU2RHcmlkTWF0ZXJpYWxFeHBvcnRDb2x1bW5bXSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uY29sdW1ucz8uZmlsdGVyKGUgPT4gIWUuZXhwb3J0Py5kaXNhYmxlZCkgfHwgW107XHJcbiAgfVxyXG5cclxuICAjb25FeHBvcnQgPSBhc3luYyAoYXJnczogeyBmaWxlOiBTZEV4cG9ydEZpbGUsIGNvbHVtbnM6IFNkRXhwb3J0Q29sdW1uW10sIGlzQ1NWOiBib29sZWFuLCBpc1JhdzogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGZpbGUsIGlzQ1NWLCBpc1JhdyB9ID0gYXJncztcclxuICAgICAgbGV0IHsgY29sdW1ucyB9ID0gYXJncztcclxuICAgICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8ubWF4SXRlbXNQZXJSZXF1ZXN0IHx8IDEwMDA7XHJcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LmJhdGNoIHx8IDE7XHJcbiAgICAgIGxldCB0b3RhbCA9IHRoaXMudG90YWw7XHJcbiAgICAgIGxldCBwYWdlTnVtYmVyID0gMDtcclxuICAgICAgbGV0IGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICAgIHRoaXMuaXNFeHBvcnRpbmcgPSB0cnVlO1xyXG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPGFueVtdIHwge1xyXG4gICAgICAgIGl0ZW1zOiBhbnlbXTtcclxuICAgICAgICB0b3RhbDogbnVtYmVyO1xyXG4gICAgICB9PltdID0gW107XHJcbiAgICAgIGNvbnN0IGhhbmRsZURhdGEgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICAgICAgICBwcm9taXNlcyA9IFtdO1xyXG4gICAgICAgIGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xyXG4gICAgICAgICAgaWYgKCdpdGVtcycgaW4gcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGV4cG9ydEl0ZW1zID0gWy4uLmV4cG9ydEl0ZW1zLCAuLi5yZXN1bHQuaXRlbXNdO1xyXG4gICAgICAgICAgICB0b3RhbCA9IHJlc3VsdC50b3RhbDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4cG9ydEl0ZW1zID0gWy4uLmV4cG9ydEl0ZW1zLCAuLi5yZXN1bHRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWFwcGluZyhleHBvcnRJdGVtcyk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSByZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0b3RhbFBhZ2UgPSB0b3RhbCAvIHBhZ2VTaXplO1xyXG4gICAgICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLnJvdW5kKChwYWdlTnVtYmVyIC0gMSkgKiAxMDAuMCAvIHRvdGFsUGFnZSk7XHJcbiAgICAgICAgdGhpcy5leHBvcnRUaXRsZSA9IGBFeHBvcnRpbmcuLi4ke3BlcmNlbnR9JWA7XHJcbiAgICAgICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuI2FsbENvbHVtbnMoKTtcclxuICAgICAgICBjb25zdCBhbGxFeHBvcnRlZENvbHVtbnMgPSB0aGlzLiNhbGxFeHBvcnRlZENvbHVtbnMoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXhwb3J0SXRlbXMpIHtcclxuICAgICAgICAgIGNvbnN0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBhc3luYyAoZXhwb3J0Q29sdW1uOiBTZEV4cG9ydENvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBvYmpbZXhwb3J0Q29sdW1uLmZpZWxkXSA9IGl0ZW1bZXhwb3J0Q29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGUgPT4gZS5maWVsZCA9PT0gZXhwb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRDb2x1bW4gPSBhbGxFeHBvcnRlZENvbHVtbnMuZmluZChlID0+IGUuZmllbGQgPT09IGV4cG9ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgIGlmIChleHBvcnRlZENvbHVtbj8udHJhbnNmb3JtKSB7XHJcbiAgICAgICAgICAgICAgb2JqW2V4cG9ydGVkQ29sdW1uLmZpZWxkXSA9IGV4cG9ydGVkQ29sdW1uLnRyYW5zZm9ybShpdGVtW2V4cG9ydGVkQ29sdW1uLmZpZWxkXSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuJyB8fCBjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuLWNvbCcpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4/LmNoaWxkcmVuLmZvckVhY2goY2hpbGRDb2x1bW4gPT4gaGFuZGxlKGNoaWxkQ29sdW1uKSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghY29sdW1ucy5zb21lKGUgPT4gZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNvbHVtbi50cmFuc2Zvcm0oaXRlbVtjb2x1bW4uZmllbGRdLCBpdGVtKTtcclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBhd2FpdCB0cmFuc2Zvcm07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdHJhbnNmb3JtO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbi50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYm9vbCcpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW1bY29sdW1uLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4ub3B0aW9uPy5kaXNwbGF5T25UcnVlIHx8ICdUcnVlJztcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9ialtjb2x1bW4uZmllbGRdICE9PSB1bmRlZmluZWQgJiYgb2JqW2NvbHVtbi5maWVsZF0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gY29sdW1uLm9wdGlvbj8uZGlzcGxheU9uRmFsc2UgfHwgJ0ZhbHNlJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIGxldCBkYXRlID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtRGF0ZSB9ID0gY29sdW1uO1xyXG4gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlID0gdHJhbnNmb3JtRGF0ZShkYXRlLCBpdGVtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnZGQvTU0veXl5eScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRhdGUgPSBpdGVtW2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm1EYXRlIH0gPSBjb2x1bW47XHJcbiAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybURhdGUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGUgPSB0cmFuc2Zvcm1EYXRlKGRhdGUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZXRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gRGF0ZS50b0Zvcm1hdChkYXRlLCAnZGQvTU0veXl5eSBISDptbScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAndGltZScpIHtcclxuICAgICAgICAgICAgICBsZXQgZGF0ZSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybURhdGUgfSA9IGNvbHVtbjtcclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZSA9IHRyYW5zZm9ybURhdGUoZGF0ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIE7hur91IGzDoCB0aW1lIHRow6wgY29udmVydCB0aGVvIMSRw7puZyBmb3JtYXRcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IERhdGUudG9Gb3JtYXQoZGF0ZSwgJ0hIOm1tJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIHZhbHVlcyB0aMOsIGzhuqV5IGdpw6EgdHLhu4sgY+G7p2EgdmFsdWUgxJHGsOG7o2MgY2jhu41uXHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBhd2FpdCB0aGlzLmNvbHVtblZhbHVlc1BpcGUudHJhbnNmb3JtKGl0ZW1bY29sdW1uLmZpZWxkXSwgY29sdW1uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIC8vIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZvckVhY2goaGFuZGxlKTtcclxuICAgICAgICAgIGZvciAoY29uc3QgZXhwb3J0Q29sdW1uIG9mIGNvbHVtbnMpIHtcclxuICAgICAgICAgICAgYXdhaXQgaGFuZGxlKGV4cG9ydENvbHVtbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChwYWdlTnVtYmVyICogcGFnZVNpemUgPCB0b3RhbCkge1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy4jZXhwb3J0ZWRJdGVtcyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkpO1xyXG4gICAgICAgIHBhZ2VOdW1iZXIrKztcclxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoIDwgYmF0Y2gpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBoYW5kbGVEYXRhKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBhd2FpdCBoYW5kbGVEYXRhKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFmaWxlPy5maWxlUGF0aCkge1xyXG4gICAgICAgIGlmIChpc0NTVikge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydENTVih7XHJcbiAgICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5ncmlkT3B0aW9uPy5leHBvcnQ/LmZpbGVOYW1lXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzUmF3KSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0RXhjZWxSYXcoe1xyXG4gICAgICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgICAgICBpdGVtcyxcclxuICAgICAgICAgICAgZmlsZU5hbWU6IHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5maWxlTmFtZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNoZWV0czoge1xyXG4gICAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgaXRlbXM6IGFueVtdLFxyXG4gICAgICAgICAgZmllbGRzOiBzdHJpbmdbXVxyXG4gICAgICAgIH1bXSA9IFtdO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZ3JpZE9wdGlvbj8uZXhwb3J0Py5zaGVldHMpKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHNoZWV0IG9mIHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQuc2hlZXRzKSB7XHJcbiAgICAgICAgICAgIGlmIChzaGVldC5uYW1lICYmIHNoZWV0Lml0ZW1zICYmIHNoZWV0LmZpZWxkcykge1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWV0Lml0ZW1zKSkge1xyXG4gICAgICAgICAgICAgICAgc2hlZXRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzaGVldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogc2hlZXQuaXRlbXMsXHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkczogc2hlZXQuZmllbGRzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2hlZXRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzaGVldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogYXdhaXQgc2hlZXQuaXRlbXMoKSxcclxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBzaGVldC5maWVsZHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0KHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICBpdGVtcyxcclxuICAgICAgICAgIGZpbGVOYW1lOiB0aGlzLmdyaWRPcHRpb24/LmV4cG9ydD8uZmlsZU5hbWUsXHJcbiAgICAgICAgICBzaGVldHNcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydEJ5VGVtcGxhdGUoe1xyXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLmZpbGVQYXRoLFxyXG4gICAgICAgIGZpbGVOYW1lOiBmaWxlLmZpbGVOYW1lLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgaXRlbXNcclxuICAgICAgfSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzRXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZXhwb3J0VGl0bGUgPSBgRXhwb3J0YDtcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25FeHBvcnQgPSBhc3luYyAoYXJnczogeyBmaWxlOiBTZEV4cG9ydEZpbGUsIGNvbHVtbnM6IFNkRXhwb3J0Q29sdW1uW10sIGlzQ1NWOiBib29sZWFuLCBpc1JhdzogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICBjb25zdCB7IHRyYW5zbGF0ZSB9ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlO1xyXG4gICAgaWYgKCFhcmdzLmlzQ1NWICYmIHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWF4ICYmIHRoaXMudG90YWwgPiB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Lm1heCkge1xyXG4gICAgICBhcmdzLmlzUmF3ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4jb25FeHBvcnQoYXJncyk7XHJcbiAgICAgIC8vIHRoaXMubm90aWZ5U2VydmljZS5jb25maXJtKHRyYW5zbGF0ZShgVG90YWwgcm93cyByZWFjaCBsaW1pdCwgZG8geW91IHdhbnQgdG8gZXhwb3J0IENTVmApKS50aGVuKCgpID0+IHtcclxuICAgICAgLy8gICBhcmdzLmlzQ1NWID0gdHJ1ZTtcclxuICAgICAgLy8gICB0aGlzLiNvbkV4cG9ydChhcmdzKTtcclxuICAgICAgLy8gfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuI29uRXhwb3J0KGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJDaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICB0aGlzLiNwYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucmVsb2FkKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIG9uRXhwYW5kID0gYXN5bmMgKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsSXRlbTxUPikgPT4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5zdWJJbmZvcm1hdGlvbj8uYWx3YXlzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChyb3dEYXRhLmlzRXhwYW5kaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChyb3dEYXRhLmlzRXhwYW5kZWQpIHtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRPcHRpb24/LnN1YkluZm9ybWF0aW9uPy5vbkV4cGFuZD8uKHJvd0RhdGEpO1xyXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24/Lm11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNFeHBhbmRpbmcgPSBpdGVtLmlzRXhwYW5kZWQgPSBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGluZyA9IHRydWU7XHJcbiAgICAgIGRhdGEudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gcmVzO1xyXG4gICAgICAgIHJvd0RhdGEuaXNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gcm93RGF0YS5pc0V4cGFuZGluZyA9IGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJvd0RhdGEuZXhwYW5kRGV0YWlsID0gZGF0YTtcclxuICAgICAgcm93RGF0YS5pc0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ID0gKHJvd0RhdGE6IFNkR3JpZE1hdGVyaWFsSXRlbTxUPikgPT4ge1xyXG4gICAgaWYgKHJvd0RhdGE/LnNkR3JvdXA/Lml0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgcm93RGF0YT8uc2RHcm91cD8uaXRlbXMuZm9yRWFjaChlID0+IGUuaXNTZWxlY3RlZCA9IHJvd0RhdGEuaXNTZWxlY3RlZCk7XHJcbiAgICAgIHRoaXMuZ3JpZE9wdGlvbi5zZWxlY3Rpb24/Lm9uU2VsZWN0Py4ocm93RGF0YSwgdGhpcy5pdGVtcy5maWx0ZXIoZSA9PiBlLmlzU2VsZWN0ZWQpKTtcclxuICAgICAgdGhpcy5pc1NlbGVjdEFsbCA9IHRoaXMuaXRlbXMuZXZlcnkoZSA9PiBlLmlzU2VsZWN0ZWQpO1xyXG4gICAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnNlbGVjdGlvbj8uc2luZ2xlKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5maWx0ZXIoZSA9PiBlICE9PSByb3dEYXRhKS5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncmlkT3B0aW9uLnNlbGVjdGlvbj8ub25TZWxlY3Q/Lihyb3dEYXRhLCB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNTZWxlY3RlZCkpO1xyXG4gICAgICB0aGlzLmlzU2VsZWN0QWxsID0gdGhpcy5pdGVtcy5ldmVyeShlID0+IGUuaXNTZWxlY3RlZCk7XHJcbiAgICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkSXRlbXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsID0gKCkgPT4ge1xyXG4gICAgdGhpcy5pdGVtcz8uZm9yRWFjaChlID0+IHtcclxuICAgICAgaWYgKGUuc2VsZWN0YWJsZSAmJiAoIXRoaXMuZ3JpZE9wdGlvbj8uc2VsZWN0aW9uPy5hY3Rpb25zPy5sZW5ndGggfHwgZS5hY3Rpb25zPy5sZW5ndGgpKSB7XHJcbiAgICAgICAgZS5pc1NlbGVjdGVkID0gdGhpcy5pc1NlbGVjdEFsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uc2VsZWN0aW9uPy5vblNlbGVjdEFsbD8uKHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5pc1NlbGVjdGVkKSk7XHJcbiAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyU2VsZWN0aW9uID0gKGl0ZW1zPzogU2RHcmlkTWF0ZXJpYWxJdGVtPFQ+W10pID0+IHtcclxuICAgIGl0ZW1zID0gaXRlbXMgfHwgdGhpcy5pdGVtcztcclxuICAgIHRoaXMuaXNTZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIGl0ZW1zPy5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy4jdXBkYXRlU2VsZWN0ZWRJdGVtcygpO1xyXG4gIH1cclxuXHJcbiAgI3VwZGF0ZVNlbGVjdGVkSXRlbXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNTZWxlY3RlZClcclxuICAgICAgLm1hcChpdGVtID0+IHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICBpc1NlbGVjdGVkLFxyXG4gICAgICAgICAgaXNFeHBhbmRlZCxcclxuICAgICAgICAgIGlzRXhwYW5kaW5nLFxyXG4gICAgICAgICAgZXhwYW5kRGV0YWlsLFxyXG4gICAgICAgICAgZWRpdG9yRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgZWRpdG9ySGFuZGxlckNvbHVtbixcclxuICAgICAgICAgIGVkaXRvckhhbmRsZXJSb3csXHJcbiAgICAgICAgICBlZGl0b3JTdGF0dXMsXHJcbiAgICAgICAgICBvcmlnaW5JdGVtLFxyXG4gICAgICAgICAgc2RJZCxcclxuICAgICAgICAgIHNkVmVyc2lvbixcclxuICAgICAgICAgIC8vIEdp4buvIGzhuqFpIGPDoWMgdHLGsOG7nW5nIHRow7RuZyB0aW4gY2hvIHNlbGVjdGFibGUgKGFjdGlvbiwgZ3JvdXBlZEFjdGlvbiwgc2RHcm91cCwgc2VsZWN0YWJsZSlcclxuICAgICAgICAgIC4uLnJlc3VsdFxyXG4gICAgICAgIH0gPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pIGFzIFRbXTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyRmlsdGVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyPy5vbkNsZWFyRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBzZXRGaWx0ZXIgPSAoYXJnczoge1xyXG4gICAgY29sdW1uRmlsdGVyOiBhbnksXHJcbiAgICBleHRlcm5hbEZpbHRlcjogYW55LFxyXG4gICAgZmlsdGVyRGVmOiBhbnlcclxuICB9KSA9PiB7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXI/LnNldEZpbHRlcihhcmdzKTtcclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgeyB0eXBlLCBlZGl0b3IsIGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGlmICghZWRpdG9yPy5hZGRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW06IFNkR3JpZE1hdGVyaWFsSXRlbSA9IHt9O1xyXG4gICAgLy8gR8OhbiBnacOhIHRy4buLIG3hurdjIMSR4buLbmhcclxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmZpZWxkXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICBlZGl0b3Iub25BZGQ/LihpdGVtLCB0aGlzLiNsb2NhbEl0ZW1zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVkaXRvci5vbkFkZD8uKGl0ZW0sIHRoaXMuaXRlbXMpO1xyXG4gICAgfVxyXG4gICAgLy8gxJDGsGEgaXRlbSBsw6puIGTDsm5nIMSR4bqndSB0acOqbiBu4bq/dSB0eXBlIGtow6FjIHBvcHVwXHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgIT09ICdwb3B1cCcpIHtcclxuICAgICAgaWYgKGVkaXRvci5hZGRUb0xhc3QpIHtcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgdGhpcy4jbG9jYWxJdGVtcyA9IFsuLi50aGlzLiNsb2NhbEl0ZW1zLCBpdGVtXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zLCBpdGVtXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgdGhpcy4jbG9jYWxJdGVtcyA9IFtpdGVtLCAuLi50aGlzLiNsb2NhbEl0ZW1zXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtpdGVtLCAuLi50aGlzLml0ZW1zXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaXRlbS5lZGl0b3JTdGF0dXMgPSAnY3JlYXRlJztcclxuICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdyA9IHtcclxuICAgICAgdGVtcG9yYXJ5OiB7IC4uLml0ZW0gfVxyXG4gICAgfTtcclxuICB9XHJcbiAgb25VcGRhdGUgPSAoaXRlbTogU2RJdGVtKSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaXRlbS5lZGl0b3JTdGF0dXMgPSAndXBkYXRlJztcclxuICAgIGl0ZW0uZWRpdG9ySGFuZGxlclJvdyA9IHtcclxuICAgICAgLi4uaXRlbS5lZGl0b3JIYW5kbGVyUm93LFxyXG4gICAgICB0ZW1wb3Jhcnk6IHsgLi4uaXRlbSB9XHJcbiAgICB9O1xyXG4gICAgLy8gdGhpcy5nZW5lcmF0ZUVkaXRvckhhbmxkZXIoaXRlbSk7XHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgPT09ICdwb3B1cCcpIHtcclxuICAgICAgLy8gWOG7rSBsw70gY2FzZSBwb3B1cFxyXG4gICAgICAvLyB0aGlzLnNkR3JpZFBvcHVwRWRpdG9yLm9wZW4oaXRlbSwgY29sdW1ucywgaXNNb2RpZmllZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIG9uU2F2ZSA9IGFzeW5jIChpdGVtOiBTZEdyaWRNYXRlcmlhbEl0ZW08VD4pID0+IHtcclxuICAgIGlmIChpdGVtLmVkaXRvckhhbmRsZXJSb3cuc2F2aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICB0cnkge1xyXG4gICAgICBpdGVtLmVkaXRvckhhbmRsZXJSb3cuc2F2aW5nID0gdHJ1ZTtcclxuICAgICAgaWYgKGVkaXRvci52YWxpZGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVkaXRvci52YWxpZGF0ZShpdGVtLCB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbWVzc2FnZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXN1bHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChlZGl0b3Iub25TYXZlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZWRpdG9yLm9uU2F2ZShpdGVtKTtcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGl0ZW0uZWRpdG9yU3RhdHVzID09PSAnY3JlYXRlJyAmJiBlZGl0b3IudHlwZSA9PT0gJ3BvcHVwJykge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMCwgMCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMudmlld0l0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXRlbS5lZGl0b3JTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIC8vIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMubm90aWZ5U2VydmljZS5ub3RpZnkud2FybmluZyhlcnIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaXRlbS5lZGl0b3JIYW5kbGVyUm93LnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uQ2FuY2VsID0gKGl0ZW06IFNkR3JpZE1hdGVyaWFsSXRlbTxUPikgPT4ge1xyXG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGlmIChlZGl0b3IudHlwZSA9PT0gJ2lubGluZScpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgY29uc3QgaWR4MiA9IHRoaXMuI2xvY2FsSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zLnNwbGljZShpZHgyLCAxKTtcclxuICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zID0gWy4uLnRoaXMuI2xvY2FsSXRlbXNdO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGlkeDEgPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGlkeDEsIDEpO1xyXG4gICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICBlZGl0b3I/Lm9uQ2FuY2VsPy4oaXRlbSwgdGhpcy4jbG9jYWxJdGVtcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWRpdG9yPy5vbkNhbmNlbD8uKGl0ZW0sIHRoaXMuaXRlbXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGVkaXRvci50eXBlID09PSAnZm9jdXMnKSB7XHJcbiAgICAgIGlmIChpdGVtLmVkaXRvclN0YXR1cyA9PT0gJ2NyZWF0ZScpIHtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICAgIGNvbnN0IGlkeDIgPSB0aGlzLiNsb2NhbEl0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICB0aGlzLiNsb2NhbEl0ZW1zLnNwbGljZShpZHgyLCAxKTtcclxuICAgICAgICAgIHRoaXMuI2xvY2FsSXRlbXMgPSBbLi4udGhpcy4jbG9jYWxJdGVtc107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkeDEgPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaWR4MSwgMSk7XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGl0ZW0uZWRpdG9ySGFuZGxlclJvdy50ZW1wb3JhcnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpdGVtLmVkaXRvclN0YXR1cyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb25SZW1vdmUgPSBhc3luYyAoaXRlbTogU2RHcmlkTWF0ZXJpYWxJdGVtPFQ+KSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaWYgKGVkaXRvcj8uYmVmb3JlUmVtb3ZlKSB7XHJcbiAgICAgIGNvbnN0IGJlZm9yZVJlbW92ZSA9IGVkaXRvcj8uYmVmb3JlUmVtb3ZlKGl0ZW0pO1xyXG4gICAgICBpZiAoYmVmb3JlUmVtb3ZlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlZm9yZVJlbW92ZTtcclxuICAgICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIWJlZm9yZVJlbW92ZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGVkaXRvci50eXBlID09PSAnaW5saW5lJykge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICBjb25zdCBpZHgyID0gdGhpcy4jbG9jYWxJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuI2xvY2FsSXRlbXMuc3BsaWNlKGlkeDIsIDEpO1xyXG4gICAgICAgIHRoaXMuI2xvY2FsSXRlbXMgPSBbLi4udGhpcy4jbG9jYWxJdGVtc107XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWR4MSA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaWR4MSwgMSk7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtc107XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgIGVkaXRvcj8ub25SZW1vdmU/LihpdGVtLCB0aGlzLiNsb2NhbEl0ZW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlZGl0b3I/Lm9uUmVtb3ZlPy4oaXRlbSwgdGhpcy5pdGVtcyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGQgPSAoaWR4OiBudW1iZXIsIGl0ZW06IFQpID0+IHtcclxuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IGlkeCkge1xyXG4gICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDAsIGl0ZW0pO1xyXG4gICAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zLCBpdGVtXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZSA9IChpZHg6IG51bWJlciwgaXRlbTogVCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuaXRlbXNbaWR4XSkge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuaXRlbXNbaWR4XSwgaXRlbSk7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtc107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmUgPSAoaWR4OiBudW1iZXIpID0+IHtcclxuICAgIGlmICh0aGlzLml0ZW1zW2lkeF0pIHtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hJdGVtID0gKGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1tpZHhdO1xyXG4gICAgdGhpcy5lZGl0b3JIYW5kbGVyQ29sdW1uUGlwZS50cmFuc2Zvcm0oaXRlbS5zZFZlcnNpb24sIGl0ZW0sIHRoaXMuZ3JpZE9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXQgZWRpdGVkSXRlbXMoKTogKFQgJiB7IGVkaXRvckVycm9yTWVzc2FnZTogc3RyaW5nIH0pW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoIWl0ZW0ub3JpZ2luSXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChPYmplY3Qua2V5cyhpdGVtLm9yaWdpbkl0ZW0pLnNvbWUoa2V5ID0+IGl0ZW0ub3JpZ2luSXRlbVtrZXldICE9PSBpdGVtW2tleV0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSkubWFwKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgZWRpdG9yU3RhdHVzLFxyXG4gICAgICAgIGVkaXRvckhhbmRsZXJSb3csXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlckNvbHVtbixcclxuICAgICAgICBlZGl0b3JFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgZXhwYW5kRGV0YWlsLFxyXG4gICAgICAgIGlzRXhwYW5kZWQsXHJcbiAgICAgICAgaXNFeHBhbmRpbmcsXHJcbiAgICAgICAgaXNTZWxlY3RlZCxcclxuICAgICAgICBvcmlnaW5JdGVtLFxyXG4gICAgICAgIHNkSWQsXHJcbiAgICAgICAgc2RWZXJzaW9uLFxyXG4gICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgYWN0aW9ucyxcclxuICAgICAgICBncm91cGVkQWN0aW9ucyxcclxuICAgICAgICBzZEdyb3VwLFxyXG4gICAgICAgIHRlbXBvcmFyeSxcclxuICAgICAgICAuLi5yZXN1bHQgfSA9IGl0ZW07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgIGVkaXRvckVycm9yTWVzc2FnZVxyXG4gICAgICB9IGFzIGFueTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRJdGVtcygpOiBUW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgZWRpdG9yU3RhdHVzLFxyXG4gICAgICAgIGVkaXRvckhhbmRsZXJSb3csXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlckNvbHVtbixcclxuICAgICAgICBleHBhbmREZXRhaWwsXHJcbiAgICAgICAgaXNFeHBhbmRlZCxcclxuICAgICAgICBpc0V4cGFuZGluZyxcclxuICAgICAgICBpc1NlbGVjdGVkLFxyXG4gICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgc2RJZCxcclxuICAgICAgICBzZFZlcnNpb24sXHJcbiAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICBhY3Rpb25zLFxyXG4gICAgICAgIGdyb3VwZWRBY3Rpb25zLFxyXG4gICAgICAgIHNkR3JvdXAsXHJcbiAgICAgICAgdGVtcG9yYXJ5LFxyXG4gICAgICAgIC4uLnJlc3VsdCB9ID0gaXRlbTtcclxuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBUO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRldGVjdENoYW5nZXMgPSAoKSA9PiB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gIGdldCBpc0VkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zb21lKGUgPT4gZS5lZGl0b3JTdGF0dXMgIT09IHVuZGVmaW5lZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==