geminis-ng
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.14.
194 lines • 25.6 kB
JavaScript
import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { NzModalService } from 'ng-zorro-antd/modal';
import { NzTableComponent } from 'ng-zorro-antd/table';
import { GnTableColumnDirective } from './table-column.directive';
import { HttpClient } from '@angular/common/http';
import { GnObjectUtils, pipeTypes } from 'geminis-ng-core';
import { GnMessageService } from '../message-service/message-service';
import { RemoteDataStrategy } from './RemoteDataStrategy';
import { LocalDataStrategy } from './LocalDataStrategy';
export class GnTableComponent {
constructor(http, modalService, messageService) {
this.http = http;
this.modalService = modalService;
this.messageService = messageService;
this.dataStrategies = {};
this.includes = [];
this.sorts = [];
this.data = [];
this.dataTotal = 0;
this.pageIndex = 1;
this.pageSize = 10;
this.showPagination = true;
this.showSizeChanger = true;
this.autoLoadData = true;
this.selectionMode = 'multi';
this.dataStrategy = 'remote';
this.dataSaved = new EventEmitter();
this.dataDeleted = new EventEmitter();
this.dataLoaded = new EventEmitter();
this.selectionStatus = {};
this.selected = [];
this.selectedKeys = [];
this.isSelected = false;
this.isAllSelected = false;
this.isSomeSelected = false;
this.isSingleSelected = false;
this.editData = null;
this.isLoading = false;
this.dataStrategies.remote = new RemoteDataStrategy(this);
this.dataStrategies.local = new LocalDataStrategy(this);
}
getValue(row, key) {
return GnObjectUtils.getValue(row, key);
}
getValueWithPipe(row, key, pipe, pipeArgs) {
if (!pipe) {
return this.getValue(row, key);
}
const pipeTransform = pipeTypes[pipe];
if (!pipeTransform) {
throw new Error('管道[' + pipe + ']未注册');
}
const value = this.getValue(row, key);
return pipeTransform.transform(value, pipeArgs);
}
loadData() {
this.isLoading = true;
return this.dataStrategies[this.dataStrategy].load()
.then((resp) => {
this.data = resp === null || resp === void 0 ? void 0 : resp.content;
this.dataTotal = resp === null || resp === void 0 ? void 0 : resp.totalElements;
this.dataLoaded.emit(this.data);
return this.data;
})
.catch(error => {
this.messageService.error('获取数据错误');
throw error;
})
.finally(() => {
this.isLoading = false;
});
}
loadDataAndCleanSelection() {
this.changeAllSelectStatus(false);
this.loadData();
}
deleteData(url, id) {
this.modalService.confirm({
nzContent: '确定删除所选数据?',
nzOnOk: () => {
this.isLoading = true;
return this.dataStrategies[this.dataStrategy].delete(url, id)
.then(() => {
this.messageService.success('删除数据成功');
this.dataDeleted.emit();
})
.catch(err => {
this.messageService.error('删除数据错误');
console.error(err);
})
.finally(() => {
this.isLoading = false;
this.loadDataAndCleanSelection();
});
}
}, 'confirm');
}
deleteSelectedData() {
this.deleteData(this.url, this.selectedKeys);
}
refreshSelectionStatus() {
this.selected = this.data.filter(item => this.selectionStatus[this.getValue(item, this.dataKey)]);
this.selectedKeys = this.selected.map(item => this.getValue(item, this.dataKey));
this.isSelected = this.selectedKeys.length > 0;
this.isAllSelected = this.isSelected && this.selectedKeys.length === this.data.length;
this.isSomeSelected = this.isSelected && this.selectedKeys.length < this.data.length;
this.isSingleSelected = this.selectedKeys.length === 1;
this.selectedKey = this.isSelected ? this.selectedKeys[0] : null;
this.selectedOne = this.isSelected ? this.selected[0] : null;
}
changeSelectStatus(key) {
if (this.selectionMode === 'none') {
return;
}
if (this.selectionMode === 'single') {
this.selectionStatus = {};
}
this.selectionStatus[key] = !this.selectionStatus[key];
this.refreshSelectionStatus();
}
changeAllSelectStatus(selected) {
this.data.forEach(item => this.selectionStatus[this.getValue(item, this.dataKey)] = selected);
this.refreshSelectionStatus();
}
selectOne(dataKey) {
this.select([dataKey]);
}
select(dataKeys) {
this.changeAllSelectStatus(false);
dataKeys.forEach(dataKey => this.selectionStatus[dataKey] = true);
this.refreshSelectionStatus();
}
ngOnInit() {
if (this.autoLoadData) {
this.loadData();
}
}
refreshData(data) {
this.data = data;
this.dataTotal = data.length;
}
startEdit(data) {
this.editData = data;
}
endEdit() {
this.isLoading = true;
this.dataStrategies[this.dataStrategy].save(this.url, this.editData)
.then((resp) => {
this.dataSaved.emit(this.editData);
this.editData = null;
})
.catch(error => {
this.messageService.error('更新数据错误');
throw error;
})
.finally(() => {
this.isLoading = false;
});
}
}
GnTableComponent.decorators = [
{ type: Component, args: [{
selector: 'gn-table',
template: "<nz-table\n [nzData]=\"data\"\n [nzLoading]=\"isLoading\"\n [nzFrontPagination]=\"false\"\n [nzShowPagination]=\"showPagination\"\n [nzTotal]=\"dataTotal\"\n [nzShowTotal]=\"totalTemplate\"\n [(nzPageIndex)]=\"pageIndex\"\n [(nzPageSize)]=\"pageSize\"\n (nzPageIndexChange)=\"loadData()\"\n [nzShowSizeChanger]=\"showSizeChanger\"\n (nzPageSizeChange)=\"loadData()\">\n <thead>\n <tr>\n <th class=\"selection\"\n *ngIf=\"selectionMode === 'multi'\"\n nzShowCheckbox\n [nzChecked]=\"isAllSelected\"\n [nzIndeterminate]=\"isSomeSelected\"\n (nzCheckedChange)=\"changeAllSelectStatus($event)\"></th>\n <th class=\"selection\"\n *ngIf=\"selectionMode === 'single'\"></th>\n <th *ngFor=\"let header of columns\" [innerHTML]=\"header.title\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data\" (click)=\"changeSelectStatus(getValue(row,dataKey))\">\n <td nzShowCheckbox *ngIf=\"selectionMode !== 'none'\"\n [(nzChecked)]=\"selectionStatus[getValue(row,dataKey)]\"\n (nzCheckedChange)=\"selectionMode === 'single'?selectOne(getValue(row,dataKey)):refreshSelectionStatus()\"></td>\n <td *ngFor=\"let body of columns\">\n <ng-container\n *ngIf=\"!body.templateRef; else template\">{{getValueWithPipe(row, body.id, body.pipe, body.pipeArgs)}}</ng-container>\n <ng-template #template [ngTemplateOutlet]=\"body.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-template>\n </td>\n </tr>\n </tbody>\n <ng-template #totalTemplate let-total>\u5171 {{ total }} \u6761\u8BB0\u5F55</ng-template>\n</nz-table>\n",
styles: [".selection{max-width:5rem}"]
},] }
];
GnTableComponent.ctorParameters = () => [
{ type: HttpClient },
{ type: NzModalService },
{ type: GnMessageService }
];
GnTableComponent.propDecorators = {
nzTable: [{ type: ViewChild, args: [NzTableComponent, { static: true },] }],
url: [{ type: Input }],
includes: [{ type: Input }],
filterGroup: [{ type: Input }],
sorts: [{ type: Input }],
data: [{ type: Input }],
dataKey: [{ type: Input }],
dataTotal: [{ type: Input }],
pageIndex: [{ type: Input }],
pageSize: [{ type: Input }],
showPagination: [{ type: Input }],
showSizeChanger: [{ type: Input }],
autoLoadData: [{ type: Input }],
selectionMode: [{ type: Input }],
dataStrategy: [{ type: Input }],
dataSaved: [{ type: Output }],
dataDeleted: [{ type: Output }],
dataLoaded: [{ type: Output }],
columns: [{ type: ContentChildren, args: [GnTableColumnDirective,] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VtaW5pcy1uZy9zcmMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFPdEQsTUFBTSxPQUFPLGdCQUFnQjtJQThDM0IsWUFBbUIsSUFBZ0IsRUFDaEIsWUFBNEIsRUFDNUIsY0FBZ0M7UUFGaEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBOUMzQyxtQkFBYyxHQUFvQyxFQUFFLENBQUM7UUFLcEQsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUV4QixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRWxCLFNBQUksR0FBVSxFQUFFLENBQUM7UUFFakIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUVkLGNBQVMs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LE1BQU07MEJBQ04sTUFBTTt5QkFDTixNQUFNO3NCQWVOLGVBQWUsU0FBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOek1vZGFsU2VydmljZX0gZnJvbSAnbmctem9ycm8tYW50ZC9tb2RhbCc7XG5pbXBvcnQge056VGFibGVDb21wb25lbnR9IGZyb20gJ25nLXpvcnJvLWFudGQvdGFibGUnO1xuaW1wb3J0IHtHblRhYmxlQ29sdW1uRGlyZWN0aXZlfSBmcm9tICcuL3RhYmxlLWNvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0duT2JqZWN0VXRpbHMsIHBpcGVUeXBlc30gZnJvbSAnZ2VtaW5pcy1uZy1jb3JlJztcbmltcG9ydCB7R25NZXNzYWdlU2VydmljZX0gZnJvbSAnLi4vbWVzc2FnZS1zZXJ2aWNlL21lc3NhZ2Utc2VydmljZSc7XG5pbXBvcnQge0RhdGFTdHJhdGVneX0gZnJvbSAnLi9EYXRhU3RyYXRlZ3knO1xuaW1wb3J0IHtSZW1vdGVEYXRhU3RyYXRlZ3l9IGZyb20gJy4vUmVtb3RlRGF0YVN0cmF0ZWd5JztcbmltcG9ydCB7TG9jYWxEYXRhU3RyYXRlZ3l9IGZyb20gJy4vTG9jYWxEYXRhU3RyYXRlZ3knO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnbi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHblRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwcml2YXRlIGRhdGFTdHJhdGVnaWVzOiB7IFtrZXk6IHN0cmluZ106IERhdGFTdHJhdGVneSB9ID0ge307XG5cbiAgQFZpZXdDaGlsZChOelRhYmxlQ29tcG9uZW50LCB7c3RhdGljOiB0cnVlfSkgbnpUYWJsZTogTnpUYWJsZUNvbXBvbmVudDtcblxuICBASW5wdXQoKSB1cmw6IHN0cmluZztcbiAgQElucHV0KCkgaW5jbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlckdyb3VwOiBhbnk7XG4gIEBJbnB1dCgpIHNvcnRzOiBhbnlbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGRhdGFLZXk6IHN0cmluZztcbiAgQElucHV0KCkgZGF0YVRvdGFsID0gMDtcblxuICBASW5wdXQoKSBwYWdlSW5kZXggPSAxO1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuICBASW5wdXQoKSBzaG93UGFnaW5hdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dTaXplQ2hhbmdlciA9IHRydWU7XG5cbiAgQElucHV0KCkgYXV0b0xvYWREYXRhID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiAnbm9uZScgfCAnc2luZ2xlJyB8ICdtdWx0aScgPSAnbXVsdGknO1xuXG4gIEBJbnB1dCgpIGRhdGFTdHJhdGVneTogJ3JlbW90ZScgfCAnbG9jYWwnID0gJ3JlbW90ZSc7XG5cblxuICBAT3V0cHV0KCkgZGF0YVNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZGF0YURlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkYXRhTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNlbGVjdGlvblN0YXR1czogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgc2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIHNlbGVjdGVkS2V5czogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRLZXk6IGFueTtcbiAgc2VsZWN0ZWRPbmU6IGFueTtcbiAgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICBpc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gIGlzU29tZVNlbGVjdGVkID0gZmFsc2U7XG4gIGlzU2luZ2xlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgZWRpdERhdGE6IGFueSA9IG51bGw7XG5cbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihHblRhYmxlQ29sdW1uRGlyZWN0aXZlKSBjb2x1bW5zOiBRdWVyeUxpc3Q8R25UYWJsZUNvbHVtbkRpcmVjdGl2ZT47XG5cbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHB1YmxpYyBtb2RhbFNlcnZpY2U6IE56TW9kYWxTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IEduTWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTdHJhdGVnaWVzLnJlbW90ZSA9IG5ldyBSZW1vdGVEYXRhU3RyYXRlZ3kodGhpcyk7XG4gICAgdGhpcy5kYXRhU3RyYXRlZ2llcy5sb2NhbCA9IG5ldyBMb2NhbERhdGFTdHJhdGVneSh0aGlzKTtcbiAgfVxuXG4gIGdldFZhbHVlKHJvdzogYW55LCBrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIEduT2JqZWN0VXRpbHMuZ2V0VmFsdWUocm93LCBrZXkpO1xuICB9XG5cbiAgZ2V0VmFsdWVXaXRoUGlwZShyb3c6IGFueSwga2V5OiBzdHJpbmcsIHBpcGU6IHN0cmluZywgcGlwZUFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBpZiAoIXBpcGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKHJvdywga2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlVHJhbnNmb3JtID0gcGlwZVR5cGVzW3BpcGVdO1xuICAgIGlmICghcGlwZVRyYW5zZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCfnrqHpgZNbJyArIHBpcGUgKyAnXeacquazqOWGjCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShyb3csIGtleSk7XG4gICAgcmV0dXJuIHBpcGVUcmFuc2Zvcm0udHJhbnNmb3JtKHZhbHVlLCBwaXBlQXJncyk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5kYXRhU3RyYXRlZ2llc1t0aGlzLmRhdGFTdHJhdGVneV0ubG9hZCgpXG4gICAgICAudGhlbigocmVzcDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHJlc3A/LmNvbnRlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVRvdGFsID0gcmVzcD8udG90YWxFbGVtZW50cztcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkLmVtaXQodGhpcy5kYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKCfojrflj5bmlbDmja7plJnor68nKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBsb2FkRGF0YUFuZENsZWFuU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlQWxsU2VsZWN0U3RhdHVzKGZhbHNlKTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBkZWxldGVEYXRhKHVybDogc3RyaW5nLCBpZDogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5jb25maXJtKHtcbiAgICAgIG56Q29udGVudDogJ+ehruWumuWIoOmZpOaJgOmAieaVsOaNru+8nycsXG4gICAgICBuek9uT2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhU3RyYXRlZ2llc1t0aGlzLmRhdGFTdHJhdGVneV0uZGVsZXRlKHVybCwgaWQpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKCfliKDpmaTmlbDmja7miJDlip8nKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YURlbGV0ZWQuZW1pdCgpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKCfliKDpmaTmlbDmja7plJnor68nKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhQW5kQ2xlYW5TZWxlY3Rpb24oKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAnY29uZmlybScpO1xuICB9XG5cbiAgZGVsZXRlU2VsZWN0ZWREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlRGF0YSh0aGlzLnVybCwgdGhpcy5zZWxlY3RlZEtleXMpO1xuICB9XG5cbiAgcmVmcmVzaFNlbGVjdGlvblN0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5kYXRhLmZpbHRlcihpdGVtID0+IHRoaXMuc2VsZWN0aW9uU3RhdHVzW3RoaXMuZ2V0VmFsdWUoaXRlbSwgdGhpcy5kYXRhS2V5KV0pO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXlzID0gdGhpcy5zZWxlY3RlZC5tYXAoaXRlbSA9PiB0aGlzLmdldFZhbHVlKGl0ZW0sIHRoaXMuZGF0YUtleSkpO1xuICAgIHRoaXMuaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRLZXlzLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWRLZXlzLmxlbmd0aCA9PT0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB0aGlzLmlzU29tZVNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWRLZXlzLmxlbmd0aCA8IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5pc1NpbmdsZVNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEtleXMubGVuZ3RoID09PSAxO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmlzU2VsZWN0ZWQgPyB0aGlzLnNlbGVjdGVkS2V5c1swXSA6IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZE9uZSA9IHRoaXMuaXNTZWxlY3RlZCA/IHRoaXMuc2VsZWN0ZWRbMF0gOiBudWxsO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0U3RhdHVzKGtleTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblN0YXR1cyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1trZXldID0gIXRoaXMuc2VsZWN0aW9uU3RhdHVzW2tleV07XG4gICAgdGhpcy5yZWZyZXNoU2VsZWN0aW9uU3RhdHVzKCk7XG4gIH1cblxuICBjaGFuZ2VBbGxTZWxlY3RTdGF0dXMoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuZm9yRWFjaChpdGVtID0+IHRoaXMuc2VsZWN0aW9uU3RhdHVzW3RoaXMuZ2V0VmFsdWUoaXRlbSwgdGhpcy5kYXRhS2V5KV0gPSBzZWxlY3RlZCk7XG4gICAgdGhpcy5yZWZyZXNoU2VsZWN0aW9uU3RhdHVzKCk7XG4gIH1cblxuICBzZWxlY3RPbmUoZGF0YUtleTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3QoW2RhdGFLZXldKTtcbiAgfVxuXG4gIHNlbGVjdChkYXRhS2V5czogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZUFsbFNlbGVjdFN0YXR1cyhmYWxzZSk7XG4gICAgZGF0YUtleXMuZm9yRWFjaChkYXRhS2V5ID0+IHRoaXMuc2VsZWN0aW9uU3RhdHVzW2RhdGFLZXldID0gdHJ1ZSk7XG4gICAgdGhpcy5yZWZyZXNoU2VsZWN0aW9uU3RhdHVzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvTG9hZERhdGEpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoRGF0YShkYXRhOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5kYXRhVG90YWwgPSBkYXRhLmxlbmd0aDtcbiAgfVxuXG4gIHN0YXJ0RWRpdChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXREYXRhID0gZGF0YTtcbiAgfVxuXG4gIGVuZEVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGF0YVN0cmF0ZWdpZXNbdGhpcy5kYXRhU3RyYXRlZ3ldLnNhdmUodGhpcy51cmwsIHRoaXMuZWRpdERhdGEpXG4gICAgICAudGhlbigocmVzcDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNhdmVkLmVtaXQodGhpcy5lZGl0RGF0YSk7XG4gICAgICAgIHRoaXMuZWRpdERhdGEgPSBudWxsO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoJ+abtOaWsOaVsOaNrumUmeivrycpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxufVxuIl19