UNPKG

svogv

Version:

A decorator based approach for model driven forms, including an advanced DataGrid and a TreeView component.

223 lines 30.1 kB
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=