UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

370 lines (369 loc) 28.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input } from '@angular/core'; import { TabModel } from '../../model/TabModel'; import { AbstractHasDataHelp } from '../../AbstractHasDataHelp'; import { AbstractDataView } from '../../dataview/AbstractDataView'; import { Option } from '../../../decorator/Option.decorator'; import { I18N } from '../../../decorator/I18N.decorator'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; const /** @type {?} */ TYPE_NAME = "phx-tab"; export class Tab extends AbstractHasDataHelp { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(elementRef); this.showMoreMenu = false; this.needFocusService = needFocusService; } /** * @return {?} */ ngOnInit() { if (this.tabPane !== null && typeof this.tabPane !== 'undefined') { this.tabPane.addTabHeader(this); } if (this.model !== null && typeof this.model !== 'undefined') { if (this.model.data !== null && typeof this.model.data !== 'undefined') { this.data = this.model.data; } } } /** * @return {?} */ getTabLabel() { if (this.model !== null && typeof this.model !== 'undefined') { let /** @type {?} */ defaultLabel = (this.model.label === null || typeof this.model.label === 'undefined') ? '' : this.model.label; let /** @type {?} */ resolveLabel = null; if (this.model.labelField !== null && typeof this.model.labelField !== 'undefined' && this.model.labelField !== '') { resolveLabel = AbstractDataView.resolveMappedData(this.model.labelField, this.data); } if (resolveLabel !== null && typeof resolveLabel === 'string' && resolveLabel !== '') { return resolveLabel; } else { return defaultLabel; } } return ''; } /** * @return {?} */ init() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(this); } } /** * @param {?} $event * @return {?} */ onMoreButtonClick($event) { $event.stopPropagation(); if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { if (this.needFocusService !== null && this.needFocusService !== undefined) { this.needFocusService.resetFocusingComponent(this); } } else { let /** @type {?} */ top = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height(); let /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left - 1; let /** @type {?} */ width = $(this.elementRef.nativeElement).width() + 2; this.contextMenu.showAt(top, left, width); if (this.needFocusService !== null && this.needFocusService !== undefined) { this.needFocusService.setFocusingComponent(this); } } } } /** * @return {?} */ hideMenu() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } } /** * @return {?} */ getIndex() { if (this.tabPane !== null && typeof this.tabPane !== 'undefined') { return this.tabPane.getTabModelIndex(this.model); } return -1; } /** * @param {?} selected * @return {?} */ setSelected(selected) { this.selected = selected; } /** * @return {?} */ getContextMenu() { return this.contextMenu; } /** * @param {?} menu * @return {?} */ setContextMenu(menu) { this.contextMenu = menu; } /** * @return {?} */ getMenuModelFactory() { return this.menuFactory; } /** * @param {?} menuFactory * @return {?} */ setMenuModelFactory(menuFactory) { this.menuFactory = menuFactory; } /** * @return {?} */ getModel() { return this.model; } /** * @return {?} */ isSelfDataDirty() { return false; } /** * @param {?} data * @return {?} */ selfSaveData(data) { } /** * @return {?} */ selfResetData() { } /** * @return {?} */ getTabBody() { if (this.tabPane !== null && typeof this.tabPane !== 'undefined') { let /** @type {?} */ index = this.tabPane.getTabHeaderIndex(this); return this.tabPane.getTabBody(index); } return null; } /** * @return {?} */ isShowMoreMenu() { return this.showMoreMenu; } /** * @return {?} */ doPreload() { return Promise.resolve(null); } /** * @return {?} */ doLoaded() { } /** * @param {?} $event * @return {?} */ _doFocus($event) { // do something when focus } /** * @param {?} $event * @return {?} */ _doLostFocus($event) { if (this.needFocusService !== null) { this.needFocusService.resetFocusingComponent(this); } } /** * @param {?} event * @return {?} */ onFocus(event) { $(this.elementRef.nativeElement).find(".fake").focus(); } /** * @param {?} event * @return {?} */ onLostFocus(event) { if (this.lostFocusTimeout !== null && this.lostFocusTimeout !== undefined) { clearTimeout(this.lostFocusTimeout); } this.lostFocusTimeout = setTimeout(() => { this.hideMenu(); $(this.elementRef.nativeElement).find(".fake").blur(); }, 320); } } Tab.TYPE_NAME = TYPE_NAME; Tab.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="table-wrapper"> <div class="table-cell-wrapper middle"> <div *ngIf="getModel() != null" class="phx-tab" [class.dirty]="isDataDirty()" [ngClass]="getModel().styleClass"> <div class="tab-name">{{getTabLabel()}}</div> <div *ngIf="isShowMoreMenu()" class="tab-vertical-ellipsis" (click)="onMoreButtonClick($event)"></div> <phx-context-menu [model]="getModel().menuModel" [dataParent]="this" [context]="this" class="vertical" [autoFocus]="false"></phx-context-menu> </div> </div> <button type="button" class="fake" (focusin)="_doFocus($event)" (blur)="_doLostFocus($event)"></button> </div> ` },] }, ]; /** @nocollapse */ Tab.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; Tab.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "help": [{ type: Input },], "model": [{ type: Input },], "tabPane": [{ type: Input },], "menuFactory": [{ type: Input },], "showMoreMenu": [{ type: Input },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], Tab.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], Tab.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], Tab.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], Tab.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], Tab.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], Tab.prototype, "disabled", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], Tab.prototype, "help", void 0); function Tab_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ Tab.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ Tab.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ Tab.propDecorators; /** @type {?} */ Tab.TYPE_NAME; /** @type {?} */ Tab.prototype.dataParent; /** @type {?} */ Tab.prototype.ignoreParentData; /** @type {?} */ Tab.prototype.data; /** @type {?} */ Tab.prototype.ignoreParentDisabled; /** @type {?} */ Tab.prototype.delegateHistory; /** @type {?} */ Tab.prototype.onDisabled; /** @type {?} */ Tab.prototype.onEnabled; /** @type {?} */ Tab.prototype.loadingEnabled; /** @type {?} */ Tab.prototype.i18nKey; /** @type {?} */ Tab.prototype.bypass; /** @type {?} */ Tab.prototype.options; /** @type {?} */ Tab.prototype.disabled; /** @type {?} */ Tab.prototype.help; /** @type {?} */ Tab.prototype.model; /** @type {?} */ Tab.prototype.tabPane; /** @type {?} */ Tab.prototype.contextMenu; /** @type {?} */ Tab.prototype.menuFactory; /** @type {?} */ Tab.prototype.selected; /** @type {?} */ Tab.prototype.showMoreMenu; /** @type {?} */ Tab.prototype.lostFocusTimeout; /** @type {?} */ Tab.prototype.needFocusService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy90YWIuaW50ZXJuYWwvVGFiLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFNaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUk3RSx1QkFBTSxTQUFTLEdBQVcsU0FBUyxDQUFDO0FBZ0JwQyxNQUFNLFVBQVcsU0FBUSxtQkFBbUI7Ozs7O0lBNkQxQyxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7S0FDMUM7Ozs7SUFFTSxRQUFRO1FBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxL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QUU7c0NBQ2EsUUFBUTs7O0lBRTdCLE1BQU0sRUFBRTtzQ0FDWSxRQUFROzs7SUFFNUIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztJQUtwQixNQUFNLEVBQUU7Ozs7SUFJUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9UYWJNb2RlbCc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uLy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uLy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuLi8uLi9JTWVudU1vZGVsRmFjdG9yeSc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGFIZWxwIH0gZnJvbSAnLi4vLi4vQWJzdHJhY3RIYXNEYXRhSGVscCc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFWaWV3IH0gZnJvbSAnLi4vLi4vZGF0YXZpZXcvQWJzdHJhY3REYXRhVmlldyc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC10YWJcIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHQ8ZGl2ICpuZ0lmPVwiZ2V0TW9kZWwoKSAhPSBudWxsXCIgY2xhc3M9XCJwaHgtdGFiXCIgW2NsYXNzLmRpcnR5XT1cImlzRGF0YURpcnR5KClcIiBbbmdDbGFzc109XCJnZXRNb2RlbCgpLnN0eWxlQ2xhc3NcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWItbmFtZVwiPnt7Z2V0VGFiTGFiZWwoKX19PC9kaXY+IDxkaXYgKm5nSWY9XCJpc1Nob3dNb3JlTWVudSgpXCIgY2xhc3M9XCJ0YWItdmVydGljYWwtZWxsaXBzaXNcIiAoY2xpY2spPVwib25Nb3JlQnV0dG9uQ2xpY2soJGV2ZW50KVwiPjwvZGl2PlxuXHRcdFx0PHBoeC1jb250ZXh0LW1lbnUgW21vZGVsXT1cImdldE1vZGVsKCkubWVudU1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCIgW2F1dG9Gb2N1c109XCJmYWxzZVwiPjwvcGh4LWNvbnRleHQtbWVudT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmFrZVwiIChmb2N1c2luKT1cIl9kb0ZvY3VzKCRldmVudClcIiAoYmx1cik9XCJfZG9Mb3N0Rm9jdXMoJGV2ZW50KVwiPjwvYnV0dG9uPlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRhYiBleHRlbmRzIEFic3RyYWN0SGFzRGF0YUhlbHAgaW1wbGVtZW50cyBPbkluaXQsIElDb250ZXh0LCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcbiAgQElucHV0KCdpMThuQnlwYXNzJylcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YUhlbHBcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcblxuICAvLyAtLS0gZnJvbSBzZWxmXG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbW9kZWw6IFRhYk1vZGVsO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHRhYlBhbmU6IGFueTtcbiAgcHJpdmF0ZSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5O1xuICBwcml2YXRlIHNlbGVjdGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNob3dNb3JlTWVudTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb3N0Rm9jdXNUaW1lb3V0OiBhbnk7XG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcbiAgICB0aGlzLnNob3dNb3JlTWVudSA9IGZhbHNlO1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFiUGFuZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy50YWJQYW5lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy50YWJQYW5lLmFkZFRhYkhlYWRlcih0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMubW9kZWwuZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFiTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBkZWZhdWx0TGFiZWwgPSAodGhpcy5tb2RlbC5sYWJlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbC5sYWJlbCA9PT0gJ3VuZGVmaW5lZCcpID8gJycgOiB0aGlzLm1vZGVsLmxhYmVsO1xuICAgICAgbGV0IHJlc29sdmVMYWJlbCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tb2RlbC5sYWJlbEZpZWxkICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmxhYmVsRmllbGQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubW9kZWwubGFiZWxGaWVsZCAhPT0gJycpIHtcbiAgICAgICAgcmVzb2x2ZUxhYmVsID0gQWJzdHJhY3REYXRhVmlldy5yZXNvbHZlTWFwcGVkRGF0YSh0aGlzLm1vZGVsLmxhYmVsRmllbGQsIHRoaXMuZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZlTGFiZWwgIT09IG51bGwgJiYgdHlwZW9mIHJlc29sdmVMYWJlbCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZUxhYmVsICE9PSAnJykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMYWJlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdXR0b25DbGljaygkZXZlbnQ6IEV2ZW50KSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xuICAgICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9PSBudWxsICYmIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS50b3AgKyAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5oZWlnaHQoKTtcbiAgICAgICAgbGV0IGxlZnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0IC0gMTtcbiAgICAgICAgbGV0IHdpZHRoID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkud2lkdGgoKSArIDI7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93QXQodG9wLCBsZWZ0LCB3aWR0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCAmJiB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlTWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudGFiUGFuZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy50YWJQYW5lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMudGFiUGFuZS5nZXRUYWJNb2RlbEluZGV4KHRoaXMubW9kZWwpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dE1lbnUoKTogQ29udGV4dE1lbnUge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIHNldENvbnRleHRNZW51KG1lbnU6IENvbnRleHRNZW51KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0TWVudSA9IG1lbnU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudU1vZGVsRmFjdG9yeSgpOiBJTWVudU1vZGVsRmFjdG9yeSB7XG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogVGFiTW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIGlzU2VsZkRhdGFEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIGdldFRhYkJvZHkoKTogYW55IHtcbiAgICBpZiAodGhpcy50YWJQYW5lICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnRhYlBhbmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLnRhYlBhbmUuZ2V0VGFiSGVhZGVySW5kZXgodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy50YWJQYW5lLmdldFRhYkJvZHkoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBpc1Nob3dNb3JlTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93TW9yZU1lbnU7XG4gIH1cblxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBkb0xvYWRlZCgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIF9kb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBkbyBzb21ldGhpbmcgd2hlbiBmb2N1c1xuICB9XG5cbiAgcHVibGljIF9kb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCIuZmFrZVwiKS5mb2N1cygpXG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmKHRoaXMubG9zdEZvY3VzVGltZW91dCAhPT0gbnVsbCAmJiB0aGlzLmxvc3RGb2N1c1RpbWVvdXQgIT09IHVuZGVmaW5lZCl7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5sb3N0Rm9jdXNUaW1lb3V0KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvc3RGb2N1c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpPT57XG4gICAgICB0aGlzLmhpZGVNZW51KCk7XG5cbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCIuZmFrZVwiKS5ibHVyKCk7XG4gICAgfSwgMzIwKTtcbiAgfVxufVxuIl19