ng2-bs3-modal
Version:
Angular Boostrap 3 Modal Component
417 lines (416 loc) • 37.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
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 {?} */
const EVENT_SUFFIX = 'ng2-bs3-modal';
/** @type {?} */
const SHOW_EVENT_NAME = `show.bs.modal.${EVENT_SUFFIX}`;
/** @type {?} */
const SHOWN_EVENT_NAME = `shown.bs.modal.${EVENT_SUFFIX}`;
/** @type {?} */
const HIDE_EVENT_NAME = `hide.bs.modal.${EVENT_SUFFIX}`;
/** @type {?} */
const HIDDEN_EVENT_NAME = `hidden.bs.modal.${EVENT_SUFFIX}`;
/** @type {?} */
const LOADED_EVENT_NAME = `loaded.bs.modal.${EVENT_SUFFIX}`;
/** @type {?} */
const DATA_KEY = 'bs.modal';
export class BsModalComponent {
/**
* @param {?} element
* @param {?} service
* @param {?} zone
*/
constructor(element, service, zone) {
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 = (isVisible) => {
return () => {
this.visible = isVisible;
this.showing = false;
this.hiding = false;
};
};
this.setOptions = (options) => {
/** @type {?} */
let 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();
}
/**
* @return {?}
*/
get options() {
if (!this.$modal) {
this.init();
}
return this.$modal.data(DATA_KEY).options;
}
/**
* @return {?}
*/
get fadeClass() { return this.animation; }
/**
* @return {?}
*/
get modalClass() { return true; }
/**
* @return {?}
*/
get roleAttr() { return 'dialog'; }
/**
* @return {?}
*/
get tabindexAttr() { return '-1'; }
/**
* @return {?}
*/
ngOnInit() {
this.wireUpEventEmitters();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.$dialog = this.$modal.find('.modal-dialog');
}
/**
* @return {?}
*/
ngOnChanges() {
this.setOptions({
backdrop: this.backdrop,
keyboard: this.keyboard
});
}
/**
* @return {?}
*/
ngOnDestroy() {
this.onInternalClose$.next(BsModalHideType.Destroy);
return this.destroy();
}
/**
* @return {?}
*/
focus() {
this.$modal.trigger('focus');
}
/**
* @return {?}
*/
routerCanDeactivate() {
this.onInternalClose$.next(BsModalHideType.RouteChange);
return this.destroy();
}
/**
* @param {?=} size
* @return {?}
*/
open(size) {
this.overrideSize = null;
if (BsModalSize.isValidSize(size)) {
this.overrideSize = size;
}
return this.show().toPromise();
}
/**
* @param {?=} value
* @return {?}
*/
close(value) {
this.onInternalClose$.next(BsModalHideType.Close);
return this.hide().pipe(tap(() => this.onClose.emit(value))).toPromise().then(() => value);
}
/**
* @return {?}
*/
dismiss() {
this.onInternalClose$.next(BsModalHideType.Dismiss);
return this.hide().toPromise();
}
/**
* @return {?}
*/
getCssClasses() {
/** @type {?} */
const 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 {?}
*/
isSmall() {
return this.overrideSize !== BsModalSize.Large
&& this.size === BsModalSize.Small
|| this.overrideSize === BsModalSize.Small;
}
/**
* @return {?}
*/
isLarge() {
return this.overrideSize !== BsModalSize.Small
&& this.size === BsModalSize.Large
|| this.overrideSize === BsModalSize.Large;
}
/**
* @return {?}
*/
show() {
if (this.visible && !this.hiding) {
return observableOf(null);
}
this.showing = true;
return Observable.create((o) => {
this.onShown$.pipe(take(1)).subscribe(next => {
o.next(next);
o.complete();
});
this.transitionFix();
this.$modal.modal('show');
});
}
/**
* @return {?}
*/
transitionFix() {
// Fix for shown.bs.modal not firing when .fade is present
// https://github.com/twbs/bootstrap/issues/11793
if (this.animation) {
setTimeout(() => {
this.$modal.trigger('focus').trigger(SHOWN_EVENT_NAME);
}, jQuery.fn.modal['Constructor'].TRANSITION_DURATION);
}
}
/**
* @return {?}
*/
hide() {
if (!this.visible && !this.showing) {
return observableOf(null);
}
this.hiding = true;
return Observable.create((o) => {
this.onHidden$.pipe(take(1)).subscribe(next => {
o.next(next);
o.complete();
});
this.$modal.modal('hide');
});
}
/**
* @return {?}
*/
init() {
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 {?} */
const onClose$ = merge(this.onInternalClose$, this.service.onBackdropClose$, this.service.onKeyboardClose$);
this.onHide$ = zip(this.onHideEvent$, onClose$).pipe(map(x => /** @type {?} */ ({ event: x[0], type: x[1] })));
this.onHidden$ = zip(this.onHiddenEvent$, onClose$).pipe(map(x => x[1]), tap(this.setVisible(false)), tap(() => this.service.focusNext()), share());
this.onShown$ = this.onShownEvent$.pipe(tap(this.setVisible(true)), share());
this.onDismiss$ = this.onHidden$.pipe(filter((x) => x !== BsModalHideType.Close));
// Start watching for events
this.subscriptions.push(...[
this.onShown$.subscribe(() => { }),
this.onHidden$.subscribe(() => { }),
this.service.onModalStack$.subscribe(() => { })
]);
}
/**
* @return {?}
*/
wireUpEventEmitters() {
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 {?}
*/
wireUpEventEmitter(emitter, stream$) {
if (emitter.observers.length === 0) {
return;
}
/** @type {?} */
const sub = stream$.subscribe((next) => {
this.zone.run(() => {
emitter.next(next);
});
});
this.subscriptions.push(sub);
}
/**
* @return {?}
*/
destroy() {
return this.hide().pipe(tap(() => {
this.service.remove(this);
this.subscriptions.forEach(s => 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: `
<div class="modal-dialog" [ngClass]="getCssClasses()">
<div class="modal-content">
<ng-content></ng-content>
</div>
</div>
`
},] },
];
/** @nocollapse */
BsModalComponent.ctorParameters = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcyLWJzMy1tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsL21vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUNILFNBQVMsRUFLVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFZLE9BQU8sRUFBZ0IsRUFBRSxJQUFJLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBb0IsZUFBZSxFQUFrQixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVqRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7O0FBQ3JDLE1BQU0sZUFBZSxHQUFHLGlCQUFpQixZQUFZLEVBQUUsQ0FBQzs7QUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsWUFBWSxFQUFFLENBQUM7O0FBQzFELE1BQU0sZUFBZSxHQUFHLGlCQUFpQixZQUFZLEVBQUUsQ0FBQzs7QUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsWUFBWSxFQUFFLENBQUM7O0FBQzVELE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLFlBQVksRUFBRSxDQUFDOztBQUM1RCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFZNUIsTUFBTTs7Ozs7O0lBb0RGLFlBQW9CLE9BQW1CLEVBQVUsT0FBdUIsRUFBVSxJQUFZO1FBQTFFLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBVSxZ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LEdBQUcsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDdEI7U0FDSixDQUFDLENBQ0wsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7OztZQXRTckIsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixRQUFRLEVBQUU7Ozs7OztLQU1UO2FBQ0o7Ozs7WUEzQkcsVUFBVTtZQVFMLGNBQWM7WUFObkIsTUFBTTs7O3dCQXFETCxLQUFLO3VCQUNMLEtBQUs7dUJBQ0wsS0FBSzttQkFDTCxLQUFLO3VCQUNMLEtBQUs7cUJBRUwsTUFBTTtxQkFDTixNQUFNO3FCQUNOLE1BQU07c0JBQ04sTUFBTTt3QkFDTixNQUFNO3VCQUNOLE1BQU07d0JBRU4sV0FBVyxTQUFDLFlBQVk7eUJBR3hCLFdBQVcsU0FBQyxhQUFhO3VCQUd6QixXQUFXLFNBQUMsV0FBVzsyQkFHdkIsV0FBVyxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTpuby1vdXRwdXQtb24tcHJlZml4XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiBhcyBvYnNlcnZhYmxlT2YsIGZyb21FdmVudCwgbWVyZ2UsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgZmlsdGVyLCB0YXAsIHNoYXJlLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEJzTW9kYWxIaWRlRXZlbnQsIEJzTW9kYWxIaWRlVHlwZSwgQnNNb2RhbE9wdGlvbnMsIEJzTW9kYWxTaXplIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICcuL21vZGFsLnNlcnZpY2UnO1xuXG5jb25zdCBFVkVOVF9TVUZGSVggPSAnbmcyLWJzMy1tb2RhbCc7XG5jb25zdCBTSE9XX0VWRU5UX05BTUUgPSBgc2hvdy5icy5tb2RhbC4ke0VWRU5UX1NVRkZJWH1gO1xuY29uc3QgU0hPV05fRVZFTlRfTkFNRSA9IGBzaG93bi5icy5tb2RhbC4ke0VWRU5UX1NVRkZJWH1gO1xuY29uc3QgSElERV9FVkVOVF9OQU1FID0gYGhpZGUuYnMubW9kYWwuJHtFVkVOVF9TVUZGSVh9YDtcbmNvbnN0IEhJRERFTl9FVkVOVF9OQU1FID0gYGhpZGRlbi5icy5tb2RhbC4ke0VWRU5UX1NVRkZJWH1gO1xuY29uc3QgTE9BREVEX0VWRU5UX05BTUUgPSBgbG9hZGVkLmJzLm1vZGFsLiR7RVZFTlRfU1VGRklYfWA7XG5jb25zdCBEQVRBX0tFWSA9ICdicy5tb2RhbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYnMtbW9kYWwnLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBbbmdDbGFzc109XCJnZXRDc3NDbGFzc2VzKClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGBcbn0pXG5leHBvcnQgY2xhc3MgQnNNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBvdmVycmlkZVNpemU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSAkbW9kYWw6IEpRdWVyeTtcbiAgICBwcml2YXRlICRkaWFsb2c6IEpRdWVyeTtcbiAgICBwcml2YXRlIG9uU2hvd0V2ZW50JDogT2JzZXJ2YWJsZTxFdmVudD47XG4gICAgcHJpdmF0ZSBvblNob3duRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgICBwcml2YXRlIG9uSGlkZUV2ZW50JDogT2JzZXJ2YWJsZTxFdmVudD47XG4gICAgcHJpdmF0ZSBvbkhpZGRlbkV2ZW50JDogT2JzZXJ2YWJsZTxFdmVudD47XG4gICAgcHJpdmF0ZSBvbkxvYWRlZEV2ZW50JDogT2JzZXJ2YWJsZTxFdmVudD47XG4gICAgcHJpdmF0ZSBvblNob3duJDogT2JzZXJ2YWJsZTx7fT47XG4gICAgcHJpdmF0ZSBvbkludGVybmFsQ2xvc2UkOiBTdWJqZWN0PEJzTW9kYWxIaWRlVHlwZT4gPSBuZXcgU3ViamVjdDxCc01vZGFsSGlkZVR5cGU+KCk7XG4gICAgcHJpdmF0ZSBvbkRpc21pc3MkOiBPYnNlcnZhYmxlPEJzTW9kYWxIaWRlVHlwZT47XG4gICAgcHJpdmF0ZSBvbkhpZGUkOiBPYnNlcnZhYmxlPEJzTW9kYWxIaWRlRXZlbnQ+O1xuICAgIHByaXZhdGUgb25IaWRkZW4kOiBPYnNlcnZhYmxlPEJzTW9kYWxIaWRlVHlwZT47XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICAgIHByaXZhdGUgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy4kbW9kYWwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiRtb2RhbC5kYXRhKERBVEFfS0VZKS5vcHRpb25zO1xuICAgIH1cblxuICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICBzaG93aW5nID0gZmFsc2U7XG4gICAgaGlkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBhbmltYXRpb24gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGJhY2tkcm9wOiBzdHJpbmcgfCBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBrZXlib2FyZCA9IHRydWU7XG4gICAgQElucHV0KCkgc2l6ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XG5cbiAgICBAT3V0cHV0KCkgb25TaG93ID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgb25PcGVuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uSGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uRGlzbWlzcyA9IG5ldyBFdmVudEVtaXR0ZXI8QnNNb2RhbEhpZGVUeXBlPigpO1xuICAgIEBPdXRwdXQoKSBvbkxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mYWRlJylcbiAgICBnZXQgZmFkZUNsYXNzKCkgeyByZXR1cm4gdGhpcy5hbmltYXRpb247IH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubW9kYWwnKVxuICAgIGdldCBtb2RhbENsYXNzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIGdldCByb2xlQXR0cigpIHsgcmV0dXJuICdkaWFsb2cnOyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIGdldCB0YWJpbmRleEF0dHIoKSB7IHJldHVybiAnLTEnOyB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VydmljZTogQnNNb2RhbFNlcnZpY2UsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgICAgIHRoaXMuc2VydmljZS5hZGQodGhpcyk7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcnMoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuJGRpYWxvZyA9IHRoaXMuJG1vZGFsLmZpbmQoJy5tb2RhbC1kaWFsb2cnKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIGJhY2tkcm9wOiB0aGlzLmJhY2tkcm9wLFxuICAgICAgICAgICAga2V5Ym9hcmQ6IHRoaXMua2V5Ym9hcmRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMub25JbnRlcm5hbENsb3NlJC5uZXh0KEJzTW9kYWxIaWRlVHlwZS5EZXN0cm95KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLiRtb2RhbC50cmlnZ2VyKCdmb2N1cycpO1xuICAgIH1cblxuICAgIHJvdXRlckNhbkRlYWN0aXZhdGUoKTogYW55IHtcbiAgICAgICAgdGhpcy5vbkludGVybmFsQ2xvc2UkLm5leHQoQnNNb2RhbEhpZGVUeXBlLlJvdXRlQ2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIG9wZW4oc2l6ZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLm92ZXJyaWRlU2l6ZSA9IG51bGw7XG4gICAgICAgIGlmIChCc01vZGFsU2l6ZS5pc1ZhbGlkU2l6ZShzaXplKSkge1xuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVNpemUgPSBzaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNob3coKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBjbG9zZSh2YWx1ZT86IGFueSk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdGhpcy5vbkludGVybmFsQ2xvc2UkLm5leHQoQnNNb2RhbEhpZGVUeXBlLkNsb3NlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5vbkNsb3NlLmVtaXQodmFsdWUpKSxcbiAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKCgpID0+IHZhbHVlKTtcbiAgICB9XG5cbiAgICBkaXNtaXNzKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdGhpcy5vbkludGVybmFsQ2xvc2UkLm5leHQoQnNNb2RhbEhpZGVUeXBlLkRpc21pc3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5oaWRlKCkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3NzQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU21hbGwoKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdtb2RhbC1zbScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMYXJnZSgpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ21vZGFsLWxnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jc3NDbGFzcykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuY3NzQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTbWFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnJpZGVTaXplICE9PSBCc01vZGFsU2l6ZS5MYXJnZVxuICAgICAgICAgICAgJiYgdGhpcy5zaXplID09PSBCc01vZGFsU2l6ZS5TbWFsbFxuICAgICAgICAgICAgfHwgdGhpcy5vdmVycmlkZVNpemUgPT09IEJzTW9kYWxTaXplLlNtYWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMYXJnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnJpZGVTaXplICE9PSBCc01vZGFsU2l6ZS5TbWFsbFxuICAgICAgICAgICAgJiYgdGhpcy5zaXplID09PSBCc01vZGFsU2l6ZS5MYXJnZVxuICAgICAgICAgICAgfHwgdGhpcy5vdmVycmlkZVNpemUgPT09IEJzTW9kYWxTaXplLkxhcmdlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvdygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAodGhpcy52aXNpYmxlICYmICF0aGlzLmhpZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dpbmcgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSgobzogT2JzZXJ2ZXI8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblNob3duJC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICApLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICBvLm5leHQobmV4dCk7XG4gICAgICAgICAgICAgICAgby5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbkZpeCgpO1xuICAgICAgICAgICAgdGhpcy4kbW9kYWwubW9kYWwoJ3Nob3cnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2l0aW9uRml4KCkge1xuICAgICAgICAvLyBGaXggZm9yIHNob3duLmJzLm1vZGFsIG5vdCBmaXJpbmcgd2hlbiAuZmFkZSBpcyBwcmVzZW50XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE3OTNcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoU0hPV05fRVZFTlRfTkFNRSk7XG4gICAgICAgICAgICB9LCBqUXVlcnkuZm4ubW9kYWxbJ0NvbnN0cnVjdG9yJ10uVFJBTlNJVElPTl9EVVJBVElPTik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZGUoKTogT2JzZXJ2YWJsZTxCc01vZGFsSGlkZVR5cGU+IHtcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUgJiYgIXRoaXMuc2hvd2luZykge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZjxCc01vZGFsSGlkZVR5cGU+KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkaW5nID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKG86IE9ic2VydmVyPGFueT4pID0+IHtcbiAgICAgICAgICAgIHRoaXMub25IaWRkZW4kLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUobmV4dCA9PiB7XG4gICAgICAgICAgICAgICAgby5uZXh0KG5leHQpO1xuICAgICAgICAgICAgICAgIG8uY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLiRtb2RhbC5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXQoKSB7XG4gICAgICAgIHRoaXMuJG1vZGFsID0galF1ZXJ5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy4kbW9kYWwuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XG4gICAgICAgIHRoaXMuJG1vZGFsLm1vZGFsKHtcbiAgICAgICAgICAgIHNob3c6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25TaG93RXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBTSE9XX0VWRU5UX05BTUUpO1xuICAgICAgICB0aGlzLm9uU2hvd25FdmVudCQgPSBmcm9tRXZlbnQodGhpcy4kbW9kYWwsIFNIT1dOX0VWRU5UX05BTUUpO1xuICAgICAgICB0aGlzLm9uSGlkZUV2ZW50JCA9IGZyb21FdmVudCh0aGlzLiRtb2RhbCwgSElERV9FVkVOVF9OQU1FKTtcbiAgICAgICAgdGhpcy5vbkhpZGRlbkV2ZW50JCA9IGZyb21FdmVudCh0aGlzLiRtb2RhbCwgSElEREVOX0VWRU5UX05BTUUpO1xuICAgICAgICB0aGlzLm9uTG9hZGVkRXZlbnQkID0gZnJvbUV2ZW50KHRoaXMuJG1vZGFsLCBMT0FERURfRVZFTlRfTkFNRSk7XG5cbiAgICAgICAgY29uc3Qgb25DbG9zZSQgPSBtZXJnZSh0aGlzLm9uSW50ZXJuYWxDbG9zZSQsIHRoaXMuc2VydmljZS5vbkJhY2tkcm9wQ2xvc2UkLCB0aGlzLnNlcnZpY2Uub25LZXlib2FyZENsb3NlJCk7XG5cbiAgICAgICAgdGhpcy5vbkhpZGUkID0gemlwKHRoaXMub25IaWRlRXZlbnQkLCBvbkNsb3NlJCkucGlwZShcbiAgICAgICAgICAgIG1hcCh4ID0+IDxCc01vZGFsSGlkZUV2ZW50PnsgZXZlbnQ6IHhbMF0sIHR5cGU6IHhbMV0gfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbkhpZGRlbiQgPSB6aXA8QnNNb2RhbEhpZGVUeXBlPih0aGlzLm9uSGlkZGVuRXZlbnQkLCBvbkNsb3NlJCkucGlwZShcbiAgICAgICAgICAgIG1hcCh4ID0+IHhbMV0pLFxuICAgICAgICAgICAgdGFwKHRoaXMuc2V0VmlzaWJsZShmYWxzZSkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuc2VydmljZS5mb2N1c05leHQoKSksXG4gICAgICAgICAgICBzaGFyZSgpLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub25TaG93biQgPSB0aGlzLm9uU2hvd25FdmVudCQucGlwZShcbiAgICAgICAgICAgIHRhcCh0aGlzLnNldFZpc2libGUodHJ1ZSkpLFxuICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub25EaXNtaXNzJCA9IHRoaXMub25IaWRkZW4kLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHgpID0+IHggIT09IEJzTW9kYWxIaWRlVHlwZS5DbG9zZSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdGFydCB3YXRjaGluZyBmb3IgZXZlbnRzXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKC4uLltcbiAgICAgICAgICAgIHRoaXMub25TaG93biQuc3Vic2NyaWJlKCgpID0+IHsgfSksXG4gICAgICAgICAgICB0aGlzLm9uSGlkZGVuJC5zdWJzY3JpYmUoKCkgPT4geyB9KSxcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5vbk1vZGFsU3RhY2skLnN1YnNjcmliZSgoKSA9PiB7IH0pXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2lyZVVwRXZlbnRFbWl0dGVycygpIHtcblxuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcih0aGlzLm9uU2hvdywgdGhpcy5vblNob3dFdmVudCQpO1xuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcih0aGlzLm9uT3BlbiwgdGhpcy5vblNob3duJCk7XG4gICAgICAgIHRoaXMud2lyZVVwRXZlbnRFbWl0dGVyKHRoaXMub25IaWRlLCB0aGlzLm9uSGlkZSQpO1xuICAgICAgICB0aGlzLndpcmVVcEV2ZW50RW1pdHRlcih0aGlzLm9uRGlzbWlzcywgdGhpcy5vbkRpc21pc3MkKTtcbiAgICAgICAgdGhpcy53aXJlVXBFdmVudEVtaXR0ZXIodGhpcy5vbkxvYWRlZCwgdGhpcy5vbkxvYWRlZEV2ZW50JCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3aXJlVXBFdmVudEVtaXR0ZXI8VD4oZW1pdHRlcjogRXZlbnRFbWl0dGVyPFQ+LCBzdHJlYW0kOiBPYnNlcnZhYmxlPFQ+KSB7XG4gICAgICAgIGlmIChlbWl0dGVyLm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YiA9IHN0cmVhbSQuc3Vic2NyaWJlKChuZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLm5leHQobmV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3ViKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZpc2libGUgPSAoaXNWaXNpYmxlKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSBpc1Zpc2libGU7XG4gICAgICAgICAgICB0aGlzLnNob3dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaGlkaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRPcHRpb25zID0gKG9wdGlvbnM6IEJzTW9kYWxPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBiYWNrZHJvcCA9IG9wdGlvbnMuYmFja2Ryb3A7XG4gICAgICAgIGlmICh0eXBlb2YgYmFja2Ryb3AgPT09ICdzdHJpbmcnICYmIGJhY2tkcm9wICE9PSAnc3RhdGljJykge1xuICAgICAgICAgICAgYmFja2Ryb3AgPSB0cnVlO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5iYWNrZHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYmFja2Ryb3AgPSBiYWNrZHJvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5rZXlib2FyZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMua2V5Ym9hcmQgPSBvcHRpb25zLmtleWJvYXJkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaWRlKCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJG1vZGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLmRhdGEoREFUQV9LRVksIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICkudG9Qcm9taXNlKCk7XG4gICAgfVxufVxuIl19