@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
114 lines • 24 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { CoreModule, ModalComponent, ZipService } from '@c8y/ngx-components';
import { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';
import { firstValueFrom } from 'rxjs';
import { StaticAssetsService } from '@c8y/ngx-components/static-assets/data';
import { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/branding/shared/lazy/add-branding-modal";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@c8y/ngx-components/static-assets/data";
import * as i4 from "@c8y/ngx-components/branding/shared/data";
export class BrandingImportModalComponent {
constructor(addBrandingModalService, zip, staticAssets, brandings) {
this.addBrandingModalService = addBrandingModalService;
this.zip = zip;
this.staticAssets = staticAssets;
this.brandings = brandings;
this.result = new Promise((resolve, reject) => {
this._resovle = resolve;
this._reject = reject;
});
this.files = [];
this.loading = false;
}
async droppedFile(event) {
this.loading = true;
try {
this.files = event;
await this.import(event[0].file);
}
catch (e) {
console.error(e);
this.files = [];
this.loading = false;
return;
}
this.modal._close();
this._resovle();
}
async import(file) {
const versionDetails = await this.addBrandingModalService.openAddBrandingModal();
if (!versionDetails) {
throw Error('No version details provided');
}
try {
// verify if branding is already present
await this.brandings.getBrandingOptionsForVersion();
}
catch (e) {
// otherwise get started using branding
await this.brandings.getStartedUsingBranding();
}
const importedZipEntries = await firstValueFrom(this.zip.getEntries(file));
const staticAssetsEntry = importedZipEntries.find(entry => entry.filename === this.staticAssets.fileNames.exportZipName);
if (!staticAssetsEntry) {
throw Error(`Missing "${this.staticAssets.fileNames.exportZipName}" file in the uploaded zip.`);
}
const staticAssetsZip = await firstValueFrom(this.zip.getData(staticAssetsEntry));
const staticAssetsZipFile = new File([staticAssetsZip], staticAssetsEntry.filename);
const staticAssetsZipEntries = await firstValueFrom(this.zip.getEntries(staticAssetsZipFile));
const filesToAdd = new Array();
let oldAssets;
let newAssets;
for (const entry of staticAssetsZipEntries) {
if (entry.filename === this.brandings.fileNames.manifest) {
continue;
}
if (entry.filename === this.staticAssets.fileNames.contents) {
const fileContent = await (await firstValueFrom(this.zip.getData(entry))).text();
oldAssets = JSON.parse(fileContent);
continue;
}
const file = await firstValueFrom(this.zip.getData(entry));
filesToAdd.push(new File([file], entry.filename));
}
if (filesToAdd.length > 0) {
const currentStaticAssets = await this.staticAssets.listFilesCached('branding', true);
newAssets = await this.staticAssets.addFilesToStaticAssets('branding', filesToAdd, currentStaticAssets, false);
}
const publicOptionsEntry = importedZipEntries.find(entry => entry.filename === this.brandings.fileNames.exportZipName);
if (!publicOptionsEntry) {
throw Error(`Missing "${this.brandings.fileNames.exportZipName}" file in the uploaded zip.`);
}
const publicOptionsZip = await firstValueFrom(this.zip.getData(publicOptionsEntry));
const publicOptionsZipFile = new File([publicOptionsZip], publicOptionsEntry.filename);
const publicOptionsFiles = await firstValueFrom(this.zip.getEntries(publicOptionsZipFile));
const optionsFileEntry = publicOptionsFiles.find(entry => entry.filename === this.brandings.fileNames.options);
if (!optionsFileEntry) {
throw Error(`Missing "${this.brandings.fileNames.options}" file in "${this.brandings.fileNames.exportZipName}" file of the uploaded zip.`);
}
const optionsFile = await firstValueFrom(this.zip.getData(optionsFileEntry));
let options = JSON.parse(await optionsFile.text());
if (oldAssets.length && newAssets.length) {
options = this.brandings.replaceBrandingAssetsInBrandingOptions(options, oldAssets, newAssets);
}
const zip = await this.brandings.getBrandingZip(options);
await this.brandings.saveBranding(zip, `${versionDetails.brandingName}-1`, [
versionDetails.brandingName
]);
}
cancel() {
this._reject();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BrandingImportModalComponent, deps: [{ token: i1.AddBrandingModalService }, { token: i2.ZipService }, { token: i3.StaticAssetsService }, { token: i4.StoreBrandingService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BrandingImportModalComponent, isStandalone: true, selector: "c8y-branding-import-modal", viewQueries: [{ propertyName: "modal", first: true, predicate: ModalComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"'Import branding variant'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n [labels]=\"{ cancel: 'Cancel' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"import\"></span>\n </ng-container>\n <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n <p\n class=\"text-medium text-center text-16\"\n translate\n >\n Easily copy any branding variant from any tenant\n </p>\n <p translate class=\"p-t-8\">\n Export the branding variant from the source tenant and import the .zip file here. This process\n allows you to maintain consistent branding across multiple tenants efficiently.\n </p>\n </div>\n <div\n class=\"p-24 m-r-auto m-l-auto\"\n style=\"max-width: 300px\"\n >\n <c8y-drop-area\n [icon]=\"'upload'\"\n (dropped)=\"droppedFile($event)\"\n [files]=\"files\"\n [accept]=\"'.zip'\"\n [maxAllowedFiles]=\"1\"\n [loading]=\"loading\"\n ></c8y-drop-area>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i2.DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "component", type: i2.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BrandingImportModalComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-branding-import-modal', standalone: true, imports: [CoreModule], template: "<c8y-modal\n [title]=\"'Import branding variant'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n [labels]=\"{ cancel: 'Cancel' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"import\"></span>\n </ng-container>\n <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n <p\n class=\"text-medium text-center text-16\"\n translate\n >\n Easily copy any branding variant from any tenant\n </p>\n <p translate class=\"p-t-8\">\n Export the branding variant from the source tenant and import the .zip file here. This process\n allows you to maintain consistent branding across multiple tenants efficiently.\n </p>\n </div>\n <div\n class=\"p-24 m-r-auto m-l-auto\"\n style=\"max-width: 300px\"\n >\n <c8y-drop-area\n [icon]=\"'upload'\"\n (dropped)=\"droppedFile($event)\"\n [files]=\"files\"\n [accept]=\"'.zip'\"\n [maxAllowedFiles]=\"1\"\n [loading]=\"loading\"\n ></c8y-drop-area>\n </div>\n</c8y-modal>\n" }]
}], ctorParameters: () => [{ type: i1.AddBrandingModalService }, { type: i2.ZipService }, { type: i3.StaticAssetsService }, { type: i4.StoreBrandingService }], propDecorators: { modal: [{
type: ViewChild,
args: [ModalComponent, { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmRpbmctaW1wb3J0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2JyYW5kaW5nL3NoYXJlZC9sYXp5L2JyYW5kaW5nLWltcG9ydC1tb2RhbC9icmFuZGluZy1pbXBvcnQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vYnJhbmRpbmcvc2hhcmVkL2xhenkvYnJhbmRpbmctaW1wb3J0LW1vZGFsL2JyYW5kaW5nLWltcG9ydC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFlLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBZSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7QUFRaEYsTUFBTSxPQUFPLDRCQUE0QjtJQWF2QyxZQUNVLHVCQUFnRCxFQUNoRCxHQUFlLEVBQ2YsWUFBaUMsRUFDakMsU0FBK0I7UUFIL0IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBZHpDLFdBQU0sR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN4QixJQUFJLENBQUMs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T0FBTyxDQUFDLENBQUM7UUFFekQsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxjQUFjLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDekUsY0FBYyxDQUFDLFlBQVk7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQzsrR0E3SFUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsNEhBQzVCLGNBQWMsOERDZDNCLDhnQ0FtQ0EsMkNEeEJZLFVBQVU7OzRGQUVULDRCQUE0QjtrQkFOeEMsU0FBUzsrQkFDRSwyQkFBMkIsY0FFekIsSUFBSSxXQUNQLENBQUMsVUFBVSxDQUFDOzBMQUd3QixLQUFLO3NCQUFqRCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSwgRHJvcHBlZEZpbGUsIE1vZGFsQ29tcG9uZW50LCBaaXBTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBBZGRCcmFuZGluZ01vZGFsU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYnJhbmRpbmcvc2hhcmVkL2xhenkvYWRkLWJyYW5kaW5nLW1vZGFsJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdGF0aWNBc3NldCwgU3RhdGljQXNzZXRzU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvc3RhdGljLWFzc2V0cy9kYXRhJztcbmltcG9ydCB7IFN0b3JlQnJhbmRpbmdTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9icmFuZGluZy9zaGFyZWQvZGF0YSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1icmFuZGluZy1pbXBvcnQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJhbmRpbmctaW1wb3J0LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIEJyYW5kaW5nSW1wb3J0TW9kYWxDb21wb25lbnQge1xuICBAVmlld0NoaWxkKE1vZGFsQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBtb2RhbDogTW9kYWxDb21wb25lbnQ7XG5cbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuX3Jlc292bGUgPSByZXNvbHZlO1xuICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgfSk7XG4gIGZpbGVzOiBEcm9wcGVkRmlsZVtdID0gW107XG4gIGxvYWRpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIF9yZXNvdmxlOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZGRCcmFuZGluZ01vZGFsU2VydmljZTogQWRkQnJhbmRpbmdNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6aXA6IFppcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdGF0aWNBc3NldHM6IFN0YXRpY0Fzc2V0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBicmFuZGluZ3M6IFN0b3JlQnJhbmRpbmdTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBkcm9wcGVkRmlsZShldmVudDogRHJvcHBlZEZpbGVbXSkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZmlsZXMgPSBldmVudDtcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0KGV2ZW50WzBdLmZpbGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb2RhbC5fY2xvc2UoKTtcbiAgICB0aGlzLl9yZXNvdmxlKCk7XG4gIH1cblxuICBhc3luYyBpbXBvcnQoZmlsZTogRmlsZSkge1xuICAgIGNvbnN0IHZlcnNpb25EZXRhaWxzID0gYXdhaXQgdGhpcy5hZGRCcmFuZGluZ01vZGFsU2VydmljZS5vcGVuQWRkQnJhbmRpbmdNb2RhbCgpO1xuICAgIGlmICghdmVyc2lvbkRldGFpbHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdObyB2ZXJzaW9uIGRldGFpbHMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gdmVyaWZ5IGlmIGJyYW5kaW5nIGlzIGFscmVhZHkgcHJlc2VudFxuICAgICAgYXdhaXQgdGhpcy5icmFuZGluZ3MuZ2V0QnJhbmRpbmdPcHRpb25zRm9yVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIG90aGVyd2lzZSBnZXQgc3RhcnRlZCB1c2luZyBicmFuZGluZ1xuICAgICAgYXdhaXQgdGhpcy5icmFuZGluZ3MuZ2V0U3RhcnRlZFVzaW5nQnJhbmRpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRlZFppcEVudHJpZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnppcC5nZXRFbnRyaWVzKGZpbGUpKTtcbiAgICBjb25zdCBzdGF0aWNBc3NldHNFbnRyeSA9IGltcG9ydGVkWmlwRW50cmllcy5maW5kKFxuICAgICAgZW50cnkgPT4gZW50cnkuZmlsZW5hbWUgPT09IHRoaXMuc3RhdGljQXNzZXRzLmZpbGVOYW1lcy5leHBvcnRaaXBOYW1lXG4gICAgKTtcbiAgICBpZiAoIXN0YXRpY0Fzc2V0c0VudHJ5KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYE1pc3NpbmcgXCIke3RoaXMuc3RhdGljQXNzZXRzLmZpbGVOYW1lcy5leHBvcnRaaXBOYW1lfVwiIGZpbGUgaW4gdGhlIHVwbG9hZGVkIHppcC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzdGF0aWNBc3NldHNaaXAgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnppcC5nZXREYXRhKHN0YXRpY0Fzc2V0c0VudHJ5KSk7XG4gICAgY29uc3Qgc3RhdGljQXNzZXRzWmlwRmlsZSA9IG5ldyBGaWxlKFtzdGF0aWNBc3NldHNaaXBdLCBzdGF0aWNBc3NldHNFbnRyeS5maWxlbmFtZSk7XG4gICAgY29uc3Qgc3RhdGljQXNzZXRzWmlwRW50cmllcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuemlwLmdldEVudHJpZXMoc3RhdGljQXNzZXRzWmlwRmlsZSkpO1xuICAgIGNvbnN0IGZpbGVzVG9BZGQgPSBuZXcgQXJyYXk8RmlsZT4oKTtcbiAgICBsZXQgb2xkQXNzZXRzOiBBcnJheTxTdGF0aWNBc3NldD47XG4gICAgbGV0IG5ld0Fzc2V0czogQXJyYXk8U3RhdGljQXNzZXQ+O1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc3RhdGljQXNzZXRzWmlwRW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmZpbGVuYW1lID09PSB0aGlzLmJyYW5kaW5ncy5maWxlTmFtZXMubWFuaWZlc3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZmlsZW5hbWUgPT09IHRoaXMuc3RhdGljQXNzZXRzLmZpbGVOYW1lcy5jb250ZW50cykge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IChhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnppcC5nZXREYXRhKGVudHJ5KSkpLnRleHQoKTtcbiAgICAgICAgb2xkQXNzZXRzID0gSlNPTi5wYXJzZShmaWxlQ29udGVudCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuemlwLmdldERhdGEoZW50cnkpKTtcbiAgICAgIGZpbGVzVG9BZGQucHVzaChuZXcgRmlsZShbZmlsZV0sIGVudHJ5LmZpbGVuYW1lKSk7XG4gICAgfVxuICAgIGlmIChmaWxlc1RvQWRkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0aWNBc3NldHMgPSBhd2FpdCB0aGlzLnN0YXRpY0Fzc2V0cy5saXN0RmlsZXNDYWNoZWQoJ2JyYW5kaW5nJywgdHJ1ZSk7XG4gICAgICBuZXdBc3NldHMgPSBhd2FpdCB0aGlzLnN0YXRpY0Fzc2V0cy5hZGRGaWxlc1RvU3RhdGljQXNzZXRzKFxuICAgICAgICAnYnJhbmRpbmcnLFxuICAgICAgICBmaWxlc1RvQWRkLFxuICAgICAgICBjdXJyZW50U3RhdGljQXNzZXRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdWJsaWNPcHRpb25zRW50cnkgPSBpbXBvcnRlZFppcEVudHJpZXMuZmluZChcbiAgICAgIGVudHJ5ID0+IGVudHJ5LmZpbGVuYW1lID09PSB0aGlzLmJyYW5kaW5ncy5maWxlTmFtZXMuZXhwb3J0WmlwTmFtZVxuICAgICk7XG4gICAgaWYgKCFwdWJsaWNPcHRpb25zRW50cnkpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIFwiJHt0aGlzLmJyYW5kaW5ncy5maWxlTmFtZXMuZXhwb3J0WmlwTmFtZX1cIiBmaWxlIGluIHRoZSB1cGxvYWRlZCB6aXAuYCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY09wdGlvbnNaaXAgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnppcC5nZXREYXRhKHB1YmxpY09wdGlvbnNFbnRyeSkpO1xuICAgIGNvbnN0IHB1YmxpY09wdGlvbnNaaXBGaWxlID0gbmV3IEZpbGUoW3B1YmxpY09wdGlvbnNaaXBdLCBwdWJsaWNPcHRpb25zRW50cnkuZmlsZW5hbWUpO1xuXG4gICAgY29uc3QgcHVibGljT3B0aW9uc0ZpbGVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy56aXAuZ2V0RW50cmllcyhwdWJsaWNPcHRpb25zWmlwRmlsZSkpO1xuICAgIGNvbnN0IG9wdGlvbnNGaWxlRW50cnkgPSBwdWJsaWNPcHRpb25zRmlsZXMuZmluZChcbiAgICAgIGVudHJ5ID0+IGVudHJ5LmZpbGVuYW1lID09PSB0aGlzLmJyYW5kaW5ncy5maWxlTmFtZXMub3B0aW9uc1xuICAgICk7XG4gICAgaWYgKCFvcHRpb25zRmlsZUVudHJ5KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYE1pc3NpbmcgXCIke3RoaXMuYnJhbmRpbmdzLmZpbGVOYW1lcy5vcHRpb25zfVwiIGZpbGUgaW4gXCIke3RoaXMuYnJhbmRpbmdzLmZpbGVOYW1lcy5leHBvcnRaaXBOYW1lfVwiIGZpbGUgb2YgdGhlIHVwbG9hZGVkIHppcC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnNGaWxlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy56aXAuZ2V0RGF0YShvcHRpb25zRmlsZUVudHJ5KSk7XG4gICAgbGV0IG9wdGlvbnMgPSBKU09OLnBhcnNlKGF3YWl0IG9wdGlvbnNGaWxlLnRleHQoKSk7XG5cbiAgICBpZiAob2xkQXNzZXRzLmxlbmd0aCAmJiBuZXdBc3NldHMubGVuZ3RoKSB7XG4gICAgICBvcHRpb25zID0gdGhpcy5icmFuZGluZ3MucmVwbGFjZUJyYW5kaW5nQXNzZXRzSW5CcmFuZGluZ09wdGlvbnMoXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG9sZEFzc2V0cyxcbiAgICAgICAgbmV3QXNzZXRzXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHppcCA9IGF3YWl0IHRoaXMuYnJhbmRpbmdzLmdldEJyYW5kaW5nWmlwKG9wdGlvbnMpO1xuXG4gICAgYXdhaXQgdGhpcy5icmFuZGluZ3Muc2F2ZUJyYW5kaW5nKHppcCwgYCR7dmVyc2lvbkRldGFpbHMuYnJhbmRpbmdOYW1lfS0xYCwgW1xuICAgICAgdmVyc2lvbkRldGFpbHMuYnJhbmRpbmdOYW1lXG4gICAgXSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fcmVqZWN0KCk7XG4gIH1cbn1cbiIsIjxjOHktbW9kYWxcbiAgW3RpdGxlXT1cIidJbXBvcnQgYnJhbmRpbmcgdmFyaWFudCdcIlxuICBbaGVhZGVyQ2xhc3Nlc109XCInZGlhbG9nLWhlYWRlcidcIlxuICAob25EaXNtaXNzKT1cImNhbmNlbCgpXCJcbiAgW2xhYmVsc109XCJ7IGNhbmNlbDogJ0NhbmNlbCcgfVwiXG4+XG4gIDxuZy1jb250YWluZXIgYzh5LW1vZGFsLXRpdGxlPlxuICAgIDxzcGFuIGM4eUljb249XCJpbXBvcnRcIj48L3NwYW4+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwicC10LTE2IHAtYi0xNiBwLWwtMjQgcC1yLTI0IHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICA8cFxuICAgICAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LWNlbnRlciB0ZXh0LTE2XCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIEVhc2lseSBjb3B5IGFueSBicmFuZGluZyB2YXJpYW50IGZyb20gYW55IHRlbmFudFxuICAgIDwvcD5cbiAgICA8cCB0cmFuc2xhdGUgY2xhc3M9XCJwLXQtOFwiPlxuICAgICAgRXhwb3J0IHRoZSBicmFuZGluZyB2YXJpYW50IGZyb20gdGhlIHNvdXJjZSB0ZW5hbnQgYW5kIGltcG9ydCB0aGUgLnppcCBmaWxlIGhlcmUuIFRoaXMgcHJvY2Vzc1xuICAgICAgYWxsb3dzIHlvdSB0byBtYWludGFpbiBjb25zaXN0ZW50IGJyYW5kaW5nIGFjcm9zcyBtdWx0aXBsZSB0ZW5hbnRzIGVmZmljaWVudGx5LlxuICAgIDwvcD5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInAtMjQgbS1yLWF1dG8gbS1sLWF1dG9cIlxuICAgIHN0eWxlPVwibWF4LXdpZHRoOiAzMDBweFwiXG4gID5cbiAgICA8Yzh5LWRyb3AtYXJlYVxuICAgICAgW2ljb25dPVwiJ3VwbG9hZCdcIlxuICAgICAgKGRyb3BwZWQpPVwiZHJvcHBlZEZpbGUoJGV2ZW50KVwiXG4gICAgICBbZmlsZXNdPVwiZmlsZXNcIlxuICAgICAgW2FjY2VwdF09XCInLnppcCdcIlxuICAgICAgW21heEFsbG93ZWRGaWxlc109XCIxXCJcbiAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgID48L2M4eS1kcm9wLWFyZWE+XG4gIDwvZGl2PlxuPC9jOHktbW9kYWw+XG4iXX0=