ngx-tree-dnd
Version:
Angular 7 support tree with drag-and-drop sortable data tree. It`s fast and smart.
341 lines • 30.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { FormBuilder, Validators } from '@angular/forms';
/*
Copyright (C) 2018 Yaroslav Kikot
This project is licensed under the terms of the MIT license.
https://github.com/Zicrael/ngx-tree-dnd
*/
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { NgxTreeService } from '../ngx-tree-dnd.service';
var NgxTreeParentComponent = /** @class */ (function () {
function NgxTreeParentComponent(treeService, fb) {
this.treeService = treeService;
this.fb = fb;
this.userConfig = {
showActionButtons: true,
showAddButtons: true,
showRenameButtons: true,
showDeleteButtons: true,
showRootActionButtons: true,
enableExpandButtons: true,
enableDragging: true,
rootTitle: 'Root',
options: {
edit: false
},
validationText: 'Enter valid name',
minCharacterLength: 1,
setItemsAsLinks: false,
setFontSize: 16,
setIconSize: 14
};
this.ondragstart = new EventEmitter();
this.ondragenter = new EventEmitter();
this.ondragleave = new EventEmitter();
this.ondrop = new EventEmitter();
this.onallowdrop = new EventEmitter();
this.ondragend = new EventEmitter();
this.onadditem = new EventEmitter();
this.onStartRenameItem = new EventEmitter();
this.onFinishRenameItem = new EventEmitter();
this.onStartDeleteItem = new EventEmitter();
this.onFinishDeleteItem = new EventEmitter();
this.onCancelDeleteItem = new EventEmitter();
this.enableSubscribers();
this.createForm();
}
Object.defineProperty(NgxTreeParentComponent.prototype, "config", {
set: /**
* @param {?} config
* @return {?}
*/
function (config) {
// seal config
Object.seal(this.userConfig);
try {
// if config it`s pass
this.setConfig(config);
this.treeService.config.next(this.userConfig);
}
catch (error) {
// if config invalid
console.log('Config is invalid! Default configuragion will be appeared');
this.treeService.config.next(this.treeService.defaulConfig);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxTreeParentComponent.prototype, "treeData", {
set: /**
* @param {?} item
* @return {?}
*/
function (item) {
// get user tree data
this.getTreeData(item);
},
enumerable: true,
configurable: true
});
// set user config
// set user config
/**
* @param {?} config
* @return {?}
*/
NgxTreeParentComponent.prototype.setConfig =
// set user config
/**
* @param {?} config
* @return {?}
*/
function (config) {
var e_1, _a;
try {
for (var _b = tslib_1.__values(Object.keys(config)), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
this.setValue(key, config);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
this.renameForm.patchValue({
name: this.userConfig.rootTitle
});
};
// set value to keys of config
// set value to keys of config
/**
* @param {?} item
* @param {?} config
* @return {?}
*/
NgxTreeParentComponent.prototype.setValue =
// set value to keys of config
/**
* @param {?} item
* @param {?} config
* @return {?}
*/
function (item, config) {
this.userConfig[item] = config[item];
};
// subscribe to all events and emit them to user.
// subscribe to all events and emit them to user.
/**
* @return {?}
*/
NgxTreeParentComponent.prototype.enableSubscribers =
// subscribe to all events and emit them to user.
/**
* @return {?}
*/
function () {
var _this = this;
this.treeService.onDrop.subscribe(function (event) {
_this.ondrop.emit(event);
});
this.treeService.onDragStart.subscribe(function (event) {
_this.ondragstart.emit(event);
});
this.treeService.onAllowDrop.subscribe(function (event) {
_this.onallowdrop.emit(event);
});
this.treeService.onDragEnd.subscribe(function (event) {
_this.ondragend.emit(event);
});
this.treeService.onAddItem.subscribe(function (event) {
_this.onadditem.emit(event);
});
this.treeService.onStartRenameItem.subscribe(function (event) {
_this.onStartRenameItem.emit(event);
});
this.treeService.onFinishRenameItem.subscribe(function (event) {
_this.onFinishRenameItem.emit(event);
});
this.treeService.onStartDeleteItem.subscribe(function (event) {
_this.onStartDeleteItem.emit(event);
});
this.treeService.onFinishDeleteItem.subscribe(function (event) {
_this.onFinishDeleteItem.emit(event);
});
this.treeService.onCancelDeleteItem.subscribe(function (event) {
_this.onCancelDeleteItem.emit(event);
});
this.treeService.onDragEnter.subscribe(function (event) {
_this.ondragenter.emit(event);
});
this.treeService.onDragLeave.subscribe(function (event) {
_this.ondragleave.emit(event);
});
};
// get tree data from treeService.
// get tree data from treeService.
/**
* @param {?} userTree
* @return {?}
*/
NgxTreeParentComponent.prototype.getTreeData =
// get tree data from treeService.
/**
* @param {?} userTree
* @return {?}
*/
function (userTree) {
var _this = this;
this.treeService.getLocalData(userTree).subscribe(function (tree) {
_this.treeView = tree;
setTimeout(function () {
_this.treeService.sortTree();
});
}, function (error) {
console.log(error);
});
};
// create edit form
// create edit form
/**
* @return {?}
*/
NgxTreeParentComponent.prototype.createForm =
// create edit form
/**
* @return {?}
*/
function () {
this.renameForm = this.fb.group({
name: [this.userConfig.rootTitle || '', [
Validators.required,
Validators.minLength(this.userConfig.minCharacterLength)
]],
});
};
/**
* @return {?}
*/
NgxTreeParentComponent.prototype.enableRootRenameMode = /**
* @return {?}
*/
function () {
this.userConfig.options.edit = true;
};
/**
* @param {?} name
* @return {?}
*/
NgxTreeParentComponent.prototype.submitAdd = /**
* @param {?} name
* @return {?}
*/
function (name) {
/** @type {?} */
var d = "" + new Date().getFullYear() + new Date().getDay() + new Date().getTime();
/** @type {?} */
var elemId = parseInt(d, null);
this.treeService.addNewItem(elemId, name, null);
};
/**
* @return {?}
*/
NgxTreeParentComponent.prototype.submitRootRename = /**
* @return {?}
*/
function () {
if (this.renameForm.valid) {
this.showError = false;
this.userConfig.rootTitle = this.renameForm.value.name;
this.userConfig.options.edit = false;
}
else {
this.showError = true;
}
};
/**
* @return {?}
*/
NgxTreeParentComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () { };
NgxTreeParentComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-ngx-tree-component',
template: "<div id='threeWrapper' *ngIf=\"treeView\" [style.font-size.px]='userConfig.setFontSize'>\n <div class='root-title d-inline-flex pos-relative' *ngIf=\"!userConfig.options.edit;else onEdit\">\n <div class='root-text'>\n {{userConfig.rootTitle}}\n </div>\n \n <div class='d-flex buttons-bar' *ngIf=\"userConfig.showActionButtons && userConfig.showRootActionButtons\">\n <div class='d-flex'>\n <button class=\"tree-btn add-btn\" *ngIf=\"userConfig.showAddButtons\" (click)=\"submitAdd(null)\">\n <fa-icon icon=\"plus\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn edit-btn\" *ngIf=\"userConfig.showRenameButtons\" (click)=\"enableRootRenameMode()\">\n <fa-icon icon=\"edit\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n </div>\n </div>\n </div>\n <ng-template #onEdit>\n <div class='d-inline-flex'>\n <form [formGroup]=\"renameForm\" class='d-flex' (submit)='submitRootRename()'>\n <input type=\"text\" class='input-rename' formControlName=\"name\" libAutoFocus=\"true\" [style.font-size.px]='userConfig.setFontSize'>\n </form>\n <div class='d-flex'>\n <button class='tree-btn submit-btn' (click)='submitRootRename()'>\n <fa-icon icon=\"check\" [style.font-size.px]='userConfig.setIconSize'></fa-icon>\n </button>\n <div class='error-edit-wrap' *ngIf=\"showError\">\n {{userConfig.validationText}}\n </div>\n </div>\n </div>\n </ng-template>\n <div class='tree-child'>\n <div class=\"tree-content-main\">\n <lib-ngx-tree-children [setItem]=\"clild\" *ngFor='let clild of treeView'></lib-ngx-tree-children>\n </div>\n </div>\n </div>"
},] },
];
/** @nocollapse */
NgxTreeParentComponent.ctorParameters = function () { return [
{ type: NgxTreeService },
{ type: FormBuilder }
]; };
NgxTreeParentComponent.propDecorators = {
ondragstart: [{ type: Output }],
ondragenter: [{ type: Output }],
ondragleave: [{ type: Output }],
ondrop: [{ type: Output }],
onallowdrop: [{ type: Output }],
ondragend: [{ type: Output }],
onadditem: [{ type: Output }],
onStartRenameItem: [{ type: Output }],
onFinishRenameItem: [{ type: Output }],
onStartDeleteItem: [{ type: Output }],
onFinishDeleteItem: [{ type: Output }],
onCancelDeleteItem: [{ type: Output }],
config: [{ type: Input }],
treeData: [{ type: Input }]
};
return NgxTreeParentComponent;
}());
export { NgxTreeParentComponent };
if (false) {
/** @type {?} */
NgxTreeParentComponent.prototype.treeView;
/** @type {?} */
NgxTreeParentComponent.prototype.userConfig;
/** @type {?} */
NgxTreeParentComponent.prototype.showError;
/** @type {?} */
NgxTreeParentComponent.prototype.renameForm;
/** @type {?} */
NgxTreeParentComponent.prototype.ondragstart;
/** @type {?} */
NgxTreeParentComponent.prototype.ondragenter;
/** @type {?} */
NgxTreeParentComponent.prototype.ondragleave;
/** @type {?} */
NgxTreeParentComponent.prototype.ondrop;
/** @type {?} */
NgxTreeParentComponent.prototype.onallowdrop;
/** @type {?} */
NgxTreeParentComponent.prototype.ondragend;
/** @type {?} */
NgxTreeParentComponent.prototype.onadditem;
/** @type {?} */
NgxTreeParentComponent.prototype.onStartRenameItem;
/** @type {?} */
NgxTreeParentComponent.prototype.onFinishRenameItem;
/** @type {?} */
NgxTreeParentComponent.prototype.onStartDeleteItem;
/** @type {?} */
NgxTreeParentComponent.prototype.onFinishDeleteItem;
/** @type {?} */
NgxTreeParentComponent.prototype.onCancelDeleteItem;
/** @type {?} */
NgxTreeParentComponent.prototype.treeService;
/**
* @type {?}
* @private
*/
NgxTreeParentComponent.prototype.fb;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyZWUtZG5kLXBhcmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdHJlZS1kbmQvIiwic291cmNlcyI6WyJsaWIvbmd4LXRyZWUtZG5kLXBhcmVudC9uZ3gtdHJlZS1kbmQtcGFyZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU16RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQ7SUFtR0UsZ0NBQW1CLFdBQTJCLEVBQVUsRUFBZTtRQUFwRCxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdER2RSxlQUFVLEdBQWU7WUFDckIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixjQUFjLEVBQUUsSUFBSTtZQUNwQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsS0FBSzthQUNaO1lBQ0QsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUdNLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwRCxnQkFBVyxHQUFzQixJQUFJ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Q04sTUFBTTs0QkFDTixNQUFNO29DQUNOLE1BQU07cUNBQ04sTUFBTTtvQ0FDTixNQUFNO3FDQUNOLE1BQU07cUNBQ04sTUFBTTt5QkFFTixLQUFLOzJCQWVMLEtBQUs7O0lBd0lSLDZCQUFDO0NBQUEsQUFyT0QsSUFxT0M7U0ExTFksc0JBQXNCOzs7SUFDakMsMENBQXNCOztJQUN0Qiw0Q0FpQkk7O0lBQ0osMkNBQW1COztJQUNuQiw0Q0FBVzs7SUFDWCw2Q0FBOEQ7O0lBQzlELDZDQUE4RDs7SUFDOUQsNkNBQThEOztJQUM5RCx3Q0FBeUQ7O0lBQ3pELDZDQUE4RDs7SUFDOUQsMkNBQTREOztJQUM1RCwyQ0FBNEQ7O0lBQzVELG1EQUFvRTs7SUFDcEUsb0RBQXFFOztJQUNyRSxtREFBb0U7O0lBQ3BFLG9EQUFxRTs7SUFDckUsb0RBQXFFOztJQXVCekQsNkNBQWtDOzs7OztJQUFFLG9DQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuLypcbiBDb3B5cmlnaHQgKEMpIDIwMTggWWFyb3NsYXYgS2lrb3RcbiBUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS5cbiBodHRwczovL2dpdGh1Yi5jb20vWmljcmFlbC9uZ3gtdHJlZS1kbmRcbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmd4VHJlZVNlcnZpY2UgfSBmcm9tICcuLi9uZ3gtdHJlZS1kbmQuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTW9kZWwsIFRyZWVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS12aWV3Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW5neC10cmVlLWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlOiBgPGRpdiBpZD0ndGhyZWVXcmFwcGVyJyAqbmdJZj1cInRyZWVWaWV3XCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0Rm9udFNpemUnPlxuICAgIDxkaXYgY2xhc3M9J3Jvb3QtdGl0bGUgZC1pbmxpbmUtZmxleCBwb3MtcmVsYXRpdmUnICpuZ0lmPVwiIXVzZXJDb25maWcub3B0aW9ucy5lZGl0O2Vsc2Ugb25FZGl0XCI+XG4gICAgICA8ZGl2IGNsYXNzPSdyb290LXRleHQnPlxuICAgICAgICB7e3VzZXJDb25maWcucm9vdFRpdGxlfX1cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggYnV0dG9ucy1iYXInICpuZ0lmPVwidXNlckNvbmZpZy5zaG93QWN0aW9uQnV0dG9ucyAmJiB1c2VyQ29uZmlnLnNob3dSb290QWN0aW9uQnV0dG9uc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBhZGQtYnRuXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dBZGRCdXR0b25zXCIgKGNsaWNrKT1cInN1Ym1pdEFkZChudWxsKVwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXNcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0ndXNlckNvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidHJlZS1idG4gZWRpdC1idG5cIiAqbmdJZj1cInVzZXJDb25maWcuc2hvd1JlbmFtZUJ1dHRvbnNcIiAoY2xpY2spPVwiZW5hYmxlUm9vdFJlbmFtZU1vZGUoKVwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImVkaXRcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0ndXNlckNvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjb25FZGl0PlxuICAgICAgPGRpdiBjbGFzcz0nZC1pbmxpbmUtZmxleCc+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwicmVuYW1lRm9ybVwiIGNsYXNzPSdkLWZsZXgnIChzdWJtaXQpPSdzdWJtaXRSb290UmVuYW1lKCknPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPSdpbnB1dC1yZW5hbWUnIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBsaWJBdXRvRm9jdXM9XCJ0cnVlXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J3VzZXJDb25maWcuc2V0Rm9udFNpemUnPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCc+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc3VibWl0LWJ0bicgKGNsaWNrKT0nc3VibWl0Um9vdFJlbmFtZSgpJz5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjaGVja1wiIFtzdHlsZS5mb250LXNpemUucHhdPSd1c2VyQ29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZXJyb3ItZWRpdC13cmFwJyAqbmdJZj1cInNob3dFcnJvclwiPlxuICAgICAgICAgICAge3t1c2VyQ29uZmlnLnZhbGlkYXRpb25UZXh0fX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9J3RyZWUtY2hpbGQnPlxuICAgICAgPGRpdiBjbGFzcz1cInRyZWUtY29udGVudC1tYWluXCI+XG4gICAgICAgICAgPGxpYi1uZ3gtdHJlZS1jaGlsZHJlbiBbc2V0SXRlbV09XCJjbGlsZFwiICpuZ0Zvcj0nbGV0IGNsaWxkIG9mIHRyZWVWaWV3Jz48L2xpYi1uZ3gtdHJlZS1jaGlsZHJlbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gXG59KVxuZXhwb3J0IGNsYXNzIE5neFRyZWVQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgdHJlZVZpZXc6IFRyZWVNb2RlbFtdO1xuICB1c2VyQ29uZmlnOiBUcmVlQ29uZmlnID0ge1xuICAgICAgc2hvd0FjdGlvbkJ1dHRvbnM6IHRydWUsXG4gICAgICBzaG93QWRkQnV0dG9uczogdHJ1ZSxcbiAgICAgIHNob3dSZW5hbWVCdXR0b25zOiB0cnVlLFxuICAgICAgc2hvd0RlbGV0ZUJ1dHRvbnM6IHRydWUsXG4gICAgICBzaG93Um9vdEFjdGlvbkJ1dHRvbnM6IHRydWUsXG4gICAgICBlbmFibGVFeHBhbmRCdXR0b25zOiB0cnVlLFxuICAgICAgZW5hYmxlRHJhZ2dpbmc6IHRydWUsXG4gICAgICByb290VGl0bGU6ICdSb290JyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZWRpdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0aW9uVGV4dDogJ0VudGVyIHZhbGlkIG5hbWUnLFxuICAgICAgbWluQ2hhcmFjdGVyTGVuZ3RoOiAxLFxuICAgICAgc2V0SXRlbXNBc0xpbmtzOiBmYWxzZSxcbiAgICAgIHNldEZvbnRTaXplOiAxNixcbiAgICAgIHNldEljb25TaXplOiAxNFxuICAgIH07XG4gIHNob3dFcnJvcjogYm9vbGVhbjtcbiAgcmVuYW1lRm9ybTtcbiAgQE91dHB1dCgpIG9uZHJhZ3N0YXJ0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJhZ2VudGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJhZ2xlYXZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uZHJvcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmFsbG93ZHJvcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbmRyYWdlbmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25hZGRpdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uU3RhcnRSZW5hbWVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uRmluaXNoUmVuYW1lSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblN0YXJ0RGVsZXRlSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkZpbmlzaERlbGV0ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWxEZWxldGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKVxuICBzZXQgY29uZmlnKGNvbmZpZzogVHJlZUNvbmZpZykge1xuICAgIC8vIHNlYWwgY29uZmlnXG4gICAgT2JqZWN0LnNlYWwodGhpcy51c2VyQ29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgLy8gaWYgY29uZmlnIGl0YHMgcGFzc1xuICAgICAgdGhpcy5zZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29uZmlnLm5leHQodGhpcy51c2VyQ29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWYgY29uZmlnIGludmFsaWRcbiAgICAgIGNvbnNvbGUubG9nKCdDb25maWcgaXMgaW52YWxpZCEgRGVmYXVsdCBjb25maWd1cmFnaW9uIHdpbGwgYmUgYXBwZWFyZWQnKTtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY29uZmlnLm5leHQodGhpcy50cmVlU2VydmljZS5kZWZhdWxDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB0cmVlRGF0YShpdGVtOiBUcmVlTW9kZWxbXSkge1xuICAgIC8vIGdldCB1c2VyIHRyZWUgZGF0YVxuICAgICAgdGhpcy5nZXRUcmVlRGF0YShpdGVtKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cmVlU2VydmljZTogTmd4VHJlZVNlcnZpY2UsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyICkge1xuICAgIHRoaXMuZW5hYmxlU3Vic2NyaWJlcnMoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIC8vIHNldCB1c2VyIGNvbmZpZ1xuICBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIGNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMucmVuYW1lRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIG5hbWU6IHRoaXMudXNlckNvbmZpZy5yb290VGl0bGVcbiAgICB9KTtcbiAgfVxuICAvLyBzZXQgdmFsdWUgdG8ga2V5cyBvZiBjb25maWdcbiAgc2V0VmFsdWUoaXRlbSwgY29uZmlnKSB7XG4gICAgdGhpcy51c2VyQ29uZmlnW2l0ZW1dID0gY29uZmlnW2l0ZW1dO1xuICB9XG5cbiAgLy8gc3Vic2NyaWJlIHRvIGFsbCBldmVudHMgYW5kIGVtaXQgdGhlbSB0byB1c2VyLlxuICBlbmFibGVTdWJzY3JpYmVycygpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJvcC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyb3AuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRHJhZ1N0YXJ0LnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uZHJhZ3N0YXJ0LmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkFsbG93RHJvcC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmFsbG93ZHJvcC5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25EcmFnRW5kLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uZHJhZ2VuZC5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25BZGRJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uYWRkaXRlbS5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25TdGFydFJlbmFtZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25TdGFydFJlbmFtZUl0ZW0uZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uRmluaXNoUmVuYW1lSXRlbS5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbkZpbmlzaFJlbmFtZUl0ZW0uZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLm9uU3RhcnREZWxldGVJdGVtLnN1YnNjcmliZShcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLm9uU3RhcnREZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkZpbmlzaERlbGV0ZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25GaW5pc2hEZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkNhbmNlbERlbGV0ZUl0ZW0uc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25DYW5jZWxEZWxldGVJdGVtLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50cmVlU2VydmljZS5vbkRyYWdFbnRlci5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5vbmRyYWdlbnRlci5lbWl0KGV2ZW50KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uub25EcmFnTGVhdmUuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMub25kcmFnbGVhdmUuZW1pdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGdldCB0cmVlIGRhdGEgZnJvbSB0cmVlU2VydmljZS5cbiAgZ2V0VHJlZURhdGEodXNlclRyZWUpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmdldExvY2FsRGF0YSh1c2VyVHJlZSkuc3Vic2NyaWJlKFxuICAgICAgKHRyZWU6IFRyZWVNb2RlbFtdKSA9PiB7XG4gICAgICAgIHRoaXMudHJlZVZpZXcgPSB0cmVlO1xuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmVlU2VydmljZS5zb3J0VHJlZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBlZGl0IGZvcm1cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnJlbmFtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFt0aGlzLnVzZXJDb25maWcucm9vdFRpdGxlIHx8ICcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMudXNlckNvbmZpZy5taW5DaGFyYWN0ZXJMZW5ndGgpXG4gICAgICBdXSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZVJvb3RSZW5hbWVNb2RlKCkge1xuICAgIHRoaXMudXNlckNvbmZpZy5vcHRpb25zLmVkaXQgPSB0cnVlO1xuICB9XG5cbiAgc3VibWl0QWRkKG5hbWUpIHtcbiAgICBjb25zdCBkID0gYCR7bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpfSR7bmV3IERhdGUoKS5nZXREYXkoKX0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG4gICAgY29uc3QgZWxlbUlkID0gcGFyc2VJbnQoZCwgbnVsbCk7XG4gICAgdGhpcy50cmVlU2VydmljZS5hZGROZXdJdGVtKGVsZW1JZCwgbmFtZSwgbnVsbCk7XG4gIH1cblxuICBzdWJtaXRSb290UmVuYW1lKCkge1xuICAgIGlmICh0aGlzLnJlbmFtZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnVzZXJDb25maWcucm9vdFRpdGxlID0gdGhpcy5yZW5hbWVGb3JtLnZhbHVlLm5hbWU7XG4gICAgICB0aGlzLnVzZXJDb25maWcub3B0aW9ucy5lZGl0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7fVxuXG5cbn0iXX0=