@ionic/angular
Version:
Angular specific wrappers for @ionic/core
152 lines • 21.3 kB
JavaScript
import { ApplicationRef, NgZone, Injectable, Injector, inject, createComponent, InjectionToken, } from '@angular/core';
import { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_WILL_UNLOAD, } from '@ionic/core';
import { NavParams } from '../directives/navigation/nav-params';
import * as i0 from "@angular/core";
// TODO(FW-2827): types
export class AngularDelegate {
constructor() {
this.zone = inject(NgZone);
this.applicationRef = inject(ApplicationRef);
}
create(environmentInjector, injector, elementReferenceKey) {
return new AngularFrameworkDelegate(environmentInjector, injector, this.applicationRef, this.zone, elementReferenceKey);
}
}
/** @nocollapse */ AngularDelegate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AngularDelegate, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ AngularDelegate.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AngularDelegate });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AngularDelegate, decorators: [{
type: Injectable
}] });
export class AngularFrameworkDelegate {
constructor(environmentInjector, injector, applicationRef, zone, elementReferenceKey) {
this.environmentInjector = environmentInjector;
this.injector = injector;
this.applicationRef = applicationRef;
this.zone = zone;
this.elementReferenceKey = elementReferenceKey;
this.elRefMap = new WeakMap();
this.elEventsMap = new WeakMap();
}
attachViewToDom(container, component, params, cssClasses) {
return this.zone.run(() => {
return new Promise((resolve) => {
const componentProps = {
...params,
};
/**
* Ionic Angular passes a reference to a modal
* or popover that can be accessed using a
* variable in the overlay component. If
* elementReferenceKey is defined, then we should
* pass a reference to the component using
* elementReferenceKey as the key.
*/
if (this.elementReferenceKey !== undefined) {
componentProps[this.elementReferenceKey] = container;
}
const el = attachView(this.zone, this.environmentInjector, this.injector, this.applicationRef, this.elRefMap, this.elEventsMap, container, component, componentProps, cssClasses, this.elementReferenceKey);
resolve(el);
});
});
}
removeViewFromDom(_container, component) {
return this.zone.run(() => {
return new Promise((resolve) => {
const componentRef = this.elRefMap.get(component);
if (componentRef) {
componentRef.destroy();
this.elRefMap.delete(component);
const unbindEvents = this.elEventsMap.get(component);
if (unbindEvents) {
unbindEvents();
this.elEventsMap.delete(component);
}
}
resolve();
});
});
}
}
export const attachView = (zone, environmentInjector, injector, applicationRef, elRefMap, elEventsMap, container, component, params, cssClasses, elementReferenceKey) => {
/**
* Wraps the injector with a custom injector that
* provides NavParams to the component.
*
* NavParams is a legacy feature from Ionic v3 that allows
* Angular developers to provide data to a component
* and access it by providing NavParams as a dependency
* in the constructor.
*
* The modern approach is to access the data directly
* from the component's class instance.
*/
const childInjector = Injector.create({
providers: getProviders(params),
parent: injector,
});
const componentRef = createComponent(component, {
environmentInjector,
elementInjector: childInjector,
});
const instance = componentRef.instance;
const hostElement = componentRef.location.nativeElement;
if (params) {
/**
* For modals and popovers, a reference to the component is
* added to `params` during the call to attachViewToDom. If
* a reference using this name is already set, this means
* the app is trying to use the name as a component prop,
* which will cause collisions.
*/
if (elementReferenceKey && instance[elementReferenceKey] !== undefined) {
console.error(`[Ionic Error]: ${elementReferenceKey} is a reserved property when using ${container.tagName.toLowerCase()}. Rename or remove the "${elementReferenceKey}" property from ${component.name}.`);
}
Object.assign(instance, params);
}
if (cssClasses) {
for (const cssClass of cssClasses) {
hostElement.classList.add(cssClass);
}
}
const unbindEvents = bindLifecycleEvents(zone, instance, hostElement);
container.appendChild(hostElement);
applicationRef.attachView(componentRef.hostView);
elRefMap.set(hostElement, componentRef);
elEventsMap.set(hostElement, unbindEvents);
return hostElement;
};
const LIFECYCLES = [
LIFECYCLE_WILL_ENTER,
LIFECYCLE_DID_ENTER,
LIFECYCLE_WILL_LEAVE,
LIFECYCLE_DID_LEAVE,
LIFECYCLE_WILL_UNLOAD,
];
export const bindLifecycleEvents = (zone, instance, element) => {
return zone.run(() => {
const unregisters = LIFECYCLES.filter((eventName) => typeof instance[eventName] === 'function').map((eventName) => {
const handler = (ev) => instance[eventName](ev.detail);
element.addEventListener(eventName, handler);
return () => element.removeEventListener(eventName, handler);
});
return () => unregisters.forEach((fn) => fn());
});
};
const NavParamsToken = new InjectionToken('NavParamsToken');
const getProviders = (params) => {
return [
{
provide: NavParamsToken,
useValue: params,
},
{
provide: NavParams,
useFactory: provideNavParamsInjectable,
deps: [NavParamsToken],
},
];
};
const provideNavParamsInjectable = (params) => {
return new NavParams(params);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1kZWxlZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvYW5ndWxhci1kZWxlZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUVSLE1BQU0sRUFDTixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFFaEUsdUJBQXVCO0FBR3ZCLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBRVUsU0FBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztLQWVqRDtJQWJDLE1BQU0sQ0FDSixtQkFBd0MsRUFDeEMsUUFBa0IsRUFDbEIsbUJBQTRCO1FBRTVCLE9BQU8sSUFBSSx3QkFBd0IsQ0FDakMsbUJBQW1CLEVBQ25CLFFBQVEsRUFDUixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsSUFBSSxFQUNULG1CQUFtQixDQUNwQixDQUFDO0lBQ0osQ0FBQzs7Z0lBaEJVLGVBQWU7b0lBQWYsZUFBZTs0RkFBZixlQUFlO2tCQUQzQixVQUFVOztBQW9CWCxNQUFNLE9BQU8sd0JBQXdCO0lBSW5DLFlBQ1UsbUJBQXdDLEVBQ3hDLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLElBQVksRUFDWixtQkFBNEI7UUFKNUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5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dCI6WyJpbXBvcnQge1xuICBBcHBsaWNhdGlvblJlZixcbiAgTmdab25lLFxuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgaW5qZWN0LFxuICBjcmVhdGVDb21wb25lbnQsXG4gIEluamVjdGlvblRva2VuLFxuICBDb21wb25lbnRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRnJhbWV3b3JrRGVsZWdhdGUsXG4gIExJRkVDWUNMRV9ESURfRU5URVIsXG4gIExJRkVDWUNMRV9ESURfTEVBVkUsXG4gIExJRkVDWUNMRV9XSUxMX0VOVEVSLFxuICBMSUZFQ1lDTEVfV0lMTF9MRUFWRSxcbiAgTElGRUNZQ0xFX1dJTExfVU5MT0FELFxufSBmcm9tICdAaW9uaWMvY29yZSc7XG5cbmltcG9ydCB7IE5hdlBhcmFtcyB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbmF2aWdhdGlvbi9uYXYtcGFyYW1zJztcblxuLy8gVE9ETyhGVy0yODI3KTogdHlwZXNcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJEZWxlZ2F0ZSB7XG4gIHByaXZhdGUgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIGFwcGxpY2F0aW9uUmVmID0gaW5qZWN0KEFwcGxpY2F0aW9uUmVmKTtcblxuICBjcmVhdGUoXG4gICAgZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgZWxlbWVudFJlZmVyZW5jZUtleT86IHN0cmluZ1xuICApOiBBbmd1bGFyRnJhbWV3b3JrRGVsZWdhdGUge1xuICAgIHJldHVybiBuZXcgQW5ndWxhckZyYW1ld29ya0RlbGVnYXRlKFxuICAgICAgZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIGluamVjdG9yLFxuICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZixcbiAgICAgIHRoaXMuem9uZSxcbiAgICAgIGVsZW1lbnRSZWZlcmVuY2VLZXlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyRnJhbWV3b3JrRGVsZWdhdGUgaW1wbGVtZW50cyBGcmFtZXdvcmtEZWxlZ2F0ZSB7XG4gIHByaXZhdGUgZWxSZWZNYXAgPSBuZXcgV2Vha01hcDxIVE1MRWxlbWVudCwgQ29tcG9uZW50UmVmPGFueT4+KCk7XG4gIHByaXZhdGUgZWxFdmVudHNNYXAgPSBuZXcgV2Vha01hcDxIVE1MRWxlbWVudCwgKCkgPT4gdm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVudmlyb25tZW50SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmZXJlbmNlS2V5Pzogc3RyaW5nXG4gICkge31cblxuICBhdHRhY2hWaWV3VG9Eb20oY29udGFpbmVyOiBhbnksIGNvbXBvbmVudDogYW55LCBwYXJhbXM/OiBhbnksIGNzc0NsYXNzZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFByb3BzID0ge1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW9uaWMgQW5ndWxhciBwYXNzZXMgYSByZWZlcmVuY2UgdG8gYSBtb2RhbFxuICAgICAgICAgKiBvciBwb3BvdmVyIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIGFcbiAgICAgICAgICogdmFyaWFibGUgaW4gdGhlIG92ZXJsYXkgY29tcG9uZW50LiBJZlxuICAgICAgICAgKiBlbGVtZW50UmVmZXJlbmNlS2V5IGlzIGRlZmluZWQsIHRoZW4gd2Ugc2hvdWxkXG4gICAgICAgICAqIHBhc3MgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB1c2luZ1xuICAgICAgICAgKiBlbGVtZW50UmVmZXJlbmNlS2V5IGFzIHRoZSBrZXkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50UmVmZXJlbmNlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb21wb25lbnRQcm9wc1t0aGlzLmVsZW1lbnRSZWZlcmVuY2VLZXldID0gY29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBhdHRhY2hWaWV3KFxuICAgICAgICAgIHRoaXMuem9uZSxcbiAgICAgICAgICB0aGlzLmVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uUmVmLFxuICAgICAgICAgIHRoaXMuZWxSZWZNYXAsXG4gICAgICAgICAgdGhpcy5lbEV2ZW50c01hcCxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgIGNvbXBvbmVudFByb3BzLFxuICAgICAgICAgIGNzc0NsYXNzZXMsXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmZXJlbmNlS2V5XG4gICAgICAgICk7XG4gICAgICAgIHJlc29sdmUoZWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVWaWV3RnJvbURvbShfY29udGFpbmVyOiBhbnksIGNvbXBvbmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuZWxSZWZNYXAuZ2V0KGNvbXBvbmVudCk7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgICAgICAgIHRoaXMuZWxSZWZNYXAuZGVsZXRlKGNvbXBvbmVudCk7XG4gICAgICAgICAgY29uc3QgdW5iaW5kRXZlbnRzID0gdGhpcy5lbEV2ZW50c01hcC5nZXQoY29tcG9uZW50KTtcbiAgICAgICAgICBpZiAodW5iaW5kRXZlbnRzKSB7XG4gICAgICAgICAgICB1bmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuZWxFdmVudHNNYXAuZGVsZXRlKGNvbXBvbmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhdHRhY2hWaWV3ID0gKFxuICB6b25lOiBOZ1pvbmUsXG4gIGVudmlyb25tZW50SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gIGluamVjdG9yOiBJbmplY3RvcixcbiAgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxuICBlbFJlZk1hcDogV2Vha01hcDxIVE1MRWxlbWVudCwgQ29tcG9uZW50UmVmPGFueT4+LFxuICBlbEV2ZW50c01hcDogV2Vha01hcDxIVE1MRWxlbWVudCwgKCkgPT4gdm9pZD4sXG4gIGNvbnRhaW5lcjogYW55LFxuICBjb21wb25lbnQ6IGFueSxcbiAgcGFyYW1zOiBhbnksXG4gIGNzc0NsYXNzZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICBlbGVtZW50UmVmZXJlbmNlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGFueSA9PiB7XG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgaW5qZWN0b3Igd2l0aCBhIGN1c3RvbSBpbmplY3RvciB0aGF0XG4gICAqIHByb3ZpZGVzIE5hdlBhcmFtcyB0byB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBOYXZQYXJhbXMgaXMgYSBsZWdhY3kgZmVhdHVyZSBmcm9tIElvbmljIHYzIHRoYXQgYWxsb3dzXG4gICAqIEFuZ3VsYXIgZGV2ZWxvcGVycyB0byBwcm92aWRlIGRhdGEgdG8gYSBjb21wb25lbnRcbiAgICogYW5kIGFjY2VzcyBpdCBieSBwcm92aWRpbmcgTmF2UGFyYW1zIGFzIGEgZGVwZW5kZW5jeVxuICAgKiBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIFRoZSBtb2Rlcm4gYXBwcm9hY2ggaXMgdG8gYWNjZXNzIHRoZSBkYXRhIGRpcmVjdGx5XG4gICAqIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3QgY2hpbGRJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgcHJvdmlkZXJzOiBnZXRQcm92aWRlcnMocGFyYW1zKSxcbiAgICBwYXJlbnQ6IGluamVjdG9yLFxuICB9KTtcblxuICBjb25zdCBjb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQ8YW55Pihjb21wb25lbnQsIHtcbiAgICBlbnZpcm9ubWVudEluamVjdG9yLFxuICAgIGVsZW1lbnRJbmplY3RvcjogY2hpbGRJbmplY3RvcixcbiAgfSk7XG5cbiAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gIGNvbnN0IGhvc3RFbGVtZW50ID0gY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgaWYgKHBhcmFtcykge1xuICAgIC8qKlxuICAgICAqIEZvciBtb2RhbHMgYW5kIHBvcG92ZXJzLCBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IGlzXG4gICAgICogYWRkZWQgdG8gYHBhcmFtc2AgZHVyaW5nIHRoZSBjYWxsIHRvIGF0dGFjaFZpZXdUb0RvbS4gSWZcbiAgICAgKiBhIHJlZmVyZW5jZSB1c2luZyB0aGlzIG5hbWUgaXMgYWxyZWFkeSBzZXQsIHRoaXMgbWVhbnNcbiAgICAgKiB0aGUgYXBwIGlzIHRyeWluZyB0byB1c2UgdGhlIG5hbWUgYXMgYSBjb21wb25lbnQgcHJvcCxcbiAgICAgKiB3aGljaCB3aWxsIGNhdXNlIGNvbGxpc2lvbnMuXG4gICAgICovXG4gICAgaWYgKGVsZW1lbnRSZWZlcmVuY2VLZXkgJiYgaW5zdGFuY2VbZWxlbWVudFJlZmVyZW5jZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtJb25pYyBFcnJvcl06ICR7ZWxlbWVudFJlZmVyZW5jZUtleX0gaXMgYSByZXNlcnZlZCBwcm9wZXJ0eSB3aGVuIHVzaW5nICR7Y29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKX0uIFJlbmFtZSBvciByZW1vdmUgdGhlIFwiJHtlbGVtZW50UmVmZXJlbmNlS2V5fVwiIHByb3BlcnR5IGZyb20gJHtcbiAgICAgICAgICBjb21wb25lbnQubmFtZVxuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwgcGFyYW1zKTtcbiAgfVxuICBpZiAoY3NzQ2xhc3Nlcykge1xuICAgIGZvciAoY29uc3QgY3NzQ2xhc3Mgb2YgY3NzQ2xhc3Nlcykge1xuICAgICAgaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVuYmluZEV2ZW50cyA9IGJpbmRMaWZlY3ljbGVFdmVudHMoem9uZSwgaW5zdGFuY2UsIGhvc3RFbGVtZW50KTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGhvc3RFbGVtZW50KTtcblxuICBhcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cbiAgZWxSZWZNYXAuc2V0KGhvc3RFbGVtZW50LCBjb21wb25lbnRSZWYpO1xuICBlbEV2ZW50c01hcC5zZXQoaG9zdEVsZW1lbnQsIHVuYmluZEV2ZW50cyk7XG4gIHJldHVybiBob3N0RWxlbWVudDtcbn07XG5cbmNvbnN0IExJRkVDWUNMRVMgPSBbXG4gIExJRkVDWUNMRV9XSUxMX0VOVEVSLFxuICBMSUZFQ1lDTEVfRElEX0VOVEVSLFxuICBMSUZFQ1lDTEVfV0lMTF9MRUFWRSxcbiAgTElGRUNZQ0xFX0RJRF9MRUFWRSxcbiAgTElGRUNZQ0xFX1dJTExfVU5MT0FELFxuXTtcblxuZXhwb3J0IGNvbnN0IGJpbmRMaWZlY3ljbGVFdmVudHMgPSAoem9uZTogTmdab25lLCBpbnN0YW5jZTogYW55LCBlbGVtZW50OiBIVE1MRWxlbWVudCk6ICgoKSA9PiB2b2lkKSA9PiB7XG4gIHJldHVybiB6b25lLnJ1bigoKSA9PiB7XG4gICAgY29uc3QgdW5yZWdpc3RlcnMgPSBMSUZFQ1lDTEVTLmZpbHRlcigoZXZlbnROYW1lKSA9PiB0eXBlb2YgaW5zdGFuY2VbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJykubWFwKChldmVudE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZXY6IGFueSkgPT4gaW5zdGFuY2VbZXZlbnROYW1lXShldi5kZXRhaWwpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICByZXR1cm4gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHVucmVnaXN0ZXJzLmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgfSk7XG59O1xuXG5jb25zdCBOYXZQYXJhbXNUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnk+KCdOYXZQYXJhbXNUb2tlbicpO1xuXG5jb25zdCBnZXRQcm92aWRlcnMgPSAocGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTmF2UGFyYW1zVG9rZW4sXG4gICAgICB1c2VWYWx1ZTogcGFyYW1zLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTmF2UGFyYW1zLFxuICAgICAgdXNlRmFjdG9yeTogcHJvdmlkZU5hdlBhcmFtc0luamVjdGFibGUsXG4gICAgICBkZXBzOiBbTmF2UGFyYW1zVG9rZW5dLFxuICAgIH0sXG4gIF07XG59O1xuXG5jb25zdCBwcm92aWRlTmF2UGFyYW1zSW5qZWN0YWJsZSA9IChwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+IHtcbiAgcmV0dXJuIG5ldyBOYXZQYXJhbXMocGFyYW1zKTtcbn07XG4iXX0=