UNPKG

@csvbox/angular2

Version:

Standalone Angular component for csvbox.io supporting Angular version 14 till 20

331 lines 43.3 kB
import { Component, ViewChild, Input, SecurityContext } from '@angular/core'; import { insertCSS } from './utils/insertCSS'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; const appVersion = '1.1.16'; export class CSVBoxButtonComponent { constructor(sanitizer) { this.sanitizer = sanitizer; this.isModalShown = false; this.user = null; this.dynamicColumns = null; this.licenseKey = null; this.options = null; this.uuid = ''; this.customDomain = null; this.dataLocation = null; this.language = null; this.environment = null; this.theme = null; this.isIframeLoaded = false; this.openModalOnIframeLoad = false; this.lazy = false; this.safeUrl = null; this.iframe = null; this.disabled = true; this.holder = null; } ngOnInit() { this.uuid = this.generateUuid(); let domain = this.customDomain ? this.customDomain : "app.csvbox.io"; if (this.dataLocation) { domain = `${this.dataLocation}-${domain}`; } let iframeUrl = `https://${domain}/embed/${this.licenseKey}`; iframeUrl += `?library-version=${appVersion}`; iframeUrl += "&framework=angular"; if (this.dataLocation) { iframeUrl += "&preventRedirect"; } if (this.language) { iframeUrl += "&language=" + this.language; } if (this.theme) { iframeUrl += "&theme=" + this.theme; } if (this.environment) { const environment = JSON.stringify(this.environment).replace(/['"]/g, (match) => '\\' + match); iframeUrl += `&env=${environment}`; } this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl)); } generateUuid() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } ngOnChanges(changes) { if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) { this.updateUserVariable(changes['user'].currentValue); } } updateUserVariable(data) { this.user = data; if (this.iframe && this.iframe.contentWindow) { this.iframe.contentWindow.postMessage({ "customer": data }, "*"); } } ngAfterContentInit() { window.addEventListener("message", (event) => { if (event && typeof event.data === "object") { if (event.data && event.data.data && event.data.data.unique_token === this.uuid) { if (event.data.type && event.data.type === "data-on-submit") { const metadata = event.data.data; metadata["column_mappings"] = event.data.column_mapping; delete metadata["unique_token"]; if (this.onSubmit) this.onSubmit(metadata); if (this.isSubmitted) this.isSubmitted(metadata); if (this.submitted) this.submitted(); } else if (event.data.type && event.data.type === "data-push-status") { if (event.data.data.import_status === "success") { if (event.data.row_data) { const primary_row_data = event.data.row_data; const headers = event.data.headers; const rows = []; const dynamic_columns_indexes = event.data.dynamicColumnsIndexes; const virtual_columns_indexes = event.data.virtualColumnsIndexes || []; primary_row_data.forEach((row_data) => { const x = {}; const dynamic_columns = {}; const virtual_data = {}; row_data.data && row_data.data.forEach((col, i) => { if (col === undefined) { col = ""; } if (dynamic_columns_indexes.includes(i)) { dynamic_columns[headers[i]] = col; } else if (virtual_columns_indexes.includes(i)) { virtual_data[headers[i]] = col; } else { x[headers[i]] = col; } }); if (row_data && row_data.unmapped_data) { x["_unmapped_data"] = row_data.unmapped_data; } if (dynamic_columns && Object.keys(dynamic_columns).length > 0) { x["_dynamic_data"] = dynamic_columns; } if (virtual_data && Object.keys(virtual_data).length > 0) { x["_virtual_data"] = virtual_data; } rows.push(x); }); const metadata = event.data.data; metadata["rows"] = rows; metadata["column_mappings"] = event.data.column_mapping; metadata["raw_columns"] = event.data.raw_columns; metadata["ignored_columns"] = event.data.ignored_column_row; delete metadata["unique_token"]; if (this.onImport) this.onImport(true, metadata); if (this.isImported) this.isImported(true, metadata); if (this.imported) this.imported(true, metadata); } else { const metadata = event.data.data; delete metadata["unique_token"]; if (this.onImport) this.onImport(true, metadata); if (this.isImported) this.isImported(true, metadata); if (this.imported) this.imported(true, metadata); } } else { const metadata = event.data.data; delete metadata["unique_token"]; if (this.onImport) this.onImport(false, metadata); if (this.isImported) this.isImported(false, metadata); if (this.imported) this.imported(false, metadata); } } else if (event.data.type && event.data.type === "csvbox-modal-hidden") { if (this.holder) this.holder.style.display = 'none'; this.isModalShown = false; if (this.onClose) this.onClose(); if (this.isClosed) this.isClosed(); if (this.closed) this.closed(); } else if (event.data.type && event.data.type === "csvbox-upload-successful") { if (this.onImport) this.onImport(true); if (this.isImported) this.isImported(true); if (this.imported) this.imported(true); } else if (event.data.type && event.data.type === "csvbox-upload-failed") { if (this.onImport) this.onImport(false); if (this.isImported) this.isImported(false); if (this.imported) this.imported(false); } } } }, false); if (this.lazy) { this.disabled = false; } else { this.disabled = true; this.initImporter(); } } initImporter() { if (this.loadStarted) this.loadStarted(); insertCSS(); const iframe = document.createElement("iframe"); this.iframe = iframe; iframe.setAttribute("src", this.safeUrl?.toString() || ''); iframe.frameBorder = "0"; const self = this; iframe.onload = function () { if (self.onReady) self.onReady(); if (self.isReady) self.isReady(); if (self.importerReady) self.importerReady(); self.disabled = false; self.isIframeLoaded = true; if (self.iframe && self.iframe.contentWindow) { self.iframe.contentWindow.postMessage({ "customer": self.user ? self.user : null, "columns": self.dynamicColumns ? self.dynamicColumns : null, "options": self.options ? self.options : null, "unique_token": self.uuid }, "*"); } if (self.openModalOnIframeLoad) { self.openModal(); } }; this.holder = document.createElement('div'); this.holder.classList.add('csvbox-holder'); this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`); this.holder.appendChild(iframe); document.body.insertAdjacentElement('beforeend', this.holder); } openModal() { if (this.lazy) { if (!this.iframe) { this.openModalOnIframeLoad = true; this.initImporter(); return; } } if (!this.isModalShown) { if (this.isIframeLoaded) { this.isModalShown = true; if (this.holder) this.holder.style.display = 'block'; if (this.iframe && this.iframe.contentWindow) { this.iframe.contentWindow.postMessage('openModal', '*'); } } else { this.openModalOnIframeLoad = true; } } } } CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); CSVBoxButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CSVBoxButtonComponent, isStandalone: true, selector: "csvbox-button", inputs: { onImport: "onImport", onReady: "onReady", onClose: "onClose", onSubmit: "onSubmit", isImported: "isImported", isReady: "isReady", isClosed: "isClosed", isSubmitted: "isSubmitted", importerReady: "importerReady", closed: "closed", submitted: "submitted", imported: "imported", loadStarted: "loadStarted", user: "user", dynamicColumns: "dynamicColumns", licenseKey: "licenseKey", options: "options", uuid: "uuid", customDomain: "customDomain", dataLocation: "dataLocation", language: "language", environment: "environment", theme: "theme", isIframeLoaded: "isIframeLoaded", openModalOnIframeLoad: "openModalOnIframeLoad", lazy: "lazy", disabled: "disabled" }, viewQueries: [{ propertyName: "initiator", first: true, predicate: ["initiator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <div> <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid"> <ng-content></ng-content> </button> </div> `, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, decorators: [{ type: Component, args: [{ selector: 'csvbox-button', standalone: true, template: ` <div> <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid"> <ng-content></ng-content> </button> </div> ` }] }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { initiator: [{ type: ViewChild, args: ['initiator', { static: false }] }], onImport: [{ type: Input }], onReady: [{ type: Input }], onClose: [{ type: Input }], onSubmit: [{ type: Input }], isImported: [{ type: Input }], isReady: [{ type: Input }], isClosed: [{ type: Input }], isSubmitted: [{ type: Input }], importerReady: [{ type: Input }], closed: [{ type: Input }], submitted: [{ type: Input }], imported: [{ type: Input }], loadStarted: [{ type: Input }], user: [{ type: Input }], dynamicColumns: [{ type: Input }], licenseKey: [{ type: Input }], options: [{ type: Input }], uuid: [{ type: Input }], customDomain: [{ type: Input }], dataLocation: [{ type: Input }], language: [{ type: Input }], environment: [{ type: Input }], theme: [{ type: Input }], isIframeLoaded: [{ type: Input }], openModalOnIframeLoad: [{ type: Input }], lazy: [{ type: Input }], disabled: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBYzVCLE1BQU0sT0FBTyxxQkFBcUI7SUE0Q2hDLFlBQW1CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUExQzFDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBbUJaLFNBQUksR0FBa0MsSUFBSSxDQUFDO1FBQzNDLG1CQUFjLEdBQWtDLElBQUksQ0FBQztRQUNyRCxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxZQUFPLEdBQWtDLElBQUksQ0FBQztRQUM5QyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDL0IsZ0JBQVcsR0FBa0MsSUFBSSxDQUFDO1FBRWxELFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBRS9CLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFJbEMsV0FBTSxHQUEwQixJQUFJLENBQUM7SUFGUSxDQUFDO0lBSTlDLFFB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBTZWN1cml0eUNvbnRleHQsXHJcbiAgQWZ0ZXJDb250ZW50SW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4vdXRpbHMvaW5zZXJ0Q1NTJztcclxuXHJcbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHsgc3RhdGljOiBmYWxzZSB9KSBpbml0aWF0b3I6IGFueTtcclxuICBASW5wdXQoKSBvbkltcG9ydD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvblJlYWR5PzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvbkNsb3NlPzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvblN1Ym1pdD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSBpc0ltcG9ydGVkPzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIGlzUmVhZHk/OiAoKSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBjbG9zZWQ/OiAoKSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86ICgpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ/OiAoKSA9PiB2b2lkO1xyXG5cclxuICBASW5wdXQoKSB1c2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2FmZVVybDogU2FmZVVybCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7fVxyXG5cclxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51dWlkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGxldCBkb21haW4gPSB0aGlzLmN1c3RvbURvbWFpbiA/IHRoaXMuY3VzdG9tRG9tYWluIDogXCJhcHAuY3N2Ym94LmlvXCI7XHJcbiAgICBpZiAodGhpcy5kYXRhTG9jYXRpb24pIHsgZG9tYWluID0gYCR7dGhpcy5kYXRhTG9jYXRpb259LSR7ZG9tYWlufWA7IH1cclxuICAgIGxldCBpZnJhbWVVcmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn0vZW1iZWQvJHt0aGlzLmxpY2Vuc2VLZXl9YDtcclxuICAgIGlmcmFtZVVybCArPSBgP2xpYnJhcnktdmVyc2lvbj0ke2FwcFZlcnNpb259YDtcclxuICAgIGlmcmFtZVVybCArPSBcIiZmcmFtZXdvcms9YW5ndWxhclwiO1xyXG4gICAgaWYgKHRoaXMuZGF0YUxvY2F0aW9uKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZwcmV2ZW50UmVkaXJlY3RcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxhbmd1YWdlKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZsYW5ndWFnZT1cIiArIHRoaXMubGFuZ3VhZ2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aGVtZSkge1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImdGhlbWU9XCIgKyB0aGlzLnRoZW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQpIHtcclxuICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVudmlyb25tZW50KS5yZXBsYWNlKC9bJ1wiXS9nLCAobWF0Y2gpID0+ICdcXFxcJyArIG1hdGNoKTtcclxuICAgICAgaWZyYW1lVXJsICs9IGAmZW52PSR7ZW52aXJvbm1lbnR9YDtcclxuICAgIH1cclxuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVXVpZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3VzZXInXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWyd1c2VyJ10ucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJWYXJpYWJsZShkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgXCJjdXN0b21lclwiOiBkYXRhXHJcbiAgICAgIH0sIFwiKlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLmRhdGEgJiYgZXZlbnQuZGF0YS5kYXRhLnVuaXF1ZV90b2tlbiA9PT0gdGhpcy51dWlkKSB7XHJcbiAgICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJkYXRhLXB1c2gtc3RhdHVzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGF0YS5pbXBvcnRfc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnJvd19kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5X3Jvd19kYXRhID0gZXZlbnQuZGF0YS5yb3dfZGF0YTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBldmVudC5kYXRhLmhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY19jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLmR5bmFtaWNDb2x1bW5zSW5kZXhlcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxfY29sdW1uc19pbmRleGVzID0gZXZlbnQuZGF0YS52aXJ0dWFsQ29sdW1uc0luZGV4ZXMgfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgcHJpbWFyeV9yb3dfZGF0YS5mb3JFYWNoKChyb3dfZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHg6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY19jb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxfZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgcm93X2RhdGEuZGF0YSAmJiByb3dfZGF0YS5kYXRhLmZvckVhY2goKGNvbDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sID09PSB1bmRlZmluZWQpIHsgY29sID0gXCJcIjsgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jb2x1bW5zX2luZGV4ZXMuaW5jbHVkZXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29sdW1uc1toZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZpcnR1YWxfY29sdW1uc19pbmRleGVzLmluY2x1ZGVzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsX2RhdGFbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHhbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJvd19kYXRhICYmIHJvd19kYXRhLnVubWFwcGVkX2RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB4W1wiX3VubWFwcGVkX2RhdGFcIl0gPSByb3dfZGF0YS51bm1hcHBlZF9kYXRhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX2NvbHVtbnMgJiYgT2JqZWN0LmtleXMoZHluYW1pY19jb2x1bW5zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeFtcIl9keW5hbWljX2RhdGFcIl0gPSBkeW5hbWljX2NvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKHZpcnR1YWxfZGF0YSAmJiBPYmplY3Qua2V5cyh2aXJ0dWFsX2RhdGEpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB4W1wiX3ZpcnR1YWxfZGF0YVwiXSA9IHZpcnR1YWxfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByb3dzLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyb3dzXCJdID0gcm93cztcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wiY29sdW1uX21hcHBpbmdzXCJdID0gZXZlbnQuZGF0YS5jb2x1bW5fbWFwcGluZztcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicmF3X2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLnJhd19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJpZ25vcmVkX2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLmlnbm9yZWRfY29sdW1uX3JvdztcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5sYXp5KSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEltcG9ydGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcclxuXHJcbiAgICBpbnNlcnRDU1MoKTtcclxuXHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XHJcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybD8udG9TdHJpbmcoKSB8fCAnJyk7XHJcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xyXG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcclxuICAgICAgaWYgKHNlbGYuaW1wb3J0ZXJSZWFkeSkgc2VsZi5pbXBvcnRlclJlYWR5KCk7XHJcblxyXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xyXG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgXCJjdXN0b21lclwiOiBzZWxmLnVzZXIgPyBzZWxmLnVzZXIgOiBudWxsLFxyXG4gICAgICAgICAgXCJjb2x1bW5zXCI6IHNlbGYuZHluYW1pY0NvbHVtbnMgPyBzZWxmLmR5bmFtaWNDb2x1bW5zIDogbnVsbCxcclxuICAgICAgICAgIFwib3B0aW9uc1wiOiBzZWxmLm9wdGlvbnMgPyBzZWxmLm9wdGlvbnMgOiBudWxsLFxyXG4gICAgICAgICAgXCJ1bmlxdWVfdG9rZW5cIjogc2VsZi51dWlkXHJcbiAgICAgICAgfSwgXCIqXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xyXG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xyXG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XHJcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG5cclxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxyXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5sYXp5KSB7XHJcbiAgICAgIGlmICghdGhpcy5pZnJhbWUpIHtcclxuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pc01vZGFsU2hvd24pIHtcclxuICAgICAgaWYgKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcclxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==