@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
175 lines • 21.8 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Injectable, inject } from '@angular/core';
import { Observable, forkJoin, from, of } from 'rxjs';
import { concatMap, shareReplay, take } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class ResourceLoaderConfig {
}
class LoadRequest {
get isFinished() {
return this.finished;
}
constructor(asset, document, config) {
this.asset = asset;
this.document = document;
this.config = config;
this.finished = false;
}
run() {
if (this.asset[0] === 'style') {
return this.loadStyle();
}
return this.loadScript();
}
loadStyle() {
return (this.request ??
(this.request = new Observable((observer) => {
const url = this.buildUrl(this.asset[1]);
const style = this.document.createElement('link');
style.href = url;
style.rel = 'stylesheet';
style.onload = () => {
observer.next(this.asset);
observer.complete();
this.finished = true;
};
style.onerror = (err) => {
observer.error(err);
this.finished = true;
};
const attributes = this.asset[2];
if (attributes) {
for (const key in attributes) {
if (attributes.hasOwnProperty(key)) {
style.setAttribute(key, attributes[key]);
}
}
}
this.document.head.appendChild(style);
}).pipe(take(1), shareReplay(1))));
}
loadScript() {
return (this.request ??
(this.request = new Observable((observer) => {
const url = this.buildUrl(this.asset[1]);
const script = this.document.createElement('script');
script.src = url;
script.onload = () => {
observer.next(this.asset);
observer.complete();
this.finished = true;
};
script.onerror = (err) => {
observer.error(err);
this.finished = true;
};
const attributes = this.asset[2];
if (attributes) {
for (const key in attributes) {
if (attributes.hasOwnProperty(key)) {
script.setAttribute(key, attributes[key]);
}
}
}
this.document.head.appendChild(script);
}).pipe(take(1), shareReplay(1))));
}
buildUrl(url) {
if (!this.config?.useDocumentBaseURI) {
return url;
}
if (url.startsWith('http')) {
return url;
}
if (!url.startsWith(document.baseURI)) {
url = url.startsWith('/') ? url.slice(1) : url;
return document.baseURI + url;
}
return url;
}
}
/**
* Services that dynamically inject scripts and styles elements to the DOM.
*/
export class ResourceLoaderService {
constructor() {
this.document = inject(DOCUMENT);
this.config = inject(ResourceLoaderConfig, { optional: true });
this.requests = new Map();
}
waitForPendings() {
return new Promise((resolve) => {
const interval = setInterval(() => {
for (const request of this.requests.values()) {
if (!request.isFinished) {
return;
}
}
clearInterval(interval);
resolve();
}, 100);
});
}
/**
* Injects styles and scripts from given urls to the head of the DOM.
* This method loads assets from same url once and the assets are
* loaded in the same order that given.
* @param resources Resources to load.
*/
loadAllSync(resources) {
if (!resources.length) {
return of([]);
}
const requests = this.createRequests(resources);
return new Observable((observer) => {
const response = [];
const subs = from(requests)
.pipe(concatMap((e) => e.run()))
.subscribe((e) => {
response.push(e);
if (response.length === resources.length) {
observer.next(response);
observer.complete();
}
});
return () => {
subs?.unsubscribe();
};
});
}
/**
* Injects styles and scripts from given urls to target place in DOM
* This method loads style and script from same url once.
* @param resources Resources to load.
*/
loadAllAsync(resources) {
if (!resources.length) {
return of([]);
}
const loaders = this.createRequests(resources);
return forkJoin(loaders.map((e) => e.run()));
}
createRequests(resources) {
return resources.map((asset) => {
const url = asset[1];
let request = this.requests.get(url);
if (!request) {
this.requests.set(url, (request = new LoadRequest(asset, this.document, this.config)));
}
return request;
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: ResourceLoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: ResourceLoaderService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: ResourceLoaderService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
export const ResourceLoaderConfigProvider = (config) => ({
provide: ResourceLoaderConfig,
useValue: config,
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ2Uvc2VydmljZXMvc3JjL3Jlc291cmNlLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBOztBQUU3RCxNQUFNLE9BQU8sb0JBQW9CO0NBS2hDO0FBVUQsTUFBTSxXQUFXO0lBSWYsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxZQUNtQixLQUFtQixFQUNuQixRQUFrQixFQUNsQixNQUFvQztRQUZwQyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBOEI7UUFUL0MsYUFBUSxHQUFHLEtBQUssQ0FBQTtJQVVyQixDQUFDO0lBRUosR0FBRztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLENBQ0wsSUFBSSxDQUFDLE9BQU87WUFDWixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxVQUFVLENB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QXFCO2tIQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUF5RUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxNQUFxQyxFQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLE9BQU8sRUFBRSxvQkFBb0I7SUFDN0IsUUFBUSxFQUFFLE1BQU07Q0FDakIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNvbmNhdE1hcCwgc2hhcmVSZXBsYXksIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9hZGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBkb2N1bWVudC5iYXNlVVJJIHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgdXJsIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkIGlmIHRoZSB1cmwgaXMgcmVsYXRpdmUuXG4gICAqL1xuICB1c2VEb2N1bWVudEJhc2VVUkk/OiBib29sZWFuXG59XG5cbi8qKlxuICogIEFuIGFycmF5IG9mIFt0eXBlLCB1cmwsIGF0dHJpYnV0ZXNdIHR1cGxlIHdoZXJlOlxuICogIC0gYHR5cGVgIGlzIHRoZSB0eXBlIG9mIGFuIGFzc2V0IHRvIGxvYWQgYHNjcmlwdGB8IGBzdHlsZWBcbiAqICAtIGB1cmxgIGlzIHRoZSB1cmwgdG8gYSBzdHlsZS9zY3JpcHQgdG8gbG9hZFxuICogIC0gYGF0dHJpYnV0ZXNgIGlzIGEgbWFwIG9mIG9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYWRkIHRvIHRoZSBlbGVtZW50LlxuICovXG5kZWNsYXJlIHR5cGUgUmVzb3VyY2VJbmZvID0gWydzdHlsZScgfCAnc2NyaXB0Jywgc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+P11cblxuY2xhc3MgTG9hZFJlcXVlc3Qge1xuICBwcml2YXRlIHJlcXVlc3Q/OiBPYnNlcnZhYmxlPFJlc291cmNlSW5mbz5cbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgZ2V0IGlzRmluaXNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoZWRcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXNzZXQ6IFJlc291cmNlSW5mbyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZz86IFJlc291cmNlTG9hZGVyQ29uZmlnIHwgbnVsbFxuICApIHt9XG5cbiAgcnVuKCkge1xuICAgIGlmICh0aGlzLmFzc2V0WzBdID09PSAnc3R5bGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkU3R5bGUoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkU2NyaXB0KClcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0eWxlKCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVxdWVzdCA/P1xuICAgICAgKHRoaXMucmVxdWVzdCA9IG5ldyBPYnNlcnZhYmxlPFJlc291cmNlSW5mbz4oKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVcmwodGhpcy5hc3NldFsxXSlcbiAgICAgICAgY29uc3Qgc3R5bGU6IEhUTUxMaW5rRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpXG4gICAgICAgIHN0eWxlLmhyZWYgPSB1cmxcbiAgICAgICAgc3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnXG5cbiAgICAgICAgc3R5bGUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQodGhpcy5hc3NldClcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycilcbiAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXNzZXRbMl1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKVxuICAgICAgfSkucGlwZSh0YWtlKDEpLCBzaGFyZVJlcGxheSgxKSkpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2NyaXB0KCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVxdWVzdCA/P1xuICAgICAgKHRoaXMucmVxdWVzdCA9IG5ldyBPYnNlcnZhYmxlPFJlc291cmNlSW5mbz4oKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVcmwodGhpcy5hc3NldFsxXSlcbiAgICAgICAgY29uc3Qgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICAgICAgc2NyaXB0LnNyYyA9IHVybFxuXG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLmFzc2V0KVxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcbiAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycilcbiAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXNzZXRbMl1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdClcbiAgICAgIH0pLnBpcGUodGFrZSgxKSwgc2hhcmVSZXBsYXkoMSkpKVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy51c2VEb2N1bWVudEJhc2VVUkkpIHtcbiAgICAgIHJldHVybiB1cmxcbiAgICB9XG5cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgcmV0dXJuIHVybFxuICAgIH1cblxuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoZG9jdW1lbnQuYmFzZVVSSSkpIHtcbiAgICAgIHVybCA9IHVybC5zdGFydHNXaXRoKCcvJykgPyB1cmwuc2xpY2UoMSkgOiB1cmxcbiAgICAgIHJldHVybiBkb2N1bWVudC5iYXNlVVJJICsgdXJsXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG59XG5cbi8qKlxuICogU2VydmljZXMgdGhhdCBkeW5hbWljYWxseSBpbmplY3Qgc2NyaXB0cyBhbmQgc3R5bGVzIGVsZW1lbnRzIHRvIHRoZSBET00uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvYWRlclNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKVxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChSZXNvdXJjZUxvYWRlckNvbmZpZywgeyBvcHRpb25hbDogdHJ1ZSB9KVxuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RzID0gbmV3IE1hcDxzdHJpbmcsIExvYWRSZXF1ZXN0PigpXG5cbiAgd2FpdEZvclBlbmRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiB0aGlzLnJlcXVlc3RzLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKCFyZXF1ZXN0LmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0sIDEwMClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdHMgc3R5bGVzIGFuZCBzY3JpcHRzIGZyb20gZ2l2ZW4gdXJscyB0byB0aGUgaGVhZCBvZiB0aGUgRE9NLlxuICAgKiBUaGlzIG1ldGhvZCBsb2FkcyBhc3NldHMgZnJvbSBzYW1lIHVybCBvbmNlIGFuZCB0aGUgYXNzZXRzIGFyZVxuICAgKiBsb2FkZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCBnaXZlbi5cbiAgICogQHBhcmFtIHJlc291cmNlcyBSZXNvdXJjZXMgdG8gbG9hZC5cbiAgICovXG4gIGxvYWRBbGxTeW5jKHJlc291cmNlczogUmVzb3VyY2VJbmZvW10pOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb1tdPiB7XG4gICAgaWYgKCFyZXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb2YoW10pXG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5jcmVhdGVSZXF1ZXN0cyhyZXNvdXJjZXMpXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJlc291cmNlSW5mb1tdPigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNvdXJjZUluZm9bXSA9IFtdXG4gICAgICBjb25zdCBzdWJzID0gZnJvbShyZXF1ZXN0cylcbiAgICAgICAgLnBpcGUoY29uY2F0TWFwKChlKSA9PiBlLnJ1bigpKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlLnB1c2goZSlcbiAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID09PSByZXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlc3BvbnNlKVxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHN1YnM/LnVuc3Vic2NyaWJlKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdHMgc3R5bGVzIGFuZCBzY3JpcHRzIGZyb20gZ2l2ZW4gdXJscyB0byB0YXJnZXQgcGxhY2UgaW4gRE9NXG4gICAqIFRoaXMgbWV0aG9kIGxvYWRzIHN0eWxlIGFuZCBzY3JpcHQgZnJvbSBzYW1lIHVybCBvbmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFJlc291cmNlcyB0byBsb2FkLlxuICAgKi9cbiAgbG9hZEFsbEFzeW5jKHJlc291cmNlczogUmVzb3VyY2VJbmZvW10pOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb1tdPiB7XG4gICAgaWYgKCFyZXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb2YoW10pXG4gICAgfVxuICAgIGNvbnN0IGxvYWRlcnMgPSB0aGlzLmNyZWF0ZVJlcXVlc3RzKHJlc291cmNlcylcbiAgICByZXR1cm4gZm9ya0pvaW4obG9hZGVycy5tYXAoKGUpID0+IGUucnVuKCkpKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZXF1ZXN0cyhyZXNvdXJjZXM6IFJlc291cmNlSW5mb1tdKTogTG9hZFJlcXVlc3RbXSB7XG4gICAgcmV0dXJuIHJlc291cmNlcy5tYXAoKGFzc2V0KSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSBhc3NldFsxXVxuICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzLmdldCh1cmwpXG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0cy5zZXQodXJsLCAocmVxdWVzdCA9IG5ldyBMb2FkUmVxdWVzdChhc3NldCwgdGhpcy5kb2N1bWVudCwgdGhpcy5jb25maWcpKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVzb3VyY2VMb2FkZXJDb25maWdQcm92aWRlciA9IChjb25maWc6IFBhcnRpYWw8UmVzb3VyY2VMb2FkZXJDb25maWc+KTogYW55ID0+ICh7XG4gIHByb3ZpZGU6IFJlc291cmNlTG9hZGVyQ29uZmlnLFxuICB1c2VWYWx1ZTogY29uZmlnLFxufSlcbiJdfQ==