UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

274 lines 24.8 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) */ export class NbWindowService { /** * @param {?} componentFactoryResolver * @param {?} overlayService * @param {?} overlayPositionBuilder * @param {?} blockScrollStrategy * @param {?} defaultWindowsConfig * @param {?} cfr */ constructor(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 * */ /** * @param {?} windowContent * @param {?=} windowConfig * @return {?} */ open(windowContent, windowConfig = {}) { if (this.windowsContainerViewRef == null) { this.createWindowsContainer(); } /** @type {?} */ const config = new NbWindowConfig(this.defaultWindowsConfig, windowConfig); /** @type {?} */ const windowRef = new NbWindowRef(config); windowRef.componentRef = this.appendWindow(windowContent, config, windowRef); this.openWindows.push(windowRef); this.subscribeToEvents(windowRef); return windowRef; } /** * @protected * @return {?} */ createWindowsContainer() { this.overlayRef = this.overlayService.create({ scrollStrategy: this.overlayService.scrollStrategies.noop(), positionStrategy: this.overlayPositionBuilder.global().bottom().right(), hasBackdrop: true, }); /** @type {?} */ const windowsContainerPortal = new NbComponentPortal(NbWindowsContainerComponent, null, null, this.cfr); /** @type {?} */ const overlayRef = this.overlayRef.attach(windowsContainerPortal); this.windowsContainerViewRef = overlayRef.instance.viewContainerRef; } /** * @protected * @param {?} content * @param {?} config * @param {?} windowRef * @return {?} */ appendWindow(content, config, windowRef) { /** @type {?} */ const context = content instanceof TemplateRef ? { $implicit: config.context, windowRef } : config.context; /** @type {?} */ const providers = [ { provide: NB_WINDOW_CONTENT, useValue: content }, { provide: NB_WINDOW_CONTEXT, useValue: context }, { provide: NbWindowConfig, useValue: config }, { provide: NbWindowRef, useValue: windowRef }, ]; /** @type {?} */ const parentInjector = config.viewContainerRef ? config.viewContainerRef.injector : this.windowsContainerViewRef.injector; /** @type {?} */ const injector = Injector.create({ parent: parentInjector, providers }); /** @type {?} */ const windowFactory = this.componentFactoryResolver.resolveComponentFactory(NbWindowComponent); /** @type {?} */ const ref = this.windowsContainerViewRef.createComponent(windowFactory, null, injector); ref.instance.cfr = this.cfr; ref.changeDetectorRef.detectChanges(); return ref; } /** * @protected * @param {?} windowRef * @return {?} */ subscribeToEvents(windowRef) { if (windowRef.config.closeOnBackdropClick) { this.overlayRef.backdropClick().subscribe(() => windowRef.close()); } if (windowRef.config.closeOnEsc) { this.overlayRef.keydownEvents() .pipe(filter((event) => event.keyCode === 27)) .subscribe(() => windowRef.close()); } windowRef.stateChange.subscribe(() => this.checkAndUpdateOverlay()); windowRef.onClose.subscribe(() => { this.openWindows.splice(this.openWindows.indexOf(windowRef), 1); this.checkAndUpdateOverlay(); }); } /** * @protected * @return {?} */ checkAndUpdateOverlay() { /** @type {?} */ const fullScreenWindows = this.openWindows.filter(w => w.state === NbWindowState.FULL_SCREEN); if (fullScreenWindows.length > 0) { this.blockScrollStrategy.enable(); } else { this.blockScrollStrategy.disable(); } if (fullScreenWindows.some(w => w.config.hasBackdrop)) { this.overlayRef.backdropElement.removeAttribute('hidden'); } else { this.overlayRef.backdropElement.setAttribute('hidden', ''); } } } NbWindowService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbWindowService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: NbOverlayService }, { type: NbOverlayPositionBuilder }, { type: NbBlockScrollStrategyAdapter }, { type: NbWindowConfig, decorators: [{ type: Inject, args: [NB_WINDOW_CONFIG,] }] }, { type: ComponentFactoryResolver } ]; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy93aW5kb3cvd2luZG93LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCx3QkFBd0IsRUFFeEIsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsV0FBVyxHQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLHdCQUF3QixFQUV4QixnQkFBZ0IsR0FDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBFdkQsTUFBTSxPQUFPLGVBQWU7Ozs7Ozs7OztJQU0xQixZQUNZLHdCQUFrRCxFQUNsRCxjQUFnQyxFQUNoQyxzQkFBZ0QsRUFDaEQsbUJBQWlELEVBQ2Qsb0JBQW9DLEVBQ3ZFLEdBQTZCO1FBTDdCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBQ2hDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBMEI7UUFDaEQsd0JB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QUFhLENBQUMsV0FBVyxDQUFDO1FBQzdGLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNwQztRQUVELElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDOzs7WUE5R0YsVUFBVTs7OztZQW5HVCx3QkFBd0I7WUFjeEIsZ0JBQWdCO1lBRmhCLHdCQUF3QjtZQUlqQiw0QkFBNEI7WUFLbkMsY0FBYyx1QkEwRlgsTUFBTSxTQUFDLGdCQUFnQjtZQS9HMUIsd0JBQXdCOzs7Ozs7O0lBc0d4QixxQ0FBbUM7Ozs7O0lBQ25DLGtEQUFvRDs7Ozs7SUFDcEQsc0NBQTBDOzs7OztJQUd4QyxtREFBNEQ7Ozs7O0lBQzVELHlDQUEwQzs7Ozs7SUFDMUMsaURBQTBEOzs7OztJQUMxRCw4Q0FBMkQ7Ozs7O0lBQzNELCtDQUFpRjs7Ozs7SUFDakYsOEJBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBOYkNvbXBvbmVudFBvcnRhbCxcclxuICBOYkNvbXBvbmVudFR5cGUsXHJcbiAgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgTmJCbG9ja1Njcm9sbFN0cmF0ZWd5QWRhcHRlciB9IGZyb20gJy4uL2Nkay9hZGFwdGVyL2Jsb2NrLXNjcm9sbC1zdHJhdGVneS1hZGFwdGVyJztcclxuaW1wb3J0IHtcclxuICBOQl9XSU5ET1dfQ09ORklHLFxyXG4gIE5CX1dJTkRPV19DT05URU5ULFxyXG4gIE5CX1dJTkRPV19DT05URVhULFxyXG4gIE5iV2luZG93Q29uZmlnLFxyXG4gIE5iV2luZG93U3RhdGUsXHJcbn0gZnJvbSAnLi93aW5kb3cub3B0aW9ucyc7XHJcbmltcG9ydCB7IE5iV2luZG93UmVmIH0gZnJvbSAnLi93aW5kb3ctcmVmJztcclxuaW1wb3J0IHsgTmJXaW5kb3dzQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi93aW5kb3dzLWNvbnRhaW5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYldpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vd2luZG93LmNvbXBvbmVudCc7XHJcblxyXG4vKlxyXG4gKiBUaGUgYE5iV2luZG93U2VydmljZWAgY2FuIGJlIHVzZWQgdG8gb3BlbiB3aW5kb3dzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB3aW5kb3cvd2luZG93LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iV2luZG93TW9kdWxlYCB0byB5b3VyIGFwcCBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYldpbmRvd01vZHVsZS5mb3JSb290KGNvbmZpZyksXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqXHJcbiAqIElmIHlvdSBhcmUgdXNpbmcgaXQgaW4gYSBsYXp5IGxvYWRlZCBtb2R1bGUgdGhhbiB5b3UgaGF2ZSB0byBpbnN0YWxsIGBOYldpbmRvd01vZHVsZS5mb3JDaGlsZGA6XHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYldpbmRvd01vZHVsZS5mb3JDaGlsZChjb25maWcpLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBMYXp5TG9hZGVkTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEEgbmV3IHdpbmRvdyBjYW4gYmUgb3BlbmVkIGJ5IGNhbGxpbmcgdGhlIGBvcGVuYCBtZXRob2Qgd2l0aCBhIGNvbXBvbmVudCBvciB0ZW1wbGF0ZSB0byBiZSBsb2FkZWRcclxuICogYW5kIGFuIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXHJcbiAqIGBvcGVuYCBtZXRob2Qgd2lsbCByZXR1cm4gYE5iV2luZG93UmVmYCB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgZnVydGhlciBtYW5pcHVsYXRpb25zLlxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCB3aW5kb3dSZWYgPSB0aGlzLndpbmRvd1NlcnZpY2Uub3BlbihNeUNvbXBvbmVudCwgeyAuLi4gfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBgTmJXaW5kb3dSZWZgIGdpdmVzIHlvdSBhYmlsaXR5IG1hbmlwdWxhdGUgb3BlbmVkIHdpbmRvdy5cclxuICogQWxzbywgeW91IGNhbiBpbmplY3QgYE5iV2luZG93UmVmYCBpbnNpZGUgcHJvdmlkZWQgY29tcG9uZW50IHdoaWNoIHJlbmRlcmVkIGluIHdpbmRvdy5cclxuICpcclxuICogYGBgdHNcclxuICogdGhpcy53aW5kb3dTZXJ2aWNlLm9wZW4oTXlXaW5kb3dDb21wb25lbnQsIHsgLi4uIH0pO1xyXG4gKlxyXG4gKiAvLyBteS5jb21wb25lbnQudHNcclxuICogY29uc3RydWN0b3IocHJvdGVjdGVkIHdpbmRvd1JlZjogTmJXaW5kb3dSZWYpIHtcclxuICogfVxyXG4gKlxyXG4gKiBtaW5pbWl6ZSgpIHtcclxuICogICB0aGlzLndpbmRvd1JlZi5taW5pbWl6ZSgpO1xyXG4gKiB9XHJcbiAqXHJcbiAqIGNsb3NlKCkge1xyXG4gKiAgIHRoaXMud2luZG93UmVmLmNsb3NlKCk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgY29tcG9uZW50IHlvdSBjYW4gY3JlYXRlIHdpbmRvdyBmcm9tIFRlbXBsYXRlUmVmLiBBcyB1c3VhbCB5b3UgY2FuIGFjY2VzcyBjb250ZXh0IHByb3ZpZGVkIHZpYSBjb25maWdcclxuICogdmlhIGBsZXQtYCB2YXJpYWJsZXMuIEFsc28geW91IGNhbiBnZXQgcmVmZXJlbmNlIHRvIHRoZSBgTmJXaW5kb3dSZWZgIGluIGNvbnRleHQncyBgd2luZG93UmVmYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShXaW5kb3cgY29udGVudCBmcm9tIFRlbXBsYXRlUmVmLCB3aW5kb3cvdGVtcGxhdGUtd2luZG93LmNvbXBvbmVudClcclxuICpcclxuICogIyMjIENvbmZpZ3VyYXRpb25cclxuICpcclxuICogQXMgbWVudGlvbmVkIGFib3ZlLCBgb3BlbmAgbWV0aG9kIG9mIHRoZSBgTmJXaW5kb3dTZXJ2aWNlYCBtYXkgcmVjZWl2ZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcbiAqIEFsc28sIHlvdSBjYW4gbW9kaWZ5IGRlZmF1bHQgd2luZG93cyBjb25maWd1cmF0aW9uIHRocm91Z2ggYE5iV2luZG93TW9kdWxlLmZvclJvb3QoeyAuLi4gfSlgLlxyXG4gKiBZb3UgY2FuIHJlYWQgYWJvdXQgYWxsIGF2YWlsYWJsZSBvcHRpb25zIG9uIFtBUEkgdGFiXShkb2NzL2NvbXBvbmVudHMvd2luZG93L2FwaSNuYndpbmRvd2NvbmZpZykuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQ29uZmlndXJhdGlvbiwgd2luZG93L3dpbmRvd3MtYmFja2Ryb3AuY29tcG9uZW50KVxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJXaW5kb3dTZXJ2aWNlIHtcclxuXHJcbiAgcHJvdGVjdGVkIG92ZXJsYXlSZWY6IE5iT3ZlcmxheVJlZjtcclxuICBwcm90ZWN0ZWQgd2luZG93c0NvbnRhaW5lclZpZXdSZWY6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgcHJvdGVjdGVkIG9wZW5XaW5kb3dzOiBOYldpbmRvd1JlZltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlQb3NpdGlvbkJ1aWxkZXI6IE5iT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcclxuICAgIHByb3RlY3RlZCBibG9ja1Njcm9sbFN0cmF0ZWd5OiBOYkJsb2NrU2Nyb2xsU3RyYXRlZ3lBZGFwdGVyLFxyXG4gICAgQEluamVjdChOQl9XSU5ET1dfQ09ORklHKSBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFdpbmRvd3NDb25maWc6IE5iV2luZG93Q29uZmlnLFxyXG4gICAgcHJvdGVjdGVkIGNmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBPcGVucyBuZXcgd2luZG93LlxyXG4gICAqIEBwYXJhbSB3aW5kb3dDb250ZW50XHJcbiAgICogQHBhcmFtIHdpbmRvd0NvbmZpZ1xyXG4gICAqICovXHJcbiAgb3BlbihcclxuICAgIHdpbmRvd0NvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT4gfCBOYkNvbXBvbmVudFR5cGUsXHJcbiAgICB3aW5kb3dDb25maWc6IFBhcnRpYWw8TmJXaW5kb3dDb25maWc+ID0ge30sXHJcbiAgKTogTmJXaW5kb3dSZWYge1xyXG4gICAgaWYgKHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmNyZWF0ZVdpbmRvd3NDb250YWluZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb25maWcgPSBuZXcgTmJXaW5kb3dDb25maWcodGhpcy5kZWZhdWx0V2luZG93c0NvbmZpZywgd2luZG93Q29uZmlnKTtcclxuICAgIGNvbnN0IHdpbmRvd1JlZiA9IG5ldyBOYldpbmRvd1JlZihjb25maWcpO1xyXG4gICAgd2luZG93UmVmLmNvbXBvbmVudFJlZiA9IHRoaXMuYXBwZW5kV2luZG93KHdpbmRvd0NvbnRlbnQsIGNvbmZpZywgd2luZG93UmVmKTtcclxuXHJcbiAgICB0aGlzLm9wZW5XaW5kb3dzLnB1c2god2luZG93UmVmKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlVG9FdmVudHMod2luZG93UmVmKTtcclxuXHJcbiAgICByZXR1cm4gd2luZG93UmVmO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVdpbmRvd3NDb250YWluZXIoKSB7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlTZXJ2aWNlLnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIuZ2xvYmFsKCkuYm90dG9tKCkucmlnaHQoKSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHdpbmRvd3NDb250YWluZXJQb3J0YWwgPSBuZXcgTmJDb21wb25lbnRQb3J0YWwoTmJXaW5kb3dzQ29udGFpbmVyQ29tcG9uZW50LCBudWxsLCBudWxsLCB0aGlzLmNmcik7XHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5UmVmLmF0dGFjaCh3aW5kb3dzQ29udGFpbmVyUG9ydGFsKTtcclxuICAgIHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYgPSBvdmVybGF5UmVmLmluc3RhbmNlLnZpZXdDb250YWluZXJSZWY7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwZW5kV2luZG93KFxyXG4gICAgY29udGVudDogVGVtcGxhdGVSZWY8YW55PiB8IE5iQ29tcG9uZW50VHlwZSxcclxuICAgIGNvbmZpZzogTmJXaW5kb3dDb25maWcsXHJcbiAgICB3aW5kb3dSZWY6IE5iV2luZG93UmVmLFxyXG4gICk6IENvbXBvbmVudFJlZjxOYldpbmRvd0NvbXBvbmVudD4ge1xyXG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZlxyXG4gICAgICA/IHsgJGltcGxpY2l0OiBjb25maWcuY29udGV4dCwgd2luZG93UmVmIH1cclxuICAgICAgOiBjb25maWcuY29udGV4dDtcclxuXHJcbiAgICBjb25zdCBwcm92aWRlcnMgPSBbXHJcbiAgICAgIHsgcHJvdmlkZTogTkJfV0lORE9XX0NPTlRFTlQsIHVzZVZhbHVlOiBjb250ZW50IH0sXHJcbiAgICAgIHsgcHJvdmlkZTogTkJfV0lORE9XX0NPTlRFWFQsIHVzZVZhbHVlOiBjb250ZXh0IH0sXHJcbiAgICAgIHsgcHJvdmlkZTogTmJXaW5kb3dDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfSxcclxuICAgICAgeyBwcm92aWRlOiBOYldpbmRvd1JlZiwgdXNlVmFsdWU6IHdpbmRvd1JlZiB9LFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHBhcmVudEluamVjdG9yID0gY29uZmlnLnZpZXdDb250YWluZXJSZWZcclxuICAgICAgPyBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvclxyXG4gICAgICA6IHRoaXMud2luZG93c0NvbnRhaW5lclZpZXdSZWYuaW5qZWN0b3I7XHJcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7IHBhcmVudDogcGFyZW50SW5qZWN0b3IsIHByb3ZpZGVycyB9KTtcclxuICAgIGNvbnN0IHdpbmRvd0ZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShOYldpbmRvd0NvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgcmVmID0gdGhpcy53aW5kb3dzQ29udGFpbmVyVmlld1JlZi5jcmVhdGVDb21wb25lbnQod2luZG93RmFjdG9yeSwgbnVsbCwgaW5qZWN0b3IpO1xyXG4gICAgcmVmLmluc3RhbmNlLmNmciA9IHRoaXMuY2ZyO1xyXG4gICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHJldHVybiByZWZcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVUb0V2ZW50cyh3aW5kb3dSZWY6IE5iV2luZG93UmVmKSB7XHJcbiAgICBpZiAod2luZG93UmVmLmNvbmZpZy5jbG9zZU9uQmFja2Ryb3BDbGljaykge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB3aW5kb3dSZWYuY2xvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvd1JlZi5jb25maWcuY2xvc2VPbkVzYykge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpXHJcbiAgICAgICAgLnBpcGUoZmlsdGVyKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gZXZlbnQua2V5Q29kZSA9PT0gMjcpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gd2luZG93UmVmLmNsb3NlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvd1JlZi5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0FuZFVwZGF0ZU92ZXJsYXkoKSk7XHJcblxyXG4gICAgd2luZG93UmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5vcGVuV2luZG93cy5zcGxpY2UodGhpcy5vcGVuV2luZG93cy5pbmRleE9mKHdpbmRvd1JlZiksIDEpO1xyXG4gICAgICB0aGlzLmNoZWNrQW5kVXBkYXRlT3ZlcmxheSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hlY2tBbmRVcGRhdGVPdmVybGF5KCkge1xyXG4gICAgY29uc3QgZnVsbFNjcmVlbldpbmRvd3MgPSB0aGlzLm9wZW5XaW5kb3dzLmZpbHRlcih3ID0+IHcuc3RhdGUgPT09IE5iV2luZG93U3RhdGUuRlVMTF9TQ1JFRU4pO1xyXG4gICAgaWYgKGZ1bGxTY3JlZW5XaW5kb3dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5ibG9ja1Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ibG9ja1Njcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZnVsbFNjcmVlbldpbmRvd3Muc29tZSh3ID0+IHcuY29uZmlnLmhhc0JhY2tkcm9wKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=