@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
470 lines • 47.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: data-table-cell.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, Input, NgZone, ViewChild } from '@angular/core';
import { InputNumberComponent } from '@duoduo-oba/ng-devui/input-number';
import { SelectComponent } from '@duoduo-oba/ng-devui/select';
import { TreeSelectComponent } from '@duoduo-oba/ng-devui/tree-select';
import { stopPropagationIfExist } from '@duoduo-oba/ng-devui/utils';
import { DataTableRowComponent } from './data-table-row.component';
import { DataTableComponent } from './data-table.component';
import { EditorDirective } from './editor-host.directive';
import { DataTableColumnTmplComponent } from './tmpl/data-table-column-tmpl.component';
var DataTableCellComponent = /** @class */ (function () {
function DataTableCellComponent(dt, changeDetectorRef, componentFactoryResolver, rowComponent, cellRef, ngZone) {
this.dt = dt;
this.changeDetectorRef = changeDetectorRef;
this.componentFactoryResolver = componentFactoryResolver;
this.rowComponent = rowComponent;
this.cellRef = cellRef;
this.ngZone = ngZone;
this.clickCount = 0; // 记录点击次数
}
/**
* @return {?}
*/
DataTableCellComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.forceUpdateSubscription = this.rowComponent.forceUpdateEvent.subscribe((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this.forceUpdate(); }));
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
_this.cellRef.nativeElement.addEventListener('click', _this.onCellClick.bind(_this));
_this.cellRef.nativeElement.addEventListener('dblclick', _this.onCellDBClick.bind(_this));
}));
};
/**
* @param {?} changes
* @return {?}
*/
DataTableCellComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
/** @type {?} */
var rowItem = changes['rowItem'];
if (rowItem) {
this.updateEditable(rowItem);
}
};
/**
* @param {?} rowItem
* @return {?}
*/
DataTableCellComponent.prototype.updateEditable = /**
* @param {?} rowItem
* @return {?}
*/
function (rowItem) {
var _this = this;
/** @type {?} */
var currentConfig = rowItem.currentValue['$editDeniedConfig'];
if (!currentConfig) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
/** @type {?} */
var index = currentConfig.findIndex((/**
* @param {?} config
* @return {?}
*/
function (config) {
return config === _this.column.field;
}));
if (index === -1) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
if (!this.fieldEditDenied) {
this.fieldEditDenied = true;
}
}
}
};
/**
* @param {?} $event
* @return {?}
*/
DataTableCellComponent.prototype.onCellClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
/** @type {?} */
var cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
};
this.clickCount++;
if (this.clickCount === 1) {
this.timeoutId = setTimeout((/**
* @return {?}
*/
function () {
if (_this.clickCount === 1) {
_this.dt.onCellClick(cellSelectedEventArg);
}
_this.clickCount = 0;
clearTimeout(_this.timeoutId);
}), this.timeout);
}
};
/**
* @param {?} $event
* @return {?}
*/
DataTableCellComponent.prototype.onCellDBClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
/** @type {?} */
var cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
};
this.dt.onCellDBClick(cellSelectedEventArg);
};
/**
* @return {?}
*/
DataTableCellComponent.prototype.forceUpdate = /**
* @return {?}
*/
function () {
this.changeDetectorRef.markForCheck();
};
/**
* @param {?=} $event
* @return {?}
*/
DataTableCellComponent.prototype.finishCellEdit = /**
* @param {?=} $event
* @return {?}
*/
function ($event) {
if (this.editModel !== 'cell') {
return;
}
this.isCellEdit = false;
this.editorHost.viewContainerRef.clear();
this.dynamicEditorActive = false;
this.templateEditorActive = false;
// tslint:disable-next-line:no-unused-expression
this.documentClickSubscription && this.unSubscription(this.documentClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription);
stopPropagationIfExist($event);
this.dt.onCellEditEnd({
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
});
};
/**
* @param {?} column
* @param {?} rowItem
* @return {?}
*/
DataTableCellComponent.prototype.isCellEditEnable = /**
* @param {?} column
* @param {?} rowItem
* @return {?}
*/
function (column, rowItem) {
if (this.editModel === 'cell') {
return this.isCellEdit;
}
return this.isEditRow;
};
/**
* @return {?}
*/
DataTableCellComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// tslint:disable-next-line:no-unused-expression
this.forceUpdateSubscription && this.unSubscription(this.forceUpdateSubscription);
// tslint:disable-next-line:no-unused-expression
this.documentClickSubscription && this.unSubscription(this.documentClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellActionSubscription && this.unSubscription(this.cellActionSubscription);
};
/**
* @private
* @param {?} sbscription
* @return {?}
*/
DataTableCellComponent.prototype.unSubscription = /**
* @private
* @param {?} sbscription
* @return {?}
*/
function (sbscription) {
if (sbscription) {
sbscription.unsubscribe();
sbscription = null;
}
};
/**
* @return {?}
*/
DataTableCellComponent.prototype.creatCellEditor = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var componentFactory;
/** @type {?} */
var editorComponent;
switch (this.column.fieldType) {
case 'number':
editorComponent = InputNumberComponent;
break;
case 'select':
editorComponent = SelectComponent;
break;
case 'treeSelect':
editorComponent = TreeSelectComponent;
break;
default:
this.templateEditorActive = true;
break;
}
if (editorComponent) {
componentFactory = this.componentFactoryResolver.resolveComponentFactory(editorComponent);
/** @type {?} */
var viewContainerRef = this.editorHost.viewContainerRef;
viewContainerRef.clear();
/** @type {?} */
var componentRef = viewContainerRef.createComponent(componentFactory);
/** @type {?} */
var componentInstance_1 = componentRef.instance;
if (this.column.extraOptions) {
componentFactory.inputs.forEach((/**
* @param {?} input
* @return {?}
*/
function (input) {
if (_this.column.extraOptions[input.templateName]) {
componentInstance_1[input.propName] = _this.column.extraOptions[input.templateName];
}
}));
}
componentInstance_1.writeValue(this.rowItem[this.column.field]);
componentInstance_1.registerOnChange((/**
* @param {?} value
* @return {?}
*/
function (value) {
_this.rowItem[_this.column.field] = value;
if (_this.column.extraOptions && _this.column.extraOptions.finishEditingAfterValueChange) {
_this.finishCellEdit();
}
}));
this.dynamicEditorActive = true;
}
};
/**
* @param {?} $event
* @return {?}
*/
DataTableCellComponent.prototype.cellEditing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
$event.stopPropagation();
$event.preventDefault();
/** @type {?} */
var beforeEdit = Promise.resolve();
if (this.dt.beforeCellEdit) {
beforeEdit = this.dt.beforeCellEdit(this.rowItem, this.column);
}
beforeEdit.then((/**
* @param {?=} extraOptions
* @return {?}
*/
function (extraOptions) {
if (extraOptions) {
_this.column.extraOptions = extraOptions;
}
_this.dt.cellEditorClickEvent.emit($event);
/** @type {?} */
var cellSelectedEventArg = {
rowIndex: _this.rowIndex,
colIndex: _this.colIndex,
column: _this.column,
rowItem: _this.rowItem,
cellComponent: _this,
rowComponent: _this.rowComponent
};
if (_this.column.editable && _this.editModel === 'cell') {
_this.isCellEdit = true;
_this.creatCellEditor();
_this.documentClickSubscription = _this.dt.documentClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event === 'cancel' || !_this.cellRef.nativeElement.contains(event.target)) {
_this.ngZone.run((/**
* @return {?}
*/
function () {
_this.finishCellEdit();
}));
}
}));
_this.cellEditorClickSubscription = _this.dt.cellEditorClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (!_this.cellRef.nativeElement.contains(event.target)) {
_this.finishCellEdit();
}
}));
_this.dt.onCellEditStart(cellSelectedEventArg);
}
}));
};
/**
* @param {?} rowItem
* @return {?}
*/
DataTableCellComponent.prototype.toggleChildTable = /**
* @param {?} rowItem
* @return {?}
*/
function (rowItem) {
rowItem.$isChildTableOpen = !rowItem.$isChildTableOpen;
this.dt.onToggleChildrenTable(rowItem, rowItem.$isChildTableOpen);
};
DataTableCellComponent.decorators = [
{ type: Component, args: [{
selector: 'd-data-table-cell,[dDataTableCell]',
template: "<ng-template *ngIf=\"!column.editable || fieldEditDenied\" [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n\r\n<ng-container *ngIf=\"column.editable && !fieldEditDenied\">\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip === 'btn'\" class=\"cell-container\">\r\n <div class=\"cell-container-inner not-break modify-holder\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n <span class=\"cell-modify\" (click)=\"cellEditing($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\r\n <g id=\"cell-modify\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <path\r\n id=\"cell-modify-copy\"\r\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\r\n />\r\n </g>\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip !== 'btn'\" class=\"cell-editable\" (click)=\"cellEditing($event)\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n </div>\r\n <div [ngClass]=\"{ 'edit-padding-fix': dynamicEditorActive }\">\r\n <ng-template dEditorHost></ng-template>\r\n </div>\r\n <ng-template\r\n *ngIf=\"templateEditorActive\"\r\n [ngTemplateOutlet]=\"column.cellEditCmp ? column.cellEditCmp.template : column.fieldType === 'date' ? dateEditTempate : textEditTempate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem:rowItem,\r\n $implicit: this,\r\n row: rowComponent\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-container>\r\n\r\n<ng-template #cellViewTemp>\r\n <ng-container *ngIf=\"column.nestedColumn\">\r\n <span *ngIf=\"tableLevel > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: tableLevel * 16 + 'px' }\"></span>\r\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\r\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconFoldTable\"\r\n class=\"svg-icon-close-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-closeFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M12,7 L4,7 L4,9 L12,9 L12,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconFoldTable\" [innerHTML]=\"column.extraOptions?.iconFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconUnFoldTable\"\r\n class=\"svg-icon-open-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-openFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M7,7 L4,7 L4,9 L7,9 L7,12 L9,12 L9,9 L12,9 L12,7 L9,7 L9,4 L7,4 L7,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconUnFoldTable\" [innerHTML]=\"column.extraOptions?.iconUnFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.cellCmp ? column.cellCmp.template : textViewTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem: rowItem,\r\n cellItem: rowItem[column.field],\r\n cellValue: rowItem | disPlayCellValuePipe:rowIndex:column,\r\n $implicit: this,\r\n row: rowComponent,\r\n tableLevel: tableLevel\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-template>\r\n\r\n<ng-template let-cellValue=\"cellValue\" #textViewTemplate>\r\n <span [attr.title]=\"cellValue\">{{ cellValue }}</span>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #textEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"form-group full-width\">\r\n <div class=\"input-group full-width\">\r\n <input\r\n [dAutoFocus]=\"cell && cell.isCellEdit\"\r\n [type]=\"column.fieldType\"\r\n class=\"devui-form-control\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n [attr.maxlength]=\"column.extraOptions?.maxlength\"\r\n [attr.minlength]=\"column.extraOptions?.minlength\"\r\n [attr.pattern]=\"column.extraOptions?.pattern\"\r\n (keydown.enter)=\"cell && cell.finishCellEdit($event)\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n />\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #dateEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"devui-form-group\">\r\n <div class=\"devui-input-group\">\r\n <input\r\n class=\"devui-form-control search\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n dDatepicker\r\n appendToBody\r\n [dateFormat]=\"column.extraOptions?.dateFormat\"\r\n #datePicker=\"datepicker\"\r\n (ngModelChange)=\"!column.extraOptions?.showTime && cell && cell.finishCellEdit()\"\r\n [maxDate]=\"column.extraOptions?.maxDate\"\r\n [minDate]=\"column.extraOptions?.minDate\"\r\n [cssClass]=\"column.extraOptions?.cssClass\"\r\n [dateConfig]=\"column.extraOptions?.dateConfig\"\r\n [locale]=\"column.extraOptions?.locale\"\r\n [customViewTemplate]=\"column.extraOptions?.customViewTemplate\"\r\n [disabled]=\"column.extraOptions?.disabled\"\r\n [yearNumber]=\"column.extraOptions?.yearNumber || 12\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n [autoOpen]=\"true\"\r\n [showTime]=\"column.extraOptions?.showTime\"\r\n />\r\n <div class=\"devui-input-group-addon\" (click)=\"datePicker.toggle($event, true)\">\r\n <i class=\"icon icon-calendar\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n",
styles: [""]
}] }
];
/** @nocollapse */
DataTableCellComponent.ctorParameters = function () { return [
{ type: DataTableComponent },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: DataTableRowComponent },
{ type: ElementRef },
{ type: NgZone }
]; };
DataTableCellComponent.propDecorators = {
editorHost: [{ type: ViewChild, args: [EditorDirective, { static: false },] }],
rowIndex: [{ type: Input }],
colIndex: [{ type: Input }],
column: [{ type: Input }],
rowItem: [{ type: Input }],
editModel: [{ type: Input }],
isEditRow: [{ type: Input }],
timeout: [{ type: Input }],
tableLevel: [{ type: Input }]
};
return DataTableCellComponent;
}());
export { DataTableCellComponent };
if (false) {
/** @type {?} */
DataTableCellComponent.prototype.editorHost;
/** @type {?} */
DataTableCellComponent.prototype.rowIndex;
/** @type {?} */
DataTableCellComponent.prototype.colIndex;
/** @type {?} */
DataTableCellComponent.prototype.column;
/** @type {?} */
DataTableCellComponent.prototype.rowItem;
/** @type {?} */
DataTableCellComponent.prototype.editModel;
/** @type {?} */
DataTableCellComponent.prototype.isEditRow;
/** @type {?} */
DataTableCellComponent.prototype.timeout;
/** @type {?} */
DataTableCellComponent.prototype.tableLevel;
/** @type {?} */
DataTableCellComponent.prototype.isCellEdit;
/** @type {?} */
DataTableCellComponent.prototype.forceUpdateSubscription;
/** @type {?} */
DataTableCellComponent.prototype.documentClickSubscription;
/** @type {?} */
DataTableCellComponent.prototype.cellEditorClickSubscription;
/** @type {?} */
DataTableCellComponent.prototype.cellActionSubscription;
/** @type {?} */
DataTableCellComponent.prototype.clickCount;
/** @type {?} */
DataTableCellComponent.prototype.timeoutId;
/** @type {?} */
DataTableCellComponent.prototype.fieldEditDenied;
/** @type {?} */
DataTableCellComponent.prototype.templateEditorActive;
/** @type {?} */
DataTableCellComponent.prototype.dynamicEditorActive;
/** @type {?} */
DataTableCellComponent.prototype.dt;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.componentFactoryResolver;
/** @type {?} */
DataTableCellComponent.prototype.rowComponent;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.cellRef;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RhdGEtdGFibGUvIiwic291cmNlcyI6WyJkYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFDdkQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFdkY7SUEwQkUsZ0NBQW1CLEVBQXNCLEVBQVUsaUJBQW9DLEVBQzdFLHdCQUFrRCxFQUNuRCxZQUFtQyxFQUFVLE9BQW1CLEVBQVUsTUFBYztRQUY5RSxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDN0UsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNuRCxpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVJqRyxlQUFVLEdBQUcsQ0FBQyxDQUFD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QUFDO1FBQ3ZELElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7O2dCQS9QRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLG9DQUFvQztvQkFDOUMsczRPQUErQzs7aUJBRWhEOzs7O2dCQVJRLGtCQUFrQjtnQkFSbEIsaUJBQWlCO2dCQUFhLHdCQUF3QjtnQkFPdEQscUJBQXFCO2dCQVBtQyxVQUFVO2dCQUFTLE1BQU07Ozs2QkFrQnZGLFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzJCQUM1QyxLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsS0FBSzswQkFDTCxLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsS0FBSzswQkFDTCxLQUFLOzZCQUNMLEtBQUs7O0lBa1BSLDZCQUFDO0NBQUEsQUFoUUQsSUFnUUM7U0EzUFksc0JBQXNCOzs7SUFDakMsNENBQTJFOztJQUMzRSwwQ0FBMEI7O0lBQzFCLDBDQUEwQjs7SUFDMUIsd0NBQThDOztJQUM5Qyx5Q0FBc0I7O0lBQ3RCLDJDQUEyQjs7SUFDM0IsMkNBQTRCOztJQUM1Qix5Q0FBeUI7O0lBQ3pCLDRDQUE0Qjs7SUFDNUIsNENBQW9COztJQUNwQix5REFBc0M7O0lBQ3RDLDJEQUF3Qzs7SUFDeEMsNkRBQTBDOztJQUMxQyx3REFBcUM7O0lBQ3JDLDRDQUFlOztJQUNmLDJDQUFVOztJQUNWLGlEQUF5Qjs7SUFDekIsc0RBQThCOztJQUM5QixxREFBNkI7O0lBRWpCLG9DQUE2Qjs7Ozs7SUFBRSxtREFBNEM7Ozs7O0lBQ3JGLDBEQUEwRDs7SUFDMUQsOENBQTBDOzs7OztJQUFFLHlDQUEyQjs7Ozs7SUFBRSx3Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnbmctZGV2dWkvaW5wdXQtbnVtYmVyJztcclxuaW1wb3J0IHsgU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnbmctZGV2dWkvc2VsZWN0JztcclxuaW1wb3J0IHsgVHJlZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJ25nLWRldnVpL3RyZWUtc2VsZWN0JztcclxuaW1wb3J0IHsgc3RvcFByb3BhZ2F0aW9uSWZFeGlzdCB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlUm93Q29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLXJvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9lZGl0b3ItaG9zdC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5UbXBsQ29tcG9uZW50IH0gZnJvbSAnLi90bXBsL2RhdGEtdGFibGUtY29sdW1uLXRtcGwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1kYXRhLXRhYmxlLWNlbGwsW2REYXRhVGFibGVDZWxsXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUtY2VsbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNlbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKEVkaXRvckRpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pIGVkaXRvckhvc3Q6IEVkaXRvckRpcmVjdGl2ZTtcclxuICBASW5wdXQoKSByb3dJbmRleDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGNvbEluZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgY29sdW1uOiBEYXRhVGFibGVDb2x1bW5UbXBsQ29tcG9uZW50O1xyXG4gIEBJbnB1dCgpIHJvd0l0ZW06IGFueTtcclxuICBASW5wdXQoKSBlZGl0TW9kZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBpc0VkaXRSb3c6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgdGltZW91dDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHRhYmxlTGV2ZWw6IG51bWJlcjtcclxuICBpc0NlbGxFZGl0OiBib29sZWFuO1xyXG4gIGZvcmNlVXBkYXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNlbGxBY3Rpb25TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBjbGlja0NvdW50ID0gMDsgLy8g6K6w5b2V54K55Ye75qyh5pWwXHJcbiAgdGltZW91dElkOyAvLyDlu7bml7ZpZFxyXG4gIGZpZWxkRWRpdERlbmllZDogYm9vbGVhbjtcclxuICB0ZW1wbGF0ZUVkaXRvckFjdGl2ZTogYm9vbGVhbjsgLy8g6YCa6L+H5qih5p2/55Sf5oiQ55qE57yW6L6R5o6n5Lu25r+A5rS7XHJcbiAgZHluYW1pY0VkaXRvckFjdGl2ZTogYm9vbGVhbjsgLy8g5Yqo5oCB55Sf5oiQ55qE57yW6L6R5o6n5Lu25r+A5rS7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkdDogRGF0YVRhYmxlQ29tcG9uZW50LCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwdWJsaWMgcm93Q29tcG9uZW50OiBEYXRhVGFibGVSb3dDb21wb25lbnQsIHByaXZhdGUgY2VsbFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm93Q29tcG9uZW50LmZvcmNlVXBkYXRlRXZlbnQuc3Vic2NyaWJlKF8gPT4gdGhpcy5mb3JjZVVwZGF0ZSgpKTtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAnY2xpY2snLFxyXG4gICAgICAgIHRoaXMub25DZWxsQ2xpY2suYmluZCh0aGlzKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNlbGxSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICdkYmxjbGljaycsXHJcbiAgICAgICAgdGhpcy5vbkNlbGxEQkNsaWNrLmJpbmQodGhpcylcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcEtleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pIHtcclxuICAgIGNvbnN0IHJvd0l0ZW0gPSBjaGFuZ2VzWydyb3dJdGVtJ107XHJcbiAgICBpZiAocm93SXRlbSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUVkaXRhYmxlKHJvd0l0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRWRpdGFibGUocm93SXRlbSkge1xyXG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IHJvd0l0ZW0uY3VycmVudFZhbHVlWyckZWRpdERlbmllZENvbmZpZyddO1xyXG4gICAgaWYgKCFjdXJyZW50Q29uZmlnKSB7XHJcbiAgICAgIGlmICh0aGlzLmZpZWxkRWRpdERlbmllZCkge1xyXG4gICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudENvbmZpZy5maW5kSW5kZXgoKGNvbmZpZzogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZyA9PT0gdGhpcy5jb2x1bW4uZmllbGQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmllbGRFZGl0RGVuaWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkRWRpdERlbmllZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmllbGRFZGl0RGVuaWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkRWRpdERlbmllZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNlbGxDbGljaygkZXZlbnQpIHtcclxuICAgIGNvbnN0IGNlbGxTZWxlY3RlZEV2ZW50QXJnID0ge1xyXG4gICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmNsaWNrQ291bnQrKztcclxuICAgIGlmICh0aGlzLmNsaWNrQ291bnQgPT09IDEpIHtcclxuICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jbGlja0NvdW50ID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLmR0Lm9uQ2VsbENsaWNrKGNlbGxTZWxlY3RlZEV2ZW50QXJnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGlja0NvdW50ID0gMDtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xyXG4gICAgICB9LCB0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DZWxsREJDbGljaygkZXZlbnQpIHtcclxuICAgIGNvbnN0IGNlbGxTZWxlY3RlZEV2ZW50QXJnID0ge1xyXG4gICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudFxyXG4gICAgfTtcclxuICAgIHRoaXMuZHQub25DZWxsREJDbGljayhjZWxsU2VsZWN0ZWRFdmVudEFyZyk7XHJcbiAgfVxyXG5cclxuICBmb3JjZVVwZGF0ZSgpIHtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBmaW5pc2hDZWxsRWRpdCgkZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZWRpdE1vZGVsICE9PSAnY2VsbCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNDZWxsRWRpdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lZGl0b3JIb3N0LnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuICAgIHRoaXMuZHluYW1pY0VkaXRvckFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50ZW1wbGF0ZUVkaXRvckFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uICYmIHRoaXMudW5TdWJzY3JpcHRpb24odGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5jZWxsRWRpdG9yQ2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbik7XHJcbiAgICBzdG9wUHJvcGFnYXRpb25JZkV4aXN0KCRldmVudCk7XHJcblxyXG4gICAgdGhpcy5kdC5vbkNlbGxFZGl0RW5kKHtcclxuICAgICAgcm93SW5kZXg6IHRoaXMucm93SW5kZXgsXHJcbiAgICAgIGNvbEluZGV4OiB0aGlzLmNvbEluZGV4LFxyXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxyXG4gICAgICByb3dJdGVtOiB0aGlzLnJvd0l0ZW0sXHJcbiAgICAgIGNlbGxDb21wb25lbnQ6IHRoaXMsXHJcbiAgICAgIHJvd0NvbXBvbmVudDogdGhpcy5yb3dDb21wb25lbnRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNDZWxsRWRpdEVuYWJsZShjb2x1bW4sIHJvd0l0ZW0pIHtcclxuICAgIGlmICh0aGlzLmVkaXRNb2RlbCA9PT0gJ2NlbGwnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQ2VsbEVkaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaXNFZGl0Um93O1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cclxuICAgIHRoaXMuZm9yY2VVcGRhdGVTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmZvcmNlVXBkYXRlU3Vic2NyaXB0aW9uKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uICYmIHRoaXMudW5TdWJzY3JpcHRpb24odGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5jZWxsRWRpdG9yQ2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbik7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cclxuICAgIHRoaXMuY2VsbEFjdGlvblN1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuY2VsbEFjdGlvblN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuU3Vic2NyaXB0aW9uKHNic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24pIHtcclxuICAgIGlmIChzYnNjcmlwdGlvbikge1xyXG4gICAgICBzYnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICBzYnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRDZWxsRWRpdG9yKCkge1xyXG4gICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk7XHJcbiAgICBsZXQgZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgc3dpdGNoICh0aGlzLmNvbHVtbi5maWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICBlZGl0b3JDb21wb25lbnQgPSBJbnB1dE51bWJlckNvbXBvbmVudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnc2VsZWN0JzpcclxuICAgICAgICBlZGl0b3JDb21wb25lbnQgPSBTZWxlY3RDb21wb25lbnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RyZWVTZWxlY3QnOlxyXG4gICAgICAgIGVkaXRvckNvbXBvbmVudCA9IFRyZWVTZWxlY3RDb21wb25lbnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvckFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVkaXRvckNvbXBvbmVudCkge1xyXG4gICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZWRpdG9yQ29tcG9uZW50KTtcclxuICAgICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IHRoaXMuZWRpdG9ySG9zdC52aWV3Q29udGFpbmVyUmVmO1xyXG4gICAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50PHsgd3JpdGVWYWx1ZTogRnVuY3Rpb24sIHJlZ2lzdGVyT25DaGFuZ2U6IEZ1bmN0aW9uIH0+KGNvbXBvbmVudEZhY3RvcnkpO1xyXG4gICAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgICAgaWYgKHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucykge1xyXG4gICAgICAgIGNvbXBvbmVudEZhY3RvcnkuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zW2lucHV0LnRlbXBsYXRlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2VbaW5wdXQucHJvcE5hbWVdID0gdGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zW2lucHV0LnRlbXBsYXRlTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgY29tcG9uZW50SW5zdGFuY2Uud3JpdGVWYWx1ZSh0aGlzLnJvd0l0ZW1bdGhpcy5jb2x1bW4uZmllbGRdKTtcclxuICAgICAgY29tcG9uZW50SW5zdGFuY2UucmVnaXN0ZXJPbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLnJvd0l0ZW1bdGhpcy5jb2x1bW4uZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucyAmJiB0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnMuZmluaXNoRWRpdGluZ0FmdGVyVmFsdWVDaGFuZ2UpIHtcclxuICAgICAgICAgIHRoaXMuZmluaXNoQ2VsbEVkaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmR5bmFtaWNFZGl0b3JBY3RpdmUgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2VsbEVkaXRpbmcoJGV2ZW50KSB7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGxldCBiZWZvcmVFZGl0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICBpZiAodGhpcy5kdC5iZWZvcmVDZWxsRWRpdCkge1xyXG4gICAgICBiZWZvcmVFZGl0ID0gdGhpcy5kdC5iZWZvcmVDZWxsRWRpdCh0aGlzLnJvd0l0ZW0sIHRoaXMuY29sdW1uKTtcclxuICAgIH1cclxuICAgIGJlZm9yZUVkaXQudGhlbigoZXh0cmFPcHRpb25zPzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChleHRyYU9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnMgPSBleHRyYU9wdGlvbnM7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kdC5jZWxsRWRpdG9yQ2xpY2tFdmVudC5lbWl0KCRldmVudCk7XHJcbiAgICAgIGNvbnN0IGNlbGxTZWxlY3RlZEV2ZW50QXJnID0ge1xyXG4gICAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICAgIGNvbEluZGV4OiB0aGlzLmNvbEluZGV4LFxyXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICAgIGNlbGxDb21wb25lbnQ6IHRoaXMsXHJcbiAgICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4uZWRpdGFibGUgJiYgdGhpcy5lZGl0TW9kZWwgPT09ICdjZWxsJykge1xyXG4gICAgICAgIHRoaXMuaXNDZWxsRWRpdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jcmVhdENlbGxFZGl0b3IoKTtcclxuICAgICAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gPSB0aGlzLmR0LmRvY3VtZW50Q2xpY2tFdmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ2NhbmNlbCcgfHwgIXRoaXMuY2VsbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2hDZWxsRWRpdCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMuZHQuY2VsbEVkaXRvckNsaWNrRXZlbnQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2VsbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbmlzaENlbGxFZGl0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZHQub25DZWxsRWRpdFN0YXJ0KGNlbGxTZWxlY3RlZEV2ZW50QXJnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDaGlsZFRhYmxlKHJvd0l0ZW0pIHtcclxuICAgIHJvd0l0ZW0uJGlzQ2hpbGRUYWJsZU9wZW4gPSAhcm93SXRlbS4kaXNDaGlsZFRhYmxlT3BlbjtcclxuICAgIHRoaXMuZHQub25Ub2dnbGVDaGlsZHJlblRhYmxlKHJvd0l0ZW0sIHJvd0l0ZW0uJGlzQ2hpbGRUYWJsZU9wZW4pO1xyXG4gIH1cclxufVxyXG4iXX0=