UNPKG

ng2-bs3-modal

Version:

Angular Boostrap 3 Modal Component

501 lines (500 loc) 40.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, NgZone } from '@angular/core'; import { Observable, Subject, of as observableOf, fromEvent, merge, zip } from 'rxjs'; import { take, filter, tap, share, map } from 'rxjs/operators'; import { BsModalHideType, BsModalSize } from './models'; import { BsModalService } from './modal.service'; /** @type {?} */ var EVENT_SUFFIX = 'ng2-bs3-modal'; /** @type {?} */ var SHOW_EVENT_NAME = "show.bs.modal." + EVENT_SUFFIX; /** @type {?} */ var SHOWN_EVENT_NAME = "shown.bs.modal." + EVENT_SUFFIX; /** @type {?} */ var HIDE_EVENT_NAME = "hide.bs.modal." + EVENT_SUFFIX; /** @type {?} */ var HIDDEN_EVENT_NAME = "hidden.bs.modal." + EVENT_SUFFIX; /** @type {?} */ var LOADED_EVENT_NAME = "loaded.bs.modal." + EVENT_SUFFIX; /** @type {?} */ var DATA_KEY = 'bs.modal'; var BsModalComponent = /** @class */ (function () { function BsModalComponent(element, service, zone) { var _this = this; this.element = element; this.service = service; this.zone = zone; this.overrideSize = null; this.onInternalClose$ = new Subject(); this.subscriptions = []; this.visible = false; this.showing = false; this.hiding = false; this.animation = true; this.backdrop = true; this.keyboard = true; this.onShow = new EventEmitter(); this.onOpen = new EventEmitter(); this.onHide = new EventEmitter(); this.onClose = new EventEmitter(); this.onDismiss = new EventEmitter(); this.onLoaded = new EventEmitter(); this.setVisible = function (isVisible) { return function () { _this.visible = isVisible; _this.showing = false; _this.hiding = false; }; }; this.setOptions = function (options) { /** @type {?} */ var backdrop = options.backdrop; if (typeof backdrop === 'string' && backdrop !== 'static') { backdrop = true; } if (options.backdrop !== undefined) { _this.options.backdrop = backdrop; } if (options.keyboard !== undefined) { _this.options.keyboard = options.keyboard; } }; this.service.add(this); this.init(); } Object.defineProperty(BsModalComponent.prototype, "options", { get: /** * @return {?} */ function () { if (!this.$modal) { this.init(); } return this.$modal.data(DATA_KEY).options; }, enumerable: true, configurable: true }); Object.defineProperty(BsModalComponent.prototype, "fadeClass", { get: /** * @return {?} */ function () { return this.animation; }, enumerable: true, configurable: true }); Object.defineProperty(BsModalComponent.prototype, "modalClass", { get: /** * @return {?} */ function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(BsModalComponent.prototype, "roleAttr", { get: /** * @return {?} */ function () { return 'dialog'; }, enumerable: true, configurable: true }); Object.defineProperty(BsModalComponent.prototype, "tabindexAttr", { get: /** * @return {?} */ function () { return '-1'; }, enumerable: true, configurable: true }); /** * @return {?} */ BsModalComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.wireUpEventEmitters(); }; /** * @return {?} */ BsModalComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.$dialog = this.$modal.find('.modal-dialog'); }; /** * @return {?} */ BsModalComponent.prototype.ngOnChanges = /** * @return {?} */ function () { this.setOptions({ backdrop: this.backdrop, keyboard: this.keyboard }); }; /** * @return {?} */ BsModalComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.onInternalClose$.next(BsModalHideType.Destroy); return this.destroy(); }; /** * @return {?} */ BsModalComponent.prototype.focus = /** * @return {?} */ function () { this.$modal.trigger('focus'); }; /** * @return {?} */ BsModalComponent.prototype.routerCanDeactivate = /** * @return {?} */ function () { this.onInternalClose$.next(BsModalHideType.RouteChange); return this.destroy(); }; /** * @param {?=} size * @return {?} */ BsModalComponent.prototype.open = /** * @param {?=} size * @return {?} */ function (size) { this.overrideSize = null; if (BsModalSize.isValidSize(size)) { this.overrideSize = size; } return this.show().toPromise(); }; /** * @param {?=} value * @return {?} */ BsModalComponent.prototype.close = /** * @param {?=} value * @return {?} */ function (value) { var _this = this; this.onInternalClose$.next(BsModalHideType.Close); return this.hide().pipe(tap(function () { return _this.onClose.emit(value); })).toPromise().then(function () { return value; }); }; /** * @return {?} */ BsModalComponent.prototype.dismiss = /** * @return {?} */ function () { this.onInternalClose$.next(BsModalHideType.Dismiss); return this.hide().toPromise(); }; /** * @return {?} */ BsModalComponent.prototype.getCssClasses = /** * @return {?} */ function () { /** @type {?} */ var classes = []; if (this.isSmall()) { classes.push('modal-sm'); } if (this.isLarge()) { classes.push('modal-lg'); } if (this.cssClass) { classes.push(this.cssClass); } return classes.join(' '); }; /** * @return {?} */ BsModalComponent.prototype.isSmall = /** * @return {?} */ function () { return this.overrideSize !== BsModalSize.Large && this.size === BsModalSize.Small || this.overrideSize === BsModalSize.Small; }; /** * @return {?} */ BsModalComponent.prototype.isLarge = /** * @return {?} */ function () { return this.overrideSize !== BsModalSize.Small && this.size === BsModalSize.Large || this.overrideSize === BsModalSize.Large; }; /** * @return {?} */ BsModalComponent.prototype.show = /** * @return {?} */ function () { var _this = this; if (this.visible && !this.hiding) { return observableOf(null); } this.showing = true; return Observable.create(function (o) { _this.onShown$.pipe(take(1)).subscribe(function (next) { o.next(next); o.complete(); }); _this.transitionFix(); _this.$modal.modal('show'); }); }; /** * @return {?} */ BsModalComponent.prototype.transitionFix = /** * @return {?} */ function () { var _this = this; // Fix for shown.bs.modal not firing when .fade is present // https://github.com/twbs/bootstrap/issues/11793 if (this.animation) { setTimeout(function () { _this.$modal.trigger('focus').trigger(SHOWN_EVENT_NAME); }, jQuery.fn.modal['Constructor'].TRANSITION_DURATION); } }; /** * @return {?} */ BsModalComponent.prototype.hide = /** * @return {?} */ function () { var _this = this; if (!this.visible && !this.showing) { return observableOf(null); } this.hiding = true; return Observable.create(function (o) { _this.onHidden$.pipe(take(1)).subscribe(function (next) { o.next(next); o.complete(); }); _this.$modal.modal('hide'); }); }; /** * @return {?} */ BsModalComponent.prototype.init = /** * @return {?} */ function () { var _this = this; this.$modal = jQuery(this.element.nativeElement); this.$modal.appendTo(document.body); this.$modal.modal({ show: false }); this.onShowEvent$ = fromEvent(this.$modal, SHOW_EVENT_NAME); this.onShownEvent$ = fromEvent(this.$modal, SHOWN_EVENT_NAME); this.onHideEvent$ = fromEvent(this.$modal, HIDE_EVENT_NAME); this.onHiddenEvent$ = fromEvent(this.$modal, HIDDEN_EVENT_NAME); this.onLoadedEvent$ = fromEvent(this.$modal, LOADED_EVENT_NAME); /** @type {?} */ var onClose$ = merge(this.onInternalClose$, this.service.onBackdropClose$, this.service.onKeyboardClose$); this.onHide$ = zip(this.onHideEvent$, onClose$).pipe(map(function (x) { return ({ event: x[0], type: x[1] }); })); this.onHidden$ = zip(this.onHiddenEvent$, onClose$).pipe(map(function (x) { return x[1]; }), tap(this.setVisible(false)), tap(function () { return _this.service.focusNext(); }), share()); this.onShown$ = this.onShownEvent$.pipe(tap(this.setVisible(true)), share()); this.onDismiss$ = this.onHidden$.pipe(filter(function (x) { return x !== BsModalHideType.Close; })); // Start watching for events // Start watching for events (_a = this.subscriptions).push.apply(_a, tslib_1.__spread([ this.onShown$.subscribe(function () { }), this.onHidden$.subscribe(function () { }), this.service.onModalStack$.subscribe(function () { }) ])); var _a; }; /** * @return {?} */ BsModalComponent.prototype.wireUpEventEmitters = /** * @return {?} */ function () { this.wireUpEventEmitter(this.onShow, this.onShowEvent$); this.wireUpEventEmitter(this.onOpen, this.onShown$); this.wireUpEventEmitter(this.onHide, this.onHide$); this.wireUpEventEmitter(this.onDismiss, this.onDismiss$); this.wireUpEventEmitter(this.onLoaded, this.onLoadedEvent$); }; /** * @template T * @param {?} emitter * @param {?} stream$ * @return {?} */ BsModalComponent.prototype.wireUpEventEmitter = /** * @template T * @param {?} emitter * @param {?} stream$ * @return {?} */ function (emitter, stream$) { var _this = this; if (emitter.observers.length === 0) { return; } /** @type {?} */ var sub = stream$.subscribe(function (next) { _this.zone.run(function () { emitter.next(next); }); }); this.subscriptions.push(sub); }; /** * @return {?} */ BsModalComponent.prototype.destroy = /** * @return {?} */ function () { var _this = this; return this.hide().pipe(tap(function () { _this.service.remove(_this); _this.subscriptions.forEach(function (s) { return s.unsubscribe(); }); _this.subscriptions = []; if (_this.$modal) { _this.$modal.data(DATA_KEY, null); _this.$modal.remove(); _this.$modal = null; } })).toPromise(); }; BsModalComponent.decorators = [ { type: Component, args: [{ selector: 'bs-modal', template: "\n <div class=\"modal-dialog\" [ngClass]=\"getCssClasses()\">\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n </div>\n " },] }, ]; /** @nocollapse */ BsModalComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: BsModalService }, { type: NgZone } ]; }; BsModalComponent.propDecorators = { animation: [{ type: Input }], backdrop: [{ type: Input }], keyboard: [{ type: Input }], size: [{ type: Input }], cssClass: [{ type: Input }], onShow: [{ type: Output }], onOpen: [{ type: Output }], onHide: [{ type: Output }], onClose: [{ type: Output }], onDismiss: [{ type: Output }], onLoaded: [{ type: Output }], fadeClass: [{ type: HostBinding, args: ['class.fade',] }], modalClass: [{ type: HostBinding, args: ['class.modal',] }], roleAttr: [{ type: HostBinding, args: ['attr.role',] }], tabindexAttr: [{ type: HostBinding, args: ['attr.tabindex',] }] }; return BsModalComponent; }()); export { BsModalComponent }; if (false) { /** @type {?} */ BsModalComponent.prototype.overrideSize; /** @type {?} */ BsModalComponent.prototype.$modal; /** @type {?} */ BsModalComponent.prototype.$dialog; /** @type {?} */ BsModalComponent.prototype.onShowEvent$; /** @type {?} */ BsModalComponent.prototype.onShownEvent$; /** @type {?} */ BsModalComponent.prototype.onHideEvent$; /** @type {?} */ BsModalComponent.prototype.onHiddenEvent$; /** @type {?} */ BsModalComponent.prototype.onLoadedEvent$; /** @type {?} */ BsModalComponent.prototype.onShown$; /** @type {?} */ BsModalComponent.prototype.onInternalClose$; /** @type {?} */ BsModalComponent.prototype.onDismiss$; /** @type {?} */ BsModalComponent.prototype.onHide$; /** @type {?} */ BsModalComponent.prototype.onHidden$; /** @type {?} */ BsModalComponent.prototype.subscriptions; /** @type {?} */ BsModalComponent.prototype.visible; /** @type {?} */ BsModalComponent.prototype.showing; /** @type {?} */ BsModalComponent.prototype.hiding; /** @type {?} */ BsModalComponent.prototype.animation; /** @type {?} */ BsModalComponent.prototype.backdrop; /** @type {?} */ BsModalComponent.prototype.keyboard; /** @type {?} */ BsModalComponent.prototype.size; /** @type {?} */ BsModalComponent.prototype.cssClass; /** @type {?} */ BsModalComponent.prototype.onShow; /** @type {?} */ BsModalComponent.prototype.onOpen; /** @type {?} */ BsModalComponent.prototype.onHide; /** @type {?} */ BsModalComponent.prototype.onClose; /** @type {?} */ BsModalComponent.prototype.onDismiss; /** @type {?} */ BsModalComponent.prototype.onLoaded; /** @type {?} */ BsModalComponent.prototype.setVisible; /** @type {?} */ BsModalComponent.prototype.setOptions; /** @type {?} */ BsModalComponent.prototype.element; /** @type {?} */ BsModalComponent.prototype.service; /** @type {?} */ BsModalComponent.prototype.zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcyLWJzMy1tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsL21vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFDSCxTQUFTLEVBS1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBWSxPQUFPLEVBQWdCLEVBQUUsSUFBSSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUcsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQW9CLGVBQWUsRUFBa0IsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFakQsSUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDOztBQUNyQyxJQUFNLGVBQWUsR0FBRyxtQkFBaUIsWUFBYyxDQUFDOztBQUN4RCxJQUFNLGdCQUFnQixHQUFHLG9CQUFrQixZQUFjLENBQUM7O0FBQzFELElBQU0sZUFBZSxHQUFHLG1CQUFpQixZQUFjLENBQUM7O0FBQ3hELElBQU0saUJBQWlCLEdBQUcscUJBQW1CLFlBQWMsQ0FBQzs7QUFDNUQsSUFBTSxpQkFBaUIsR0FBRyxxQkFBbUIsWUFBYyxDQUFDOztBQUM1RCxJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7O0lBZ0V4QiwwQkFBb0IsT0FBbUIsRUFBVSxPQUF1QixFQUFVLElBQVk7UUFBOUYsaUJBR0M7UUFIbUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTs0QkFsRC9ELElBQUk7Z0NBU2tCLElBQUksT0FBTyxFQUFtQjs2QkFJM0MsRUFBRTt1QkFRaEMsS0FBSzt1QkFDTCxLQUFLO3NCQUNOLEtBQUs7eUJBRU8sSUFBSTt3QkFDYSxJQUFJO3dCQUN0QixJQUFJO3NCQUlMLElBQUksWUFBWSxFQUFTO3NCQUN6QixJQUFJLFlBQVksRUFBTztzQkFDdkIsSUFBSSxZQUFZLEVBQU87dUJBQ3RCLElBQUksWUFBWSxFQUFPO3lCQUNyQixJQUFJLFlBQVksRUFBbUI7d0JBQ3BDLElBQUksWUFBWSxFQUFPOzBCQW1OdkIsVUFBQyxTQUFTO1lBQzNCLE1BQU0sQ0FBQztnQkFDSCxLQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDekIsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLEtBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3ZCLENBQUM7U0FDTDswQkFFb0IsVUFBQyxPQUF1Qjs7WUFDekMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNoQyxFQUFFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELFFBQVEsR0FBRyxJQUFJLENBQUM7YUFFbkI7WUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzthQUNwQztZQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDakMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUM1QztTQUNKO1FBek5HLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNmOzBCQXZDVyxxQ0FBTzs7Ozs7WUFDZixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNmO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7Ozs7SUFvQjlDLHNCQUNJLHVDQUFTOzs7O1FBRGIsY0FDa0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTs7O09BQUE7SUFFMUMsc0JBQ0ksd0NBQVU7Ozs7UUFEZCxjQUNtQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7OztPQUFBO0lBRWpDLHNCQUNJLHNDQUFROzs7O1FBRFosY0FDaUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzs7T0FBQTtJQUVuQyxzQkFDSSwwQ0FBWTs7OztRQURoQixjQUNxQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7OztPQUFBOzs7O0lBT25DLG1DQUFROzs7SUFBUjtRQUNJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0tBQzlCOzs7O0lBRUQsMENBQWU7OztJQUFmO1FBQ0ksSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNwRDs7OztJQUVELHNDQUFXOzs7SUFBWDtRQUNJLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQztLQUNOOzs7O0lBRUQsc0NBQVc7OztJQUFYO1FBQ0ksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN6Qjs7OztJQUVELGdDQUFLOzs7SUFBTDtRQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hDOzs7O0lBRUQsOENBQW1COzs7SUFBbkI7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3pCOzs7OztJQUVELCtCQUFJOzs7O0lBQUosVUFBSyxJQUFhO1FBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ2xDOzs7OztJQUVELGdDQUFLOzs7O0lBQUwsVUFBTSxLQUFXO1FBQWpCLGlCQUtDO1FBSkcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQ25CLEdBQUcsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQXhCLENBQXdCLENBQUMsQ0FDdEMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUssRUFBTCxDQUFLLENBQUMsQ0FBQztLQUNuQzs7OztJQUVELGtDQUFPOzs7SUFBUDtRQUNJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDbEM7Ozs7SUFFRCx3Q0FBYTs7O0lBQWI7O1FBQ0ksSUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTdCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM1QjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM1QjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDNUI7Ozs7SUFFTyxrQ0FBTzs7OztRQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxLQUFLO2VBQ3ZDLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLEtBQUs7ZUFDL0IsSUFBSSxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDOzs7OztJQUczQyxrQ0FBTzs7OztRQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxLQUFLO2VBQ3ZDLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLEtBQUs7ZUFDL0IsSUFBSSxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDOzs7OztJQUczQywrQkFBSTs7Ozs7UUFDUixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBZ0I7WUFDdEMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNWLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtnQkFDWixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNiLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNoQixDQUFDLENBQUM7WUFFSCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0IsQ0FBQyxDQUFDOzs7OztJQUdDLHdDQUFhOzs7Ozs7O1FBR2pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLFVBQVUsQ0FBQztnQkFDUCxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUMxRCxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDMUQ7Ozs7O0lBR0csK0JBQUk7Ozs7O1FBQ1IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLFlBQVksQ0FBa0IsSUFBSSxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQWdCO1lBQ3RDLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDVixDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7Z0JBQ1osQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDYixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDaEIsQ0FBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0IsQ0FBQyxDQUFDOzs7OztJQUdDLCtCQUFJOzs7OztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2QsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7O1FBRWhFLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFNUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ2hELEdBQUcsQ0FBQyxVQUFBLENBQUMsWUFBc0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQSxDQUFDLENBQzFELENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBa0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3JFLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBSixDQUFJLENBQUMsRUFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUMzQixHQUFHLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQXhCLENBQXdCLENBQUMsRUFDbkMsS0FBSyxFQUFFLENBQ1YsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ25DLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzFCLEtBQUssRUFBRSxDQUNWLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNqQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLEtBQUssZUFBZSxDQUFDLEtBQUssRUFBM0IsQ0FBMkIsQ0FBQyxDQUM3QyxDQUFDOztRQUdGLEFBREEsNEJBQTRCO1FBQzVCLENBQUEsS0FBQSxJQUFJLENBQUMsYUFBYSxDQUFBLENBQUMsSUFBSSw0QkFBSTtZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBUyxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxlQUFTLENBQUM7U0FDbEQsR0FBRTs7Ozs7O0lBR0MsOENBQW1COzs7O1FBRXZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Ozs7Ozs7O0lBR3hELDZDQUFrQjs7Ozs7O2NBQUksT0FBd0IsRUFBRSxPQUFzQjs7UUFDMUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUM7U0FDVjs7UUFFRCxJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSTtZQUMvQixLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7OztJQTBCekIsa0NBQU87Ozs7O1FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQ25CLEdBQUcsQ0FBQztZQUNBLEtBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxDQUFDO1lBQzFCLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFmLENBQWUsQ0FBQyxDQUFDO1lBQ2pELEtBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDdEI7U0FDSixDQUFDLENBQ0wsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7O2dCQXRTckIsU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSxVQUFVO29CQUNwQixRQUFRLEVBQUUsc01BTVQ7aUJBQ0o7Ozs7Z0JBM0JHLFVBQVU7Z0JBUUwsY0FBYztnQkFObkIsTUFBTTs7OzRCQXFETCxLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzt1QkFDTCxLQUFLOzJCQUNMLEtBQUs7eUJBRUwsTUFBTTt5QkFDTixNQUFNO3lCQUNOLE1BQU07MEJBQ04sTUFBTTs0QkFDTixNQUFNOzJCQUNOLE1BQU07NEJBRU4sV0FBVyxTQUFDLFlBQVk7NkJBR3hCLFdBQVcsU0FBQyxhQUFhOzJCQUd6QixXQUFXLFNBQUMsV0FBVzsrQkFHdkIsV0FBVyxTQUFDLGVBQWU7OzJCQXZGaEM7O1NBc0NhLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOm5vLW91dHB1dC1vbi1wcmVmaXhcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIE5nWm9uZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIGFzIG9ic2VydmFibGVPZiwgZnJvbUV2ZW50LCBtZXJnZSwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCBmaWx0ZXIsIHRhcCwgc2hhcmUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQnNNb2RhbEhpZGVFdmVudCwgQnNNb2RhbEhpZGVUeXBlLCBCc01vZGFsT3B0aW9ucywgQnNNb2RhbFNpemUgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJy4vbW9kYWwuc2VydmljZSc7XG5cbmNvbnN0IEVWRU5UX1NVRkZJWCA9ICduZzItYnMzLW1vZGFsJztcbmNvbnN0IFNIT1dfRVZFTlRfTkFNRSA9IGBzaG93LmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBTSE9XTl9FVkVOVF9OQU1FID0gYHNob3duLmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBISURFX0VWRU5UX05BTUUgPSBgaGlkZS5icy5tb2RhbC4ke0VWRU5UX1NVRkZJWH1gO1xuY29uc3QgSElEREVOX0VWRU5UX05BTUUgPSBgaGlkZGVuLmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBMT0FERURfRVZFTlRfTkFNRSA9IGBsb2FkZWQuYnMubW9kYWwuJHtFVkVOVF9TVUZGSVh9YDtcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm1vZGFsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdicy1tb2RhbCcsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIFtuZ0NsYXNzXT1cImdldENzc0NsYXNzZXMoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgYFxufSlcbmV4cG9ydCBjbGFzcyBCc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIG92ZXJyaWRlU2l6ZTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlICRtb2RhbDogSlF1ZXJ5O1xuICAgIHByaXZhdGUgJGRpYWxvZzogSlF1ZXJ5O1xuICAgIHByaXZhdGUgb25TaG93RXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uU2hvd25FdmVudCQ6IE9ic2VydmFibGU8RXZlbnQ+O1xuICAgIHByaXZhdGUgb25IaWRlRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uSGlkZGVuRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uTG9hZGVkRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uU2hvd24kOiBPYnNlcnZhYmxlPHt9PjtcbiAgICBwcml2YXRlIG9uSW50ZXJuYWxDbG9zZSQ6IFN1YmplY3Q8QnNNb2RhbEhpZGVUeXBlPiA9IG5ldyBTdWJqZWN0PEJzTW9kYWxIaWRlVHlwZT4oKTtcbiAgICBwcml2YXRlIG9uRGlzbWlzcyQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVUeXBlPjtcbiAgICBwcml2YXRlIG9uSGlkZSQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVFdmVudD47XG4gICAgcHJpdmF0ZSBvbkhpZGRlbiQ6IE9ic2VydmFibGU8QnNNb2RhbEhpZGVUeXBlPjtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLiRtb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vZGFsLmRhdGEoREFUQV9LRVkpLm9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuICAgIHNob3dpbmcgPSBmYWxzZTtcbiAgICBoaWRpbmcgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGFuaW1hdGlvbiA9IHRydWU7XG4gICAgQElucHV0KCkgYmFja2Ryb3A6IHN0cmluZyB8IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGtleWJvYXJkID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaXplOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcblxuICAgIEBPdXRwdXQoKSBvblNob3cgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBvbk9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25IaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgb25EaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjxCc01vZGFsSGlkZVR5cGU+KCk7XG4gICAgQE91dHB1dCgpIG9uTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZhZGUnKVxuICAgIGdldCBmYWRlQ2xhc3MoKSB7IHJldHVybiB0aGlzLmFuaW1hdGlvbjsgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tb2RhbCcpXG4gICAgZ2V0IG1vZGFsQ2xhc3MoKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgZ2V0IHJvbGVBdHRyKCkgeyByZXR1cm4gJ2RpYWxvZyc7IH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgZ2V0IHRhYmluZGV4QXR0cigpIHsgcmV0dXJuICctMSc7IH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSBzZXJ2aWNlOiBCc01vZGFsU2VydmljZSwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVycygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy4kZGlhbG9nID0gdGhpcy4kbW9kYWwuZmluZCgnLm1vZGFsLWRpYWxvZycpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMoe1xuICAgICAgICAgICAgYmFja2Ryb3A6IHRoaXMuYmFja2Ryb3AsXG4gICAgICAgICAgICBrZXlib2FyZDogdGhpcy5rZXlib2FyZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5vbkludGVybmFsQ2xvc2UkLm5leHQoQnNNb2RhbEhpZGVUeXBlLkRlc3Ryb3kpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuJG1vZGFsLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgfVxuXG4gICAgcm91dGVyQ2FuRGVhY3RpdmF0ZSgpOiBhbnkge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuUm91dGVDaGFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihzaXplPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVTaXplID0gbnVsbDtcbiAgICAgICAgaWYgKEJzTW9kYWxTaXplLmlzVmFsaWRTaXplKHNpemUpKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlU2l6ZSA9IHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdygpLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGNsb3NlKHZhbHVlPzogYW55KTogUHJvbWlzZTx7fT4ge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuQ2xvc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5oaWRlKCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLm9uQ2xvc2UuZW1pdCh2YWx1ZSkpLFxuICAgICAgICApLnRvUHJvbWlzZSgpLnRoZW4oKCkgPT4gdmFsdWUpO1xuICAgIH1cblxuICAgIGRpc21pc3MoKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICB0aGlzLm9uSW50ZXJuYWxDbG9zZSQubmV4dChCc01vZGFsSGlkZVR5cGUuRGlzbWlzcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGUoKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXRDc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTbWFsbCgpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ21vZGFsLXNtJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xhcmdlKCkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbW9kYWwtbGcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5jc3NDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZVNpemUgIT09IEJzTW9kYWxTaXplLkxhcmdlXG4gICAgICAgICAgICAmJiB0aGlzLnNpemUgPT09IEJzTW9kYWxTaXplLlNtYWxsXG4gICAgICAgICAgICB8fCB0aGlzLm92ZXJyaWRlU2l6ZSA9PT0gQnNNb2RhbFNpemUuU21hbGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZVNpemUgIT09IEJzTW9kYWxTaXplLlNtYWxsXG4gICAgICAgICAgICAmJiB0aGlzLnNpemUgPT09IEJzTW9kYWxTaXplLkxhcmdlXG4gICAgICAgICAgICB8fCB0aGlzLm92ZXJyaWRlU2l6ZSA9PT0gQnNNb2RhbFNpemUuTGFyZ2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUgJiYgIXRoaXMuaGlkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd2luZyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKChvOiBPYnNlcnZlcjxhbnk+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU2hvd24kLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICAgICAgICAgIG8ubmV4dChuZXh0KTtcbiAgICAgICAgICAgICAgICBvLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uRml4KCk7XG4gICAgICAgICAgICB0aGlzLiRtb2RhbC5tb2RhbCgnc2hvdycpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyYW5zaXRpb25GaXgoKSB7XG4gICAgICAgIC8vIEZpeCBmb3Igc2hvd24uYnMubW9kYWwgbm90IGZpcmluZyB3aGVuIC5mYWRlIGlzIHByZXNlbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTc5M1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnRyaWdnZXIoJ2ZvY3VzJykudHJpZ2dlcihTSE9XTl9FVkVOVF9OQU1FKTtcbiAgICAgICAgICAgIH0sIGpRdWVyeS5mbi5tb2RhbFsnQ29uc3RydWN0b3InXS5UUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZSgpOiBPYnNlcnZhYmxlPEJzTW9kYWxIaWRlVHlwZT4ge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSAmJiAhdGhpcy5zaG93aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mPEJzTW9kYWxIaWRlVHlwZT4obnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSgobzogT2JzZXJ2ZXI8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkhpZGRlbiQucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICBvLm5leHQobmV4dCk7XG4gICAgICAgICAgICAgICAgby5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuJG1vZGFsLm1vZGFsKCdoaWRlJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy4kbW9kYWwgPSBqUXVlcnkodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLiRtb2RhbC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgdGhpcy4kbW9kYWwubW9kYWwoe1xuICAgICAgICAgICAgc2hvdzogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vblNob3dFdmVudCQgPSBmcm9tRXZlbnQodGhpcy4kbW9kYWwsIFNIT1dfRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25TaG93bkV2ZW50JCA9IGZyb21FdmVudCh0aGlzLiRtb2RhbCwgU0hPV05fRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25IaWRlRXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBISURFX0VWRU5UX05BTUUpO1xuICAgICAgICB0aGlzLm9uSGlkZGVuRXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBISURERU5fRVZFTlRfTkFNRSk7XG4gICAgICAgIHRoaXMub25Mb2FkZWRFdmVudCQgPSBmcm9tRXZlbnQodGhpcy4kbW9kYWwsIExPQURFRF9FVkVOVF9OQU1FKTtcblxuICAgICAgICBjb25zdCBvbkNsb3NlJCA9IG1lcmdlKHRoaXMub25JbnRlcm5hbENsb3NlJCwgdGhpcy5zZXJ2aWNlLm9uQmFja2Ryb3BDbG9zZSQsIHRoaXMuc2VydmljZS5vbktleWJvYXJkQ2xvc2UkKTtcblxuICAgICAgICB0aGlzLm9uSGlkZSQgPSB6aXAodGhpcy5vbkhpZGVFdmVudCQsIG9uQ2xvc2UkKS5waXBlKFxuICAgICAgICAgICAgbWFwKHggPT4gPEJzTW9kYWxIaWRlRXZlbnQ+eyBldmVudDogeFswXSwgdHlwZTogeFsxXSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9uSGlkZGVuJCA9IHppcDxCc01vZGFsSGlkZVR5cGU+KHRoaXMub25IaWRkZW5FdmVudCQsIG9uQ2xvc2UkKS5waXBlKFxuICAgICAgICAgICAgbWFwKHggPT4geFsxXSksXG4gICAgICAgICAgICB0YXAodGhpcy5zZXRWaXNpYmxlKGZhbHNlKSksXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXJ2aWNlLmZvY3VzTmV4dCgpKSxcbiAgICAgICAgICAgIHNoYXJlKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vblNob3duJCA9IHRoaXMub25TaG93bkV2ZW50JC5waXBlKFxuICAgICAgICAgICAgdGFwKHRoaXMuc2V0VmlzaWJsZSh0cnVlKSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbkRpc21pc3MkID0gdGhpcy5vbkhpZGRlbiQucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4geCAhPT0gQnNNb2RhbEhpZGVUeXBlLkNsb3NlKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciBldmVudHNcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goLi4uW1xuICAgICAgICAgICAgdGhpcy5vblNob3duJC5zdWJzY3JpYmUoKCkgPT4geyB9KSxcbiAgICAgICAgICAgIHRoaXMub25IaWRkZW4kLnN1YnNjcmliZSgoKSA9PiB7IH0pLFxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm9uTW9kYWxTdGFjayQuc3Vic2NyaWJlKCgpID0+IHsgfSlcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3aXJlVXBFdmVudEVtaXR0ZXJzKCkge1xuXG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25TaG93LCB0aGlzLm9uU2hvd0V2ZW50JCk7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25PcGVuLCB0aGlzLm9uU2hvd24kKTtcbiAgICAgICAgdGhpcy53aXJlVXBFdmVudEVtaXR0ZXIodGhpcy5vbkhpZGUsIHRoaXMub25IaWRlJCk7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25EaXNtaXNzLCB0aGlzLm9uRGlzbWlzcyQpO1xuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcih0aGlzLm9uTG9hZGVkLCB0aGlzLm9uTG9hZGVkRXZlbnQkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdpcmVVcEV2ZW50RW1pdHRlcjxUPihlbWl0dGVyOiBFdmVudEVtaXR0ZXI8VD4sIHN0cmVhbSQ6IE9ic2VydmFibGU8VD4pIHtcbiAgICAgICAgaWYgKGVtaXR0ZXIub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViID0gc3RyZWFtJC5zdWJzY3JpYmUoKG5leHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXR0ZXIubmV4dChuZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VmlzaWJsZSA9IChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGlzVmlzaWJsZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE9wdGlvbnMgPSAob3B0aW9uczogQnNNb2RhbE9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IGJhY2tkcm9wID0gb3B0aW9ucy5iYWNrZHJvcDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYWNrZHJvcCA9PT0gJ3N0cmluZycgJiYgYmFja2Ryb3AgIT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgICBiYWNrZHJvcCA9IHRydWU7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmJhY2tkcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5iYWNrZHJvcCA9IGJhY2tkcm9wO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmtleWJvYXJkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5rZXlib2FyZCA9IG9wdGlvbnMua2V5Ym9hcmQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3koKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGUoKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kbW9kYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuZGF0YShEQVRBX0tFWSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKS50b1Byb21pc2UoKTtcbiAgICB9XG59XG4iXX0=