@csvbox/angular
Version:
Angular adapter for csvbox.io
430 lines • 44.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/csvbox-button.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { insertCSS } from '../utlis/insertCSS';
/** @type {?} */
const appVersion = '1.1.16';
export class CSVBoxButtonComponent {
/**
* @param {?} sanitizer
*/
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.isModalShown = false;
this.uuid = null;
this.customDomain = null;
this.dataLocation = null;
this.language = null;
this.theme = null;
this.isIframeLoaded = false;
this.openModalOnIframeLoad = false;
this.lazy = false;
this.iframe = null;
this.disabled = true;
}
/**
* @return {?}
*/
ngOnInit() {
this.uuid = this.generateUuid();
/** @type {?} */
let domain = this.customDomain ? this.customDomain : "app.csvbox.io";
if (this.dataLocation) {
domain = `${this.dataLocation}-${domain}`;
}
/** @type {?} */
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.environment) {
/** @type {?} */
let environment = JSON.stringify(this.environment).replace(/['"]/g, (/**
* @param {?} match
* @return {?}
*/
function (match) {
return '\\' + match;
}));
iframeUrl += `&env=${environment}`;
}
if (this.theme) {
iframeUrl += "&theme" + this.theme;
}
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
}
/**
* @return {?}
*/
generateUuid() {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
this.updateUserVariabe(changes['user'].currentValue);
}
}
/**
* @param {?} data
* @return {?}
*/
updateUserVariabe(data) {
this.user = data;
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage({
"customer": data
}, "*");
}
}
/**
* @return {?}
*/
ngAfterContentInit() {
window.addEventListener("message", (/**
* @param {?} event
* @return {?}
*/
(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") {
/** @type {?} */
let 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(metadata);
}
else if (event.data.type && event.data.type == "data-push-status") {
if (event.data.data.import_status == "success") {
if (event.data.row_data) {
/** @type {?} */
let primary_row_data = event.data.row_data;
/** @type {?} */
let headers = event.data.headers;
/** @type {?} */
let rows = [];
/** @type {?} */
let dynamic_columns_indexes = event.data.dynamicColumnsIndexes;
/** @type {?} */
let virtual_columns_indexes = event.data.virtualColumnsIndexes || [];
primary_row_data.forEach((/**
* @param {?} row_data
* @return {?}
*/
(row_data) => {
/** @type {?} */
let x = {};
/** @type {?} */
let dynamic_columns = {};
/** @type {?} */
let virtual_data = {};
row_data.data && row_data.data.forEach((/**
* @param {?} col
* @param {?} i
* @return {?}
*/
(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);
}));
/** @type {?} */
let 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 {
/** @type {?} */
let 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 {
/** @type {?} */
let 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();
}
}
/**
* @return {?}
*/
initImporter() {
if (this.loadStarted)
this.loadStarted();
insertCSS();
/** @type {?} */
let iframe = document.createElement("iframe");
this.iframe = iframe;
iframe.setAttribute("src", this.safeUrl);
iframe.frameBorder = "0";
/** @type {?} */
let self = this;
iframe.onload = (/**
* @return {?}
*/
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);
}
/**
* @return {?}
*/
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.decorators = [
{ type: Component, args: [{
selector: 'csvbox-button',
template: `
<div>
<button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid">
<ng-content></ng-content>
</button>
</div>
`
}] }
];
/** @nocollapse */
CSVBoxButtonComponent.ctorParameters = () => [
{ type: DomSanitizer }
];
CSVBoxButtonComponent.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 }]
};
if (false) {
/** @type {?} */
CSVBoxButtonComponent.prototype.isModalShown;
/** @type {?} */
CSVBoxButtonComponent.prototype.initiator;
/** @type {?} */
CSVBoxButtonComponent.prototype.onImport;
/** @type {?} */
CSVBoxButtonComponent.prototype.onReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.onClose;
/** @type {?} */
CSVBoxButtonComponent.prototype.onSubmit;
/** @type {?} */
CSVBoxButtonComponent.prototype.isImported;
/** @type {?} */
CSVBoxButtonComponent.prototype.isReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.isClosed;
/** @type {?} */
CSVBoxButtonComponent.prototype.isSubmitted;
/** @type {?} */
CSVBoxButtonComponent.prototype.importerReady;
/** @type {?} */
CSVBoxButtonComponent.prototype.closed;
/** @type {?} */
CSVBoxButtonComponent.prototype.submitted;
/** @type {?} */
CSVBoxButtonComponent.prototype.imported;
/** @type {?} */
CSVBoxButtonComponent.prototype.loadStarted;
/** @type {?} */
CSVBoxButtonComponent.prototype.user;
/** @type {?} */
CSVBoxButtonComponent.prototype.dynamicColumns;
/** @type {?} */
CSVBoxButtonComponent.prototype.licenseKey;
/** @type {?} */
CSVBoxButtonComponent.prototype.options;
/** @type {?} */
CSVBoxButtonComponent.prototype.uuid;
/** @type {?} */
CSVBoxButtonComponent.prototype.customDomain;
/** @type {?} */
CSVBoxButtonComponent.prototype.dataLocation;
/** @type {?} */
CSVBoxButtonComponent.prototype.language;
/** @type {?} */
CSVBoxButtonComponent.prototype.environment;
/** @type {?} */
CSVBoxButtonComponent.prototype.theme;
/** @type {?} */
CSVBoxButtonComponent.prototype.isIframeLoaded;
/** @type {?} */
CSVBoxButtonComponent.prototype.openModalOnIframeLoad;
/** @type {?} */
CSVBoxButtonComponent.prototype.lazy;
/** @type {?} */
CSVBoxButtonComponent.prototype.safeUrl;
/** @type {?} */
CSVBoxButtonComponent.prototype.iframe;
/** @type {?} */
CSVBoxButtonComponent.prototype.disabled;
/** @type {?} */
CSVBoxButtonComponent.prototype.holder;
/** @type {?} */
CSVBoxButtonComponent.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY3N2Ym94L2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztNQUV6QyxVQUFVLEdBQUcsUUFBUTtBQWEzQixNQUFNLE9BQU8scUJBQXFCOzs7O0lBNENoQyxZQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBMUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXVCWixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFHeEIsVUFBSyxHQUFXLElBQUksQ0FBQztRQUVyQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUkvQixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBRUwsYUFBUSxHQUFZLElBQUksQ0FBQztJQUVVLENBQUM7Ozs7SUFJN0MsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztZQUM1QixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUNwRSxJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFBRSxNQUFNLEdB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QUVMLEtBQUs7cUJBQ0wsS0FBSzt3QkFDTCxLQUFLO3VCQUNMLEtBQUs7MEJBQ0wsS0FBSzttQkFFTCxLQUFLOzZCQUNMLEtBQUs7eUJBQ0wsS0FBSztzQkFDTCxLQUFLO21CQUNMLEtBQUs7MkJBQ0wsS0FBSzsyQkFDTCxLQUFLO3VCQUNMLEtBQUs7MEJBQ0wsS0FBSztvQkFFTCxLQUFLOzZCQUVMLEtBQUs7b0NBQ0wsS0FBSzttQkFFTCxLQUFLO3VCQU1MLEtBQUs7Ozs7SUF4Q04sNkNBQXFCOztJQUVyQiwwQ0FBd0Q7O0lBQ3hELHlDQUE0Qjs7SUFDNUIsd0NBQTJCOztJQUMzQix3Q0FBMkI7O0lBQzNCLHlDQUE0Qjs7SUFFNUIsMkNBQThCOztJQUM5Qix3Q0FBMkI7O0lBQzNCLHlDQUE0Qjs7SUFDNUIsNENBQStCOztJQUUvQiw4Q0FBaUM7O0lBQ2pDLHVDQUEwQjs7SUFDMUIsMENBQTZCOztJQUM3Qix5Q0FBNEI7O0lBQzVCLDRDQUErQjs7SUFFL0IscUNBQXNCOztJQUN0QiwrQ0FBZ0M7O0lBQ2hDLDJDQUE0Qjs7SUFDNUIsd0NBQXlCOztJQUN6QixxQ0FBNkI7O0lBQzdCLDZDQUFxQzs7SUFDckMsNkNBQXFDOztJQUNyQyx5Q0FBaUM7O0lBQ2pDLDRDQUE2Qjs7SUFFN0Isc0NBQThCOztJQUU5QiwrQ0FBeUM7O0lBQ3pDLHNEQUFnRDs7SUFFaEQscUNBQStCOztJQUUvQix3Q0FBYTs7SUFFYix1Q0FBYzs7SUFFZCx5Q0FBa0M7O0lBSWxDLHVDQUFZOztJQUZBLDBDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgU2VjdXJpdHlDb250ZXh0LFxyXG4gIEFmdGVyQ29udGVudEluaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBpbnNlcnRDU1MgfSBmcm9tICcuLi91dGxpcy9pbnNlcnRDU1MnO1xyXG5cclxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XHJcbiAgQElucHV0KCkgb25JbXBvcnQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uQ2xvc2U6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uU3VibWl0OiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KCkgaXNJbXBvcnRlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgaXNSZWFkeTogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgaXNDbG9zZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkOiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeTogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgY2xvc2VkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBzdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGltcG9ydGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBsb2FkU3RhcnRlZDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIHVzZXI6IE9iamVjdDtcclxuICBASW5wdXQoKSBkeW5hbWljQ29sdW1uczogT2JqZWN0O1xyXG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IFN0cmluZztcclxuICBASW5wdXQoKSBvcHRpb25zOiBPYmplY3Q7XHJcbiAgQElucHV0KCkgdXVpZDogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBjdXN0b21Eb21haW46IFN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiBPYmplY3Q7XHJcblxyXG4gIEBJbnB1dCgpIHRoZW1lOiBTdHJpbmcgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNhZmVVcmw6IGFueTtcclxuXHJcbiAgaWZyYW1lID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cclxuXHJcbiAgaG9sZGVyOiBhbnk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51dWlkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcclxuICAgIGxldCBkb21haW4gPSB0aGlzLmN1c3RvbURvbWFpbiA/IHRoaXMuY3VzdG9tRG9tYWluIDogXCJhcHAuY3N2Ym94LmlvXCI7XHJcbiAgICBpZih0aGlzLmRhdGFMb2NhdGlvbikgeyBkb21haW4gPSBgJHt0aGlzLmRhdGFMb2NhdGlvbn0tJHtkb21haW59YDsgfVxyXG4gICAgbGV0IGlmcmFtZVVybCA9IGBodHRwczovLyR7ZG9tYWlufS9lbWJlZC8ke3RoaXMubGljZW5zZUtleX1gO1xyXG4gICAgaWZyYW1lVXJsICs9IGA/bGlicmFyeS12ZXJzaW9uPSR7IGFwcFZlcnNpb24gfWA7XHJcbiAgICBpZnJhbWVVcmwgKz0gXCImZnJhbWV3b3JrPWFuZ3VsYXJcIjtcclxuICAgIGlmKHRoaXMuZGF0YUxvY2F0aW9uKSB7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZwcmV2ZW50UmVkaXJlY3RcIjtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubGFuZ3VhZ2Upe1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImbGFuZ3VhZ2VcIiArIHRoaXMubGFuZ3VhZ2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmVudmlyb25tZW50KSB7XHJcbiAgICAgIGxldCBlbnZpcm9ubWVudCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZW52aXJvbm1lbnQpLnJlcGxhY2UoL1snXCJdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ1xcXFwnICsgbWF0Y2g7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZnJhbWVVcmwgKz0gYCZlbnY9JHtlbnZpcm9ubWVudH1gO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy50aGVtZSkge1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImdGhlbWVcIiArIHRoaXMudGhlbWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhZmVVcmwgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaWZyYW1lVXJsKSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVV1aWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgdGhpcy51cGRhdGVVc2VyVmFyaWFiZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGEpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlciA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXHJcbiAgICAgIH0sIFwiKlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgaWYoZXZlbnQgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGlmKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5kYXRhICYmIGV2ZW50LmRhdGEuZGF0YS51bmlxdWVfdG9rZW4gPT0gdGhpcy51dWlkKSB7XHJcbiAgICAgICAgICBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xyXG4gICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhW1wiY29sdW1uX21hcHBpbmdzXCJdID0gZXZlbnQuZGF0YS5jb2x1bW5fbWFwcGluZztcclxuICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Ym1pdCkgdGhpcy5vblN1Ym1pdChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3VibWl0dGVkKSB0aGlzLmlzU3VibWl0dGVkKG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xyXG4gICAgICAgICAgICBpZihldmVudC5kYXRhLmRhdGEuaW1wb3J0X3N0YXR1cyA9PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQuZGF0YS5yb3dfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmltYXJ5X3Jvd19kYXRhID0gZXZlbnQuZGF0YS5yb3dfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVycyA9IGV2ZW50LmRhdGEuaGVhZGVycztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcm93cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkeW5hbWljX2NvbHVtbnNfaW5kZXhlcyA9IGV2ZW50LmRhdGEuZHluYW1pY0NvbHVtbnNJbmRleGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcyA9IGV2ZW50LmRhdGEudmlydHVhbENvbHVtbnNJbmRleGVzIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5X3Jvd19kYXRhLmZvckVhY2goKHJvd19kYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgeCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWNfY29sdW1ucyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHZpcnR1YWxfZGF0YSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIHJvd19kYXRhLmRhdGEgJiYgcm93X2RhdGEuZGF0YS5mb3JFYWNoKChjb2wsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb2wgPT0gdW5kZWZpbmVkKXsgY29sID0gXCJcIn07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGR5bmFtaWNfY29sdW1uc19pbmRleGVzLmluY2x1ZGVzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29sdW1uc1toZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9kYXRhW2hlYWRlcnNbaV1dID0gY29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihyb3dfZGF0YSAmJiByb3dfZGF0YS51bm1hcHBlZF9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhbXCJfdW5tYXBwZWRfZGF0YVwiXSA9IHJvd19kYXRhLnVubWFwcGVkX2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkeW5hbWljX2NvbHVtbnMgJiYgT2JqZWN0LmtleXMoZHluYW1pY19jb2x1bW5zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhbXCJfZHluYW1pY19kYXRhXCJdID0gZHluYW1pY19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmlydHVhbF9kYXRhICYmIE9iamVjdC5rZXlzKHZpcnR1YWxfZGF0YSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX3ZpcnR1YWxfZGF0YVwiXSA9IHZpcnR1YWxfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHVzaCh4KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyb3dzXCJdID0gcm93cztcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyYXdfY29sdW1uc1wiXSA9IGV2ZW50LmRhdGEucmF3X2NvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJpZ25vcmVkX2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLmlnbm9yZWRfY29sdW1uX3JvdztcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT0gXCJjc3Zib3gtdXBsb2FkLXN1Y2Nlc3NmdWxcIikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICBpZih0aGlzLmxhenkpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0SW1wb3J0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xyXG5cclxuICAgIGluc2VydENTUygpO1xyXG5cclxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XHJcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybCk7XHJcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcclxuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XHJcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xyXG5cclxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIFwiY3VzdG9tZXJcIiA6IHNlbGYudXNlciA/IHNlbGYudXNlciA6IG51bGwsXHJcbiAgICAgICAgICBcImNvbHVtbnNcIiA6IHNlbGYuZHluYW1pY0NvbHVtbnMgPyBzZWxmLmR5bmFtaWNDb2x1bW5zIDogbnVsbCxcclxuICAgICAgICAgIFwib3B0aW9uc1wiIDogc2VsZi5vcHRpb25zID8gc2VsZi5vcHRpb25zIDogbnVsbCxcclxuICAgICAgICAgIFwidW5pcXVlX3Rva2VuXCI6IHNlbGYudXVpZFxyXG4gICAgICAgIH0sIFwiKlwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xyXG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xyXG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XHJcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG5cclxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxyXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmxhenkpIHtcclxuICAgICAgaWYoIXRoaXMuaWZyYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5pc01vZGFsU2hvd24pIHtcclxuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xyXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=