@worktile/theia 15.1.2 → 15.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ import { ScrollDirection } from '../../../constants/node-types';
22
22
  import { createTablePosition } from '../utils/create-table-position';
23
23
  import { isSelectedAllCell } from '../utils/cell-position';
24
24
  import { calculateRowControls } from '../utils/calculate-table';
25
+ import { isColorPanel } from '../../../utils/color-picker';
25
26
  import * as i0 from "@angular/core";
26
27
  import * as i1 from "../../../components";
27
28
  import * as i2 from "../table.store";
@@ -29,11 +30,12 @@ import * as i3 from "../table.service";
29
30
  import * as i4 from "../../../services/table-contextmenu.service";
30
31
  import * as i5 from "../table.pipe";
31
32
  import * as i6 from "../../../services/context.service";
32
- import * as i7 from "@angular/common";
33
- import * as i8 from "slate-angular";
34
- import * as i9 from "../../../components/column-resize/column-resize.directive";
35
- import * as i10 from "./insert-mark/insert-mark.component";
36
- import * as i11 from "../../../interfaces";
33
+ import * as i7 from "../../../services/color-select.service";
34
+ import * as i8 from "@angular/common";
35
+ import * as i9 from "slate-angular";
36
+ import * as i10 from "../../../components/column-resize/column-resize.directive";
37
+ import * as i11 from "./insert-mark/insert-mark.component";
38
+ import * as i12 from "../../../interfaces";
37
39
  export class TheTableComponent extends TheBaseElementComponent {
38
40
  get columns() {
39
41
  return this.element && this.element.columns;
@@ -72,7 +74,7 @@ export class TheTableComponent extends TheBaseElementComponent {
72
74
  }
73
75
  this.headerRow = this.getHeaderRow();
74
76
  }
75
- constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService, config) {
77
+ constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService, config, colorSelectService) {
76
78
  super(elementRef, cdr);
77
79
  this.eventDispatcher = eventDispatcher;
78
80
  this.resizeNotifier = resizeNotifier;
@@ -86,6 +88,7 @@ export class TheTableComponent extends TheBaseElementComponent {
86
88
  this.renderer = renderer;
87
89
  this.contextService = contextService;
88
90
  this.config = config;
91
+ this.colorSelectService = colorSelectService;
89
92
  this.headerRow = false;
90
93
  this.isSelectedAllCell = false;
91
94
  this.destroy$ = new Subject();
@@ -131,16 +134,20 @@ export class TheTableComponent extends TheBaseElementComponent {
131
134
  this.isSelectedAllCell = isSelectedAllCell(this.editor, this.tableStore.getSelectedCellPositions());
132
135
  });
133
136
  }
137
+ /**
138
+ * 打印模式下,按照原宽度比例基于当前表格宽度计算列宽
139
+ */
134
140
  calcPrintColumnsWidth() {
135
- // 打印模式下,按照原宽度比例基于当前表格宽度计算列宽
136
141
  const columns = this.element?.columns;
137
142
  if (this.config.mode === TheMode.print && columns) {
138
143
  const opts = new TableOptions();
139
144
  const tableWidth = columns.reduce((a, b) => a + b.width, 0);
140
- const cellsWidthRatio = columns.map(column => column.width / tableWidth);
141
- const currentTableWidth = this.getWrapperWidth();
145
+ const cellsWidthRatio = columns.map(column => Math.floor((column.width / tableWidth) * 100) / 100);
146
+ // 为什么是 634,按照 DPI 96 的 A4 纸的宽度是 794px, 但打印时会有左右 80px 的边距,所以这里取 794 - 80 * 2 = 634
147
+ const printWidth = 634;
142
148
  this.printColumns = cellsWidthRatio.map(item => {
143
- const width = item * currentTableWidth;
149
+ // 为什么减 1, 因为这个宽度是内容区域宽度,但 td 右侧还有一个边框,所以减去 1
150
+ const width = parseInt(`${item * printWidth}`) - 1;
144
151
  return { width: width < opts.minWidthPx ? opts.minWidthPx : width };
145
152
  });
146
153
  }
@@ -175,6 +182,7 @@ export class TheTableComponent extends TheBaseElementComponent {
175
182
  this.subscribeCellsChange();
176
183
  this.subscribeCellPositionChange();
177
184
  this.listenTableContextMenuEvent();
185
+ this.documentMousedown$ = this.colorSelectService.preventDefaultAndStopPropagation();
178
186
  this.listenOnSelectedCells();
179
187
  this.listenKeydownSelectEvents();
180
188
  this.listenTableWrapperScroll();
@@ -640,7 +648,10 @@ export class TheTableComponent extends TheBaseElementComponent {
640
648
  merge(fromEvent(document, 'mousedown').pipe(filter((e) => e.button !== 2)), fromEvent(document, 'keydown').pipe(filter((e) => {
641
649
  return !isVirtualKey(e) && !this.theTableContextMenuService.isOpened;
642
650
  })))
643
- .pipe(filter(() => {
651
+ .pipe(filter((event) => {
652
+ if (isColorPanel(event.target)) {
653
+ return false;
654
+ }
644
655
  const selectedCellPositions = this.tableStore.getSelectedCellPositions();
645
656
  return selectedCellPositions?.length > 0;
646
657
  }), takeUntil(this.destroy$))
@@ -655,7 +666,6 @@ export class TheTableComponent extends TheBaseElementComponent {
655
666
  if (!isCurrentTableElement) {
656
667
  this.tableStore.clearLastFocusPath();
657
668
  }
658
- this.tableService.closeToolbar();
659
669
  this.theTableContextMenuService.closeContextMenu();
660
670
  });
661
671
  }
@@ -748,9 +758,10 @@ export class TheTableComponent extends TheBaseElementComponent {
748
758
  super.ngOnDestroy();
749
759
  this.destroy$.next();
750
760
  this.destroy$.complete();
761
+ this.documentMousedown$.unsubscribe();
751
762
  }
752
763
  }
753
- TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }, { token: THE_MODE_TOKEN }], target: i0.ɵɵFactoryTarget.Component });
764
+ TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }, { token: THE_MODE_TOKEN }, { token: i7.TheColorSelectService }], target: i0.ɵɵFactoryTarget.Component });
754
765
  TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" }, properties: { "class.the-table-with-controls": "isInTable || tableStore.isRightClicking", "class.the-table-with-sticky-column": "freezeColumnPipe.transform(element, tablePluginOptions)", "class.the-numberd-table": "element?.options?.numberedColumn", "class.the-table-selection-hide": "tableStore.isCellSelecting || tableStore.isRightClicking" } }, providers: [
755
766
  TableStore,
756
767
  TableService,
@@ -763,7 +774,7 @@ TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
763
774
  provide: THE_TABLE_COMPONENT_TOKEN,
764
775
  useExisting: TheTableComponent
765
776
  }
766
- ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\" #tableRowControlsWrapper>\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of printColumns ?? columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n class=\"header-row-shadow header-row-left-shadow\"\n #headerRowLeftShadow\n contenteditable=\"false\"\n *ngIf=\"!element.options?.headerColumn\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] });
777
+ ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\" #tableRowControlsWrapper>\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of printColumns ?? columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n class=\"header-row-shadow header-row-left-shadow\"\n #headerRowLeftShadow\n contenteditable=\"false\"\n *ngIf=\"!element.options?.headerColumn\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i10.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i11.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] });
767
778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: TheTableComponent, decorators: [{
768
779
  type: Component,
769
780
  args: [{ selector: 'the-table, [theTable]', providers: [
@@ -784,10 +795,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
784
795
  '[class.the-numberd-table]': 'element?.options?.numberedColumn',
785
796
  '[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking'
786
797
  }, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\" #tableRowControlsWrapper>\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of printColumns ?? columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n class=\"header-row-shadow header-row-left-shadow\"\n #headerRowLeftShadow\n contenteditable=\"false\"\n *ngIf=\"!element.options?.headerColumn\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
787
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }, { type: i11.TheModeConfig, decorators: [{
798
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }, { type: i12.TheModeConfig, decorators: [{
788
799
  type: Inject,
789
800
  args: [THE_MODE_TOKEN]
790
- }] }]; }, propDecorators: { tableWrapper: [{
801
+ }] }, { type: i7.TheColorSelectService }]; }, propDecorators: { tableWrapper: [{
791
802
  type: ViewChild,
792
803
  args: ['tableWrapper', { read: ElementRef, static: true }]
793
804
  }], theTableElement: [{
@@ -824,4 +835,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
824
835
  type: HostListener,
825
836
  args: ['mousedown', ['$event']]
826
837
  }] } });
