@lotto24-angular/imports-orchestrator
Version:
Orchestrate dynamically imported components in Angular applications
104 lines • 15.9 kB
JavaScript
import { inject, Injectable, Injector, runInInjectionContext, } from '@angular/core';
import { findFn, findImportPriority } from './host-directive/util';
import { ImportsQueueProcessor } from './queue/imports-queue-processor.service';
import { Subject } from 'rxjs';
import { IMPORTS_ORCHESTRATOR_FEATURE_IMPORTS_STORE, IMPORTS_ORCHESTRATOR_FEATURE_INTERCEPTOR, IMPORTS_ORCHESTRATOR_FEATURE_LOGGER, IMPORTS_ORCHESTRATOR_FEATURE_ORCHESTRATION, IMPORTS_ORCHESTRATOR_FEATURE_QUEUE, IMPORTS_ORCHESTRATOR_FEATURE_TIMEOUT, } from './internal';
import * as i0 from "@angular/core";
export class ImportService {
constructor() {
this.queueProcessor = inject(ImportsQueueProcessor);
this.timeout = inject(IMPORTS_ORCHESTRATOR_FEATURE_TIMEOUT);
this.logger = inject(IMPORTS_ORCHESTRATOR_FEATURE_LOGGER);
this.queue = inject(IMPORTS_ORCHESTRATOR_FEATURE_QUEUE);
this.orchestration = inject(IMPORTS_ORCHESTRATOR_FEATURE_ORCHESTRATION);
this.interceptor = inject(IMPORTS_ORCHESTRATOR_FEATURE_INTERCEPTOR, { optional: true });
this.injector = inject(Injector);
}
createQueueItem(identifier, destroy$, options = {}) {
const opts = {
...options,
injector: options.injector ?? this.injector,
timeout: options.timeout ?? this.timeout,
};
const imports = this.importsFromDI(opts.injector);
const resolveFn = this.resolveFnFromImports(imports, identifier);
const priority = findImportPriority(this.orchestration, identifier, this.logger);
const hooks = {
queued: new Subject(),
start: new Subject(),
finish: new Subject(),
error: new Subject(),
};
runInInjectionContext(this.injector, () => {
if (this.interceptor) {
this.interceptor(identifier, hooks);
}
});
return {
...opts,
priority,
identifier,
resolveFn,
destroy$,
hooks,
logger: this.logger,
toString: () => `="${identifier}", =${priority}`,
};
}
async addItemToQueue(item) {
const promise = new Promise((resolve, reject) => {
item.callback = (result, err) => {
if (err) {
reject(err);
}
else {
resolve(result);
}
};
});
this.queue.insert(item.priority, item);
item.lifecycle?.importQueued?.emit();
item.hooks.queued.next(item);
item.hooks.queued.complete();
this.logger.debug(`queue insert ${item.toString()}`);
this.queueProcessor.process();
return promise;
}
async bypassQueue(item) {
this.logger.debug(`bypass queue ${item.toString()}`);
return item.resolveFn(item);
}
removeItemFromQueue(item) {
return this.queue.take(item) !== undefined;
}
importsFromDI(injector) {
try {
const store = injector.get(IMPORTS_ORCHESTRATOR_FEATURE_IMPORTS_STORE);
return store;
}
catch (x) {
throw new Error(`
Could not inject ${IMPORTS_ORCHESTRATOR_FEATURE_IMPORTS_STORE}. Did you \`provideImports({...})\` in a component or module? If you did, you may need to provide an Injector when calling createQueueItem.
${x}`);
}
}
resolveFnFromImports(imports, identifier) {
try {
return findFn(imports, identifier);
}
catch (x) {
throw new Error(`
Could not find ImportResolveFn. Did you \`provideImports({...})\` in a component or module? If you did, you may need to provide an Injector when calling createQueueItem.
${x}`);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ImportService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvaW1wb3J0cy1vcmNoZXN0cmF0b3Ivc3JjL2xpYi9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFRM0MsT0FBTyxFQUNMLDBDQUEwQyxFQUMxQyx3Q0FBd0MsRUFDeEMsbUNBQW1DLEVBQ25DLDBDQUEwQyxFQUMxQyxrQ0FBa0MsRUFDbEMsb0NBQW9DLEdBQ3JDLE1BQU0sWUFBWSxDQUFDOztBQWdDcEIsTUFBTSxPQUFPLGFBQWE7SUFIMUI7UUFJbUIsbUJBQWMsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvQyxZQUFPLEdBQUcsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDdkQsV0FBTSxHQUFHLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3JELFVBQUssR0FBRyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNuRCxrQkFBYSxHQUFHLE1BQU0sQ0FDckMsMENBQTBDLENBQzNDLENBQUM7UUFDZSxnQkFBVyxHQUFHLE1BQU0sQ0FDbkMsd0NBQXdDLEVBQ3hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUNuQixDQUFDO1FBQ2UsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQTZHOUM7SUEzR1EsZUFBZSxDQUNwQixVQUFrQixFQUNsQixRQUEwQixFQUMxQixVQUF5QyxFQUFFO1FBRTNDLE1B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LElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sYUFBYSxDQUFDLFFBQWtCO1FBQ3RDLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUN2RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUM7MkJBQ0ssMENBQTBDO1VBQzNELENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixPQUFxQixFQUNyQixVQUFrQjtRQUVsQixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDOztVQUVaLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQzs4R0F4SFUsYUFBYTtrSEFBYixhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBpbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBydW5JbkluamVjdGlvbkNvbnRleHQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluZEZuLCBmaW5kSW1wb3J0UHJpb3JpdHkgfSBmcm9tICcuL2hvc3QtZGlyZWN0aXZlL3V0aWwnO1xuaW1wb3J0IHsgSW1wb3J0c1F1ZXVlUHJvY2Vzc29yIH0gZnJvbSAnLi9xdWV1ZS9pbXBvcnRzLXF1ZXVlLXByb2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltcG9ydFJlc29sdmVGbiB9IGZyb20gJy4vcmVzb2x2ZSc7XG5pbXBvcnQge1xuICBJbXBvcnRMaWZlY3ljbGUsXG4gIEltcG9ydE9ic2VydmFibGVDb21wb25lbnRJTyxcbiAgSW1wb3J0c0ludGVyY2VwdG9ySG9va3MsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcblxuaW1wb3J0IHtcbiAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9JTVBPUlRTX1NUT1JFLFxuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX0lOVEVSQ0VQVE9SLFxuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX0xPR0dFUixcbiAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9PUkNIRVNUUkFUSU9OLFxuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX1FVRVVFLFxuICBJTVBPUlRTX09SQ0hFU1RSQVRPUl9GRUFUVVJFX1RJTUVPVVQsXG59IGZyb20gJy4vaW50ZXJuYWwnO1xuaW1wb3J0IHsgSW1wb3J0c1N0b3JlIH0gZnJvbSAnLi9mZWF0dXJlcy9pbnRlcm5hbCc7XG5pbXBvcnQgeyBDb25zb2xlTGlrZSB9IGZyb20gJy4vZmVhdHVyZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNlcnZpY2VPcHRpb25zIHtcbiAgbGlmZWN5Y2xlPzogUGFydGlhbDxJbXBvcnRMaWZlY3ljbGU+O1xuICBpbz86IEltcG9ydE9ic2VydmFibGVDb21wb25lbnRJTztcbiAgaW5qZWN0b3I6IEluamVjdG9yO1xuICB0aW1lb3V0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJbnRlcmNlcHRvckhvb2tzU3ViamVjdHMgZXh0ZW5kcyBJbXBvcnRzSW50ZXJjZXB0b3JIb29rcyB7XG4gIHF1ZXVlZDogU3ViamVjdDxJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtPjtcbiAgZmluaXNoOiBTdWJqZWN0PEltcG9ydHNPcmNoZXN0cmF0b3JRdWV1ZUl0ZW0+O1xuICBzdGFydDogU3ViamVjdDxJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtPjtcbiAgZXJyb3I6IFN1YmplY3Q8W0ltcG9ydHNPcmNoZXN0cmF0b3JRdWV1ZUl0ZW0sIHVua25vd25dPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtIGV4dGVuZHMgSW1wb3J0U2VydmljZU9wdGlvbnMge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlc29sdmVGbjogSW1wb3J0UmVzb2x2ZUZuO1xuICBwcmlvcml0eTogbnVtYmVyO1xuICBsb2dnZXI6IENvbnNvbGVMaWtlO1xuICBkZXN0cm95JDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgaG9va3M6IEludGVyY2VwdG9ySG9va3NTdWJqZWN0cztcbiAgY2FsbGJhY2s/OiAocmVzdWx0OiB1bmtub3duLCBlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gIHRvU3RyaW5nOiAoKSA9PiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBJbXBvcnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZVByb2Nlc3NvciA9IGluamVjdChJbXBvcnRzUXVldWVQcm9jZXNzb3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQgPSBpbmplY3QoSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9USU1FT1VUKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9MT0dHRVIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlID0gaW5qZWN0KElNUE9SVFNfT1JDSEVTVFJBVE9SX0ZFQVRVUkVfUVVFVUUpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9yY2hlc3RyYXRpb24gPSBpbmplY3QoXG4gICAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9PUkNIRVNUUkFUSU9OXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJjZXB0b3IgPSBpbmplY3QoXG4gICAgSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9JTlRFUkNFUFRPUixcbiAgICB7IG9wdGlvbmFsOiB0cnVlIH1cbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgcHVibGljIGNyZWF0ZVF1ZXVlSXRlbShcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgZGVzdHJveSQ6IE9ic2VydmFibGU8dm9pZD4sXG4gICAgb3B0aW9uczogUGFydGlhbDxJbXBvcnRTZXJ2aWNlT3B0aW9ucz4gPSB7fVxuICApOiBSZWFkb25seTxJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtPiB7XG4gICAgY29uc3Qgb3B0czogSW1wb3J0U2VydmljZU9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaW5qZWN0b3I6IG9wdGlvbnMuaW5qZWN0b3IgPz8gdGhpcy5pbmplY3RvcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLnRpbWVvdXQsXG4gICAgfTtcblxuICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmltcG9ydHNGcm9tREkob3B0cy5pbmplY3Rvcik7XG4gICAgY29uc3QgcmVzb2x2ZUZuID0gdGhpcy5yZXNvbHZlRm5Gcm9tSW1wb3J0cyhpbXBvcnRzLCBpZGVudGlmaWVyKTtcblxuICAgIGNvbnN0IHByaW9yaXR5ID0gZmluZEltcG9ydFByaW9yaXR5KFxuICAgICAgdGhpcy5vcmNoZXN0cmF0aW9uLFxuICAgICAgaWRlbnRpZmllcixcbiAgICAgIHRoaXMubG9nZ2VyXG4gICAgKTtcblxuICAgIGNvbnN0IGhvb2tzOiBJbnRlcmNlcHRvckhvb2tzU3ViamVjdHMgPSB7XG4gICAgICBxdWV1ZWQ6IG5ldyBTdWJqZWN0KCksXG4gICAgICBzdGFydDogbmV3IFN1YmplY3QoKSxcbiAgICAgIGZpbmlzaDogbmV3IFN1YmplY3QoKSxcbiAgICAgIGVycm9yOiBuZXcgU3ViamVjdCgpLFxuICAgIH07XG5cbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0b3IpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcihpZGVudGlmaWVyLCBob29rcyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgaWRlbnRpZmllcixcbiAgICAgIHJlc29sdmVGbixcbiAgICAgIGRlc3Ryb3kkLFxuICAgICAgaG9va3MsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgdG9TdHJpbmc6ICgpID0+IGBAaWRlbnRpZmllcj1cIiR7aWRlbnRpZmllcn1cIiwgQHByaW9yaXR5PSR7cHJpb3JpdHl9YCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEl0ZW1Ub1F1ZXVlKFxuICAgIGl0ZW06IEltcG9ydHNPcmNoZXN0cmF0b3JRdWV1ZUl0ZW1cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGl0ZW0uY2FsbGJhY2sgPSAocmVzdWx0LCBlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMucXVldWUuaW5zZXJ0KGl0ZW0ucHJpb3JpdHksIGl0ZW0pO1xuICAgIGl0ZW0ubGlmZWN5Y2xlPy5pbXBvcnRRdWV1ZWQ/LmVtaXQoKTtcbiAgICBpdGVtLmhvb2tzLnF1ZXVlZC5uZXh0KGl0ZW0pO1xuICAgIGl0ZW0uaG9va3MucXVldWVkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgcXVldWUgaW5zZXJ0ICR7aXRlbS50b1N0cmluZygpfWApO1xuXG4gICAgdGhpcy5xdWV1ZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBieXBhc3NRdWV1ZShcbiAgICBpdGVtOiBJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBieXBhc3MgcXVldWUgJHtpdGVtLnRvU3RyaW5nKCl9YCk7XG5cbiAgICByZXR1cm4gaXRlbS5yZXNvbHZlRm4oaXRlbSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlSXRlbUZyb21RdWV1ZShcbiAgICBpdGVtOiBSZWFkb25seTxJbXBvcnRzT3JjaGVzdHJhdG9yUXVldWVJdGVtPlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50YWtlKGl0ZW0pICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGltcG9ydHNGcm9tREkoaW5qZWN0b3I6IEluamVjdG9yKTogSW1wb3J0c1N0b3JlIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmUgPSBpbmplY3Rvci5nZXQoSU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9JTVBPUlRTX1NUT1JFKTtcbiAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9IGNhdGNoICh4OiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgICBDb3VsZCBub3QgaW5qZWN0ICR7SU1QT1JUU19PUkNIRVNUUkFUT1JfRkVBVFVSRV9JTVBPUlRTX1NUT1JFfS4gRGlkIHlvdSBcXGBwcm92aWRlSW1wb3J0cyh7Li4ufSlcXGAgaW4gYSBjb21wb25lbnQgb3IgbW9kdWxlPyBJZiB5b3UgZGlkLCB5b3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBhbiBJbmplY3RvciB3aGVuIGNhbGxpbmcgY3JlYXRlUXVldWVJdGVtLlxuICAgICAgICAke3h9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRm5Gcm9tSW1wb3J0cyhcbiAgICBpbXBvcnRzOiBJbXBvcnRzU3RvcmUsXG4gICAgaWRlbnRpZmllcjogc3RyaW5nXG4gICk6IEltcG9ydFJlc29sdmVGbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmaW5kRm4oaW1wb3J0cywgaWRlbnRpZmllcik7XG4gICAgfSBjYXRjaCAoeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcbiAgICAgICAgQ291bGQgbm90IGZpbmQgSW1wb3J0UmVzb2x2ZUZuLiBEaWQgeW91IFxcYHByb3ZpZGVJbXBvcnRzKHsuLi59KVxcYCBpbiBhIGNvbXBvbmVudCBvciBtb2R1bGU/IElmIHlvdSBkaWQsIHlvdSBtYXkgbmVlZCB0byBwcm92aWRlIGFuIEluamVjdG9yIHdoZW4gY2FsbGluZyBjcmVhdGVRdWV1ZUl0ZW0uXG4gICAgICAgICR7eH1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==