acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
300 lines • 56.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input, EventEmitter, Output } from '@angular/core';
import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model';
import { ChoiceElement } from '../assist-data-element.component';
import { SelectedCondition } from '../../../core/models/executed-result.model';
var /** @type {?} */ $ = require('jquery');
import { FormBuilder, Validators } from '@angular/forms';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
var AssistChoiceElementComponent = /** @class */ (function () {
function AssistChoiceElementComponent(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnChoiceElement = new EventEmitter();
this.choiceChange = new EventEmitter();
}
/**
* @return {?}
*/
AssistChoiceElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createChoiceElementForm();
};
/**
* @return {?}
*/
AssistChoiceElementComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
$('#div_' + this.choiceDataElement.id + '_other').hide();
if (this.choiceDataElement.currentValue !== undefined) {
$('#' + this.choiceDataElement.currentValue + '_' + this.choiceDataElement.id).prop('checked', true);
this.choiceValue = this.choiceDataElement.currentValue;
// tslint:disable-next-line:forin
for (var /** @type {?} */ choice in this.choiceDataElement.choiceInfo) {
// if (this.choiceDataElement.choiceInfo[choice].value === 'hypoEnhancing'){
// console.log('asdasd');
// }
if (this.choiceDataElement.choiceInfo[choice].value === this.choiceDataElement.currentValue) {
if (this.choiceDataElement.choiceInfo[choice].reportText !== undefined) {
this.selectedChoiceReportText = this.choiceDataElement.choiceInfo[choice].reportText;
}
else {
this.selectedChoiceReportLabel = this.choiceDataElement.choiceInfo[choice].label;
}
}
}
if (this.choiceDataElement.choiceInfo.length <= 5) {
this.updateChoiceValue(this.choiceDataElement.id, this.choiceDataElement.label, (this.selectedChoiceReportText !== undefined) ? this.selectedChoiceReportText : this.selectedChoiceReportLabel, this.choiceDataElement.currentValue);
}
else {
this.updateDropdownChoiceSelected(this.choiceDataElement.id, this.selectedChoiceReportLabel, this.choiceDataElement.currentValue, this.choiceDataElement.label);
}
}
else {
this.returnChoiceElement.emit(undefined);
}
};
/**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
AssistChoiceElementComponent.prototype.updateChoiceValue = /**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
function (elementId, selectedElement, selectedText, selectedValue) {
if (selectedValue !== undefined) {
var /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = selectedValue;
choiceElement.selectedText = selectedText;
this.showOrHideFreeText(elementId, choiceElement.selectedValue);
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedElement;
this.selectedCondition.selectedValue = selectedText;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
}
};
/**
* @param {?} elementId
* @param {?} elementLabel
* @param {?} elementValue
* @param {?} selectedCondition
* @return {?}
*/
AssistChoiceElementComponent.prototype.updateDropdownChoiceSelected = /**
* @param {?} elementId
* @param {?} elementLabel
* @param {?} elementValue
* @param {?} selectedCondition
* @return {?}
*/
function (elementId, elementLabel, elementValue, selectedCondition) {
var /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = elementValue;
choiceElement.selectedText = elementLabel;
if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
choiceElement.selectedText = '';
choiceElement.selectedValue = '';
}
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = elementLabel;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
AssistChoiceElementComponent.prototype.choiceSelected = /**
* @param {?} elementId
* @param {?} selectedElement
* @param {?} selectedText
* @param {?} selectedValue
* @return {?}
*/
function (elementId, selectedElement, selectedText, selectedValue) {
var /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = selectedValue;
choiceElement.selectedText = selectedText;
this.showOrHideFreeText(elementId, choiceElement.selectedValue);
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedElement;
this.selectedCondition.selectedValue = selectedText;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} element
* @param {?} selectedCondition
* @return {?}
*/
AssistChoiceElementComponent.prototype.dropdownChoiceSelected = /**
* @param {?} element
* @param {?} selectedCondition
* @return {?}
*/
function (element, selectedCondition) {
var /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = element.id;
choiceElement.selectedValue = (element.options[element.selectedIndex].text === 'Other, please specify…') ? 'freetext' : element.value;
choiceElement.selectedText = element.options[element.selectedIndex].text;
this.showOrHideFreeText(element.id, choiceElement.selectedValue);
if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
choiceElement.selectedText = '';
choiceElement.selectedValue = '';
}
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = element.id;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = element.options[element.selectedIndex].text;
// Code should comes here //
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @return {?}
*/
AssistChoiceElementComponent.prototype.createChoiceElementForm = /**
* @return {?}
*/
function () {
this.choiceElementForm = this.formBuilder.group({
checkBox: ['', Validators.required],
}, {
validator: this.specificValueInsideRange('checkBox')
});
};
/**
* @param {?} elementId
* @param {?} selectedValue
* @return {?}
*/
AssistChoiceElementComponent.prototype.showOrHideFreeText = /**
* @param {?} elementId
* @param {?} selectedValue
* @return {?}
*/
function (elementId, selectedValue) {
if (selectedValue === 'freetext') {
$('#div_' + elementId + '_other').show();
}
else {
$('#div_' + elementId + '_other').hide();
$('#txt_other_' + elementId).val('');
}
};
/**
* @param {?} element
* @param {?} elementId
* @param {?} selectedCondition
* @return {?}
*/
AssistChoiceElementComponent.prototype.updateFreeText = /**
* @param {?} element
* @param {?} elementId
* @param {?} selectedCondition
* @return {?}
*/
function (element, elementId, selectedCondition) {
var /** @type {?} */ choiceElement = new ChoiceElement();
choiceElement.elementId = elementId;
choiceElement.selectedValue = (element.value === 'Other') ? 'freetext' : element.value;
choiceElement.selectedText = element.value;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = element.value;
this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} checkBoxKey
* @return {?}
*/
AssistChoiceElementComponent.prototype.specificValueInsideRange = /**
* @param {?} checkBoxKey
* @return {?}
*/
function (checkBoxKey) {
var _this = this;
return function (group) {
var /** @type {?} */ choiceControl = group.controls[checkBoxKey];
if ((choiceControl.value === undefined || choiceControl.value === '' || choiceControl.value === '--Select--' || _this.choiceValue === '')) {
return choiceControl.setErrors({ notEquivalent: true });
}
else {
return choiceControl.setErrors(null);
}
};
};
AssistChoiceElementComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-assist-choice-element',
template: "<form [formGroup]=\"choiceElementForm\" novalidate>\n <div class=\"form-group\">\n <div class=\"col-sm-5 text-right\">\n <label class=\"control-label break-word\">\n {{choiceDataElement.label}} <span *ngIf=\"choiceDataElement.unit != undefined && choiceDataElement.unit != ''\"> ({{choiceDataElement.unit}})</span>\n </label>\n <ng-container *ngIf=\"choiceDataElement.hint !== '' && choiceDataElement.hint !== undefined\">\n <i class=\"whitespace\">\n <span class=\"fa fa-info-circle text-primary\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"{{choiceDataElement.hint}}\"></span>\n </i>\n </ng-container>\n <ng-container *ngIf=\"choiceDataElement.diagrams != undefined \">\n <acr-hint-diagram [dataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n </ng-container>\n <span *ngIf=\"choiceElementForm.controls['checkBox'].invalid && this.choiceDataElement.isRequired\" class=\"required-field whitespace\"\n title=\"Required Field\">*</span>\n </div>\n \n <div class=\"col-sm-7 text-left content-padding\">\n <ng-container *ngIf=\"choiceDataElement.choiceInfo.length <= 2\">\n <ng-container *ngIf=\"imagePath != undefined\">\n <ng-container *ngIf=\"choiceDataElement.imageMap == undefined\">\n <ng-container *ngFor=\"let choice of choiceDataElement.choiceInfo\">\n <div class=\"radio custom-radio-style\">\n <label> \n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"choiceValue\" id=\"{{choice.value}}_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"{{choice.value}}\"\n (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)\"> {{choice.label}}\n </label>\n </div>\n </ng-container>\n <ng-container *ngIf=\"choiceDataElement.allowFreetext\">\n <div class=\"radio custom-radio-style\">\n <label>\n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"other_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"freetext\" (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')\"> Other, please specify\u2026</label>\n </div>\n <div id='div_{{choiceDataElement.id}}_other'>\n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n class=\"form-control\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'\n placeholder=\"Please specify '{{choiceDataElement.label}}'\">\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"choiceDataElement.imageMap != undefined\">\n <div class=\"row\">\n <div class=\"col-xs-6 col-sm-2\">\n <ng-container *ngFor=\"let choice of choiceDataElement.choiceInfo\">\n <div class=\"radio custom-radio-style\">\n <label>\n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"choiceValue\" id=\"{{choice.value}}_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"{{choice.value}}\"\n (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)\"> {{choice.label}}\n </label>\n </div>\n </ng-container>\n <ng-container *ngIf=\"choiceDataElement.allowFreetext\">\n <div class=\"radio custom-radio-style\">\n <label>\n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"other_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"other\" (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')\"> Other, please specify\u2026</label>\n </div>\n <div id='div_{{choiceDataElement.id}}_other'>\n <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n class=\"form-control\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'\n placeholder=\"Please specify '{{choiceDataElement.label}}'\">\n </div>\n </ng-container>\n </div>\n <div class=\"col-xs-6 col-sm-2\">\n <label class=\"control-label\">OR</label>\n </div>\n <acr-image-map [DataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-image-map>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"choiceDataElement.choiceInfo.length > 2\"> \n <select [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\"\n [(ngModel)]=\"choiceValue\" id=\"{{choiceDataElement.id}}\" (change)=\"dropdownChoiceSelected($event.target, choiceDataElement.label)\"\n formControlName=\"checkBox\" class=\"form-control\">\n <!-- <option \n [selected]=\"choiceDataElement.currentValue == choiceDataElement.ChoiceNotRelevant ? true : false\">--Select--</option>\n -->\n <option [selected]=\"\n choiceDataElement.ChoiceNotRelevant != undefined ?\n (choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1 ? \n true :\n true)\n : true\">--Select--</option>\n\n <!-- [selected]=\"choice.value === choiceDataElement.currentValue\" -->\n\n \n <option *ngFor=\"let choice of choiceDataElement.choiceInfo\"\n [hidden]=\"choiceDataElement.ChoiceNotRelevant != undefined ? \n choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null\n : null\"\n [value]=\"choice.value\" \n [selected]=\"choiceDataElement.ChoiceNotRelevant != undefined ?\n choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1\n || choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1? false : \n choice.value === choiceDataElement.currentValue ? true : false\n : choice.value === choiceDataElement.currentValue ? true : false\" \n >{{choice.label}}</option>\n <option *ngIf=\"choiceDataElement.allowFreetext\" [value]=\"'freetext'\" [selected]=\"'freetext'\">Other, please specify\u2026</option>\n </select>\n <div id='div_{{choiceDataElement.id}}_other'>\n\n <input id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n placeholder=\"Please specify '{{choiceDataElement.label}}'\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'>\n </div>\n <ng-container *ngIf=\"choiceDataElement.imageMap != undefined && imagePath != undefined\">\n <div class=\"row padding-top-10\">\n <div class=\"col-xs-6 col-sm-2\">\n <label class=\"control-label\">OR</label>\n </div>\n <acr-image-map [DataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-image-map>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</form>\n\n",
styles: ["", ".required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}"]
},] },
];
/** @nocollapse */
AssistChoiceElementComponent.ctorParameters = function () { return [
{ type: FormBuilder },
{ type: SimulatorEngineService }
]; };
AssistChoiceElementComponent.propDecorators = {
choiceDataElement: [{ type: Input }],
imagePath: [{ type: Input }],
returnChoiceElement: [{ type: Output }],
choiceChange: [{ type: Output }],
disabled: [{ type: Input }]
};
return AssistChoiceElementComponent;
}());
export { AssistChoiceElementComponent };
function AssistChoiceElementComponent_tsickle_Closure_declarations() {
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceDataElement;
/** @type {?} */
AssistChoiceElementComponent.prototype.imagePath;
/** @type {?} */
AssistChoiceElementComponent.prototype.returnChoiceElement;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceChange;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceValue;
/** @type {?} */
AssistChoiceElementComponent.prototype.choiceElementForm;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedCondition;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedIndex;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedChoiceReportText;
/** @type {?} */
AssistChoiceElementComponent.prototype.selectedChoiceReportLabel;
/** @type {?} */
AssistChoiceElementComponent.prototype.disabled;
/** @type {?} */
AssistChoiceElementComponent.prototype.formBuilder;
/** @type {?} */
AssistChoiceElementComponent.prototype.simulatorEngineService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1jaG9pY2UtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UscUJBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QixPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOztJQThJdkYsc0NBQW9CLFdBQXdCLEVBQVUsc0JBQThDO1FBQWhGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjttQ0FYcEUsSUFBSSxZQUFZLEVBQUU7NEJBQ3pCLElBQUksWUFBWSxFQUFFO0tBVThEOzs7O0lBQ3pHLCtDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0tBQ2hDOzs7O0lBRUQsc0RBQWU7OztJQUFmO1FBQ0UsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxD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Q29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIHt7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSA8c3BhbiAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7Y2hvaWNlRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwid2hpdGVzcGFjZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnlcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgdGl0bGU9XCJ7e2Nob2ljZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJjaG9pY2VEYXRhRWxlbWVudFwiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCI+PC9hY3ItaGludC1kaWFncmFtPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjaG9pY2VFbGVtZW50Rm9ybS5jb250cm9sc1snY2hlY2tCb3gnXS5pbnZhbGlkICAmJiB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlzUmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkIHdoaXRlc3BhY2VcIlxyXG4gICAgICAgIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj4qPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyB0ZXh0LWxlZnQgY29udGVudC1wYWRkaW5nXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSAyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5pbWFnZU1hcCA9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2UudmFsdWV9fV97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwicmFkaW9cIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCBjaG9pY2UudmFsdWUpXCI+IHt7Y2hvaWNlLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpbyBjdXN0b20tcmFkaW8tc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cImZyZWV0ZXh0XCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmeeKApjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSdcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmltYWdlTWFwICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy02IGNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlLnZhbHVlfX1fe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cInt7Y2hvaWNlLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNob2ljZVNlbGVjdGVkKGNob2ljZURhdGFFbGVtZW50LmlkLCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbCwgKGNob2ljZS5yZXBvcnRUZXh0ICE9PSB1bmRlZmluZWQpID8gY2hvaWNlLnJlcG9ydFRleHQgOiBjaG9pY2UubGFiZWwsIGNob2ljZS52YWx1ZSlcIj4ge3tjaG9pY2UubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cIm90aGVyXCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmeeKApjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPk9SPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMlwiPiAgICAgICAgICAgIFxyXG4gICAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgKGNoYW5nZSk9XCJkcm9wZG93bkNob2ljZVNlbGVjdGVkKCRldmVudC50YXJnZXQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICA8IS0tIDxvcHRpb24gXHJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID09IGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ID8gdHJ1ZSA6IGZhbHNlXCI+LS1TZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAtLT5cclxuICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJcclxuICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAoY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTEgPyBcclxuICAgICAgICAgIHRydWUgOlxyXG4gICAgICAgICAgdHJ1ZSlcclxuICAgICAgICAgIDogdHJ1ZVwiPi0tU2VsZWN0LS08L29wdGlvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZVwiIC0tPlxyXG5cclxuICAgICAgICBcclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvXCJcclxuICAgICAgICAgIFtoaWRkZW5dPVwiY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQgIT0gdW5kZWZpbmVkID8gXHJcbiAgICAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2UudmFsdWUpID4gLTEgPyB0cnVlOiBudWxsXHJcbiAgICAgICAgICAgICAgOiBudWxsXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAgIFxyXG4gICAgICAgICAgW3NlbGVjdGVkXT1cImNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTFcclxuICAgICAgICAgICB8fCBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMT8gZmFsc2UgOiBcclxuICAgICAgICAgICBjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgIDogY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPyB0cnVlIDogZmFsc2VcIiAgICAgICBcclxuICAgICAgICAgID57e2Nob2ljZS5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiIFt2YWx1ZV09XCInZnJlZXRleHQnXCIgW3NlbGVjdGVkXT1cIidmcmVldGV4dCdcIj5PdGhlciwgcGxlYXNlIHNwZWNpZnnigKY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuXHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuaW1hZ2VNYXAgIT0gdW5kZWZpbmVkICAmJiBpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHBhZGRpbmctdG9wLTEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5PUjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcblxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RDaG9pY2VFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjaG9pY2VEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybkNob2ljZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNob2ljZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBzZWxlY3RlZEluZGV4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlKSB7IH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlQ2hvaWNlRWxlbWVudEZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICQoJyNkaXZfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgJCgnIycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSArICdfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgdGhpcy5jaG9pY2VWYWx1ZSA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlID09PSAnaHlwb0VuaGFuY2luZycpe1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnYXNkYXNkJyk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgPT09IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0ID0gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hvaWNlVmFsdWUodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5pZCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5sYWJlbCxcclxuICAgICAgICAgICh0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0IDogdGhpcy5zZWxlY3RlZENob2ljZVJlcG9ydExhYmVsLCB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wZG93bkNob2ljZVNlbGVjdGVkKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQsIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hvaWNlVmFsdWUoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkRWxlbWVudDogc3RyaW5nLCBzZWxlY3RlZFRleHQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICAgIHRoaXMuc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZCwgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkRWxlbWVudDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRHJvcGRvd25DaG9pY2VTZWxlY3RlZChlbGVtZW50SWQsIGVsZW1lbnRMYWJlbCwgZWxlbWVudFZhbHVlLCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnRWYWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudExhYmVsO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50TGFiZWw7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRFbGVtZW50OiBzdHJpbmcsIHNlbGVjdGVkVGV4dDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQsIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wZG93bkNob2ljZVNlbGVjdGVkKGVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudC5pZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IChlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XS50ZXh0ID09PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ54oCmJykgPyAnZnJlZXRleHQnIDogZWxlbWVudC52YWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50LmlkLCBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50LmlkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICAvLyBDb2RlIHNob3VsZCBjb21lcyBoZXJlIC8vXHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNob2ljZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5jaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBjaGVja0JveDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0sIHtcclxuICAgICAgICB2YWxpZGF0b3I6IHRoaXMuc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKCdjaGVja0JveCcpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlID09PSAnZnJlZXRleHQnKSB7XHJcbiAgICAgICQoJyNkaXZfJyArIGVsZW1lbnRJZCArICdfb3RoZXInKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjZGl2XycgKyBlbGVtZW50SWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgICAkKCcjdHh0X290aGVyXycgKyBlbGVtZW50SWQpLnZhbCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcmVlVGV4dChlbGVtZW50LCBlbGVtZW50SWQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gKGVsZW1lbnQudmFsdWUgPT09ICdPdGhlcicpID8gJ2ZyZWV0ZXh0JyA6IGVsZW1lbnQudmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAoKGNob2ljZUNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnJyB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKHsgbm90RXF1aXZhbGVudDogdHJ1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY2hvaWNlQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==