@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
234 lines (233 loc) • 25.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef, Input } from "@angular/core";
import { LabelService } from "../service/label.service";
import { toPromise } from "../utils";
import { ErrorHandler } from "../error-handler/error-handler";
import { CreateEditLabelComponent } from "../create-edit-label/create-edit-label.component";
import { ConfirmationMessage } from "../confirmation-dialog/confirmation-message";
import { TranslateService } from "@ngx-translate/core";
import { ConfirmationDialogComponent } from "../confirmation-dialog/confirmation-dialog.component";
import { operateChanges, OperateInfo, OperationState } from "../operation/operate";
import { OperationService } from "../operation/operation.service";
export class LabelComponent {
/**
* @param {?} labelService
* @param {?} errorHandler
* @param {?} translateService
* @param {?} operationService
* @param {?} ref
*/
constructor(labelService, errorHandler, translateService, operationService, ref) {
this.labelService = labelService;
this.errorHandler = errorHandler;
this.translateService = translateService;
this.operationService = operationService;
this.ref = ref;
this.selectedRow = [];
this.projectId = 0;
}
/**
* @return {?}
*/
ngOnInit() {
this.retrieve(this.scope);
}
/**
* @param {?} scope
* @param {?=} name
* @return {?}
*/
retrieve(scope, name = "") {
this.loading = true;
this.selectedRow = [];
this.targetName = "";
toPromise(this.labelService.getLabels(scope, this.projectId, name))
.then(targets => {
this.targets = targets || [];
this.loading = false;
this.forceRefreshView(2000);
})
.catch(error => {
this.errorHandler.error(error);
this.loading = false;
});
}
/**
* @return {?}
*/
openModal() {
this.createEditLabel.openModal();
}
/**
* @return {?}
*/
reload() {
this.retrieve(this.scope);
}
/**
* @param {?} targetName
* @return {?}
*/
doSearchTargets(targetName) {
this.retrieve(this.scope, targetName);
}
/**
* @return {?}
*/
refreshTargets() {
this.retrieve(this.scope);
}
/**
* @return {?}
*/
selectedChange() {
// this.forceRefreshView(5000);
}
/**
* @param {?} label
* @return {?}
*/
editLabel(label) {
this.createEditLabel.editModel(label[0]["id"], label);
}
/**
* @param {?} targets
* @return {?}
*/
deleteLabels(targets) {
if (targets && targets.length) {
/** @type {?} */
let targetNames = [];
targets.forEach(target => {
targetNames.push(target.name);
});
/** @type {?} */
let deletionMessage = new ConfirmationMessage('LABEL.DELETION_TITLE_TARGET', 'LABEL.DELETION_SUMMARY_TARGET', targetNames.join(', ') || '', targets, 6 /* TARGET */, 2 /* DELETE_CANCEL */);
this.confirmationDialogComponent.open(deletionMessage);
}
}
/**
* @param {?} message
* @return {?}
*/
confirmDeletion(message) {
if (message &&
message.source === 6 /* TARGET */ &&
message.state === 1 /* CONFIRMED */) {
/** @type {?} */
let targetLists = message.data;
if (targetLists && targetLists.length) {
/** @type {?} */
let promiseLists = [];
targetLists.forEach(target => {
promiseLists.push(this.delOperate(target));
});
Promise.all(promiseLists).then((item) => {
this.selectedRow = [];
this.retrieve(this.scope);
});
}
}
}
/**
* @param {?} target
* @return {?}
*/
delOperate(target) {
/** @type {?} */
let operMessage = new OperateInfo();
operMessage.name = 'OPERATION.DELETE_LABEL';
operMessage.data["id"] = target["id"];
operMessage.state = OperationState.progressing;
operMessage.data["name"] = target.name;
this.operationService.publishInfo(operMessage);
return toPromise(this.labelService
.deleteLabel(target["id"]))
.then(response => {
this.translateService.get('BATCH.DELETED_SUCCESS')
.subscribe(res => {
operateChanges(operMessage, OperationState.success);
});
}).catch(error => {
this.translateService.get('BATCH.DELETED_FAILURE').subscribe(res => {
operateChanges(operMessage, OperationState.failure, res);
});
});
}
/**
* @param {?} duration
* @return {?}
*/
forceRefreshView(duration) {
// Reset timer
if (this.timerHandler) {
clearInterval(this.timerHandler);
}
this.timerHandler = setInterval(() => this.ref.markForCheck(), 100);
setTimeout(() => {
if (this.timerHandler) {
clearInterval(this.timerHandler);
this.timerHandler = null;
}
}, duration);
}
}
LabelComponent.decorators = [
{ type: Component, args: [{
selector: "hbr-label",
template: "<div>\n <div class=\"row\" style=\"position:relative;\">\n <div>\n <div class=\"row flex-items-xs-between rightPos\">\n <div class=\"flex-items-xs-middle option-right\">\n <hbr-filter [withDivider]=\"true\" filterPlaceholder='{{\"LABEL.FILTER_LABEL_PLACEHOLDER\" | translate}}' (filterEvt)=\"doSearchTargets($event)\" [currentValue]=\"targetName\"></hbr-filter>\n <span class=\"refresh-btn\" (click)=\"refreshTargets()\">\n <clr-icon shape=\"refresh\"></clr-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"col-lg-12 col-md-12 col-sm-12 col-xs-12 btnGroup\">\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" (click)=\"openModal()\"><clr-icon shape=\"plus\" size=\"16\"></clr-icon> {{'LABEL.NEW_LABEL' | translate}}</button>\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" [disabled]=\"!(selectedRow.length == 1)\" (click)=\"editLabel(selectedRow)\"><clr-icon shape=\"pencil\" size=\"16\"></clr-icon> {{'LABEL.EDIT' | translate}}</button>\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" [disabled]=\"!selectedRow.length\" (click)=\"deleteLabels(selectedRow)\"><clr-icon shape=\"times\" size=\"16\"></clr-icon> {{'LABEL.DELETE' | translate}}</button> \n <hbr-create-edit-label [scope]=\"scope\" [projectId]=\"projectId\" (reload)=\"reload()\"></hbr-create-edit-label>\n </div>\n <div class=\"col-lg-12 col-md-12 col-sm-12 col-xs-12 content-mt\">\n <clr-datagrid [clrDgLoading]=\"loading\" [(clrDgSelected)]=\"selectedRow\" (clrDgSelectedChange)=\"selectedChange()\">\n <clr-dg-column [clrDgField]=\"'name'\">{{'LABEL.LABEL' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'endpoint'\">{{'LABEL.DESCRIPTION' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'insecure'\">{{'LABEL.CREATION_TIME' | translate }}</clr-dg-column>\n <clr-dg-placeholder>{{'LABEL.PLACEHOLDER' | translate }}</clr-dg-placeholder>\n <clr-dg-row *clrDgItems=\"let label of targets\" [clrDgItem]='label'>\n <clr-dg-cell>\n <hbr-label-piece [label]=\"label\"></hbr-label-piece>\n </clr-dg-cell>\n <clr-dg-cell>{{label.description}}</clr-dg-cell>\n <clr-dg-cell>{{label.creation_time | date: 'short'}}</clr-dg-cell>\n </clr-dg-row>\n <clr-dg-footer>\n <span *ngIf=\"pagination.totalItems\">{{pagination.firstItem + 1}} - {{pagination.lastItem + 1}} {{'DESTINATION.OF' | translate}}</span>\n {{pagination.totalItems}} {{'DESTINATION.ITEMS' | translate}}\n <clr-dg-pagination #pagination [clrDgPageSize]=\"15\"></clr-dg-pagination>\n </clr-dg-footer>\n </clr-datagrid>\n </div>\n </div>\n <confirmation-dialog #confirmationDialog (confirmAction)=\"confirmDeletion($event)\"></confirmation-dialog>\n</div>\n\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".option-left{padding-left:16px;margin-top:-6px}.option-right{padding-right:16px}.refresh-btn{cursor:pointer}.refresh-btn:hover{color:#007cbb}.rightPos{position:absolute;z-index:100;right:35px;margin-top:4px;height:24px}.content-mt{margin-top:-12px}"]
}] }
];
/** @nocollapse */
LabelComponent.ctorParameters = () => [
{ type: LabelService },
{ type: ErrorHandler },
{ type: TranslateService },
{ type: OperationService },
{ type: ChangeDetectorRef }
];
LabelComponent.propDecorators = {
scope: [{ type: Input }],
projectId: [{ type: Input }],
hasProjectAdminRole: [{ type: Input }],
createEditLabel: [{ type: ViewChild, args: [CreateEditLabelComponent,] }],
confirmationDialogComponent: [{ type: ViewChild, args: ["confirmationDialog",] }]
};
if (false) {
/** @type {?} */
LabelComponent.prototype.timerHandler;
/** @type {?} */
LabelComponent.prototype.loading;
/** @type {?} */
LabelComponent.prototype.targets;
/** @type {?} */
LabelComponent.prototype.targetName;
/** @type {?} */
LabelComponent.prototype.selectedRow;
/** @type {?} */
LabelComponent.prototype.scope;
/** @type {?} */
LabelComponent.prototype.projectId;
/** @type {?} */
LabelComponent.prototype.hasProjectAdminRole;
/** @type {?} */
LabelComponent.prototype.createEditLabel;
/** @type {?} */
LabelComponent.prototype.confirmationDialogComponent;
/** @type {?} */
LabelComponent.prototype.labelService;
/** @type {?} */
LabelComponent.prototype.errorHandler;
/** @type {?} */
LabelComponent.prototype.translateService;
/** @type {?} */
LabelComponent.prototype.operationService;
/** @type {?} */
LabelComponent.prototype.ref;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhhcmJvci91aS8iLCJzb3VyY2VzIjpbInNyYy9sYWJlbC9sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsS0FBSyxFQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUMxRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQU9oRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQVFoRSxNQUFNOzs7Ozs7OztJQWdCRixZQUFvQixZQUEwQixFQUMxQixjQUNBLGtCQUNBLGtCQUNBO1FBSkEsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZO1FBQ1oscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCO1FBQ2hCLFFBQUcsR0FBSCxHQUFHOzJCQWZBLEVBQUU7eUJBR0osQ0FBQztLQWFyQjs7OztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxL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QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7U0FDSixFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ2hCOzs7WUFsSkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxXQUFXO2dCQUNyQix1b0dBQXFDO2dCQUVyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDbEQ7Ozs7WUFyQk8sWUFBWTtZQUVaLFlBQVk7WUFTWixnQkFBZ0I7WUFHaEIsZ0JBQWdCO1lBbEJwQixpQkFBaUI7OztvQkFpQ2hCLEtBQUs7d0JBQ0wsS0FBSztrQ0FDTCxLQUFLOzhCQUVMLFNBQVMsU0FBQyx3QkFBd0I7MENBRWxDLFNBQVMsU0FBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgUHJvamVjdCBIYXJib3IgQXV0aG9yc1xuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBJbnB1dFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtMYWJlbH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5pbXBvcnQge0xhYmVsU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2UvbGFiZWwuc2VydmljZVwiO1xuaW1wb3J0IHt0b1Byb21pc2V9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtFcnJvckhhbmRsZXJ9IGZyb20gXCIuLi9lcnJvci1oYW5kbGVyL2Vycm9yLWhhbmRsZXJcIjtcbmltcG9ydCB7Q3JlYXRlRWRpdExhYmVsQ29tcG9uZW50fSBmcm9tIFwiLi4vY3JlYXRlLWVkaXQtbGFiZWwvY3JlYXRlLWVkaXQtbGFiZWwuY29tcG9uZW50XCI7XG5pbXBvcnQge0NvbmZpcm1hdGlvbk1lc3NhZ2V9IGZyb20gXCIuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1tZXNzYWdlXCI7XG5pbXBvcnQge1xuICAgIENvbmZpcm1hdGlvbkJ1dHRvbnMsXG4gICAgQ29uZmlybWF0aW9uU3RhdGUsXG4gICAgQ29uZmlybWF0aW9uVGFyZ2V0c1xufSBmcm9tIFwiLi4vc2hhcmVkL3NoYXJlZC5jb25zdFwiO1xuaW1wb3J0IHtDb25maXJtYXRpb25BY2tub3dsZWRnZW1lbnR9IGZyb20gXCIuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1zdGF0ZS1tZXNzYWdlXCI7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge0NvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7b3BlcmF0ZUNoYW5nZXMsIE9wZXJhdGVJbmZvLCBPcGVyYXRpb25TdGF0ZX0gZnJvbSBcIi4uL29wZXJhdGlvbi9vcGVyYXRlXCI7XG5pbXBvcnQge09wZXJhdGlvblNlcnZpY2V9IGZyb20gXCIuLi9vcGVyYXRpb24vb3BlcmF0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiaGJyLWxhYmVsXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9sYWJlbC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9sYWJlbC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgdGltZXJIYW5kbGVyOiBhbnk7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICB0YXJnZXRzOiBMYWJlbFtdO1xuICAgIHRhcmdldE5hbWU6IHN0cmluZztcbiAgICBzZWxlY3RlZFJvdzogTGFiZWxbXSA9IFtdO1xuXG4gICAgQElucHV0KCkgc2NvcGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwcm9qZWN0SWQgPSAwO1xuICAgIEBJbnB1dCgpIGhhc1Byb2plY3RBZG1pblJvbGU6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudClcbiAgICBjcmVhdGVFZGl0TGFiZWw6IENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKFwiY29uZmlybWF0aW9uRGlhbG9nXCIpXG4gICAgY29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50OiBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXRyaWV2ZSh0aGlzLnNjb3BlKTtcbiAgICB9XG5cbiAgICByZXRyaWV2ZShzY29wZTogc3RyaW5nLCBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93ID0gW107XG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IFwiXCI7XG4gICAgICAgIHRvUHJvbWlzZTxMYWJlbFtdPih0aGlzLmxhYmVsU2VydmljZS5nZXRMYWJlbHMoc2NvcGUsIHRoaXMucHJvamVjdElkLCBuYW1lKSlcbiAgICAgICAgICAgIC50aGVuKHRhcmdldHMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0cyA9IHRhcmdldHMgfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2hWaWV3KDIwMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRMYWJlbC5vcGVuTW9kYWwoKTtcbiAgICB9XG5cbiAgICByZWxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmV0cmlldmUodGhpcy5zY29wZSk7XG4gICAgfVxuXG4gICAgZG9TZWFyY2hUYXJnZXRzKHRhcmdldE5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJldHJpZXZlKHRoaXMuc2NvcGUsIHRhcmdldE5hbWUpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUYXJnZXRzKCkge1xuICAgICAgICB0aGlzLnJldHJpZXZlKHRoaXMuc2NvcGUpO1xuICAgIH1cblxuICAgIHNlbGVjdGVkQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmZvcmNlUmVmcmVzaFZpZXcoNTAwMCk7XG4gICAgfVxuXG4gICAgZWRpdExhYmVsKGxhYmVsOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdExhYmVsLmVkaXRNb2RlbChsYWJlbFswXS5pZCwgbGFiZWwpO1xuICAgIH1cblxuICAgIGRlbGV0ZUxhYmVscyh0YXJnZXRzOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0YXJnZXRzICYmIHRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICB0YXJnZXRzLmZvckVhY2godGFyZ2V0ID0+IHtcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lcy5wdXNoKHRhcmdldC5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGRlbGV0aW9uTWVzc2FnZSA9IG5ldyBDb25maXJtYXRpb25NZXNzYWdlKFxuICAgICAgICAgICAgICAgICdMQUJFTC5ERUxFVElPTl9USVRMRV9UQVJHRVQnLFxuICAgICAgICAgICAgICAgICdMQUJFTC5ERUxFVElPTl9TVU1NQVJZX1RBUkdFVCcsXG4gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXMuam9pbignLCAnKSB8fCAnJyxcbiAgICAgICAgICAgICAgICB0YXJnZXRzLFxuICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvblRhcmdldHMuVEFSR0VULFxuICAgICAgICAgICAgICAgIENvbmZpcm1hdGlvbkJ1dHRvbnMuREVMRVRFX0NBTkNFTCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudC5vcGVuKGRlbGV0aW9uTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maXJtRGVsZXRpb24obWVzc2FnZTogQ29uZmlybWF0aW9uQWNrbm93bGVkZ2VtZW50KSB7XG4gICAgICAgIGlmIChtZXNzYWdlICYmXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9PT0gQ29uZmlybWF0aW9uVGFyZ2V0cy5UQVJHRVQgJiZcbiAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdGUgPT09IENvbmZpcm1hdGlvblN0YXRlLkNPTkZJUk1FRCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldExpc3RzOiBMYWJlbFtdID0gbWVzc2FnZS5kYXRhO1xuICAgICAgICAgICAgaWYgKHRhcmdldExpc3RzICYmIHRhcmdldExpc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlTGlzdHM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgdGFyZ2V0TGlzdHMuZm9yRWFjaCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlTGlzdHMucHVzaCh0aGlzLmRlbE9wZXJhdGUodGFyZ2V0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZUxpc3RzKS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZSh0aGlzLnNjb3BlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbE9wZXJhdGUodGFyZ2V0OiBMYWJlbCkge1xuICAgICAgICAvLyBpbml0IG9wZXJhdGlvbiBpbmZvXG4gICAgICAgIGxldCBvcGVyTWVzc2FnZSA9IG5ldyBPcGVyYXRlSW5mbygpO1xuICAgICAgICBvcGVyTWVzc2FnZS5uYW1lID0gJ09QRVJBVElPTi5ERUxFVEVfTEFCRUwnO1xuICAgICAgICBvcGVyTWVzc2FnZS5kYXRhLmlkID0gdGFyZ2V0LmlkO1xuICAgICAgICBvcGVyTWVzc2FnZS5zdGF0ZSA9IE9wZXJhdGlvblN0YXRlLnByb2dyZXNzaW5nO1xuICAgICAgICBvcGVyTWVzc2FnZS5kYXRhLm5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLnB1Ymxpc2hJbmZvKG9wZXJNZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gdG9Qcm9taXNlPG51bWJlcj4odGhpcy5sYWJlbFNlcnZpY2VcbiAgICAgICAgICAgIC5kZWxldGVMYWJlbCh0YXJnZXQuaWQpKVxuICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdCQVRDSC5ERUxFVEVEX1NVQ0NFU1MnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGVDaGFuZ2VzKG9wZXJNZXNzYWdlLCBPcGVyYXRpb25TdGF0ZS5zdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnQkFUQ0guREVMRVRFRF9GQUlMVVJFJykuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRlQ2hhbmdlcyhvcGVyTWVzc2FnZSwgT3BlcmF0aW9uU3RhdGUuZmFpbHVyZSwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yY2VseSByZWZyZXNoIHRoZSB2aWV3XG4gICAgZm9yY2VSZWZyZXNoVmlldyhkdXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIFJlc2V0IHRpbWVyXG4gICAgICAgIGlmICh0aGlzLnRpbWVySGFuZGxlcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lckhhbmRsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSwgMTAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lckhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXJIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVySGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICB9XG59XG4iXX0=