@noaestudio/forms
Version:
Dynamic forms extension for Covalent
387 lines (386 loc) • 40.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, forwardRef, ViewChild, ChangeDetectorRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { AbstractControlValueAccessor } from '../abstract-control-value-accesor';
import { TranslateDialogComponent } from '../../dialogs/translate-dialog/translate-dialog.component';
import { MatDialog, MatTabGroup } from '@angular/material';
export var /** @type {?} */ INPUT_INPUT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return TranslateComponent; }),
multi: true,
};
var TranslateComponent = /** @class */ (function (_super) {
tslib_1.__extends(TranslateComponent, _super);
function TranslateComponent(dialog, changeDetector) {
var _this = _super.call(this) || this;
_this.dialog = dialog;
_this.changeDetector = changeDetector;
_this.height = "150px";
_this.toolbarConfig = [
['bold', 'italic', 'underline'],
['fontName', 'fontSize', 'color'],
['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'indent', 'outdent'],
['cut', 'copy', 'delete', 'removeFormat', 'undo', 'redo'],
['horizontalLine', 'orderedList', 'unorderedList'],
['link', 'unlink']
];
_this.label = '';
_this.type = undefined;
_this.required = undefined;
_this.min = undefined;
_this.max = undefined;
_this.minLength = undefined;
_this.maxLength = undefined;
_this.langs = ['es'];
//TODO: Guachau...
_this.allLangs = ['es', 'en', 'fr', 'de'];
_this.selectedIndex = 0;
_this.selectedLang = '';
_this.templateType = '';
return _this;
}
/**
* @return {?}
*/
TranslateComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.selectedLang = this.langs[0];
this.templateType = TranslateComponent.getTemplateType(this.type);
this.initValue(this.value);
};
/**
* @param {?} arr
* @param {?} value
* @return {?}
*/
TranslateComponent.prototype.inArray = /**
* @param {?} arr
* @param {?} value
* @return {?}
*/
function (arr, value) {
return arr.indexOf(value) > -1;
};
/**
* @param {?} value
* @return {?}
*/
TranslateComponent.prototype.initValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.valuesJSON = {};
if (value) {
if (typeof value === 'string') {
value = JSON.parse(value);
}
this.langs = [];
for (var /** @type {?} */ lang in value) {
if (this.inArray(this.allLangs, lang)) {
this.langs.push(lang);
}
}
}
try {
for (var _a = tslib_1.__values(this.langs), _b = _a.next(); !_b.done; _b = _a.next()) {
var lang = _b.value;
if (value) {
this.valuesJSON[lang] = (value[lang] || '');
}
else {
this.valuesJSON[lang] = '';
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
this.values = this.parseInit(this.valuesJSON);
var /** @type {?} */ jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
var e_1, _c;
};
/**
* @param {?} valuesJSON
* @return {?}
*/
TranslateComponent.prototype.parseInit = /**
* @param {?} valuesJSON
* @return {?}
*/
function (valuesJSON) {
var /** @type {?} */ values = {};
for (var /** @type {?} */ lang in valuesJSON) {
values[lang] = this.parseValue(valuesJSON[lang]);
}
return values;
};
/**
* @param {?} value
* @return {?}
*/
TranslateComponent.prototype.parseValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.templateType == 'file-input') {
return undefined;
}
else {
return value;
}
};
/**
* @param {?} type
* @return {?}
*/
TranslateComponent.getTemplateType = /**
* @param {?} type
* @return {?}
*/
function (type) {
switch (type) {
case 'text':
case 'input':
return 'input';
case 'textarea':
return 'area';
case 'text-editor':
return 'editor';
case 'file-input':
return 'file-input';
default:
return '';
}
};
/**
* @param {?} lang
* @return {?}
*/
TranslateComponent.prototype.selectLang = /**
* @param {?} lang
* @return {?}
*/
function (lang) {
var /** @type {?} */ index = this.langs.findIndex(function (row) {
return row == lang;
});
if (index != this.selectedIndex) {
this.selectedIndex = index;
}
};
/**
* @return {?}
*/
TranslateComponent.prototype.addLang = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ langs = this.langs;
var /** @type {?} */ remLangs = this.allLangs.filter(function (x) {
return !_this.inArray(langs, x);
});
this.openDialog(remLangs);
};
/**
* @param {?} lang
* @return {?}
*/
TranslateComponent.prototype.removeLang = /**
* @param {?} lang
* @return {?}
*/
function (lang) {
if (this.langs.length <= 1) {
return;
}
var /** @type {?} */ index = this.langs.findIndex(function (row) {
return row == lang;
});
if (index !== -1) {
this.langs.splice(index, 1);
delete this.values[lang];
delete this.valuesJSON[lang];
if (index == this.selectedIndex) {
this.selectedIndex = 0;
this.selectedLang = this.langs[0];
}
else {
this.selectLang(this.selectedLang);
}
var /** @type {?} */ jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
}
};
/**
* @param {?} remLangs
* @return {?}
*/
TranslateComponent.prototype.openDialog = /**
* @param {?} remLangs
* @return {?}
*/
function (remLangs) {
var _this = this;
var /** @type {?} */ data = {
langs: remLangs
};
var /** @type {?} */ dialogRef = this.dialog.open(TranslateDialogComponent, { data: data });
dialogRef.afterClosed().subscribe(function (lang) {
if (lang) {
_this.valuesJSON[lang] = '';
_this.values[lang] = _this.parseValue(_this.valuesJSON[lang]);
_this.langs.push(lang);
_this.changeDetector.detectChanges();
_this.selectLang(lang);
}
});
};
/**
* @param {?} newValue
* @param {?} lang
* @return {?}
*/
TranslateComponent.prototype.changeValue = /**
* @param {?} newValue
* @param {?} lang
* @return {?}
*/
function (newValue, lang) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a, _b, jsonValue;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0:
if (!(newValue instanceof File)) return [3 /*break*/, 2];
_a = this.valuesJSON;
_b = lang;
return [4 /*yield*/, TranslateComponent.toBase64(newValue)];
case 1:
_a[_b] = _c.sent();
return [3 /*break*/, 3];
case 2:
if (newValue == undefined) {
this.valuesJSON[lang] = '';
}
else {
this.valuesJSON[lang] = newValue;
}
_c.label = 3;
case 3:
jsonValue = JSON.stringify(this.valuesJSON);
this.control.setValue(jsonValue);
return [2 /*return*/];
}
});
});
};
/**
* @param {?} value
* @return {?}
*/
TranslateComponent.toBase64 = /**
* @param {?} value
* @return {?}
*/
function (value) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var myReader, image, promise;
return tslib_1.__generator(this, function (_a) {
myReader = new FileReader();
image = '';
promise = new Promise(function (resolve) {
myReader.onloadend = function (e) {
image = myReader.result;
resolve(image);
};
myReader.readAsDataURL(value);
});
return [2 /*return*/, promise];
});
});
};
TranslateComponent.decorators = [
{ type: Component, args: [{
providers: [INPUT_INPUT_CONTROL_VALUE_ACCESSOR],
selector: 'translate',
styles: [".td-dynamic-input-wrapper{-ms-flex-direction:row;flex-direction:row;display:-ms-flexbox;display:flex;box-sizing:border-box}.td-dynamic-input-wrapper .td-dynamic-input-field{-ms-flex:1;flex:1;box-sizing:border-box}"],
template: "<style>\n\n.ngx-editor {\n\tmargin-top: 10px;\n}\n\n</style>\n\n<div class=\"td-translatable\">\n\t<label>{{label}}</label>\n\t<mat-tab-group #tabGroup class=\"tab-group\" dynamicHeight [(selectedIndex)]=\"selectedIndex\">\n\t\t<mat-tab *ngFor=\"let lang of langs\">\n\t\t\t<ng-template matTabLabel>\n\t\t\t\t<span (click)=\"selectLang(lang)\">{{lang | translate}}</span>\n\t\t\t\t<mat-icon (click)=\"removeLang(lang)\" style=\"vertical-align: middle; margin-left: 10px;\">close</mat-icon>\n\t\t\t</ng-template>\n\t\t\t<div style=\"width:100%;\" [ngSwitch]=\"templateType\">\n\t\t\t\t<ng-template ngSwitchCase=\"input\">\n\t\t\t\t\t<div class=\"td-dynamic-input-wrapper\">\n\t\t\t\t\t <mat-form-field class=\"td-dynamic-input-field\">\n\t\t\t\t\t <input #elementInput\n\t\t\t\t\t matInput\n\t\t\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t [(ngModel)]=\"values[lang]\"\n\t\t\t\t\t\t\t\t(ngModelChange)=\"changeValue($event, lang)\"\n\t\t\t\t\t [type]=\"type\"\n\t\t\t\t\t [required]=\"required\"\n\t\t\t\t\t [attr.min]=\"min\"\n\t\t\t\t\t [attr.max]=\"max\"\n\t\t\t\t\t [attr.minLength]=\"minLength\"\n\t\t\t\t\t [attr.maxLength]=\"maxLength\"/>\n\t\t\t\t\t </mat-form-field>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template ngSwitchCase=\"area\">\n\t\t\t\t\t<div class=\"td-dynamic-textarea-wrapper\">\n\t\t\t\t\t <mat-form-field class=\"td-dynamic-textarea-field\" style=\"width:100%;\">\n\t\t\t\t\t <textarea #elementInput\n\t\t\t\t\t matInput\n\t\t\t\t\t [(ngModel)]=\"values[lang]\"\n\t\t\t\t\t\t\t\t(ngModelChange)=\"changeValue($event, lang)\"\n\t\t\t\t\t [required]=\"required\"\n\t\t\t\t\t rows=\"4\">\n\t\t\t\t\t </textarea>\n\t\t\t\t\t </mat-form-field>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template ngSwitchCase=\"editor\">\n\t\t\t\t\t<div class=\"td-dynamic-input-wrapper\" style=\"display: block;\">\n\t\t\t\t\t\t<app-ngx-editor [(ngModel)]=\"values[lang]\" (ngModelChange)=\"changeValue($event, lang)\"\n\t\t\t\t\t\t\t[height]=\"height\" [minHeight]=\"height\" [toolbar]=\"toolbarConfig\" style=\"width:100%;\">\n\t\t\t\t\t\t</app-ngx-editor>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template ngSwitchCase=\"file-input\">\n\t\t\t\t\t<div class=\"td-dynamic-file-input-wrapper\" style=\"display: flex;\">\n\t\t\t\t\t\t<mat-form-field tdFileDrop class=\"td-dynamic-file-input-field\" floatLabel=\"never\" (fileDrop)=\"values[lang] = $event\"\n\t\t\t\t\t\t\t(click)=\"fileInput.inputElement.click()\" (keyup.enter)=\"fileInput.inputElement.click()\"\n\t\t\t\t\t\t\t(keyup.delete)=\"fileInput.clear()\" (keyup.backspace)=\"fileInput.clear()\">\n\t\t\t\t\t\t\t\t<input matInput autocomplete=\"off\" [value]=\"values[lang]?.name\" [placeholder]=\"label\" readonly />\n\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t<button style=\"align-self: center;\" mat-icon-button *ngIf=\"values[lang]\" (click)=\"fileInput.clear(); changeValue(undefined,lang);\" (keyup.enter)=\"fileInput.clear()\">\n\t\t\t\t\t\t\t<mat-icon>cancel</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<td-file-input style=\"align-self:center; margin-left:10px;\" class=\"td-file-input\" #fileInput [(ngModel)]=\"values[lang]\" (ngModelChange)=\"changeValue($event, lang)\">\n\t\t\t\t\t\t\t<mat-icon>folder</mat-icon>\n\t\t\t\t\t\t\t<span>{{ label }}</span>\n\t\t\t\t\t\t</td-file-input>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template ngSwitchDefault>\n\t\t\t\t\t<div class=\"td-dynamic-input-wrapper\">\n\t\t\t\t\t <mat-form-field class=\"td-dynamic-input-field\">\n\t\t\t\t\t <input #elementInput\n\t\t\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t matInput\n\t\t\t\t\t [(ngModel)]=\"values[lang]\"\n\t\t\t\t\t\t\t\t(ngModelChange)=\"changeValue($event, lang)\"\n\t\t\t\t\t [type]=\"type\"\n\t\t\t\t\t [required]=\"required\"\n\t\t\t\t\t [attr.min]=\"min\"\n\t\t\t\t\t [attr.max]=\"max\"\n\t\t\t\t\t [attr.minLength]=\"minLength\"\n\t\t\t\t\t [attr.maxLength]=\"maxLength\"/>\n\t\t\t\t\t </mat-form-field>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-template>\n\t\t\t</div>\n\t\t</mat-tab>\n\t\t<mat-tab [disabled]=true>\n\t\t\t<ng-template matTabLabel><mat-icon (click)=\"addLang()\" style=\"color: #000000;\">add</mat-icon></ng-template>\n\t\t</mat-tab>\n\t</mat-tab-group>\n</div>\n",
},] },
];
/** @nocollapse */
TranslateComponent.ctorParameters = function () { return [
{ type: MatDialog, },
{ type: ChangeDetectorRef, },
]; };
TranslateComponent.propDecorators = {
"tabGroup": [{ type: ViewChild, args: ['tabGroup',] },],
};
return TranslateComponent;
}(AbstractControlValueAccessor));
export { TranslateComponent };
function TranslateComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TranslateComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TranslateComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TranslateComponent.propDecorators;
/** @type {?} */
TranslateComponent.prototype.control;
/** @type {?} */
TranslateComponent.prototype.height;
/** @type {?} */
TranslateComponent.prototype.toolbarConfig;
/** @type {?} */
TranslateComponent.prototype.label;
/** @type {?} */
TranslateComponent.prototype.type;
/** @type {?} */
TranslateComponent.prototype.required;
/** @type {?} */
TranslateComponent.prototype.min;
/** @type {?} */
TranslateComponent.prototype.max;
/** @type {?} */
TranslateComponent.prototype.minLength;
/** @type {?} */
TranslateComponent.prototype.maxLength;
/** @type {?} */
TranslateComponent.prototype.langs;
/** @type {?} */
TranslateComponent.prototype.allLangs;
/** @type {?} */
TranslateComponent.prototype.selectedIndex;
/** @type {?} */
TranslateComponent.prototype.selectedLang;
/** @type {?} */
TranslateComponent.prototype.templateType;
/** @type {?} */
TranslateComponent.prototype.values;
/** @type {?} */
TranslateComponent.prototype.valuesJSON;
/** @type {?} */
TranslateComponent.prototype.tabGroup;
/** @type {?} */
TranslateComponent.prototype.dialog;
/** @type {?} */
TranslateComponent.prototype.changeDetector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiZHluYW1pYy1lbGVtZW50cy90cmFuc2xhdGFibGUvdHJhbnNsYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQXFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDckcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzRCxNQUFNLENBQUMscUJBQU0sa0NBQWtDLEdBQVE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNYLENBQUM7O0lBc0dzQyw4Q0FBNEI7SUE4Q25FLDRCQUFvQixNQUFpQixFQUFVLGNBQWtDO1FBQWpGLFlBQ0MsaUJBQU8sU0FDUDtRQUZtQixZQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsb0JBQWMsR0FBZCxjQUFjLENBQW9CO3VCQTFDaEUsT0FBTzs4QkFFRjtZQUNmLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7WUFDL0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQztZQUNqQyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQ3BGLENBQUMsS0FB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OlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vYWJzdHJhY3QtY29udHJvbC12YWx1ZS1hY2Nlc29yJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvdHJhbnNsYXRlLWRpYWxvZy90cmFuc2xhdGUtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5QVVRfSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xyXG5cdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG5cdHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRyYW5zbGF0ZUNvbXBvbmVudCksXHJcblx0bXVsdGk6IHRydWUsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRwcm92aWRlcnM6IFsgSU5QVVRfSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiBdLFxyXG5cdHNlbGVjdG9yOiAndHJhbnNsYXRlJyxcclxuXHRzdHlsZXM6IFtgLnRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlcnstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdztkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlciAudGQtZHluYW1pYy1pbnB1dC1maWVsZHstbXMtZmxleDoxO2ZsZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3h9YF0sXHJcblx0dGVtcGxhdGU6IGA8c3R5bGU+XHJcblxyXG4ubmd4LWVkaXRvciB7XHJcblx0bWFyZ2luLXRvcDogMTBweDtcclxufVxyXG5cclxuPC9zdHlsZT5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0ZC10cmFuc2xhdGFibGVcIj5cclxuXHQ8bGFiZWw+e3tsYWJlbH19PC9sYWJlbD5cclxuXHQ8bWF0LXRhYi1ncm91cCAjdGFiR3JvdXAgY2xhc3M9XCJ0YWItZ3JvdXBcIiBkeW5hbWljSGVpZ2h0IFsoc2VsZWN0ZWRJbmRleCldPVwic2VsZWN0ZWRJbmRleFwiPlxyXG5cdFx0PG1hdC10YWIgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3NcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIG1hdFRhYkxhYmVsPlxyXG5cdFx0XHRcdDxzcGFuIChjbGljayk9XCJzZWxlY3RMYW5nKGxhbmcpXCI+e3tsYW5nIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcblx0XHRcdFx0PG1hdC1pY29uIChjbGljayk9XCJyZW1vdmVMYW5nKGxhbmcpXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tbGVmdDogMTBweDtcIj5jbG9zZTwvbWF0LWljb24+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDxkaXYgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiIFtuZ1N3aXRjaF09XCJ0ZW1wbGF0ZVR5cGVcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaW5wdXRcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZC1keW5hbWljLWlucHV0LXdyYXBwZXJcIj5cclxuXHRcdFx0XHRcdCAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGQtZHluYW1pYy1pbnB1dC1maWVsZFwiPlxyXG5cdFx0XHRcdFx0ICAgIDxpbnB1dCAjZWxlbWVudElucHV0XHJcblx0XHRcdFx0XHQgICAgICAgICAgICBtYXRJbnB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCJcclxuXHRcdFx0XHRcdFx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3R5cGVdPVwidHlwZVwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWluXT1cIm1pblwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbYXR0ci5tYXhdPVwibWF4XCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1pbkxlbmd0aF09XCJtaW5MZW5ndGhcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWF4TGVuZ3RoXT1cIm1heExlbmd0aFwiLz5cclxuXHRcdFx0XHRcdCAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImFyZWFcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZC1keW5hbWljLXRleHRhcmVhLXdyYXBwZXJcIj5cclxuXHRcdFx0XHRcdCAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGQtZHluYW1pYy10ZXh0YXJlYS1maWVsZFwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj5cclxuXHRcdFx0XHRcdCAgICA8dGV4dGFyZWEgI2VsZW1lbnRJbnB1dFxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgbWF0SW5wdXRcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCJcclxuXHRcdFx0XHRcdFx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIHJvd3M9XCI0XCI+XHJcblx0XHRcdFx0XHQgICAgPC90ZXh0YXJlYT5cclxuXHRcdFx0XHRcdCAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImVkaXRvclwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRkLWR5bmFtaWMtaW5wdXQtd3JhcHBlclwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XHJcblx0XHRcdFx0XHRcdDxhcHAtbmd4LWVkaXRvciBbKG5nTW9kZWwpXT1cInZhbHVlc1tsYW5nXVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVZhbHVlKCRldmVudCwgbGFuZylcIlxyXG5cdFx0XHRcdFx0XHRcdFtoZWlnaHRdPVwiaGVpZ2h0XCIgW21pbkhlaWdodF09XCJoZWlnaHRcIiBbdG9vbGJhcl09XCJ0b29sYmFyQ29uZmlnXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO1wiPlxyXG5cdFx0XHRcdFx0XHQ8L2FwcC1uZ3gtZWRpdG9yPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZmlsZS1pbnB1dFwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRkLWR5bmFtaWMtZmlsZS1pbnB1dC13cmFwcGVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG5cdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgdGRGaWxlRHJvcCBjbGFzcz1cInRkLWR5bmFtaWMtZmlsZS1pbnB1dC1maWVsZFwiIGZsb2F0TGFiZWw9XCJuZXZlclwiIChmaWxlRHJvcCk9XCJ2YWx1ZXNbbGFuZ10gPSAkZXZlbnRcIlxyXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCJmaWxlSW5wdXQuaW5wdXRFbGVtZW50LmNsaWNrKClcIiAoa2V5dXAuZW50ZXIpPVwiZmlsZUlucHV0LmlucHV0RWxlbWVudC5jbGljaygpXCJcclxuXHRcdFx0XHRcdFx0XHQoa2V5dXAuZGVsZXRlKT1cImZpbGVJbnB1dC5jbGVhcigpXCIgKGtleXVwLmJhY2tzcGFjZSk9XCJmaWxlSW5wdXQuY2xlYXIoKVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIFt2YWx1ZV09XCJ2YWx1ZXNbbGFuZ10/Lm5hbWVcIiBbcGxhY2Vob2xkZXJdPVwibGFiZWxcIiByZWFkb25seSAvPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHN0eWxlPVwiYWxpZ24tc2VsZjogY2VudGVyO1wiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cInZhbHVlc1tsYW5nXVwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xlYXIoKTsgY2hhbmdlVmFsdWUodW5kZWZpbmVkLGxhbmcpO1wiIChrZXl1cC5lbnRlcik9XCJmaWxlSW5wdXQuY2xlYXIoKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PHRkLWZpbGUtaW5wdXQgc3R5bGU9XCJhbGlnbi1zZWxmOmNlbnRlcjsgbWFyZ2luLWxlZnQ6MTBweDtcIiBjbGFzcz1cInRkLWZpbGUtaW5wdXRcIiAjZmlsZUlucHV0IFsobmdNb2RlbCldPVwidmFsdWVzW2xhbmddXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlVmFsdWUoJGV2ZW50LCBsYW5nKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbj5mb2xkZXI8L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8L3RkLWZpbGUtaW5wdXQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaERlZmF1bHQ+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGQtZHluYW1pYy1pbnB1dC13cmFwcGVyXCI+XHJcblx0XHRcdFx0XHQgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRkLWR5bmFtaWMtaW5wdXQtZmllbGRcIj5cclxuXHRcdFx0XHRcdCAgICA8aW5wdXQgI2VsZW1lbnRJbnB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIG1hdElucHV0XHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlc1tsYW5nXVwiXHJcblx0XHRcdFx0XHRcdFx0XHQobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VWYWx1ZSgkZXZlbnQsIGxhbmcpXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1pbl09XCJtaW5cIlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgW2F0dHIubWF4XT1cIm1heFwiXHJcblx0XHRcdFx0XHQgICAgICAgICAgICBbYXR0ci5taW5MZW5ndGhdPVwibWluTGVuZ3RoXCJcclxuXHRcdFx0XHRcdCAgICAgICAgICAgIFthdHRyLm1heExlbmd0aF09XCJtYXhMZW5ndGhcIi8+XHJcblx0XHRcdFx0XHQgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvbWF0LXRhYj5cclxuXHRcdDxtYXQtdGFiIFtkaXNhYmxlZF09dHJ1ZT5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIG1hdFRhYkxhYmVsPjxtYXQtaWNvbiAoY2xpY2spPVwiYWRkTGFuZygpXCIgc3R5bGU9XCJjb2xvcjogIzAwMDAwMDtcIj5hZGQ8L21hdC1pY29uPjwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L21hdC10YWI+XHJcblx0PC9tYXQtdGFiLWdyb3VwPlxyXG48L2Rpdj5cclxuYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG5cdGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG5cclxuXHRoZWlnaHQ6IHN0cmluZyA9IFwiMTUwcHhcIjtcclxuXHJcblx0dG9vbGJhckNvbmZpZyA6IGFueSA9IFtcclxuICAgICAgICBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZSddLFxyXG4gICAgICAgIFsnZm9udE5hbWUnLCAnZm9udFNpemUnLCAnY29sb3InXSxcclxuICAgICAgICBbJ2p1c3RpZnlMZWZ0JywgJ2p1c3RpZnlDZW50ZXInLCAnanVzdGlmeVJpZ2h0JywgJ2p1c3RpZnlGdWxsJywgJ2luZGVudCcsICdvdXRkZW50J10sXHJcbiAgICAgICAgWydjdXQnLCAnY29weScsICdkZWxldGUnLCAncmVtb3ZlRm9ybWF0JywgJ3VuZG8nLCAncmVkbyddLFxyXG4gICAgICAgIFsnaG9yaXpvbnRhbExpbmUnLCAnb3JkZXJlZExpc3QnLCAndW5vcmRlcmVkTGlzdCddLFxyXG4gICAgICAgIFsnbGluaycsICd1bmxpbmsnXVxyXG4gICAgXTtcclxuXHJcblx0bGFiZWw6IHN0cmluZyA9ICcnO1xyXG5cclxuXHR0eXBlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG5cdHJlcXVpcmVkOiBib29sZWFuID0gdW5kZWZpbmVkO1xyXG5cclxuXHRtaW46IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0bWF4OiBudW1iZXIgPSB1bmRlZmluZWQ7XHJcblxyXG5cdG1pbkxlbmd0aDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuXHRtYXhMZW5ndGg6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0bGFuZ3MgOiBzdHJpbmdbXSA9IFsnZXMnXTtcclxuXHJcblx0Ly9UT0RPOiBHdWFjaGF1Li4uXHJcblx0YWxsTGFuZ3MgOiBzdHJpbmdbXSA9IFsnZXMnICwgJ2VuJyAsICdmcicgLCAnZGUnXTtcclxuXHJcblx0c2VsZWN0ZWRJbmRleCA6IG51bWJlciA9IDA7XHJcblxyXG5cdHNlbGVjdGVkTGFuZyA6IHN0cmluZyA9ICcnO1xyXG5cclxuXHR0ZW1wbGF0ZVR5cGUgOiBzdHJpbmcgPSAnJztcclxuXHJcblx0dmFsdWVzOiBhbnk7XHJcblx0dmFsdWVzSlNPTjogYW55O1xyXG5cclxuXHRAVmlld0NoaWxkKCd0YWJHcm91cCcpXHJcblx0dGFiR3JvdXAgOiBNYXRUYWJHcm91cDtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvciA6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHRzdXBlcigpO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkTGFuZyA9IHRoaXMubGFuZ3NbMF07XHJcblxyXG5cdFx0dGhpcy50ZW1wbGF0ZVR5cGUgPSBUcmFuc2xhdGVDb21wb25lbnQuZ2V0VGVtcGxhdGVUeXBlKHRoaXMudHlwZSk7XHJcblxyXG5cdFx0dGhpcy5pbml0VmFsdWUodGhpcy52YWx1ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGluQXJyYXkoYXJyOiBhbnlbXSAsIHZhbHVlOiBhbnkpIDogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gYXJyLmluZGV4T2YodmFsdWUpID4gLTE7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGluaXRWYWx1ZSh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLnZhbHVlc0pTT04gPSB7fTtcclxuXHRcdGlmICh2YWx1ZSkge1xyXG5cclxuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHR2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmxhbmdzID0gW107XHJcblx0XHRcdGZvciAobGV0IGxhbmcgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5pbkFycmF5KHRoaXMuYWxsTGFuZ3MsbGFuZykpIHtcclxuXHRcdFx0XHRcdHRoaXMubGFuZ3MucHVzaChsYW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGxldCBsYW5nIG9mIHRoaXMubGFuZ3MpIHtcclxuXHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0dGhpcy52YWx1ZXNKU09OW2xhbmddID0gKHZhbHVlW2xhbmddIHx8ICcnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSAnJztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmFsdWVzID0gdGhpcy5wYXJzZUluaXQodGhpcy52YWx1ZXNKU09OKTtcclxuXHJcblx0XHRsZXQganNvblZhbHVlIDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXNKU09OKTtcclxuXHRcdHRoaXMuY29udHJvbC5zZXRWYWx1ZShqc29uVmFsdWUpO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlSW5pdCh2YWx1ZXNKU09OOiBhbnkpIDogYW55IHtcclxuXHRcdGxldCB2YWx1ZXMgPSB7fTtcclxuXHJcblx0XHRmb3IgKGxldCBsYW5nIGluIHZhbHVlc0pTT04pIHtcclxuXHRcdFx0dmFsdWVzW2xhbmddID0gdGhpcy5wYXJzZVZhbHVlKHZhbHVlc0pTT05bbGFuZ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWx1ZXM7XHJcblx0fVxyXG5cclxuXHRwYXJzZVZhbHVlKHZhbHVlIDogYW55KSA6IGFueSB7XHJcblxyXG5cdFx0aWYgKHRoaXMudGVtcGxhdGVUeXBlID09ICdmaWxlLWlucHV0Jykge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRUZW1wbGF0ZVR5cGUodHlwZSA6IHN0cmluZykgOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdGNhc2UgJ3RleHQnOlxyXG5cdFx0XHRjYXNlICdpbnB1dCc6XHJcblx0XHRcdFx0cmV0dXJuICdpbnB1dCc7XHJcblx0XHRcdGNhc2UgJ3RleHRhcmVhJzpcclxuXHRcdFx0XHRyZXR1cm4gJ2FyZWEnO1xyXG5cdFx0XHRjYXNlICd0ZXh0LWVkaXRvcic6XHJcblx0XHRcdFx0cmV0dXJuICdlZGl0b3InO1xyXG5cdFx0XHRjYXNlICdmaWxlLWlucHV0JzpcclxuXHRcdFx0XHRyZXR1cm4gJ2ZpbGUtaW5wdXQnO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNlbGVjdExhbmcobGFuZyA6IHN0cmluZykge1xyXG5cdFx0bGV0IGluZGV4ID0gdGhpcy5sYW5ncy5maW5kSW5kZXgoIHJvdyA9PiB7XHJcblx0XHRcdHJldHVybiByb3cgPT0gbGFuZztcclxuXHRcdH0pO1xyXG5cdFx0aWYgKGluZGV4ICE9IHRoaXMuc2VsZWN0ZWRJbmRleCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFkZExhbmcoKSB7XHJcblx0XHRsZXQgbGFuZ3MgPSB0aGlzLmxhbmdzO1xyXG5cdFx0bGV0IHJlbUxhbmdzID0gdGhpcy5hbGxMYW5ncy5maWx0ZXIoIHggPT4ge1xyXG5cdFx0XHRyZXR1cm4gISB0aGlzLmluQXJyYXkobGFuZ3MseCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm9wZW5EaWFsb2cocmVtTGFuZ3MpO1xyXG5cdH1cclxuXHJcblx0cmVtb3ZlTGFuZyhsYW5nIDogc3RyaW5nKSB7XHJcblx0XHRpZiAodGhpcy5sYW5ncy5sZW5ndGggPD0gMSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGluZGV4ID0gdGhpcy5sYW5ncy5maW5kSW5kZXgoIHJvdyA9PiB7XHJcblx0XHRcdHJldHVybiByb3cgPT0gbGFuZztcclxuXHRcdH0pO1xyXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHR0aGlzLmxhbmdzLnNwbGljZShpbmRleCwxKTtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLnZhbHVlc1tsYW5nXTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudmFsdWVzSlNPTltsYW5nXTtcclxuXHJcblx0XHRcdGlmIChpbmRleCA9PSB0aGlzLnNlbGVjdGVkSW5kZXgpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRMYW5nID0gdGhpcy5sYW5nc1swXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdExhbmcodGhpcy5zZWxlY3RlZExhbmcpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCBqc29uVmFsdWUgOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlc0pTT04pO1xyXG5cdFx0XHR0aGlzLmNvbnRyb2wuc2V0VmFsdWUoanNvblZhbHVlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb3BlbkRpYWxvZyhyZW1MYW5ncyA6IGFueVtdKSB7XHJcblx0XHRsZXQgZGF0YSA6IGFueSA9IHtcclxuXHRcdFx0bGFuZ3M6IHJlbUxhbmdzXHJcblx0XHR9O1xyXG5cdFx0bGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVHJhbnNsYXRlRGlhbG9nQ29tcG9uZW50LCB7IGRhdGEgOiBkYXRhIH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShsYW5nID0+IHtcclxuXHRcdFx0aWYgKGxhbmcpIHtcclxuXHRcdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSAnJztcclxuXHRcdFx0XHR0aGlzLnZhbHVlc1tsYW5nXSA9IHRoaXMucGFyc2VWYWx1ZSh0aGlzLnZhbHVlc0pTT05bbGFuZ10pO1xyXG5cclxuXHRcdFx0XHR0aGlzLmxhbmdzLnB1c2gobGFuZyk7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RMYW5nKGxhbmcpO1xyXG5cdFx0XHR9XHJcbiAgICBcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgY2hhbmdlVmFsdWUobmV3VmFsdWUgOiBhbnksIGxhbmc6IHN0cmluZykge1xyXG5cdFx0aWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xyXG5cdFx0XHR0aGlzLnZhbHVlc0pTT05bbGFuZ10gPSBhd2FpdCBUcmFuc2xhdGVDb21wb25lbnQudG9CYXNlNjQobmV3VmFsdWUpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAobmV3VmFsdWUgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRoaXMudmFsdWVzSlNPTltsYW5nXSA9ICcnO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMudmFsdWVzSlNPTltsYW5nXSA9IG5ld1ZhbHVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBqc29uVmFsdWUgOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlc0pTT04pO1xyXG5cclxuXHRcdHRoaXMuY29udHJvbC5zZXRWYWx1ZShqc29uVmFsdWUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFzeW5jIHRvQmFzZTY0KHZhbHVlIDogYW55KSA6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRsZXQgbXlSZWFkZXIgOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcblx0XHRsZXQgaW1hZ2UgOiBzdHJpbmcgPSAnJztcclxuXHJcblx0XHRsZXQgcHJvbWlzZSA6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlPHN0cmluZz4oIHJlc29sdmUgPT4ge1xyXG5cdFx0XHRteVJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xyXG5cdFx0XHRcdGltYWdlID0gbXlSZWFkZXIucmVzdWx0O1xyXG5cdFx0XHRcdHJlc29sdmUoaW1hZ2UpO1xyXG5cdFx0XHR9XHJcblx0XHRcdG15UmVhZGVyLnJlYWRBc0RhdGFVUkwodmFsdWUpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIHByb21pc2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIl19