UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

722 lines (721 loc) 55 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractSelectItems } from './AbstractSelectItems'; import { Option } from '../../../decorator/Option.decorator'; import { BEFORE_SHOW_EVENT, SHOW_EVENT, BEFORE_HIDE_EVENT, HIDE_EVENT, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/CustomEventType'; import { EventUtils } from '../../../share/utils/EventUtils'; var /** @type {?} */ LEFT = "left"; var /** @type {?} */ RIGHT = "right"; var /** @type {?} */ CENTER = "center"; /** * @abstract */ var AbstractMultiDropdown = /** @class */ (function (_super) { tslib_1.__extends(AbstractMultiDropdown, _super); function AbstractMultiDropdown(needFocusService, elementRef, phloxAppInfoService) { var _this = _super.call(this, elementRef, needFocusService) || this; _this.beforeClickEvent = new EventEmitter(); _this.clickEvent = new EventEmitter(); _this.beforeShowEvent = new EventEmitter(); _this.showEvent = new EventEmitter(); _this.beforeHideEvent = new EventEmitter(); _this.hideEvent = new EventEmitter(); _this.selectEvent = new EventEmitter(); _this._isItemClick = false; phloxAppInfoService.getAppInfo().then(function (info) { _this.phloxAppInfo = info; }); return _this; } Object.defineProperty(AbstractMultiDropdown.prototype, "align", { get: /** * @return {?} */ function () { if (this._align === null || typeof this._align === 'undefined') { return LEFT; } return this._align; }, set: /** * @param {?} align * @return {?} */ function (align) { if (align === LEFT || align === RIGHT || align === CENTER) { this._align = align; return; } this._align = null; }, enumerable: true, configurable: true }); /** * @return {?} */ AbstractMultiDropdown.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); }; /** * @param {?} changes * @return {?} */ AbstractMultiDropdown.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; // fix bug when set selected before item is not loaded if (changes['items'] !== null && typeof changes['items'] !== 'undefined') { var /** @type {?} */ oldType = changes['items'].previousValue; var /** @type {?} */ newType = changes['items'].currentValue; var /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0; var /** @type {?} */ newSize = (newType !== null && typeof newType !== 'undefined' && Array.isArray(newType)) ? newType.length : 0; if (oldSize !== newSize) { if (this.dataParent !== null && this.dataParent !== undefined) { // fix bug setData but still has a bug this.comp.setData() in ngOnInit setTimeout(function () { _this.loadedItems(); }, 1); } else { this.loadedItems(); } } } }; /** * @return {?} */ AbstractMultiDropdown.prototype.scrollToSelectedIndex = /** * @return {?} */ function () { var /** @type {?} */ ele = $(this.elementRef.nativeElement).find('.menu'); var /** @type {?} */ hChild = $(this.elementRef.nativeElement).find('.menu > :eq(0)').outerHeight(); var /** @type {?} */ firstIndex = this.getSelectedIndexes().length > 0 ? this.getSelectedIndexes()[0] : 0; var /** @type {?} */ h = hChild * (firstIndex == 0 ? 0 : firstIndex - 1); if (!(ele.scrollTop() >= (h - ele.height() + hChild + hChild) && ele.scrollTop() <= (h + hChild))) { ele.stop().animate({ scrollTop: h }, 1, 'swing', function () { ele.css({ transition: "all 60ms cubic-bezier(0.175, 0.885, 0.32, 1.275)" }); ele.scrollTop(h); }); } }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitBeforeClickEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); this.beforeClickEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitClickEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); this.clickEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitBeforeShowEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event); this.beforeShowEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitShowEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event); this.showEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitBeforeHideEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event); this.beforeHideEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.emitHideEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ sItem = this.getSelectedItems(); var /** @type {?} */ sIndex = this.getSelectedIndexes(); var /** @type {?} */ data = { item: sItem, index: sIndex }; var /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event); this.hideEvent.emit(ev); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractMultiDropdown.prototype.doShow = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.show = true; _this.scrollToSelectedIndex(); if (_this.needFocusService) { _this.needFocusService.setFocusingComponent(_this, $event); } }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeShowEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitShowEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractMultiDropdown.prototype.doHide = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.show = false; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeHideEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitHideEvent($event); }, function ($event) { // doPrevented }); }; /** * @return {?} */ AbstractMultiDropdown.prototype.getUIUpdateInterval = /** * @return {?} */ function () { if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) { return 600; } if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) { return 600; } if (this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === null || this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === undefined) { return 600; } return this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL; }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractMultiDropdown.prototype.click = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (this.isReadOnly()) { return; } if (this.isDisabled()) { return; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.setShow(true); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeClickEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitClickEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?} $event * @param {?} index * @return {?} */ AbstractMultiDropdown.prototype.onSelectItemClicked = /** * @param {?} $event * @param {?} index * @return {?} */ function ($event, index) { this._isItemClick = true; var /** @type {?} */ oldIndexes = this.getSelectedIndexes(); var /** @type {?} */ item = this.getItemAtIndex(index); var /** @type {?} */ oldDatas = []; var /** @type {?} */ newDatas = []; if (oldIndexes !== null && oldIndexes !== undefined) { try { for (var oldIndexes_1 = tslib_1.__values(oldIndexes), oldIndexes_1_1 = oldIndexes_1.next(); !oldIndexes_1_1.done; oldIndexes_1_1 = oldIndexes_1.next()) { var oldIndex = oldIndexes_1_1.value; oldDatas.push(this.getItemAtIndex(oldIndex)); newDatas.push(this.getItemAtIndex(oldIndex)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (oldIndexes_1_1 && !oldIndexes_1_1.done && (_a = oldIndexes_1.return)) _a.call(oldIndexes_1); } finally { if (e_1) throw e_1.error; } } } if (oldDatas.indexOf(item) === -1) { newDatas.push(item); } else { newDatas.splice(oldDatas.indexOf(item), 1); } this.setSelectedItems(newDatas); var e_1, _a; }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { this.setShow(false); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { var _this = this; if ($event !== undefined && $event !== null) { $event.preventDefault(); } if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(function () { if (!_this._isItemClick) { _this.doBlur($event); _this.needFocusService.resetFocusingComponent($event); } else { _this.doFocus($event); } _this._isItemClick = false; }, 20); // if dropdown not hide try to adjust this value }; /** * @param {?} show * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractMultiDropdown.prototype.setShow = /** * @param {?} show * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function (show, $event, fireEvent) { if (show === null || typeof show !== 'boolean') { show = false; } if (this.show === show) { return; } if (show) { this.doShow($event, fireEvent); } else { this.doHide($event, fireEvent); } }; /** * @return {?} */ AbstractMultiDropdown.prototype.isShow = /** * @return {?} */ function () { return this.show; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getAlign = /** * @return {?} */ function () { return this.align; }; /** * @param {?} align * @return {?} */ AbstractMultiDropdown.prototype.setAlign = /** * @param {?} align * @return {?} */ function (align) { this.align = align; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getDropdownWidth = /** * @return {?} */ function () { return this.dropdownWidth; }; /** * @param {?} dropdownWidth * @return {?} */ AbstractMultiDropdown.prototype.setDropdownWidth = /** * @param {?} dropdownWidth * @return {?} */ function (dropdownWidth) { this.dropdownWidth = dropdownWidth; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getDropdownHeight = /** * @return {?} */ function () { return this.dropdownHeight; }; /** * @param {?} dropdownHeight * @return {?} */ AbstractMultiDropdown.prototype.setDropdownHeight = /** * @param {?} dropdownHeight * @return {?} */ function (dropdownHeight) { this.dropdownHeight = dropdownHeight; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getClickEvent = /** * @return {?} */ function () { return this.clickEvent; }; /** * @param {?} event * @return {?} */ AbstractMultiDropdown.prototype.setClickEvent = /** * @param {?} event * @return {?} */ function (event) { this.clickEvent = event; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getBeforeClickEvent = /** * @return {?} */ function () { return this.beforeClickEvent; }; /** * @param {?} event * @return {?} */ AbstractMultiDropdown.prototype.setBeforeClickEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeClickEvent = event; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getShowEvent = /** * @return {?} */ function () { return this.showEvent; }; /** * @param {?} event * @return {?} */ AbstractMultiDropdown.prototype.setShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.showEvent = event; }; /** * @return {?} */ AbstractMultiDropdown.prototype.getSelectEvent = /** * @return {?} */ function () { return this.selectEvent; }; /** * @param {?} event * @return {?} */ AbstractMultiDropdown.prototype.setSelectEvent = /** * @param {?} event * @return {?} */ function (event) { this.selectEvent = event; }; /** * @param {?} data * @return {?} */ AbstractMultiDropdown.prototype.setData = /** * @param {?} data * @return {?} */ function (data) { _super.prototype.setData.call(this, data); this.setPreloadData(data); }; AbstractMultiDropdown.LEFT = LEFT; AbstractMultiDropdown.RIGHT = RIGHT; AbstractMultiDropdown.CENTER = CENTER; tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeShowEvent", void 0); tslib_1.__decorate([ Option('show'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "showEvent", void 0); tslib_1.__decorate([ Option('beforeHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "beforeHideEvent", void 0); tslib_1.__decorate([ Option('hide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "hideEvent", void 0); tslib_1.__decorate([ Option('select'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMultiDropdown.prototype, "selectEvent", void 0); return AbstractMultiDropdown; }(AbstractSelectItems)); export { AbstractMultiDropdown }; function AbstractMultiDropdown_tsickle_Closure_declarations() { /** @type {?} */ AbstractMultiDropdown.LEFT; /** @type {?} */ AbstractMultiDropdown.RIGHT; /** @type {?} */ AbstractMultiDropdown.CENTER; /** @type {?} */ AbstractMultiDropdown.prototype.needFocusService; /** @type {?} */ AbstractMultiDropdown.prototype.data; /** @type {?} */ AbstractMultiDropdown.prototype.dataParent; /** @type {?} */ AbstractMultiDropdown.prototype.items; /** @type {?} */ AbstractMultiDropdown.prototype.dataComparator; /** @type {?} */ AbstractMultiDropdown.prototype.field; /** @type {?} */ AbstractMultiDropdown.prototype.beforeClickEvent; /** @type {?} */ AbstractMultiDropdown.prototype.clickEvent; /** @type {?} */ AbstractMultiDropdown.prototype.beforeShowEvent; /** @type {?} */ AbstractMultiDropdown.prototype.showEvent; /** @type {?} */ AbstractMultiDropdown.prototype.beforeHideEvent; /** @type {?} */ AbstractMultiDropdown.prototype.hideEvent; /** @type {?} */ AbstractMultiDropdown.prototype.selectEvent; /** @type {?} */ AbstractMultiDropdown.prototype._align; /** @type {?} */ AbstractMultiDropdown.prototype.dropdownWidth; /** @type {?} */ AbstractMultiDropdown.prototype.dropdownHeight; /** @type {?} */ AbstractMultiDropdown.prototype.phloxAppInfo; /** @type {?} */ AbstractMultiDropdown.prototype._isItemClick; /** @type {?} */ AbstractMultiDropdown.prototype._itemLostFocusingTimeout; /** @type {?} */ AbstractMultiDropdown.prototype.show; /** * @abstract * @param {?} $event * @return {?} */ AbstractMultiDropdown.prototype.doBlur = function ($event) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNdWx0aURyb3Bkb3duLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L0Fic3RyYWN0TXVsdGlEcm9wZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBc0QsWUFBWSxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFN0QsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUU5RixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxxQkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHFCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIscUJBQU0sTUFBTSxHQUFXLFFBQVEsQ0FBQzs7Ozs7SUFFb0IsaURBQW1CO0lBa0RyRSwrQkFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLG1CQUF3QztRQUFoSCxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxTQWVwQztRQWJDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsS0FBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxLQUFJLENBQUMsU0FB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QUM7UUFFcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7aUNBaGFVLElBQUk7a0NBQ0gsS0FBSzttQ0FDSixNQUFNOztRQVE3QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDOzBDQUNNLFlBQVk7OztRQUNqQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDOzBDQUNNLFlBQVk7O2dDQTVDckM7RUFtQm9ELG1CQUFtQjtTQUFqRCxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgVHlwZSwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFNlbGVjdEl0ZW1zIH0gZnJvbSAnLi9BYnN0cmFjdFNlbGVjdEl0ZW1zJztcclxuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcclxuaW1wb3J0IHsgSURhdGFDb21wYXJhdG9yIH0gZnJvbSAnLi4vLi4vSURhdGFDb21wYXJhdG9yJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSwgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2Uvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XHJcbmltcG9ydCB7XHJcbiAgQkVGT1JFX1NIT1dfRVZFTlQsIFNIT1dfRVZFTlQsIEJFRk9SRV9ISURFX0VWRU5ULCBISURFX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQsIENMSUNLX0VWRU5ULFxyXG4gIEJFRk9SRV9TRUxFQ1RfRVZFTlQsIFNFTEVDVF9FVkVOVFxyXG59IGZyb20gJy4uLy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcclxuXHJcbmNvbnN0IExFRlQ6IHN0cmluZyA9IFwibGVmdFwiO1xyXG5jb25zdCBSSUdIVDogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5jb25zdCBDRU5URVI6IHN0cmluZyA9IFwiY2VudGVyXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNdWx0aURyb3Bkb3duIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RJdGVtcyBpbXBsZW1lbnRzIE9uSW5pdCwgSU5lZWRGb2N1cywgT25DaGFuZ2VzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMRUZUOiBzdHJpbmcgPSBMRUZUO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUklHSFQ6IHN0cmluZyA9IFJJR0hUO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0VOVEVSOiBzdHJpbmcgPSBDRU5URVI7XHJcblxyXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIHByb3RlY3RlZCBpdGVtczogRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbFtdO1xyXG4gIHByb3RlY3RlZCBkYXRhQ29tcGFyYXRvcjogSURhdGFDb21wYXJhdG9yPGFueT47XHJcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3B0aW9uKCdjbGljaycpXHJcbiAgcHJvdGVjdGVkIGNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2JlZm9yZVNob3cnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3Nob3cnKVxyXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2hpZGUnKVxyXG4gIHByb3RlY3RlZCBoaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3NlbGVjdCcpXHJcbiAgcHJvdGVjdGVkIHNlbGVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBwcm90ZWN0ZWQgX2FsaWduOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGRyb3Bkb3duV2lkdGg6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgZHJvcGRvd25IZWlnaHQ6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XHJcbiAgcHJvdGVjdGVkIF9pc0l0ZW1DbGljazogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0OiBhbnk7XHJcblxyXG4gIHByaXZhdGUgc2hvdzogYm9vbGVhbjtcclxuXHJcbiAgcHJvdGVjdGVkIHNldCBhbGlnbihhbGlnbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoYWxpZ24gPT09IExFRlQgfHwgYWxpZ24gPT09IFJJR0hUIHx8IGFsaWduID09PSBDRU5URVIpIHtcclxuICAgICAgdGhpcy5fYWxpZ24gPSBhbGlnbjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYWxpZ24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBhbGlnbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2FsaWduID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLl9hbGlnbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuIExFRlQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fYWxpZ247XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmJlZm9yZVNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuc2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgdGhpcy5faXNJdGVtQ2xpY2sgPSBmYWxzZTtcclxuXHJcbiAgICBwaGxveEFwcEluZm9TZXJ2aWNlLmdldEFwcEluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMucGhsb3hBcHBJbmZvID0gaW5mbztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcclxuICAgIC8vIGZpeCBidWcgd2hlbiBzZXQgc2VsZWN0ZWQgYmVmb3JlIGl0ZW0gaXMgbm90IGxvYWRlZFxyXG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gIT09IG51bGwgJiYgdHlwZW9mIGNoYW5nZXNbJ2l0ZW1zJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGxldCBvbGRUeXBlID0gY2hhbmdlc1snaXRlbXMnXS5wcmV2aW91c1ZhbHVlO1xyXG4gICAgICBsZXQgbmV3VHlwZTogYW55ID0gY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWU7XHJcblxyXG4gICAgICBsZXQgb2xkU2l6ZSA9IChvbGRUeXBlICE9PSBudWxsICYmIHR5cGVvZiBvbGRUeXBlICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KG9sZFR5cGUpKSA/IG9sZFR5cGUubGVuZ3RoIDogMDtcclxuICAgICAgbGV0IG5ld1NpemUgPSAobmV3VHlwZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmV3VHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShuZXdUeXBlKSkgPyBuZXdUeXBlLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICBpZiAob2xkU2l6ZSAhPT0gbmV3U2l6ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdGhpcy5kYXRhUGFyZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIC8vIGZpeCBidWcgc2V0RGF0YSBidXQgc3RpbGwgaGFzIGEgYnVnIHRoaXMuY29tcC5zZXREYXRhKCkgaW4gbmdPbkluaXRcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XHJcbiAgICAgICAgICB9LCAxKTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxUb1NlbGVjdGVkSW5kZXgoKTogdm9pZCB7XHJcbiAgICBsZXQgZWxlID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLm1lbnUnKTtcclxuICAgIGxldCBoQ2hpbGQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWVudSA+IDplcSgwKScpLm91dGVySGVpZ2h0KCk7XHJcblxyXG4gICAgbGV0IGZpcnN0SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCkubGVuZ3RoID4gMCA/IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKClbMF0gOiAwO1xyXG4gICAgbGV0IGggPSBoQ2hpbGQgKiAoZmlyc3RJbmRleCA9PSAwID8gMCA6IGZpcnN0SW5kZXggLSAxKTtcclxuXHJcbiAgICBpZiAoIShlbGUuc2Nyb2xsVG9wKCkgPj0gKGggLSBlbGUuaGVpZ2h0KCkgKyBoQ2hpbGQgKyBoQ2hpbGQpICYmIGVsZS5zY3JvbGxUb3AoKSA8PSAoaCArIGhDaGlsZCkpKSB7XHJcbiAgICAgIGVsZS5zdG9wKCkuYW5pbWF0ZSh7IHNjcm9sbFRvcDogaCB9LCAxLCAnc3dpbmcnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBlbGUuY3NzKHtcclxuICAgICAgICAgIHRyYW5zaXRpb246IFwiYWxsIDYwbXMgY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzUpXCJcclxuICAgICAgICB9KTtcclxuICAgICAgICBlbGUuc2Nyb2xsVG9wKGgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2xpY2tFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVTaG93RXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICBsZXQgc0luZGV4ID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgZGF0YTogYW55ID0ge1xyXG4gICAgICBpdGVtOiBzSXRlbSxcclxuICAgICAgaW5kZXg6IHNJbmRleFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9TSE9XX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRTaG93RXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICBsZXQgc0luZGV4ID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgZGF0YTogYW55ID0ge1xyXG4gICAgICBpdGVtOiBzSXRlbSxcclxuICAgICAgaW5kZXg6IHNJbmRleFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFNIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5zaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEhpZGVFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmhpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9TaG93KCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVNob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJbmRleCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlU2hvd0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcclxuICAgICAgdGhpcy5lbWl0U2hvd0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvSGlkZSgkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVIaWRlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRVSVVwZGF0ZUludGVydmFsKCk6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiA2MDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waGxveEFwcEluZm8uc2V0dGluZ3MuVUlfQU5JTUFURV9JTlRFUlZBTCA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5waGxveEFwcEluZm8uc2V0dGluZ3MuVUlfQU5JTUFURV9JTlRFUlZBTDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGljaygkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlQ2xpY2tFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2V0U2hvdyh0cnVlKTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcclxuICAgICAgdGhpcy5lbWl0Q2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgIC