UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

392 lines (391 loc) 32.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core'; import { ActionModel, ActionModelMenu } from '../../model/models'; import { ContextMenu } from '../../ContextMenu.component'; import { DefaultActionModelMenuFactory } from '../DefaultActionModelMenuFactory'; import { Option } from '../../../decorator/Option.decorator'; import { I18N } from '../../../decorator/I18N.decorator'; import { AbstractI18NApplicable } from '../../../share/AbstractI18NApplicable'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; const /** @type {?} */ TYPE_NAME = "phx-action-btn"; export class ActionButton extends AbstractI18NApplicable { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(); this.ACTION_CONTEXT_MENU_TOP_REDUCE = 5; this.clickEvent = new EventEmitter(); this.beforeClickEvent = new EventEmitter(); this.elementRef = elementRef; this.needFocusService = needFocusService; } /** * @return {?} */ ngOnInit() { if (!this.model && this.options && this.options['model']) { this.model = new ActionModel(); this.model.setOptions(this.options['model']); } this.init(); } /** * @return {?} */ _getStyleClasses() { if (this.model !== null && this.model !== undefined) { if (this.model.styleClasses !== null && this.model.styleClasses !== undefined) { return this.model.styleClasses; } } return []; } /** * @return {?} */ init() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(this); } if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } else { this.menuFactory = new DefaultActionModelMenuFactory(); this.menuModel = this.menuFactory.createMenuModel(this); } } /** * @param {?} $event * @return {?} */ doFocus($event) { $(this.elementRef.nativeElement).find("div > button").focus(); } /** * @param {?} $event * @return {?} */ doBlur($event) { $(this.elementRef.nativeElement).find("div > button").blur(); } /** * @param {?} $event * @return {?} */ onActionBtnClicked($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler !== 'undefined') { this.model.actionPerformedHandler.call(null, $event); } else { this.onMoreBtnClicked($event); } this.beforeClickEvent.emit($event); this.clickEvent.emit($event); } /** * @param {?} $event * @return {?} */ onMoreBtnClicked($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.model.constructor.name === 'ActionModelMenu') { $event.stopPropagation(); if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { this.contextMenu.hide(); } else { let /** @type {?} */ top = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height(); let /** @type {?} */ leftActionButton = $(this.elementRef.nativeElement).offset().left; let /** @type {?} */ widthActionButton = $(this.elementRef.nativeElement).outerWidth(); let /** @type {?} */ setLeft = leftActionButton + widthActionButton; top = top - this.ACTION_CONTEXT_MENU_TOP_REDUCE; this.contextMenu.showAt(top, setLeft); } } } } /** * @return {?} */ _isShowMoreBtn() { if (this.model === null || typeof this.model === 'undefined') { return false; } if (this.model instanceof ActionModelMenu) { return true; } return false; } /** * @return {?} */ _hasIcon() { if (this.model !== null && this.model != undefined) { if (this.model.iconURL !== null && this.model.iconURL != undefined) { return true; } } return false; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickedEvent(event) { this.clickEvent = event; } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickedEvent(event) { this.beforeClickEvent = event; } /** * @param {?} context * @return {?} */ isShow(context) { if (this.model.isShow === null) { return false; } if (typeof this.model.isShow !== 'function') { return false; } return this.model.isShow(context); } /** * @param {?} context * @return {?} */ isEnabled(context) { if (this.model.isEnabled === null) { return false; } if (typeof this.model.isEnabled !== 'function') { return false; } return this.model.isEnabled(context); } /** * @return {?} */ getContextMenu() { return this.contextMenu; } /** * @param {?} menu * @return {?} */ setContextMenu(menu) { this.contextMenu = menu; if (this.contextMenu) { if (this.options && this.options['menu']) { this.contextMenu.setOptions(this.options['menu']); } if (this.i18nValue && this.i18nValue['menu']) { this.contextMenu.applyI18N(this.i18nValue['menu']); } } } /** * @return {?} */ getMenuModelFactory() { return this.menuFactory; } /** * @param {?} menuFactory * @return {?} */ setMenuModelFactory(menuFactory) { this.menuFactory = menuFactory; } /** * @return {?} */ hasModel() { if (this.model !== null && this.model != undefined) { return true; } return false; } /** * @return {?} */ getModel() { return this.model; } /** * @param {?} model * @return {?} */ setModel(model) { this.model = model; if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } } /** * @return {?} */ getMenuModel() { return this.menuModel; } /** * @param {?} event * @return {?} */ onLostFocusing(event) { } /** * @param {?} event * @return {?} */ focusing(event) { } /** * @param {?} event * @return {?} */ onLostFocus(event) { } /** * @param {?} event * @return {?} */ onFocus(event) { } } ActionButton.TYPE_NAME = TYPE_NAME; ActionButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-action-button" *ngIf="hasModel()" [ngClass]="_getStyleClasses()"> <div class="group" [class.more]="_isShowMoreBtn()" *ngIf="!_isShowMoreBtn()"> <button (click)="onActionBtnClicked($event)"> <img *ngIf="_hasIcon()" src="{{getModel().iconURL}}" title="{{getModel().label}}"> {{getModel().label}} </button> </div> <div class="more-menu" *ngIf="_isShowMoreBtn()"> <button (click)="onMoreBtnClicked($event)"> <div class="wrapper"> <div> {{getModel().label}} </div> <div> <div class="icon-arrow-down"></div> </div> </div> </button> </div> </div> <phx-context-menu *ngIf="getMenuModel() !== null" [model]="getMenuModel()" [context]="this" class="vertical"></phx-context-menu> ` },] }, ]; /** @nocollapse */ ActionButton.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; ActionButton.propDecorators = { "menuFactory": [{ type: Input },], "model": [{ type: Input },], "options": [{ type: Input },], "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ActionButton.prototype, "menuFactory", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", ActionModel) ], ActionButton.prototype, "model", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], ActionButton.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], ActionButton.prototype, "clickEvent", void 0); tslib_1.__decorate([ I18N('menu'), Option('menu'), tslib_1.__metadata("design:type", ContextMenu) ], ActionButton.prototype, "contextMenu", void 0); function ActionButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ActionButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ActionButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ActionButton.propDecorators; /** @type {?} */ ActionButton.TYPE_NAME; /** @type {?} */ ActionButton.prototype.ACTION_CONTEXT_MENU_TOP_REDUCE; /** @type {?} */ ActionButton.prototype.menuFactory; /** @type {?} */ ActionButton.prototype.model; /** @type {?} */ ActionButton.prototype.options; /** @type {?} */ ActionButton.prototype.beforeClickEvent; /** @type {?} */ ActionButton.prototype.clickEvent; /** @type {?} */ ActionButton.prototype.contextMenu; /** @type {?} */ ActionButton.prototype.menuModel; /** @type {?} */ ActionButton.prototype.elementRef; /** @type {?} */ ActionButton.prototype.needFocusService; /** @type {?} */ ActionButton.prototype._itemLostFocusingTimeout; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvZWRpdG9yLmludGVybmFsL0FjdGlvbkJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBSTdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBSTdFLHVCQUFNLFNBQVMsR0FBVyxnQkFBZ0IsQ0FBQztBQTRCM0MsTUFBTSxtQkFBb0IsU0FBUSxzQkFBc0I7Ozs7O0lBK0J0RCxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssRUFBRSxDQUFDOzhDQTVCdUMsQ0FBQztRQTZCaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztLQUMxQzs7OztJQUVN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dGVyLCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbk1vZGVsLCBBY3Rpb25Nb2RlbE1lbnUsIE1lbnVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uLy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uLy4uL0lIYXNNb2RlbCc7XG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vLi4vSU5lZWRGb2N1cyc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uLy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVudU1vZGVsRmFjdG9yeSB9IGZyb20gJy4uLy4uL0lNZW51TW9kZWxGYWN0b3J5JztcbmltcG9ydCB7IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5IH0gZnJvbSAnLi4vRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnknO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQWJzdHJhY3RJMThOQXBwbGljYWJsZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtYWN0aW9uLWJ0blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWFjdGlvbi1idXR0b25cIiAqbmdJZj1cImhhc01vZGVsKClcIiBbbmdDbGFzc109XCJfZ2V0U3R5bGVDbGFzc2VzKClcIj5cblx0PGRpdiBjbGFzcz1cImdyb3VwXCIgW2NsYXNzLm1vcmVdPVwiX2lzU2hvd01vcmVCdG4oKVwiICpuZ0lmPVwiIV9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChjbGljayk9XCJvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50KVwiPlxuXHRcdFx0PGltZyAqbmdJZj1cIl9oYXNJY29uKClcIiBzcmM9XCJ7e2dldE1vZGVsKCkuaWNvblVSTH19XCIgdGl0bGU9XCJ7e2dldE1vZGVsKCkubGFiZWx9fVwiPlxuXHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHQ8L2J1dHRvbj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJtb3JlLW1lbnVcIiAqbmdJZj1cIl9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChjbGljayk9XCJvbk1vcmVCdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiPjwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPHBoeC1jb250ZXh0LW1lbnUgKm5nSWY9XCJnZXRNZW51TW9kZWwoKSAhPT0gbnVsbFwiIFttb2RlbF09XCJnZXRNZW51TW9kZWwoKVwiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCI+PC9waHgtY29udGV4dC1tZW51PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25CdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIGltcGxlbWVudHMgT25Jbml0LCBJQ29udGV4dCwgSUhhc01vZGVsLCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFOiBudW1iZXIgPSA1OyAvLyBhcyBwaXhlbFxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3Rvcnk7XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbW9kZWw6IEFjdGlvbk1vZGVsO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuICBAT3B0aW9uKCdiZWZvcmVDbGljaycpXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNsaWNrJylcbiAgcHJpdmF0ZSBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignY2xpY2snKVxuICBAT3V0cHV0KCdwaHhDbGljaycpXG4gIHByaXZhdGUgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIGNvbnRleHRNZW51ICYgbWVudU1vZGVsIGlzIGR5bmFtaWNhbGx5IGNyZWF0ZWQuXG4gIC8vICEgVE9ETyBXaHkgXCJjb250ZXh0TWVudVwiIGlzIG5vdCBib3VuZCB0eSBAVmlld0NoaWxkP1xuICBASTE4TignbWVudScpXG4gIEBPcHRpb24oJ21lbnUnKVxuICBwcml2YXRlIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgcHJpdmF0ZSBtZW51TW9kZWw6IE1lbnVNb2RlbDtcblxuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcbiAgcHJpdmF0ZSBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kZWwgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1snbW9kZWwnXSkge1xuICAgICAgdGhpcy5tb2RlbCA9IG5ldyBBY3Rpb25Nb2RlbCgpO1xuXG4gICAgICB0aGlzLm1vZGVsLnNldE9wdGlvbnModGhpcy5vcHRpb25zWydtb2RlbCddKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBfZ2V0U3R5bGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBpZih0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT09IHVuZGVmaW5lZCl7XG4gICAgICBpZih0aGlzLm1vZGVsLnN0eWxlQ2xhc3NlcyAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsLnN0eWxlQ2xhc3NlcyAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuc3R5bGVDbGFzc2VzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LnNldENvbnRleHQodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZW51RmFjdG9yeSA9IG5ldyBEZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSgpO1xuICAgICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcImRpdiA+IGJ1dHRvblwiKS5mb2N1cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvQmx1cigkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcImRpdiA+IGJ1dHRvblwiKS5ibHVyKCk7XG4gIH1cblxuICBwdWJsaWMgb25BY3Rpb25CdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlci5jYWxsKG51bGwsICRldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Nb3JlQnRuQ2xpY2tlZCgkZXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5lbWl0KCRldmVudCk7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBY3Rpb25Nb2RlbE1lbnUnKSB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgbGV0IHRvcCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcCArICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmhlaWdodCgpO1xuICAgICAgICAgIGxldCBsZWZ0QWN0aW9uQnV0dG9uID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICBsZXQgd2lkdGhBY3Rpb25CdXR0b24gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKCk7XG4gICAgICAgICAgbGV0IHNldExlZnQgPSBsZWZ0QWN0aW9uQnV0dG9uICsgd2lkdGhBY3Rpb25CdXR0b247ICAgXG4gICAgICAgICAgdG9wID0gdG9wIC0gdGhpcy5BQ1RJT05fQ09OVEVYVF9NRU5VX1RPUF9SRURVQ0U7XG5cbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3dBdCh0b3AsIHNldExlZnQpOyBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBfaXNTaG93TW9yZUJ0bigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCBpbnN0YW5jZW9mIEFjdGlvbk1vZGVsTWVudSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIF9oYXNJY29uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pY29uVVJMICE9PSBudWxsICYmIHRoaXMubW9kZWwuaWNvblVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldENsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUNsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlQ2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGlzU2hvdyhjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNTaG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTaG93KGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzRW5hYmxlZChjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzRW5hYmxlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNFbmFibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNFbmFibGVkKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRleHRNZW51KCk6IENvbnRleHRNZW51IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250ZXh0TWVudShtZW51OiBDb250ZXh0TWVudSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtZW51J10pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbWVudSddKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmkxOG5WYWx1ZSAmJiB0aGlzLmkxOG5WYWx1ZVsnbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuYXBwbHlJMThOKHRoaXMuaTE4blZhbHVlWydtZW51J10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWxGYWN0b3J5KCk6IElNZW51TW9kZWxGYWN0b3J5IHtcbiAgICByZXR1cm4gdGhpcy5tZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZW51TW9kZWxGYWN0b3J5KG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeSk6IHZvaWQge1xuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbCgpOiBNZW51TW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcbiAgfVxuICBcbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c2luZyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RGb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgXG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxufVxuIl19