com.phloxui
Version:
PhloxUI Ng2+ Framework
401 lines (400 loc) • 29.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { MenuModel } from './model/models';
import { AbstractHasData } from './AbstractHasData';
import { Option } from '../decorator/Option.decorator';
import { I18N } from '../decorator/I18N.decorator';
import { NeedFocusService } from '../service/NeedFocusService.service';
const /** @type {?} */ TYPE_NAME = "phx-context-menu-btn";
const /** @type {?} */ TYPE_PARENT = "parent";
const /** @type {?} */ TYPE_CHILDREN = "children";
const /** @type {?} */ TYPE_DISTANCE = "distance";
export class ContextMenuButton extends AbstractHasData {
/**
* @param {?} elementRef
* @param {?} needFocusService
*/
constructor(elementRef, needFocusService) {
super(elementRef);
this.needFocusService = needFocusService;
this.autoFocus = true;
}
/**
* @return {?}
*/
ngOnInit() {
this.init();
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.setContext(null);
}
}
/**
* @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);
}
}
/**
* @return {?}
*/
recreateMenuModel() {
this.menuModel = this.menuFactory.createMenuModel(this);
}
/**
* @param {?} $event
* @return {?}
*/
onMoreButtonClick($event) {
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
if (this.contextMenu.isShow()) {
setTimeout(() => {
this.hideMenu();
}, 50);
}
else {
let /** @type {?} */ anchorEl = this.elementRef.nativeElement;
if (this.anchorComponent !== null && this.anchorComponent !== undefined) {
anchorEl = this.anchorComponent.elementRef.nativeElement;
}
else if (this.anchorSelector !== null && typeof this.anchorSelector === 'string') {
let /** @type {?} */ selector = $(this.anchorSelector);
if (selector.length > 0) {
anchorEl = selector[0];
}
}
let /** @type {?} */ offsetTop = 0;
let /** @type {?} */ offsetLeft = 0;
if (this.menuOffsetTop !== null && typeof this.menuOffsetTop === 'number') {
offsetTop = this.menuOffsetTop;
}
if (this.menuOffsetLeft !== null && typeof this.menuOffsetLeft === 'number') {
offsetLeft = this.menuOffsetLeft;
}
let /** @type {?} */ top = $(anchorEl).offset().top + $(anchorEl).height() + offsetTop;
let /** @type {?} */ leftEllipsisButton = $(this.elementRef.nativeElement).offset().left + offsetLeft;
let /** @type {?} */ widthEllipsisButton = $(this.elementRef.nativeElement).outerWidth();
let /** @type {?} */ setLeft = leftEllipsisButton + widthEllipsisButton;
this.contextMenu.showAt(top, setLeft);
}
}
}
/**
* @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 {?}
*/
getMenuModel() {
return this.menuModel;
}
/**
* @return {?}
*/
isSelfDataDirty() {
return false;
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
}
/**
* @return {?}
*/
selfResetData() {
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @return {?}
*/
isIconURLEmpty() {
if (this.iconURL == null || this.iconURL === undefined) {
return true;
}
return false;
}
/**
* @return {?}
*/
getIconURL() {
return this.iconURL;
}
/**
* @return {?}
*/
getStyleClasses() {
return this.styleClasses;
}
/**
* @return {?}
*/
hideMenu() {
if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.hide();
}
}
/**
* @return {?}
*/
isShowMenu() {
return this.contextMenu.isShow();
}
/**
* @return {?}
*/
isAutoFocus() {
return this.autoFocus;
}
/**
* @param {?} event
* @return {?}
*/
onFocus(event) {
}
/**
* @param {?} event
* @return {?}
*/
onLostFocus(event) {
this.hideMenu();
}
/**
* @param {?} $event
* @return {?}
*/
_doFocus($event) {
// do something when focus
}
/**
* @param {?} $event
* @return {?}
*/
_doLostFocus($event) {
if (this.needFocusService !== null) {
this.needFocusService.resetFocusingComponent(this);
}
}
}
ContextMenuButton.TYPE_NAME = TYPE_NAME;
ContextMenuButton.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-context-menu-btn" [ngClass]="getStyleClasses()" (click)="onMoreButtonClick($event)">
<div class="icon-img" *ngIf="!isIconURLEmpty()">
<img src="{{getIconURL()}}">
</div>
<button type="button" class="fake" (focusin)="_doFocus($event)" (blur)="_doLostFocus($event)"></button>
</div>
<phx-context-menu [model]="getMenuModel()" [context]="this" class="vertical" [autoFocus]="isAutoFocus()"></phx-context-menu>
`
},] },
];
/** @nocollapse */
ContextMenuButton.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
];
ContextMenuButton.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 },],
"menuFactory": [{ type: Input },],
"iconURL": [{ type: Input }, { type: Output },],
"styleClasses": [{ type: Input }, { type: Output },],
"anchorComponent": [{ type: Input },],
"anchorSelector": [{ type: Input },],
"menuOffsetTop": [{ type: Input },],
"menuOffsetLeft": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ContextMenuButton.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ContextMenuButton.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ContextMenuButton.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ContextMenuButton.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ContextMenuButton.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ContextMenuButton.prototype, "disabled", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ContextMenuButton.prototype, "menuFactory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ContextMenuButton.prototype, "anchorComponent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ContextMenuButton.prototype, "anchorSelector", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ContextMenuButton.prototype, "menuOffsetTop", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ContextMenuButton.prototype, "menuOffsetLeft", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ContextMenuButton.prototype, "loadEvent", void 0);
tslib_1.__decorate([
I18N(),
tslib_1.__metadata("design:type", MenuModel)
], ContextMenuButton.prototype, "menuModel", void 0);
function ContextMenuButton_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ContextMenuButton.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ContextMenuButton.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ContextMenuButton.propDecorators;
/** @type {?} */
ContextMenuButton.TYPE_NAME;
/** @type {?} */
ContextMenuButton.prototype.dataParent;
/** @type {?} */
ContextMenuButton.prototype.ignoreParentData;
/** @type {?} */
ContextMenuButton.prototype.data;
/** @type {?} */
ContextMenuButton.prototype.ignoreParentDisabled;
/** @type {?} */
ContextMenuButton.prototype.delegateHistory;
/** @type {?} */
ContextMenuButton.prototype.onDisabled;
/** @type {?} */
ContextMenuButton.prototype.onEnabled;
/** @type {?} */
ContextMenuButton.prototype.loadingEnabled;
/** @type {?} */
ContextMenuButton.prototype.i18nKey;
/** @type {?} */
ContextMenuButton.prototype.bypass;
/** @type {?} */
ContextMenuButton.prototype.options;
/** @type {?} */
ContextMenuButton.prototype.disabled;
/** @type {?} */
ContextMenuButton.prototype.menuFactory;
/** @type {?} */
ContextMenuButton.prototype.iconURL;
/** @type {?} */
ContextMenuButton.prototype.styleClasses;
/** @type {?} */
ContextMenuButton.prototype.anchorComponent;
/** @type {?} */
ContextMenuButton.prototype.anchorSelector;
/** @type {?} */
ContextMenuButton.prototype.menuOffsetTop;
/** @type {?} */
ContextMenuButton.prototype.menuOffsetLeft;
/** @type {?} */
ContextMenuButton.prototype.loadEvent;
/** @type {?} */
ContextMenuButton.prototype.menuModel;
/** @type {?} */
ContextMenuButton.prototype.contextMenu;
/** @type {?} */
ContextMenuButton.prototype.needFocusService;
/** @type {?} */
ContextMenuButton.prototype.autoFocus;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1lbnVCdXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0NvbnRleHRNZW51QnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUl2RSx1QkFBTSxTQUFTLEdBQVcsc0JBQXNCLENBQUM7QUFFakQsdUJBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3Qix1QkFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO0FBQ2pDLHVCQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFjakMsTUFBTSx3QkFBeUIsU0FBUSxlQUFlOzs7OztJQWlGcEQsWUFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUNwRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQ3ZCOzs7O0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Ozs7SUFHUCxXQUFXO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdB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QUs7d0JBR0wsS0FBSzt1QkFHTCxLQUFLLFNBQUMsWUFBWTt3QkFHbEIsS0FBSzt5QkFFTCxLQUFLOzRCQUtMLEtBQUs7d0JBS0wsS0FBSyxZQUNMLE1BQU07NkJBRU4sS0FBSyxZQUNMLE1BQU07Z0NBRU4sS0FBSzsrQkFHTCxLQUFLOzhCQUdMLEtBQUs7K0JBR0wsS0FBSzswQkFNTCxNQUFNLFNBQUMsU0FBUzs7O0lBOURoQixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7c0NBQ2EsUUFBUTs7O0lBRTdCLE1BQU0sRUFBRTtzQ0FDWSxRQUFROzs7SUFFNUIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztJQUtwQixNQUFNLEVBQUU7Ozs7SUFLUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7Ozs7SUFVUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFNUixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUloQyxJQUFJLEVBQUU7c0NBQ2MsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51TW9kZWwgfSBmcm9tICcuL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAnLi9Db250ZXh0TWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4vSUNvbnRleHQnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi9JTmVlZEZvY3VzJztcclxuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuL0lNZW51TW9kZWxGYWN0b3J5JztcclxuaW1wb3J0IHsgQWJzdHJhY3RIYXNEYXRhIH0gZnJvbSAnLi9BYnN0cmFjdEhhc0RhdGEnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1jb250ZXh0LW1lbnUtYnRuXCI7XHJcblxyXG5jb25zdCBUWVBFX1BBUkVOVCA9IFwicGFyZW50XCI7XHJcbmNvbnN0IFRZUEVfQ0hJTERSRU4gPSBcImNoaWxkcmVuXCI7XHJcbmNvbnN0IFRZUEVfRElTVEFOQ0UgPSBcImRpc3RhbmNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWNvbnRleHQtbWVudS1idG5cIiBbbmdDbGFzc109XCJnZXRTdHlsZUNsYXNzZXMoKVwiIChjbGljayk9XCJvbk1vcmVCdXR0b25DbGljaygkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImljb24taW1nXCIgKm5nSWY9XCIhaXNJY29uVVJMRW1wdHkoKVwiPlxyXG4gICAgPGltZyBzcmM9XCJ7e2dldEljb25VUkwoKX19XCI+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmYWtlXCIgKGZvY3VzaW4pPVwiX2RvRm9jdXMoJGV2ZW50KVwiIChibHVyKT1cIl9kb0xvc3RGb2N1cygkZXZlbnQpXCI+PC9idXR0b24+XHJcbjwvZGl2PlxyXG48cGh4LWNvbnRleHQtbWVudSBbbW9kZWxdPVwiZ2V0TWVudU1vZGVsKClcIiBbY29udGV4dF09XCJ0aGlzXCIgY2xhc3M9XCJ2ZXJ0aWNhbFwiIFthdXRvRm9jdXNdPVwiaXNBdXRvRm9jdXMoKVwiPjwvcGh4LWNvbnRleHQtbWVudT5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVCdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEhhc0RhdGEgaW1wbGVtZW50cyBPbkluaXQsIElDb250ZXh0LCBPbkRlc3Ryb3ksIElOZWVkRm9jdXMge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxyXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxyXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvLyAtLS0gZnJvbSBTZWxmXHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeTtcclxuXHJcbiAgQElucHV0KClcclxuICBAT3V0cHV0KClcclxuICBwcml2YXRlIGljb25VUkw6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPdXRwdXQoKVxyXG4gIHByaXZhdGUgc3R5bGVDbGFzc2VzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgYW5jaG9yQ29tcG9uZW50OiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcml2YXRlIGFuY2hvclNlbGVjdG9yOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcml2YXRlIG1lbnVPZmZzZXRUb3A6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgbWVudU9mZnNldExlZnQ6IHN0cmluZztcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIC0tLSBmcm9tIFNlbGZcclxuXHJcbiAgQEkxOE4oKVxyXG4gIHByb3RlY3RlZCBtZW51TW9kZWw6IE1lbnVNb2RlbDtcclxuICBwcm90ZWN0ZWQgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBhdXRvRm9jdXM6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xyXG5cclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XHJcbiAgICB0aGlzLmF1dG9Gb2N1cyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0Q29udGV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlY3JlYXRlTWVudU1vZGVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk1vcmVCdXR0b25DbGljaygkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLmhpZGVNZW51KCk7XHJcbiAgICAgICAgfSwgNTApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBhbmNob3JFbDogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFuY2hvckNvbXBvbmVudCAhPT0gbnVsbCAmJiB0aGlzLmFuY2hvckNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBhbmNob3JFbCA9IHRoaXMuYW5jaG9yQ29tcG9uZW50LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYW5jaG9yU2VsZWN0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYW5jaG9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0b3I6IGFueSA9ICQodGhpcy5hbmNob3JTZWxlY3Rvcik7XHJcblxyXG4gICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYW5jaG9yRWwgPSBzZWxlY3RvclswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvZmZzZXRUb3A6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldExlZnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lbnVPZmZzZXRUb3AgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudU9mZnNldFRvcCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIG9mZnNldFRvcCA9IHRoaXMubWVudU9mZnNldFRvcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWVudU9mZnNldExlZnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudU9mZnNldExlZnQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICBvZmZzZXRMZWZ0ID0gdGhpcy5tZW51T2Zmc2V0TGVmdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3AgPSAkKGFuY2hvckVsKS5vZmZzZXQoKS50b3AgKyAkKGFuY2hvckVsKS5oZWlnaHQoKSArIG9mZnNldFRvcDsgIFxyXG4gICAgICAgIGxldCBsZWZ0RWxsaXBzaXNCdXR0b24gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0ICsgb2Zmc2V0TGVmdDtcclxuICAgICAgICBsZXQgd2lkdGhFbGxpcHNpc0J1dHRvbiA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgoKTtcclxuICAgICAgICBsZXQgc2V0TGVmdCA9IGxlZnRFbGxpcHNpc0J1dHRvbiArIHdpZHRoRWxsaXBzaXNCdXR0b247ICBcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3dBdCh0b3AsIHNldExlZnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29udGV4dE1lbnUoKTogQ29udGV4dE1lbnUge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29udGV4dE1lbnUobWVudTogQ29udGV4dE1lbnUpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1lbnVNb2RlbEZhY3RvcnkoKTogSU1lbnVNb2RlbEZhY3Rvcnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNZW51TW9kZWwoKTogTWVudU1vZGVsIHtcclxuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgIHJlc29sdmUobnVsbCk7ICAgICB9KTsgICB9ICBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSWNvblVSTEVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaWNvblVSTCA9PSBudWxsIHx8IHRoaXMuaWNvblVSTCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJY29uVVJMKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uVVJMO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0eWxlQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHlsZUNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZU1lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1Nob3dNZW51KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNBdXRvRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRvRm9jdXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRlTWVudSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIF9kb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGRvIHNvbWV0aGluZyB3aGVuIGZvY3VzXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2RvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UucmVzZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19