UNPKG

@indice/ng-components

Version:

Indice common components for Angular v12

188 lines 25.6 kB
import { ElementRef, TemplateRef, Injector, } from '@angular/core'; import { Subject } from 'rxjs'; import { ContentRef } from './content-ref.class'; /** * Provides ways of loading and handling dynamic content. * * @remarks * Do NOT use this directly, create an instance through {@link ComponentLoaderFactory} * You can use this loader in two ways: * - Attaches a component to `ViewContainerRef`. * - Attaches a component to `ViewContainerRef`. The attached component has a `<ng-content>` tag inside its view. The {@link ComponentLoaderOptions.content} will be drawn inside this tag. * * @internal */ export class ComponentLoader { constructor(vcr, cfr, applicationRef, injector) { this.vcr = vcr; this.cfr = cfr; this.applicationRef = applicationRef; this.injector = injector; /** * Before content is shown event. */ this.onBeforeShow = new Subject(); /** * After show content event. * @returns The id of newly created component ref. */ this.onShown = new Subject(); /** * Before content is hidden event. * @returns The instance of attached component; */ this.onBeforeHide = new Subject(); /** * After content is hidden event. * @returns The id of destroyed component ref. */ this.onHidden = new Subject(); this.providers = []; this.containerDefaultSelector = 'body'; } /** * Attaches component. * @param componentType - The type component to attach. * @returns Current instance of {@link ComponentLoader} */ attach(componentType) { this.componentFactory = this.cfr.resolveComponentFactory(componentType); return this; } /** * Body will be used in nothing is provided. * @param container - The element in which dynamic content will be drawn inside to. For string case a query to the dom will be executed to find the element. * @returns Current instance of {@link ComponentLoader} */ to(container) { this.container = container || this.container; return this; } /** * Adds provider to the providers array. These providers will be injected to the attached component. * * @see {@link https://angular.io/guide/glossary#di-token | Injection Token} * * @param provider - Provider to inject. * @returns Current instance of {@link ComponentLoader} */ provide(provider) { this.providers.push(provider); return this; } /** * Attaches attached component to dom and any dynamic content if provided. * @remarks * Also triggers the {@link ComponentLoader.onBeforeShow} and {@link ComponentLoader.onShown} events. * * @param options - {@link ComponentLoaderOptions}. * @returns A reference to the created content. */ show(options = {}) { if (this.componentRef) { throw Error('Component is already shown'); } if (!this.componentFactory) { throw Error('You must attach a component'); } this.onBeforeShow.next({}); if (options.content) { this.contentRef = this.getContentRef(options.content, options.context, options.initialState); } this.createComponentAndAttachToView(options); this.appendContentToContainer(); this.markComponentsForCheck(); this.onShown.next(options.id); return this.componentRef; } /** * Removes attached component from dom. * @remarks * Also triggers the {@link ComponentLoader.onBeforeHide} and {@link ComponentLoader.onHidden} events. * * @param id - If provided it is returned through the {@link ComponentLoader.onHidden}. * @returns Current instance of {@link ComponentLoader} */ hide(id, result) { if (!this.componentRef) { throw Error('No attached component found to hide'); } this.onBeforeHide.next(this.componentRef.instance); const componentEl = this.componentRef.location.nativeElement; componentEl.parentNode.removeChild(componentEl); if (this.contentRef?.componentRef) { this.contentRef.componentRef.destroy(); } if (this.vcr && this.contentRef?.viewRef) { this.vcr.remove(this.vcr.indexOf(this.contentRef.viewRef)); } if (this.contentRef?.viewRef) { this.contentRef.viewRef.destroy(); } this.contentRef = void 0; this.componentRef = void 0; this.onHidden.next(id ? { id, result } : null); return this; } getInnerComponent() { return this.innerComponent; } markComponentsForCheck() { if (this.contentRef?.componentRef) { this.innerComponent = this.contentRef.componentRef.instance; this.contentRef.componentRef.changeDetectorRef.markForCheck(); this.contentRef.componentRef.changeDetectorRef.detectChanges(); } this.componentRef.changeDetectorRef.markForCheck(); this.componentRef.changeDetectorRef.detectChanges(); } createComponentAndAttachToView(options) { const injector = Injector.create({ providers: this.providers, parent: this.injector, }); this.componentRef = this.componentFactory.create(injector, this.contentRef?.nodes); this.applicationRef.attachView(this.componentRef.hostView); this.instance = this.componentRef.instance; Object.assign(this.componentRef.instance, options); } appendContentToContainer() { if (this.container instanceof ElementRef) { this.container.nativeElement.appendChild(this.componentRef?.location.nativeElement); } if (typeof this.container === 'string' && typeof document !== 'undefined') { const selectedElement = document.querySelector(this.container) || document.querySelector(this.containerDefaultSelector); if (!selectedElement) { return; } selectedElement.appendChild(this.componentRef?.location.nativeElement); } } getContentRef(content, context, initialState) { //TemplateRef case if (content instanceof TemplateRef) { if (this.vcr) { const viewRef = this.vcr.createEmbeddedView(content, context); viewRef.markForCheck(); return new ContentRef([viewRef.rootNodes], viewRef); } const viewRef = content.createEmbeddedView({}); this.applicationRef.attachView(viewRef); return new ContentRef([viewRef.rootNodes], viewRef); } //Component case if (typeof content === 'function') { const contentCf = this.cfr.resolveComponentFactory(content); const injector = Injector.create({ providers: this.providers, parent: this.injector, }); const componentRef = contentCf.create(injector); // Object.assign(componentRef.instance, initialState); this.applicationRef.attachView(componentRef.hostView); return new ContentRef([[componentRef.location.nativeElement]], componentRef.hostView, componentRef); } throw Error('Unsupported content type'); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxvYWRlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9jb21wb25lbnQtbG9hZGVyL2NvbXBvbmVudC1sb2FkZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUtMLFVBQVUsRUFFVixXQUFXLEVBR1gsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQTZCMUIsWUFDVSxHQUFpQyxFQUNqQyxHQUE2QixFQUM3QixjQUE4QixFQUM5QixRQUFrQjtRQUhsQixRQUFHLEdBQUgsR0FBRyxDQUE4QjtRQUNqQyxRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUM3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWhDNUI7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0I7OztXQUdHO1FBQ0gsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEI7OztXQUdHO1FBQ0gsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCOzs7V0FHRztRQUNILGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBTWpCLGNBQVMsR0FBcUIsRUFBRSxDQUFDO1FBRWpDLDZCQUF3QixHQUFHLE1BQU0sQ0FBQztJQU92QyxDQUFDO0lBRUo7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFzQjtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FB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QyxFQUFFLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3RCLENBQUMsQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsc0RBQXNEO1lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RyxDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnksXHJcbiAgVHlwZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIFN0YXRpY1Byb3ZpZGVyLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBBcHBsaWNhdGlvblJlZixcclxuICBJbmplY3RvcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXJPcHRpb25zIH0gZnJvbSAnLi9jb21wb25lbnQtbG9hZGVyLW9wdGlvbnMuY2xhc3MnO1xyXG5pbXBvcnQgeyBDb250ZW50UmVmIH0gZnJvbSAnLi9jb250ZW50LXJlZi5jbGFzcyc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgd2F5cyBvZiBsb2FkaW5nIGFuZCBoYW5kbGluZyBkeW5hbWljIGNvbnRlbnQuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIERvIE5PVCB1c2UgdGhpcyBkaXJlY3RseSwgY3JlYXRlIGFuIGluc3RhbmNlIHRocm91Z2gge0BsaW5rIENvbXBvbmVudExvYWRlckZhY3Rvcnl9XHJcbiAqIFlvdSBjYW4gdXNlIHRoaXMgbG9hZGVyIGluIHR3byB3YXlzOlxyXG4gKiAtIEF0dGFjaGVzIGEgY29tcG9uZW50IHRvIGBWaWV3Q29udGFpbmVyUmVmYC5cclxuICogLSBBdHRhY2hlcyBhIGNvbXBvbmVudCB0byBgVmlld0NvbnRhaW5lclJlZmAuIFRoZSBhdHRhY2hlZCBjb21wb25lbnQgaGFzIGEgYDxuZy1jb250ZW50PmAgdGFnIGluc2lkZSBpdHMgdmlldy4gVGhlIHtAbGluayBDb21wb25lbnRMb2FkZXJPcHRpb25zLmNvbnRlbnR9IHdpbGwgYmUgZHJhd24gaW5zaWRlIHRoaXMgdGFnLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMb2FkZXI8VCBleHRlbmRzIG9iamVjdD4ge1xyXG4gIC8qKlxyXG4gICAqIEJlZm9yZSBjb250ZW50IGlzIHNob3duIGV2ZW50LlxyXG4gICAqL1xyXG4gIG9uQmVmb3JlU2hvdyA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQWZ0ZXIgc2hvdyBjb250ZW50IGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIFRoZSBpZCBvZiBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCByZWYuXHJcbiAgICovXHJcbiAgb25TaG93biA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQmVmb3JlIGNvbnRlbnQgaXMgaGlkZGVuIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBhdHRhY2hlZCBjb21wb25lbnQ7XHJcbiAgICovXHJcbiAgb25CZWZvcmVIaWRlID0gbmV3IFN1YmplY3QoKTtcclxuICAvKipcclxuICAgKiBBZnRlciBjb250ZW50IGlzIGhpZGRlbiBldmVudC5cclxuICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgZGVzdHJveWVkIGNvbXBvbmVudCByZWYuXHJcbiAgICovXHJcbiAgb25IaWRkZW4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgaW5zdGFuY2U/OiBUO1xyXG4gIHB1YmxpYyBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8VD47XHJcbiAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5PzogQ29tcG9uZW50RmFjdG9yeTxUPjtcclxuICBwcml2YXRlIGNvbnRhaW5lcjogc3RyaW5nIHwgRWxlbWVudFJlZiB8IGFueTtcclxuICBwcml2YXRlIHByb3ZpZGVyczogU3RhdGljUHJvdmlkZXJbXSA9IFtdO1xyXG4gIHByaXZhdGUgY29udGVudFJlZj86IENvbnRlbnRSZWY7XHJcbiAgcHJpdmF0ZSBjb250YWluZXJEZWZhdWx0U2VsZWN0b3IgPSAnYm9keSc7XHJcbiAgcHJpdmF0ZSBpbm5lckNvbXBvbmVudD86IENvbXBvbmVudFJlZjxUPjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdmNyOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkLFxyXG4gICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3JcclxuICApIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dGFjaGVzIGNvbXBvbmVudC5cclxuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFRoZSB0eXBlIGNvbXBvbmVudCB0byBhdHRhY2guXHJcbiAgICogQHJldHVybnMgQ3VycmVudCBpbnN0YW5jZSBvZiB7QGxpbmsgQ29tcG9uZW50TG9hZGVyfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhdHRhY2goY29tcG9uZW50VHlwZTogVHlwZTxUPik6IENvbXBvbmVudExvYWRlcjxUPiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeTxUPihjb21wb25lbnRUeXBlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQm9keSB3aWxsIGJlIHVzZWQgaW4gbm90aGluZyBpcyBwcm92aWRlZC5cclxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gVGhlIGVsZW1lbnQgaW4gd2hpY2ggZHluYW1pYyBjb250ZW50IHdpbGwgYmUgZHJhd24gaW5zaWRlIHRvLiBGb3Igc3RyaW5nIGNhc2UgYSBxdWVyeSB0byB0aGUgZG9tIHdpbGwgYmUgZXhlY3V0ZWQgdG8gZmluZCB0aGUgZWxlbWVudC5cclxuICAgKiBAcmV0dXJucyBDdXJyZW50IGluc3RhbmNlIG9mIHtAbGluayBDb21wb25lbnRMb2FkZXJ9XHJcbiAgICovXHJcbiAgcHVibGljIHRvKGNvbnRhaW5lcj86IHN0cmluZyB8IEVsZW1lbnRSZWYpOiBDb21wb25lbnRMb2FkZXI8VD4ge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgdGhpcy5jb250YWluZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgcHJvdmlkZXIgdG8gdGhlIHByb3ZpZGVycyBhcnJheS4gVGhlc2UgcHJvdmlkZXJzIHdpbGwgYmUgaW5qZWN0ZWQgdG8gdGhlIGF0dGFjaGVkIGNvbXBvbmVudC5cclxuICAgKlxyXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9nbG9zc2FyeSNkaS10b2tlbiB8IEluamVjdGlvbiBUb2tlbn1cclxuICAgKlxyXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFByb3ZpZGVyIHRvIGluamVjdC5cclxuICAgKiBAcmV0dXJucyBDdXJyZW50IGluc3RhbmNlIG9mIHtAbGluayBDb21wb25lbnRMb2FkZXJ9XHJcbiAgICovXHJcbiAgcHVibGljIHByb3ZpZGUocHJvdmlkZXI6IFN0YXRpY1Byb3ZpZGVyKTogQ29tcG9uZW50TG9hZGVyPFQ+IHtcclxuICAgIHRoaXMucHJvdmlkZXJzLnB1c2gocHJvdmlkZXIpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRhY2hlcyBhdHRhY2hlZCBjb21wb25lbnQgdG8gZG9tIGFuZCBhbnkgZHluYW1pYyBjb250ZW50IGlmIHByb3ZpZGVkLlxyXG4gICAqIEByZW1hcmtzXHJcbiAgICogQWxzbyB0cmlnZ2VycyB0aGUge0BsaW5rIENvbXBvbmVudExvYWRlci5vbkJlZm9yZVNob3d9IGFuZCB7QGxpbmsgQ29tcG9uZW50TG9hZGVyLm9uU2hvd259IGV2ZW50cy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0ge0BsaW5rIENvbXBvbmVudExvYWRlck9wdGlvbnN9LlxyXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbnRlbnQuXHJcbiAgICovXHJcbiAgcHVibGljIHNob3cob3B0aW9uczogQ29tcG9uZW50TG9hZGVyT3B0aW9ucyA9IHt9KTogQ29tcG9uZW50UmVmPFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aHJvdyBFcnJvcignQ29tcG9uZW50IGlzIGFscmVhZHkgc2hvd24nKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5jb21wb25lbnRGYWN0b3J5KSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdZb3UgbXVzdCBhdHRhY2ggYSBjb21wb25lbnQnKTtcclxuICAgIH1cclxuICAgIHRoaXMub25CZWZvcmVTaG93Lm5leHQoe30pO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5jb250ZW50UmVmID0gdGhpcy5nZXRDb250ZW50UmVmKG9wdGlvbnMuY29udGVudCwgb3B0aW9ucy5jb250ZXh0LCBvcHRpb25zLmluaXRpYWxTdGF0ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEFuZEF0dGFjaFRvVmlldyhvcHRpb25zKTtcclxuICAgIHRoaXMuYXBwZW5kQ29udGVudFRvQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLm1hcmtDb21wb25lbnRzRm9yQ2hlY2soKTtcclxuXHJcbiAgICB0aGlzLm9uU2hvd24ubmV4dChvcHRpb25zLmlkKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGF0dGFjaGVkIGNvbXBvbmVudCBmcm9tIGRvbS5cclxuICAgKiBAcmVtYXJrc1xyXG4gICAqIEFsc28gdHJpZ2dlcnMgdGhlIHtAbGluayBDb21wb25lbnRMb2FkZXIub25CZWZvcmVIaWRlfSBhbmQge0BsaW5rIENvbXBvbmVudExvYWRlci5vbkhpZGRlbn0gZXZlbnRzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlkIC0gSWYgcHJvdmlkZWQgaXQgaXMgcmV0dXJuZWQgdGhyb3VnaCB0aGUge0BsaW5rIENvbXBvbmVudExvYWRlci5vbkhpZGRlbn0uXHJcbiAgICogQHJldHVybnMgQ3VycmVudCBpbnN0YW5jZSBvZiB7QGxpbmsgQ29tcG9uZW50TG9hZGVyfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBoaWRlKGlkPzogbnVtYmVyIHwgc3RyaW5nLCByZXN1bHQ/OiBhbnkpOiBDb21wb25lbnRMb2FkZXI8VD4ge1xyXG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aHJvdyBFcnJvcignTm8gYXR0YWNoZWQgY29tcG9uZW50IGZvdW5kIHRvIGhpZGUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQmVmb3JlSGlkZS5uZXh0KHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlKTtcclxuXHJcbiAgICBjb25zdCBjb21wb25lbnRFbCA9IHRoaXMuY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb21wb25lbnRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbXBvbmVudEVsKTtcclxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWY/LmNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLmNvbnRlbnRSZWYuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnZjciAmJiB0aGlzLmNvbnRlbnRSZWY/LnZpZXdSZWYpIHtcclxuICAgICAgdGhpcy52Y3IucmVtb3ZlKHRoaXMudmNyLmluZGV4T2YodGhpcy5jb250ZW50UmVmLnZpZXdSZWYpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWY/LnZpZXdSZWYpIHtcclxuICAgICAgdGhpcy5jb250ZW50UmVmLnZpZXdSZWYuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZW50UmVmID0gdm9pZCAwO1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB2b2lkIDA7XHJcblxyXG4gICAgdGhpcy5vbkhpZGRlbi5uZXh0KGlkID8geyBpZCwgcmVzdWx0IH0gOiBudWxsKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGdldElubmVyQ29tcG9uZW50KCk6IENvbXBvbmVudFJlZjxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5pbm5lckNvbXBvbmVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFya0NvbXBvbmVudHNGb3JDaGVjaygpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWY/LmNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLmlubmVyQ29tcG9uZW50ID0gdGhpcy5jb250ZW50UmVmLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgICAgdGhpcy5jb250ZW50UmVmLmNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgdGhpcy5jb250ZW50UmVmLmNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZiEuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZiEuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRBbmRBdHRhY2hUb1ZpZXcob3B0aW9uczogQ29tcG9uZW50TG9hZGVyT3B0aW9ucykge1xyXG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xyXG4gICAgICBwcm92aWRlcnM6IHRoaXMucHJvdmlkZXJzLFxyXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRGYWN0b3J5IS5jcmVhdGUoaW5qZWN0b3IsIHRoaXMuY29udGVudFJlZj8ubm9kZXMpO1xyXG4gICAgdGhpcy5hcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KHRoaXMuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRDb250ZW50VG9Db250YWluZXIoKSB7XHJcbiAgICBpZiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5jb21wb25lbnRSZWY/LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRhaW5lciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGFpbmVyKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGFpbmVyRGVmYXVsdFNlbGVjdG9yKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgc2VsZWN0ZWRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29tcG9uZW50UmVmPy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udGVudFJlZihjb250ZW50Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiwgY29udGV4dD86IGFueSwgaW5pdGlhbFN0YXRlPzogYW55KTogQ29udGVudFJlZiB7XHJcbiAgICAvL1RlbXBsYXRlUmVmIGNhc2VcclxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuICAgICAgaWYgKHRoaXMudmNyKSB7XHJcbiAgICAgICAgY29uc3Qgdmlld1JlZiA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldzxUZW1wbGF0ZVJlZjxUPj4oY29udGVudCwgY29udGV4dCk7XHJcbiAgICAgICAgdmlld1JlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoW3ZpZXdSZWYucm9vdE5vZGVzXSwgdmlld1JlZik7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgdmlld1JlZiA9IGNvbnRlbnQuY3JlYXRlRW1iZWRkZWRWaWV3KHt9KTtcclxuICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KHZpZXdSZWYpO1xyXG4gICAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoW3ZpZXdSZWYucm9vdE5vZGVzXSwgdmlld1JlZik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Db21wb25lbnQgY2FzZVxyXG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRDZiA9IHRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbnRlbnQpO1xyXG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgcHJvdmlkZXJzOiB0aGlzLnByb3ZpZGVycyxcclxuICAgICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb250ZW50Q2YuY3JlYXRlKGluamVjdG9yKTtcclxuICAgICAgLy8gT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2UsIGluaXRpYWxTdGF0ZSk7XHJcbiAgICAgIHRoaXMuYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoW1tjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudF1dLCBjb21wb25lbnRSZWYuaG9zdFZpZXcsIGNvbXBvbmVudFJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZScpO1xyXG4gIH1cclxufVxyXG4iXX0=