theme-lib
Version:
This is a simple example Angular Library published to npm.
305 lines • 26 kB
JavaScript
/**
* @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=