UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

305 lines 26 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ComponentFactoryResolver, Inject, Injectable, Injector, TemplateRef, } from '@angular/core'; import { filter } from 'rxjs/operators'; import { NbComponentPortal, NbOverlayPositionBuilder, NbOverlayService, } from '../cdk/overlay'; import { NbBlockScrollStrategyAdapter } from '../cdk/adapter/block-scroll-strategy-adapter'; import { NB_WINDOW_CONFIG, NB_WINDOW_CONTENT, NB_WINDOW_CONTEXT, NbWindowConfig, NbWindowState, } from './window.options'; import { NbWindowRef } from './window-ref'; import { NbWindowsContainerComponent } from './windows-container.component'; import { NbWindowComponent } from './window.component'; /* * The `NbWindowService` can be used to open windows. * * @stacked-example(Showcase, window/window-showcase.component) * * ### Installation * * Import `NbWindowModule` to your app module. * ```ts * @NgModule({ * imports: [ * // ... * NbWindowModule.forRoot(config), * ], * }) * export class AppModule { } * ``` * * If you are using it in a lazy loaded module than you have to install `NbWindowModule.forChild`: * ```ts * @NgModule({ * imports: [ * // ... * NbWindowModule.forChild(config), * ], * }) * export class LazyLoadedModule { } * ``` * * ### Usage * * A new window can be opened by calling the `open` method with a component or template to be loaded * and an optional configuration. * `open` method will return `NbWindowRef` that can be used for the further manipulations. * * ```ts * const windowRef = this.windowService.open(MyComponent, { ... }); * ``` * * `NbWindowRef` gives you ability manipulate opened window. * Also, you can inject `NbWindowRef` inside provided component which rendered in window. * * ```ts * this.windowService.open(MyWindowComponent, { ... }); * * // my.component.ts * constructor(protected windowRef: NbWindowRef) { * } * * minimize() { * this.windowRef.minimize(); * } * * close() { * this.windowRef.close(); * } * ``` * * Instead of component you can create window from TemplateRef. As usual you can access context provided via config * via `let-` variables. Also you can get reference to the `NbWindowRef` in context's `windowRef` property. * * @stacked-example(Window content from TemplateRef, window/template-window.component) * * ### Configuration * * As mentioned above, `open` method of the `NbWindowService` may receive optional configuration options. * Also, you can modify default windows configuration through `NbWindowModule.forRoot({ ... })`. * You can read about all available options on [API tab](docs/components/window/api#nbwindowconfig). * * @stacked-example(Configuration, window/windows-backdrop.component) */ var NbWindowService = /** @class */ (function () { function NbWindowService(componentFactoryResolver, overlayService, overlayPositionBuilder, blockScrollStrategy, defaultWindowsConfig, cfr) { this.componentFactoryResolver = componentFactoryResolver; this.overlayService = overlayService; this.overlayPositionBuilder = overlayPositionBuilder; this.blockScrollStrategy = blockScrollStrategy; this.defaultWindowsConfig = defaultWindowsConfig; this.cfr = cfr; this.openWindows = []; } /* * Opens new window. * @param windowContent * @param windowConfig * */ /* * Opens new window. * @param windowContent * @param windowConfig * */ /** * @param {?} windowContent * @param {?=} windowConfig * @return {?} */ NbWindowService.prototype.open = /* * Opens new window. * @param windowContent * @param windowConfig * */ /** * @param {?} windowContent * @param {?=} windowConfig * @return {?} */ function (windowContent, windowConfig) { if (windowConfig === void 0) { windowConfig = {}; } if (this.windowsContainerViewRef == null) { this.createWindowsContainer(); } /** @type {?} */ var config = new NbWindowConfig(this.defaultWindowsConfig, windowConfig); /** @type {?} */ var windowRef = new NbWindowRef(config); windowRef.componentRef = this.appendWindow(windowContent, config, windowRef); this.openWindows.push(windowRef); this.subscribeToEvents(windowRef); return windowRef; }; /** * @protected * @return {?} */ NbWindowService.prototype.createWindowsContainer = /** * @protected * @return {?} */ function () { this.overlayRef = this.overlayService.create({ scrollStrategy: this.overlayService.scrollStrategies.noop(), positionStrategy: this.overlayPositionBuilder.global().bottom().right(), hasBackdrop: true, }); /** @type {?} */ var windowsContainerPortal = new NbComponentPortal(NbWindowsContainerComponent, null, null, this.cfr); /** @type {?} */ var overlayRef = this.overlayRef.attach(windowsContainerPortal); this.windowsContainerViewRef = overlayRef.instance.viewContainerRef; }; /** * @protected * @param {?} content * @param {?} config * @param {?} windowRef * @return {?} */ NbWindowService.prototype.appendWindow = /** * @protected * @param {?} content * @param {?} config * @param {?} windowRef * @return {?} */ function (content, config, windowRef) { /** @type {?} */ var context = content instanceof TemplateRef ? { $implicit: config.context, windowRef: windowRef } : config.context; /** @type {?} */ var providers = [ { provide: NB_WINDOW_CONTENT, useValue: content }, { provide: NB_WINDOW_CONTEXT, useValue: context }, { provide: NbWindowConfig, useValue: config }, { provide: NbWindowRef, useValue: windowRef }, ]; /** @type {?} */ var parentInjector = config.viewContainerRef ? config.viewContainerRef.injector : this.windowsContainerViewRef.injector; /** @type {?} */ var injector = Injector.create({ parent: parentInjector, providers: providers }); /** @type {?} */ var windowFactory = this.componentFactoryResolver.resolveComponentFactory(NbWindowComponent); /** @type {?} */ var ref = this.windowsContainerViewRef.createComponent(windowFactory, null, injector); ref.instance.cfr = this.cfr; ref.changeDetectorRef.detectChanges(); return ref; }; /** * @protected * @param {?} windowRef * @return {?} */ NbWindowService.prototype.subscribeToEvents = /** * @protected * @param {?} windowRef * @return {?} */ function (windowRef) { var _this = this; if (windowRef.config.closeOnBackdropClick) { this.overlayRef.backdropClick().subscribe(function () { return windowRef.close(); }); } if (windowRef.config.closeOnEsc) { this.overlayRef.keydownEvents() .pipe(filter(function (event) { return event.keyCode === 27; })) .subscribe(function () { return windowRef.close(); }); } windowRef.stateChange.subscribe(function () { return _this.checkAndUpdateOverlay(); }); windowRef.onClose.subscribe(function () { _this.openWindows.splice(_this.openWindows.indexOf(windowRef), 1); _this.checkAndUpdateOverlay(); }); }; /** * @protected * @return {?} */ NbWindowService.prototype.checkAndUpdateOverlay = /** * @protected * @return {?} */ function () { /** @type {?} */ var fullScreenWindows = this.openWindows.filter(function (w) { return w.state === NbWindowState.FULL_SCREEN; }); if (fullScreenWindows.length > 0) { this.blockScrollStrategy.enable(); } else { this.blockScrollStrategy.disable(); } if (fullScreenWindows.some(function (w) { return w.config.hasBackdrop; })) { this.overlayRef.backdropElement.removeAttribute('hidden'); } else { this.overlayRef.backdropElement.setAttribute('hidden', ''); } }; NbWindowService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbWindowService.ctorParameters = function () { return [ { type: ComponentFactoryResolver }, { type: NbOverlayService }, { type: NbOverlayPositionBuilder }, { type: NbBlockScrollStrategyAdapter }, { type: NbWindowConfig, decorators: [{ type: Inject, args: [NB_WINDOW_CONFIG,] }] }, { type: ComponentFactoryResolver } ]; }; return NbWindowService; }()); export { NbWindowService }; if (false) { /** * @type {?} * @protected */ NbWindowService.prototype.overlayRef; /** * @type {?} * @protected */ NbWindowService.prototype.windowsContainerViewRef; /** * @type {?} * @protected */ NbWindowService.prototype.openWindows; /** * @type {?} * @protected */ NbWindowService.prototype.componentFactoryResolver; /** * @type {?} * @protected */ NbWindowService.prototype.overlayService; /** * @type {?} * @protected */ NbWindowService.prototype.overlayPositionBuilder; /** * @type {?} * @protected */ NbWindowService.prototype.blockScrollStrategy; /** * @type {?} * @protected */ NbWindowService.prototype.defaultWindowsConfig; /** * @type {?} * @protected */ NbWindowService.prototype.cfr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy93aW5kb3cvd2luZG93LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCx3QkFBd0IsRUFFeEIsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsV0FBVyxHQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLHdCQUF3QixFQUV4QixnQkFBZ0IsR0FDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlFdkQ7SUFPRSx5QkFDWSx3QkFBa0QsRUFDbEQsY0FBZ0MsRUFDaEMsc0JBQWdELEVBQ2hELG1CQUFpRCxFQUNkLG9CQUFvQyxFQUN2RSxHQUE2QjtRQUw3Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUNoQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQTBCO1FBQ2hELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBOEI7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YWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBOYkNvbXBvbmVudFBvcnRhbCxcclxuICBOYkNvbXBvbmVudFR5cGUsXHJcbiAgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgTmJCbG9ja1Njcm9sbFN0cmF0ZWd5QWRhcHRlciB9IGZyb20gJy4uL2Nkay9hZGFwdGVyL2Jsb2NrLXNjcm9sbC1zdHJhdGVneS1hZGFwdGVyJztcclxuaW1wb3J0IHtcclxuICBOQl9XSU5ET1dfQ09ORklHLFxyXG4gIE5CX1dJTkRPV19DT05URU5ULFxyXG4gIE5CX1dJTkRPV19DT05URVhULFxyXG4gIE5iV2luZG93Q29uZmlnLFxyXG4gIE5iV2luZG93U3RhdGUsXHJcbn0gZnJvbSAnLi93aW5kb3cub3B0aW9ucyc7XHJcbmltcG9ydCB7IE5iV2luZG93UmVmIH0gZnJvbSAnLi93aW5kb3ctcmVmJztcclxuaW1wb3J0IHsgTmJXaW5kb3dzQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi93aW5kb3dzLWNvbnRhaW5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYldpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vd2luZG93LmNvbXBvbmVudCc7XHJcblxyXG4vKlxyXG4gKiBUaGUgYE5iV2luZG93U2VydmljZWAgY2FuIGJlIHVzZWQgdG8gb3BlbiB3aW5kb3dzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB3aW5kb3cvd2luZG93LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iV2luZG93TW9kdWxlYCB0byB5b3VyIGFwcCBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYldpbmRvd01vZHVsZS5mb3JSb290KGNvbmZpZyksXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqXHJcbiAqIElmIHlvdSBhcmUgdXNpbmcgaXQgaW4gYSBsYXp5IGxvYWRlZCBtb2R1bGUgdGhhbiB5b3UgaGF2ZSB0byBpbnN0YWxsIGBOYldpbmRvd01vZHVsZS5mb3JDaGlsZGA6XHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYldpbmRvd01vZHVsZS5mb3JDaGlsZChjb25maWcpLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBMYXp5TG9hZGVkTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEEgbmV3IHdpbmRvdyBjYW4gYmUgb3BlbmVkIGJ5IGNhbGxpbmcgdGhlIGBvcGVuYCBtZXRob2Qgd2l0aCBhIGNvbXBvbmVudCBvciB0ZW1wbGF0ZSB0byBiZSBsb2FkZWRcclxuICogYW5kIGFuIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXHJcbiAqIGBvcGVuYCBtZXRob2Qgd2lsbCByZXR1cm4gYE5iV2luZG93UmVmYCB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgZnVydGhlciBtYW5pcHVsYXRpb25zLlxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB3aW5kb3dSZWYgPSB0aGlzLndpbmRvd1NlcnZpY2Uub3BlbihNeUNvbXBvbmVudCwgeyAuLi4gfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBgTmJXaW5kb3dSZWZgIGdpdmVzIHlvdSBhYmlsaXR5IG1hbmlwdWxhdGUgb3BlbmVkIHdpbmRvdy5cclxuICogQWxzbywgeW91IGNhbiBpbmplY3QgYE5iV2luZG93UmVmYCBpbnNpZGUgcHJvdmlkZWQgY29tcG9uZW50IHdoaWNoIHJlbmRlcmVkIGluIHdpbmRvdy5cclxuICpcclxuICogYGBgdHNcclxuICogdGhpcy53aW5kb3dTZXJ2aWNlLm9wZW4oTXlXaW5kb3dDb21wb25lbnQsIHsgLi4uIH0pO1xyXG4gKlxyXG4gKiAvLyBteS5jb21wb25lbnQudHNcclxuICogY29uc3RydWN0b3IocHJvdGVjdGVkIHdpbmRvd1JlZjogTmJXaW5kb3dSZWYpIHtcclxuICogfVxyXG4gKlxyXG4gKiBtaW5pbWl6ZSgpIHtcclxuICogICB0aGlzLndpbmRvd1JlZi5taW5pbWl6ZSgpO1xyXG4gKiB9XHJcbiAqXHJcbiAqIGNsb3NlKCkge1xyXG4gKiAgIHRoaXMud2luZG93UmVmLmNsb3NlKCk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgY29tcG9uZW50IHlvdSBjYW4gY3JlYXRlIHdpbmRvdyBmcm9tIFRlbXBsYXRlUmVmLiBBcyB1c3VhbCB5b3UgY2FuIGFjY2VzcyBjb250ZXh0IHByb3ZpZGVkIHZpYSBjb25maWdcclxuICogdmlhIGBsZXQtYCB2YXJpYWJsZXMuIEFsc28geW91IGNhbiBnZXQgcmVmZXJlbmNlIHRvIHRoZSBgTmJXaW5kb3dSZWZgIGluIGNvbnRleHQncyBgd2luZG93UmVmYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShXaW5kb3cgY29udGVudCBmcm9tIFRlbXBsYXRlUmVmLCB3aW5kb3cvdGVtcGxhdGUtd2luZG93LmNvbXBvbmVudClcclxuICpcclxuICogIyMjIENvbmZpZ3VyYXRpb25cclxuICpcclxuICogQXMgbWVudGlvbmVkIGFib3ZlLCBgb3BlbmAgbWV0aG9kIG9mIHRoZSBgTmJXaW5kb3dTZXJ2aWNlYCBtYXkgcmVjZWl2ZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcbiAqIEFsc28sIHlvdSBjYW4gbW9kaWZ5IGRlZmF1bHQgd2luZG93cyBjb25maWd1cmF0aW9uIHRocm91Z2ggYE5iV2luZG93TW9kdWxlLmZvclJvb3QoeyAuLi4gfSlgLlxyXG4gKiBZb3UgY2FuIHJlYWQgYWJvdXQgYWxsIGF2YWlsYWJsZSBvcHRpb25zIG9uIFtBUEkgdGFiXShkb2NzL2NvbXBvbmVudHMvd2luZG93L2FwaSNuYndpbmRvd2NvbmZpZykuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQ29uZmlndXJhdGlvbiwgd2luZG93L3dpbmRvd3MtYmFja2Ryb3AuY29tcG9uZW50KVxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJXaW5kb3dTZXJ2aWNlIHtcclxuXHJcbiAgcHJvdGVjdGVkIG92ZXJsYXlSZWY6IE5iT3ZlcmxheVJlZjtcclxuICBwcm90ZWN0ZWQgd2luZG93c0NvbnRhaW5lclZpZXdSZWY6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgcHJvdGVjdGVkIG9wZW5XaW5kb3dzOiBOYldpbmRvd1JlZltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlQb3NpdGlvbkJ1aWxkZXI6IE5iT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcclxuICAgIHByb3RlY3RlZCBibG9ja1Njcm9sbFN0cmF0ZWd5OiBOYkJsb2NrU2Nyb2xsU3RyYXRlZ3lBZGFwdGVyLFxyXG4gICAgQEluamVjdChOQl9XSU5ET1dfQ09ORklHKSBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFdpbmRvd3NDb25maWc6IE5iV2luZG93Q29uZmlnLFxyXG4gICAgcHJvdGVjdGVkIGNmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBPcGVucyBuZXcgd2luZG93LlxyXG4gICAqIEBwYXJhbSB3aW5kb3dDb250ZW50XHJcbiAgICogQHBhcmFtIHdpbmRvd0NvbmZpZ1xyXG4gICAqICovXHJcbiAgb3BlbihcclxuICAgIHdpbmRvd0NvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT4gfCBOYkNvbXBvbmVudFR5cGUsXHJcbiAgICB3aW5kb3dDb25maWc6IFBhcnRpYWw8TmJXaW5kb3dDb25maWc+ID0ge30sXHJcbiAgKTogTmJXaW5kb3dSZWYge1xyXG4gICAgaWYgKHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmNyZWF0ZVdpbmRvd3NDb250YWluZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb25maWcgPSBuZXcgTmJXaW5kb3dDb25maWcodGhpcy5kZWZhdWx0V2luZG93c0NvbmZpZywgd2luZG93Q29uZmlnKTtcclxuICAgIGNvbnN0IHdpbmRvd1JlZiA9IG5ldyBOYldpbmRvd1JlZihjb25maWcpO1xyXG4gICAgd2luZG93UmVmLmNvbXBvbmVudFJlZiA9IHRoaXMuYXBwZW5kV2luZG93KHdpbmRvd0NvbnRlbnQsIGNvbmZpZywgd2luZG93UmVmKTtcclxuXHJcbiAgICB0aGlzLm9wZW5XaW5kb3dzLnB1c2god2luZG93UmVmKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHMod2luZG93UmVmKTtcclxuXHJcbiAgICByZXR1cm4gd2luZG93UmVmO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVdpbmRvd3NDb250YWluZXIoKSB7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlTZXJ2aWNlLnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIuZ2xvYmFsKCkuYm90dG9tKCkucmlnaHQoKSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHdpbmRvd3NDb250YWluZXJQb3J0YWwgPSBuZXcgTmJDb21wb25lbnRQb3J0YWwoTmJXaW5kb3dzQ29udGFpbmVyQ29tcG9uZW50LCBudWxsLCBudWxsLCB0aGlzLmNmcik7XHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5UmVmLmF0dGFjaCh3aW5kb3dzQ29udGFpbmVyUG9ydGFsKTtcclxuICAgIHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYgPSBvdmVybGF5UmVmLmluc3RhbmNlLnZpZXdDb250YWluZXJSZWY7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwZW5kV2luZG93KFxyXG4gICAgY29udGVudDogVGVtcGxhdGVSZWY8YW55PiB8IE5iQ29tcG9uZW50VHlwZSxcclxuICAgIGNvbmZpZzogTmJXaW5kb3dDb25maWcsXHJcbiAgICB3aW5kb3dSZWY6IE5iV2luZG93UmVmLFxyXG4gICk6IENvbXBvbmVudFJlZjxOYldpbmRvd0NvbXBvbmVudD4ge1xyXG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZlxyXG4gICAgICA/IHsgJGltcGxpY2l0OiBjb25maWcuY29udGV4dCwgd2luZG93UmVmIH1cclxuICAgICAgOiBjb25maWcuY29udGV4dDtcclxuXHJcbiAgICBjb25zdCBwcm92aWRlcnMgPSBbXHJcbiAgICAgIHsgcHJvdmlkZTogTkJfV0lORE9XX0NPTlRFTlQsIHVzZVZhbHVlOiBjb250ZW50IH0sXHJcbiAgICAgIHsgcHJvdmlkZTogTkJfV0lORE9XX0NPTlRFWFQsIHVzZVZhbHVlOiBjb250ZXh0IH0sXHJcbiAgICAgIHsgcHJvdmlkZTogTmJXaW5kb3dDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfSxcclxuICAgICAgeyBwcm92aWRlOiBOYldpbmRvd1JlZiwgdXNlVmFsdWU6IHdpbmRvd1JlZiB9LFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHBhcmVudEluamVjdG9yID0gY29uZmlnLnZpZXdDb250YWluZXJSZWZcclxuICAgICAgPyBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvclxyXG4gICAgICA6IHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYuaW5qZWN0b3I7XHJcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7IHBhcmVudDogcGFyZW50SW5qZWN0b3IsIHByb3ZpZGVycyB9KTtcclxuICAgIGNvbnN0IHdpbmRvd0ZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShOYldpbmRvd0NvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgcmVmID0gdGhpcy53aW5kb3dzQ29udGFpbmVyVmlld1JlZi5jcmVhdGVDb21wb25lbnQod2luZG93RmFjdG9yeSwgbnVsbCwgaW5qZWN0b3IpO1xyXG4gICAgcmVmLmluc3RhbmNlLmNmciA9IHRoaXMuY2ZyO1xyXG4gICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiByZWZcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVUb0V2ZW50cyh3aW5kb3dSZWY6IE5iV2luZG93UmVmKSB7XHJcbiAgICBpZiAod2luZG93UmVmLmNvbmZpZy5jbG9zZU9uQmFja2Ryb3BDbGljaykge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB3aW5kb3dSZWYuY2xvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvd1JlZi5jb25maWcuY2xvc2VPbkVzYykge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpXHJcbiAgICAgICAgLnBpcGUoZmlsdGVyKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gZXZlbnQua2V5Q29kZSA9PT0gMjcpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gd2luZG93UmVmLmNsb3NlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvd1JlZi5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0FuZFVwZGF0ZU92ZXJsYXkoKSk7XHJcblxyXG4gICAgd2luZG93UmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5vcGVuV2luZG93cy5zcGxpY2UodGhpcy5vcGVuV2luZG93cy5pbmRleE9mKHdpbmRvd1JlZiksIDEpO1xyXG4gICAgICB0aGlzLmNoZWNrQW5kVXBkYXRlT3ZlcmxheSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hlY2tBbmRVcGRhdGVPdmVybGF5KCkge1xyXG4gICAgY29uc3QgZnVsbFNjcmVlbldpbmRvd3MgPSB0aGlzLm9wZW5XaW5kb3dzLmZpbHRlcih3ID0+IHcuc3RhdGUgPT09IE5iV2luZG93U3RhdGUuRlVMTF9TQ1JFRU4pO1xyXG4gICAgaWYgKGZ1bGxTY3JlZW5XaW5kb3dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5ibG9ja1Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ibG9ja1Njcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZnVsbFNjcmVlbldpbmRvd3Muc29tZSh3ID0+IHcuY29uZmlnLmhhc0JhY2tkcm9wKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=