827
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVaLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFDSCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLFVBQVUsRUFHVixjQUFjLEVBQ2QsT0FBTyxFQUNWLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUdiLHlCQUF5QixFQUM1QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sS0FBSyxhQUFhLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUF5QmhFLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSx1QkFBNkM7SUErQmhGLElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztJQUM1QyxDQUFDO0lBbUNELGVBQWUsQ0FBQyxLQUFpQjtRQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLFlBQVksT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25GLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoQztRQUNELGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDOUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlO1FBQ1gsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUNJLFVBQW1DLEVBQzVCLGVBQXlDLEVBQ3pDLGNBQTBDLEVBQzFDLFVBQXNCLEVBQ3RCLEdBQXNCLEVBQ3RCLE1BQWMsRUFDZCxZQUEwQixFQUN6QiwwQkFBc0QsRUFDdEQsZ0JBQXVDLEVBQ3hDLGFBQWlDLEVBQ2hDLFFBQW1CLEVBQ25CLGNBQWlDLEVBRWpDLE1BQXFCO1FBRTdCLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFkaEIsb0JBQWUsR0FBZixlQUFlLENBQTBCO1FBQ3pDLG1CQUFjLEdBQWQsY0FBYyxDQUE0QjtRQUMxQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QiwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBQ3RELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBdUI7UUFDeEMsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2hDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBRWpDLFdBQU0sR0FBTixNQUFNLENBQWU7UUF2SGpDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRW5DLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRS9CLGdCQUFXLEdBQTJDLEVBQUUsQ0FBQztRQUV6RCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQTR5QmpCLDZCQUF3QixHQUFHLEdBQUcsRUFBRTtZQUM1QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztJQTlyQkYsQ0FBQztJQUVELFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsZ0JBQWdCLENBQXVCLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hHLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEYsSUFBSSxDQUFDLGtCQUFrQjtpQkFDbEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDN0IsSUFBSSxDQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDYixPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQ0w7aUJBQ0EsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDckMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtvQkFDOUIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLHdCQUF3QixDQUFDO2lCQUNsRTtxQkFBTTtvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO2lCQUN0RTtnQkFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLFVBQVU7YUFDVixtQkFBbUIsRUFBRTthQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDeEcsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLDRCQUE0QjtRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxFQUFFO1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRWpELElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLGlCQUFpQixDQUFDO2dCQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RSxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQXlCLENBQUM7UUFDcEUsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDckcsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDdkQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0Qsa0JBQWtCO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUMzRTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUU3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRTtnQkFDdEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hELDJCQUEyQjtnQkFDM0IsSUFBSSxhQUFhLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUM1QjthQUNKO2lCQUFNO2dCQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUMzQjtZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEYsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO29CQUNyQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQ2hDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRixJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2lCQUM3QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtvQkFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2lCQUNoQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLGtCQUFrQjtRQUNkLFVBQVU7UUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN6QyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ2pELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pGO1lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDL0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDO2dCQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3RHO1NBQ0o7SUFDTCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2YsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ25GLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUM3Qix5Q0FBeUM7UUFDekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGFBQWEsQ0FBQztRQUNsRCwyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDaEMsTUFBTSxHQUFHLE1BQU0sR0FBRyxhQUFhLENBQUM7WUFDaEMsR0FBRyxHQUFHLEdBQUcsR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCw4QkFBOEI7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0I7aUJBQ2pDLElBQUksQ0FDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7Z0JBQ3JDLElBQUksU0FBUyxLQUFLLGVBQWUsQ0FBQyxDQUFDLEVBQUU7b0JBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUM7b0JBQzdDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2lCQUNoQztnQkFDRCxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ3BGLE1BQU0sVUFBVSxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBNkIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUMvRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNsRCxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7b0JBQ25GLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDO29CQUM3QyxJQUFJLENBQUMsV0FBVzt3QkFDWixHQUFHLElBQUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUM7NEJBQ2xDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGVBQWU7NEJBQzlELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDeEYsbUJBQW1CO29CQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2xCLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZUFBZTt3QkFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLElBQUksa0JBQWtCLENBQUM7cUJBQzVEO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM1QixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxDQUN6QjtpQkFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3ZELElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5QyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEYsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUN0RCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdkI7UUFDRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQXlCO1FBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsOEJBQThCLENBQUMsS0FBeUI7UUFDcEQsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEc7YUFBTTtZQUNILGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxRDtRQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDN0UsTUFBTSxvQkFBb0IsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEQsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3REO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELG1CQUFtQjtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDckYsTUFBTSxTQUFTLEdBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQWdCLENBQUM7WUFDaEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhO2dCQUMzQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztnQkFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzdFLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUMzRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBQ3hELE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7UUFFNUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUFDLENBQUM7WUFDcEUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLGNBQWMsRUFBRTtnQkFDbEMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNwQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hGLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFDRCx1Q0FBdUM7WUFDdkMsTUFBTSxlQUFlLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQjtZQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3RGO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7WUFDdkUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDL0MsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN0RjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDNUUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLGdCQUFnQixFQUFFO1lBQ3RDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDSCxrRUFBa0U7WUFDbEUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7U0FDckU7SUFDTCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsZ0JBQTZCO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQztRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7U0FDekU7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksY0FBYyxDQUFDLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDbkY7U0FDSjthQUFNO1lBQ0gsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUVELHdCQUF3QjtRQUNwQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUYsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUN2RTthQUFNO1lBQ0gsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDMUU7SUFDTCxDQUFDO0lBRUQsMkJBQTJCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVO2FBQ1YsbUJBQW1CLEVBQUU7YUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsVUFBVTthQUNWLDhCQUE4QixFQUFFO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7WUFDL0csSUFBSSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN0RTtJQUNMLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWTtRQUNSLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3RCLE1BQU0sYUFBYSxHQUFtQixFQUFFLENBQUM7WUFDekMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3BDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO3dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xCLENBQUMsQ0FBQztvQkFDRixLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTt3QkFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQixDQUFDLENBQUM7b0JBQ0YsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLENBQUMsQ0FBQztnQkFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxZQUFZO1FBQ1IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ3hDLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3pFO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRCxtQkFBbUI7UUFDZixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQW9CLENBQUM7UUFDdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDeEUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDM0UsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQ2hDLDZEQUE2RDtnQkFDN0QsS0FBSyxJQUFJLGFBQWEsQ0FBQzthQUMxQjtTQUNKO1FBQ0QsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixPQUFPLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDdEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRTtnQkFDakYsdUZBQXVGO2dCQUN2RixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxXQUFXLElBQUksd0JBQXdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7WUFDSCx1RkFBdUY7WUFDdkYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0YsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2pFO1NBQ0o7YUFBTTtZQUNILE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBb0IsQ0FBQztZQUN2RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDYixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELElBQUksTUFBTSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN2QyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUN2RDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGtCQUFrQjtRQUNkLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN2RSxJQUFJLFdBQVcsRUFBRTtZQUNaLENBQUMsR0FBRyxXQUFXLENBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMzRCxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUEwQixDQUFDO1FBQ2pHLE1BQU0sT0FBTyxHQUFxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFpQixFQUFFLEtBQWE7UUFDM0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBcUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkY7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCLEVBQUUsS0FBYTtRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMxQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0QsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFxQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWlCO1FBQzNCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQXFCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCwyQkFBMkI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsU0FBUyxDQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQztpQkFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2YsT0FBTztpQkFDVjtnQkFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUF5QixDQUFDO2dCQUNwRyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLE9BQU87aUJBQ1Y7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFO3dCQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUU7b0JBQzFDLElBQUksQ0FBQywwQkFBMEI7eUJBQzFCLGdCQUFnQixFQUFFO3lCQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEQsQ0FBQyxDQUFDLENBQUM7aUJBQ1Y7cUJBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtvQkFDbkMsSUFBSSxDQUFDLFlBQVk7eUJBQ1osWUFBWSxFQUFFO3lCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTt3QkFDWixJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4RCxDQUFDLENBQUMsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN2RDtnQkFFRCx5Q0FBeUM7Z0JBQ3pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsS0FBSyxDQUNELFNBQVMsQ0FBYSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUM1RixTQUFTLENBQWdCLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzlDLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FDTCxDQUNKO2FBQ0ksSUFBSSxDQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUN6RSxPQUFPLHFCQUFxQixFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDM0I7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixFQUFFLENBQUM7YUFDL0M7WUFDRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFxQixDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDeEM7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELHlCQUF5QjtRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixTQUFTLENBQWdCLFFBQVEsRUFBRSxTQUFTLENBQUM7aUJBQ3hDLElBQUksQ0FDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BDO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7b0JBQ3hDLE1BQU0sSUFBSSxHQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBNkIsQ0FBQyxhQUFhLENBQ3ZFLGVBQWUsQ0FDTSxDQUFDO29CQUMxQixJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUQ7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNQLFNBQVMsQ0FBZ0IsUUFBUSxFQUFFLE9BQU8sQ0FBQztpQkFDdEMsSUFBSSxDQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEM7aUJBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHdCQUF3QjtRQUNwQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXJGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxrQkFBMEIsRUFBRSxFQUFFO1lBQzdELEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxFQUFFO2dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzthQUN4RTtRQUNMLENBQUMsQ0FBQztRQUVGLElBQUksS0FBSyxDQUFDO1FBQ1YsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQzthQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osZ0JBQWdCO1lBQ2hCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBRVAsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQseUJBQXlCO1FBQ3JCLGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyRixLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRTtnQkFDN0IsK0NBQStDO2dCQUMvQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLDBCQUEwQjtvQkFDMUIsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7Z0JBQ25FLENBQUMsQ0FBQyxDQUFDO2FBQ047U0FDSjtJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQTRCLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxhQUE0QixDQUFDO1FBQ3JGLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxVQUFVLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNwRSxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1NBQ2xGO2FBQU07WUFDSCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFO2dCQUM1QyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQVFELG9CQUFvQixDQUFDLEtBQWE7UUFDOUIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDOUIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVc7UUFDUCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7OzhHQXYwQlEsaUJBQWlCLHNaQXVIZCxjQUFjO2tHQXZIakIsaUJBQWlCLDJjQXBCZjtRQUNQLFVBQVU7UUFDVixZQUFZO1FBQ1osMEJBQTBCO1FBQzFCLHdCQUF3QjtRQUN4QiwwQkFBMEI7UUFDMUIscUJBQXFCO1FBQ3JCLGtCQUFrQjtRQUNsQjtZQUNJLE9BQU8sRUFBRSx5QkFBeUI7WUFDbEMsV0FBVyxFQUFFLGlCQUFpQjtTQUNqQztLQUNKLG1IQW1Ea0MsVUFBVSxvSEFHZCxVQUFVLDhHQUdiLFVBQVUsMklBR1EsVUFBVSx5SEFHWixVQUFVLHlHQUdsQixVQUFVLCtHQUdQLFVBQVUscUhBR1AsVUFBVSx1SEFHVCxVQUFVLCtGQUd0QixVQUFVLGtIQUdTLFVBQVUsb0RDNUpoRSxvL0lBK0ZBOzJGRFphLGlCQUFpQjtrQkF2QjdCLFNBQVM7K0JBQ0ksdUJBQXVCLGFBRXRCO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWiwwQkFBMEI7d0JBQzFCLHdCQUF3Qjt3QkFDeEIsMEJBQTBCO3dCQUMxQixxQkFBcUI7d0JBQ3JCLGtCQUFrQjt3QkFDbEI7NEJBQ0ksT0FBTyxFQUFFLHlCQUF5Qjs0QkFDbEMsV0FBVyxtQkFBbUI7eUJBQ2pDO3FCQUNKLFFBQ0s7d0JBQ0YsaUNBQWlDLEVBQUUseUNBQXlDO3dCQUM1RSxzQ0FBc0MsRUFBRSx5REFBeUQ7d0JBQ2pHLDJCQUEyQixFQUFFLGtDQUFrQzt3QkFDL0Qsa0NBQWtDLEVBQUUsMERBQTBEO3FCQUNqRzs7MEJBeUhJLE1BQU07MkJBQUMsY0FBYzs0Q0EzRTFCLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTdELGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXpELFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXRELHVCQUF1QjtzQkFEdEIsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJekUscUJBQXFCO3NCQURwQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl2RSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUkvRCxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbEUsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUlyRSxvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXRFLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR00sd0JBQXdCO3NCQUF2RixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICAgIFRoZUVkaXRvcixcbiAgICBUaGVCYXNlRWxlbWVudENvbXBvbmVudCxcbiAgICBQbHVnaW5LZXlzLFxuICAgIFRoZVBsdWdpbk9wdGlvbixcbiAgICBUaGVNb2RlQ29uZmlnLFxuICAgIFRIRV9NT0RFX1RPS0VOLFxuICAgIFRoZU1vZGVcbn0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0tleUhvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlLCBnZXRFbGVtZW50SGVpZ2h0LCBnZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vdGFibGUuc3RvcmUnO1xuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vdGFibGUuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIEhFQURFUl9DRUxMX0NMQVNTLFxuICAgIFRhYmxlT3B0aW9ucyxcbiAgICBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyxcbiAgICBUQUJMRV9DT05UUk9MLFxuICAgIFRBQkxFX0lOU0VSVF9NQVNLLFxuICAgIFRBQkxFX05VTUJFUl9DT0xVTU4sXG4gICAgVEFCTEVfUEFERElORyxcbiAgICBUaGVQbHVnaW5UYWJsZU9wdGlvbixcbiAgICBUaGVUYWJsZUNvbHVtbixcbiAgICBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOXG59IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IGlzVmlydHVhbEtleSB9IGZyb20gJy4uL3V0aWxzL2lzLXZpcnR1YWwta2V5JztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlIH0gZnJvbSAnLi4vdGFibGUucGlwZSc7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgVGhlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0Q29sdW1uc1dpZHRoLCBnZXRHcmlkQ29sdW1ucyB9IGZyb20gJy4uL3V0aWxzL2dldC1ncmlkLWNvbHVtbnMnO1xuaW1wb3J0IHsgREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgU2Nyb2xsRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL25vZGUtdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZS10YWJsZS1wb3NpdGlvbic7XG5pbXBvcnQgeyBpc1NlbGVjdGVkQWxsQ2VsbCB9IGZyb20gJy4uL3V0aWxzL2NlbGwtcG9zaXRpb24nO1xuaW1wb3J0IHsgY2FsY3VsYXRlUm93Q29udHJvbHMgfSBmcm9tICcuLi91dGlscy9jYWxjdWxhdGUtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS10YWJsZSwgW3RoZVRhYmxlXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgVGFibGVTdG9yZSxcbiAgICAgICAgVGFibGVTZXJ2aWNlLFxuICAgICAgICBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlVGFibGVDb21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS13aXRoLWNvbnRyb2xzXSc6ICdpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcnLFxuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS13aXRoLXN0aWNreS1jb2x1bW5dJzogJ2ZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKGVsZW1lbnQsIHRhYmxlUGx1Z2luT3B0aW9ucyknLFxuICAgICAgICAnW2NsYXNzLnRoZS1udW1iZXJkLXRhYmxlXSc6ICdlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbicsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXNlbGVjdGlvbi1oaWRlXSc6ICd0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZyB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZydcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFRoZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQ8VGFibGVFbGVtZW50LCBFZGl0b3I+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIGhlYWRlclJvdyA9IGZhbHNlO1xuXG4gICAgaXNTZWxlY3RlZEFsbENlbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHJvd0NvbnRyb2xzOiB7IGhlaWdodDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgY29sQ29udHJvbHMgPSBbXTtcblxuICAgIGlzSW5UYWJsZTogYm9vbGVhbjtcblxuICAgIHRhYmxlUGx1Z2luT3B0aW9uczogVGhlUGx1Z2luT3B0aW9uPFRoZVBsdWdpblRhYmxlT3B0aW9uPjtcblxuICAgIGlzU3RpY2t5VG9wOiBib29sZWFuO1xuXG4gICAgaXNTY3JvbGxYOiBib29sZWFuO1xuXG4gICAgc2Nyb2xsQ29udGFpbmVyVG9wOiBudW1iZXI7XG5cbiAgICB0YWJsZVJlY3RMZWZ0OiBudW1iZXI7XG5cbiAgICBpc1JpZ2h0U2hhZG93OiBib29sZWFuO1xuXG4gICAgaXNMZWZ0U2hhZG93OiBib29sZWFuO1xuXG4gICAgcHJldmlvdXNTY3JvbGxDb250YWluZXI6IHN0cmluZztcblxuICAgIHByaW50Q29sdW1uczogVGhlVGFibGVDb2x1bW5bXTtcblxuICAgIGdldCBjb2x1bW5zKCk6IFRoZVRhYmxlQ29sdW1uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHRhYmxlUm93Q29udHJvbHNXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbHVtbkNvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb3JuZXJDb250cm9sJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29ybmVyQ29udHJvbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdyb3dDb250cm9sc0lubmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcm93Q29udHJvbHNJbm5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dMZWZ0U2hhZG93JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaGVhZGVyUm93TGVmdFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dSaWdodFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd1JpZ2h0U2hhZG93OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbGdyb3VwJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29sZ3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNldFNlbGVjdGVkQ29sdW1uc0FuZFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWFkZXJSb3cgPSB0aGlzLmdldEhlYWRlclJvdygpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHVibGljIGV2ZW50RGlzcGF0Y2hlcjogVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwdWJsaWMgcmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBwdWJsaWMgdGFibGVTdG9yZTogVGFibGVTdG9yZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlOiBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmcmVlemVDb2x1bW5QaXBlOiBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIHB1YmxpYyBmcmVlemVSb3dQaXBlOiBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogVGhlQ29udGV4dFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoVEhFX01PREVfVE9LRU4pXG4gICAgICAgIHByaXZhdGUgY29uZmlnOiBUaGVNb2RlQ29uZmlnXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMgPSBnZXRQbHVnaW5PcHRpb25zPFRoZVBsdWdpblRhYmxlT3B0aW9uPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy50YWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5zaG93RnVsbHNjcmVlbiAmJiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5mdWxsc2NyZWVuQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9uc1xuICAgICAgICAgICAgICAgIC5mdWxsc2NyZWVuQWN0aW9uKHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LmVsZW1lbnQgPT09IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LnN0YXRlID09PSAnb2ZmJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXIgPSB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlYmluZENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLnNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkQWxsQ2VsbCA9IGlzU2VsZWN0ZWRBbGxDZWxsKHRoaXMuZWRpdG9yLCB0aGlzLnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FsY1ByaW50Q29sdW1uc1dpZHRoKCkge1xuICAgICAgICAvLyDmiZPljbDmqKHlvI/kuIvvvIzmjInnhafljp/lrr3luqbmr5Tkvovln7rkuo7lvZPliY3ooajmoLzlrr3luqborqHnrpfliJflrr1cbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZWxlbWVudD8uY29sdW1ucztcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFRoZU1vZGUucHJpbnQgJiYgY29sdW1ucykge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSBjb2x1bW5zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIud2lkdGgsIDApO1xuICAgICAgICAgICAgY29uc3QgY2VsbHNXaWR0aFJhdGlvID0gY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi53aWR0aCAvIHRhYmxlV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYmxlV2lkdGggPSB0aGlzLmdldFdyYXBwZXJXaWR0aCgpO1xuXG4gICAgICAgICAgICB0aGlzLnByaW50Q29sdW1ucyA9IGNlbGxzV2lkdGhSYXRpby5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBpdGVtICogY3VycmVudFRhYmxlV2lkdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoIDwgb3B0cy5taW5XaWR0aFB4ID8gb3B0cy5taW5XaWR0aFB4IDogd2lkdGggfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0V3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRhYmxlQ29udGFpbmVyLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQ7XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb21wYXRpYmxlIHdpdGggb2xkIGRhdGFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldEhlYWRlclJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ub3B0aW9ucz8uaGVhZGVyUm93KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wYXQgb2xkIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0uaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdzbGF0ZS1ibG9jay1jYXJkJyk7XG4gICAgICAgICAgICBpZiAoYmxvY2tDYXJkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJsb2NrQ2FyZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc2xhdGUtYmxvY2stY2FyZC0ke3RoaXMuZWxlbWVudC50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmluaXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5PblNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuS2V5ZG93blNlbGVjdEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY1ByaW50Q29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkSW1hZ2VEb25lID0gYXdhaXQgdGhpcy5yZXNvbHZlSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyDnrYnlvoXluo/lj7fliJfooajmoLzlhoXlm77niYfliqDovb3lrozmiJDlkI7lho3ljrvmuLLmn5PooajmoLzooYzpq5jluqZcbiAgICAgICAgICAgICAgICBpZiAobG9hZEltYWdlRG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFN0eWxlKCk7XG4gICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVSZWN0TGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS50aGVFZGl0b3JSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcmlkQ29sdW1uc1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RpY2t5Um93U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS53aW5kb3dSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyog57uZ5qCH6aKY6KGM55qE5bemL+WPs+WKoOmYtOW9sSAqL1xuICAgIHNldEhlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgLy8g5Zu65a6a5qCH6aKY6KGM6YGu55uWXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCB0aGlzLmlzU3RpY2t5VG9wID8gJzMnIDogJzAnKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93IHx8IHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbGV0IHsgaGVpZ2h0LCB0b3AgfSA9IHRoaXMuY2FsY0hlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgbGV0IHsgbGVmdCwgd2lkdGggfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmlnaHRTaGFkb3cgJiYgdGhpcy5oZWFkZXJSb3dSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd1JpZ2h0U2hhZG93ID0gdGhpcy5oZWFkZXJSb3dSaWdodFNoYWRvdy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ2xlZnQnLCBgJHtsZWZ0ICsgd2lkdGggLSA4fXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cgJiYgdGhpcy5oZWFkZXJSb3dMZWZ0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93TGVmdFNoYWRvdyA9IHRoaXMuaGVhZGVyUm93TGVmdFNoYWRvdy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ3RvcCcsIGAke3RvcH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ2xlZnQnLCBgJHtsZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FsY0hlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgLy8g6buY6K6k77yI5rKh5pyJ6IGa54Sm77yJ55qEIHRvcCDlgLzvvJrmu5rliqjlrrnlmajpq5jluqYgKyDooajmoLznmoRwYWRkaW5n77yIOO+8iVxuICAgICAgICBsZXQgdG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyBUQUJMRV9QQURESU5HO1xuICAgICAgICAvLyDogZrnhKbnirbmgIHkuIvvvJog6auY5bqmICsgY29udHJvbO+8iDEx77yJ77yMdG9wIOWKoOS4gOS4qiBtYXNr77yIMTnvvIlcbiAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgVEFCTEVfQ09OVFJPTDtcbiAgICAgICAgICAgIHRvcCA9IHRvcCArIFRBQkxFX0lOU0VSVF9NQVNLIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWlnaHQsIHRvcCB9O1xuICAgIH1cblxuICAgIHN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJTY3JvbGxlZCRcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZW50aXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBkaXJlY3Rpb24gfSA9IGVudGlyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxYID0gdGhpcy50YWJsZVJlY3RMZWZ0ICE9PSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wSGVpZ2h0ID0gdGhpcy5pc0luVGFibGUgPyAtMTkgOiAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KVswXT8uaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgaGVhZGVyVG9wSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPD0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyA4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJlY3QuYm90dG9tIC0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgPj0gaGVhZGVyUm93SGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdywgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagh+mimOihjOWGheWuuei2hei/h+WbuuWumumrmOW6puaXtuenu+mZpOWGu+e7k1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heEhlYWRlclJvd0hlaWdodCA9ICgyNCArIDgpICogMTE7IC8vIOi2heWHuiAxMSDooYzvvIzlj5bmtojlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9IGhlYWRlclJvd0hlaWdodCA8PSBtYXhIZWFkZXJSb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTdGlja3lUb3A7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNlbGxTdHlsZSgpIHtcbiAgICAgICAgbGV0IGhlYWRlclJvd0NlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuICAgICAgICBsZXQgaGVhZGVyQ29sdW1uQ2VsbHMgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlblswXSk7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJSb3cpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGhlYWRlclJvd0NlbGxzKTtcbiAgICAgICAgICAgIGhlYWRlclJvd0NlbGxzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJDb2x1bW5DZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWFkZXJDZWxscyA9IGhlYWRlclJvd0NlbGxzLmNvbmNhdChoZWFkZXJDb2x1bW5DZWxscykuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyUm93ICYmIHRoaXMuZWxlbWVudC5vcHRpb25zPy5oZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlckNlbGxzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGVhZGVyQ2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjZWxsRWxlbWVudCwgSEVBREVSX0NFTExfQ0xBU1MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRIZWFkZXJDb2x1bW5BbmRDb250cm9sU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgY2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gW107XG4gICAgICAgIGlmIChjZWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IGNlbGxzLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVyQ29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgY29uc3QgaGVhZGVyQ29sdW1uRWxlbWVudHMgPSBoZWFkZXJDb2x1bW5DZWxscy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbLi4uaGVhZGVyQ29sdW1uRWxlbWVudHMsIGhlYWRlckNvbENvbnRyb2xdLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdGVtLCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoaXRlbSwgJ3RoZS1zdGlja3ktY2VsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJSb3dTdHlsZSgpIHtcbiAgICAgICAgdGhpcy5zZXRHcmlkQ29sdW1uc1N0eWxlKCk7XG4gICAgICAgIHRoaXMuc2V0U3RpY2t5Um93U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICB9XG5cbiAgICBzZXRHcmlkQ29sdW1uc1N0eWxlKCkge1xuICAgICAgICBjb25zdCBjb2xDb250cm9sID0gdGhpcy5jb2x1bW5Db250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdywgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSAodGhpcy50Ym9keUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzV2lkdGggPSB0aGlzLmNvbGdyb3VwPy5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgPyBnZXRDb2x1bW5zV2lkdGgodGhpcy5jb2xncm91cC5uYXRpdmVFbGVtZW50LCB0cnVlKVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZXREZWZhdWx0Q2VsbFdpZHRoKCk7XG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uID8gdGFibGVXaWR0aCAtIHRhYmxlUGFkZGluZyA6IHRhYmxlV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5pc0luVGFibGUgPyBbY29sQ29udHJvbCwgaGVhZGVyUm93XSA6IFtoZWFkZXJSb3ddO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sSW5uZXIgPSB0aGlzLnJvd0NvbnRyb2xzSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFibGVDb3JuZXJCdG4gPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtYmVyZWRDb2x1bW4gPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuaXNJblRhYmxlID8gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAzNiA6IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICd0b3AnLCB0b3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93LCAnaGVpZ2h0JywgYCR7aGVhZGVyUm93SGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBbY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG5dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5LyY5YyW77yadGFibGUg55qEIHBhZGRpbmctdG9wIOW6lOivpeWKqOaAgeWPmOWMlu+8iOS4jumYtOW9seWQjOWPmO+8iVxuICAgICAgICAgICAgY29uc3QgdGFibGVQYWRkaW5nVG9wID0gaGVhZGVyUm93SGVpZ2h0ICsgMTE7IC8vIOagh+mimOihjOmrmCArIGN0cmwgYnRu77yIMTFweO+8iemrmOW6plxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy10b3AnLCB0YWJsZVBhZGRpbmdUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbElubmVyLCAncGFkZGluZy10b3AnLCB0YWJsZVBhZGRpbmdUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZVJvd0NvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsICc0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgW2hlYWRlclJvdywgY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG5dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sSW5uZXIsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlUm93Q29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgJzEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2xCdXR0b24gPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgcm93Q29udHJvbEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V077yaIOmcgOimgeetieW+hSByb3dDb250cm9scyDlnKggZG9tIOS4rea4suafk+WujOavleWQjuaJjeiDveiOt+WPluWIsCByb3dDb250cm9sQnV0dG9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b24pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBudW1iZXJlZENvbHVtbiA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgaWYgKCFyb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pICYmIHJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93Q29udHJvbEJ1dHRvbiAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBuYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gbmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBuYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLmlzTGVmdFNoYWRvdyA9IHNjcm9sbExlZnQgPiAwO1xuICAgICAgICB0aGlzLmlzUmlnaHRTaGFkb3cgPSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPCBzY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgdHJgKTtcbiAgICAgICAgY29uc3Qgc3RpY2t5Q2VsbHMgPSBBcnJheS5mcm9tKHJvd3MpLm1hcChpdGVtID0+IGl0ZW0ucXVlcnlTZWxlY3RvcigndGgnKSB8fCBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RkJykpO1xuICAgICAgICBjb25zdCBpc0NvbHVtbkhlYWRlciA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaXNDb2x1bW5IZWFkZXIgPyBzdGlja3lDZWxscyA6IFtuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRdO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmNlbGxzUG9zaXRpb25DaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5kYW5nZXJvdXNPclNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXNlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGlmICgodGhpcy5zZWxlY3Rpb24gJiYgIXRoaXMucmVhZG9ubHkpIHx8IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiB8fCB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0NvbnRyb2xzID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbih0aGlzLmVkaXRvciwgc2VsZWN0aW9uLmZvY3VzLnBhdGgpO1xuICAgICAgICAgICAgdGhpcy5pc0luVGFibGUgPSBzdGFydFBvc2l0aW9uLmlzSW5UYWJsZSgpICYmIGVuZFBvc2l0aW9uLmlzSW5UYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0luVGFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlZmF1bHRDZWxsV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnJvd0NvbnRyb2xzSW5uZXIpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMucm93Q29udHJvbHNJbm5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgICAgIC8vIOiBmueEpuS5i+WQjuS8muWQkeW3puWBj+enu+S4gOS4qiBjb250cm9s77yILTEx77yJ77yM6KeBIC50aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBUQUJMRV9DT05UUk9MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKCh3aWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnY29sJykuZm9yRWFjaCgoZWxlOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbXBhdGlibGUgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB3aWR0aCBjYW5ub3QgYmUgb2J0YWluZWQgdW5kZXIgc2FmYXJpICNXSUstOTY0M1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh7IHdpZHRoOiBlbGUuY2xpZW50V2lkdGggfHwgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlKGVsZS5zdHlsZS53aWR0aCkgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEVkaXRvciBjb250YWluZXIgd2lkdGggY2hhbmdlcywgcmVzdWx0aW5nIGluIGNvbHVtbiB3aWR0aHMgbm8gbG9uZ2VyIHZhbGlkICNXSUstNjc2NlxuICAgICAgICAgICAgY29uc3Qgd2FybmluZyA9IHRoaXMuZWxlbWVudC5jb2x1bW5zLnNvbWUoKGNvbCwgaW5kZXgpID0+IGNvbC53aWR0aCAhPT0gY29sdW1uc1tpbmRleF0/LndpZHRoKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgdHIpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRyLmNoaWxkcmVuLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogTnVtYmVyKCh0YWJsZVdpZHRoIC8gdHIuY2hpbGRyZW4ubGVuZ3RoIC0gdHIuY2hpbGRyZW4ubGVuZ3RoKS50b0ZpeGVkKDIpKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVJvd3MoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghcm93LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCByb3cpO1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQgfSwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUm93SGVpZ2h0KCkge1xuICAgICAgICBjb25zdCByb3dFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmNoaWxkcmVuO1xuICAgICAgICBpZiAocm93RWxlbWVudHMpIHtcbiAgICAgICAgICAgIChbLi4ucm93RWxlbWVudHNdIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXSkubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQocm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHRoaXMuZWxlbWVudC5jaGlsZHJlbltpbmRleF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Db2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBbLi4udGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXSA9IGNvbHMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogZ2V0RWxlbWVudFdpZHRoKGNvbCkgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25Db2xNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghIXRoaXMuc2VsZWN0aW9uICYmIHRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJEYW5nZXJvdXNDZWxscygpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENvbHVtbih0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUm93TW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RSb3codGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvblNlbGVjdFRhYmxlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0VGFibGUodGhpcy5lZGl0b3IpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQtY2VsbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGwoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlQ29udGV4dE1lbnUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRhYmxlU2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VUb29sYmFyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhdGNoIGZvciByaWdodCBjbGljayBzZWxlY3QgbmV4dCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIEVkaXRvci5zdGFydCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5PblNlbGVjdGVkQ2VsbHMoKSB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vkb3duJykucGlwZShmaWx0ZXIoKGU6IE1vdXNlRXZlbnQpID0+IGUuYnV0dG9uICE9PSAyKSksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc1ZpcnR1YWxLZXkoZSkgJiYgIXRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsUG9zaXRpb25zID0gdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDZWxsUG9zaXRpb25zPy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzQ29udGVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYWJsZUVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50IHx8ICF0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckxhc3RGb2N1c1BhdGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xvc2VUb29sYmFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+ICEhZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdtb2QnLCBldmVudCkgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5wb2ludGVyU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAodGhpcy50Ym9keUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZvY3VzZWQtY2VsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsICYmIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcblxuICAgICAgICBjb25zdCBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzID0gKHBvaW50ZXJFdmVudHNTdHlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0aVJvdyBvZiBzdGlja3lSb3dzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzdGlSb3csICdwb2ludGVyLWV2ZW50cycsIHBvaW50ZXJFdmVudHNTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3doZWVsJylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIOWkhOeQhuagh+mimOihjOWbuuWumuaXtueahOa7muWKqOi3n+maj1xuICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ2F1dG8nKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCkge1xuICAgICAgICAvLyDliKTmlq3mmK/lkKblh7rnjrDlm7rlrprmoIfpopjooYxcbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RpUm93IG9mIHN0aWNreVJvd3MpIHtcbiAgICAgICAgICAgICAgICAvLyDkv67lpI3ojrflj5Ygc2Nyb2xsTGVmdCDlsZ7mgKflvJXotbfnmoTmtY/op4jlmajph43nu5jvvIzlr7zoh7Tot7Pliqjpl67popggI1dJSy0xMTAzOFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWQjOatpea7muWKqOeKtuaAgeWIsCAudGhlLXN0aWNreS1yb3dcbiAgICAgICAgICAgICAgICAgICAgc3RpUm93LnNjcm9sbExlZnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgY29uc3QgY29ybmVyQ29udHJvbCA9IHRoaXMuY29ybmVyQ29udHJvbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCByb3dDb250cm9sID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0aWNreUVsZW1lbnRzID0gWy4uLnN0aWNreVJvd3MsIGNvcm5lckNvbnRyb2wsIHJvd0NvbnRyb2xdO1xuICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5pc0luVGFibGUgPyAtVEFCTEVfQ09OVFJPTCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wICYmIHRoaXMuaXNTY3JvbGxYKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvcm5lckNvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICAgICAgcm93Q29udHJvbCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RpY2t5RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbEJ1dHRvbldpZHRoID0gKCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtd3JhcHBlclwiICN0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcpLFxuICAgICAgICAnY29udHJvbC1hY3RpdmUnOiBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWJ1dHRvblwiIChtb3VzZWRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtcm93LW1hcmtlclwiICpuZ0lmPVwiIWhlYWRlclJvd1wiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZykgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0Zvcj1cImxldCBjb2wgb2YgcHJpbnRDb2x1bW5zID8/IGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9scy13cmFwcGVyIHRoZS1zdGlja3ktcm93XCIgI2NvbHVtbkNvbnRyb2xzV3JhcHBlcj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICNjb2xDb250cm9sXG4gICAgICAgICAgICBjbGFzcz1cInRoZS10YWJsZS1jb2wtY29udHJvbHNcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgY29sQ29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGbkNvbENvbnRyb2xzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2NvbnRyb2wtYWN0aXZlJzogdGFibGVTdG9yZS5zZWxlY3RlZENvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSxcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c0NvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNvbE1vdXNlZG93bigkZXZlbnQsIGkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNvbHVtblwiXG4gICAgICAgICAgICAgIFthdF09XCJpICsgMVwiXG4gICAgICAgICAgICAgIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIlxuICAgICAgICAgICAgICBbcGFyZW50RWxlbWVudF09XCJjb2xDb250cm9sXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5ICN0Ym9keT5cbiAgICAgICAgPHNsYXRlLWNoaWxkcmVuIFtjaGlsZHJlbl09XCJjaGlsZHJlblwiIFtjb250ZXh0XT1cImNoaWxkcmVuQ29udGV4dFwiIFt2aWV3Q29udGV4dF09XCJ2aWV3Q29udGV4dFwiPiA8L3NsYXRlLWNoaWxkcmVuPlxuICAgICAgPC90Ym9keT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LWxlZnQtc2hhZG93XCJcbiAgICAgICAgI2hlYWRlclJvd0xlZnRTaGFkb3dcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJvdy1zaGFkb3cgaGVhZGVyLXJvdy1yaWdodC1zaGFkb3dcIiAjaGVhZGVyUm93UmlnaHRTaGFkb3cgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj48L2Rpdj5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
838
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVaLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQ0gsU0FBUyxFQUNULHVCQUF1QixFQUN2QixVQUFVLEVBR1YsY0FBYyxFQUNkLE9BQU8sRUFDVixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFF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RSxLQUFLLEVBQUU7Z0JBSWxFLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJckUsb0JBQW9CO3NCQURuQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl0RSxRQUFRO3NCQURQLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdNLHdCQUF3QjtzQkFBdkYsWUFBWTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRzlELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgTmdab25lLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgVmlld0NoaWxkLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICAgIFRoZUVkaXRvcixcbiAgICBUaGVCYXNlRWxlbWVudENvbXBvbmVudCxcbiAgICBQbHVnaW5LZXlzLFxuICAgIFRoZVBsdWdpbk9wdGlvbixcbiAgICBUaGVNb2RlQ29uZmlnLFxuICAgIFRIRV9NT0RFX1RPS0VOLFxuICAgIFRoZU1vZGVcbn0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0tleUhvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlLCBnZXRFbGVtZW50SGVpZ2h0LCBnZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vdGFibGUuc3RvcmUnO1xuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vdGFibGUuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIEhFQURFUl9DRUxMX0NMQVNTLFxuICAgIFRhYmxlT3B0aW9ucyxcbiAgICBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyxcbiAgICBUQUJMRV9DT05UUk9MLFxuICAgIFRBQkxFX0lOU0VSVF9NQVNLLFxuICAgIFRBQkxFX05VTUJFUl9DT0xVTU4sXG4gICAgVEFCTEVfUEFERElORyxcbiAgICBUaGVQbHVnaW5UYWJsZU9wdGlvbixcbiAgICBUaGVUYWJsZUNvbHVtbixcbiAgICBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOXG59IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IGlzVmlydHVhbEtleSB9IGZyb20gJy4uL3V0aWxzL2lzLXZpcnR1YWwta2V5JztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlIH0gZnJvbSAnLi4vdGFibGUucGlwZSc7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgVGhlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0Q29sdW1uc1dpZHRoLCBnZXRHcmlkQ29sdW1ucyB9IGZyb20gJy4uL3V0aWxzL2dldC1ncmlkLWNvbHVtbnMnO1xuaW1wb3J0IHsgREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgU2Nyb2xsRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL25vZGUtdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZS10YWJsZS1wb3NpdGlvbic7XG5pbXBvcnQgeyBpc1NlbGVjdGVkQWxsQ2VsbCB9IGZyb20gJy4uL3V0aWxzL2NlbGwtcG9zaXRpb24nO1xuaW1wb3J0IHsgY2FsY3VsYXRlUm93Q29udHJvbHMgfSBmcm9tICcuLi91dGlscy9jYWxjdWxhdGUtdGFibGUnO1xuaW1wb3J0IHsgVGhlQ29sb3JTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29sb3Itc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNDb2xvclBhbmVsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY29sb3ItcGlja2VyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdGFibGUsIFt0aGVUYWJsZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFRhYmxlU3RvcmUsXG4gICAgICAgIFRhYmxlU2VydmljZSxcbiAgICAgICAgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIFRhYmxlRnJlZXplQ29sdW1uUGlwZSxcbiAgICAgICAgVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRoZVRhYmxlQ29tcG9uZW50XG4gICAgICAgIH1cbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtd2l0aC1jb250cm9sc10nOiAnaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtd2l0aC1zdGlja3ktY29sdW1uXSc6ICdmcmVlemVDb2x1bW5QaXBlLnRyYW5zZm9ybShlbGVtZW50LCB0YWJsZVBsdWdpbk9wdGlvbnMpJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtbnVtYmVyZC10YWJsZV0nOiAnZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4nLFxuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS1zZWxlY3Rpb24taGlkZV0nOiAndGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBUaGVUYWJsZUNvbXBvbmVudCBleHRlbmRzIFRoZUJhc2VFbGVtZW50Q29tcG9uZW50PFRhYmxlRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBoZWFkZXJSb3cgPSBmYWxzZTtcblxuICAgIGlzU2VsZWN0ZWRBbGxDZWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W10gPSBbXTtcblxuICAgIGNvbENvbnRyb2xzID0gW107XG5cbiAgICBpc0luVGFibGU6IGJvb2xlYW47XG5cbiAgICB0YWJsZVBsdWdpbk9wdGlvbnM6IFRoZVBsdWdpbk9wdGlvbjxUaGVQbHVnaW5UYWJsZU9wdGlvbj47XG5cbiAgICBpc1N0aWNreVRvcDogYm9vbGVhbjtcblxuICAgIGlzU2Nyb2xsWDogYm9vbGVhbjtcblxuICAgIHNjcm9sbENvbnRhaW5lclRvcDogbnVtYmVyO1xuXG4gICAgdGFibGVSZWN0TGVmdDogbnVtYmVyO1xuXG4gICAgaXNSaWdodFNoYWRvdzogYm9vbGVhbjtcblxuICAgIGlzTGVmdFNoYWRvdzogYm9vbGVhbjtcblxuICAgIHByZXZpb3VzU2Nyb2xsQ29udGFpbmVyOiBzdHJpbmc7XG5cbiAgICBwcmludENvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW107XG5cbiAgICBkb2N1bWVudE1vdXNlZG93biQ6IFN1YnNjcmlwdGlvbjtcblxuICAgIGdldCBjb2x1bW5zKCk6IFRoZVRhYmxlQ29sdW1uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHRhYmxlUm93Q29udHJvbHNXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbHVtbkNvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb3JuZXJDb250cm9sJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29ybmVyQ29udHJvbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdyb3dDb250cm9sc0lubmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcm93Q29udHJvbHNJbm5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dMZWZ0U2hhZG93JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaGVhZGVyUm93TGVmdFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dSaWdodFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd1JpZ2h0U2hhZG93OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbGdyb3VwJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29sZ3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNldFNlbGVjdGVkQ29sdW1uc0FuZFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWFkZXJSb3cgPSB0aGlzLmdldEhlYWRlclJvdygpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHVibGljIGV2ZW50RGlzcGF0Y2hlcjogVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwdWJsaWMgcmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBwdWJsaWMgdGFibGVTdG9yZTogVGFibGVTdG9yZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlOiBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmcmVlemVDb2x1bW5QaXBlOiBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIHB1YmxpYyBmcmVlemVSb3dQaXBlOiBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogVGhlQ29udGV4dFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoVEhFX01PREVfVE9LRU4pXG4gICAgICAgIHByaXZhdGUgY29uZmlnOiBUaGVNb2RlQ29uZmlnLFxuICAgICAgICBwcml2YXRlIGNvbG9yU2VsZWN0U2VydmljZTogVGhlQ29sb3JTZWxlY3RTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMgPSBnZXRQbHVnaW5PcHRpb25zPFRoZVBsdWdpblRhYmxlT3B0aW9uPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy50YWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5zaG93RnVsbHNjcmVlbiAmJiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5mdWxsc2NyZWVuQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9uc1xuICAgICAgICAgICAgICAgIC5mdWxsc2NyZWVuQWN0aW9uKHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LmVsZW1lbnQgPT09IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LnN0YXRlID09PSAnb2ZmJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXIgPSB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlYmluZENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLnNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkQWxsQ2VsbCA9IGlzU2VsZWN0ZWRBbGxDZWxsKHRoaXMuZWRpdG9yLCB0aGlzLnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5omT5Y2w5qih5byP5LiL77yM5oyJ54Wn5Y6f5a695bqm5q+U5L6L5Z+65LqO5b2T5YmN6KGo5qC85a695bqm6K6h566X5YiX5a69XG4gICAgICovXG4gICAgY2FsY1ByaW50Q29sdW1uc1dpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5lbGVtZW50Py5jb2x1bW5zO1xuICAgICAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gVGhlTW9kZS5wcmludCAmJiBjb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aCA9IGNvbHVtbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYi53aWR0aCwgMCk7XG4gICAgICAgICAgICBjb25zdCBjZWxsc1dpZHRoUmF0aW8gPSBjb2x1bW5zLm1hcChjb2x1bW4gPT4gTWF0aC5mbG9vcigoY29sdW1uLndpZHRoIC8gdGFibGVXaWR0aCkgKiAxMDApIC8gMTAwKTtcbiAgICAgICAgICAgIC8vIOS4uuS7gOS5iOaYryA2MzTvvIzmjInnhacgRFBJIDk2IOeahCBBNCDnurjnmoTlrr3luqbmmK8gNzk0cHgsIOS9huaJk+WNsOaXtuS8muacieW3puWPsyA4MHB4IOeahOi+uei3ne+8jOaJgOS7pei/memHjOWPliA3OTQgLSA4MCAqIDIgPSA2MzRcbiAgICAgICAgICAgIGNvbnN0IHByaW50V2lkdGggPSA2MzQ7XG4gICAgICAgICAgICB0aGlzLnByaW50Q29sdW1ucyA9IGNlbGxzV2lkdGhSYXRpby5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g5Li65LuA5LmI5YePIDHvvIwg5Zug5Li66L+Z5Liq5a695bqm5piv5YaF5a655Yy65Z+f5a695bqm77yM5L2GIHRkIOWPs+S+p+i/mOacieS4gOS4qui+ueahhu+8jOaJgOS7peWHj+WOuyAxXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJzZUludChgJHtpdGVtICogcHJpbnRXaWR0aH1gKSAtIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoIDwgb3B0cy5taW5XaWR0aFB4ID8gb3B0cy5taW5XaWR0aFB4IDogd2lkdGggfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0V3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRhYmxlQ29udGFpbmVyLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQ7XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb21wYXRpYmxlIHdpdGggb2xkIGRhdGFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldEhlYWRlclJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ub3B0aW9ucz8uaGVhZGVyUm93KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wYXQgb2xkIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0uaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdzbGF0ZS1ibG9jay1jYXJkJyk7XG4gICAgICAgICAgICBpZiAoYmxvY2tDYXJkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJsb2NrQ2FyZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc2xhdGUtYmxvY2stY2FyZC0ke3RoaXMuZWxlbWVudC50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmluaXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudE1vdXNlZG93biQgPSB0aGlzLmNvbG9yU2VsZWN0U2VydmljZS5wcmV2ZW50RGVmYXVsdEFuZFN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5PblNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuS2V5ZG93blNlbGVjdEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY1ByaW50Q29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkSW1hZ2VEb25lID0gYXdhaXQgdGhpcy5yZXNvbHZlSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyDnrYnlvoXluo/lj7fliJfooajmoLzlhoXlm77niYfliqDovb3lrozmiJDlkI7lho3ljrvmuLLmn5PooajmoLzooYzpq5jluqZcbiAgICAgICAgICAgICAgICBpZiAobG9hZEltYWdlRG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFN0eWxlKCk7XG4gICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVSZWN0TGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS50aGVFZGl0b3JSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcmlkQ29sdW1uc1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RpY2t5Um93U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS53aW5kb3dSZXNpemVkJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC53aWR0aENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyog57uZ5qCH6aKY6KGM55qE5bemL+WPs+WKoOmYtOW9sSAqL1xuICAgIHNldEhlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgLy8g5Zu65a6a5qCH6aKY6KGM6YGu55uWXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCB0aGlzLmlzU3RpY2t5VG9wID8gJzMnIDogJzAnKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93IHx8IHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbGV0IHsgaGVpZ2h0LCB0b3AgfSA9IHRoaXMuY2FsY0hlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgbGV0IHsgbGVmdCwgd2lkdGggfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmlnaHRTaGFkb3cgJiYgdGhpcy5oZWFkZXJSb3dSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd1JpZ2h0U2hhZG93ID0gdGhpcy5oZWFkZXJSb3dSaWdodFNoYWRvdy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ2xlZnQnLCBgJHtsZWZ0ICsgd2lkdGggLSA4fXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cgJiYgdGhpcy5oZWFkZXJSb3dMZWZ0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93TGVmdFNoYWRvdyA9IHRoaXMuaGVhZGVyUm93TGVmdFNoYWRvdy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ3RvcCcsIGAke3RvcH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93TGVmdFNoYWRvdywgJ2xlZnQnLCBgJHtsZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FsY0hlYWRlclJvd1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgLy8g6buY6K6k77yI5rKh5pyJ6IGa54Sm77yJ55qEIHRvcCDlgLzvvJrmu5rliqjlrrnlmajpq5jluqYgKyDooajmoLznmoRwYWRkaW5n77yIOO+8iVxuICAgICAgICBsZXQgdG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyBUQUJMRV9QQURESU5HO1xuICAgICAgICAvLyDogZrnhKbnirbmgIHkuIvvvJog6auY5bqmICsgY29udHJvbO+8iDEx77yJ77yMdG9wIOWKoOS4gOS4qiBtYXNr77yIMTnvvIlcbiAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgVEFCTEVfQ09OVFJPTDtcbiAgICAgICAgICAgIHRvcCA9IHRvcCArIFRBQkxFX0lOU0VSVF9NQVNLIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWlnaHQsIHRvcCB9O1xuICAgIH1cblxuICAgIHN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJTY3JvbGxlZCRcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZW50aXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBkaXJlY3Rpb24gfSA9IGVudGlyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxYID0gdGhpcy50YWJsZVJlY3RMZWZ0ICE9PSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wSGVpZ2h0ID0gdGhpcy5pc0luVGFibGUgPyAtMTkgOiAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KVswXT8uaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgaGVhZGVyVG9wSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPD0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyA4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJlY3QuYm90dG9tIC0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgPj0gaGVhZGVyUm93SGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdywgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagh+mimOihjOWGheWuuei2hei/h+WbuuWumumrmOW6puaXtuenu+mZpOWGu+e7k1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heEhlYWRlclJvd0hlaWdodCA9ICgyNCArIDgpICogMTE7IC8vIOi2heWHuiAxMSDooYzvvIzlj5bmtojlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9IGhlYWRlclJvd0hlaWdodCA8PSBtYXhIZWFkZXJSb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNTdGlja3lUb3A7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNlbGxTdHlsZSgpIHtcbiAgICAgICAgbGV0IGhlYWRlclJvd0NlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuICAgICAgICBsZXQgaGVhZGVyQ29sdW1uQ2VsbHMgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlblswXSk7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJSb3cpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGhlYWRlclJvd0NlbGxzKTtcbiAgICAgICAgICAgIGhlYWRlclJvd0NlbGxzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJDb2x1bW5DZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWFkZXJDZWxscyA9IGhlYWRlclJvd0NlbGxzLmNvbmNhdChoZWFkZXJDb2x1bW5DZWxscykuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyUm93ICYmIHRoaXMuZWxlbWVudC5vcHRpb25zPy5oZWFkZXJDb2x1bW4pIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlckNlbGxzLmxlbmd0aCkge1xuICAgICAgICAgICAgaGVhZGVyQ2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjZWxsRWxlbWVudCwgSEVBREVSX0NFTExfQ0xBU1MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRIZWFkZXJDb2x1bW5BbmRDb250cm9sU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgY2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gW107XG4gICAgICAgIGlmIChjZWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IGNlbGxzLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVyQ29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgY29uc3QgaGVhZGVyQ29sdW1uRWxlbWVudHMgPSBoZWFkZXJDb2x1bW5DZWxscy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbLi4uaGVhZGVyQ29sdW1uRWxlbWVudHMsIGhlYWRlckNvbENvbnRyb2xdLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdGVtLCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoaXRlbSwgJ3RoZS1zdGlja3ktY2VsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJSb3dTdHlsZSgpIHtcbiAgICAgICAgdGhpcy5zZXRHcmlkQ29sdW1uc1N0eWxlKCk7XG4gICAgICAgIHRoaXMuc2V0U3RpY2t5Um93U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKTtcbiAgICB9XG5cbiAgICBzZXRHcmlkQ29sdW1uc1N0eWxlKCkge1xuICAgICAgICBjb25zdCBjb2xDb250cm9sID0gdGhpcy5jb2x1bW5Db250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdywgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSAodGhpcy50Ym9keUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzV2lkdGggPSB0aGlzLmNvbGdyb3VwPy5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgPyBnZXRDb2x1bW5zV2lkdGgodGhpcy5jb2xncm91cC5uYXRpdmVFbGVtZW50LCB0cnVlKVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZXREZWZhdWx0Q2VsbFdpZHRoKCk7XG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uID8gdGFibGVXaWR0aCAtIHRhYmxlUGFkZGluZyA6IHRhYmxlV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5pc0luVGFibGUgPyBbY29sQ29udHJvbCwgaGVhZGVyUm93XSA6IFtoZWFkZXJSb3ddO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sSW5uZXIgPSB0aGlzLnJvd0NvbnRyb2xzSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFibGVDb3JuZXJCdG4gPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtYmVyZWRDb2x1bW4gPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuaXNJblRhYmxlID8gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAzNiA6IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICd0b3AnLCB0b3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93LCAnaGVpZ2h0JywgYCR7aGVhZGVyUm93SGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBbY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG5dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5LyY5YyW77yadGFibGUg55qEIHBhZGRpbmctdG9wIOW6lOivpeWKqOaAgeWPmOWMlu+8iOS4jumYtOW9seWQjOWPmO+8iVxuICAgICAgICAgICAgY29uc3QgdGFibGVQYWRkaW5nVG9wID0gaGVhZGVyUm93SGVpZ2h0ICsgMTE7IC8vIOagh+mimOihjOmrmCArIGN0cmwgYnRu77yIMTFweO+8iemrmOW6plxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy10b3AnLCB0YWJsZVBhZGRpbmdUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbElubmVyLCAncGFkZGluZy10b3AnLCB0YWJsZVBhZGRpbmdUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZVJvd0NvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsICc0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgW2hlYWRlclJvdywgY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG5dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sSW5uZXIsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlUm93Q29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgJzEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2xCdXR0b24gPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgcm93Q29udHJvbEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V077yaIOmcgOimgeetieW+hSByb3dDb250cm9scyDlnKggZG9tIOS4rea4suafk+WujOavleWQjuaJjeiDveiOt+WPluWIsCByb3dDb250cm9sQnV0dG9uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b24pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBudW1iZXJlZENvbHVtbiA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgaWYgKCFyb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pICYmIHJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93Q29udHJvbEJ1dHRvbiAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBuYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gbmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBuYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLmlzTGVmdFNoYWRvdyA9IHNjcm9sbExlZnQgPiAwO1xuICAgICAgICB0aGlzLmlzUmlnaHRTaGFkb3cgPSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPCBzY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgdHJgKTtcbiAgICAgICAgY29uc3Qgc3RpY2t5Q2VsbHMgPSBBcnJheS5mcm9tKHJvd3MpLm1hcChpdGVtID0+IGl0ZW0ucXVlcnlTZWxlY3RvcigndGgnKSB8fCBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RkJykpO1xuICAgICAgICBjb25zdCBpc0NvbHVtbkhlYWRlciA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaXNDb2x1bW5IZWFkZXIgPyBzdGlja3lDZWxscyA6IFtuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRdO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmNlbGxzUG9zaXRpb25DaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5kYW5nZXJvdXNPclNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXNlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGlmICgodGhpcy5zZWxlY3Rpb24gJiYgIXRoaXMucmVhZG9ubHkpIHx8IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiB8fCB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0NvbnRyb2xzID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbih0aGlzLmVkaXRvciwgc2VsZWN0aW9uLmZvY3VzLnBhdGgpO1xuICAgICAgICAgICAgdGhpcy5pc0luVGFibGUgPSBzdGFydFBvc2l0aW9uLmlzSW5UYWJsZSgpICYmIGVuZFBvc2l0aW9uLmlzSW5UYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0luVGFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlZmF1bHRDZWxsV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnJvd0NvbnRyb2xzSW5uZXIpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMucm93Q29udHJvbHNJbm5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgICAgIC8vIOiBmueEpuS5i+WQjuS8muWQkeW3puWBj+enu+S4gOS4qiBjb250cm9s77yILTEx77yJ77yM6KeBIC50aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBUQUJMRV9DT05UUk9MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKCh3aWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnY29sJykuZm9yRWFjaCgoZWxlOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbXBhdGlibGUgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB3aWR0aCBjYW5ub3QgYmUgb2J0YWluZWQgdW5kZXIgc2FmYXJpICNXSUstOTY0M1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh7IHdpZHRoOiBlbGUuY2xpZW50V2lkdGggfHwgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlKGVsZS5zdHlsZS53aWR0aCkgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEVkaXRvciBjb250YWluZXIgd2lkdGggY2hhbmdlcywgcmVzdWx0aW5nIGluIGNvbHVtbiB3aWR0aHMgbm8gbG9uZ2VyIHZhbGlkICNXSUstNjc2NlxuICAgICAgICAgICAgY29uc3Qgd2FybmluZyA9IHRoaXMuZWxlbWVudC5jb2x1bW5zLnNvbWUoKGNvbCwgaW5kZXgpID0+IGNvbC53aWR0aCAhPT0gY29sdW1uc1tpbmRleF0/LndpZHRoKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgdHIpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRyLmNoaWxkcmVuLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogTnVtYmVyKCh0YWJsZVdpZHRoIC8gdHIuY2hpbGRyZW4ubGVuZ3RoIC0gdHIuY2hpbGRyZW4ubGVuZ3RoKS50b0ZpeGVkKDIpKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVJvd3MoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghcm93LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCByb3cpO1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQgfSwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUm93SGVpZ2h0KCkge1xuICAgICAgICBjb25zdCByb3dFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmNoaWxkcmVuO1xuICAgICAgICBpZiAocm93RWxlbWVudHMpIHtcbiAgICAgICAgICAgIChbLi4ucm93RWxlbWVudHNdIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXSkubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQocm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHRoaXMuZWxlbWVudC5jaGlsZHJlbltpbmRleF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Db2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBbLi4udGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXSA9IGNvbHMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogZ2V0RWxlbWVudFdpZHRoKGNvbCkgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25Db2xNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghIXRoaXMuc2VsZWN0aW9uICYmIHRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJEYW5nZXJvdXNDZWxscygpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENvbHVtbih0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUm93TW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RSb3codGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvblNlbGVjdFRhYmxlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0VGFibGUodGhpcy5lZGl0b3IpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQtY2VsbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGwoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlQ29udGV4dE1lbnUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRhYmxlU2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VUb29sYmFyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhdGNoIGZvciByaWdodCBjbGljayBzZWxlY3QgbmV4dCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIEVkaXRvci5zdGFydCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5PblNlbGVjdGVkQ2VsbHMoKSB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vkb3duJykucGlwZShmaWx0ZXIoKGU6IE1vdXNlRXZlbnQpID0+IGUuYnV0dG9uICE9PSAyKSksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc1ZpcnR1YWxLZXkoZSkgJiYgIXRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQ7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29sb3JQYW5lbChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsUG9zaXRpb25zID0gdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDZWxsUG9zaXRpb25zPy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzQ29udGVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYWJsZUVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50IHx8ICF0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckxhc3RGb2N1c1BhdGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+ICEhZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5SG90a2V5KCdtb2QnLCBldmVudCkgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5wb2ludGVyU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAodGhpcy50Ym9keUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZvY3VzZWQtY2VsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsICYmIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcblxuICAgICAgICBjb25zdCBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzID0gKHBvaW50ZXJFdmVudHNTdHlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0aVJvdyBvZiBzdGlja3lSb3dzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzdGlSb3csICdwb2ludGVyLWV2ZW50cycsIHBvaW50ZXJFdmVudHNTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3doZWVsJylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIOWkhOeQhuagh+mimOihjOWbuuWumuaXtueahOa7muWKqOi3n+maj1xuICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ2F1dG8nKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCkge1xuICAgICAgICAvLyDliKTmlq3mmK/lkKblh7rnjrDlm7rlrprmoIfpopjooYxcbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RpUm93IG9mIHN0aWNreVJvd3MpIHtcbiAgICAgICAgICAgICAgICAvLyDkv67lpI3ojrflj5Ygc2Nyb2xsTGVmdCDlsZ7mgKflvJXotbfnmoTmtY/op4jlmajph43nu5jvvIzlr7zoh7Tot7Pliqjpl67popggI1dJSy0xMTAzOFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWQjOatpea7muWKqOeKtuaAgeWIsCAudGhlLXN0aWNreS1yb3dcbiAgICAgICAgICAgICAgICAgICAgc3RpUm93LnNjcm9sbExlZnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgY29uc3QgY29ybmVyQ29udHJvbCA9IHRoaXMuY29ybmVyQ29udHJvbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCByb3dDb250cm9sID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0aWNreUVsZW1lbnRzID0gWy4uLnN0aWNreVJvd3MsIGNvcm5lckNvbnRyb2wsIHJvd0NvbnRyb2xdO1xuICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5pc0luVGFibGUgPyAtVEFCTEVfQ09OVFJPTCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wICYmIHRoaXMuaXNTY3JvbGxYKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvcm5lckNvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICAgICAgcm93Q29udHJvbCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RpY2t5RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbEJ1dHRvbldpZHRoID0gKCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudE1vdXNlZG93biQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtd3JhcHBlclwiICN0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcpLFxuICAgICAgICAnY29udHJvbC1hY3RpdmUnOiBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWJ1dHRvblwiIChtb3VzZWRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtcm93LW1hcmtlclwiICpuZ0lmPVwiIWhlYWRlclJvd1wiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZykgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0Zvcj1cImxldCBjb2wgb2YgcHJpbnRDb2x1bW5zID8/IGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9scy13cmFwcGVyIHRoZS1zdGlja3ktcm93XCIgI2NvbHVtbkNvbnRyb2xzV3JhcHBlcj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICNjb2xDb250cm9sXG4gICAgICAgICAgICBjbGFzcz1cInRoZS10YWJsZS1jb2wtY29udHJvbHNcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgY29sQ29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGbkNvbENvbnRyb2xzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2NvbnRyb2wtYWN0aXZlJzogdGFibGVTdG9yZS5zZWxlY3RlZENvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSxcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c0NvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNvbE1vdXNlZG93bigkZXZlbnQsIGkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNvbHVtblwiXG4gICAgICAgICAgICAgIFthdF09XCJpICsgMVwiXG4gICAgICAgICAgICAgIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIlxuICAgICAgICAgICAgICBbcGFyZW50RWxlbWVudF09XCJjb2xDb250cm9sXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5ICN0Ym9keT5cbiAgICAgICAgPHNsYXRlLWNoaWxkcmVuIFtjaGlsZHJlbl09XCJjaGlsZHJlblwiIFtjb250ZXh0XT1cImNoaWxkcmVuQ29udGV4dFwiIFt2aWV3Q29udGV4dF09XCJ2aWV3Q29udGV4dFwiPiA8L3NsYXRlLWNoaWxkcmVuPlxuICAgICAgPC90Ym9keT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LWxlZnQtc2hhZG93XCJcbiAgICAgICAgI2hlYWRlclJvd0xlZnRTaGFkb3dcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJvdy1zaGFkb3cgaGVhZGVyLXJvdy1yaWdodC1zaGFkb3dcIiAjaGVhZGVyUm93UmlnaHRTaGFkb3cgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj48L2Rpdj5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19