UNPKG

ngx-modal-dialog

Version:
266 lines (265 loc) 29.2 kB
import { Component, ComponentFactoryResolver, ElementRef, HostListener, ViewChild, ViewContainerRef } from '@angular/core'; import { from, Subject } from 'rxjs'; /** * Modal dialog component */ export class ModalDialogComponent { /** * CTOR * @param _element * @param componentFactoryResolver */ constructor(_element, componentFactoryResolver) { this._element = _element; this.componentFactoryResolver = componentFactoryResolver; /** Modal dialog style settings */ this.settings = { overlayClass: 'modal-backdrop fade', overlayAnimationTriggerClass: 'show', modalClass: 'modal ngx-modal fade', modalAnimationTriggerClass: 'show', modalDialogClass: 'modal-dialog modal-dialog-centered', contentClass: 'modal-content', headerClass: 'modal-header', headerTitleClass: 'modal-title', closeButtonClass: 'close glyphicon glyphicon-remove', closeButtonTitle: 'CLOSE', bodyClass: 'modal-body', footerClass: 'modal-footer', alertClass: 'ngx-modal-shake', alertDuration: 250, notifyWithAlert: true, buttonClass: 'btn btn-primary' }; this.showAlert = false; this.animateOverlayClass = ''; this.animateModalClass = ''; this.showOverlay = false; this._inProgress = false; } onClick(event) { if (event.target !== this.dialogElement.nativeElement) { return; } this.close(); } /** * Initialize dialog with reference to instance and options * @param reference * @param options */ dialogInit(reference, options = {}) { this.reference = reference; // inject component if (options.childComponent) { let factory = this.componentFactoryResolver.resolveComponentFactory(options.childComponent); let componentRef = this.dynamicComponentTarget.createComponent(factory); this._childInstance = componentRef.instance; this._closeDialog$ = new Subject(); this._closeDialog$.subscribe(() => { this._finalizeAndDestroy(); }); options.closeDialogSubject = this._closeDialog$; this._childInstance['dialogInit'](componentRef, options); document.activeElement != null ? document.activeElement.blur() : document.body.blur(); } // set options this._setOptions(options); } ngOnInit() { // a trick to defer css animations setTimeout(() => { this.animateOverlayClass = this.settings.overlayAnimationTriggerClass; this.animateModalClass = this.settings.modalAnimationTriggerClass; }, 0); } /** * Cleanup on destroy */ ngOnDestroy() { // run animations this.animateOverlayClass = ''; this.animateModalClass = ''; // cleanup listeners if (this._alertTimeout) { clearTimeout(this._alertTimeout); this._alertTimeout = null; } if (this._closeDialog$) { this._closeDialog$.unsubscribe(); } } /** * Run action defined on action button * @param action */ doAction(action) { // disable multi clicks if (this._inProgress) { return; } this._inProgress = true; this._closeIfSuccessful(action); } /** * Method to run on close * if action buttons are defined, it will not close */ close() { if (this._inProgress) { return; } if (this.actionButtons && this.actionButtons.length) { return; } this._inProgress = true; if (this.onClose) { this._closeIfSuccessful(this.onClose); return; } this._finalizeAndDestroy(); } /** * Pass options from dialog setup to component * @param {IModalDialogOptions} options? */ _setOptions(options) { if (options.onClose && options.actionButtons && options.actionButtons.length) { throw new Error(`OnClose callback and ActionButtons are not allowed to be defined on the same dialog.`); } // set references this.title = (options && options.title) || ''; this.onClose = (options && options.onClose) || null; this.actionButtons = (this._childInstance && this._childInstance['actionButtons']) || (options && options.actionButtons) || null; if (options && options.settings) { Object.assign(this.settings, options.settings); } } /** * Close if successful * @param callback */ _closeIfSuccessful(callback) { if (!callback) { return this._finalizeAndDestroy(); } let response = callback(); if (typeof response === 'boolean') { if (response) { return this._finalizeAndDestroy(); } return this._triggerAlert(); } if (this.isPromise(response)) { response = from(response); } if (this.isObservable(response)) { response.subscribe(() => { this._finalizeAndDestroy(); }, () => { this._triggerAlert(); }); } else { this._inProgress = false; } } _finalizeAndDestroy() { this._inProgress = false; this.reference.destroy(); } _triggerAlert() { if (this.settings.notifyWithAlert) { this.showAlert = true; this._alertTimeout = window.setTimeout(() => { this.showAlert = false; this._inProgress = false; clearTimeout(this._alertTimeout); this._alertTimeout = null; }, this.settings.alertDuration); } } isPromise(value) { return value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; } isObservable(value) { return value && typeof value.subscribe === 'function'; } } ModalDialogComponent.decorators = [ { type: Component, args: [{ selector: 'modal-dialog', template: ` <div *ngIf="settings.overlayClass && showOverlay" [ngClass]="[settings.overlayClass, animateOverlayClass]"></div> <div [ngClass]="[settings.modalClass, animateModalClass]" #dialog> <div [ngClass]="settings.modalDialogClass"> <div [ngClass]="[ showAlert ? settings.alertClass : '', settings.contentClass]"> <div [ngClass]="settings.headerClass"> <h4 [ngClass]="settings.headerTitleClass">{{title}}</h4> <button (click)="close()" *ngIf="!actionButtons || !actionButtons.length" type="button" [title]="settings.closeButtonTitle" [ngClass]="settings.closeButtonClass"> </button> </div> <div [ngClass]="settings.bodyClass"> <i #modalDialogBody></i> </div> <div [ngClass]="settings.footerClass" *ngIf="actionButtons && actionButtons.length"> <button *ngFor="let button of actionButtons" (click)="doAction(button.onAction)" [ngClass]="button.buttonClass || settings.buttonClass">{{button.text}} </button> </div> </div> </div> </div> `, styles: [` @-moz-keyframes shake { from, to { transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); } 20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); } } @-webkit-keyframes shake { from, to { transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); } 20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); } } @keyframes shake { from, to { transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); } 20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); } } .ngx-modal { display: flex; } .ngx-modal-shake { backface-visibility: hidden; -webkit-animation-duration: 0.5s; -moz-animation-duration: 0.5s; animation-duration: 0.5s; -webkit-animation-fill-mode: both; -moz-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-name: shake; -moz-animation-name: shake; animation-name: shake; } `] },] } ]; ModalDialogComponent.ctorParameters = () => [ { type: ElementRef }, { type: ComponentFactoryResolver } ]; ModalDialogComponent.propDecorators = { dynamicComponentTarget: [{ type: ViewChild, args: ['modalDialogBody', { read: ViewContainerRef, static: true },] }], dialogElement: [{ type: ViewChild, args: ['dialog',] }], onClick: [{ type: HostListener, args: ['click', ['$event'],] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixZQUFZLEVBR1osU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQVF2QixPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRDs7R0FFRztBQWdFSCxNQUFNLE9BQU8sb0JBQW9CO0lBdUMvQjs7OztPQUlHO0lBQ0gsWUFBc0IsUUFBb0IsRUFDdEIsd0JBQWtEO1FBRGhELGFBQVEsR0FBUixRQUFRLENBQVk7UUFDdEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQXhDdEUsa0NBQWtDO1FBQzNCLGFBQVEsR0FBeUI7WUFDdEMsWUFBWSxFQUFFLHFCQUFxQjtZQUNuQyw0QkFBNEIsRUFBRSxNQUFNO1lBQ3BDLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsMEJBQTBCLEVBQUUsTUFBTTtZQUNsQyxnQkFBZ0IsRUFBRSxvQ0FBb0M7WUFDdEQsWUFBWSxFQUFFLGVBQWU7WUFDN0IsV0FBVyxFQUFFLGNBQWM7WUFDM0IsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixnQkFBZ0IsRUFBRSxrQ0FBa0M7WUFDcEQsZ0JBQWdCLEVBQUUsT0FBTztZQUN6QixTQUFTLEVBQUUsWUFBWTtZQUN2QixXQUFXLEVBQUUsY0FBYztZQUMzQixVQUFVLEVBQUUsaUJBQWlCO1lBQzdCLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxpQkFBaUI7U0FDL0IsQ0FBQztRQUtLLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLEVBQUUs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Q0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTyxTQUFTLENBQUksS0FBdUI7UUFDMUMsT0FBTyxLQUFLLElBQUksT0FBYSxLQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxPQUFRLEtBQWEsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQzVHLENBQUM7SUFFTyxZQUFZLENBQUksS0FBMEI7UUFDaEQsT0FBTyxLQUFLLElBQUksT0FBYSxLQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQztJQUMvRCxDQUFDOzs7WUF6UkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2dCQXFDeEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVDt5QkEzRFE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNSO2FBeUJGOzs7WUFqRkMsVUFBVTtZQUZWLHdCQUF3Qjs7O3FDQXFGdkIsU0FBUyxTQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7NEJBQ3JFLFNBQVMsU0FBQyxRQUFRO3NCQThDbEIsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElNb2RhbERpYWxvZyxcbiAgSU1vZGFsRGlhbG9nQnV0dG9uLFxuICBJTW9kYWxEaWFsb2dPcHRpb25zLFxuICBJTW9kYWxEaWFsb2dTZXR0aW5ncyxcbiAgTW9kYWxEaWFsb2dPbkFjdGlvblxufSBmcm9tICcuL21vZGFsLWRpYWxvZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIE1vZGFsIGRpYWxvZyBjb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW9kYWwtZGlhbG9nJyxcbiAgc3R5bGVzOiBbYFxuICAgICAgQC1tb3ota2V5ZnJhbWVzIHNoYWtlIHtcbiAgICAgICAgZnJvbSwgdG8gICAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOyB9XG4gICAgICAgIDEwJSwgMzAlLCA1MCUsIDcwJSwgOTAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMnJlbSwgMCwgMCk7IH1cbiAgICAgICAgMjAlLCA0MCUsIDYwJSwgODAlICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDJyZW0sIDAsIDApOyB9XG4gICAgICB9XG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc2hha2Uge1xuICAgICAgICBmcm9tLCB0byAgICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7IH1cbiAgICAgICAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0ycmVtLCAwLCAwKTsgfVxuICAgICAgICAyMCUsIDQwJSwgNjAlLCA4MCUgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMnJlbSwgMCwgMCk7IH1cbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgc2hha2Uge1xuICAgICAgICBmcm9tLCB0byAgICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7IH1cbiAgICAgICAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0ycmVtLCAwLCAwKTsgfVxuICAgICAgICAyMCUsIDQwJSwgNjAlLCA4MCUgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMnJlbSwgMCwgMCk7IH1cbiAgICAgIH1cblxuICAgICAgLm5neC1tb2RhbCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG4gICAgICAubmd4LW1vZGFsLXNoYWtlIHtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC41cztcbiAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IDAuNXM7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC41cztcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAtbW96LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIC1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzaGFrZTtcbiAgICAgICAgLW1vei1hbmltYXRpb24tbmFtZTogc2hha2U7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBzaGFrZTtcbiAgICAgIH1cbiAgYF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cInNldHRpbmdzLm92ZXJsYXlDbGFzcyAmJiBzaG93T3ZlcmxheVwiIFtuZ0NsYXNzXT1cIltzZXR0aW5ncy5vdmVybGF5Q2xhc3MsIGFuaW1hdGVPdmVybGF5Q2xhc3NdXCI+PC9kaXY+IFxuICAgIDxkaXYgW25nQ2xhc3NdPVwiW3NldHRpbmdzLm1vZGFsQ2xhc3MsIGFuaW1hdGVNb2RhbENsYXNzXVwiICNkaWFsb2c+XG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNldHRpbmdzLm1vZGFsRGlhbG9nQ2xhc3NcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJbIHNob3dBbGVydCA/IHNldHRpbmdzLmFsZXJ0Q2xhc3MgOiAnJywgc2V0dGluZ3MuY29udGVudENsYXNzXVwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2V0dGluZ3MuaGVhZGVyQ2xhc3NcIj5cbiAgICAgICAgICAgIDxoNCBbbmdDbGFzc109XCJzZXR0aW5ncy5oZWFkZXJUaXRsZUNsYXNzXCI+e3t0aXRsZX19PC9oND5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlKClcIiAqbmdJZj1cIiFhY3Rpb25CdXR0b25zIHx8ICFhY3Rpb25CdXR0b25zLmxlbmd0aFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwic2V0dGluZ3MuY2xvc2VCdXR0b25UaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNldHRpbmdzLmNsb3NlQnV0dG9uQ2xhc3NcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2V0dGluZ3MuYm9keUNsYXNzXCI+XG4gICAgICAgICAgICA8aSAjbW9kYWxEaWFsb2dCb2R5PjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNldHRpbmdzLmZvb3RlckNsYXNzXCIgKm5nSWY9XCJhY3Rpb25CdXR0b25zICYmIGFjdGlvbkJ1dHRvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYWN0aW9uQnV0dG9uc1wiIChjbGljayk9XCJkb0FjdGlvbihidXR0b24ub25BY3Rpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYnV0dG9uLmJ1dHRvbkNsYXNzIHx8IHNldHRpbmdzLmJ1dHRvbkNsYXNzXCI+e3tidXR0b24udGV4dH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIElNb2RhbERpYWxvZywgT25EZXN0cm95LCBPbkluaXQge1xuICBAVmlld0NoaWxkKCdtb2RhbERpYWxvZ0JvZHknLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgZHluYW1pY0NvbXBvbmVudFRhcmdldDogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZGlhbG9nJykgcHJpdmF0ZSBkaWFsb2dFbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVmZXJlbmNlOiBDb21wb25lbnRSZWY8SU1vZGFsRGlhbG9nPjtcblxuICAvKiogTW9kYWwgZGlhbG9nIHN0eWxlIHNldHRpbmdzICovXG4gIHB1YmxpYyBzZXR0aW5nczogSU1vZGFsRGlhbG9nU2V0dGluZ3MgPSB7XG4gICAgb3ZlcmxheUNsYXNzOiAnbW9kYWwtYmFja2Ryb3AgZmFkZScsXG4gICAgb3ZlcmxheUFuaW1hdGlvblRyaWdnZXJDbGFzczogJ3Nob3cnLFxuICAgIG1vZGFsQ2xhc3M6ICdtb2RhbCBuZ3gtbW9kYWwgZmFkZScsXG4gICAgbW9kYWxBbmltYXRpb25UcmlnZ2VyQ2xhc3M6ICdzaG93JyxcbiAgICBtb2RhbERpYWxvZ0NsYXNzOiAnbW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCcsXG4gICAgY29udGVudENsYXNzOiAnbW9kYWwtY29udGVudCcsXG4gICAgaGVhZGVyQ2xhc3M6ICdtb2RhbC1oZWFkZXInLFxuICAgIGhlYWRlclRpdGxlQ2xhc3M6ICdtb2RhbC10aXRsZScsXG4gICAgY2xvc2VCdXR0b25DbGFzczogJ2Nsb3NlIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlJyxcbiAgICBjbG9zZUJ1dHRvblRpdGxlOiAnQ0xPU0UnLFxuICAgIGJvZHlDbGFzczogJ21vZGFsLWJvZHknLFxuICAgIGZvb3RlckNsYXNzOiAnbW9kYWwtZm9vdGVyJyxcbiAgICBhbGVydENsYXNzOiAnbmd4LW1vZGFsLXNoYWtlJyxcbiAgICBhbGVydER1cmF0aW9uOiAyNTAsXG4gICAgbm90aWZ5V2l0aEFsZXJ0OiB0cnVlLFxuICAgIGJ1dHRvbkNsYXNzOiAnYnRuIGJ0bi1wcmltYXJ5J1xuICB9O1xuICBwdWJsaWMgYWN0aW9uQnV0dG9uczogSU1vZGFsRGlhbG9nQnV0dG9uW107XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgb25DbG9zZTogKCkgPT4gUHJvbWlzZTxhbnk+IHwgT2JzZXJ2YWJsZTxhbnk+IHwgYm9vbGVhbjtcblxuICBwdWJsaWMgc2hvd0FsZXJ0OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhbmltYXRlT3ZlcmxheUNsYXNzID0gJyc7XG4gIHB1YmxpYyBhbmltYXRlTW9kYWxDbGFzcyA9ICcnO1xuXG4gIHB1YmxpYyBzaG93T3ZlcmxheSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYWxlcnRUaW1lb3V0OiBudW1iZXI7XG4gIHByaXZhdGUgX2NoaWxkSW5zdGFuY2U6IGFueTtcbiAgcHJpdmF0ZSBfY2xvc2VEaWFsb2ckOiBTdWJqZWN0PHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDVE9SXG4gICAqIEBwYXJhbSBfZWxlbWVudFxuICAgKiBAcGFyYW0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZGlhbG9nIHdpdGggcmVmZXJlbmNlIHRvIGluc3RhbmNlIGFuZCBvcHRpb25zXG4gICAqIEBwYXJhbSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGRpYWxvZ0luaXQocmVmZXJlbmNlOiBDb21wb25lbnRSZWY8SU1vZGFsRGlhbG9nPiwgb3B0aW9uczogUGFydGlhbDxJTW9kYWxEaWFsb2dPcHRpb25zPGFueT4+ID0ge30pIHtcbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcblxuICAgIC8vIGluamVjdCBjb21wb25lbnRcbiAgICBpZiAob3B0aW9ucy5jaGlsZENvbXBvbmVudCkge1xuICAgICAgbGV0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShvcHRpb25zLmNoaWxkQ29tcG9uZW50KTtcbiAgICAgIGxldCBjb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRUYXJnZXQuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpIGFzIENvbXBvbmVudFJlZjxJTW9kYWxEaWFsb2c+O1xuICAgICAgdGhpcy5fY2hpbGRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJTW9kYWxEaWFsb2c7XG5cbiAgICAgIHRoaXMuX2Nsb3NlRGlhbG9nJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICB0aGlzLl9jbG9zZURpYWxvZyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZmluYWxpemVBbmREZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgb3B0aW9ucy5jbG9zZURpYWxvZ1N1YmplY3QgPSB0aGlzLl9jbG9zZURpYWxvZyQ7XG5cbiAgICAgIHRoaXMuX2NoaWxkSW5zdGFuY2VbJ2RpYWxvZ0luaXQnXShjb21wb25lbnRSZWYsIG9wdGlvbnMpO1xuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBudWxsID9cbiAgICAgICAgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKSA6XG4gICAgICAgIChkb2N1bWVudC5ib2R5IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgfVxuICAgIC8vIHNldCBvcHRpb25zXG4gICAgdGhpcy5fc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGEgdHJpY2sgdG8gZGVmZXIgY3NzIGFuaW1hdGlvbnNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU92ZXJsYXlDbGFzcyA9IHRoaXMuc2V0dGluZ3Mub3ZlcmxheUFuaW1hdGlvblRyaWdnZXJDbGFzcztcbiAgICAgIHRoaXMuYW5pbWF0ZU1vZGFsQ2xhc3MgPSB0aGlzLnNldHRpbmdzLm1vZGFsQW5pbWF0aW9uVHJpZ2dlckNsYXNzO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgb24gZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gcnVuIGFuaW1hdGlvbnNcbiAgICB0aGlzLmFuaW1hdGVPdmVybGF5Q2xhc3MgPSAnJztcbiAgICB0aGlzLmFuaW1hdGVNb2RhbENsYXNzID0gJyc7XG5cbiAgICAvLyBjbGVhbnVwIGxpc3RlbmVyc1xuICAgIGlmICh0aGlzLl9hbGVydFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVvdXQpO1xuICAgICAgdGhpcy5fYWxlcnRUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2xvc2VEaWFsb2ckKSB7XG4gICAgICB0aGlzLl9jbG9zZURpYWxvZyQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFjdGlvbiBkZWZpbmVkIG9uIGFjdGlvbiBidXR0b25cbiAgICogQHBhcmFtIGFjdGlvblxuICAgKi9cbiAgZG9BY3Rpb24oYWN0aW9uPzogTW9kYWxEaWFsb2dPbkFjdGlvbikge1xuICAgIC8vIGRpc2FibGUgbXVsdGkgY2xpY2tzXG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgdGhpcy5fY2xvc2VJZlN1Y2Nlc3NmdWwoYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcnVuIG9uIGNsb3NlXG4gICAqIGlmIGFjdGlvbiBidXR0b25zIGFyZSBkZWZpbmVkLCBpdCB3aWxsIG5vdCBjbG9zZVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub25DbG9zZSkge1xuICAgICAgdGhpcy5fY2xvc2VJZlN1Y2Nlc3NmdWwodGhpcy5vbkNsb3NlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZmluYWxpemVBbmREZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogUGFzcyBvcHRpb25zIGZyb20gZGlhbG9nIHNldHVwIHRvIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtJTW9kYWxEaWFsb2dPcHRpb25zfSBvcHRpb25zP1xuICAgKi9cbiAgcHJpdmF0ZSBfc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPElNb2RhbERpYWxvZ09wdGlvbnM8YW55Pj4pIHtcblxuICAgIGlmIChvcHRpb25zLm9uQ2xvc2UgJiYgb3B0aW9ucy5hY3Rpb25CdXR0b25zICYmIG9wdGlvbnMuYWN0aW9uQnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT25DbG9zZSBjYWxsYmFjayBhbmQgQWN0aW9uQnV0dG9ucyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgc2FtZSBkaWFsb2cuYCk7XG4gICAgfVxuICAgIC8vIHNldCByZWZlcmVuY2VzXG4gICAgdGhpcy50aXRsZSA9IChvcHRpb25zICYmIG9wdGlvbnMudGl0bGUpIHx8ICcnO1xuICAgIHRoaXMub25DbG9zZSA9IChvcHRpb25zICYmIG9wdGlvbnMub25DbG9zZSkgfHwgbnVsbDtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbnMgPSAodGhpcy5fY2hpbGRJbnN0YW5jZSAmJiB0aGlzLl9jaGlsZEluc3RhbmNlWydhY3Rpb25CdXR0b25zJ10pIHx8XG4gICAgICAob3B0aW9ucyAmJiBvcHRpb25zLmFjdGlvbkJ1dHRvbnMpIHx8IG51bGw7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXR0aW5ncykge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLCBvcHRpb25zLnNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgaWYgc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlSWZTdWNjZXNzZnVsKGNhbGxiYWNrOiBNb2RhbERpYWxvZ09uQWN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQW5kRGVzdHJveSgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZSA9IGNhbGxiYWNrKCk7XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQW5kRGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJBbGVydCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1Byb21pc2UocmVzcG9uc2UpKSB7XG4gICAgICByZXNwb25zZSA9IGZyb20ocmVzcG9uc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc09ic2VydmFibGUocmVzcG9uc2UpKSB7XG4gICAgICByZXNwb25zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUFuZERlc3Ryb3koKTtcbiAgICAgIH0sICgpID0+IHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFsZXJ0KCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmFsaXplQW5kRGVzdHJveSgpIHtcbiAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5yZWZlcmVuY2UuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpZ2dlckFsZXJ0KCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLm5vdGlmeVdpdGhBbGVydCkge1xuICAgICAgdGhpcy5zaG93QWxlcnQgPSB0cnVlO1xuICAgICAgdGhpcy5fYWxlcnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dBbGVydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9hbGVydFRpbWVvdXQgPSBudWxsO1xuICAgICAgfSwgdGhpcy5zZXR0aW5ncy5hbGVydER1cmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUHJvbWlzZTxUPih2YWx1ZTogYW55IHwgUHJvbWlzZTxUPik6IHZhbHVlIGlzIFByb21pc2U8VD4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgKDxhbnk+dmFsdWUpLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgaXNPYnNlcnZhYmxlPFQ+KHZhbHVlOiBhbnkgfCBPYnNlcnZhYmxlPFQ+KTogdmFsdWUgaXMgT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiAoPGFueT52YWx1ZSkuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nO1xuICB9XG59XG4iXX0=