svogv
Version:
A decorator based approach for model driven forms, including an advanced DataGrid and a TreeView component.
223 lines • 30.1 kB
JavaScript
import { Component, Input, Output, EventEmitter, ElementRef, Renderer2 } from '@angular/core';
import { TextTreeNodeModel, TreeNodeState } from '../models';
/**
* The TreeNodeModel class represents a single TreeNodeModel for the treeview. Actually, this renders the real UI.
*
* The component needs this input value:
*
* * @Input() node: AcTextTreeNode;
*
* The several options are set through the AcTreeNodeOptions object that is being held by the
* AcTextTreeNode class. This includes colors, icons, and other styles.
*
* The component can fire these events:
*
* * @Output() nodeClick: EventEmitter<AcTreeNode>;
* * @Output() checkChanged: EventEmitter<AcTreeNode>;
* * @Output() selectedChanged: EventEmitter<AcTreeNode>;
* * @Output() collapseChanged: EventEmitter<AcTreeNode>;
*
*/
export class TreeViewNodeComponent {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.isExpanded = false;
this.nodeClick = new EventEmitter();
this.checkChanged = new EventEmitter();
this.selectedChanged = new EventEmitter();
this.collapseChanged = new EventEmitter();
}
ngOnInit() {
// set HTML according to options
this.collapseClasses = new Array();
this.iconClasses = new Array();
// expander area with icon
if (this.node) {
// expect a font-awesome class with or without fa class
if (this.node.options && this.node.options.icon) {
if (this.node.options.icon.indexOf(`${TreeViewNodeComponent.pfxIcon} `) !== 0) {
this.iconClasses.push('fa');
}
this.iconClasses.push(this.node.options.icon);
}
if (this.node.options && this.node.options.href) {
this.href = this.node.options.href;
}
else {
this.href = '';
}
// open/close area for elements with children
if (this.node.hasChildren) {
this.collapseClasses.push('ac-icon'); // base class
this.collapseClasses.push(TreeViewNodeComponent.pfxIcon);
this.collapseClasses.push(TreeViewNodeComponent.opnIcon);
// collapsed by default
this.node.state &= ~TreeNodeState.checked;
}
if (this.node.options && this.node.options.color) {
this.foreColor = this.node.options.color;
}
if (this.node.options && this.node.options.backColor) {
this.backColor = this.node.options.backColor;
}
this.node.stateChange.subscribe((se) => {
this.collapseChanged.emit(this.node);
if (!this.node.stateIsExpandend) {
this.collapseClasses = this.collapseClasses.filter(s => s !== TreeViewNodeComponent.clsIcon);
this.collapseClasses.push(TreeViewNodeComponent.opnIcon);
}
else {
this.collapseClasses = this.collapseClasses.filter(s => s !== TreeViewNodeComponent.opnIcon);
this.collapseClasses.push(TreeViewNodeComponent.clsIcon);
}
this.isExpanded = this.node.stateIsExpandend;
});
}
}
// forward events in the node tree
onNodeClick(node) {
this.nodeClick.emit(node);
}
onCheckChanged(node) {
this.checkChanged.emit(node);
}
onSelectedChanged(node) {
this.selectedChanged.emit(node);
}
onCollapseChanged(node) {
if (this.node.options.collapsable && this.node.hasChildren) {
this.collapseChanged.emit(node);
}
}
handleCheckChange() {
if (this.node.options.checkable && !this.node.stateIsDisabled) {
if (this.node.state & TreeNodeState.checked) {
this.node.state &= ~TreeNodeState.checked;
}
else {
this.node.state |= TreeNodeState.checked;
}
this.checkChanged.emit(this.node);
}
}
handleClick($event) {
$event.stopPropagation();
// always emit click
this.nodeClick.emit(this.node);
}
handleCollapse() {
// if collapsable handle icons and view state
if (this.node.options.collapsable) {
// toggle state
if (this.node.state && this.node.state & TreeNodeState.expanded) {
this.node.state &= ~TreeNodeState.expanded;
}
else {
this.node.state |= TreeNodeState.expanded;
}
}
}
handlePreSelection(state) {
// handle the states according to options
if (this.node.options.selectable && !this.node.stateIsDisabled) {
if (state) {
if (this.node.options && this.node.options.color) {
this.foreColor = this.node.options.backColor;
}
else {
this.foreColor = '#fff';
}
if (this.node.options && this.node.options.backColor) {
this.backColor = this.node.options.color;
}
else {
this.backColor = '#000';
}
}
else {
if (this.node.options && this.node.options.color) {
this.foreColor = this.node.options.color;
}
else {
this.foreColor = '#000';
}
if (this.node.options && this.node.options.backColor) {
this.backColor = this.node.options.backColor;
}
else {
this.backColor = '#fff';
}
}
this.preSelectState = state;
}
}
handleSelection($event) {
// handle the states according to options
if (this.node.options.selectable &&
!this.node.stateIsDisabled &&
this.preSelectState === true) {
if (this.node.state & TreeNodeState.selected) {
this.node.state &= ~TreeNodeState.selected;
}
else {
this.node.state |= TreeNodeState.selected;
}
if (this.node.stateIsSelected) {
if (this.node.options && this.node.options.color) {
this.foreColor = this.node.options.backColor;
}
else {
this.foreColor = '#fff';
}
if (this.node.options && this.node.options.backColor) {
this.backColor = this.node.options.color;
}
else {
this.backColor = '#000';
}
}
else {
if (this.node.options && this.node.options.color) {
this.foreColor = this.node.options.color;
}
else {
this.foreColor = '#000';
}
if (this.node.options && this.node.options.backColor) {
this.backColor = this.node.options.backColor;
}
else {
this.backColor = '#fff';
}
}
this.selectedChanged.emit(this.node);
}
if (!this.href) {
$event.preventDefault();
$event.stopPropagation();
}
}
}
TreeViewNodeComponent.pfxIcon = 'fa';
TreeViewNodeComponent.opnIcon = 'fa-plus';
TreeViewNodeComponent.clsIcon = 'fa-minus';
TreeViewNodeComponent.decorators = [
{ type: Component, args: [{
selector: 'ac-treenode',
template: "<li class=\"treeview\" (click)=\"handleClick($event)\">\n <i class=\"ac-collapse\" [ngClass]=\"collapseClasses\" *ngIf=\"node.hasChildren\" (click)=\"handleCollapse()\"></i>\n <i class=\"ac-collapse\" *ngIf=\"!node.hasChildren\"></i>\n <i class=\"ac-icon\" [ngClass]=\"iconClasses\" [style.color]=\"node.options.iconColor\" *ngIf=\"!node.options.checkable\"></i>\n <input type=\"checkbox\" [id]=\"node.name\" *ngIf=\"node.options.checkable\" \n [checked]=\"node.stateIsChecked\" (click)=\"handleCheckChange()\">\n <label [attr.for]=\"node.name\"></label>\n <a class=\"ac-container\"\n [href]=\"href\"\n [style.color]=\"foreColor\" \n [style.background-color]=\"backColor\" \n (mouseover)=\"handlePreSelection(true)\"\n (mouseout)=\"handlePreSelection(false)\"\n (click)=\"handleSelection($event)\">\n {{ node.text }}\n </a>\n <ul class=\"treeview\" *ngIf=\"node.hasChildren\" [hidden]=\"!isExpanded\">\n <ac-treenode *ngFor=\"let child of node.children\" \n [node]=\"child\"\n (nodeClick)=\"onNodeClick($event)\" \n (checkChanged)=\"onCheckChanged($event)\"\n (selectedChanged)=\"onSelectedChanged($event)\"\n (collapseChanged)=\"onCollapseChanged($event)\">\n </ac-treenode>\n </ul> \n</li>",
styles: ["ul.treeview{list-style:none;margin-left:-2em}li.treeview{box-sizing:border-box;margin-bottom:3px;margin-left:10px}li.treeview a.ac-container{border-radius:2px;display:inline-block;padding:3px;text-decoration:none}li.treeview input[type=checkbox]{display:none}li.treeview input[type=checkbox]+label:before{content:\"\\f096\";font-family:FontAwesome}li.treeview input[type=checkbox]:checked+label:before{content:\"\\f046\"}li.treeview input[type=checkbox]+label{cursor:pointer;display:inline-block;height:20px;margin:-1px 4px 0 0;vertical-align:middle;width:15px}li.treeview i.ac-collapse{margin-left:-1.7em}li.treeview i.ac-collapse,li.treeview i.ac-icon{cursor:pointer;display:inline-block;width:15px}li.treeview .ac-node-disabled{color:silver;cursor:not-allowed}"]
},] }
];
TreeViewNodeComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
TreeViewNodeComponent.propDecorators = {
node: [{ type: Input }],
nodeClick: [{ type: Output }],
checkChanged: [{ type: Output }],
selectedChanged: [{ type: Output }],
collapseChanged: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXZpZXdub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9zdm9ndi9zcmMvIiwic291cmNlcyI6WyJsaWIvd2lkZ2V0cy90cmVldmlldy90cmVldmlld25vZGUvdHJlZXZpZXdub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUVaLFVBQVUsRUFDVixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFpQixhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBTUgsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF5Q3hELGVBQVUsR0FBRyxLQUFLLENBQUM7UUF4Q3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDM0QsQ0FBQztJQXdDRCxRQUFRO1FBQ04sZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDdkMsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJ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QUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7QUFuTmMsNkJBQU8sR0FBRyxJQUFJLENBQUM7QUFDZiw2QkFBTyxHQUFHLFNBQVMsQ0FBQztBQUNwQiw2QkFBTyxHQUFHLFVBQVUsQ0FBQzs7WUFmckMsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxhQUFhO2dCQUN2Qix5NUNBQTRDOzthQUU3Qzs7O1lBM0JDLFVBQVU7WUFDVixTQUFTOzs7bUJBMENSLEtBQUs7d0JBS0wsTUFBTTsyQkFLTixNQUFNOzhCQUtOLE1BQU07OEJBS04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRleHRUcmVlTm9kZU1vZGVsLCBUcmVlTm9kZU1vZGVsLCBUcmVlTm9kZVN0YXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiBUaGUgVHJlZU5vZGVNb2RlbCBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIFRyZWVOb2RlTW9kZWwgZm9yIHRoZSB0cmVldmlldy4gQWN0dWFsbHksIHRoaXMgcmVuZGVycyB0aGUgcmVhbCBVSS5cbiAqXG4gKiBUaGUgY29tcG9uZW50IG5lZWRzIHRoaXMgaW5wdXQgdmFsdWU6XG4gKlxuICogKiBASW5wdXQoKSBub2RlOiBBY1RleHRUcmVlTm9kZTtcbiAqXG4gKiBUaGUgc2V2ZXJhbCBvcHRpb25zIGFyZSBzZXQgdGhyb3VnaCB0aGUgQWNUcmVlTm9kZU9wdGlvbnMgb2JqZWN0IHRoYXQgaXMgYmVpbmcgaGVsZCBieSB0aGVcbiAqIEFjVGV4dFRyZWVOb2RlIGNsYXNzLiBUaGlzIGluY2x1ZGVzIGNvbG9ycywgaWNvbnMsIGFuZCBvdGhlciBzdHlsZXMuXG4gKlxuICogVGhlIGNvbXBvbmVudCBjYW4gZmlyZSB0aGVzZSBldmVudHM6XG4gKlxuICogKiBAT3V0cHV0KCkgbm9kZUNsaWNrOiBFdmVudEVtaXR0ZXI8QWNUcmVlTm9kZT47XG4gKiAqIEBPdXRwdXQoKSBjaGVja0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBY1RyZWVOb2RlPjtcbiAqICogQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFjVHJlZU5vZGU+O1xuICogKiBAT3V0cHV0KCkgY29sbGFwc2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QWNUcmVlTm9kZT47XG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhYy10cmVlbm9kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVldmlld25vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVldmlld25vZGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVWaWV3Tm9kZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5ub2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVOb2RlTW9kZWw+KCk7XG4gICAgdGhpcy5jaGVja0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVOb2RlTW9kZWw+KCk7XG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVOb2RlTW9kZWw+KCk7XG4gICAgdGhpcy5jb2xsYXBzZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVOb2RlTW9kZWw+KCk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgcGZ4SWNvbiA9ICdmYSc7XG4gIHByaXZhdGUgc3RhdGljIG9wbkljb24gPSAnZmEtcGx1cyc7XG4gIHByaXZhdGUgc3RhdGljIGNsc0ljb24gPSAnZmEtbWludXMnO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRoYXQgY29udHJvbHMgdGhlIG5vZGUncyBhcHBlYXJhbmNlLlxuICAgKi9cbiAgQElucHV0KClcbiAgbm9kZTogVGV4dFRyZWVOb2RlTW9kZWw7XG4gIC8qKlxuICAgKiBGaXJlZCBvbiBjbGljayBhbmQgaGVuY2UgZmlyZWQgZXZlbiBpZiBhbnkgb2YgdGhlIG90aGVyIHBhcnRzIGFyZSBiZWluZyBmaXJlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBub2RlQ2xpY2s6IEV2ZW50RW1pdHRlcjxUcmVlTm9kZU1vZGVsPjtcbiAgLyoqXG4gICAqIEZpcmVkIGlmIGEgY2hlY2thYmxlIGZpZWxkIGlzIGJlaW5nIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgY2hlY2tDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8VHJlZU5vZGVNb2RlbD47XG4gIC8qKlxuICAgKiBGaXJlZCBpZiBhIHNlbGVjdGFibGUgZmllbGQgaXMgYmVpbmcgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBzZWxlY3RlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxUcmVlTm9kZU1vZGVsPjtcbiAgLyoqXG4gICAqIEZpcmVkIGlmIGEgbm9kZSBjb2xsYXBzZXMgb3IgZXhwYW5kcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBjb2xsYXBzZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxUcmVlTm9kZU1vZGVsPjtcblxuICBwdWJsaWMgaHJlZjogc3RyaW5nO1xuICBwdWJsaWMgY29sbGFwc2VDbGFzc2VzOiBBcnJheTxzdHJpbmc+O1xuICBwdWJsaWMgaWNvbkNsYXNzZXM6IEFycmF5PHN0cmluZz47XG4gIHB1YmxpYyBmb3JlQ29sb3I6IHN0cmluZztcbiAgcHVibGljIGJhY2tDb2xvcjogc3RyaW5nO1xuICBwdWJsaWMgaXNFeHBhbmRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHJlU2VsZWN0U3RhdGU6IGJvb2xlYW47XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gc2V0IEhUTUwgYWNjb3JkaW5nIHRvIG9wdGlvbnNcbiAgICB0aGlzLmNvbGxhcHNlQ2xhc3NlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgdGhpcy5pY29uQ2xhc3NlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgLy8gZXhwYW5kZXIgYXJlYSB3aXRoIGljb25cbiAgICBpZiAodGhpcy5ub2RlKSB7XG4gICAgICAvLyBleHBlY3QgYSBmb250LWF3ZXNvbWUgY2xhc3Mgd2l0aCBvciB3aXRob3V0IGZhIGNsYXNzXG4gICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuaWNvbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5ub2RlLm9wdGlvbnMuaWNvbi5pbmRleE9mKGAke1RyZWVWaWV3Tm9kZUNvbXBvbmVudC5wZnhJY29ufSBgKSAhPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmljb25DbGFzc2VzLnB1c2goJ2ZhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pY29uQ2xhc3Nlcy5wdXNoKHRoaXMubm9kZS5vcHRpb25zLmljb24pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubm9kZS5vcHRpb25zICYmIHRoaXMubm9kZS5vcHRpb25zLmhyZWYpIHtcbiAgICAgICAgdGhpcy5ocmVmID0gdGhpcy5ub2RlLm9wdGlvbnMuaHJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaHJlZiA9ICcnO1xuICAgICAgfVxuICAgICAgLy8gb3Blbi9jbG9zZSBhcmVhIGZvciBlbGVtZW50cyB3aXRoIGNoaWxkcmVuXG4gICAgICBpZiAodGhpcy5ub2RlLmhhc0NoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuY29sbGFwc2VDbGFzc2VzLnB1c2goJ2FjLWljb24nKTsgLy8gYmFzZSBjbGFzc1xuICAgICAgICB0aGlzLmNvbGxhcHNlQ2xhc3Nlcy5wdXNoKFRyZWVWaWV3Tm9kZUNvbXBvbmVudC5wZnhJY29uKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZUNsYXNzZXMucHVzaChUcmVlVmlld05vZGVDb21wb25lbnQub3BuSWNvbik7XG4gICAgICAgIC8vIGNvbGxhcHNlZCBieSBkZWZhdWx0XG4gICAgICAgIHRoaXMubm9kZS5zdGF0ZSAmPSB+VHJlZU5vZGVTdGF0ZS5jaGVja2VkO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubm9kZS5vcHRpb25zICYmIHRoaXMubm9kZS5vcHRpb25zLmNvbG9yKSB7XG4gICAgICAgIHRoaXMuZm9yZUNvbG9yID0gdGhpcy5ub2RlLm9wdGlvbnMuY29sb3I7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuYmFja0NvbG9yKSB7XG4gICAgICAgIHRoaXMuYmFja0NvbG9yID0gdGhpcy5ub2RlLm9wdGlvbnMuYmFja0NvbG9yO1xuICAgICAgfVxuICAgICAgdGhpcy5ub2RlLnN0YXRlQ2hhbmdlLnN1YnNjcmliZSgoc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvbGxhcHNlQ2hhbmdlZC5lbWl0KHRoaXMubm9kZSk7XG4gICAgICAgIGlmICghdGhpcy5ub2RlLnN0YXRlSXNFeHBhbmRlbmQpIHtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2xhc3NlcyA9IHRoaXMuY29sbGFwc2VDbGFzc2VzLmZpbHRlcihcbiAgICAgICAgICAgIHMgPT4gcyAhPT0gVHJlZVZpZXdOb2RlQ29tcG9uZW50LmNsc0ljb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VDbGFzc2VzLnB1c2goVHJlZVZpZXdOb2RlQ29tcG9uZW50Lm9wbkljb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VDbGFzc2VzID0gdGhpcy5jb2xsYXBzZUNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAgICAgcyA9PiBzICE9PSBUcmVlVmlld05vZGVDb21wb25lbnQub3BuSWNvblxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2xsYXBzZUNsYXNzZXMucHVzaChUcmVlVmlld05vZGVDb21wb25lbnQuY2xzSWNvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5ub2RlLnN0YXRlSXNFeHBhbmRlbmQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3J3YXJkIGV2ZW50cyBpbiB0aGUgbm9kZSB0cmVlXG5cbiAgb25Ob2RlQ2xpY2sobm9kZTogVHJlZU5vZGVNb2RlbCkge1xuICAgIHRoaXMubm9kZUNsaWNrLmVtaXQobm9kZSk7XG4gIH1cblxuICBvbkNoZWNrQ2hhbmdlZChub2RlOiBUcmVlTm9kZU1vZGVsKSB7XG4gICAgdGhpcy5jaGVja0NoYW5nZWQuZW1pdChub2RlKTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWRDaGFuZ2VkKG5vZGU6IFRyZWVOb2RlTW9kZWwpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KG5vZGUpO1xuICB9XG5cbiAgb25Db2xsYXBzZUNoYW5nZWQobm9kZTogVHJlZU5vZGVNb2RlbCkge1xuICAgIGlmICh0aGlzLm5vZGUub3B0aW9ucy5jb2xsYXBzYWJsZSAmJiB0aGlzLm5vZGUuaGFzQ2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY29sbGFwc2VDaGFuZ2VkLmVtaXQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2hlY2tDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubm9kZS5vcHRpb25zLmNoZWNrYWJsZSAmJiAhdGhpcy5ub2RlLnN0YXRlSXNEaXNhYmxlZCkge1xuICAgICAgaWYgKHRoaXMubm9kZS5zdGF0ZSAmIFRyZWVOb2RlU3RhdGUuY2hlY2tlZCkge1xuICAgICAgICB0aGlzLm5vZGUuc3RhdGUgJj0gflRyZWVOb2RlU3RhdGUuY2hlY2tlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZS5zdGF0ZSB8PSBUcmVlTm9kZVN0YXRlLmNoZWNrZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrQ2hhbmdlZC5lbWl0KHRoaXMubm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2xpY2soJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gYWx3YXlzIGVtaXQgY2xpY2tcbiAgICB0aGlzLm5vZGVDbGljay5lbWl0KHRoaXMubm9kZSk7XG4gIH1cblxuICBoYW5kbGVDb2xsYXBzZSgpOiB2b2lkIHtcbiAgICAvLyBpZiBjb2xsYXBzYWJsZSBoYW5kbGUgaWNvbnMgYW5kIHZpZXcgc3RhdGVcbiAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMuY29sbGFwc2FibGUpIHtcbiAgICAgIC8vIHRvZ2dsZSBzdGF0ZVxuICAgICAgaWYgKHRoaXMubm9kZS5zdGF0ZSAmJiB0aGlzLm5vZGUuc3RhdGUgJiBUcmVlTm9kZVN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMubm9kZS5zdGF0ZSAmPSB+VHJlZU5vZGVTdGF0ZS5leHBhbmRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZS5zdGF0ZSB8PSBUcmVlTm9kZVN0YXRlLmV4cGFuZGVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVByZVNlbGVjdGlvbihzdGF0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIGhhbmRsZSB0aGUgc3RhdGVzIGFjY29yZGluZyB0byBvcHRpb25zXG4gICAgaWYgKHRoaXMubm9kZS5vcHRpb25zLnNlbGVjdGFibGUgJiYgIXRoaXMubm9kZS5zdGF0ZUlzRGlzYWJsZWQpIHtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuY29sb3IpIHtcbiAgICAgICAgICB0aGlzLmZvcmVDb2xvciA9IHRoaXMubm9kZS5vcHRpb25zLmJhY2tDb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcmVDb2xvciA9ICcjZmZmJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuYmFja0NvbG9yKSB7XG4gICAgICAgICAgdGhpcy5iYWNrQ29sb3IgPSB0aGlzLm5vZGUub3B0aW9ucy5jb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJhY2tDb2xvciA9ICcjMDAwJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5vcHRpb25zICYmIHRoaXMubm9kZS5vcHRpb25zLmNvbG9yKSB7XG4gICAgICAgICAgdGhpcy5mb3JlQ29sb3IgPSB0aGlzLm5vZGUub3B0aW9ucy5jb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcmVDb2xvciA9ICcjMDAwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuYmFja0NvbG9yKSB7XG4gICAgICAgICAgdGhpcy5iYWNrQ29sb3IgPSB0aGlzLm5vZGUub3B0aW9ucy5iYWNrQ29sb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5iYWNrQ29sb3IgPSAnI2ZmZic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJlU2VsZWN0U3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVTZWxlY3Rpb24oJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBoYW5kbGUgdGhlIHN0YXRlcyBhY2NvcmRpbmcgdG8gb3B0aW9uc1xuICAgIGlmIChcbiAgICAgIHRoaXMubm9kZS5vcHRpb25zLnNlbGVjdGFibGUgJiZcbiAgICAgICF0aGlzLm5vZGUuc3RhdGVJc0Rpc2FibGVkICYmXG4gICAgICB0aGlzLnByZVNlbGVjdFN0YXRlID09PSB0cnVlXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5ub2RlLnN0YXRlICYgVHJlZU5vZGVTdGF0ZS5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLm5vZGUuc3RhdGUgJj0gflRyZWVOb2RlU3RhdGUuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGUuc3RhdGUgfD0gVHJlZU5vZGVTdGF0ZS5zZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5vZGUuc3RhdGVJc1NlbGVjdGVkKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGUub3B0aW9ucyAmJiB0aGlzLm5vZGUub3B0aW9ucy5jb2xvcikge1xuICAgICAgICAgIHRoaXMuZm9yZUNvbG9yID0gdGhpcy5ub2RlLm9wdGlvbnMuYmFja0NvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9yZUNvbG9yID0gJyNmZmYnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5vZGUub3B0aW9ucyAmJiB0aGlzLm5vZGUub3B0aW9ucy5iYWNrQ29sb3IpIHtcbiAgICAgICAgICB0aGlzLmJhY2tDb2xvciA9IHRoaXMubm9kZS5vcHRpb25zLmNvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYmFja0NvbG9yID0gJyMwMDAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5ub2RlLm9wdGlvbnMgJiYgdGhpcy5ub2RlLm9wdGlvbnMuY29sb3IpIHtcbiAgICAgICAgICB0aGlzLmZvcmVDb2xvciA9IHRoaXMubm9kZS5vcHRpb25zLmNvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9yZUNvbG9yID0gJyMwMDAnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5vZGUub3B0aW9ucyAmJiB0aGlzLm5vZGUub3B0aW9ucy5iYWNrQ29sb3IpIHtcbiAgICAgICAgICB0aGlzLmJhY2tDb2xvciA9IHRoaXMubm9kZS5vcHRpb25zLmJhY2tDb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJhY2tDb2xvciA9ICcjZmZmJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdCh0aGlzLm5vZGUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaHJlZikge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iXX0=