UNPKG

cubex-multiselect-dropdown

Version:
195 lines (194 loc) 27.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, HostListener, ElementRef } from '@angular/core'; export class SingleselectDropdownComponent { /** * @param {?} eRef */ constructor(eRef) { this.eRef = eRef; this.selectionLabel = 'Select'; this.optionList = []; this.open = false; this.displayNameKey = ''; this.toggleSelectionKey = ''; this.selectionTextWidth = 11; this.selectionChange = new EventEmitter(); this.onSearchChange = new EventEmitter(); this.isoptionListArayString = false; } /** * @return {?} */ ngOnInit() { this.currentStyles = { "width": '100%', // "width": this.componentWidth+'px', // "height" : this.componentHeight+'px' "height": 'auto', "max-height": this.componentHeight + 'px' }; this.noOption = { "padding-left": (this.componentWidth / 2) - 75 + 'px', "color": "gainsboro" }; this.isoptionListArayString = typeof this.optionList[0] === 'string'; console.log(this.isoptionListArayString, this.optionList); if (!this.selectedOptions) { this.selectedOptions = this.isoptionListArayString ? "" : []; } if (this.isoptionListArayString) { this.filterText = this.selectedOptions; } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { for (let propName in changes) { if (propName === 'selectedOptions') { if (changes[propName].currentValue === undefined) { return; } else if (Object.getOwnPropertyNames(this.selectedOptions).length === 0) { this.filterText = ''; continue; } if (this.isoptionListArayString) { if (typeof this.selectedOptions != 'undefined') { this.filterText = (/** @type {?} */ (this.selectedOptions)).length < (this.selectionTextWidth + 1) ? (/** @type {?} */ (this.selectedOptions)) : (/** @type {?} */ (this.selectedOptions)).substring(0, this.selectionTextWidth) + '..'; } } else { if (typeof this.selectedOptions[this.displayNameKey] != 'undefined') { this.filterText = (/** @type {?} */ (this.selectedOptions))[this.displayNameKey].length < (this.selectionTextWidth + 1) ? (/** @type {?} */ (this.selectedOptions))[this.displayNameKey] : (/** @type {?} */ (this.selectedOptions))[this.displayNameKey].substring(0, this.selectionTextWidth) + '..'; } } } if (propName === 'optionList') { //console.log("optionList-->", changes[propName].currentValue); this.optionList = changes[propName].currentValue; } } } /** * @param {?} option * @return {?} */ selectOption(option) { if (this.isoptionListArayString) { this.selectedOptions = option; this.selectionChange.emit(this.selectedOptions); this.closeDropdown(); this.filterText = (/** @type {?} */ (this.selectedOptions)).length < (this.selectionTextWidth + 1) ? (/** @type {?} */ (this.selectedOptions)) : (/** @type {?} */ (this.selectedOptions)).substring(0, this.selectionTextWidth) + '..'; } else { this.selectedOptions = option; this.selectionChange.emit(this.selectedOptions); this.closeDropdown(); this.filterText = (/** @type {?} */ (this.selectedOptions))[this.displayNameKey].length < (this.selectionTextWidth + 1) ? (/** @type {?} */ (this.selectedOptions))[this.displayNameKey] : (/** @type {?} */ (this.selectedOptions))[this.displayNameKey].substring(0, this.selectionTextWidth) + '..'; } } /** * @return {?} */ closeDropdown() { this.open = false; if (this.isoptionListArayString) { this.filterText = this.selectedOptions; } else { this.filterText = this.selectedOptions[this.displayNameKey]; } } /** * @return {?} */ toggleDropdown() { this.open = !this.open; if (open) { this.filterText = ''; } } /** * @param {?} event * @return {?} */ clickout(event) { if (!this.eRef.nativeElement.contains(event.target)) { this.open = false; if (this.isoptionListArayString) { this.filterText = this.selectedOptions; } else { this.filterText = this.selectedOptions[this.displayNameKey]; } } } } SingleselectDropdownComponent.decorators = [ { type: Component, args: [{ selector: 'cubex-singleselect-dropdown', template: "<div *ngIf=\"!isoptionListArayString\" style=\"position: relative !important;\">\n <div class=\"form-group proto-select\" (clickOutside)=\"closeDropdown()\">\n <div class=\"form-group__text\">\n <input class=\"text-small text-vibrant Search\" type = 'search' (click)=\"toggleDropdown()\" [(ngModel)]=\"filterText\" placeholder=\"{{selectionPlaceholder}}\" autocomplete=\"nope\" (input)=\"onSearchChange.emit($event.target.value)\"/>\n <label>{{selectionLabel}}</label>\n <i class=\"proto-select-chevron\" (click)=\"toggleDropdown()\"[ngClass]=\"[ open ? 'icon-chevron-up' : 'icon-chevron-down' ]\"></i>\n </div>\n <div class=\"proto-select-backdrop\" (click)=\"toggleDropdown()\" *ngIf=\"open\"></div>\n\n <div class=\"panel panel--raised proto-select-dropdown\" *ngIf=\"open\" [ngClass]=\"{'topClass': selectionLabel == '' || selectionLabel == null || selectionLabel == undefined }\">\n <div class=\"text-small text-muted text-noselect qtr-padding\" *ngIf=\"optionList.length == 0\">\n No option available\n </div>\n\n <div *ngIf=\"open\" class=\"singleselect_hover wordbreak\" [ngStyle]=\"currentStyles\" >\n <!-- <div class=\"panel panel--compressed\" *ngFor=\"let item of optionList | filterObjectsByKey : displayNameKey : filterText | arraySort: displayNameKey\"> -->\n <div class=\"panel panel--compressed\" *ngFor=\"let item of optionList | filterObjectsByKey : displayNameKey : filterText\"> \n <div class=\"hover-cursor\" (click)=\"selectOption(item)\" [ngClass]=\"{'bgColor': selectedOptions[displayNameKey] == item[displayNameKey] }\">\n <div>{{item[displayNameKey] }}</div>\n <div > <i class=\"icon-check icon-right\" *ngIf=\"selectedOptions[displayNameKey] == item[displayNameKey]\"></i></div> \n </div>\n \n <!-- <i class=\"icon-check \" [ngClass]=\"{'bgColor': selectedOptions.name == item.name }\" ></i> -->\n \n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<div *ngIf=\"isoptionListArayString\" style=\"position: relative !important;\">\n <div class=\"form-group proto-select\" (clickOutside)=\"closeDropdown()\">\n <div class=\"form-group__text\">\n <input class=\"text-small text-vibrant Search\" type = 'search' (click)=\"toggleDropdown()\" [(ngModel)]=\"filterText\" placeholder=\"{{selectionPlaceholder}}\" autocomplete=\"nope\" (input)=\"onSearchChange.emit($event.target.value)\"/>\n <label>{{selectionLabel}}</label>\n <i class=\"proto-select-chevron\" (click)=\"toggleDropdown()\"[ngClass]=\"[ open ? 'icon-chevron-up' : 'icon-chevron-down' ]\"></i>\n </div>\n <div class=\"proto-select-backdrop\" (click)=\"toggleDropdown()\" *ngIf=\"open\"></div>\n\n <div class=\"panel panel--raised proto-select-dropdown bdr\" *ngIf=\"open\" [ngClass]=\"{'topClass': selectionLabel == '' || selectionLabel == null || selectionLabel == undefined }\" [ngStyle]=\"currentStyles\">\n <div class=\"text-small text-muted text-noselect qtr-padding\" *ngIf=\"optionList.length == 0\">\n No option available\n </div>\n\n <div *ngIf=\"open\" class=\"singleselect_hover wordbreak\" [ngStyle]=\"currentStyles\" >\n <div class=\"panel panel--compressed\" *ngFor=\"let item of optionList | filterStrings : filterText\"> \n <div class=\"hover-cursor\" (click)=\"selectOption(item)\" [ngClass]=\"{'bgColor': selectedOptions == item }\">\n <div>{{item }}</div>\n <div > <i class=\"icon-check icon-right\" *ngIf=\"selectedOptions == item\"></i></div> \n </div>\n \n <!-- <i class=\"icon-check \" [ngClass]=\"{'bgColor': selectedOptions.name == item.name }\" ></i> -->\n \n </div>\n </div>\n\n </div>\n </div>\n</div>", styles: [".overlayAnchor{display:inline-block;min-width:250px}.link{text-decoration:underline;cursor:pointer;color:#007493;padding-left:8px}.noOption{padding-top:5px}.tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.tooltip .tooltiptext{visibility:hidden;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:120px;background-color:#555;color:#fff;text-align:center;padding:5px 0;border-radius:6px;position:absolute;z-index:1;top:125%;left:50%;margin-left:-60px;opacity:0;transition:opacity .3s}.tooltip .tooltiptext::after{content:\"\";position:absolute;top:-10px;left:45px;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555}.tooltip:hover .tooltiptext{visibility:visible;opacity:1}.bullet{height:5px;width:5px;background-color:#fff;border-radius:50%;display:inline-block;margin-bottom:3px}.inputBox{border-bottom:1px solid #ddd;border-top:none;border-left:none;border-right:none;width:-webkit-fill-available;width:-moz-available;width:stretch}.dropdown-expanded{border:1px solid #d3d3d3;padding-left:9px;min-width:171px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;overflow:scroll;float:left}.customInput{outline:0;padding-left:6px;padding-top:3px}.customInput:hover{outline:#ccc solid 1px}.inlineBox{display:block;cursor:pointer;position:relative;padding-left:28px;padding-bottom:6px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:5px 0;border-bottom:1px solid #ccc;word-wrap:break-word}.inlineBox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.checkmark{position:absolute;top:0;left:0;height:22px;width:22px;background-color:#eee;border-radius:5px}.checkmarkText{position:relative;top:3px}.inlineBox:hover input~.checkmark{background-color:#ccc}.inlineBox input:checked~.checkmark{background-color:#ddd}.checkmark:after{content:\"\";position:absolute;display:none}.inlineBox input:checked~.checkmark:after{display:block}.inlineBox .checkmark:after{left:4px;top:4px;width:14px;height:14px;background:#00beed;border-radius:5px}.proto-select .proto-select-backdrop{position:fixed;top:0;bottom:0;right:0;left:0;z-index:99}.proto-select .proto-select-chevron{position:absolute;bottom:0;right:0;padding:5px 8px;color:gray}.proto-select .proto-select-dropdown{position:absolute;z-index:999;border:1px solid #f1f1f1;overflow-y:auto;padding:0;top:100%;left:0;right:0}.proto-select .proto-select-dropdown .dropdown-header{position:-webkit-sticky;position:sticky;top:0;z-index:99;width:100%;background-color:#fff;border-bottom:1px solid #f1f1f1}.proto-select .proto-select-dropdown .form-group{padding:6px 10px;margin:0}.proto-select .proto-select-dropdown .form-group .checkbox__label{padding-top:2px}.proto-select .proto-select-dropdown .form-group.selected,.proto-select .proto-select-dropdown .form-group.selected:hover{background-color:#00bceb!important;color:#fff}.proto-select .proto-select-dropdown .form-group.selected .checkbox__label,.proto-select .proto-select-dropdown .form-group.selected:hover .checkbox__label{color:#fff!important}.proto-select .proto-select-dropdown .form-group:hover{background-color:#f1f1f1}.singleselect_hover>div>span{display:inline-block!important;width:100%}.singleselect_hover>.panel:hover{background-color:#f1f1f1}.wordbreak{word-break:break-word}.hover-cursor{cursor:pointer;position:relative;padding:5px}.bgColor{background:#00bceb;color:#fff}.icon-right{position:absolute;top:5px;right:5px}.panel--compressed{padding:0!important}.topClass{position:absolute;z-index:999;border:1px solid #f1f1f1;overflow-y:auto;padding:0;top:30px!important;left:0;right:0}.Search::-webkit-search-cancel-button{position:relative;right:20px}"] }] } ]; /** @nocollapse */ SingleselectDropdownComponent.ctorParameters = () => [ { type: ElementRef } ]; SingleselectDropdownComponent.propDecorators = { selectionLabel: [{ type: Input, args: ['label',] }], optionList: [{ type: Input, args: ['data',] }], open: [{ type: Input, args: ['isOpen',] }], selectedOptions: [{ type: Input, args: ['checkedOption',] }], displayNameKey: [{ type: Input, args: ['displayKey',] }], toggleSelectionKey: [{ type: Input, args: ['toggleKey',] }], selectionPlaceholder: [{ type: Input, args: ['placeholder',] }], selectionTextWidth: [{ type: Input, args: ['selectionWidth',] }], componentWidth: [{ type: Input, args: ['width',] }], componentHeight: [{ type: Input, args: ['height',] }], selectionChange: [{ type: Output, args: ['onChange',] }], onSearchChange: [{ type: Output }], clickout: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** @type {?} */ SingleselectDropdownComponent.prototype.filterText; /** @type {?} */ SingleselectDropdownComponent.prototype.selectionLabel; /** @type {?} */ SingleselectDropdownComponent.prototype.optionList; /** @type {?} */ SingleselectDropdownComponent.prototype.open; /** @type {?} */ SingleselectDropdownComponent.prototype.selectedOptions; /** @type {?} */ SingleselectDropdownComponent.prototype.displayNameKey; /** @type {?} */ SingleselectDropdownComponent.prototype.toggleSelectionKey; /** @type {?} */ SingleselectDropdownComponent.prototype.selectionPlaceholder; /** @type {?} */ SingleselectDropdownComponent.prototype.selectionTextWidth; /** @type {?} */ SingleselectDropdownComponent.prototype.componentWidth; /** @type {?} */ SingleselectDropdownComponent.prototype.componentHeight; /** @type {?} */ SingleselectDropdownComponent.prototype.selectionChange; /** @type {?} */ SingleselectDropdownComponent.prototype.onSearchChange; /** @type {?} */ SingleselectDropdownComponent.prototype.currentStyles; /** @type {?} */ SingleselectDropdownComponent.prototype.noOption; /** @type {?} */ SingleselectDropdownComponent.prototype.isoptionListArayString; /** @type {?} */ SingleselectDropdownComponent.prototype.eRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2N1YmV4LW11bHRpc2VsZWN0LWRyb3Bkb3duLyIsInNvdXJjZXMiOlsibGliL3NpbmdsZXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkksTUFBTTs7OztJQW9CSixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZOzhCQWpCSSxRQUFROzBCQUNOLEVBQUU7b0JBQ1osS0FBSzs4QkFFQyxFQUFFO2tDQUNDLEVBQUU7a0NBRVcsRUFBRTsrQkFHbEIsSUFBSSxZQUFZLEVBQU87OEJBQ2xDLElBQUksWUFBWSxFQUFPO3NDQUdoQixLQUFLO0tBSXRDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsT0FBTyxFQUFFLE1BQU07OztZQUdmLFFBQVEsRUFBRyxNQUFNO1lBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFDLElBQUk7U0FDeEMsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFDLENBQUMsQ0FBQyxHQUFDLEVBQUUsR0FBQyxJQUFJO1lBQy9DLE9BQU8sRUFBRyxXQUFXO1NBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDeEQsSUFBRyxDQUFDLElBQUksQ0FBQyxl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SyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDeEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM3RDtTQUNGO0tBQ0Y7OztZQXZIRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtnQkFDdkMsb3dIQUFtRDs7YUFFcEQ7Ozs7WUFOZ0csVUFBVTs7OzZCQVV4RyxLQUFLLFNBQUMsT0FBTzt5QkFDYixLQUFLLFNBQUMsTUFBTTttQkFDWixLQUFLLFNBQUMsUUFBUTs4QkFDZCxLQUFLLFNBQUMsZUFBZTs2QkFDckIsS0FBSyxTQUFDLFlBQVk7aUNBQ2xCLEtBQUssU0FBQyxXQUFXO21DQUNqQixLQUFLLFNBQUMsYUFBYTtpQ0FDbkIsS0FBSyxTQUFDLGdCQUFnQjs2QkFDdEIsS0FBSyxTQUFDLE9BQU87OEJBQ2IsS0FBSyxTQUFDLFFBQVE7OEJBQ2QsTUFBTSxTQUFDLFVBQVU7NkJBQ2pCLE1BQU07dUJBMEZOLFlBQVksU0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2N1YmV4LXNpbmdsZXNlbGVjdC1kcm9wZG93bicsXHJcbiAgdGVtcGxhdGVVcmw6ICdzaW5nbGVzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydzaW5nbGVzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW5nbGVzZWxlY3REcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxPbkNoYW5nZXMge1xyXG5cclxuICBmaWx0ZXJUZXh0OiBhbnk7XHJcbiAgQElucHV0KCdsYWJlbCcpIHNlbGVjdGlvbkxhYmVsOnN0cmluZyA9ICdTZWxlY3QnO1xyXG4gIEBJbnB1dCgnZGF0YScpIG9wdGlvbkxpc3Q6QXJyYXk8T2JqZWN0PiA9IFtdO1xyXG4gIEBJbnB1dCgnaXNPcGVuJykgb3Blbjpib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCdjaGVja2VkT3B0aW9uJykgc2VsZWN0ZWRPcHRpb25zOmFueTtcclxuICBASW5wdXQoJ2Rpc3BsYXlLZXknKSBkaXNwbGF5TmFtZUtleSA9ICcnO1xyXG4gIEBJbnB1dCgndG9nZ2xlS2V5JykgdG9nZ2xlU2VsZWN0aW9uS2V5ID0gJyc7XHJcbiAgQElucHV0KCdwbGFjZWhvbGRlcicpIHNlbGVjdGlvblBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgQElucHV0KCdzZWxlY3Rpb25XaWR0aCcpIHNlbGVjdGlvblRleHRXaWR0aDogbnVtYmVyID0gMTE7XHJcbiAgQElucHV0KCd3aWR0aCcpIGNvbXBvbmVudFdpZHRoOiBudW1iZXIgO1xyXG4gIEBJbnB1dCgnaGVpZ2h0JykgY29tcG9uZW50SGVpZ2h0OiBudW1iZXIgO1xyXG4gIEBPdXRwdXQoJ29uQ2hhbmdlJykgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgY3VycmVudFN0eWxlczoge307XHJcbiAgbm9PcHRpb246IHt9O1xyXG4gIGlzb3B0aW9uTGlzdEFyYXlTdHJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLyBASW5wdXQoJ3BsYWNlaG9sZGVyRmlsdGVyJykgcGxhY2Vob2xkZXJGaWx0ZXJUZXh0OiBzdHJpbmcgPSAnRmlsdGVyIG9wdGlvbnMnO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVSZWY6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jdXJyZW50U3R5bGVzID0ge1xyXG4gICAgICBcIndpZHRoXCI6ICcxMDAlJyxcclxuICAgICAgLy8gXCJ3aWR0aFwiOiB0aGlzLmNvbXBvbmVudFdpZHRoKydweCcsXHJcbiAgICAgIC8vIFwiaGVpZ2h0XCIgOiB0aGlzLmNvbXBvbmVudEhlaWdodCsncHgnXHJcbiAgICAgIFwiaGVpZ2h0XCIgOiAnYXV0bycsXHJcbiAgICAgIFwibWF4LWhlaWdodFwiOiB0aGlzLmNvbXBvbmVudEhlaWdodCsncHgnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5ub09wdGlvbiA9IHtcclxuICAgICAgXCJwYWRkaW5nLWxlZnRcIjogKHRoaXMuY29tcG9uZW50V2lkdGgvMiktNzUrJ3B4JyxcclxuICAgICAgXCJjb2xvclwiIDogXCJnYWluc2Jvcm9cIlxyXG4gICAgfTtcclxuICAgIHRoaXMuaXNvcHRpb25MaXN0QXJheVN0cmluZyA9IHR5cGVvZiB0aGlzLm9wdGlvbkxpc3RbMF0gPT09ICdzdHJpbmcnO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nLHRoaXMub3B0aW9uTGlzdClcclxuICAgIGlmKCF0aGlzLnNlbGVjdGVkT3B0aW9ucyl7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nID8gXCJcIiA6IFtdO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nKXtcclxuICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpe1xyXG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gY2hhbmdlcykge1xyXG4gICAgICBpZihwcm9wTmFtZSA9PT0gJ3NlbGVjdGVkT3B0aW9ucycpe1xyXG4gICAgICAgIGlmKGNoYW5nZXNbcHJvcE5hbWVdLmN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9ZWxzZSBpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLnNlbGVjdGVkT3B0aW9ucykubGVuZ3RoID09PSAwKXtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xyXG4gICAgICAgICAgY29udGludWU7ICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nKSB7XHJcbiAgICAgICAgICBpZih0eXBlb2YgdGhpcy5zZWxlY3RlZE9wdGlvbnMgIT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclRleHQgPSAoPGFueT50aGlzLnNlbGVjdGVkT3B0aW9ucykubGVuZ3RoPCh0aGlzLnNlbGVjdGlvblRleHRXaWR0aCsxKT8oPGFueT50aGlzLnNlbGVjdGVkT3B0aW9ucyk6KDxhbnk+dGhpcy5zZWxlY3RlZE9wdGlvbnMpLnN1YnN0cmluZygwLHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSsgJy4uJztcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLnNlbGVjdGVkT3B0aW9uc1t0aGlzLmRpc3BsYXlOYW1lS2V5XSAhPSAndW5kZWZpbmVkJyl7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICg8YW55PnRoaXMuc2VsZWN0ZWRPcHRpb25zKVt0aGlzLmRpc3BsYXlOYW1lS2V5XS5sZW5ndGg8KHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKzEpPyg8YW55PnRoaXMuc2VsZWN0ZWRPcHRpb25zKVt0aGlzLmRpc3BsYXlOYW1lS2V5XTooPGFueT50aGlzLnNlbGVjdGVkT3B0aW9ucylbdGhpcy5kaXNwbGF5TmFtZUtleV0uc3Vic3RyaW5nKDAsdGhpcy5zZWxlY3Rpb25UZXh0V2lkdGgpKyAnLi4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihwcm9wTmFtZSA9PT0gJ29wdGlvbkxpc3QnKXtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwib3B0aW9uTGlzdC0tPlwiLCBjaGFuZ2VzW3Byb3BOYW1lXS5jdXJyZW50VmFsdWUpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uTGlzdCA9IGNoYW5nZXNbcHJvcE5hbWVdLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0T3B0aW9uKG9wdGlvbil7XHJcbiAgICBpZih0aGlzLmlzb3B0aW9uTGlzdEFyYXlTdHJpbmcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBvcHRpb247XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gKDxhbnk+dGhpcy5zZWxlY3RlZE9wdGlvbnMpLmxlbmd0aDwodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGgrMSk/KDxhbnk+dGhpcy5zZWxlY3RlZE9wdGlvbnMpOig8YW55PnRoaXMuc2VsZWN0ZWRPcHRpb25zKS5zdWJzdHJpbmcoMCx0aGlzLnNlbGVjdGlvblRleHRXaWR0aCkrICcuLic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9IG9wdGlvbjtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xyXG4gICAgICB0aGlzLmZpbHRlclRleHQgPSAoPGFueT50aGlzLnNlbGVjdGVkT3B0aW9ucylbdGhpcy5kaXNwbGF5TmFtZUtleV0ubGVuZ3RoPCh0aGlzLnNlbGVjdGlvblRleHRXaWR0aCsxKT8oPGFueT50aGlzLnNlbGVjdGVkT3B0aW9ucylbdGhpcy5kaXNwbGF5TmFtZUtleV06KDxhbnk+dGhpcy5zZWxlY3RlZE9wdGlvbnMpW3RoaXMuZGlzcGxheU5hbWVLZXldLnN1YnN0cmluZygwLHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSsgJy4uJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcGRvd24oKXtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gICAgaWYodGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnNbdGhpcy5kaXNwbGF5TmFtZUtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICB9XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xyXG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcclxuICAgIGlmKG9wZW4pe1xyXG4gICAgICB0aGlzLmZpbHRlclRleHQgPSAnJzsgICAgICBcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgY2xpY2tvdXQoZXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuaXNvcHRpb25MaXN0QXJheVN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zW3RoaXMuZGlzcGxheU5hbWVLZXldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG59Il19