@csvbox/angular
Version:
Angular adapter for csvbox.io
447 lines • 45.5 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 {?} */
var appVersion = '1.1.16';
var CSVBoxButtonComponent = /** @class */ (function () {
function CSVBoxButtonComponent(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 {?}
*/
CSVBoxButtonComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.uuid = this.generateUuid();
/** @type {?} */
var domain = this.customDomain ? this.customDomain : "app.csvbox.io";
if (this.dataLocation) {
domain = this.dataLocation + "-" + domain;
}
/** @type {?} */
var 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 {?} */
var 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 {?}
*/
CSVBoxButtonComponent.prototype.generateUuid = /**
* @return {?}
*/
function () {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
};
/**
* @param {?} changes
* @return {?}
*/
CSVBoxButtonComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) {
this.updateUserVariabe(changes['user'].currentValue);
}
};
/**
* @param {?} data
* @return {?}
*/
CSVBoxButtonComponent.prototype.updateUserVariabe = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.user = data;
if (this.iframe && this.iframe.contentWindow) {
this.iframe.contentWindow.postMessage({
"customer": data
}, "*");
}
};
/**
* @return {?}
*/
CSVBoxButtonComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
window.addEventListener("message", (/**
* @param {?} event
* @return {?}
*/
function (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 {?} */
var 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 {?} */
var primary_row_data = event.data.row_data;
/** @type {?} */
var headers_1 = event.data.headers;
/** @type {?} */
var rows_1 = [];
/** @type {?} */
var dynamic_columns_indexes_1 = event.data.dynamicColumnsIndexes;
/** @type {?} */
var virtual_columns_indexes_1 = event.data.virtualColumnsIndexes || [];
primary_row_data.forEach((/**
* @param {?} row_data
* @return {?}
*/
function (row_data) {
/** @type {?} */
var x = {};
/** @type {?} */
var dynamic_columns = {};
/** @type {?} */
var virtual_data = {};
row_data.data && row_data.data.forEach((/**
* @param {?} col
* @param {?} i
* @return {?}
*/
function (col, i) {
if (col == undefined) {
col = "";
}
;
if (dynamic_columns_indexes_1.includes(i)) {
dynamic_columns[headers_1[i]] = col;
}
else if (virtual_columns_indexes_1.includes(i)) {
virtual_data[headers_1[i]] = col;
}
else {
x[headers_1[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_1.push(x);
}));
/** @type {?} */
var metadata = event.data.data;
metadata["rows"] = rows_1;
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 {?} */
var 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 {?} */
var 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 {?}
*/
CSVBoxButtonComponent.prototype.initImporter = /**
* @return {?}
*/
function () {
if (this.loadStarted)
this.loadStarted();
insertCSS();
/** @type {?} */
var iframe = document.createElement("iframe");
this.iframe = iframe;
iframe.setAttribute("src", this.safeUrl);
iframe.frameBorder = "0";
/** @type {?} */
var 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 {?}
*/
CSVBoxButtonComponent.prototype.openModal = /**
* @return {?}
*/
function () {
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: "\n <div>\n <button [disabled]=\"disabled\" #initiator (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
}] }
];
/** @nocollapse */
CSVBoxButtonComponent.ctorParameters = function () { return [
{ 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 }]
};
return CSVBoxButtonComponent;
}());
export { CSVBoxButtonComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY3N2Ym94L2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztJQUV6QyxVQUFVLEdBQUcsUUFBUTtBQUUzQjtJQXVERSwrQkFBbUIsU0FBc0I7UUFBdEIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQTFDekMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUF1QlosU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixpQkFBWSxHQUFXLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBR3hCLFVBQUssR0FBVyxJQUFJLENBQUM7UUFFckIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRXZDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFJL0IsV0FBTSxHQUFHLElBQUksQ0FBQztRQUVMLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLHdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztZQUM1QixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUNwRSxJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFBRSxNQUFNLEdBQU0sSUFBSSxDQUFDLFlBQVksU0FBSSxNQUFRLENBQUM7U0FBRTs7WUFDaEUsU0FBUyxHQUFHLGFBQVcsTUFBTSxlQUFVLElBQUksQ0FBQyxVQUFZO1FBQzVELFNBQVMsSUFBSSxzQkFBcUIsVUFBYSxDQUFDO1FBQ2hELFNBQVMsSUFBSSxvQkFBb0IsQ0FBQztRQUNsQyxJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsU0FBUyxJQUFJLGtCQUFrQixDQUFDO1NBQ2pDO1FBQ0QsSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFDO1lBQ2YsU0FBUyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFFOztnQkFDZixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87Ozs7WUFBRSxVQUFTLEtBQUs7Z0JBQzlFLE9BQU8sSUFBSSxHQUFHLEtBQUssQ0FBQztZQUN4QixDQUFDLEVBQUM7WUFDRixTQUFTLElBQUksVUFBUSxXQUFhLENBQUM7U0FDcEM7UUFDRCxJQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDYixTQUFTLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7Ozs7SUFFRCw0Q0FBWTs7O0lBQVo7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQzs7Ozs7SUFFRCwyQ0FBVzs7OztJQUFYLFVBQVksT0FBc0I7UUFDaEMsSUFBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFO1lBQ25GLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDOzs7OztJQUVELGlEQUFpQjs7OztJQUFqQixVQUFrQixJQUFJO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRyxJQUFJO2FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7Ozs7SUFFRCxrREFBa0I7OztJQUFsQjtRQUFBLGlCQWlHQztRQWhHQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUzs7OztRQUFFLFVBQUMsS0FBSztZQUN2QyxJQUFHLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFO2dCQUN6QyxJQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQzdFLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUU7OzRCQUNyRCxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJO3dCQUM5QixRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQzt3QkFDeEQsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ2hDLElBQUksS0FBSSxDQUFDLFFBQVE7NEJBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxLQUFJLENBQUMsV0FBVzs0QkFBRSxLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLEtBQUksQ0FBQyxTQUFTOzRCQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzlDO3lCQUFNLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUU7d0JBQ2xFLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRTs0QkFDM0MsSUFBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTs7b0NBQ2hCLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUTs7b0NBQ3RDLFNBQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU87O29DQUM1QixNQUFJLEdBQUcsRUFBRTs7b0NBQ1QseUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUI7O29DQUMxRCx5QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLEVBQUU7Z0NBRXBFLGdCQUFnQixDQUFDLE9BQU87Ozs7Z0NBQUMsVUFBQyxRQUFROzt3Q0FDNUIsQ0FBQyxHQUFHLEVBQUU7O3dDQUNOLGVBQWUsR0FBRyxFQUFFOzt3Q0FDcEIsWUFBWSxHQUFHLEVBQUU7b0NBRXJCLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztvQ0FBQyxVQUFDLEdBQUcsRUFBRSxDQUFDO3dDQUMxQyxJQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUM7NENBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQTt5Q0FBQzt3Q0FBQSxDQUFDO3dDQUVoQyxJQUFHLHlCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTs0Q0FDcEMsZUFBZSxDQUFDLFNBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt5Q0FDckM7NkNBQ0ksSUFBRyx5QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7NENBQzNDLFlBQVksQ0FBQyxTQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7eUNBQ2hDOzZDQUNJOzRDQUNILENBQUMsQ0FBQyxTQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7eUNBQ3JCO29DQUNMLENBQUMsRUFBQyxDQUFDO29DQUNILElBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7d0NBQ3JDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7cUNBQzlDO29DQUNELElBQUcsZUFBZSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3Q0FDN0QsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztxQ0FDdEM7b0NBQ0QsSUFBRyxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dDQUN2RCxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsWUFBWSxDQUFDO3FDQUNuQztvQ0FDRCxNQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNmLENBQUMsRUFBQyxDQUFDOztvQ0FDQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJO2dDQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBSSxDQUFDO2dDQUN4QixRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQ0FDeEQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2dDQUNqRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dDQUM1RCxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQ0FDaEMsSUFBSSxLQUFJLENBQUMsUUFBUTtvQ0FBRSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQ0FDakQsSUFBSSxLQUFJLENBQUMsVUFBVTtvQ0FBRSxLQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQ0FDckQsSUFBSSxLQUFJLENBQUMsUUFBUTtvQ0FBRSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQzs2QkFDcEQ7aUNBQUk7O29DQUNHLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUk7Z0NBQzlCLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dDQUNoQyxJQUFJLEtBQUksQ0FBQyxRQUFRO29DQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dDQUNqRCxJQUFJLEtBQUksQ0FBQyxVQUFVO29DQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dDQUNyRCxJQUFJLEtBQUksQ0FBQyxRQUFRO29DQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDOzZCQUNwRDt5QkFDSjs2QkFBSzs7Z0NBQ0UsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSTs0QkFDOUIsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7NEJBQ2hDLElBQUksS0FBSSxDQUFDLFFBQVE7Z0NBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7NEJBQ2xELElBQUksS0FBSSxDQUFDLFVBQVU7Z0NBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7NEJBQ3RELElBQUksS0FBSSxDQUFDLFFBQVE7Z0NBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7eUJBQ3JEO3FCQUNGO3lCQUFNLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUU7d0JBQ3JFLElBQUcsS0FBSSxDQUFDLE1BQU07NEJBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzt3QkFDbkQsS0FBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksS0FBSSxDQUFDLE9BQU87NEJBQUUsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNqQyxJQUFJLEtBQUksQ0FBQyxRQUFROzRCQUFFLEtBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxLQUFJLENBQUMsTUFBTTs0QkFBRSxLQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ2hDO3lCQUFNLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksMEJBQTBCLEVBQUU7d0JBQ3hFLElBQUksS0FBSSxDQUFDLFFBQVE7NEJBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdkMsSUFBSSxLQUFJLENBQUMsVUFBVTs0QkFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLEtBQUksQ0FBQyxRQUFROzRCQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzFDO3lCQUFNLElBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUU7d0JBQ3BFLElBQUksS0FBSSxDQUFDLFFBQVE7NEJBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDeEMsSUFBSSxLQUFJLENBQUMsVUFBVTs0QkFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM1QyxJQUFJLEtBQUksQ0FBQyxRQUFROzRCQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzNDO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLEdBQUUsS0FBSyxDQUFDLENBQUM7UUFFVixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQzs7OztJQUVELDRDQUFZOzs7SUFBWjtRQUNFLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekMsU0FBUyxFQUFFLENBQUM7O1lBRVIsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7WUFFckIsSUFBSSxHQUFHLElBQUk7UUFDZixNQUFNLENBQUMsTUFBTTs7O1FBQUc7WUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxhQUFhO2dCQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU3QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztvQkFDcEMsVUFBVSxFQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ3pDLFNBQVMsRUFBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUM1RCxTQUFTLEVBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ1Q7WUFDRCxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFBLENBQUE7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxrQkFBZ0IsSUFBSSxDQUFDLElBQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUN6QixDQUFDO0lBQ0osQ0FBQzs7OztJQUVELHlDQUFTOzs7SUFBVDtRQUNFLElBQUcsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNiLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsT0FBTzthQUNWO1NBQ0Y7UUFDRCxJQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFHLElBQUksQ0FBQyxNQUFNO29CQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3BELElBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDekQ7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2FBQ3JDO1NBQ0Y7SUFDSCxDQUFDOztnQkF0UUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUUsOExBTVQ7aUJBQ0Y7Ozs7Z0JBZFEsWUFBWTs7OzRCQW9CbEIsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7MkJBQ3RDLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLOzJCQUNMLEtBQUs7NkJBRUwsS0FBSzswQkFDTCxLQUFLOzJCQUNMLEtBQUs7OEJBQ0wsS0FBSztnQ0FFTCxLQUFLO3lCQUNMLEtBQUs7NEJBQ0wsS0FBSzsyQkFDTCxLQUFLOzhCQUNMLEtBQUs7dUJBRUwsS0FBSztpQ0FDTCxLQUFLOzZCQUNMLEtBQUs7MEJBQ0wsS0FBSzt1QkFDTCxLQUFLOytCQUNMLEtBQUs7K0JBQ0wsS0FBSzsyQkFDTCxLQUFLOzhCQUNMLEtBQUs7d0JBRUwsS0FBSztpQ0FFTCxLQUFLO3dDQUNMLEtBQUs7dUJBRUwsS0FBSzsyQkFNTCxLQUFLOztJQW1OUiw0QkFBQztDQUFBLEFBeFFELElBd1FDO1NBN1BZLHFCQUFxQjs7O0lBRWhDLDZDQUFxQjs7SUFFckIsMENBQXdEOztJQUN4RCx5Q0FBNEI7O0lBQzVCLHdDQUEyQjs7SUFDM0Isd0NBQTJCOztJQUMzQix5Q0FBNEI7O0lBRTVCLDJDQUE4Qjs7SUFDOUIsd0NBQTJCOztJQUMzQix5Q0FBNEI7O0lBQzVCLDRDQUErQjs7SUFFL0IsOENBQWlDOztJQUNqQyx1Q0FBMEI7O0lBQzFCLDBDQUE2Qjs7SUFDN0IseUNBQTRCOztJQUM1Qiw0Q0FBK0I7O0lBRS9CLHFDQUFzQjs7SUFDdEIsK0NBQWdDOztJQUNoQywyQ0FBNEI7O0lBQzVCLHdDQUF5Qjs7SUFDekIscUNBQTZCOztJQUM3Qiw2Q0FBcUM7O0lBQ3JDLDZDQUFxQzs7SUFDckMseUNBQWlDOztJQUNqQyw0Q0FBNkI7O0lBRTdCLHNDQUE4Qjs7SUFFOUIsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQWM7O0lBRWQseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFNlY3VyaXR5Q29udGV4dCxcclxuICBBZnRlckNvbnRlbnRJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcclxuXHJcbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIGBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblxyXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbml0aWF0b3InLCB7c3RhdGljOiBmYWxzZX0pIGluaXRpYXRvcjogYW55O1xyXG4gIEBJbnB1dCgpIG9uSW1wb3J0OiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvblJlYWR5OiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvbkNsb3NlOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBvblN1Ym1pdDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzQ2xvc2VkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGNsb3NlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgc3VibWl0dGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBpbXBvcnRlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ6IEZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKSB1c2VyOiBPYmplY3Q7XHJcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM6IE9iamVjdDtcclxuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBTdHJpbmc7XHJcbiAgQElucHV0KCkgb3B0aW9uczogT2JqZWN0O1xyXG4gIEBJbnB1dCgpIHV1aWQ6IFN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBsYW5ndWFnZTogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogT2JqZWN0O1xyXG5cclxuICBASW5wdXQoKSB0aGVtZTogU3RyaW5nID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBvcGVuTW9kYWxPbklmcmFtZUxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzYWZlVXJsOiBhbnk7XHJcblxyXG4gIGlmcmFtZSA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjpEb21TYW5pdGl6ZXIpIHt9XHJcblxyXG4gIGhvbGRlcjogYW55O1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXVpZCA9IHRoaXMuZ2VuZXJhdGVVdWlkKCk7XHJcbiAgICBsZXQgZG9tYWluID0gdGhpcy5jdXN0b21Eb21haW4gPyB0aGlzLmN1c3RvbURvbWFpbiA6IFwiYXBwLmNzdmJveC5pb1wiO1xyXG4gICAgaWYodGhpcy5kYXRhTG9jYXRpb24pIHsgZG9tYWluID0gYCR7dGhpcy5kYXRhTG9jYXRpb259LSR7ZG9tYWlufWA7IH1cclxuICAgIGxldCBpZnJhbWVVcmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn0vZW1iZWQvJHt0aGlzLmxpY2Vuc2VLZXl9YDtcclxuICAgIGlmcmFtZVVybCArPSBgP2xpYnJhcnktdmVyc2lvbj0keyBhcHBWZXJzaW9uIH1gO1xyXG4gICAgaWZyYW1lVXJsICs9IFwiJmZyYW1ld29yaz1hbmd1bGFyXCI7XHJcbiAgICBpZih0aGlzLmRhdGFMb2NhdGlvbikge1xyXG4gICAgICBpZnJhbWVVcmwgKz0gXCImcHJldmVudFJlZGlyZWN0XCI7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmxhbmd1YWdlKXtcclxuICAgICAgaWZyYW1lVXJsICs9IFwiJmxhbmd1YWdlXCIgKyB0aGlzLmxhbmd1YWdlO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5lbnZpcm9ubWVudCkge1xyXG4gICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVudmlyb25tZW50KS5yZXBsYWNlKC9bJ1wiXS9nLCBmdW5jdGlvbihtYXRjaCkge1xyXG4gICAgICAgICAgcmV0dXJuICdcXFxcJyArIG1hdGNoO1xyXG4gICAgICB9KTtcclxuICAgICAgaWZyYW1lVXJsICs9IGAmZW52PSR7ZW52aXJvbm1lbnR9YDtcclxuICAgIH1cclxuICAgIGlmKHRoaXMudGhlbWUpIHtcclxuICAgICAgaWZyYW1lVXJsICs9IFwiJnRoZW1lXCIgKyB0aGlzLnRoZW1lO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVVdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2VyVmFyaWFiZShkYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXIgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgXCJjdXN0b21lclwiIDogZGF0YVxyXG4gICAgICB9LCBcIipcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmKGV2ZW50ICYmIHR5cGVvZiBldmVudC5kYXRhID09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBpZihldmVudC5kYXRhICYmIGV2ZW50LmRhdGEuZGF0YSAmJiBldmVudC5kYXRhLmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xyXG4gICAgICAgICAgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImRhdGEtb24tc3VibWl0XCIpIHtcclxuICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWV0YWRhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT0gXCJkYXRhLXB1c2gtc3RhdHVzXCIpIHtcclxuICAgICAgICAgICAgaWYoZXZlbnQuZGF0YS5kYXRhLmltcG9ydF9zdGF0dXMgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmKGV2ZW50LmRhdGEucm93X2RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpbWFyeV9yb3dfZGF0YSA9IGV2ZW50LmRhdGEucm93X2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBldmVudC5kYXRhLmhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvd3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZHluYW1pY19jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLmR5bmFtaWNDb2x1bW5zSW5kZXhlcztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmlydHVhbF9jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLnZpcnR1YWxDb2x1bW5zSW5kZXhlcyB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeV9yb3dfZGF0YS5mb3JFYWNoKChyb3dfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHggPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkeW5hbWljX2NvbHVtbnMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB2aXJ0dWFsX2RhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICByb3dfZGF0YS5kYXRhICYmIHJvd19kYXRhLmRhdGEuZm9yRWFjaCgoY29sLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sID09IHVuZGVmaW5lZCl7IGNvbCA9IFwiXCJ9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkeW5hbWljX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljX2NvbHVtbnNbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodmlydHVhbF9jb2x1bW5zX2luZGV4ZXMuaW5jbHVkZXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxfZGF0YVtoZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4W2hlYWRlcnNbaV1dID0gY29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYocm93X2RhdGEgJiYgcm93X2RhdGEudW5tYXBwZWRfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX3VubWFwcGVkX2RhdGFcIl0gPSByb3dfZGF0YS51bm1hcHBlZF9kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoZHluYW1pY19jb2x1bW5zICYmIE9iamVjdC5rZXlzKGR5bmFtaWNfY29sdW1ucykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX2R5bmFtaWNfZGF0YVwiXSA9IGR5bmFtaWNfY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmKHZpcnR1YWxfZGF0YSAmJiBPYmplY3Qua2V5cyh2aXJ0dWFsX2RhdGEpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeFtcIl92aXJ0dWFsX2RhdGFcIl0gPSB2aXJ0dWFsX2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2goeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicm93c1wiXSA9IHJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJjb2x1bW5fbWFwcGluZ3NcIl0gPSBldmVudC5kYXRhLmNvbHVtbl9tYXBwaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicmF3X2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLnJhd19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wiaWdub3JlZF9jb2x1bW5zXCJdID0gZXZlbnQuZGF0YS5pZ25vcmVkX2NvbHVtbl9yb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xyXG4gICAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgaWYodGhpcy5sYXp5KSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEltcG9ydGVyKCkge1xyXG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcclxuXHJcbiAgICBpbnNlcnRDU1MoKTtcclxuXHJcbiAgICBsZXQgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xyXG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmwpO1xyXG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XHJcbiAgICAgIGlmIChzZWxmLmlzUmVhZHkpIHNlbGYuaXNSZWFkeSgpO1xyXG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcclxuXHJcbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XHJcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICBcImN1c3RvbWVyXCIgOiBzZWxmLnVzZXIgPyBzZWxmLnVzZXIgOiBudWxsLFxyXG4gICAgICAgICAgXCJjb2x1bW5zXCIgOiBzZWxmLmR5bmFtaWNDb2x1bW5zID8gc2VsZi5keW5hbWljQ29sdW1ucyA6IG51bGwsXHJcbiAgICAgICAgICBcIm9wdGlvbnNcIiA6IHNlbGYub3B0aW9ucyA/IHNlbGYub3B0aW9ucyA6IG51bGwsXHJcbiAgICAgICAgICBcInVuaXF1ZV90b2tlblwiOiBzZWxmLnV1aWRcclxuICAgICAgICB9LCBcIipcIik7XHJcbiAgICAgIH1cclxuICAgICAgaWYoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcclxuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcclxuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xyXG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuXHJcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcclxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5sYXp5KSB7XHJcbiAgICAgIGlmKCF0aGlzLmlmcmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XHJcbiAgICAgIGlmKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcclxuICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgIGlmKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19