UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

424 lines (423 loc) 31.9 kB
/** * @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 { AbstractSelectOneItem } from './AbstractSelectOneItem'; import { Option } from '../../../decorator/Option.decorator'; import { DefaultSelectItemModel } from '../../model/DefaultSelectItemModel'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; import { EventUtils, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/shares'; var /** @type {?} */ TYPE_NAME = "phx-multiple-state-checkbox"; var /** @type {?} */ DEFAULT_FIELD = "label"; var MultipleStateCheckBox = /** @class */ (function (_super) { tslib_1.__extends(MultipleStateCheckBox, _super); function MultipleStateCheckBox(elementRef, needFocusService) { var _this = _super.call(this, elementRef, needFocusService) || this; _this.beforeClickEvent = new EventEmitter(); _this.clickEvent = new EventEmitter(); _this.beforeFocusEvent = new EventEmitter(); _this.focusEvent = new EventEmitter(); _this.beforeLostFocusEvent = new EventEmitter(); _this.lostFocusEvent = new EventEmitter(); return _this; } /** * @return {?} */ MultipleStateCheckBox.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; _super.prototype.ngOnInit.call(this); // if check null if (this.states !== null && this.states !== undefined) { if (Array.isArray(this.states)) { var /** @type {?} */ selectItems = []; var /** @type {?} */ label = 0; try { for (var _a = tslib_1.__values(this.states), _b = _a.next(); !_b.done; _b = _a.next()) { var item = _b.value; selectItems.push(new DefaultSelectItemModel(label + "", item)); ++label; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } this.setItems(selectItems); } } setTimeout(function () { _this.initEventHandlers(); }, 20); var e_1, _c; }; /** * @return {?} */ MultipleStateCheckBox.prototype.initEventHandlers = /** * @return {?} */ function () { var _this = this; $(this.elementRef.nativeElement).find('button.fake').focus(function ($event) { _this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.fake').blur(function ($event) { _this.onLostFocusing($event); }); }; /** * @return {?} */ MultipleStateCheckBox.prototype.getCurrentState = /** * @return {?} */ function () { return this.getSelectedValue(); }; /** * @return {?} */ MultipleStateCheckBox.prototype.toggleState = /** * @return {?} */ function () { if (this.isDisabled()) { return; } if (this.getSelectedIndex() === -1) { this.setState(0); } // set current state index if (this.getSelectedIndex() === this.getItems().length - 1) { this.setState(0); } else { this.setState((this.getSelectedIndex()) + 1); } }; /** * @param {?} state * @return {?} */ MultipleStateCheckBox.prototype.setState = /** * @param {?} state * @return {?} */ function (state) { this.setSelectedIndex(state); }; /** * @return {?} */ MultipleStateCheckBox.prototype.getStateStyleGenerater = /** * @return {?} */ function () { return this.stateStyleGenerater; }; /** * @param {?} stateStyleGenerater * @return {?} */ MultipleStateCheckBox.prototype.setStateStyleGenerater = /** * @param {?} stateStyleGenerater * @return {?} */ function (stateStyleGenerater) { this.stateStyleGenerater = stateStyleGenerater; }; /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ MultipleStateCheckBox.prototype.onClick = /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } if (this.isReadOnly()) { return; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.toggleState(); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeClickEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitClickEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?=} $event * @return {?} */ MultipleStateCheckBox.prototype.emitBeforeClickEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = null; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } }; /** * @param {?=} $event * @return {?} */ MultipleStateCheckBox.prototype.emitClickEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = null; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ MultipleStateCheckBox.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ MultipleStateCheckBox.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.resetFocusingComponent($event); }; /** * @param {?} $event * @return {?} */ MultipleStateCheckBox.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { if ($(this.elementRef.nativeElement).find('button.fake:focus').length > 0) { $(this.elementRef.nativeElement).find('button.fake').focus(); } }; /** * @param {?} $event * @return {?} */ MultipleStateCheckBox.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { if ($(this.elementRef.nativeElement).find('button.fake:focus').length > 0) { $(this.elementRef.nativeElement).find('button.fake').blur(); } }; /** * @param {?} inputValue * @param {?} results * @return {?} */ MultipleStateCheckBox.prototype.onValidationEnd = /** * @param {?} inputValue * @param {?} results * @return {?} */ function (inputValue, results) { //! do sthing }; /** * @param {?} data * @param {?} inputVal * @return {?} */ MultipleStateCheckBox.prototype.onDataChange = /** * @param {?} data * @param {?} inputVal * @return {?} */ function (data, inputVal) { }; /** * @return {?} */ MultipleStateCheckBox.prototype._getClassState = /** * @return {?} */ function () { if (this.stateStyleGenerater !== null && typeof this.stateStyleGenerater !== 'undefined') { return this.stateStyleGenerater.call(this, this.getCurrentState()); } return ""; }; MultipleStateCheckBox.TYPE_NAME = TYPE_NAME; MultipleStateCheckBox.DEFAULT_FIELD = DEFAULT_FIELD; MultipleStateCheckBox.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-multiple-state-checkbox\">\n <button type=\"button\" class=\"fake\" (focusin)=\"onFocusing($event)\" (blur)=\"onLostFocusing($event)\"></button>\n <div [ngClass]=\"_getClassState()\" [class.disabled]=\"isDisabled()\" (click)=\"onClick($event)\">\n </div>\n</div>\n" },] }, ]; /** @nocollapse */ MultipleStateCheckBox.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, ]; }; MultipleStateCheckBox.propDecorators = { "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "stateStyleGenerater": [{ type: Input },], "states": [{ type: Input },], "field": [{ type: Input },], "data": [{ type: Input },], "ignoreParentData": [{ 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 },], "dataParent": [{ type: Input },], }; tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MultipleStateCheckBox.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MultipleStateCheckBox.prototype, "stateStyleGenerater", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], MultipleStateCheckBox.prototype, "states", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MultipleStateCheckBox.prototype, "disabled", void 0); return MultipleStateCheckBox; }(AbstractSelectOneItem)); export { MultipleStateCheckBox }; function MultipleStateCheckBox_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MultipleStateCheckBox.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MultipleStateCheckBox.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MultipleStateCheckBox.propDecorators; /** @type {?} */ MultipleStateCheckBox.TYPE_NAME; /** @type {?} */ MultipleStateCheckBox.DEFAULT_FIELD; /** @type {?} */ MultipleStateCheckBox.prototype.beforeClickEvent; /** @type {?} */ MultipleStateCheckBox.prototype.clickEvent; /** @type {?} */ MultipleStateCheckBox.prototype.beforeFocusEvent; /** @type {?} */ MultipleStateCheckBox.prototype.focusEvent; /** @type {?} */ MultipleStateCheckBox.prototype.beforeLostFocusEvent; /** @type {?} */ MultipleStateCheckBox.prototype.lostFocusEvent; /** @type {?} */ MultipleStateCheckBox.prototype.stateStyleGenerater; /** @type {?} */ MultipleStateCheckBox.prototype.states; /** @type {?} */ MultipleStateCheckBox.prototype.disabled; /** @type {?} */ MultipleStateCheckBox.prototype.field; /** @type {?} */ MultipleStateCheckBox.prototype.data; /** @type {?} */ MultipleStateCheckBox.prototype.ignoreParentData; /** @type {?} */ MultipleStateCheckBox.prototype.ignoreParentDisabled; /** @type {?} */ MultipleStateCheckBox.prototype.delegateHistory; /** @type {?} */ MultipleStateCheckBox.prototype.onDisabled; /** @type {?} */ MultipleStateCheckBox.prototype.onEnabled; /** @type {?} */ MultipleStateCheckBox.prototype.loadingEnabled; /** @type {?} */ MultipleStateCheckBox.prototype.i18nKey; /** @type {?} */ MultipleStateCheckBox.prototype.bypass; /** @type {?} */ MultipleStateCheckBox.prototype.options; /** @type {?} */ MultipleStateCheckBox.prototype.dataParent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbGVTdGF0ZUNoZWNrQm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NdWx0aXBsZVN0YXRlQ2hlY2tCb3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEYscUJBQU0sU0FBUyxHQUFXLDZCQUE2QixDQUFDO0FBRXhELHFCQUFNLGFBQWEsR0FBVyxPQUFPLENBQUM7O0lBY0ssaURBQXFCO0lBMEQ5RCwrQkFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUF0RSxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxTQVNwQztRQVBDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsS0FBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksWUFBWSxF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QzswQ0FDTSxZQUFZOzs7UUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQzswQ0FDTSxZQUFZOzs7UUFFakMsTUFBTSxDQUFDLGFBQWEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQzswQ0FDTSxZQUFZOzs7UUFFakMsTUFBTSxDQUFDLGlCQUFpQixDQUFDOzBDQUNNLFlBQVk7OztRQUUzQyxNQUFNLENBQUMsV0FBVyxDQUFDOzBDQUNNLFlBQVk7OztRQUVyQyxNQUFNLEVBQUU7MENBRW1CLFFBQVE7OztRQUNuQyxNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7OztnQ0F4RFg7RUF5QjJDLHFCQUFxQjtTQUFuRCxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0U2VsZWN0T25lSXRlbSB9IGZyb20gJy4vQWJzdHJhY3RTZWxlY3RPbmVJdGVtJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9zaGFyZXMnO1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1tdWx0aXBsZS1zdGF0ZS1jaGVja2JveFwiO1xyXG5cclxuY29uc3QgREVGQVVMVF9GSUVMRDogc3RyaW5nID0gXCJsYWJlbFwiO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1tdWx0aXBsZS1zdGF0ZS1jaGVja2JveFwiPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmFrZVwiIChmb2N1c2luKT1cIm9uRm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIj48L2J1dHRvbj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIl9nZXRDbGFzc1N0YXRlKClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVTdGF0ZUNoZWNrQm94IGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZJRUxEOiBzdHJpbmcgPSBERUZBVUxUX0ZJRUxEO1xyXG5cclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDbGljaycpXHJcbiAgQE9wdGlvbignY2xpY2snKVxyXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhGb2N1cycpXHJcbiAgQE9wdGlvbignZm9jdXMnKVxyXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3RhdGVTdHlsZUdlbmVyYXRlcjogRnVuY3Rpb247XHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3RhdGVzOiBhbnlbXTtcclxuICBAT3B0aW9uKClcclxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAvLyBpZiBjaGVjayBudWxsXHJcblxyXG4gICAgaWYgKHRoaXMuc3RhdGVzICE9PSBudWxsICYmIHRoaXMuc3RhdGVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zdGF0ZXMpKSB7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RJdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgbGFiZWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5zdGF0ZXMpIHtcclxuICAgICAgICAgIHNlbGVjdEl0ZW1zLnB1c2gobmV3IERlZmF1bHRTZWxlY3RJdGVtTW9kZWwobGFiZWwgKyBcIlwiLCBpdGVtKSk7XHJcbiAgICAgICAgICArK2xhYmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtcyhzZWxlY3RJdGVtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pbml0RXZlbnRIYW5kbGVycygpO1xyXG4gICAgfSwgMjApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2UnKS5mb2N1cygoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25Gb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2UnKS5ibHVyKCgkZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5vbkxvc3RGb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VycmVudFN0YXRlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU3RhdGUoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5nZXRTZWxlY3RlZEluZGV4KCkgPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0IGN1cnJlbnQgc3RhdGUgaW5kZXhcclxuICAgIGlmICh0aGlzLmdldFNlbGVjdGVkSW5kZXgoKSA9PT0gdGhpcy5nZXRJdGVtcygpLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSgwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHRoaXMuZ2V0U2VsZWN0ZWRJbmRleCgpKSArIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U2VsZWN0ZWRJbmRleChzdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RhdGVTdHlsZUdlbmVyYXRlcigpOiBGdW5jdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVN0eWxlR2VuZXJhdGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YXRlU3R5bGVHZW5lcmF0ZXIoc3RhdGVTdHlsZUdlbmVyYXRlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlciA9IHN0YXRlU3R5bGVHZW5lcmF0ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljaygkZXZlbnQ6IGFueSwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLnRvZ2dsZVN0YXRlKCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdENsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGw7XHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGlja0V2ZW50ICE9PSBudWxsICYmIHRoaXMuY2xpY2tFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2U6Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5mYWtlJykuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2U6Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5mYWtlJykuYmx1cigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVmFsaWRhdGlvbkVuZChpbnB1dFZhbHVlOiBhbnksIHJlc3VsdHM6IFZhbGlkYXRpb25SZXN1bHRbXSk6IHZvaWQge1xyXG4gICAgLy8hIGRvIHN0aGluZ1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgX2dldENsYXNzU3RhdGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXRlU3R5bGVHZW5lcmF0ZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlci5jYWxsKHRoaXMsIHRoaXMuZ2V0Q3VycmVudFN0YXRlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxufVxyXG4iXX0=