UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

441 lines 34.5 kB
/** * @fileoverview added by tsickle * Generated from: modal.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay'; import { ComponentPortal, PortalInjector, TemplatePortal } from '@angular/cdk/portal'; import { Injectable, Injector, Optional, SkipSelf, TemplateRef } from '@angular/core'; import { NzConfigService } from 'ng-zorro-antd/core/config'; import { warn } from 'ng-zorro-antd/core/logger'; import { isNotNil } from 'ng-zorro-antd/core/util'; import { defer, Subject } from 'rxjs'; import { startWith } from 'rxjs/operators'; import { MODAL_MASK_CLASS_NAME, NZ_CONFIG_COMPONENT_NAME } from './modal-config'; import { NzModalConfirmContainerComponent } from './modal-confirm-container.component'; import { NzModalContainerComponent } from './modal-container.component'; import { NzModalRef } from './modal-ref'; import { ModalOptions } from './modal-types'; import { applyConfigDefaults, getValueWithConfig, setContentInstanceParams } from './utils'; var NzModalService = /** @class */ (function () { function NzModalService(overlay, injector, nzConfigService, parentModal) { var _this = this; this.overlay = overlay; this.injector = injector; this.nzConfigService = nzConfigService; this.parentModal = parentModal; this.openModalsAtThisLevel = []; this.afterAllClosedAtThisLevel = new Subject(); this.afterAllClose = (/** @type {?} */ (defer((/** * @return {?} */ function () { return _this.openModals.length ? _this._afterAllClosed : _this._afterAllClosed.pipe(startWith(undefined)); })))); } Object.defineProperty(NzModalService.prototype, "openModals", { get: /** * @return {?} */ function () { return this.parentModal ? this.parentModal.openModals : this.openModalsAtThisLevel; }, enumerable: true, configurable: true }); Object.defineProperty(NzModalService.prototype, "_afterAllClosed", { get: /** * @return {?} */ function () { /** @type {?} */ var parent = this.parentModal; return parent ? parent._afterAllClosed : this.afterAllClosedAtThisLevel; }, enumerable: true, configurable: true }); /** * @template T, R * @param {?} config * @return {?} */ NzModalService.prototype.create = /** * @template T, R * @param {?} config * @return {?} */ function (config) { return this.open((/** @type {?} */ (config.nzContent)), config); }; /** * @return {?} */ NzModalService.prototype.closeAll = /** * @return {?} */ function () { this.closeModals(this.openModals); }; /** * @template T * @param {?=} options * @param {?=} confirmType * @return {?} */ NzModalService.prototype.confirm = /** * @template T * @param {?=} options * @param {?=} confirmType * @return {?} */ function (options, confirmType) { if (options === void 0) { options = {}; } if (confirmType === void 0) { confirmType = 'confirm'; } if ('nzFooter' in options) { warn("The Confirm-Modal doesn't support \"nzFooter\", this property will be ignored."); } if (!('nzWidth' in options)) { options.nzWidth = 416; } if (!('nzMaskClosable' in options)) { options.nzMaskClosable = false; } options.nzModalType = 'confirm'; options.nzClassName = "ant-modal-confirm ant-modal-confirm-" + confirmType + " " + (options.nzClassName || ''); return this.create(options); }; /** * @template T * @param {?=} options * @return {?} */ NzModalService.prototype.info = /** * @template T * @param {?=} options * @return {?} */ function (options) { if (options === void 0) { options = {}; } return this.confirmFactory(options, 'info'); }; /** * @template T * @param {?=} options * @return {?} */ NzModalService.prototype.success = /** * @template T * @param {?=} options * @return {?} */ function (options) { if (options === void 0) { options = {}; } return this.confirmFactory(options, 'success'); }; /** * @template T * @param {?=} options * @return {?} */ NzModalService.prototype.error = /** * @template T * @param {?=} options * @return {?} */ function (options) { if (options === void 0) { options = {}; } return this.confirmFactory(options, 'error'); }; /** * @template T * @param {?=} options * @return {?} */ NzModalService.prototype.warning = /** * @template T * @param {?=} options * @return {?} */ function (options) { if (options === void 0) { options = {}; } return this.confirmFactory(options, 'warning'); }; /** * @private * @template T, R * @param {?} componentOrTemplateRef * @param {?=} config * @return {?} */ NzModalService.prototype.open = /** * @private * @template T, R * @param {?} componentOrTemplateRef * @param {?=} config * @return {?} */ function (componentOrTemplateRef, config) { var _this = this; /** @type {?} */ var configMerged = applyConfigDefaults(config || {}, new ModalOptions()); /** @type {?} */ var overlayRef = this.createOverlay(configMerged); /** @type {?} */ var modalContainer = this.attachModalContainer(overlayRef, configMerged); /** @type {?} */ var modalRef = this.attachModalContent(componentOrTemplateRef, modalContainer, overlayRef, configMerged); modalContainer.modalRef = modalRef; this.openModals.push(modalRef); modalRef.afterClose.subscribe((/** * @return {?} */ function () { return _this.removeOpenModal(modalRef); })); return modalRef; }; /** * @private * @param {?} modalRef * @return {?} */ NzModalService.prototype.removeOpenModal = /** * @private * @param {?} modalRef * @return {?} */ function (modalRef) { /** @type {?} */ var index = this.openModals.indexOf(modalRef); if (index > -1) { this.openModals.splice(index, 1); if (!this.openModals.length) { this._afterAllClosed.next(); } } }; /** * @private * @param {?} dialogs * @return {?} */ NzModalService.prototype.closeModals = /** * @private * @param {?} dialogs * @return {?} */ function (dialogs) { /** @type {?} */ var i = dialogs.length; while (i--) { dialogs[i].close(); if (!this.openModals.length) { this._afterAllClosed.next(); } } }; /** * @private * @param {?} config * @return {?} */ NzModalService.prototype.createOverlay = /** * @private * @param {?} config * @return {?} */ function (config) { /** @type {?} */ var globalConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_COMPONENT_NAME) || {}; /** @type {?} */ var overlayConfig = new OverlayConfig({ hasBackdrop: true, scrollStrategy: this.overlay.scrollStrategies.block(), positionStrategy: this.overlay.position().global(), disposeOnNavigation: getValueWithConfig(config.nzCloseOnNavigation, globalConfig.nzCloseOnNavigation, true) }); if (getValueWithConfig(config.nzMask, globalConfig.nzMask, true)) { overlayConfig.backdropClass = MODAL_MASK_CLASS_NAME; } return this.overlay.create(overlayConfig); }; /** * @private * @param {?} overlayRef * @param {?} config * @return {?} */ NzModalService.prototype.attachModalContainer = /** * @private * @param {?} overlayRef * @param {?} config * @return {?} */ function (overlayRef, config) { /** @type {?} */ var userInjector = config && config.nzViewContainerRef && config.nzViewContainerRef.injector; /** @type {?} */ var injector = new PortalInjector(userInjector || this.injector, new WeakMap([ [OverlayRef, overlayRef], [ModalOptions, config] ])); /** @type {?} */ var ContainerComponent = config.nzModalType === 'confirm' ? // If the mode is `confirm`, use `NzModalConfirmContainerComponent` NzModalConfirmContainerComponent : // If the mode is not `confirm`, use `NzModalContainerComponent` NzModalContainerComponent; /** @type {?} */ var containerPortal = new ComponentPortal(ContainerComponent, config.nzViewContainerRef, injector); /** @type {?} */ var containerRef = overlayRef.attach(containerPortal); return containerRef.instance; }; /** * @private * @template T, R * @param {?} componentOrTemplateRef * @param {?} modalContainer * @param {?} overlayRef * @param {?} config * @return {?} */ NzModalService.prototype.attachModalContent = /** * @private * @template T, R * @param {?} componentOrTemplateRef * @param {?} modalContainer * @param {?} overlayRef * @param {?} config * @return {?} */ function (componentOrTemplateRef, modalContainer, overlayRef, config) { /** @type {?} */ var modalRef = new NzModalRef(overlayRef, config, modalContainer); if (componentOrTemplateRef instanceof TemplateRef) { modalContainer.attachTemplatePortal(new TemplatePortal(componentOrTemplateRef, (/** @type {?} */ (null)), (/** @type {?} */ ({ $implicit: config.nzComponentParams, modalRef: modalRef })))); } else if (isNotNil(componentOrTemplateRef) && typeof componentOrTemplateRef !== 'string') { /** @type {?} */ var injector = this.createInjector(modalRef, config); /** @type {?} */ var contentRef = modalContainer.attachComponentPortal(new ComponentPortal(componentOrTemplateRef, config.nzViewContainerRef, injector)); setContentInstanceParams(contentRef.instance, config.nzComponentParams); modalRef.componentInstance = contentRef.instance; } return modalRef; }; /** * @private * @template T, R * @param {?} modalRef * @param {?} config * @return {?} */ NzModalService.prototype.createInjector = /** * @private * @template T, R * @param {?} modalRef * @param {?} config * @return {?} */ function (modalRef, config) { /** @type {?} */ var userInjector = config && config.nzViewContainerRef && config.nzViewContainerRef.injector; /** @type {?} */ var injectionTokens = new WeakMap([[NzModalRef, modalRef]]); return new PortalInjector(userInjector || this.injector, injectionTokens); }; /** * @private * @template T * @param {?=} options * @param {?=} confirmType * @return {?} */ NzModalService.prototype.confirmFactory = /** * @private * @template T * @param {?=} options * @param {?=} confirmType * @return {?} */ function (options, confirmType) { if (options === void 0) { options = {}; } /** @type {?} */ var iconMap = { info: 'info-circle', success: 'check-circle', error: 'close-circle', warning: 'exclamation-circle' }; if (!('nzIconType' in options)) { options.nzIconType = iconMap[confirmType]; } if (!('nzCancelText' in options)) { // Remove the Cancel button if the user not specify a Cancel button options.nzCancelText = null; } return this.confirm(options, confirmType); }; /** * @return {?} */ NzModalService.prototype.ngOnDestroy = /** * @return {?} */ function () { this.closeModals(this.openModalsAtThisLevel); this.afterAllClosedAtThisLevel.complete(); }; NzModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NzModalService.ctorParameters = function () { return [ { type: Overlay }, { type: Injector }, { type: NzConfigService }, { type: NzModalService, decorators: [{ type: Optional }, { type: SkipSelf }] } ]; }; return NzModalService; }()); export { NzModalService }; if (false) { /** * @type {?} * @private */ NzModalService.prototype.openModalsAtThisLevel; /** * @type {?} * @private */ NzModalService.prototype.afterAllClosedAtThisLevel; /** @type {?} */ NzModalService.prototype.afterAllClose; /** * @type {?} * @private */ NzModalService.prototype.overlay; /** * @type {?} * @private */ NzModalService.prototype.injector; /** * @type {?} * @private */ NzModalService.prototype.nzConfigService; /** * @type {?} * @private */ NzModalService.prototype.parentModal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvbW9kYWwvIiwic291cmNlcyI6WyJtb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUtBLE9BQU8sRUFBaUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBYSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWpELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUk1RjtJQWtCRSx3QkFDVSxPQUFnQixFQUNoQixR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Q0FBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLG1FQUFtRTtZQUNuRSxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7OztJQUVELG9DQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVDLENBQUM7O2dCQTVMRixVQUFVOzs7O2dCQXBCYSxPQUFPO2dCQUVWLFFBQVE7Z0JBQ3BCLGVBQWU7Z0JBdUN5QixjQUFjLHVCQUExRCxRQUFRLFlBQUksUUFBUTs7SUF1S3pCLHFCQUFDO0NBQUEsQUE3TEQsSUE2TEM7U0E1TFksY0FBYzs7Ozs7O0lBQ3pCLCtDQUFpRDs7Ozs7SUFDakQsbURBQWlFOztJQVdqRSx1Q0FFc0I7Ozs7O0lBR3BCLGlDQUF3Qjs7Ozs7SUFDeEIsa0NBQTBCOzs7OztJQUMxQix5Q0FBd0M7Ozs7O0lBQ3hDLHFDQUEyRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbEluamVjdG9yLCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT3B0aW9uYWwsIFNraXBTZWxmLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpDb25maWdTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQgeyBJbmRleGFibGVPYmplY3QsIE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBpc05vdE5pbCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IGRlZmVyLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1PREFMX01BU0tfQ0xBU1NfTkFNRSwgTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FIH0gZnJvbSAnLi9tb2RhbC1jb25maWcnO1xuaW1wb3J0IHsgTnpNb2RhbENvbmZpcm1Db250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL21vZGFsLWNvbmZpcm0tY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlTW9kYWxDb250YWluZXIgfSBmcm9tICcuL21vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQgeyBOek1vZGFsQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE56TW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZic7XG5pbXBvcnQgeyBDb25maXJtVHlwZSwgTW9kYWxPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC10eXBlcyc7XG5pbXBvcnQgeyBhcHBseUNvbmZpZ0RlZmF1bHRzLCBnZXRWYWx1ZVdpdGhDb25maWcsIHNldENvbnRlbnRJbnN0YW5jZVBhcmFtcyB9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIENvbnRlbnRUeXBlPFQ+ID0gQ29tcG9uZW50VHlwZTxUPiB8IFRlbXBsYXRlUmVmPFQ+IHwgc3RyaW5nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTnpNb2RhbFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIG9wZW5Nb2RhbHNBdFRoaXNMZXZlbDogTnpNb2RhbFJlZltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ2V0IG9wZW5Nb2RhbHMoKTogTnpNb2RhbFJlZltdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRNb2RhbCA/IHRoaXMucGFyZW50TW9kYWwub3Blbk1vZGFscyA6IHRoaXMub3Blbk1vZGFsc0F0VGhpc0xldmVsO1xuICB9XG5cbiAgZ2V0IF9hZnRlckFsbENsb3NlZCgpOiBTdWJqZWN0PHZvaWQ+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudE1vZGFsO1xuICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuX2FmdGVyQWxsQ2xvc2VkIDogdGhpcy5hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsO1xuICB9XG5cbiAgcmVhZG9ubHkgYWZ0ZXJBbGxDbG9zZTogT2JzZXJ2YWJsZTx2b2lkPiA9IGRlZmVyKCgpID0+XG4gICAgdGhpcy5vcGVuTW9kYWxzLmxlbmd0aCA/IHRoaXMuX2FmdGVyQWxsQ2xvc2VkIDogdGhpcy5fYWZ0ZXJBbGxDbG9zZWQucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSlcbiAgKSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByaXZhdGUgcGFyZW50TW9kYWw6IE56TW9kYWxTZXJ2aWNlXG4gICkge31cblxuICBjcmVhdGU8VCwgUiA9IE56U2FmZUFueT4oY29uZmlnOiBNb2RhbE9wdGlvbnM8VCwgUj4pOiBOek1vZGFsUmVmPFQsIFI+IHtcbiAgICByZXR1cm4gdGhpcy5vcGVuPFQsIFI+KGNvbmZpZy5uekNvbnRlbnQgYXMgQ29tcG9uZW50VHlwZTxUPiwgY29uZmlnKTtcbiAgfVxuXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNb2RhbHModGhpcy5vcGVuTW9kYWxzKTtcbiAgfVxuXG4gIGNvbmZpcm08VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30sIGNvbmZpcm1UeXBlOiBDb25maXJtVHlwZSA9ICdjb25maXJtJyk6IE56TW9kYWxSZWY8VD4ge1xuICAgIGlmICgnbnpGb290ZXInIGluIG9wdGlvbnMpIHtcbiAgICAgIHdhcm4oYFRoZSBDb25maXJtLU1vZGFsIGRvZXNuJ3Qgc3VwcG9ydCBcIm56Rm9vdGVyXCIsIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLmApO1xuICAgIH1cbiAgICBpZiAoISgnbnpXaWR0aCcgaW4gb3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMubnpXaWR0aCA9IDQxNjtcbiAgICB9XG4gICAgaWYgKCEoJ256TWFza0Nsb3NhYmxlJyBpbiBvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5uek1hc2tDbG9zYWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9wdGlvbnMubnpNb2RhbFR5cGUgPSAnY29uZmlybSc7XG4gICAgb3B0aW9ucy5uekNsYXNzTmFtZSA9IGBhbnQtbW9kYWwtY29uZmlybSBhbnQtbW9kYWwtY29uZmlybS0ke2NvbmZpcm1UeXBlfSAke29wdGlvbnMubnpDbGFzc05hbWUgfHwgJyd9YDtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUob3B0aW9ucyk7XG4gIH1cblxuICBpbmZvPFQ+KG9wdGlvbnM6IE1vZGFsT3B0aW9uczxUPiA9IHt9KTogTnpNb2RhbFJlZjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlybUZhY3Rvcnkob3B0aW9ucywgJ2luZm8nKTtcbiAgfVxuXG4gIHN1Y2Nlc3M8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnc3VjY2VzcycpO1xuICB9XG5cbiAgZXJyb3I8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnZXJyb3InKTtcbiAgfVxuXG4gIHdhcm5pbmc8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnd2FybmluZycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuPFQsIFI+KGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbnRlbnRUeXBlPFQ+LCBjb25maWc/OiBNb2RhbE9wdGlvbnMpOiBOek1vZGFsUmVmPFQsIFI+IHtcbiAgICBjb25zdCBjb25maWdNZXJnZWQgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKGNvbmZpZyB8fCB7fSwgbmV3IE1vZGFsT3B0aW9ucygpKTtcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KGNvbmZpZ01lcmdlZCk7XG4gICAgY29uc3QgbW9kYWxDb250YWluZXIgPSB0aGlzLmF0dGFjaE1vZGFsQ29udGFpbmVyKG92ZXJsYXlSZWYsIGNvbmZpZ01lcmdlZCk7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmF0dGFjaE1vZGFsQ29udGVudDxULCBSPihjb21wb25lbnRPclRlbXBsYXRlUmVmLCBtb2RhbENvbnRhaW5lciwgb3ZlcmxheVJlZiwgY29uZmlnTWVyZ2VkKTtcbiAgICBtb2RhbENvbnRhaW5lci5tb2RhbFJlZiA9IG1vZGFsUmVmO1xuXG4gICAgdGhpcy5vcGVuTW9kYWxzLnB1c2gobW9kYWxSZWYpO1xuICAgIG1vZGFsUmVmLmFmdGVyQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVtb3ZlT3Blbk1vZGFsKG1vZGFsUmVmKSk7XG5cbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU9wZW5Nb2RhbChtb2RhbFJlZjogTnpNb2RhbFJlZik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuTW9kYWxzLmluZGV4T2YobW9kYWxSZWYpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm9wZW5Nb2RhbHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgaWYgKCF0aGlzLm9wZW5Nb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTW9kYWxzKGRpYWxvZ3M6IE56TW9kYWxSZWZbXSk6IHZvaWQge1xuICAgIGxldCBpID0gZGlhbG9ncy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgZGlhbG9nc1tpXS5jbG9zZSgpO1xuICAgICAgaWYgKCF0aGlzLm9wZW5Nb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoY29uZmlnOiBNb2RhbE9wdGlvbnMpOiBPdmVybGF5UmVmIHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSB8fCB7fTtcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLFxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogZ2V0VmFsdWVXaXRoQ29uZmlnKGNvbmZpZy5uekNsb3NlT25OYXZpZ2F0aW9uLCBnbG9iYWxDb25maWcubnpDbG9zZU9uTmF2aWdhdGlvbiwgdHJ1ZSlcbiAgICB9KTtcblxuICAgIGlmIChnZXRWYWx1ZVdpdGhDb25maWcoY29uZmlnLm56TWFzaywgZ2xvYmFsQ29uZmlnLm56TWFzaywgdHJ1ZSkpIHtcbiAgICAgIG92ZXJsYXlDb25maWcuYmFja2Ryb3BDbGFzcyA9IE1PREFMX01BU0tfQ0xBU1NfTkFNRTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoTW9kYWxDb250YWluZXIob3ZlcmxheVJlZjogT3ZlcmxheVJlZiwgY29uZmlnOiBNb2RhbE9wdGlvbnMpOiBCYXNlTW9kYWxDb250YWluZXIge1xuICAgIGNvbnN0IHVzZXJJbmplY3RvciA9IGNvbmZpZyAmJiBjb25maWcubnpWaWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy5uelZpZXdDb250YWluZXJSZWYuaW5qZWN0b3I7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IoXG4gICAgICB1c2VySW5qZWN0b3IgfHwgdGhpcy5pbmplY3RvcixcbiAgICAgIG5ldyBXZWFrTWFwPE56U2FmZUFueSwgTnpTYWZlQW55PihbXG4gICAgICAgIFtPdmVybGF5UmVmLCBvdmVybGF5UmVmXSxcbiAgICAgICAgW01vZGFsT3B0aW9ucywgY29uZmlnXVxuICAgICAgXSlcbiAgICApO1xuXG4gICAgY29uc3QgQ29udGFpbmVyQ29tcG9uZW50ID1cbiAgICAgIGNvbmZpZy5uek1vZGFsVHlwZSA9PT0gJ2NvbmZpcm0nXG4gICAgICAgID8gLy8gSWYgdGhlIG1vZGUgaXMgYGNvbmZpcm1gLCB1c2UgYE56TW9kYWxDb25maXJtQ29udGFpbmVyQ29tcG9uZW50YFxuICAgICAgICAgIE56TW9kYWxDb25maXJtQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICAgIDogLy8gSWYgdGhlIG1vZGUgaXMgbm90IGBjb25maXJtYCwgdXNlIGBOek1vZGFsQ29udGFpbmVyQ29tcG9uZW50YFxuICAgICAgICAgIE56TW9kYWxDb250YWluZXJDb21wb25lbnQ7XG5cbiAgICBjb25zdCBjb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsPEJhc2VNb2RhbENvbnRhaW5lcj4oQ29udGFpbmVyQ29tcG9uZW50LCBjb25maWcubnpWaWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7XG4gICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheVJlZi5hdHRhY2g8QmFzZU1vZGFsQ29udGFpbmVyPihjb250YWluZXJQb3J0YWwpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lclJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoTW9kYWxDb250ZW50PFQsIFI+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbnRlbnRUeXBlPFQ+LFxuICAgIG1vZGFsQ29udGFpbmVyOiBCYXNlTW9kYWxDb250YWluZXIsXG4gICAgb3ZlcmxheVJlZjogT3ZlcmxheVJlZixcbiAgICBjb25maWc6IE1vZGFsT3B0aW9uczxUPlxuICApOiBOek1vZGFsUmVmPFQsIFI+IHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IG5ldyBOek1vZGFsUmVmPFQsIFI+KG92ZXJsYXlSZWYsIGNvbmZpZywgbW9kYWxDb250YWluZXIpO1xuXG4gICAgaWYgKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgbW9kYWxDb250YWluZXIuYXR0YWNoVGVtcGxhdGVQb3J0YWwoXG4gICAgICAgIG5ldyBUZW1wbGF0ZVBvcnRhbDxUPihjb21wb25lbnRPclRlbXBsYXRlUmVmLCBudWxsISwgeyAkaW1wbGljaXQ6IGNvbmZpZy5uekNvbXBvbmVudFBhcmFtcywgbW9kYWxSZWYgfSBhcyBOelNhZmVBbnkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNOb3ROaWwoY29tcG9uZW50T3JUZW1wbGF0ZVJlZikgJiYgdHlwZW9mIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuY3JlYXRlSW5qZWN0b3I8VCwgUj4obW9kYWxSZWYsIGNvbmZpZyk7XG4gICAgICBjb25zdCBjb250ZW50UmVmID0gbW9kYWxDb250YWluZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KFxuICAgICAgICBuZXcgQ29tcG9uZW50UG9ydGFsKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIGNvbmZpZy5uelZpZXdDb250YWluZXJSZWYsIGluamVjdG9yKVxuICAgICAgKTtcbiAgICAgIHNldENvbnRlbnRJbnN0YW5jZVBhcmFtczxUPihjb250ZW50UmVmLmluc3RhbmNlLCBjb25maWcubnpDb21wb25lbnRQYXJhbXMpO1xuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluamVjdG9yPFQsIFI+KG1vZGFsUmVmOiBOek1vZGFsUmVmPFQsIFI+LCBjb25maWc6IE1vZGFsT3B0aW9uczxUPik6IFBvcnRhbEluamVjdG9yIHtcbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPSBjb25maWcgJiYgY29uZmlnLm56Vmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcubnpWaWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xuICAgIGNvbnN0IGluamVjdGlvblRva2VucyA9IG5ldyBXZWFrTWFwPE56U2FmZUFueSwgTnpTYWZlQW55PihbW056TW9kYWxSZWYsIG1vZGFsUmVmXV0pO1xuXG4gICAgcmV0dXJuIG5ldyBQb3J0YWxJbmplY3Rvcih1c2VySW5qZWN0b3IgfHwgdGhpcy5pbmplY3RvciwgaW5qZWN0aW9uVG9rZW5zKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlybUZhY3Rvcnk8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30sIGNvbmZpcm1UeXBlOiBDb25maXJtVHlwZSk6IE56TW9kYWxSZWY8VD4ge1xuICAgIGNvbnN0IGljb25NYXA6IEluZGV4YWJsZU9iamVjdCA9IHtcbiAgICAgIGluZm86ICdpbmZvLWNpcmNsZScsXG4gICAgICBzdWNjZXNzOiAnY2hlY2stY2lyY2xlJyxcbiAgICAgIGVycm9yOiAnY2xvc2UtY2lyY2xlJyxcbiAgICAgIHdhcm5pbmc6ICdleGNsYW1hdGlvbi1jaXJjbGUnXG4gICAgfTtcbiAgICBpZiAoISgnbnpJY29uVHlwZScgaW4gb3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMubnpJY29uVHlwZSA9IGljb25NYXBbY29uZmlybVR5cGVdO1xuICAgIH1cbiAgICBpZiAoISgnbnpDYW5jZWxUZXh0JyBpbiBvcHRpb25zKSkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBDYW5jZWwgYnV0dG9uIGlmIHRoZSB1c2VyIG5vdCBzcGVjaWZ5IGEgQ2FuY2VsIGJ1dHRvblxuICAgICAgb3B0aW9ucy5uekNhbmNlbFRleHQgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maXJtKG9wdGlvbnMsIGNvbmZpcm1UeXBlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNb2RhbHModGhpcy5vcGVuTW9kYWxzQXRUaGlzTGV2ZWwpO1xuICAgIHRoaXMuYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=