acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
6,865 lines • 888 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/BehaviorSubject'), require('util'), require('@angular/common'), require('rxjs/internal/Subject'), require('@angular/platform-browser'), require('@angular/forms'), require('ngx-bootstrap/carousel/slide.component'), require('ngx-bootstrap/carousel/carousel.component'), require('ngx-bootstrap/carousel/carousel.config'), require('ngx-drag-scroll'), require('angular2-datetimepicker'), require('ngx-duration-picker'), require('@angular/http'), require('rxjs/add/operator/map')) :
typeof define === 'function' && define.amd ? define('acr-assist-simulator-module', ['exports', '@angular/core', 'rxjs/BehaviorSubject', 'util', '@angular/common', 'rxjs/internal/Subject', '@angular/platform-browser', '@angular/forms', 'ngx-bootstrap/carousel/slide.component', 'ngx-bootstrap/carousel/carousel.component', 'ngx-bootstrap/carousel/carousel.config', 'ngx-drag-scroll', 'angular2-datetimepicker', 'ngx-duration-picker', '@angular/http', 'rxjs/add/operator/map'], factory) :
(factory((global['acr-assist-simulator-module'] = {}),global.ng.core,global.rxjs.BehaviorSubject,null,global.ng.common,global.rxjs['internal/Subject'],global.ng.platformBrowser,global.ng.forms,null,null,null,null,null,null,global.ng.http));
}(this, (function (exports,core,BehaviorSubject,util,common,Subject,platformBrowser,forms,slide_component,carousel_component,carousel_config,ngxDragScroll,angular2Datetimepicker,ngxDurationPicker,http) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b)
if (b.hasOwnProperty(p))
d[p] = b[p]; };
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __values(o) {
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
if (m)
return m.call(o);
return {
next: function () {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var SimulatorState = (function () {
function SimulatorState() {
this.nonRelevantDataElementIds = [];
this.endPointId = '';
this.selectedDecisionPointId = '';
this.selectedDecisionPointLabel = '';
this.selectedBranchLabel = '';
}
return SimulatorState;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DataElementValues = (function () {
function DataElementValues(values) {
this.values = values;
}
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
DataElementValues.prototype.addOrUpdate = /**
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
this.values[key] = value;
};
/**
* @param {?} key
* @return {?}
*/
DataElementValues.prototype.get = /**
* @param {?} key
* @return {?}
*/
function (key) {
return this.values[key];
};
/**
* @param {?} key
* @return {?}
*/
DataElementValues.prototype.delete = /**
* @param {?} key
* @return {?}
*/
function (key) {
return this.values.delete(key);
};
/**
* @return {?}
*/
DataElementValues.prototype.getAll = /**
* @return {?}
*/
function () {
return this.values;
};
return DataElementValues;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ArithmeticExpression = (function () {
function ArithmeticExpression() {
}
return ArithmeticExpression;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ expressionParser = require('expr-eval').Parser;
var SimulatorEngineService = (function () {
function SimulatorEngineService() {
this.endOfRoadReached = false;
this.lastConditionMetBranchLevel = 1;
this.nonRelevantDataElementIds = new Array();
this.simulatorStateChanged = new BehaviorSubject.BehaviorSubject(new SimulatorState());
this.dataElementValues = new Map();
this.dataElementTexts = new Map();
this.nonRelevantDataElementIds = new Array();
}
/**
* @return {?}
*/
SimulatorEngineService.prototype.getTemplate = /**
* @return {?}
*/
function () {
return this.template;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.getAllDataElementValues = /**
* @return {?}
*/
function () {
return this.dataElementValues;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.getAllDataElementTexts = /**
* @return {?}
*/
function () {
return this.dataElementTexts;
};
/**
* @param {?} dataElementId
* @return {?}
*/
SimulatorEngineService.prototype.getDataElementValue = /**
* @param {?} dataElementId
* @return {?}
*/
function (dataElementId) {
return this.dataElementValues[dataElementId];
};
/**
* @param {?} dataElementId
* @return {?}
*/
SimulatorEngineService.prototype.getDataElementText = /**
* @param {?} dataElementId
* @return {?}
*/
function (dataElementId) {
return this.dataElementTexts[dataElementId];
};
/**
* @param {?} dataElementId
* @param {?} value
* @param {?} text
* @return {?}
*/
SimulatorEngineService.prototype.addOrUpdateDataElement = /**
* @param {?} dataElementId
* @param {?} value
* @param {?} text
* @return {?}
*/
function (dataElementId, value, text) {
this.dataElementValues[dataElementId] = value;
this.dataElementTexts[dataElementId] = text;
this.evaluateDecisionPoints();
};
/**
* @param {?} decisionPoint
* @param {?} branchingLevel
* @return {?}
*/
SimulatorEngineService.prototype.evaluateDecisionPoint = /**
* @param {?} decisionPoint
* @param {?} branchingLevel
* @return {?}
*/
function (decisionPoint, branchingLevel) {
var /** @type {?} */ currentBranchCount = 0;
var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length;
try {
for (var _a = __values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) {
var branch = _b.value;
currentBranchCount++;
var /** @type {?} */ conditionMet = false;
if (this.endOfRoadReached) {
break;
}
if (branch.compositeCondition !== undefined) {
conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
}
else if (branch.condition !== undefined) {
conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues));
}
if (conditionMet) {
this.lastConditionMetBranchLevel = branchingLevel;
// if (nonRelevantDataElementIds === undefined) {
// nonRelevantDataElementIds = new Array<string>();
// }
// if (branch.notRelevantDataElements !== undefined) {
// for (const nonRelevantDataElementReference of branch.notRelevantDataElements.dataElementReferences) {
// nonRelevantDataElementIds.push(nonRelevantDataElementReference.dataElementId);
// }
// }
if (branch.decisionPoints !== undefined) {
try {
for (var _c = __values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
var branchDecisionPoint = _d.value;
var /** @type {?} */ newBranchingLevel = branchingLevel + 1;
// this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel, nonRelevantDataElementIds);
this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel);
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (_d && !_d.done && (_e = _c.return))
_e.call(_c);
}
finally {
if (e_1)
throw e_1.error;
}
}
}
else if (branch.endPointRef !== undefined) {
var /** @type {?} */ simulatorState = new SimulatorState();
simulatorState.endPointId = branch.endPointRef.endPointId;
// simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds;
simulatorState.selectedBranchLabel = branch.label;
simulatorState.selectedDecisionPointId = decisionPoint.id;
simulatorState.selectedDecisionPointLabel = decisionPoint.label;
// this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds);
this.simulatorStateChanged.next(simulatorState);
this.endOfRoadReached = true;
break;
}
}
else {
if (currentBranchCount >= totalBranchesInDecisionPoint) {
this.endOfRoadReached = true;
var /** @type {?} */ simulatorState = new SimulatorState();
// simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds;
// this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds);
this.simulatorStateChanged.next(simulatorState);
return;
}
else {
continue;
}
}
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (_b && !_b.done && (_f = _a.return))
_f.call(_a);
}
finally {
if (e_2)
throw e_2.error;
}
}
var e_2, _f, e_1, _e;
};
/**
* @param {?} nonRelevantDataElementIds
* @return {?}
*/
SimulatorEngineService.prototype.resetValuesOfNonRelevantDataElements = /**
* @param {?} nonRelevantDataElementIds
* @return {?}
*/
function (nonRelevantDataElementIds) {
// console.log(this.template.dataElements);
if (nonRelevantDataElementIds !== undefined) {
try {
for (var nonRelevantDataElementIds_1 = __values(nonRelevantDataElementIds), nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next(); !nonRelevantDataElementIds_1_1.done; nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next()) {
var nonRelevantDataElementId = nonRelevantDataElementIds_1_1.value;
var /** @type {?} */ defaultValue = void 0;
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataElement = _b.value;
if (dataElement.id === nonRelevantDataElementId) {
defaultValue = dataElement.defaultValue;
break;
}
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_3)
throw e_3.error;
}
}
this.dataElementValues[nonRelevantDataElementId] = defaultValue;
}
}
catch (e_4_1) {
e_4 = { error: e_4_1 };
}
finally {
try {
if (nonRelevantDataElementIds_1_1 && !nonRelevantDataElementIds_1_1.done && (_d = nonRelevantDataElementIds_1.return))
_d.call(nonRelevantDataElementIds_1);
}
finally {
if (e_4)
throw e_4.error;
}
}
}
var e_4, _d, e_3, _c;
};
/**
* @param {?} elementId
* @param {?} decisionPoint
* @param {?} branchingLevel
* @return {?}
*/
SimulatorEngineService.prototype.evaluateComputedElementDecisionPoint = /**
* @param {?} elementId
* @param {?} decisionPoint
* @param {?} branchingLevel
* @return {?}
*/
function (elementId, decisionPoint, branchingLevel) {
var /** @type {?} */ currentBranchCount = 0;
var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length;
try {
for (var _a = __values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) {
var branch = _b.value;
currentBranchCount++;
var /** @type {?} */ conditionMet = false;
if (this.endOfRoadReached) {
break;
}
if (branch.compositeCondition !== undefined) {
conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
}
else if (branch.condition !== undefined) {
conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues));
}
if (conditionMet) {
this.lastConditionMetBranchLevel = branchingLevel;
if (branch.decisionPoints !== undefined) {
try {
for (var _c = __values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
var branchDecisionPoint = _d.value;
var /** @type {?} */ newBranchingLevel = branchingLevel + 1;
this.evaluateComputedElementDecisionPoint(elementId, branchDecisionPoint, newBranchingLevel);
}
}
catch (e_5_1) {
e_5 = { error: e_5_1 };
}
finally {
try {
if (_d && !_d.done && (_e = _c.return))
_e.call(_c);
}
finally {
if (e_5)
throw e_5.error;
}
}
}
else if (branch.computedValue !== undefined) {
this.dataElementValues[elementId] = branch.computedValue.expressionText;
this.endOfRoadReached = true;
if (branch.computedValue instanceof ArithmeticExpression) {
this.dataElementValues[elementId] = this.evaluateArithmeticExpression(branch.computedValue.expressionText);
this.endOfRoadReached = true;
}
else {
this.dataElementValues[elementId] = branch.computedValue.expressionText;
this.endOfRoadReached = true;
}
break;
}
}
else {
if (currentBranchCount >= totalBranchesInDecisionPoint) {
this.endOfRoadReached = true;
this.dataElementValues[elementId] = undefined;
return;
}
else {
continue;
}
}
}
}
catch (e_6_1) {
e_6 = { error: e_6_1 };
}
finally {
try {
if (_b && !_b.done && (_f = _a.return))
_f.call(_a);
}
finally {
if (e_6)
throw e_6.error;
}
}
var e_6, _f, e_5, _e;
};
/**
* @param {?} computedValue
* @return {?}
*/
SimulatorEngineService.prototype.evaluateArithmeticExpression = /**
* @param {?} computedValue
* @return {?}
*/
function (computedValue) {
var /** @type {?} */ startIndex = 0;
var /** @type {?} */ endIndex = 0;
var _loop_1 = function () {
startIndex = computedValue.indexOf('{');
endIndex = computedValue.indexOf('}');
if (startIndex !== -1 && endIndex !== -1) {
var /** @type {?} */ dataElementId = computedValue.substring(startIndex + 1, endIndex);
var /** @type {?} */ replacingValue = computedValue.substring(startIndex, endIndex + 1);
var /** @type {?} */ dataElementValue = this_1.dataElementValues[dataElementId];
if (util.isArray(dataElementValue)) {
var /** @type {?} */ sum_1 = 0;
dataElementValue.forEach(function (val) {
sum_1 += +val;
});
dataElementValue = sum_1;
}
computedValue = computedValue.replace(replacingValue, dataElementValue);
}
};
var this_1 = this;
while (startIndex !== -1 && endIndex !== -1) {
_loop_1();
}
return expressionParser.evaluate(computedValue).toString();
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.evaluateComputedExpressions = /**
* @return {?}
*/
function () {
this.endOfRoadReached = false;
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var element = _b.value;
if (element.dataElementType === 'ComputedDataElement') {
var /** @type {?} */ computedElement = (element);
try {
for (var _c = __values(computedElement.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
var decisionPoint = _d.value;
this.evaluateComputedElementDecisionPoint(element.id, decisionPoint, 1);
if (this.dataElementValues[element.id] === undefined && decisionPoint.defaultBranch &&
decisionPoint.defaultBranch.computedValue) {
this.dataElementValues[element.id] = decisionPoint.defaultBranch.computedValue.expressionText;
}
this.endOfRoadReached = false;
}
}
catch (e_7_1) {
e_7 = { error: e_7_1 };
}
finally {
try {
if (_d && !_d.done && (_e = _c.return))
_e.call(_c);
}
finally {
if (e_7)
throw e_7.error;
}
}
}
}
}
catch (e_8_1) {
e_8 = { error: e_8_1 };
}
finally {
try {
if (_b && !_b.done && (_f = _a.return))
_f.call(_a);
}
finally {
if (e_8)
throw e_8.error;
}
}
var e_8, _f, e_7, _e;
};
/**
* @param {?} dataelement
* @param {?=} nonRelevantDataElementIds
* @return {?}
*/
SimulatorEngineService.prototype.evaluateConditionalProperty = /**
* @param {?} dataelement
* @param {?=} nonRelevantDataElementIds
* @return {?}
*/
function (dataelement, nonRelevantDataElementIds) {
if (nonRelevantDataElementIds === void 0) {
nonRelevantDataElementIds = [];
}
if (dataelement.conditionalProperties !== undefined) {
var /** @type {?} */ conditionMet = false;
try {
for (var _a = __values(dataelement.conditionalProperties), _b = _a.next(); !_b.done; _b = _a.next()) {
var conditionalProperty = _b.value;
if (conditionalProperty.condition !== undefined) {
conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues));
}
else if (conditionalProperty.compositeCondition !== undefined) {
conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
}
if (conditionMet) {
if (nonRelevantDataElementIds === undefined) {
this.nonRelevantDataElementIds = new Array();
}
if (conditionalProperty.isRelevant === 'false') {
this.nonRelevantDataElementIds.push(dataelement.id);
}
else {
dataelement.displaySequence = conditionalProperty.DisplaySequence;
dataelement.isRequired = conditionalProperty.isRequired !== undefined ?
(conditionalProperty.isRequired.toLowerCase() === 'true' ? true : false)
: true;
if (conditionalProperty.Minimum !== undefined && conditionalProperty.Minimum != null) {
dataelement.minimum = +conditionalProperty.Minimum;
}
if (conditionalProperty.Maximum !== undefined && conditionalProperty.Maximum != null) {
dataelement.maximum = +conditionalProperty.Maximum;
}
if (dataelement.dataElementType === 'ChoiceDataElement') {
((dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant;
}
if (dataelement.dataElementType === 'MultiChoiceDataElement') {
((dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant;
}
if (dataelement.dataElementType === 'DurationDataElement') {
((dataelement)).MinimumDay = +conditionalProperty.MinimumDay;
((dataelement)).MaximumDay = +conditionalProperty.MaximumDay;
((dataelement)).MinimumHours = +conditionalProperty.MinimumHours;
((dataelement)).MaximumHours = +conditionalProperty.MaximumHours;
((dataelement)).MinimumMinutes = +conditionalProperty.MinimumMinutes;
((dataelement)).MaxmimumMinutes = +conditionalProperty.MaxmimumMinutes;
}
}
return this.nonRelevantDataElementIds;
}
else {
if (dataelement.dataElementType === 'ChoiceDataElement') {
((dataelement)).ChoiceNotRelevant = new Array();
}
if (dataelement.dataElementType === 'MultiChoiceDataElement') {
((dataelement)).ChoiceNotRelevant = new Array();
}
}
}
}
catch (e_9_1) {
e_9 = { error: e_9_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_9)
throw e_9.error;
}
}
}
var e_9, _c;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.isCondtionMet = /**
* @return {?}
*/
function () {
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataelement = _b.value;
if (dataelement.conditionalProperties !== undefined) {
var /** @type {?} */ conditionMet = false;
try {
for (var _c = __values(dataelement.conditionalProperties), _d = _c.next(); !_d.done; _d = _c.next()) {
var conditionalProperty = _d.value;
if (conditionalProperty.condition !== undefined) {
conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues));
}
else if (conditionalProperty.compositeCondition !== undefined) {
conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
}
if (conditionMet) {
return true;
}
return false;
}
}
catch (e_10_1) {
e_10 = { error: e_10_1 };
}
finally {
try {
if (_d && !_d.done && (_e = _c.return))
_e.call(_c);
}
finally {
if (e_10)
throw e_10.error;
}
}
}
}
}
catch (e_11_1) {
e_11 = { error: e_11_1 };
}
finally {
try {
if (_b && !_b.done && (_f = _a.return))
_f.call(_a);
}
finally {
if (e_11)
throw e_11.error;
}
}
var e_11, _f, e_10, _e;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.evaluateDecisionAndConditionalProperty = /**
* @return {?}
*/
function () {
this.nonRelevantDataElementIds = new Array();
this.RevertConditionValues();
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataelement = _b.value;
this.evaluateConditionalProperty(dataelement, new Array());
}
}
catch (e_12_1) {
e_12 = { error: e_12_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_12)
throw e_12.error;
}
}
this.resetValuesOfNonRelevantDataElements(this.nonRelevantDataElementIds);
return this.nonRelevantDataElementIds;
var e_12, _c;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.RevertConditionValues = /**
* @return {?}
*/
function () {
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataelement = _b.value;
dataelement.isRequired = dataelement.isRequiredOverrider;
dataelement.displaySequence = dataelement.displaySequenceOverrider;
if (dataelement.dataElementType === 'NumericDataElement') {
((dataelement)).minimum = +((dataelement)).minimumOverrider;
((dataelement)).maximum = +((dataelement)).maximumOverrider;
}
if (dataelement.dataElementType === 'IntegerDataElement') {
((dataelement)).minimum = +((dataelement)).minimumOverrider;
((dataelement)).maximum = +((dataelement)).maximumOverrider;
}
if (dataelement.dataElementType === 'DurationDataElement') {
((dataelement)).MinimumDay = +((dataelement)).MinimumDayOverrider;
((dataelement)).MaximumDay = +((dataelement)).MaximumDayOverrider;
((dataelement)).MinimumHours = +((dataelement)).MinimumHoursOverrider;
((dataelement)).MaximumHours = +((dataelement)).MaximumHoursOverrider;
((dataelement)).MinimumMinutes = +((dataelement)).MinimumMinutesOverrider;
((dataelement)).MaxmimumMinutes = +((dataelement)).MaxmimumMinutesOverrider;
}
}
}
catch (e_13_1) {
e_13 = { error: e_13_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_13)
throw e_13.error;
}
}
var e_13, _c;
};
/**
* @return {?}
*/
SimulatorEngineService.prototype.evaluateDecisionPoints = /**
* @return {?}
*/
function () {
this.evaluateComputedExpressions();
this.endOfRoadReached = false;
try {
for (var _a = __values(this.template.rules.decisionPoints), _b = _a.next(); !_b.done; _b = _a.next()) {
var decisionPoint = _b.value;
this.evaluateDecisionPoint(decisionPoint, 1);
}
}
catch (e_14_1) {
e_14 = { error: e_14_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_14)
throw e_14.error;
}
}
var e_14, _c;
};
/**
* @param {?} template
* @return {?}
*/
SimulatorEngineService.prototype.initialize = /**
* @param {?} template
* @return {?}
*/
function (template) {
this.template = template;
try {
for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataElement = _b.value;
this.dataElementValues[dataElement.id] = dataElement.currentValue;
}
}
catch (e_15_1) {
e_15 = { error: e_15_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_15)
throw e_15.error;
}
}
var e_15, _c;
};
SimulatorEngineService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
SimulatorEngineService.ctorParameters = function () { return []; };
return SimulatorEngineService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CoreModule = (function () {
function CoreModule() {
}
/**
* @return {?}
*/
CoreModule.forRoot = /**
* @return {?}
*/
function () {
return {
ngModule: CoreModule,
providers: [SimulatorEngineService]
};
};
CoreModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
],
declarations: []
},] },
];
return CoreModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Template = (function () {
function Template() {
}
return Template;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Metadata = (function () {
function Metadata() {
}
return Metadata;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Diagram = (function () {
function Diagram() {
}
return Diagram;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ArrayCheckerService = (function () {
function ArrayCheckerService() {
}
/**
* @param {?} item
* @return {?}
*/
ArrayCheckerService.prototype.isArray = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item instanceof Array;
};
ArrayCheckerService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
ArrayCheckerService.ctorParameters = function () { return []; };
return ArrayCheckerService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DiagramService = (function () {
function DiagramService(arrayCheckerSeviceService) {
this.arrayCheckerSeviceService = arrayCheckerSeviceService;
}
/**
* @param {?} diagramJSON
* @return {?}
*/
DiagramService.prototype.returnDiagram = /**
* @param {?} diagramJSON
* @return {?}
*/
function (diagramJSON) {
var /** @type {?} */ diagram = new Diagram();
if (diagramJSON.Attr) {
diagram.displaySequence = diagramJSON.Attr.DisplaySequence;
diagram.keyDiagram = diagramJSON.Attr.IsKeyDiagram ? diagramJSON.Attr.IsKeyDiagram : false;
}
else {
diagram.displaySequence = undefined;
diagram.keyDiagram = false;
}
diagram.label = diagramJSON.Label;
diagram.location = diagramJSON.Location;
return diagram;
};
/**
* @param {?} diagramsAsJSON
* @return {?}
*/
DiagramService.prototype.returnDiagrams = /**
* @param {?} diagramsAsJSON
* @return {?}
*/
function (diagramsAsJSON) {
var /** @type {?} */ diagrams = new Array();
if (diagramsAsJSON !== undefined) {
if (this.arrayCheckerSeviceService.isArray(diagramsAsJSON)) {
try {
for (var diagramsAsJSON_1 = __values(diagramsAsJSON), diagramsAsJSON_1_1 = diagramsAsJSON_1.next(); !diagramsAsJSON_1_1.done; diagramsAsJSON_1_1 = diagramsAsJSON_1.next()) {
var diagram = diagramsAsJSON_1_1.value;
diagrams.push(this.returnDiagram(diagram));
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (diagramsAsJSON_1_1 && !diagramsAsJSON_1_1.done && (_a = diagramsAsJSON_1.return))
_a.call(diagramsAsJSON_1);
}
finally {
if (e_1)
throw e_1.error;
}
}
}
else {
diagrams.push(this.returnDiagram(diagramsAsJSON));
}
}
return diagrams;
var e_1, _a;
};
DiagramService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
DiagramService.ctorParameters = function () {
return [
{ type: ArrayCheckerService }
];
};
return DiagramService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ CreationServiceInjectorToken = new core.InjectionToken('one');
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DecisionPoint = (function () {
function DecisionPoint() {
}
return DecisionPoint;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Branch = (function () {
function Branch() {
}
return Branch;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var EndPointRef = (function () {
function EndPointRef() {
}
return EndPointRef;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DataElementRef = (function () {
function DataElementRef() {
}
return DataElementRef;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NotRelevantDataElements = (function () {
function NotRelevantDataElements() {
}
return NotRelevantDataElements;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var EqualCondition = (function () {
function EqualCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
EqualCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ value = dataElementValues.get(this.conditionType.dataElementId);
if (value !== undefined) {
return value.toUpperCase() === this.conditionType.comparisonValue.toUpperCase();
}
return false;
};
return EqualCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ConditionType = (function () {
function ConditionType() {
}
return ConditionType;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var GreaterThanCondition = (function () {
function GreaterThanCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
GreaterThanCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
var /** @type {?} */ comparisonValue = -1;
if (isNaN(this.conditionType.comparisonValue)) {
comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
}
else {
comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
}
return value > comparisonValue;
};
return GreaterThanCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var LessThanCondition = (function () {
function LessThanCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
LessThanCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
var /** @type {?} */ comparisonValue = -1;
if (isNaN(this.conditionType.comparisonValue)) {
comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
}
else {
comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
}
return value < comparisonValue;
};
return LessThanCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var GreaterThanOrEqualsCondition = (function () {
function GreaterThanOrEqualsCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
GreaterThanOrEqualsCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
var /** @type {?} */ comparisonValue = -1;
if (isNaN(this.conditionType.comparisonValue)) {
comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
}
else {
comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
}
return value >= comparisonValue;
};
return GreaterThanOrEqualsCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var LessThanOrEqualsCondition = (function () {
function LessThanOrEqualsCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
LessThanOrEqualsCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
var /** @type {?} */ comparisonValue = -1;
if (isNaN(this.conditionType.comparisonValue)) {
comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
}
else {
comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
}
return value <= comparisonValue;
};
return LessThanOrEqualsCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ContainsCondition = (function () {
function ContainsCondition(conditionType) {
this.conditionType = conditionType;
}
/**
* @param {?} dataElementValues
* @return {?}
*/
ContainsCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ returnValue = false;
var /** @type {?} */ value = dataElementValues.get(this.conditionType.dataElementId);
if (value !== undefined) {
for (var /** @type {?} */ counter = 0; counter < value.length; counter++) {
var /** @type {?} */ value1 = value[counter];
if (value1.toUpperCase() === this.conditionType.comparisonValue.toUpperCase()) {
returnValue = true;
}
}
}
return returnValue;
};
return ContainsCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AndCondition = (function () {
function AndCondition() {
this.conditions = [];
this.conditionType = 'AndCondition';
}
/**
* @param {?} dataElementValues
* @return {?}
*/
AndCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ returnValue = true;
for (var /** @type {?} */ conditionCounter = 0; conditionCounter < this.conditions.length; conditionCounter++) {
var /** @type {?} */ condition = this.conditions[conditionCounter];
var /** @type {?} */ executedCondition = condition.evaluate(dataElementValues);
returnValue = (!executedCondition) ? false : (returnValue && executedCondition);
if (!returnValue) {
break;
}
}
return returnValue;
};
return AndCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var OrCondition = (function () {
function OrCondition() {
this.conditions = [];
this.conditionType = 'OrCondition';
}
/**
* @param {?} dataElementValues
* @return {?}
*/
OrCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ returnValue = false;
for (var /** @type {?} */ conditionCounter = 0; conditionCounter < this.conditions.length; conditionCounter++) {
var /** @type {?} */ condition = this.conditions[conditionCounter];
var /** @type {?} */ executedCondition = condition.evaluate(dataElementValues);
returnValue = (returnValue || executedCondition);
if (returnValue) {
break;
}
}
return returnValue;
};
return OrCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NotCondition = (function () {
function NotCondition() {
this.conditions = [];
this.conditionType = 'NotCondition';
}
/**
* @param {?} dataElementValues
* @return {?}
*/
NotCondition.prototype.evaluate = /**
* @param {?} dataElementValues
* @return {?}
*/
function (dataElementValues) {
var /** @type {?} */ results = new Array();
try {
for (var _a = __values(this.conditions), _b = _a.next(); !_b.done; _b = _a.next()) {
var condition = _b.value;
results.push(condition.evaluate(dataElementValues));
}
}
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;
}
}
return !(results[0]);
var e_1, _c;
};
return NotCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ConditionsCreationService = (function () {
function ConditionsCreationService(arrayCheckerService) {
this.arrayCheckerService = arrayCheckerService;
}
/**
* @param {?} conditionJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditionType = /**
* @param {?} conditionJSON
* @return {?}
*/
function (conditionJSON) {
var /** @type {?} */ conditionType = new ConditionType();
conditionType.comparisonValue = conditionJSON.Attr.ComparisonValue;
conditionType.dataElementId = conditionJSON.Attr.DataElementId;
return conditionType;
};
/**
* @param {?} branchJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnCondition = /**
* @param {?} branchJSON
* @return {?}
*/
function (branchJSON) {
var /** @type {?} */ condition;
if (branchJSON.hasOwnProperty('EqualCondition')) {
condition = new EqualCondition(this.returnConditionType(branchJSON.EqualCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanCondition')) {
condition = new GreaterThanCondition(this.returnConditionType(branchJSON.GreaterThanCondition));
}
if (branchJSON.hasOwnProperty('LessThanCondition')) {
condition = new LessThanCondition(this.returnConditionType(branchJSON.LessThanCondition));
}
if (branchJSON.hasOwnProperty('GreaterThanOrEqualsCondition')) {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(branchJSON.GreaterThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('LessThanOrEqualsCondition')) {
condition = new LessThanOrEqualsCondition(this.returnConditionType(branchJSON.LessThanOrEqualsCondition));
}
if (branchJSON.hasOwnProperty('ContainsCondition')) {
condition = new ContainsCondition(this.returnConditionType(branchJSON.ContainsCondition));
}
// if (condition !== undefined) {
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : false;
// }
// condition.IsRelevant = branchJSON.IsRelevant !== undefined
// ? branchJSON.IsRelevant : true;
return condition;
};
/**
* @param {?} compositeElementJSON
* @return {?}
*/
ConditionsCreationService.prototype.isComposite = /**
* @param {?} compositeElementJSON
* @return {?}
*/
function (compositeElementJSON) {
return compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
};
/**
* @param {?} conditionIdentifier
* @param {?} conditionJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditionFromJSON = /**
* @param {?} conditionIdentifier
* @param {?} conditionJSON
* @return {?}
*/
function (conditionIdentifier, conditionJSON) {
var /** @type {?} */ condition;
if (conditionIdentifier === 'EqualCondition') {
condition = new EqualCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanCondition') {
condition = new GreaterThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanCondition') {
condition = new LessThanCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'GreaterThanOrEqualsCondition') {
condition = new GreaterThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'LessThanOrEqualsCondition') {
condition = new LessThanOrEqualsCondition(this.returnConditionType(conditionJSON));
}
if (conditionIdentifier === 'ContainsCondition') {
condition = new ContainsCondition(this.returnConditionType(conditionJSON));
}
return condition;
};
/**
* @param {?} conditionsJSON
* @return {?}
*/
ConditionsCreationService.prototype.returnConditions = /**
* @param {?} conditionsJSON
* @return {?}
*/
function (conditionsJSON) {
var /** @type {?} */ conditions;
var /** @type {?} */ conditionIdentifiers = ['EqualCondition', 'GreaterThanCondition', 'LessThanCondition',
'GreaterThanOrEqualsCondition', 'LessThanOrEqualsCondition', 'ContainsCondition'];
try {
for (var conditionIdentifiers_1 = __values(conditionIdentifiers), conditionIdentifiers_1_1 = conditionIdentifiers_1.next(); !conditionIdentifiers_1_1.done; conditionIdentifiers_1_1 = conditionIdentifiers_1.next()) {
var conditionIdentifier = conditionIdentifiers_1_1.value;
var /** @type {?} */ conditionJSON = conditionsJSON[conditionIdentifier];
if (conditionJSON !== undefined) {
conditions = new Array();
if (this.arrayCheckerService.isArray(conditionJSON)) {
try {
for (var conditionJSON_1 = __values(conditionJSON), conditionJSON_1_1 = conditionJSON_1.next(); !conditionJSON_1_1.done; conditionJSON_1_1 = conditionJSON_1.next()) {
var jsonValue = conditionJSON_1_1.value;
conditions.push(this.returnConditionFromJSON(conditionIdentifier, jsonValue));
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (conditionJSON_1_1 && !conditionJSON_1_1.done && (_a = conditionJSON_1.return))
_a.call(conditionJSON_1);
}
finally {
if (e_1)
throw e_1.error;
}
}
}
else {
conditions.push(this.returnConditionFromJSON(conditionIdentifier, conditionJSON));
}
}
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (conditionIdentifiers_1_1 && !conditionIdentifiers_1_1.done && (_b = conditionIdentifiers_1.return))
_b.call(conditionIdentifiers_1);
}
finally {
if (e_2)
throw e_2.error;
}
}
return conditions;
var e_2, _b, e_1, _a;
};
/**
* @param {?} compositeElementJSON
* @return {?}
*/
ConditionsCreationService.prototype.isHybrid = /**
* @param {?} compositeElementJSON
* @return {?}
*/
function (compositeElementJSON) {
var /** @type {?} */ compositeExists = compositeElementJSON.hasOwnProperty('AndCondition') ||
compositeElementJSON.hasOwnProperty('OrCondition') ||
compositeElementJSON.hasOwnProperty('NotCondition');
var /** @type {?} */ primitiveExists = compositeElementJSON.hasOwnProperty('EqualCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanCondition') ||
compositeElementJSON.hasOwnProperty('LessThanCondition') ||
compositeElementJSON.hasOwnProperty('GreaterThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('LessThanOrEqualsCondition') ||
compositeElementJSON.hasOwnProperty('ContainsCondition');
return compositeExists && primitiveExists;
};
/**
* @param {?} data
* @return {?}
*/
ConditionsCreationService.prototype.returnCompositeCondition = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (!this.isComposite(data)) {
return;
}
var /** @type {?} */ compositeConditionJSON;
var /** @type {?} */ compositeCondition;
if (data.hasOwnProperty('AndCondition')) {
compositeConditionJSON = data.AndCondition;
compositeCondition = new AndCondition();
}
else if (data.hasOwnProperty('OrCondition')) {
compositeConditionJSON = data.OrCondition;
compositeCondition = new OrCondition();
}
else if (data.hasOwnProperty('NotCondition')) {
compositeConditionJSON = data.NotCondition;
compositeCondition = new NotCondition();
}
// if (data.hasOwnProperty('IsRelevant')){
// compositeConditionJSON += data.IsRelevant;
// }
if (!this.isComposite(compositeConditionJSON)) {
compositeCondition.conditions = this.returnConditions(compositeConditionJSON);
}
else if (this.isHybrid(compositeConditionJSON)) {
var /** @type {?} */ jsonKeys = Object.keys(compositeConditionJSON);
try {
for (var jsonKeys_1 = __values(jsonKeys), jsonKeys_1_1 = jsonKeys_1.next(); !jsonKeys_1_1.done; jsonKeys_1_1 = jsonKeys_1.next()) {
var jsonKey = jsonKeys_1_1.value;
var /** @type {?} */ jsonValue = compositeConditionJSON[jsonKey];
var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
var /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, compositeCondition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
try {
for (var jsonValue_1 = __values(jsonValue), jsonValue_1_1 = jsonValue_1.next(); !jsonValue_1_1.done; jsonValue_1_1 = jsonValue_1.next()) {
var arrayValue = jsonValue_1_1.value;
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (jsonValue_1_1 && !jsonValue_1_1.done && (_a = jsonValue_1.return))
_a.call(jsonValue_1);
}
finally {
if (e_3)
throw e_3.error;
}
}
}
else {
compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
catch (e_4_1) {
e_4 = { error: e_4_1 };
}
finally {
try {
if (jsonKeys_1_1 && !jsonKeys_1_1.done && (_b = jsonKeys_1.return))
_b.call(jsonKeys_1);
}
finally {
if (e_4)
throw e_4.error;
}
}
}
else {
this.returnInnerConditions(compositeConditionJSON, compositeCondition);
}
return compositeCondition;
var e_4, _b, e_3, _a;
};
/**
* @param {?} elementName
* @return {?}
*/
ConditionsCreationService.prototype.returnCompositeConditionFromName = /**
* @param {?} elementName
* @return {?}
*/
function (elementName) {
var /** @type {?} */ compositeCondition;
switch (elementName) {
case 'AndCondition':
{
compositeCondition = new AndCondition();
break;
}
case 'OrCondition':
{
compositeCondition = new OrCondition();
break;
}
case 'NotCondition':
{
compositeCondition = new NotCondition();
}
}
return compositeCondition;
};
/**
* @param {?} key
* @param {?} value
* @param {?} compositeCondition
* @return {?}
*/
ConditionsCreationService.prototype.addConditionsToInnerConditions = /**
* @param {?} key
* @param {?} value
* @param {?} compositeCondition
* @return {?}
*/
function (key, value, compositeCondition) {
var /** @type {?} */ condition = this.returnCompositeConditionFromName(key);
compositeCondition.conditions.push(condition);
if (this.isHybrid(value)) {
var /** @type {?} */ jsonKeys = Object.keys(value);
try {
for (var jsonKeys_2 = __values(jsonKeys), jsonKeys_2_1 = jsonKeys_2.next(); !jsonKeys_2_1.done; jsonKeys_2_1 = jsonKeys_2.next()) {
var jsonKey = jsonKeys_2_1.value;
var /** @type {?} */ jsonValue = value[jsonKey];
var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
var /** @type {?} */ jsonObject = JSON.parse(jsonString);
if (this.isComposite(jsonObject)) {
this.returnInnerConditions(jsonObject, condition);
}
else {
if (this.arrayCheckerService.isArray(jsonValue)) {
try {
for (var jsonValue_2 = __values(jsonValue), jsonValue_2_1 = jsonValue_2.next(); !jsonValue_2_1.done; jsonValue_2_1 = jsonValue_2.next()) {
var arrayValue = jsonValue_2_1.value;
condition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
}
}
catch (e_5_1) {
e_5 = { error: e_5_1 };
}
finally {
try {
if (jsonValue_2_1 && !jsonValue_2_1.done && (_a = jsonValue_2.return))
_a.call(jsonValue_2);
}
finally {
if (e_5)
throw e_5.error;
}
}
}
else {
condition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
}
}
}
}
catch (e_6_1) {
e_6 = { error: e_6_1 };
}
finally {
try {
if (jsonKeys_2_1 && !jsonKeys_2_1.done && (_b = jsonKeys_2.return))
_b.call(jsonKeys_2);
}
finally {
if (e_6)
throw e_6.error;
}
}
}
else if (this.isComposite(value)) ;
else {
condition.conditions = this.returnConditions(value);
}
var e_6, _b, e_5, _a;
};
/**
* @param {?} innerConditionsJSON
* @param {?} compositeCondition
* @return {?}
*/
ConditionsCreationService.prototype.returnInnerConditions = /**
* @param {?} innerConditionsJSON
* @param {?} compositeCondition
* @return {?}
*/
function (innerConditionsJSON, compositeCondition) {
var /** @type {?} */ jsonKeys = Object.keys(innerConditionsJSON);
try {
for (var jsonKeys_3 = __values(jsonKeys), jsonKeys_3_1 = jsonKeys_3.next(); !jsonKeys_3_1.done; jsonKeys_3_1 = jsonKeys_3.next()) {
var key = jsonKeys_3_1.value;
var /** @type {?} */ values = innerConditionsJSON[key];
if (this.arrayCheckerService.isArray(values)) {
try {
for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
var value = values_1_1.value;
this.addConditionsToInnerConditions(key, value, compositeCondition);
}
}
catch (e_7_1) {
e_7 = { error: e_7_1 };
}
finally {
try {
if (values_1_1 && !values_1_1.done && (_a = values_1.return))
_a.call(values_1);
}
finally {
if (e_7)
throw e_7.error;
}
}
}
else {
this.addConditionsToInnerConditions(key, innerConditionsJSON[key], compositeCondition);
}
}
}
catch (e_8_1) {
e_8 = { error: e_8_1 };
}
finally {
try {
if (jsonKeys_3_1 && !jsonKeys_3_1.done && (_b = jsonKeys_3.return))
_b.call(jsonKeys_3);
}
finally {
if (e_8)
throw e_8.error;
}
}
var e_8, _b, e_7, _a;
};
ConditionsCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
ConditionsCreationService.ctorParameters = function () {
return [
{ type: ArrayCheckerService }
];
};
return ConditionsCreationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TextExpression = (function () {
function TextExpression() {
}
return TextExpression;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ComputedValueCreationService = (function () {
function ComputedValueCreationService() {
}
/**
* @param {?} dataAsJSON
* @return {?}
*/
ComputedValueCreationService.prototype.createComputedValue = /**
* @param {?} dataAsJSON
* @return {?}
*/
function (dataAsJSON) {
if (dataAsJSON['TextExpression'] !== undefined) {
var /** @type {?} */ computedValue = new TextExpression();
computedValue.expressionText = dataAsJSON.TextExpression;
return computedValue;
}
if (dataAsJSON['ArithmeticExpression'] !== undefined) {
{
var /** @type {?} */ computedValue = new ArithmeticExpression();
computedValue.expressionText = dataAsJSON.ArithmeticExpression;
return computedValue;
}
}
};
ComputedValueCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
ComputedValueCreationService.ctorParameters = function () { return []; };
return ComputedValueCreationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DecisionPointsCreationService = (function () {
function DecisionPointsCreationService(arrayCheckerService, conditionsCreationService, computedValueCreationService) {
this.arrayCheckerService = arrayCheckerService;
this.conditionsCreationService = conditionsCreationService;
this.computedValueCreationService = computedValueCreationService;
}
/**
* @param {?} dataElementRefJSON
* @return {?}
*/
DecisionPointsCreationService.prototype.createRelevantDataElementReferences = /**
* @param {?} dataElementRefJSON
* @return {?}
*/
function (dataElementRefJSON) {
var /** @type {?} */ dataElementRef = new DataElementRef();
dataElementRef.dataElementId = dataElementRefJSON.Attr.DataElementId;
return dataElementRef;
};
/**
* @param {?} branchJSON
* @return {?}
*/
DecisionPointsCreationService.prototype.returnBranch = /**
* @param {?} branchJSON
* @return {?}
*/
function (branchJSON) {
var /** @type {?} */ branch = new Branch();
branch.label = branchJSON.Label;
if (branchJSON.EndPointRef) {
branch.endPointRef = new EndPointRef();
branch.endPointRef.endPointId = branchJSON.EndPointRef.Attr.EndPointId;
}
branch.condition = this.conditionsCreationService.returnCondition(branchJSON);
branch.computedValue = this.computedValueCreationService.createComputedValue(branchJSON);
if (this.conditionsCreationService.isComposite(branchJSON)) {
branch.compositeCondition = this.conditionsCreationService.returnCompositeCondition(branchJSON);
}
if (branchJSON.NotRelevantDataElements) {
var /** @type {?} */ notRelevantDataElements = new NotRelevantDataElements();
notRelevantDataElements.dataElementReferences = new Array();
var /** @type {?} */ dataElementRefs = branchJSON.NotRelevantDataElements.DataElementRef;
if (this.arrayCheckerService.isArray(dataElementRefs)) {
try {
for (var dataElementRefs_1 = __values(dataElementRefs), dataElementRefs_1_1 = dataElementRefs_1.next(); !dataElementRefs_1_1.done; dataElementRefs_1_1 = dataElementRefs_1.next()) {
var dataElementRefJSON = dataElementRefs_1_1.value;
notRelevantDataElements.dataElementReferences.push(this.createRelevantDataElementReferences(dataElementRefJSON));
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (dataElementRefs_1_1 && !dataElementRefs_1_1.done && (_a = dataElementRefs_1.return))
_a.call(dataElementRefs_1);
}
finally {
if (e_1)
throw e_1.error;
}
}
}
else {
notRelevantDataElements.dataElementReferences.push(this.createRelevantDataElementReferences(dataElementRefs));
}
branch.notRelevantDataElements = notRelevantDataElements;
}
if (branchJSON.DecisionPoint) {
branch.decisionPoints = new Array();
this.addDecisionPoints(branchJSON.DecisionPoint, branch.decisionPoints);
}
return branch;
var e_1, _a;
};
/**
* @param {?} decsionPointAsJSON
* @param {?} decisionPoints
* @return {?}
*/
DecisionPointsCreationService.prototype.addDecisionPoint = /**
* @param {?} decsionPointAsJSON
* @param {?} decisionPoints
* @return {?}
*/
function (decsionPointAsJSON, decisionPoints) {
var /** @type {?} */ decisionPoint = new DecisionPoint();
if (decsionPointAsJSON.Attr && decsionPointAsJSON.Attr.Id) {
decisionPoint.id = decsionPointAsJSON.Attr.Id;
}
decisionPoint.label = decsionPointAsJSON.Label;
var /** @type {?} */ branchesJSON = decsionPointAsJSON.Branch;
if (branchesJSON !== undefined) {
decisionPoint.branches = new Array();
if (this.arrayCheckerService.isArray(branchesJSON)) {
try {
for (var branchesJSON_1 = __values(branchesJSON), branchesJSON_1_1 = branchesJSON_1.next(); !branchesJSON_1_1.done; branchesJSON_1_1 = branchesJSON_1.next()) {
var branchJSON = branchesJSON_1_1.value;
decisionPoint.branches.push(this.returnBranch(branchJSON));
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (branchesJSON_1_1 && !branchesJSON_1_1.done && (_a = branchesJSON_1.return))
_a.call(branchesJSON_1);
}
finally {
if (e_2)
throw e_2.error;
}
}
}
else {
decisionPoint.branches.push(this.returnBranch(branchesJSON));
}
var /** @type {?} */ defaultBranchJSON = decsionPointAsJSON.DefaultBranch;
if (defaultBranchJSON !== undefined) {
decisionPoint.defaultBranch = this.createDefaultBranch(defaultBranchJSON);
}
}
decisionPoints.push(decisionPoint);
var e_2, _a;
};
/**
* @param {?} decsionPointsAsJSON
* @param {?} decisionPoints
* @return {?}
*/
DecisionPointsCreationService.prototype.addDecisionPoints = /**
* @param {?} decsionPointsAsJSON
* @param {?} decisionPoints
* @return {?}
*/
function (decsionPointsAsJSON, decisionPoints) {
if (this.arrayCheckerService.isArray(decsionPointsAsJSON)) {
try {
for (var decsionPointsAsJSON_1 = __values(decsionPointsAsJSON), decsionPointsAsJSON_1_1 = decsionPointsAsJSON_1.next(); !decsionPointsAsJSON_1_1.done; decsionPointsAsJSON_1_1 = decsionPointsAsJSON_1.next()) {
var decisionPoint = decsionPointsAsJSON_1_1.value;
this.addDecisionPoint(decisionPoint, decisionPoints);
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (decsionPointsAsJSON_1_1 && !decsionPointsAsJSON_1_1.done && (_a = decsionPointsAsJSON_1.return))
_a.call(decsionPointsAsJSON_1);
}
finally {
if (e_3)
throw e_3.error;
}
}
}
else {
this.addDecisionPoint(decsionPointsAsJSON, decisionPoints);
}
var e_3, _a;
};
/**
* @param {?} data
* @return {?}
*/
DecisionPointsCreationService.prototype.createDecisionPoints = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ decisionPoints = new Array();
this.addDecisionPoints(data, decisionPoints);
return decisionPoints;
};
/**
* @param {?} data
* @return {?}
*/
DecisionPointsCreationService.prototype.createDefaultBranch = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ defaultBranch = new Branch();
defaultBranch.label = 'Default Branch';
defaultBranch.computedValue = this.computedValueCreationService.createComputedValue(data);
return defaultBranch;
};
DecisionPointsCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
DecisionPointsCreationService.ctorParameters = function () {
return [
{ type: ArrayCheckerService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return DecisionPointsCreationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Rules = (function () {
function Rules() {
}
return Rules;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TemplatePartial = (function () {
function TemplatePartial() {
}
return TemplatePartial;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var TemplateManagerService = (function () {
function TemplateManagerService(diagramService, elememtcreationService, arrayCheckerService, decisionPointsCreationService) {
this.diagramService = diagramService;
this.elememtcreationService = elememtcreationService;
this.arrayCheckerService = arrayCheckerService;
this.decisionPointsCreationService = decisionPointsCreationService;
this.endPointXMLString = [];
this.stringParser = require('string');
}
/**
* @param {?} templateContent
* @return {?}
*/
TemplateManagerService.prototype.getTemplate = /**
* @param {?} templateContent
* @return {?}
*/
function (templateContent) {
var /** @type {?} */ template = new Template();
var /** @type {?} */ templateContentAsJSON;
templateContentAsJSON = this.parseToJson(templateContent);
if (template === undefined) {
throw new Error('Unable to parse the template');
}
template.metadata = this.getMetaData(templateContentAsJSON.Metadata);
template.dataElements = this.getDataElements(templateContentAsJSON.DataElements);
if (templateContentAsJSON.Rules) {
template.rules = new Rules();
template.rules.decisionPoints = this.decisionPointsCreationService.
createDecisionPoints(templateContentAsJSON.Rules.DecisionPoint);
}
template.templatePartial = this.returnEndpoints(templateContent);
template.endPointsString = this.endPointXMLString;
template.xmlContent = templateContent;
// console.log(template.templatePartial);
//console.log(template.endPointsString);
return template;
};
/**
* @param {?} templatePartialJSON
* @return {?}
*/
TemplateManagerService.prototype.getTemplatePartial = /**
* @param {?} templatePartialJSON
* @return {?}
*/
function (templatePartialJSON) {
var /** @type {?} */ templatePartial = new TemplatePartial;
templatePartial.id = templatePartialJSON.Attr.Id;
templatePartial.sectionIfNotValue = templatePartialJSON.SectionIfValueNot;
templatePartial.sectionIfValues = templatePartialJSON.SectionIfValue;
return templatePartial;
};
/**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
TemplateManagerService.prototype.returnEndPointContents = /**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
function (content, startToken, endToken) {
var /** @type {?} */ contents = new Array();
var /** @type {?} */ templateSearchIndexPosition = 0;
while (true) {
var /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
var /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
if (contentStartPosition >= 0 && contentEndPosition >= 0) {
var /** @type {?} */ endPosition = contentEndPosition + endToken.length;
var /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
contents.push(contentData);
templateSearchIndexPosition = endPosition + 1;
}
else {
break;
}
}
return contents;
};
/**
* @param {?} templatePartialArray
* @return {?}
*/
TemplateManagerService.prototype.returnTemplatePartials = /**
* @param {?} templatePartialArray
* @return {?}
*/
function (templatePartialArray) {
var /** @type {?} */ templatePartials = new Array();
try {
for (var templatePartialArray_1 = __values(templatePartialArray), templatePartialArray_1_1 = templatePartialArray_1.next(); !templatePartialArray_1_1.done; templatePartialArray_1_1 = templatePartialArray_1.next()) {
var arrayItem = templatePartialArray_1_1.value;
var /** @type {?} */ templatePartial = new TemplatePartial();
var /** @type {?} */ templatePartialAsJSON = this.parseToJson(arrayItem);
templatePartial.id = templatePartialAsJSON.Attr.Id;
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (templatePartialArray_1_1 && !templatePartialArray_1_1.done && (_a = templatePartialArray_1.return))
_a.call(templatePartialArray_1);
}
finally {
if (e_1)
throw e_1.error;
}
}
return templatePartials;
var e_1, _a;
};
/**
* @param {?} xmlData
* @return {?}
*/
TemplateManagerService.prototype.returnEndpoints = /**
* @param {?} xmlData
* @return {?}
*/
function (xmlData) {
var /** @type {?} */ endPointStartToken = '<EndPoints>';
var /** @type {?} */ endPointEndToken = '</EndPoints>';
var /** @type {?} */ endPointStartTokenPosition = xmlData.indexOf(endPointStartToken);
var /** @type {?} */ endPointEndTokenPosition = xmlData.indexOf(endPointEndToken);
if (endPointStartTokenPosition >= 0 && endPointEndTokenPosition >= 0) {
var /** @type {?} */ contentStartPosition = (endPointStartTokenPosition + endPointStartToken.length);
var /** @type {?} */ endPointContent = xmlData.substring(contentStartPosition, endPointEndTokenPosition);
if (endPointContent.length > 0) {
var /** @type {?} */ templatePartials = this.returnEndPointContents(endPointContent, '<TemplatePartial', '</TemplatePartial>');
this.endPointXMLString = this.returnEndPointContents(endPointContent, '<EndPoint', '</EndPoint>');
return templatePartials;
}
}
};
/**
* @param {?} xmlData
* @return {?}
*/
TemplateManagerService.prototype.parseToJson = /**
* @param {?} xmlData
* @return {?}
*/
function (xmlData) {
var /** @type {?} */ jsonResult;
var /** @type {?} */ parseString = require('xml2js').parseString;
parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
jsonResult = result;
});
return jsonResult;
};
/**
* @param {?} metadataJSON
* @return {?}
*/
TemplateManagerService.prototype.getMetaData = /**
* @param {?} metadataJSON
* @return {?}
*/
function (metadataJSON) {
var /** @type {?} */ metadata = new Metadata();
metadata.label = metadataJSON.Label;
metadata.id = metadataJSON.ID;
metadata.schemaVersion = metadataJSON.SchemaVersion;
metadata.ruleVersion = metadataJSON.RuleVersion;
var /** @type {?} */ diagramsAsJSON = metadataJSON.Info.Diagrams.Diagram;
metadata.diagrams = this.diagramService.returnDiagrams(diagramsAsJSON);
metadata.approvedBy = metadataJSON.ApprovedBy;
metadata.createdDate = metadataJSON.CreatedDate;
metadata.lastModifiedDate = metadataJSON.LastModifiedDate;
metadata.reviewedBy = metadataJSON.ReviewedBy;
metadata.developedBy = metadataJSON.DevelopedBy;
metadata.radElementSetID = metadataJSON.RadElementSetID;
return metadata;
};
/**
* @param {?} elementType
* @param {?} dataElementsJSON
* @return {?}
*/
TemplateManagerService.prototype.returnDataElement = /**
* @param {?} elementType
* @param {?} dataElementsJSON
* @return {?}
*/
function (elementType, dataElementsJSON) {
var /** @type {?} */ dataElements = new Array();
var /** @type {?} */ dataElementCreationServiceInstance;
try {
for (var _a = __values(this.elememtcreationService), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataElementCreationService = _b.value;
if (dataElementCreationService.elementType === elementType) {
dataElementCreationServiceInstance = dataElementCreationService;
break;
}
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_2)
throw e_2.error;
}
}
if (dataElementCreationServiceInstance !== undefined && dataElementsJSON !== undefined) {
if (this.arrayCheckerService.isArray(dataElementsJSON)) {
try {
for (var dataElementsJSON_1 = __values(dataElementsJSON), dataElementsJSON_1_1 = dataElementsJSON_1.next(); !dataElementsJSON_1_1.done; dataElementsJSON_1_1 = dataElementsJSON_1.next()) {
var dataElementJSON = dataElementsJSON_1_1.value;
var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementJSON);
dataElements.push(dataElement);
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (dataElementsJSON_1_1 && !dataElementsJSON_1_1.done && (_d = dataElementsJSON_1.return))
_d.call(dataElementsJSON_1);
}
finally {
if (e_3)
throw e_3.error;
}
}
}
else {
var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementsJSON);
dataElements.push(dataElement);
}
}
return dataElements;
var e_2, _c, e_3, _d;
};
/**
* @param {?} dataElementsJSON
* @return {?}
*/
TemplateManagerService.prototype.getDataElements = /**
* @param {?} dataElementsJSON
* @return {?}
*/
function (dataElementsJSON) {
var /** @type {?} */ dataElements = new Array();
dataElements = dataElements.concat(this.returnDataElement('ChoiceDataElement', dataElementsJSON.ChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('MultiChoiceDataElement', dataElementsJSON.MultiChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('NumericDataElement', dataElementsJSON.NumericDataElement));
dataElements = dataElements.concat(this.returnDataElement('GlobalValue', dataElementsJSON.GlobalValue));
dataElements = dataElements.concat(this.returnDataElement('ComputedDataElement', dataElementsJSON.ComputedDataElement));
dataElements = dataElements.concat(this.returnDataElement('IntegerDataElement', dataElementsJSON.IntegerDataElement));
dataElements = dataElements.concat(this.returnDataElement('DateTimeDataElement', dataElementsJSON.DateTimeDataElement));
dataElements = dataElements.concat(this.returnDataElement('DurationDataElement', dataElementsJSON.TimeSpanDataElement));
return dataElements;
};
TemplateManagerService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
TemplateManagerService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: Array, decorators: [{ type: core.Inject, args: [CreationServiceInjectorToken,] }] },
{ type: ArrayCheckerService },
{ type: DecisionPointsCreationService }
];
};
return TemplateManagerService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AllTextReport = (function () {
function AllTextReport() {
}
return AllTextReport;
}());
/** @enum {number} */
var ReportTextPosition = {
Top: 0,
Right: 1,
};
ReportTextPosition[ReportTextPosition.Top] = "Top";
ReportTextPosition[ReportTextPosition.Right] = "Right";
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $ = require('jquery');
var AcrAssistSimulatorComponent = (function () {
function AcrAssistSimulatorComponent(templateManagerService, simulatorEngineService) {
this.templateManagerService = templateManagerService;
this.simulatorEngineService = simulatorEngineService;
this.inputValues = [];
this.resetButton = true;
this.returnExecutionHistory = new core.EventEmitter();
this.returnDataElementChanged = new core.EventEmitter();
this.returnDefaultElements = new core.EventEmitter();
this.position = ReportTextPosition;
this.acceptedFileTypes = ['image/png', 'image/gif', 'image/jpg', 'image/jpeg'];
}
/**
* @param {?} changes
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.isReset = true;
this.isEmptyContent = this.templateContent === undefined || this.templateContent.length === 0 && this.inputValues.length === 0 &&
this.inputData === undefined;
if (this.isEmptyContent) {
return;
}
if (this.inputData !== undefined) {
if (this.inputData.length > 0) {
this.inputValues = JSON.parse(this.inputData);
}
}
if (this.imageUpload !== undefined) {
this.imageUpload.nativeElement.value = '';
}
this.template = this.templateManagerService.getTemplate(this.templateContent);
// this.simulatorEngineService.initialize(this.template);
if (this.inputValues.length !== 0) {
this.populateTestCaseData();
}
this.simulatorEngineService.initialize(this.template);
this.dataElements = this.template.dataElements;
this.keyDiagrams = new Array();
for (var /** @type {?} */ index = 0; index < this.template.metadata.diagrams.length; index++) {
var /** @type {?} */ element = new Diagram();
element.label = this.template.metadata.diagrams[index].label;
element.location = this.imagePath + '/' + this.template.metadata.diagrams[index].location;
element.keyDiagram = this.template.metadata.diagrams[index].keyDiagram;
this.keyDiagrams.push(element);
}
this.resultText = undefined;
};
/**
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.resetElements = /**
* @return {?}
*/
function () {
this.template = this.templateManagerService.getTemplate(this.templateContent);
this.simulatorEngineService.initialize(this.template);
this.dataElements = Object.assign({}, this.template.dataElements);
this.resultText = undefined;
this.returnDefaultElements.emit();
};
/**
* @param {?} textReport
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.recieveReportText = /**
* @param {?} textReport
* @return {?}
*/
function (textReport) {
this.resultText = textReport;
};
/**
* @param {?} finalExecutionHistory
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.recievedExecutionHistory = /**
* @param {?} finalExecutionHistory
* @return {?}
*/
function (finalExecutionHistory) {
this.returnExecutionHistory.emit(finalExecutionHistory);
};
/**
* @param {?} data
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.recivedOnDataElementChanged = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.returnDataElementChanged.emit(data);
};
/**
* @param {?} event
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.changeListener = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.isInvalidFile = false;
this.keyDiagrams = new Array();
var _loop_1 = function (i) {
var /** @type {?} */ reader = new FileReader();
var /** @type {?} */ diagram = new Diagram();
diagram.label = event.target.files[i].name;
diagram.keyDiagram = i === 0 ? true : false;
if (!(this_1.acceptedFileTypes.indexOf(event.target.files[i].type) > -1)) {
this_1.isInvalidFile = true;
}
reader.onload = function (event1) {
diagram.location = reader.result.toString();
};
reader.readAsDataURL(event.target.files[i]);
reader.onloadend = function (event1) {
_this.keyDiagrams.push(diagram);
};
};
var this_1 = this;
for (var /** @type {?} */ i = 0; i < event.target.files.length; i++) {
_loop_1(i);
}
};
/**
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.collapseKeyDiagram = /**
* @return {?}
*/
function () {
if ($('#icon_keydiagram').hasClass('fa fa-minus')) {
$('#icon_keydiagram').removeClass('fa fa-minus');
$('#icon_keydiagram').addClass('fa fa-plus');
$('#body_keydiagram').css({
'display': 'none'
});
}
else {
$('#icon_keydiagram').removeClass('fa fa-plus');
$('#icon_keydiagram').addClass('fa fa-minus');
$('#body_keydiagram').removeAttr('style');
}
};
/**
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.collapseReportText = /**
* @return {?}
*/
function () {
if ($('#icon_reporttext').hasClass('fa fa-minus')) {
$('#icon_reporttext').removeClass('fa fa-minus');
$('#icon_reporttext').addClass('fa fa-plus');
$('#body_reporttext').css({
'display': 'none'
});
}
else {
$('#icon_reporttext').removeClass('fa fa-plus');
$('#icon_reporttext').addClass('fa fa-minus');
$('#body_reporttext').removeAttr('style');
}
};
/**
* @return {?}
*/
AcrAssistSimulatorComponent.prototype.populateTestCaseData = /**
* @return {?}
*/
function () {
var _this = this;
this.template.dataElements.forEach(function (dataeElement) {
var /** @type {?} */ inputValue = _this.inputValues.filter(function (x) { return x.dataElementId.toUpperCase() === dataeElement.id.toUpperCase(); });
if (inputValue !== undefined && inputValue.length > 0) {
if (dataeElement.dataElementType === 'ChoiceDataElement' || dataeElement.dataElementType === 'MultiChoiceDataElement') {
var /** @type {?} */ choiceElement = (dataeElement);
if (Array.isArray(inputValue[0].dataElementValue)) {
var /** @type {?} */ values_1 = [];
choiceElement.choiceInfo.forEach(function (choice) {
inputValue[0].dataElementValue.forEach(function (value) {
if (choice.value.toUpperCase() === value.toUpperCase()) {
values_1.push(choice.value);
}
});
});
inputValue[0].dataElementValue = values_1;
}
else {
choiceElement.choiceInfo.forEach(function (choice) {
if (inputValue[0].dataElementValue !== undefined) {
if (choice.value.toUpperCase() === inputValue[0].dataElementValue.toUpperCase()) {
inputValue[0].dataElementValue = choice.value;
return;
}
}
});
}
}
dataeElement.currentValue = inputValue[0].dataElementValue;
}
});
};
AcrAssistSimulatorComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-simulator',
template: "<ng-container *ngIf=\"!isEmptyContent\">\n <div id=\"topReportTextPosition\" *ngIf=\"reportTextPosition === position.Top\">\n <div class=\"col-sm-12 col-md-12 col-lg-12\">\n <div id=\"div-simulator-block\">\n <div class=\"box box-primary box-solid margin-b-0\">\n <div *ngIf=\"resetButton == true\" class=\"with-border text-right padding-5 padding-r-10\">\n <button (click)=\"resetElements()\" class=\"btn btn-xs btn-primary\">Reset Values</button>\n </div>\n <div class=\"box-body\">\n <div #simulatorResultsBlock>\n <ng-container *ngIf=\"resultText !== undefined\">\n <div class=\"box box-primary\">\n <div class=\"box-header with-border\">\n <h3 class=\"box-title\">Report Text</h3>\n <div class=\"box-tools pull-right\">\n <button type=\"button\" class=\"btn btn-box-tool btn-report-text\" (click)=\"collapseReportText()\">\n <i id=\"icon_reporttext\" class=\"fa fa-minus\"></i>\n </button>\n </div>\n </div>\n <div id=\"body_reporttext\" class=\"box-body report-text div-report-text-scroll\">\n <dl>\n <acr-assist-report-text [reportText]=\"resultText\"></acr-assist-report-text>\n </dl>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"padding-r-10 scroll\" acrDynamicHeightDirective [simulatorElement]=\"simulatorResultsBlock\">\n <form class=\"form-horizontal\">\n <acr-assist-data-element [dataElements]=\"dataElements\" [templatePartial]=\"template.templatePartial\"\n [endPointXMLString]=\"template.endPointsString\" [imagePath]=\"imagePath\" [xmlContent]=\"template.xmlContent\"\n (returnReportText)='recieveReportText($event)' [inputValues]=\"inputValues\" [isReset]=\"isReset\"\n (returnDataElementChanged)='recivedOnDataElementChanged($event)' (returnExecutionHistory)='recievedExecutionHistory($event)'></acr-assist-data-element>\n </form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div id=\"rightReportTextPosition\" *ngIf=\"reportTextPosition === position.Right\">\n <div class=\"col-sm-6 col-md-6 col-lg-6\">\n <div id=\"div-simulator-block\">\n <div class=\"box box-primary box-solid margin-b-0\">\n <div *ngIf=\"resetButton == true\" class=\"with-border text-right padding-5 padding-r-10\">\n <button (click)=\"resetElements()\" class=\"btn btn-xs btn-primary\">Reset Values</button>\n </div>\n <div class=\"box-body\">\n <div id=\"div-simulator-form\" class=\"padding-r-10 div-simulator-form-height\">\n <form class=\"form-horizontal\">\n <acr-assist-data-element [dataElements]=\"dataElements\" [templatePartial]=\"template.templatePartial\"\n [endPointXMLString]=\"template.endPointsString\" [imagePath]=\"imagePath\" [xmlContent]=\"template.xmlContent\"\n (returnReportText)='recieveReportText($event)' [inputValues]=\"inputValues\" [isReset]=\"isReset\"\n (returnDataElementChanged)='recivedOnDataElementChanged($event)' (returnExecutionHistory)='recievedExecutionHistory($event)'></acr-assist-data-element>\n </form>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-sm-6 col-md-6 col-lg-6\">\n <div #simulatorResultsBlock>\n <ng-container *ngIf=\"resultText !== undefined\">\n <div class=\"box box-primary\">\n <div class=\"box-header with-border\">\n <h3 class=\"box-title\">Report Text</h3>\n <div class=\"box-tools pull-right\">\n <button type=\"button\" class=\"btn btn-box-tool btn-report-text\" (click)=\"collapseReportText()\">\n <i id=\"icon_reporttext\" class=\"fa fa-minus\"></i>\n </button>\n </div>\n </div>\n <div id=\"body_reporttext\" class=\"box-body report-text\">\n <dl>\n <acr-assist-report-text [reportText]=\"resultText\"></acr-assist-report-text>\n </dl>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"col-sm-6 col-md-6 col-lg-6\">\n <ng-container *ngIf=\"showKeyDiagram === true\">\n <div class=\"box box-primary margin-b-0\">\n <div class=\"box-header with-border\">\n <h3 class=\"box-title\">Key Images</h3>\n <input #imageUpload id=\"diagramUpload\" class=\"hidden\" type=\"file\" accept=\"image/*\" multiple (change)=\"changeListener($event)\">\n <label for=\"diagramUpload\" class=\"btn btn-success bg-olive margin-10\" title=\"Choose Diagrams\">Choose a\n Diagram</label>\n <div class=\"pull-right padding-l-5\">\n <button type=\"button\" class=\"btn btn-box-tool\" data-widget=\"collapse\" (click)=\"collapseKeyDiagram()\">\n <i id=\"icon_keydiagram\" class=\"fa fa-minus\"></i>\n </button>\n </div>\n <div class=\"pull-right padding-l-5\">\n <button type=\"button\" class=\"btn btn-zoom btn-sm\" onclick=\"zoomIn()\">\n <i class=\"fa fa-search-plus fa-lg\"></i>\n </button>\n </div>\n <div class=\"pull-right padding-l-5\">\n <button type=\"button\" class=\"btn btn-zoom btn-sm\" onclick=\"zoomOut()\">\n <i class=\"fa fa-search-minus fa-lg\"></i>\n </button>\n </div>\n <div [hidden]=\"!isInvalidFile\" class=\"error-msg\">Only image files are supported !!!</div>\n </div>\n <div id=\"body_keydiagram\" class=\"box-body\">\n <div id=\"carousel-example-generic\" class=\"carousel slide scroll\" data-interval=\"false\" data-ride=\"carousel\"\n acrDynamicHeightDirective [carouselElement]=\"simulatorResultsBlock\">\n <div class=\"carousel-inner\">\n <ng-container *ngFor=\"let diagram of keyDiagrams; let i = index\">\n <div class=\"item zoom\" [ngClass]=\"{'active': diagram.keyDiagram}\">\n <drag-scroll>\n <img drag-scroll-item id=\"map_id_{{ i }}\" class=\"img-responsive img-decissionTree\" src=\"{{ diagram.location }}\">\n </drag-scroll>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"keyDiagrams && keyDiagrams.length > 1\">\n <a class=\"left carousel-control\" href=\"#carousel-example-generic\" data-slide=\"prev\">\n <span class=\"fa fa-angle-left slide-left\"></span>\n </a>\n <a class=\"right carousel-control\" href=\"#carousel-example-generic\" data-slide=\"next\">\n <span class=\"fa fa-angle-right slide-right\"></span>\n </a>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>",
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 */
AcrAssistSimulatorComponent.ctorParameters = function () {
return [
{ type: TemplateManagerService },
{ type: SimulatorEngineService }
];
};
AcrAssistSimulatorComponent.propDecorators = {
templateContent: [{ type: core.Input }],
imagePath: [{ type: core.Input }],
showKeyDiagram: [{ type: core.Input }],
reportTextPosition: [{ type: core.Input }],
inputValues: [{ type: core.Input }],
inputData: [{ type: core.Input }],
resetButton: [{ type: core.Input }],
returnExecutionHistory: [{ type: core.Output }],
returnDataElementChanged: [{ type: core.Output }],
returnDefaultElements: [{ type: core.Output }],
imageUpload: [{ type: core.ViewChild, args: ['imageUpload',] }]
};
return AcrAssistSimulatorComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodableConcept = (function () {
function CodableConcept() {
this.coding = new Array();
}
return CodableConcept;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodingSystem = (function () {
function CodingSystem() {
}
return CodingSystem;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodingVersion = (function () {
function CodingVersion() {
}
return CodingVersion;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodingCode = (function () {
function CodingCode() {
}
return CodingCode;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodingDisplay = (function () {
function CodingDisplay() {
}
return CodingDisplay;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var CodingUserSelected = (function () {
function CodingUserSelected() {
}
return CodingUserSelected;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Coding = (function () {
function Coding() {
this.codingSystem = new CodingSystem();
this.codingVersion = new CodingVersion();
this.codingCode = new CodingCode();
this.codingDisplay = new CodingDisplay();
this.codingUserSelected = new CodingUserSelected();
}
return Coding;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @abstract
*/
var DataElementCreationBaseService = (function () {
function DataElementCreationBaseService(diagramService) {
this.diagramService = diagramService;
}
/**
* @param {?} diagramJSON
* @return {?}
*/
DataElementCreationBaseService.prototype.returnDiagram = /**
* @param {?} diagramJSON
* @return {?}
*/
function (diagramJSON) {
var /** @type {?} */ metadataDiagram = new Diagram();
metadataDiagram.displaySequence = diagramJSON.Attr.DisplaySequence;
metadataDiagram.keyDiagram = diagramJSON.Attr.IsKeyDiagram ? diagramJSON.Attr.IsKeyDiagram : false;
metadataDiagram.label = diagramJSON.Label;
metadataDiagram.location = diagramJSON.Location;
return metadataDiagram;
};
/**
* @param {?} data
* @param {?} dataElement
* @return {?}
*/
DataElementCreationBaseService.prototype.populateBasicData = /**
* @param {?} data
* @param {?} dataElement
* @return {?}
*/
function (data, dataElement) {
dataElement.dataElementType = this.elementType;
dataElement.displaySequence = data.Attr.DisplaySequence;
dataElement.id = data.Attr.Id;
dataElement.isRequired = data.Attr.IsRequired === 'true' ? true : false;
dataElement.label = data.Label;
dataElement.hint = data.Hint;
dataElement.cdeId = data.Attr.CdeId;
if (data.Diagrams) {
dataElement.diagrams = this.diagramService.returnDiagrams(data.Diagrams.Diagram);
}
dataElement.currentValue = undefined;
dataElement.defaultValue = undefined;
dataElement.isEditable = data.Attr.Editable === 'false' ? false : true;
dataElement.hasprefilled = data.Attr.Hasprefilled === 'true' ? true : false;
dataElement.output = data.Attr.Output === 'true' ? true : false;
dataElement.unit = data.Attr.Unit !== undefined ? data.Attr.Unit : '';
dataElement.sourceFilled = data.Attr.SourceFilled;
dataElement.displaySequenceOverrider = data.Attr.DisplaySequence;
dataElement.isRequiredOverrider = data.Attr.IsRequired === 'true' ? true : false;
if (data.CodableConcept !== undefined) {
dataElement.codableConcept = new CodableConcept();
dataElement.codableConcept.name = data.CodableConcept.Attr.Name;
if (data.CodableConcept.Coding !== undefined && data.CodableConcept.Coding.length > 0) {
try {
for (var _a = __values(data.CodableConcept.Coding), _b = _a.next(); !_b.done; _b = _a.next()) {
var coding = _b.value;
var /** @type {?} */ _coding = new Coding();
_coding.codingSystem.value = coding.System.Attr.Value;
_coding.codingVersion.value = coding.Version.Attr.Value;
_coding.codingCode.value = coding.Code.Attr.Value;
_coding.codingDisplay.value = coding.Display.Attr.Value;
// if (coding.UserSelected !== undefined) {
_coding.codingUserSelected.value = coding.UserSelected !== undefined ? coding.UserSelected.Attr.Value : null;
// }
dataElement.codableConcept.coding.push(_coding);
}
}
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;
}
}
}
}
var e_1, _c;
};
DataElementCreationBaseService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
DataElementCreationBaseService.ctorParameters = function () {
return [
{ type: DiagramService }
];
};
return DataElementCreationBaseService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BaseDataElement = (function () {
function BaseDataElement() {
this.isRequired = true;
this.isVisible = true;
this.isEditable = true;
this.hasprefilled = false;
this.output = false;
this.isRequiredOverrider = true;
}
return BaseDataElement;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ChoiceDataElement = (function (_super) {
__extends(ChoiceDataElement, _super);
function ChoiceDataElement() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.allowFreetext = false;
return _this;
}
return ChoiceDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Choice = (function () {
function Choice() {
}
return Choice;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ImageElements = (function () {
function ImageElements() {
}
return ImageElements;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ImageMap = (function (_super) {
__extends(ImageMap, _super);
function ImageMap() {
return _super !== null && _super.apply(this, arguments) || this;
}
return ImageMap;
}(ImageElements));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Area = (function () {
function Area() {
}
return Area;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AreaMap = (function () {
function AreaMap() {
}
return AreaMap;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ConditionalProperty = (function () {
function ConditionalProperty() {
}
return ConditionalProperty;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ChoiceDataElementCreationService = (function (_super) {
__extends(ChoiceDataElementCreationService, _super);
function ChoiceDataElementCreationService(diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.arrayCheckerService = arrayCheckerService;
_this.conditionsCreationService = conditionsCreationService;
_this.computedValueCreationService = computedValueCreationService;
_this.elementType = 'ChoiceDataElement';
return _this;
}
/**
* @param {?} choiceItem
* @return {?}
*/
ChoiceDataElementCreationService.prototype.returnChoice = /**
* @param {?} choiceItem
* @return {?}
*/
function (choiceItem) {
var /** @type {?} */ choice = new Choice();
choice.label = choiceItem.Label;
choice.value = choiceItem.Value;
choice.hint = choiceItem.Hint;
choice.reportText = choiceItem.ReportText;
choice.default = false;
if (choiceItem.Attr && choiceItem.Attr.IsDefault) {
choice.default = choiceItem.Attr.IsDefault;
}
return choice;
};
/**
* @param {?} areaJSON
* @return {?}
*/
ChoiceDataElementCreationService.prototype.returnArea = /**
* @param {?} areaJSON
* @return {?}
*/
function (areaJSON) {
var /** @type {?} */ area = new Area();
area.choiceValue = areaJSON.Attr.ChoiceValue;
area.coords = areaJSON.Attr.Coords;
area.shape = areaJSON.Attr.Shape;
return area;
};
/**
* @param {?} data
* @return {?}
*/
ChoiceDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new ChoiceDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
dataElement.allowFreetext = data.Attr.AllowFreetext ? data.Attr.AllowFreetext : false;
var /** @type {?} */ choiceItems = data.ChoiceInfo.Choice;
var /** @type {?} */ defaultValue;
if (choiceItems !== undefined) {
dataElement.choiceInfo = new Array();
if (this.arrayCheckerService.isArray(choiceItems)) {
try {
for (var choiceItems_1 = __values(choiceItems), choiceItems_1_1 = choiceItems_1.next(); !choiceItems_1_1.done; choiceItems_1_1 = choiceItems_1.next()) {
var choiceItem = choiceItems_1_1.value;
var /** @type {?} */ choice = this.returnChoice(choiceItem);
if (choice.default) {
defaultValue = choice.value;
}
dataElement.choiceInfo.push(choice);
}
}
catch (e_1_1) {
e_1 = { error: e_1_1 };
}
finally {
try {
if (choiceItems_1_1 && !choiceItems_1_1.done && (_a = choiceItems_1.return))
_a.call(choiceItems_1);
}
finally {
if (e_1)
throw e_1.error;
}
}
}
else {
var /** @type {?} */ choice = this.returnChoice(choiceItems);
if (choice.default) {
defaultValue = choice.value;
}
dataElement.choiceInfo.push(choice);
}
}
dataElement.defaultValue = defaultValue;
dataElement.currentValue = defaultValue;
var /** @type {?} */ imageMap = data.ImageMap;
if (imageMap !== undefined) {
dataElement.imageMap = new ImageMap();
dataElement.imageMap.location = imageMap.Location;
var /** @type {?} */ areaMaps = imageMap.Map.Area;
if (areaMaps !== undefined) {
dataElement.imageMap.map = new AreaMap();
dataElement.imageMap.map.areas = new Array();
if (this.arrayCheckerService.isArray(areaMaps)) {
try {
for (var areaMaps_1 = __values(areaMaps), areaMaps_1_1 = areaMaps_1.next(); !areaMaps_1_1.done; areaMaps_1_1 = areaMaps_1.next()) {
var areaMap = areaMaps_1_1.value;
dataElement.imageMap.map.areas.push(this.returnArea(areaMap));
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (areaMaps_1_1 && !areaMaps_1_1.done && (_b = areaMaps_1.return))
_b.call(areaMaps_1);
}
finally {
if (e_2)
throw e_2.error;
}
}
}
else {
dataElement.imageMap.map.areas.push(this.returnArea(areaMaps));
}
}
}
var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
if (ConditionalProperties !== undefined) {
var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
// .NotRelevantDataElements.DataElementRef;
if (data.ConditionalProperties !== undefined) {
dataElement.conditionalProperties = new Array();
if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
try {
for (var _c = __values(data.ConditionalProperties.ConditionalProperty), _d = _c.next(); !_d.done; _d = _c.next()) {
var conditionalProperty = _d.value;
dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (_d && !_d.done && (_e = _c.return))
_e.call(_c);
}
finally {
if (e_3)
throw e_3.error;
}
}
}
else {
dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
}
}
}
return dataElement;
var e_1, _a, e_2, _b, e_3, _e;
};
/**
* @param {?} conditionalProperty
* @return {?}
*/
ChoiceDataElementCreationService.prototype.GetConditionalProperties = /**
* @param {?} conditionalProperty
* @return {?}
*/
function (conditionalProperty) {
var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
_conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
// var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
if (this.conditionsCreationService.isComposite(conditionalProperty)) {
_conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
}
_conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
_conditionalProperty.isRequired = conditionalProperty.IsRequired;
_conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
if (conditionalProperty.ChoiceNotRelevant !== undefined) {
_conditionalProperty.ChoiceNotRelevant = new Array();
try {
for (var _a = __values(conditionalProperty.ChoiceNotRelevant), _b = _a.next(); !_b.done; _b = _a.next()) {
var choiceNotRelevant = _b.value;
_conditionalProperty.ChoiceNotRelevant.push(choiceNotRelevant.Attr.ChoiceValue);
}
}
catch (e_4_1) {
e_4 = { error: e_4_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_4)
throw e_4.error;
}
}
}
return _conditionalProperty;
var e_4, _c;
};
ChoiceDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
ChoiceDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ArrayCheckerService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return ChoiceDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var MultipleChoiceDataElementCreationService = (function (_super) {
__extends(MultipleChoiceDataElementCreationService, _super);
function MultipleChoiceDataElementCreationService(diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) || this;
_this.elementType = 'MultiChoiceDataElement';
return _this;
}
MultipleChoiceDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
MultipleChoiceDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ArrayCheckerService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return MultipleChoiceDataElementCreationService;
}(ChoiceDataElementCreationService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NumericDataElement = (function (_super) {
__extends(NumericDataElement, _super);
function NumericDataElement() {
return _super !== null && _super.apply(this, arguments) || this;
}
return NumericDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NumericDataElementCreationService = (function (_super) {
__extends(NumericDataElementCreationService, _super);
function NumericDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.conditionsCreationService = conditionsCreationService;
_this.computedValueCreationService = computedValueCreationService;
_this.elementType = 'NumericDataElement';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
NumericDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new NumericDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
dataElement.minimum = data.Minimum;
dataElement.maximum = data.Maximum;
dataElement.maximumOverrider = data.Maximum;
dataElement.minimumOverrider = data.Minimum;
var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
if (ConditionalProperties !== undefined) {
var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
// .NotRelevantDataElements.DataElementRef;
if (data.ConditionalProperties !== undefined) {
dataElement.conditionalProperties = new Array();
if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
try {
for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
var conditionalProperty = _b.value;
dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
}
}
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;
}
}
}
else {
dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
}
}
}
return dataElement;
var e_1, _c;
};
/**
* @param {?} conditionalProperty
* @return {?}
*/
NumericDataElementCreationService.prototype.GetConditionalProperties = /**
* @param {?} conditionalProperty
* @return {?}
*/
function (conditionalProperty) {
var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
_conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
// var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
if (this.conditionsCreationService.isComposite(conditionalProperty)) {
_conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
}
_conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
_conditionalProperty.isRequired = conditionalProperty.IsRequired;
_conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
_conditionalProperty.Minimum = conditionalProperty.Minimum;
_conditionalProperty.Maximum = conditionalProperty.Maximum;
return _conditionalProperty;
};
NumericDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
NumericDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return NumericDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var IntegerDataElement = (function (_super) {
__extends(IntegerDataElement, _super);
function IntegerDataElement() {
return _super !== null && _super.apply(this, arguments) || this;
}
return IntegerDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var IntegerDataElementCreationService = (function (_super) {
__extends(IntegerDataElementCreationService, _super);
function IntegerDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.conditionsCreationService = conditionsCreationService;
_this.computedValueCreationService = computedValueCreationService;
_this.elementType = 'IntegerDataElement';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
IntegerDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new IntegerDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
dataElement.minimum = data.Minimum;
dataElement.maximum = data.Maximum;
dataElement.maximumOverrider = data.Maximum;
dataElement.minimumOverrider = data.Minimum;
var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
if (ConditionalProperties !== undefined) {
var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
// .NotRelevantDataElements.DataElementRef;
if (data.ConditionalProperties !== undefined) {
dataElement.conditionalProperties = new Array();
if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
try {
for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
var conditionalProperty = _b.value;
dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
}
}
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;
}
}
}
else {
dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
}
}
}
return dataElement;
var e_1, _c;
};
/**
* @param {?} conditionalProperty
* @return {?}
*/
IntegerDataElementCreationService.prototype.GetConditionalProperties = /**
* @param {?} conditionalProperty
* @return {?}
*/
function (conditionalProperty) {
var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
_conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
// var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
if (this.conditionsCreationService.isComposite(conditionalProperty)) {
_conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
}
_conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
_conditionalProperty.isRequired = conditionalProperty.IsRequired;
_conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
_conditionalProperty.Minimum = conditionalProperty.Minimum;
_conditionalProperty.Maximum = conditionalProperty.Maximum;
return _conditionalProperty;
};
IntegerDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
IntegerDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return IntegerDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var InputData = (function () {
function InputData() {
this.dataElementLabel = '';
this.dataElementDisplayValue = '';
}
return InputData;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var SimulatorCommunicationService = (function () {
function SimulatorCommunicationService() {
this.simulatorSource = new Subject.Subject();
// Observable string streams
this.simulatorSource$ = this.simulatorSource.asObservable();
}
// Service message commands
/**
* @param {?} mission
* @return {?}
*/
SimulatorCommunicationService.prototype.messageEmitter = /**
* @param {?} mission
* @return {?}
*/
function (mission) {
this.simulatorSource.next(mission);
};
SimulatorCommunicationService.decorators = [
{ type: core.Injectable },
];
return SimulatorCommunicationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$1 = require('jquery');
var AssistDataElementComponent = (function () {
function AssistDataElementComponent(simulatorEngineService, simulatorCommunicationService) {
this.simulatorEngineService = simulatorEngineService;
this.simulatorCommunicationService = simulatorCommunicationService;
this.Endpoints = [];
this.returnReportText = new core.EventEmitter();
this.returnExecutionHistory = new core.EventEmitter();
this.returnDataElementChanged = new core.EventEmitter();
this.inputValues = [];
this.comparisonValues = [];
this.selectedChoiceValues = [];
this.executedResultIds = [];
this.executedResultHistories = [];
}
/**
* @return {?}
*/
AssistDataElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.simulatorEngineService.simulatorStateChanged.subscribe(function (message) {
_this.simulatorState = /** @type {?} */ (message);
_this.dataElementValues = _this.simulatorEngineService.getAllDataElementValues();
var /** @type {?} */ nonRelevantIDs = _this.simulatorEngineService.evaluateDecisionAndConditionalProperty();
try {
for (var _a = __values(_this.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var dataElement = _b.value;
if (nonRelevantIDs && nonRelevantIDs.length > 0) {
if (nonRelevantIDs.indexOf(dataElement.id) >= 0) {
dataElement.isVisible = false;
}
else {
dataElement.isVisible = true;
}
}
else {
dataElement.isVisible = true;
}
if (_this.dataElementValues[dataElement.id] !== undefined && dataElement.currentValue !== _this.dataElementValues[dataElement.id]) {
dataElement.currentValue = _this.dataElementValues[dataElement.id];
}
dataElement.currentValue = (dataElement.currentValue !== undefined) ? dataElement.currentValue : _this.dataElementValues[dataElement.id];
}
}
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.dataElements = _this.dataElements.filter(function (x) { return x.displaySequence != null; }).sort(function (DE_1, DE_2) { return DE_1.displaySequence - DE_2.displaySequence; });
if (_this.simulatorState.endPointId && _this.simulatorState.endPointId.length > 0) {
_this.generateReportText(_this.simulatorState.endPointId);
}
else {
_this.returnReportText.emit(undefined);
}
_this.simulatorCommunicationService.messageEmitter('');
var e_1, _c;
});
};
/**
* @param {?} changes
* @return {?}
*/
AssistDataElementComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.dataElements = this.dataElements.filter(function (x) { return x.displaySequence != null; }).sort(function (DE_1, DE_2) { return DE_1.displaySequence - DE_2.displaySequence; });
this.executedResultIds = [];
};
/**
* @param {?} $event
* @return {?}
*/
AssistDataElementComponent.prototype.choiceSelected = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($event !== undefined) {
if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
this.selectedChoiceValues[$event.receivedElement.elementId + 'SelectedValue'] = $event.receivedElement.selectedText;
this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedValue, $event.receivedElement.selectedText);
var /** @type {?} */ executedResults = [];
executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
this.generateExecutionHistory();
}
this.afterDataElementChanged();
}
}
else {
this.afterDataElementChanged();
}
};
/**
* @param {?} $event
* @return {?}
*/
AssistDataElementComponent.prototype.numericSelected = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($event !== undefined) {
if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedValue, $event.receivedElement.selectedValue);
var /** @type {?} */ executedResults = [];
executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
this.generateExecutionHistory();
}
this.afterDataElementChanged();
}
}
else {
this.afterDataElementChanged();
}
};
/**
* @param {?} $event
* @return {?}
*/
AssistDataElementComponent.prototype.multiSelected = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($event !== undefined) {
if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
this.comparisonValues[$event.receivedElement.elementId + 'ComparisonValue'] = $event.receivedElement.selectedComparisonValues;
this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedComparisonValues, $event.receivedElement.selectedValues);
var /** @type {?} */ executedResults = [];
executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
this.generateExecutionHistory();
}
this.afterDataElementChanged();
}
}
else {
this.afterDataElementChanged();
}
};
/**
* @param {?} endpointId
* @return {?}
*/
AssistDataElementComponent.prototype.generateReportText = /**
* @param {?} endpointId
* @return {?}
*/
function (endpointId) {
var /** @type {?} */ endpointContent = this.returnEndPointContents(this.xmlContent, '<EndPoint Id="' + endpointId + '">', '</EndPoint>');
this.parseXml(endpointId, endpointContent);
};
/**
* @return {?}
*/
AssistDataElementComponent.prototype.afterDataElementChanged = /**
* @return {?}
*/
function () {
var /** @type {?} */ deValues = [];
var _loop_1 = function (de) {
if (de.isVisible && de.dataElementType !== 'ComputedDataElement' && de.dataElementType !== 'GlobalValue') {
var /** @type {?} */ inputData_1 = new InputData();
inputData_1.dataElementId = de.id;
inputData_1.dataElementLabel = de.label;
inputData_1.dataElementValue = de.currentValue;
if (de.currentValue === undefined || de.currentValue === '') {
inputData_1.dataElementDisplayValue = undefined;
}
else {
if (de.dataElementType === 'ChoiceDataElement') {
var /** @type {?} */ choices = ((de)).choiceInfo;
inputData_1.dataElementDisplayValue = choices.filter(function (ch) { return ch.value === de.currentValue; })[0].label;
}
else if (de.dataElementType === 'MultiChoiceDataElement') {
var /** @type {?} */ choices = ((de)).choiceInfo;
inputData_1.dataElementDisplayValue = [];
choices.forEach(function (choice) {
if (Array.isArray(de.currentValue)) {
de.currentValue.forEach(function (element) {
if (choice.value === element) {
inputData_1.dataElementDisplayValue.push(choice.label);
}
});
}
else {
if (choice.value === de.currentValue) {
inputData_1.dataElementDisplayValue.push(choice.label);
}
}
});
}
else {
inputData_1.dataElementDisplayValue = de.currentValue;
}
}
deValues.push(inputData_1);
}
};
try {
for (var _a = __values(this.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
var de = _b.value;
_loop_1(de);
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_2)
throw e_2.error;
}
}
this.returnDataElementChanged.emit(deValues);
var e_2, _c;
};
/**
* @return {?}
*/
AssistDataElementComponent.prototype.generateExecutionHistory = /**
* @return {?}
*/
function () {
this.executedResultHistories = [];
var /** @type {?} */ isNonRelevant;
isNonRelevant = false;
// tslint:disable-next-line:forin
for (var /** @type {?} */ resultId in this.executedResultIds) {
try {
for (var _a = __values(this.simulatorState.nonRelevantDataElementIds), _b = _a.next(); !_b.done; _b = _a.next()) {
var nonRelevantDataElement = _b.value;
if (nonRelevantDataElement === resultId) {
isNonRelevant = true;
break;
}
else {
isNonRelevant = false;
}
}
}
catch (e_3_1) {
e_3 = { error: e_3_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_3)
throw e_3.error;
}
}
if (!isNonRelevant) {
// tslint:disable-next-line:forin
for (var /** @type {?} */ label in this.executedResultIds[resultId]) {
var /** @type {?} */ executedResultHistory = new ExecutedResultHistory();
executedResultHistory.resultCondition = label;
executedResultHistory.resultValue = this.executedResultIds[resultId][label];
this.executedResultHistories.push(executedResultHistory);
}
}
}
var /** @type {?} */ finalExecution = new FinalExecutedHistory();
if (this.executedResultHistories.length > 0) {
finalExecution.executionHistories = this.executedResultHistories;
finalExecution.resultText = this.mainReportTextObj;
finalExecution.inputData = [];
try {
for (var _d = __values(this.dataElements), _e = _d.next(); !_e.done; _e = _d.next()) {
var de = _e.value;
if (de.isVisible && de.dataElementType !== 'ComputedDataElement' && de.dataElementType !== 'GlobalValue') {
var /** @type {?} */ inputData = new InputData();
inputData.dataElementId = de.id;
inputData.dataElementValue = de.currentValue;
finalExecution.inputData.push(inputData);
}
}
}
catch (e_4_1) {
e_4 = { error: e_4_1 };
}
finally {
try {
if (_e && !_e.done && (_f = _d.return))
_f.call(_d);
}
finally {
if (e_4)
throw e_4.error;
}
}
}
this.returnExecutionHistory.emit(finalExecution);
var e_3, _c, e_4, _f;
};
/**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
AssistDataElementComponent.prototype.returnEndPointContents = /**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
function (content, startToken, endToken) {
var /** @type {?} */ contents;
var /** @type {?} */ templateSearchIndexPosition = 0;
while (true) {
var /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
var /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
if (contentStartPosition >= 0 && contentEndPosition >= 0) {
var /** @type {?} */ endPosition = contentEndPosition + endToken.length;
var /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
contents = contentData;
templateSearchIndexPosition = endPosition + 1;
}
else {
break;
}
}
return contents;
};
/**
* @param {?} xmlData
* @return {?}
*/
AssistDataElementComponent.prototype.parseToJson = /**
* @param {?} xmlData
* @return {?}
*/
function (xmlData) {
var /** @type {?} */ jsonResult;
var /** @type {?} */ parseString = require('xml2js').parseString;
parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
jsonResult = result;
});
return jsonResult;
};
/**
* @param {?} endPointId
* @param {?} endpointContent
* @return {?}
*/
AssistDataElementComponent.prototype.parseXml = /**
* @param {?} endPointId
* @param {?} endpointContent
* @return {?}
*/
function (endPointId, endpointContent) {
var /** @type {?} */ canInsertText;
var /** @type {?} */ isSectionIf;
var /** @type {?} */ selectedElements;
var /** @type {?} */ executeSectionIfNot;
var /** @type {?} */ hasSectionNot;
var /** @type {?} */ executeTemplate;
var /** @type {?} */ isImpression;
var /** @type {?} */ isNewTemplate;
var /** @type {?} */ hasInsertPartial;
var /** @type {?} */ isMainText;
var /** @type {?} */ allReportText = [];
var /** @type {?} */ endpoints = this.Endpoints;
var /** @type {?} */ templatePartialsText;
var /** @type {?} */ selectedComparisonValues;
var /** @type {?} */ findingsText;
var /** @type {?} */ impressionText;
var /** @type {?} */ selectedSection;
var /** @type {?} */ selectedChoiceTexts;
var /** @type {?} */ textExpressionValue;
selectedElements = this.simulatorEngineService.getAllDataElementValues();
templatePartialsText = this.templatePartial;
selectedComparisonValues = this.comparisonValues;
selectedChoiceTexts = this.simulatorEngineService.getAllDataElementTexts();
executeSectionIfNot = false;
hasInsertPartial = false;
endpointContent = endpointContent.replace(/\n/g, ' ');
endpointContent = endpointContent.replace(/\t/g, ' ');
// endpointContent = endpointContent.replace(/\s/g, ' ');
// tslint:disable-next-line:forin
for (var /** @type {?} */ i in templatePartialsText) {
templatePartialsText[i] = templatePartialsText[i].replace(/\n/g, ' ');
templatePartialsText[i] = templatePartialsText[i].replace(/\t/g, ' ');
// templatePartialsText[i] = templatePartialsText[i].replace(/\s+/g, ' ');
}
findingsText = '';
impressionText = '';
var /** @type {?} */ isReportText;
var /** @type {?} */ reportTextContent = '';
var /** @type {?} */ endpointSax = require('sax'), /** @type {?} */ strict = true, // set to false for html-mode
trim = true, /** @type {?} */ reportTextParser = endpointSax.parser(strict, trim);
reportTextParser.onerror = function (e) {
// an error happened.
reportTextParser.resume();
};
reportTextParser.ontext = function (t) {
debugger;
// if (t.length > 1) {
// t = t.trim();
// }
var /** @type {?} */ isTextInserted;
isTextInserted = false;
if (executeTemplate) {
if (!isImpression) {
if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
findingsText = findingsText + t;
}
else if (canInsertText && isNewTemplate && hasInsertPartial && !isSectionIf) {
findingsText = findingsText + t;
}
else if (canInsertText && !isImpression) {
findingsText = findingsText + t;
}
}
else {
if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
impressionText = impressionText + t;
}
else if (canInsertText && !hasSectionNot && isImpression) {
impressionText = impressionText + t;
}
else if (canInsertText && isNewTemplate) {
impressionText = impressionText + t;
}
}
if (isReportText && !isTextInserted && isMainText && canInsertText) {
reportTextContent = reportTextContent + t;
}
}
};
reportTextParser.onopentag = function (node) {
switch (node.name) {
case 'Label':
canInsertText = false;
isReportText = false;
isMainText = false;
break;
case 'ReportText':
if (executeTemplate) {
isReportText = true;
canInsertText = true;
selectedSection = node.attributes.SectionId;
impressionText = '';
if (node.attributes.SectionId === 'findings' && executeTemplate) {
isImpression = false;
}
else if (node.attributes.SectionId === 'impression' && executeTemplate) {
isImpression = true;
}
}
isSectionIf = false;
// isMainText = true;
break;
case 'InsertPartial':
if (executeTemplate) {
generatePartialView(node.attributes.PartialId, isImpression);
executeTemplate = true;
canInsertText = true;
if (isReportText) {
hasInsertPartial = true;
}
else {
hasInsertPartial = false;
}
}
else {
canInsertText = false;
}
isReportText = false;
isMainText = false;
break;
case 'SectionIfValueNot':
if (executeTemplate) {
if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
try {
for (var _a = __values(selectedElements[node.attributes.DataElementId]), _b = _a.next(); !_b.done; _b = _a.next()) {
var comaprisonValue = _b.value;
if (comaprisonValue !== node.attributes.ComparisonValue &&
comaprisonValue !== undefined && !isSectionIf) {
canInsertText = true;
executeSectionIfNot = true;
break;
}
else {
canInsertText = false;
executeSectionIfNot = false;
}
}
}
catch (e_5_1) {
e_5 = { error: e_5_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_5)
throw e_5.error;
}
}
}
else if (selectedElements[node.attributes.DataElementId] !== node.attributes.ComparisonValue &&
selectedElements[node.attributes.DataElementId] !== '--Select--' &&
selectedElements[node.attributes.DataElementId] !== undefined &&
selectedElements[node.attributes.DataElementId] !== null) {
canInsertText = true;
executeSectionIfNot = true;
}
else {
canInsertText = false;
executeSectionIfNot = false;
}
}
hasSectionNot = true;
isMainText = false;
break;
case 'SectionIf':
if (selectedElements[node.attributes.DataElementId] !== undefined && selectedElements[node.attributes.DataElementId].length > 0 && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
isSectionIf = true;
canInsertText = true;
}
else {
isSectionIf = false;
canInsertText = false;
}
break;
case 'SectionIfValue':
if (executeTemplate) {
if (executeTemplate) {
if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
try {
for (var _d = __values(selectedElements[node.attributes.DataElementId]), _e = _d.next(); !_e.done; _e = _d.next()) {
var comaprisonValue = _e.value;
if (comaprisonValue === node.attributes.ComparisonValue &&
comaprisonValue !== undefined) {
isSectionIf = true;
if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
}
canInsertText = true;
break;
}
else {
isSectionIf = false;
canInsertText = false;
}
}
}
catch (e_6_1) {
e_6 = { error: e_6_1 };
}
finally {
try {
if (_e && !_e.done && (_f = _d.return))
_f.call(_d);
}
finally {
if (e_6)
throw e_6.error;
}
}
}
else if (selectedElements[node.attributes.DataElementId] === node.attributes.ComparisonValue &&
selectedElements[node.attributes.DataElementId] !== undefined) {
isSectionIf = true;
if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
}
canInsertText = true;
}
else {
canInsertText = false;
}
}
break;
}
isMainText = false;
break;
case 'InsertValue':
if (executeTemplate) {
isReportText = false;
var /** @type {?} */ choiceText = selectedChoiceTexts[node.attributes.DataElementId];
if (node.attributes.Id === 'findings' || canInsertText) {
if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot) {
if (isImpression) {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
impressionText = impressionText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
}
}
else {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
findingsText = findingsText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
}
}
}
else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot) {
if (isImpression) {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
impressionText = impressionText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
}
}
else {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
findingsText = findingsText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
}
}
}
if (isImpression) {
canInsertText = true;
}
}
isMainText = false;
break;
}
}
executeTemplate = true;
isNewTemplate = true;
var e_5, _c, e_6, _f;
};
reportTextParser.onclosetag = function (node) {
switch (node) {
case 'SectionIfValueNot':
executeSectionIfNot = false;
hasSectionNot = false;
if (isSectionIf) {
canInsertText = true;
}
break;
case 'TemplatePartial':
isNewTemplate = false;
canInsertText = false;
executeTemplate = false;
break;
case 'ReportText':
// isImpression = false;
if (!hasInsertPartial && !isImpression) {
var /** @type {?} */ reportTextObj = new AllReportText();
reportTextObj.sectionId = 'findings';
reportTextObj.reportText = findingsText;
allReportText[reportTextObj.sectionId] = reportTextObj;
}
if (impressionText !== '' && impressionText !== undefined) {
var /** @type {?} */ reportTextObj = new AllReportText();
reportTextObj.sectionId = selectedSection;
reportTextObj.reportText = impressionText;
allReportText[reportTextObj.sectionId] = reportTextObj;
}
hasInsertPartial = false;
break;
case 'SectionIf':
isSectionIf = false;
canInsertText = true;
break;
case 'InsertPartial':
canInsertText = true;
break;
case 'InsertValue':
if ((hasSectionNot && executeSectionIfNot || !hasSectionNot)) {
canInsertText = true;
}
break;
case 'SectionIfValue':
canInsertText = true;
break;
}
};
reportTextParser.onend = function () {
// parser stream is done, and ready to have more stuff written to it.
// if (impressionText !== '' && impressionText !== undefined) {
// const reportTextObj: AllReportText = new AllReportText();
// reportTextObj.sectionId = selectedSection;
// reportTextObj.reportText = impressionText;
// allReportText[reportTextObj.sectionId] = reportTextObj;
// }
};
reportTextParser.write(endpointContent).onend();
/**
* @param {?} textExpression
* @return {?}
*/
function getTextExpressionValue(textExpression) {
if (textExpression.indexOf('{') === 0 && (textExpression.indexOf('}') > 1)) {
var /** @type {?} */ subString = textExpression.substr(textExpression.indexOf('{') + 1, textExpression.indexOf('}') - 1);
getTextExpressionValue(selectedElements[subString]);
}
else {
textExpressionValue = textExpression;
}
}
/**
* @param {?} partialViewId
* @param {?} isImpressionTemplate
* @return {?}
*/
function generatePartialView(partialViewId, isImpressionTemplate) {
// this.templateIds = [];
var /** @type {?} */ sax = require('sax'), /** @type {?} */ parser = sax.parser(strict, trim);
parser.onerror = function (e) {
// an error happened.
// parser.resume();
};
parser.ontext = function (t) {
if (executeTemplate) {
if (!isImpressionTemplate) {
if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
findingsText = findingsText + t;
}
else if (canInsertText && !hasSectionNot && isImpression) {
findingsText = findingsText + t;
}
else if (canInsertText && isNewTemplate) {
findingsText = findingsText + t;
}
}
else {
if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
impressionText = impressionText + t;
}
else if (canInsertText && !hasSectionNot && isImpression) {
impressionText = impressionText + t;
}
else if (canInsertText && isNewTemplate) {
impressionText = impressionText + t;
}
}
}
};
parser.onopentag = function (node) {
switch (node.name) {
case 'Label':
canInsertText = false;
break;
case 'EndPoint':
if (node.attributes.Id !== '') {
canInsertText = true;
isImpression = true;
}
else {
canInsertText = false;
isImpression = false;
}
break;
case 'InsertPartial':
canInsertText = false;
break;
case 'ReportText':
canInsertText = true;
break;
case 'TemplatePartial':
hasSectionNot = false;
executeSectionIfNot = false;
if (node.attributes.Id === partialViewId) {
executeTemplate = true;
canInsertText = true;
isNewTemplate = true;
break;
}
else {
isNewTemplate = false;
executeTemplate = false;
}
break;
case 'SectionIfValueNot':
if (executeTemplate) {
if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
try {
for (var _a = __values(selectedComparisonValues[node.attributes.DataElementId + 'ComparisonValue']), _b = _a.next(); !_b.done; _b = _a.next()) {
var comaprisonValue = _b.value;
if (comaprisonValue !== node.attributes.ComparisonValue &&
comaprisonValue !== undefined && !isSectionIf) {
canInsertText = true;
executeSectionIfNot = true;
break;
}
else {
canInsertText = false;
executeSectionIfNot = false;
}
}
}
catch (e_7_1) {
e_7 = { error: e_7_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_7)
throw e_7.error;
}
}
}
else if (selectedElements[node.attributes.DataElementId] !== node.attributes.ComparisonValue &&
selectedElements[node.attributes.DataElementId] !== '--Select--' &&
selectedElements[node.attributes.DataElementId] !== undefined &&
selectedElements[node.attributes.DataElementId] !== null) {
canInsertText = true;
executeSectionIfNot = true;
}
else {
canInsertText = false;
executeSectionIfNot = false;
}
}
hasSectionNot = true;
break;
case 'SectionIf':
if (selectedElements[node.attributes.DataElementId] !== undefined && selectedElements[node.attributes.DataElementId].length > 0 && (!hasSectionNot || (hasSectionNot && executeSectionIfNot))
&& selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
isSectionIf = true;
canInsertText = true;
}
else {
isSectionIf = false;
canInsertText = false;
}
break;
case 'SectionIfValue':
if (executeTemplate) {
if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
try {
for (var _d = __values(selectedComparisonValues[node.attributes.DataElementId + 'ComparisonValue']), _e = _d.next(); !_e.done; _e = _d.next()) {
var comaprisonValue = _e.value;
if (comaprisonValue === node.attributes.ComparisonValue &&
comaprisonValue !== undefined) {
isSectionIf = true;
if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
}
canInsertText = true;
break;
}
else {
isSectionIf = false;
canInsertText = false;
}
}
}
catch (e_8_1) {
e_8 = { error: e_8_1 };
}
finally {
try {
if (_e && !_e.done && (_f = _d.return))
_f.call(_d);
}
finally {
if (e_8)
throw e_8.error;
}
}
}
else if (selectedElements[node.attributes.DataElementId] === node.attributes.ComparisonValue &&
selectedElements[node.attributes.DataElementId] !== undefined) {
isSectionIf = true;
if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
}
canInsertText = true;
}
else {
canInsertText = false;
}
}
break;
case 'InsertValue':
if (executeTemplate) {
var /** @type {?} */ choiceText = selectedChoiceTexts[node.attributes.DataElementId];
if (node.attributes.Id === 'findings' || canInsertText) {
if (isImpression) {
canInsertText = true;
if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
}
else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
else {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
}
}
}
else {
if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
}
else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
}
}
}
}
break;
}
}
var e_7, _c, e_8, _f;
};
parser.onclosetag = function (node) {
switch (node) {
case 'SectionIfValueNot':
executeSectionIfNot = false;
hasSectionNot = false;
if (isSectionIf) {
canInsertText = true;
}
break;
case 'TemplatePartial':
isNewTemplate = true;
canInsertText = false;
executeTemplate = true;
break;
case 'InsertPartial':
canInsertText = true;
break;
case 'SectionIf':
isSectionIf = false;
break;
}
};
parser.onend = function () {
// parser stream is done, and ready to have more stuff written to it.
var /** @type {?} */ reportTextObj = new AllReportText();
reportTextObj.sectionId = 'findings';
reportTextObj.reportText = findingsText;
allReportText[reportTextObj.sectionId] = reportTextObj;
};
parser.write(templatePartialsText).onend();
}
this.mainReportTextObj = new MainReportText();
this.mainReportTextObj.reportTextMainContent = reportTextContent;
this.mainReportTextObj.allReportText = allReportText;
this.returnReportText.emit(this.mainReportTextObj);
};
AssistDataElementComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-data-element',
template: "<ng-container *ngFor=\"let DataElement of dataElements\"> \n <ng-container *ngIf=\"(DataElement.dataElementType == 'ChoiceDataElement'\n || DataElement.dataElementType == 'NumericDataElement'\n || DataElement.dataElementType == 'IntegerDataElement' \n || DataElement.dataElementType == 'MultiChoiceDataElement'\n || DataElement.dataElementType == 'DateTimeDataElement'\n || DataElement.dataElementType == 'DurationDataElement') \">\n <ng-container *ngIf=\"DataElement.isVisible\">\n <div id=\"div_{{DataElement.id}}\">\n <ng-container *ngIf=\"DataElement.dataElementType == 'ChoiceDataElement'\">\n <acr-assist-choice-element [choiceDataElement]='DataElement' [imagePath]='imagePath' (returnChoiceElement)='choiceSelected($event)'></acr-assist-choice-element>\n </ng-container>\n <ng-container *ngIf=\"DataElement.dataElementType == 'MultiChoiceDataElement'\">\n <acr-assist-multi-choice-element [multiChoiceElement]='DataElement' [imagePath]='imagePath' (returnMultiChoice)='multiSelected($event)'></acr-assist-multi-choice-element>\n </ng-container>\n <ng-container *ngIf=\"DataElement.dataElementType == 'NumericDataElement' || DataElement.dataElementType == 'IntegerDataElement'\">\n <acr-assist-numeric-element [numericDataElement]='DataElement' [imagePath]='imagePath' (returnNumericElement)='numericSelected($event)'></acr-assist-numeric-element>\n </ng-container>\n <ng-container *ngIf=\"DataElement.dataElementType == 'DateTimeDataElement'\">\n <acr-assist-date-time-element [dateTimeDataElement]='DataElement'></acr-assist-date-time-element>\n </ng-container>\n <ng-container *ngIf=\"DataElement.dataElementType == 'DurationDataElement'\">\n <acr-assist-duration-element [durationDataElement]='DataElement'></acr-assist-duration-element>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>\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 */
AssistDataElementComponent.ctorParameters = function () {
return [
{ type: SimulatorEngineService },
{ type: SimulatorCommunicationService }
];
};
AssistDataElementComponent.propDecorators = {
dataElements: [{ type: core.Input }],
imagePath: [{ type: core.Input }],
Endpoints: [{ type: core.Input }],
templatePartial: [{ type: core.Input }],
endPointXMLString: [{ type: core.Input }],
xmlContent: [{ type: core.Input }],
returnReportText: [{ type: core.Output }],
returnExecutionHistory: [{ type: core.Output }],
returnDataElementChanged: [{ type: core.Output }],
isReset: [{ type: core.Input }],
inputValues: [{ type: core.Input }]
};
return AssistDataElementComponent;
}());
var ChoiceElement = (function () {
function ChoiceElement() {
}
return ChoiceElement;
}());
var NumericElement = (function () {
function NumericElement() {
}
return NumericElement;
}());
var MultiChoiceElement = (function () {
function MultiChoiceElement() {
}
return MultiChoiceElement;
}());
var MainReportText = (function () {
function MainReportText() {
}
return MainReportText;
}());
var AllReportText = (function () {
function AllReportText() {
}
return AllReportText;
}());
var ExecutedResultHistory = (function () {
function ExecutedResultHistory() {
}
return ExecutedResultHistory;
}());
var FinalExecutedHistory = (function () {
function FinalExecutedHistory() {
}
return FinalExecutedHistory;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var HintDiagramComponent = (function () {
function HintDiagramComponent(domSanitizer) {
this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
this.activeSlideIndex = 0;
this.domSanitizer = domSanitizer;
}
/**
* @return {?}
*/
HintDiagramComponent.prototype.resetCarouselIndex = /**
* @return {?}
*/
function () {
this.activeSlideIndex = 0;
};
/**
* @param {?} location
* @return {?}
*/
HintDiagramComponent.prototype.getImageDataUrl = /**
* @param {?} location
* @return {?}
*/
function (location) {
var /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
if (isDataURL) {
location = location.replace('unsafe:', '');
return location;
}
else {
return this.imagePath + '/' + location;
}
};
HintDiagramComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-hint-diagram',
template: "<ng-container *ngIf=\"dataElement !== undefined\">\n <button type=\"button\" class=\"btn btn-default btn-xs\" data-toggle=\"modal\" attr.data-target=\"#{{'diag_'+dataElement.id}}\"\n (click)=\"resetCarouselIndex()\">\n <span class=\"glyphicon glyphicon-picture\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Hint Diagrams\"></span>\n </button>\n <div class=\"modal inmodal fade\" id=\"{{'diag_'+dataElement.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n <span aria-hidden=\"true\">×</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <h4 class=\"modal-title float-left\">{{dataElement.label}}</h4>\n </div>\n <div class=\"modal-body\">\n <ng-container>\n <carousel [(activeSlide)]=\"activeSlideIndex\" interval=\"false\">\n <ng-container *ngFor=\"let diag of dataElement.diagrams \">\n <slide>\n <img class=\"img-responsive max-w-h-100\" [src]=\"domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(diag.location))\" alt=\"{{ diag.label }}\">\n </slide>\n </ng-container>\n </carousel>\n </ng-container>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\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 */
HintDiagramComponent.ctorParameters = function () {
return [
{ type: platformBrowser.DomSanitizer }
];
};
HintDiagramComponent.propDecorators = {
dataElement: [{ type: core.Input }],
imagePath: [{ type: core.Input }]
};
return HintDiagramComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var GlobalValue = (function (_super) {
__extends(GlobalValue, _super);
function GlobalValue() {
return _super !== null && _super.apply(this, arguments) || this;
}
return GlobalValue;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var GlobalValueCreationService = (function (_super) {
__extends(GlobalValueCreationService, _super);
function GlobalValueCreationService(diagramService) {
var _this = _super.call(this, diagramService) || this;
_this.elementType = 'GlobalValue';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
GlobalValueCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new GlobalValue();
dataElement.id = data.Attr.Id;
dataElement.currentValue = data._;
dataElement.dataElementType = 'GlobalValue';
return dataElement;
};
GlobalValueCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
GlobalValueCreationService.ctorParameters = function () {
return [
{ type: DiagramService }
];
};
return GlobalValueCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var SelectedCondition = (function () {
function SelectedCondition() {
}
return SelectedCondition;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AssistNumericElementComponent = (function () {
function AssistNumericElementComponent(formBuilder, simulatorEngineService, simulatorCommunicationService) {
var _this = this;
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnNumericElement = new core.EventEmitter();
this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(function (mission) {
_this.UpdateFormValidator();
});
}
// tslint:disable-next-line:use-life-cycle-interface
/**
* @return {?}
*/
AssistNumericElementComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// prevent memory leak when component destroyed
this.subscription.unsubscribe();
};
/**
* @return {?}
*/
AssistNumericElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createNumericElementForm();
};
// tslint:disable-next-line:use-life-cycle-interface
/**
* @param {?} changes
* @return {?}
*/
AssistNumericElementComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
// console.log('asda');
};
/**
* @return {?}
*/
AssistNumericElementComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.numericDataElement.currentValue !== undefined && this.numericDataElement.currentValue !== 0) {
this.simulatorEngineService.addOrUpdateDataElement(this.numericDataElement.id, this.numericDataElement.currentValue, this.numericDataElement.currentValue);
this.numberValue = this.numericDataElement.currentValue;
this.loadedNumericValue(this.numericDataElement.id, this.numericDataElement.currentValue, this.numericDataElement.label);
}
else {
this.returnNumericElement.emit(undefined);
}
};
/**
* @param {?} id
* @param {?} value
* @param {?} selectedCondition
* @return {?}
*/
AssistNumericElementComponent.prototype.loadedNumericValue = /**
* @param {?} id
* @param {?} value
* @param {?} selectedCondition
* @return {?}
*/
function (id, value, selectedCondition) {
var /** @type {?} */ choiceElement = new NumericElement();
choiceElement.elementId = id;
choiceElement.selectedValue = value;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = id;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = value;
this.returnNumericElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} element
* @param {?} selectedCondition
* @return {?}
*/
AssistNumericElementComponent.prototype.choiceSelected = /**
* @param {?} element
* @param {?} selectedCondition
* @return {?}
*/
function (element, selectedCondition) {
var /** @type {?} */ choiceElement = new NumericElement();
choiceElement.elementId = element.id;
choiceElement.selectedValue = element.value;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = element.id;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = element.value;
this.returnNumericElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} event
* @return {?}
*/
AssistNumericElementComponent.prototype.onlyIntegerKey = /**
* @param {?} event
* @return {?}
*/
function (event) {
return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
};
/**
* @return {?}
*/
AssistNumericElementComponent.prototype.createNumericElementForm = /**
* @return {?}
*/
function () {
this.numericElementForm = this.formBuilder.group({
numericElement: ['', forms.Validators.compose([forms.Validators.required, forms.Validators.min(+this.numericDataElement.minimum), forms.Validators.max(+this.numericDataElement.maximum)])],
});
};
/**
* @return {?}
*/
AssistNumericElementComponent.prototype.UpdateFormValidator = /**
* @return {?}
*/
function () {
this.numericElementForm.controls['numericElement'].setValidators([forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.numericDataElement.minimum), forms.Validators.max(+this.numericDataElement.maximum)])]);
this.numericElementForm.controls['numericElement'].updateValueAndValidity();
};
AssistNumericElementComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-numeric-element',
template: "<form [formGroup]=\"numericElementForm\" novalidate>\n <div class=\"form-group\">\n <div class=\"col-sm-5 text-right\">\n <label class=\"control-label break-word\">\n {{numericDataElement.label}}\n <span *ngIf=\"numericDataElement.unit != undefined && numericDataElement.unit != ''\"> ({{numericDataElement.unit}})</span>\n </label>\n <ng-container *ngIf=\"numericDataElement.hint !== '' && numericDataElement.hint !== undefined\">\n <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{numericDataElement.hint}}\"></i>\n </ng-container>\n <ng-container *ngIf=\"numericDataElement.diagrams != undefined \">\n <acr-hint-diagram [dataElement]=\"numericDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n </ng-container>\n <ng-container *ngIf=\"this.numericDataElement.isRequired\">\n <span *ngIf=\"numericElementForm.controls['numericElement'].invalid\">\n <span *ngIf=\"numericElementForm.controls['numericElement'].errors.required\" class=\"required-field\" title=\"Required Field\">\n *\n </span>\n </span>\n </ng-container>\n <span *ngIf=\"numericElementForm.controls['numericElement'].invalid && numericElementForm.controls['numericElement'].errors.min\"\n class=\"required-field\" title=\" Minimum value is {{numericDataElement.minimum}}\">\n *\n </span> \n <span *ngIf=\"numericElementForm.controls['numericElement'].invalid && numericElementForm.controls['numericElement'].errors.max\"\n class=\"required-field\" title=\" Maximum value is {{numericDataElement.maximum}}\">\n *\n </span>\n </div>\n <ng-container *ngIf=\"numericDataElement.dataElementType === 'NumericDataElement'\">\n <div class=\"col-sm-7\">\n <input [attr.disabled]=\"numericDataElement.isEditable == false ? 'disabled' : null\" acrNumericOnly [(ngModel)]=\"numberValue\" id=\"{{numericDataElement.id}}\" type=\"text\" class=\"form-control\" formControlName=\"numericElement\"\n onpaste=\"return false;\" (input)=\"choiceSelected($event.target, numericDataElement.label)\"\n min=\"{{numericDataElement.minimum}}\" max=\"{{numericDataElement.maximum}}\" required> \n </div>\n </ng-container>\n <ng-container *ngIf=\"numericDataElement.dataElementType === 'IntegerDataElement'\">\n <div class=\"col-sm-7\">\n <input [attr.disabled]=\"numericDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"numberValue\" id=\"{{numericDataElement.id}}\" type=\"text\" class=\"form-control\" formControlName=\"numericElement\"\n (keypress)=\"onlyIntegerKey($event)\" onpaste=\"return false;\" (input)=\"choiceSelected($event.target, numericDataElement.label)\"\n min=\"{{numericDataElement.minimum}}\" max=\"{{numericDataElement.maximum}}\" required>\n </div>\n </ng-container>\n </div>\n</form>\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 */
AssistNumericElementComponent.ctorParameters = function () {
return [
{ type: forms.FormBuilder },
{ type: SimulatorEngineService },
{ type: SimulatorCommunicationService }
];
};
AssistNumericElementComponent.propDecorators = {
numericDataElement: [{ type: core.Input }],
imagePath: [{ type: core.Input }],
returnNumericElement: [{ type: core.Output }]
};
return AssistNumericElementComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$2 = require('jquery');
var AssistChoiceElementComponent = (function () {
function AssistChoiceElementComponent(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnChoiceElement = new core.EventEmitter();
this.choiceChange = new core.EventEmitter();
}
/**
* @return {?}
*/
AssistChoiceElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createChoiceElementForm();
};
/**
* @return {?}
*/
AssistChoiceElementComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
$$2('#div_' + this.choiceDataElement.id + '_other').hide();
if (this.choiceDataElement.currentValue !== undefined) {
$$2('#' + 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: ['', forms.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') {
$$2('#div_' + elementId + '_other').show();
}
else {
$$2('#div_' + elementId + '_other').hide();
$$2('#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: core.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: forms.FormBuilder },
{ type: SimulatorEngineService }
];
};
AssistChoiceElementComponent.propDecorators = {
choiceDataElement: [{ type: core.Input }],
imagePath: [{ type: core.Input }],
returnChoiceElement: [{ type: core.Output }],
choiceChange: [{ type: core.Output }],
disabled: [{ type: core.Input }]
};
return AssistChoiceElementComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$3 = require('jquery');
var AssistMultiChoiceElementComponent = (function () {
function AssistMultiChoiceElementComponent(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.returnMultiChoice = new core.EventEmitter();
this.multiElements = [];
this.multiChoiceValues = [];
this.multiChoiceComaprisonValues = [];
this.choiceValue = [];
}
/**
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createMultiChoiceElementForm();
};
/**
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.multiChoiceElement.currentValue !== undefined) {
var /** @type {?} */ values = [];
var /** @type {?} */ labels = [];
for (var /** @type {?} */ choice in this.multiChoiceElement.choiceInfo) {
if (Array.isArray(this.multiChoiceElement.currentValue)) {
try {
for (var _a = __values(this.multiChoiceElement.currentValue), _b = _a.next(); !_b.done; _b = _a.next()) {
var currValue = _b.value;
if (currValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
this.choiceValue = this.multiChoiceElement.currentValue;
$$3('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.choiceInfo[choice].value).prop('checked', true);
values.push(currValue);
labels.push(this.multiChoiceElement.choiceInfo[choice].label);
break;
}
}
}
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;
}
}
}
else {
if (this.multiChoiceElement.currentValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
this.choiceValue = this.multiChoiceElement.currentValue;
$$3('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.currentValue).prop('checked', true);
values.push(this.multiChoiceElement.currentValue);
labels.push(this.multiChoiceElement.choiceInfo[choice].label);
}
}
}
this.selectedMultiChoice(this.multiChoiceElement.id, this.multiChoiceElement.label, values, labels);
}
else {
this.returnMultiChoice.emit(undefined);
}
var e_1, _c;
};
/**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} choiceValue
* @param {?} choiceLabel
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.selectedMultiChoice = /**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} choiceValue
* @param {?} choiceLabel
* @return {?}
*/
function (elementId, selectedCondition, choiceValue, choiceLabel) {
var /** @type {?} */ multiElement = new MultiChoiceElement();
if ($$3('#' + elementId + '_' + choiceValue).is(':checked')) {
this.multiChoiceValues = choiceLabel;
this.multiChoiceComaprisonValues = choiceValue;
}
else {
var /** @type {?} */ index = this.multiChoiceValues.indexOf(choiceLabel);
var /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(choiceValue);
if (index > -1) {
this.multiChoiceValues.splice(index, 1);
}
if (comparisonIndex > -1) {
this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
}
}
multiElement.elementId = elementId;
multiElement.selectedValues = this.multiChoiceValues;
multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = this.multiChoiceValues;
this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
};
/**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} value
* @param {?} event
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.updateMultiChoice = /**
* @param {?} elementId
* @param {?} selectedCondition
* @param {?} value
* @param {?} event
* @return {?}
*/
function (elementId, selectedCondition, value, event) {
var /** @type {?} */ multiElement = new MultiChoiceElement();
if (event.currentTarget.checked) {
this.multiChoiceValues.push(value);
this.multiChoiceComaprisonValues.push(event.currentTarget.value);
}
else {
var /** @type {?} */ index = this.multiChoiceValues.indexOf(value);
var /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(event.currentTarget.value);
if (index > -1) {
this.multiChoiceValues.splice(index, 1);
}
if (comparisonIndex > -1) {
this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
}
}
multiElement.elementId = elementId;
multiElement.selectedValues = this.multiChoiceValues;
multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
this.selectedCondition = new SelectedCondition();
this.selectedCondition.selectedConditionId = elementId;
this.selectedCondition.selectedCondition = selectedCondition;
this.selectedCondition.selectedValue = this.multiChoiceValues;
this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
};
/**
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.createMultiChoiceElementForm = /**
* @return {?}
*/
function () {
this.multiChoiceElementForm = this.formBuilder.group({
multiCheckBox: ['', forms.Validators.required],
}, {
validator: this.specificValueInsideRange('multiCheckBox')
});
};
/**
* @param {?} checkBoxKey
* @return {?}
*/
AssistMultiChoiceElementComponent.prototype.specificValueInsideRange = /**
* @param {?} checkBoxKey
* @return {?}
*/
function (checkBoxKey) {
var _this = this;
return function (group) {
var /** @type {?} */ choiceControl = group.controls[checkBoxKey];
if (_this.multiChoiceElement.isRequired) {
return choiceControl.setErrors({ notEquivalent: true });
}
else {
return choiceControl.setErrors(null);
}
};
};
AssistMultiChoiceElementComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-multi-choice-element',
template: "<form [formGroup]=\"multiChoiceElementForm\" novalidate>\n <div class=\"form-group\">\n <div class=\"col-sm-5 text-right\">\n <label class=\"control-label break-word\">{{multiChoiceElement.label}} <span *ngIf=\"multiChoiceElement.unit != undefined && multiChoiceElement.unit != ''\"> ({{multiChoiceElement.unit}})</span>\n </label>\n <ng-container *ngIf=\"multiChoiceElement.hint !== '' && multiChoiceElement.hint !== undefined\">\n <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{multiChoiceElement.hint}}\"></i>\n </ng-container>\n <ng-container *ngIf=\"multiChoiceElement.diagrams != undefined \">\n <acr-hint-diagram [dataElement]=\"multiChoiceElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n </ng-container>\n <ng-container *ngIf=\"multiChoiceElement.isRequired\">\n <span *ngIf=\"multiChoiceElementForm.controls['multiCheckBox'].invalid && !multiChoiceValues.length\" class=\"required-field\"\n title=\"Required Field\">\n *\n </span>\n </ng-container>\n </div>\n <div class=\"col-sm-7\" [ngClass]=\"multiChoiceElement.isEditable == false ? 'disabled-element' : ''\">\n <div *ngFor=\"let choice of multiChoiceElement.choiceInfo\" class=\"checkbox checkboxCustomized\" title=\"{{choice.hint}}\">\n <label [hidden]=\"multiChoiceElement.ChoiceNotRelevant != undefined ? \n multiChoiceElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null\n : null\">\n <input type=\"checkbox\" id=\"{{multiChoiceElement.id}}_{{choice.value}}\" [checked]=\"false\" formControlName=\"multiCheckBox\"\n value=\"{{choice.value}}\" (change)=\"updateMultiChoice(multiChoiceElement.id, multiChoiceElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, $event)\">\n {{choice.label}}\n </label>\n </div>\n </div>\n </div>\n</form>",
styles: [".checkboxCustomized{min-height:0!important;padding-top:0!important}.disabled-element{cursor:not-allowed}.disabled-element:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}", ".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 */
AssistMultiChoiceElementComponent.ctorParameters = function () {
return [
{ type: forms.FormBuilder },
{ type: SimulatorEngineService }
];
};
AssistMultiChoiceElementComponent.propDecorators = {
multiChoiceElement: [{ type: core.Input }],
imagePath: [{ type: core.Input }],
returnMultiChoice: [{ type: core.Output }]
};
return AssistMultiChoiceElementComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ImageMapComponent = (function () {
function ImageMapComponent(domSanitizer) {
this.$ = require('jquery');
this.DataElements = {};
this.FormValues = {};
this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
this.imageExist = true;
this.SelectionValue = '';
this.domSanitizer = domSanitizer;
}
/**
* @return {?}
*/
ImageMapComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.DataElement === undefined) {
return;
}
this.displayValue('');
};
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInRectangle = /**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
function (mouseX, mouseY, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
if (COArray[0] < mouseX
&& (COArray[0] + COArray[2]) > mouseX
&& COArray[1] < mouseY
&& (COArray[1] + COArray[3]) > mouseY) {
return true;
}
return false;
};
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInCircle = /**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
function (mouseX, mouseY, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
if (Math.sqrt(Math.pow((mouseX - COArray[0]), 2) + Math.pow((mouseY - COArray[1]), 2)) < COArray[2]) {
return true;
}
else {
return false;
}
};
/**
* @param {?} x
* @param {?} y
* @param {?} Coordinates
* @return {?}
*/
ImageMapComponent.prototype.isInPolygon = /**
* @param {?} x
* @param {?} y
* @param {?} Coordinates
* @return {?}
*/
function (x, y, Coordinates) {
var /** @type {?} */ COArray = Coordinates.split(',');
var /** @type {?} */ vs = [];
for (var /** @type {?} */ i = 0; i < COArray.length; i++) {
var /** @type {?} */ point = [];
point.push(COArray[i]);
point.push(COArray[i + 1]);
i += 1;
vs.push(point);
}
var /** @type {?} */ inside = false;
for (var /** @type {?} */ i = 0, /** @type {?} */ j = vs.length - 1; i < vs.length; j = i++) {
var /** @type {?} */ xi = vs[i][0], /** @type {?} */ yi = vs[i][1];
var /** @type {?} */ xj = vs[j][0], /** @type {?} */ yj = vs[j][1];
var /** @type {?} */ intersect = ((yi > y) !== (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) {
inside = !inside;
}
}
return inside;
};
/**
* @param {?} e
* @param {?} dataElement
* @return {?}
*/
ImageMapComponent.prototype.imageClick = /**
* @param {?} e
* @param {?} dataElement
* @return {?}
*/
function (e, dataElement) {
var /** @type {?} */ O_height = dataElement.ImageProp.height;
var /** @type {?} */ O_width = dataElement.ImageProp.width;
var /** @type {?} */ $elem = this.$(e.target);
var /** @type {?} */ N_height = $elem.height();
var /** @type {?} */ N_width = $elem.width();
var /** @type {?} */ offset = $elem.offset();
var /** @type {?} */ offset_t = offset.top - this.$(window).scrollTop();
var /** @type {?} */ offset_l = offset.left - this.$(window).scrollLeft();
var /** @type {?} */ x = e.clientX - offset_l;
var /** @type {?} */ y = e.clientY - offset_t;
try {
for (var _a = __values(dataElement.ImageOptions), _b = _a.next(); !_b.done; _b = _a.next()) {
var opt = _b.value;
if (opt.Shape === 'rect') {
if (this.isInRectangle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'circle') {
if (this.isInCircle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'poly') {
if (this.isInPolygon(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
}
}
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;
}
}
var e_1, _c;
};
/**
* @param {?} val
* @return {?}
*/
ImageMapComponent.prototype.setValue = /**
* @param {?} val
* @return {?}
*/
function (val) {
try {
for (var _a = __values(this.DataElement.choiceInfo), _b = _a.next(); !_b.done; _b = _a.next()) {
var optValue = _b.value;
if (this.DataElement.choiceInfo.length <= 5 && this.DataElement.choiceInfo.length > 0) {
if (optValue.value === val) {
this.$('#' + val + '_' + this.DataElement.id).prop('checked', true);
var /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + val + '_' + this.DataElement.id)[0].dispatchEvent(customEvent);
}
else {
this.$('#' + optValue.value + '_' + this.DataElement.id).prop('checked', false);
}
}
else {
if (optValue.value === val) {
this.$('#' + this.DataElement.id).val(optValue.value);
var /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + this.DataElement.id)[0].dispatchEvent(customEvent);
break;
}
}
}
}
catch (e_2_1) {
e_2 = { error: e_2_1 };
}
finally {
try {
if (_b && !_b.done && (_c = _a.return))
_c.call(_a);
}
finally {
if (e_2)
throw e_2.error;
}
}
this.DataElement.currentValue = val;
// this.FormValues[this.DataElement.id] = val;
var e_2, _c;
};
/**
* @param {?} val
* @return {?}
*/
ImageMapComponent.prototype.displayValue = /**
* @param {?} val
* @return {?}
*/
function (val) {
if (val === '') {
this.SelectionValue = 'Image Map Diagram';
}
else {
this.SelectionValue = 'Selected Value : ' + val;
}
};
/**
* @param {?} location
* @return {?}
*/
ImageMapComponent.prototype.getImageDataUrl = /**
* @param {?} location
* @return {?}
*/
function (location) {
var /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
if (isDataURL) {
location = location.replace('unsafe:', '');
return location;
}
else {
return this.imagePath + '/' + location;
}
};
ImageMapComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-image-map',
template: "<div class=\"col-sm-8\">\n <label class=\"control-label font-weight-400\">Not sure? try out this image </label>\n <button type=\"button\" class=\"btn btn-default\" data-toggle=\"modal\" attr.data-target=\"#{{'imgMap_Modal_'+DataElement.id}}\">\n <span class=\"glyphicon glyphicon-picture\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Image Map\"></span>\n </button>\n</div>\n<ng-container *ngIf=\"imagePath != undefined\">\n <div class=\"modal inmodal fade\" id=\"{{'imgMap_Modal_'+DataElement.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n <span aria-hidden=\"true\">×</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <h4 class=\"modal-title\"> {{SelectionValue}}</h4>\n </div>\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <ng-container *ngIf=\"imageExist == true\">\n <img class=\"ImgOption danger img-responsive max-w-h-100\" alt=\"{{ DataElement.imageMap.label }}\" data-dismiss=\"modal\" attr.id=\"{{'imgMap_Img_'+DataElement.id}}\"\n (click)=\"imageClick($event,DataElement);\" attr.data-elementID=\"{{DataElement.id}}\" attr.usemap=\"#{{'imgMap_'+DataElement.id}}\"\n [src]=\"domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(DataElement.imageMap.location))\">\n <map name=\"{{'imgMap_'+DataElement.id}}\">\n <ng-container *ngFor=\"let imgOpt of DataElement.imageMap.map.areas\">\n <area attr.shape=\"{{imgOpt.shape}}\" attr.imgID=\"{{'imgMap_Img_'+DataElement.id}}\" attr.coords=\"{{imgOpt.coords}}\"\n attr.alt=\"{{imgOpt.choiceValue}}\" (mouseover)='displayValue(imgOpt.choiceValue);' (mouseout)='displayValue(\"\");'\n (click)=\"setValue(imgOpt.choiceValue);\" data-dismiss=\"modal\">\n </ng-container>\n </map>\n </ng-container>\n <ng-container *ngIf=\"imageExist == false\">\n <div class=\"\">\n No Image Map Available...\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\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 */
ImageMapComponent.ctorParameters = function () {
return [
{ type: platformBrowser.DomSanitizer }
];
};
ImageMapComponent.propDecorators = {
DataElement: [{ type: core.Input }],
DataElements: [{ type: core.Input }],
FormValues: [{ type: core.Input }],
imagePath: [{ type: core.Input }]
};
return ImageMapComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ComputedDataElement = (function (_super) {
__extends(ComputedDataElement, _super);
function ComputedDataElement() {
return _super !== null && _super.apply(this, arguments) || this;
}
return ComputedDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ComputedDataElementCreationService = (function (_super) {
__extends(ComputedDataElementCreationService, _super);
function ComputedDataElementCreationService(diagramService, arrayCheckerService, computedValueCreationService, decisionPointsCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.arrayCheckerService = arrayCheckerService;
_this.computedValueCreationService = computedValueCreationService;
_this.decisionPointsCreationService = decisionPointsCreationService;
_this.elementType = 'ComputedDataElement';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
ComputedDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new ComputedDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
dataElement.computeValue = this.computedValueCreationService.createComputedValue(data);
if (data.DecisionPoint) {
dataElement.decisionPoints = this.decisionPointsCreationService.createDecisionPoints(data.DecisionPoint);
}
return dataElement;
};
ComputedDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
ComputedDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ArrayCheckerService },
{ type: ComputedValueCreationService },
{ type: DecisionPointsCreationService }
];
};
return ComputedDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$4 = require('jquery');
var AssistReportTextComponent = (function () {
function AssistReportTextComponent() {
this.allReportTexts = [];
this.sections = [];
setInterval(function () {
}, 1000);
}
/**
* @param {?} changes
* @return {?}
*/
AssistReportTextComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.mainReportTexts = new MainReportText();
this.onSelect(this.selectedSectionId);
};
/**
* @param {?} sectionId
* @return {?}
*/
AssistReportTextComponent.prototype.onSelect = /**
* @param {?} sectionId
* @return {?}
*/
function (sectionId) {
// console.log(this.reportText.allReportText);
this.selectedSectionId = sectionId;
this.sections = [];
this.selectedSection = null;
for (var /** @type {?} */ section in this.reportText.allReportText) {
if (this.reportText.allReportText[section].reportText !== '') {
this.sections.push(section);
}
}
if (sectionId === 'undefined' || sectionId === undefined || sectionId === 'All') {
this.allTextReport = [];
for (var /** @type {?} */ section in this.reportText.allReportText) {
if (this.reportText.allReportText[section].reportText !== '') {
var /** @type {?} */ textReport = new AllTextReport();
textReport.heading = section;
textReport.content = this.removeEmptyLine(this.reportText.allReportText[section].reportText);
this.allTextReport.push(textReport);
}
}
this.selectedSectionId = 'All';
}
for (var /** @type {?} */ section in this.reportText.allReportText) {
if (this.reportText.allReportText[section].sectionId === sectionId) {
this.selectedSection = this.reportText.allReportText[section].reportText;
this.selectedSection = this.reportText.reportTextMainContent + ((this.selectedSection !== undefined && this.selectedSection !== '') ? this.removeEmptyLine(this.selectedSection) : '');
break;
}
}
this.mainReportTexts = new MainReportText();
this.allReportTexts = [];
for (var /** @type {?} */ section in this.reportText.allReportText) {
var /** @type {?} */ allreportText = new AllReportText();
allreportText.reportText = this.removeEmptyLine(this.reportText.allReportText[section].reportText);
allreportText.sectionId = this.reportText.allReportText[section].sectionId;
this.allReportTexts.push(allreportText);
}
this.mainReportTexts.allReportText = this.allReportTexts;
this.mainReportTexts.reportTextMainContent = this.reportText.reportTextMainContent;
};
/**
* @param {?} inputText
* @return {?}
*/
AssistReportTextComponent.prototype.removeEmptyLine = /**
* @param {?} inputText
* @return {?}
*/
function (inputText) {
if (inputText.trim().length !== 0) {
var /** @type {?} */ lines = inputText.split('\n');
var /** @type {?} */ uniquelines_1 = [];
lines.forEach(function (line, i) {
if (line.trim().length !== 0) {
uniquelines_1.push(line);
}
});
return uniquelines_1.join('\n');
}
};
AssistReportTextComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-report-text',
template: "<ng-container *ngFor=\"let textReport of allTextReport; let lastitem = last\">\n <dt class=\"text-capitalize\">{{textReport.heading}}</dt>\n <dd>\n <p class=\"white-space-line\" [innerHTML]=\"textReport.content\"></p>\n </dd>\n <hr *ngIf=\"!lastitem\">\n</ng-container>\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 */
AssistReportTextComponent.ctorParameters = function () { return []; };
AssistReportTextComponent.propDecorators = {
reportText: [{ type: core.Input }]
};
return AssistReportTextComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DynamicHeightDirective = (function () {
function DynamicHeightDirective(dynamicElement) {
this.dynamicElement = dynamicElement;
}
/**
* @return {?}
*/
DynamicHeightDirective.prototype.ngAfterViewChecked = /**
* @return {?}
*/
function () {
if (this.dynamicElement !== undefined) {
if (this.simulatorElement !== undefined) {
this.setDynamicHeightForSimualtorDiv(this.simulatorElement);
}
else if (this.carouselElement !== undefined) {
this.setDynamicHeightForCarouselDiv(this.carouselElement);
}
}
};
/**
* @param {?} simulatorElement
* @return {?}
*/
DynamicHeightDirective.prototype.setDynamicHeightForSimualtorDiv = /**
* @param {?} simulatorElement
* @return {?}
*/
function (simulatorElement) {
var /** @type {?} */ simulatorResultsBlockHeight = simulatorElement.offsetHeight;
this.dynamicElement.nativeElement.style.height = (window.innerHeight - 100) - simulatorResultsBlockHeight + 'px';
};
/**
* @param {?} carouselElement
* @return {?}
*/
DynamicHeightDirective.prototype.setDynamicHeightForCarouselDiv = /**
* @param {?} carouselElement
* @return {?}
*/
function (carouselElement) {
var /** @type {?} */ simulatorResultsBlockHeight = carouselElement.offsetHeight;
this.dynamicElement.nativeElement.style.height = (window.innerHeight - 200) - simulatorResultsBlockHeight + 'px';
};
DynamicHeightDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[acrDynamicHeightDirective]'
},] },
];
/** @nocollapse */
DynamicHeightDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
DynamicHeightDirective.propDecorators = {
simulatorElement: [{ type: core.Input }],
carouselElement: [{ type: core.Input }]
};
return DynamicHeightDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NumericOnlyDirective = (function () {
function NumericOnlyDirective(el) {
this.el = el;
this.regex = new RegExp(/^(?:[0-9]{0,3}(?:\.[0-9]{0,2})?)?$/);
this.specialKeys = ['Backspace', 'Tab', 'End', 'Home', 'ArrowLeft', 'ArrowRight'];
}
/**
* @param {?} event
* @return {?}
*/
NumericOnlyDirective.prototype.onKeyDown = /**
* @param {?} event
* @return {?}
*/
function (event) {
// Allow Backspace, tab, end, and home keys
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
var /** @type {?} */ current = this.el.nativeElement.value;
var /** @type {?} */ next = current.concat(event.key);
var /** @type {?} */ value = +next;
if (next && (next === '.' || value > 100.00 || !String(next).match(this.regex))) {
event.preventDefault();
}
};
NumericOnlyDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[acrNumericOnly]'
},] },
];
/** @nocollapse */
NumericOnlyDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
NumericOnlyDirective.propDecorators = {
onKeyDown: [{ type: core.HostListener, args: ['keydown', ['$event'],] }]
};
return NumericOnlyDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DateTimeDataElement = (function (_super) {
__extends(DateTimeDataElement, _super);
function DateTimeDataElement() {
return _super !== null && _super.apply(this, arguments) || this;
}
return DateTimeDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DateTimeDataElementCreationService = (function (_super) {
__extends(DateTimeDataElementCreationService, _super);
function DateTimeDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.conditionsCreationService = conditionsCreationService;
_this.computedValueCreationService = computedValueCreationService;
_this.elementType = 'DateTimeDataElement';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
DateTimeDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new DateTimeDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
if (ConditionalProperties !== undefined) {
var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
if (data.ConditionalProperties !== undefined) {
dataElement.conditionalProperties = new Array();
if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
try {
for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
var conditionalProperty = _b.value;
dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
}
}
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;
}
}
}
else {
dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
}
}
}
return dataElement;
var e_1, _c;
};
/**
* @param {?} conditionalProperty
* @return {?}
*/
DateTimeDataElementCreationService.prototype.GetConditionalProperties = /**
* @param {?} conditionalProperty
* @return {?}
*/
function (conditionalProperty) {
var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
_conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
// var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
if (this.conditionsCreationService.isComposite(conditionalProperty)) {
_conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
}
_conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
_conditionalProperty.isRequired = conditionalProperty.IsRequired;
_conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
return _conditionalProperty;
};
DateTimeDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
DateTimeDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return DateTimeDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AssistDateTimeElementComponent = (function () {
function AssistDateTimeElementComponent(formBuilder, simulatorEngineService) {
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.date = new Date();
this.settings = {
bigBanner: true,
format: 'dd-MMM-yyyy hh:mm a',
defaultOpen: false,
timePicker: true,
closeOnSelect: true,
};
}
/**
* @return {?}
*/
AssistDateTimeElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createDateTimeElementForm();
};
/**
* @return {?}
*/
AssistDateTimeElementComponent.prototype.onDateSelect = /**
* @return {?}
*/
function () {
// alert();
};
/**
* @return {?}
*/
AssistDateTimeElementComponent.prototype.createDateTimeElementForm = /**
* @return {?}
*/
function () {
this.dateTimeElementForm = this.formBuilder.group({
dateTimeElement: ['', forms.Validators.compose([forms.Validators.required, forms.Validators.min(+0), forms.Validators.max(+1)])],
});
};
AssistDateTimeElementComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-date-time-element',
template: "<form [formGroup]=\"dateTimeElementForm\" novalidate *ngIf=\"dateTimeDataElement.isVisible\">\n <div class=\"form-group\">\n <div class=\"col-sm-5 text-right\">\n <label class=\"control-label break-word\">\n <!-- {{dateTimeDataElement | json}} -->\n {{dateTimeDataElement.label}}\n <span *ngIf=\"dateTimeDataElement.unit != undefined && dateTimeDataElement.unit != ''\"> ({{dateTimeDataElement.unit}})</span>\n </label>\n <ng-container *ngIf=\"dateTimeDataElement.hint !== '' && dateTimeDataElement.hint !== undefined\">\n <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{dateTimeDataElement.hint}}\"></i>\n </ng-container>\n <!-- <ng-container *ngIf=\"dateTimeDataElement.diagrams != undefined \">\n <acr-hint-diagram [dataElement]=\"dateTimeDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n </ng-container> -->\n <ng-container *ngIf=\"this.dateTimeDataElement.isRequired\">\n <span *ngIf=\"dateTimeElementForm.controls['dateTimeElement'].invalid\">\n <span *ngIf=\"dateTimeElementForm.controls['dateTimeElement'].errors.required\" class=\"required-field\" title=\"Required Field\">\n *\n </span>\n </span>\n </ng-container>\n </div>\n <div class=\"col-sm-7\"> \n <div [ngClass]=\"dateTimeDataElement.isEditable == false ? 'disabled-picker' : ''\">\n <angular2-date-picker formControlName=\"dateTimeElement\" [(ngModel)]=\"date\" [settings]=\"settings\"></angular2-date-picker>\n </div> \n </div>\n </div>\n</form>\n",
styles: [".dec-btn[_ngcontent-c13],.inc-btn[_ngcontent-c13],.ng-scope.wc-time-sec.wc-time-sec[_ngcontent-c13]{cursor:pointer}.wc-date-container[_ngcontent-c13],.wc-date-container[_ngcontent-c13]>span[_ngcontent-c13]{color:#000!important}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}.required-field{color:red}"]
},] },
];
/** @nocollapse */
AssistDateTimeElementComponent.ctorParameters = function () {
return [
{ type: forms.FormBuilder },
{ type: SimulatorEngineService }
];
};
AssistDateTimeElementComponent.propDecorators = {
dateTimeDataElement: [{ type: core.Input }]
};
return AssistDateTimeElementComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AssistDurationElementComponent = (function () {
function AssistDurationElementComponent(formBuilder, simulatorEngineService, simulatorCommunicationService) {
var _this = this;
this.formBuilder = formBuilder;
this.simulatorEngineService = simulatorEngineService;
this.supportedUnits = {
millisecond: {
'label': 'Millisecond',
'max': 999,
'min': 0,
'value': 0,
'step': 1
},
second: {
'label': 'Second',
'max': 59,
'min': 0,
'value': 0,
'step': 1
},
minute: {
'label': 'Minutes',
'max': 59,
'min': 0,
'value': 0,
'step': 1
},
hour: {
'label': 'Hours',
'max': 23,
'min': 0,
'value': 0,
'step': 1
},
day: {
'label': 'Days',
'max': 7,
'min': 0,
'value': 0,
'step': 1
},
week: {
'label': 'Week',
'max': 51,
'min': 0,
'value': 0,
'step': 1
}
};
this.daysvalue = 0;
this.hoursvalue = 0;
this.minutesvalue = 0;
this.DurationVal = 'PT0S';
this.durationOptions = {
showNegative: false,
showPreview: false,
showYears: false,
showMonths: false,
showWeeks: false,
min: 0
};
this.showdayminValidation = false;
this.showdaymaxValidation = false;
this.showminutemaxValidation = false;
this.showminuteminValidation = false;
this.showhourminValidation = false;
this.showhourmaxValidation = false;
this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(function (mission) {
_this.SetRangeValuesForDurationPicker();
_this.UpdateFormValidator();
});
}
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.SetRangeValuesForDurationPicker();
this.createDurationElementForm();
this.onChanges();
};
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.ResetValidationVisibility = /**
* @return {?}
*/
function () {
this.showdayminValidation = false;
this.showdaymaxValidation = false;
this.showminutemaxValidation = false;
this.showminuteminValidation = false;
this.showhourminValidation = false;
this.showhourmaxValidation = false;
};
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.onChanges = /**
* @return {?}
*/
function () {
var _this = this;
this.durationElementForm.statusChanges
.subscribe(function (val) {
_this.ResetValidationVisibility();
if (_this.durationElementForm.controls['durationdayselement'].invalid
&& _this.durationElementForm.controls['durationdayselement'].errors["max"]) {
_this.showdaymaxValidation = true;
}
else if (_this.durationElementForm.controls['durationdayselement'].invalid
&& _this.durationElementForm.controls['durationdayselement'].errors["min"]) {
_this.showdayminValidation = true;
}
else if (_this.durationElementForm.controls['durationminuteselement'].invalid
&& _this.durationElementForm.controls['durationminuteselement'].errors["min"]) {
_this.showminuteminValidation = true;
}
else if (_this.durationElementForm.controls['durationminuteselement'].invalid
&& _this.durationElementForm.controls['durationminuteselement'].errors["max"]) {
_this.showminutemaxValidation = true;
}
else if (_this.durationElementForm.controls['durationhourselement'].invalid
&& _this.durationElementForm.controls['durationhourselement'].errors["min"]) {
_this.showhourminValidation = true;
}
else if (_this.durationElementForm.controls['durationhourselement'].invalid
&& _this.durationElementForm.controls['durationhourselement'].errors["max"]) {
_this.showhourmaxValidation = true;
}
});
};
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.SetRangeValuesForDurationPicker = /**
* @return {?}
*/
function () {
var /** @type {?} */ $element = this.durationDataElement;
this.supportedUnits['day'].min = $element.MinimumDay !== undefined && $element.MinimumDay != null ?
$element.MinimumDay : 0;
this.supportedUnits['hour'].min = $element.MinimumHours !== undefined && $element.MinimumHours != null ?
$element.MinimumHours : 0;
this.supportedUnits['minute'].min = $element.MinimumMinutes !== undefined && $element.MinimumMinutes != null ?
$element.MinimumMinutes : 0;
this.supportedUnits['day'].max = $element.MaximumDay !== undefined && $element.MaximumDay != null ?
$element.MaximumDay : 9007199254740991;
this.supportedUnits['hour'].max = $element.MaximumHours !== undefined && $element.MaximumHours != null ?
$element.MaximumHours : 9007199254740991;
this.supportedUnits['minute'].max = $element.MaxmimumMinutes !== undefined && $element.MaxmimumMinutes != null ?
$element.MaxmimumMinutes : 9007199254740991;
};
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.createDurationElementForm = /**
* @return {?}
*/
function () {
this.durationElementForm = this.formBuilder.group({
durationdayselement: ['', forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['day'].min), forms.Validators.max(+this.supportedUnits['day'].max)])],
durationminuteselement: ['', forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['minute'].min), forms.Validators.max(+this.supportedUnits['minute'].max)])],
durationhourselement: ['', forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['hour'].min), forms.Validators.max(+this.supportedUnits['hour'].max)])]
});
};
/**
* @param {?} event
* @return {?}
*/
AssistDurationElementComponent.prototype.onlyInteger = /**
* @param {?} event
* @return {?}
*/
function (event) {
return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
};
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.UpdateFormValidator = /**
* @return {?}
*/
function () {
this.durationElementForm.controls['durationdayselement'].setValidators([forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['day'].min), forms.Validators.max(+this.supportedUnits['day'].max)])]);
this.durationElementForm.controls['durationdayselement'].updateValueAndValidity();
this.durationElementForm.controls['durationminuteselement'].setValidators([forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['minute'].min), forms.Validators.max(+this.supportedUnits['minute'].max)])]);
this.durationElementForm.controls['durationminuteselement'].updateValueAndValidity();
this.durationElementForm.controls['durationhourselement'].setValidators([forms.Validators.compose([forms.Validators.required,
forms.Validators.min(+this.supportedUnits['hour'].min), forms.Validators.max(+this.supportedUnits['hour'].max)])]);
this.durationElementForm.controls['durationhourselement'].updateValueAndValidity();
};
/**
* @param {?} property
* @return {?}
*/
AssistDurationElementComponent.prototype.increaseValue = /**
* @param {?} property
* @return {?}
*/
function (property) {
var /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue === undefined || this.daysvalue == null ? 0 : this.daysvalue;
if (currentValue < this.supportedUnits['day'].max) {
currentValue = currentValue + this.supportedUnits['day'].step;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue === undefined || this.hoursvalue == null ? 0 : this.hoursvalue;
if (currentValue < this.supportedUnits['hour'].max) {
currentValue = currentValue + this.supportedUnits['hour'].step;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue === undefined || this.minutesvalue == null ? 0 : this.minutesvalue;
if (currentValue < this.supportedUnits['minute'].max) {
currentValue = currentValue + this.supportedUnits['minute'].step;
}
this.minutesvalue = currentValue;
break;
}
};
/**
* @param {?} property
* @return {?}
*/
AssistDurationElementComponent.prototype.decreaseValue = /**
* @param {?} property
* @return {?}
*/
function (property) {
var /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue;
if (currentValue > this.supportedUnits['day'].min) {
currentValue = currentValue - this.supportedUnits['day'].step;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue;
if (currentValue > this.supportedUnits['hour'].min) {
currentValue = currentValue - this.supportedUnits['hour'].step;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue;
if (currentValue > this.supportedUnits['minute'].min) {
currentValue = currentValue - this.supportedUnits['minute'].step;
}
this.minutesvalue = currentValue;
break;
}
};
/**
* @param {?} event
* @param {?} property
* @return {?}
*/
AssistDurationElementComponent.prototype.checkValue = /**
* @param {?} event
* @param {?} property
* @return {?}
*/
function (event, property) {
var /** @type {?} */ currentValue = 0;
switch (property) {
case 'days':
currentValue = this.daysvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.daysvalue = currentValue;
break;
case 'hour':
currentValue = this.hoursvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.hoursvalue = currentValue;
break;
case 'minute':
currentValue = this.minutesvalue;
if (currentValue === undefined || currentValue == null) {
currentValue = 0;
}
this.minutesvalue = currentValue;
break;
}
};
// tslint:disable-next-line:use-life-cycle-interface
/**
* @return {?}
*/
AssistDurationElementComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// prevent memory leak when component destroyed
this.subscription.unsubscribe();
};
AssistDurationElementComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-assist-duration-element',
template: "<form [formGroup]=\"durationElementForm\" novalidate>\n <div class=\"form-group\">\n <div class=\"col-sm-5 text-right\">\n <label class=\"control-label break-word\">\n <!-- {{dateTimeDataElement | json}} -->\n {{durationDataElement.label}}\n <span *ngIf=\"durationDataElement.unit != undefined && durationDataElement.unit != ''\">\n ({{durationDataElement.unit}})</span>\n </label>\n <ng-container *ngIf=\"durationDataElement.hint !== '' && durationDataElement.hint !== undefined\">\n <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{durationDataElement.hint}}\"></i>\n </ng-container>\n <!-- <ng-container *ngIf=\"durationDataElement.diagrams != undefined \">\n <acr-hint-diagram [dataElement]=\"durationDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n </ng-container> -->\n\n <!-- <ng-container *ngIf=\"this.durationDataElement.isRequired\"> \n <span *ngIf=\"DurationVal == 'PT0S' || DurationVal == null\" class=\"required-field\" title=\"Duration field should be non zero\">\n *\n </span>\n </ng-container> -->\n <ng-container *ngIf=\"this.durationDataElement.isRequired\n && (!showdayminValidation && !showdaymaxValidation && !showminuteminValidation\n && !showminutemaxValidation && !showhourminValidation && !showhourmaxValidation)\">\n <span *ngIf=\"durationElementForm.controls['durationdayselement'].invalid\n || durationElementForm.controls['durationminuteselement'].invalid\n || durationElementForm.controls['durationhourselement'].invalid\">\n <span *ngIf=\"durationElementForm.controls['durationdayselement'].errors != null && durationElementForm.controls['durationdayselement'].errors.required \n || durationElementForm.controls['durationminuteselement'].errors != null && durationElementForm.controls['durationminuteselement'].errors.required \n || durationElementForm.controls['durationhourselement'].errors != null && durationElementForm.controls['durationhourselement'].errors.required \"\n class=\"required-field\" title=\"Required Field\">\n *\n </span>\n </span>\n </ng-container> \n\n <span *ngIf=\"showdayminValidation\"\n class=\"required-field\" title=\" Minimum value for day is {{supportedUnits['day'].min}}\">\n *\n </span>\n \n <span *ngIf=\"showdaymaxValidation\"\n class=\"required-field\" title=\" Maximum value for day is {{supportedUnits['day'].max}}\">\n *\n </span>\n\n <span *ngIf=\"showminuteminValidation\"\n class=\"required-field\" title=\" Minimum value for minute is {{supportedUnits['minute'].min}}\">\n *\n </span>\n <span *ngIf=\"showminutemaxValidation\"\n class=\"required-field\" title=\" Maximum value for minute is {{supportedUnits['minute'].max}}\">\n *\n </span>\n\n <span *ngIf=\"showhourminValidation\"\n class=\"required-field\" title=\" Minimum value for hour is {{supportedUnits['hour'].min}}\">\n *\n </span>\n <span *ngIf=\"showhourmaxValidation\"\n class=\"required-field\" title=\" Maximum value for hour is {{supportedUnits['hour'].max}}\">\n *\n </span>\n </div>\n\n <div class=\"col-sm-7\" style=\"display:inline-flex\">\n <!-- <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n <ngx-duration-picker min=\"0\" formControlName=\"durationElement\" [options]=\"durationOptions\" [(value)]=\"DurationVal\"></ngx-duration-picker>\n </div> -->\n\n\n <!-- <div class=\"form-group\"> -->\n <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n <table>\n <tbody>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"increaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n +\n </button>\n </td>\n </tr> -->\n <tr class=\"text-center\">\n <td class=\"input-group input-group-sm\">\n <input tabindex=\"1\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n formControlName=\"durationdayselement\" [(ngModel)]=\"daysvalue\" class=\"form-control text-center txt-duration\"\n (blur)=\"checkValue($event, 'days')\" type=\"number\" min=\"{{supportedUnits['day'].min}}\" max=\"{{supportedUnits['day'].max}}\"\n (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['day'].label}}</span>\n </td>\n </tr>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"decreaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n -\n </button>\n </td>\n </tr> -->\n </tbody>\n </table>\n </div>\n\n <table style=\"margin-left:10px;\">\n <tbody>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"increaseValue('hour')\" class=\"btn btn-link btn-incrementer\">\n +\n </button>\n </td>\n </tr> -->\n <tr class=\"text-center\">\n <td class=\"input-group input-group-sm\">\n <input tabindex=\"2\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n formControlName=\"durationhourselement\" [(ngModel)]=\"hoursvalue\" class=\"form-control text-center txt-duration\"\n (blur)=\"checkValue($event,'hour')\" type=\"number\" min=\"{{supportedUnits['hour'].min}}\" max=\"{{supportedUnits['hour'].max}}\"\n (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['hour'].label}}</span>\n </td>\n </tr>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"decreaseValue('hour')\" class=\"btn btn-link btn-decrementer\">\n -\n </button>\n </td>\n </tr> -->\n </tbody>\n </table>\n\n <table style=\"margin-left:10px;\">\n <tbody>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"increaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n +\n </button>\n </td>\n </tr> -->\n <tr class=\"text-center\">\n <td class=\"input-group input-group-sm\">\n <input tabindex=\"3\" [(ngModel)]=\"minutesvalue\" formControlName=\"durationminuteselement\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n class=\"form-control text-center txt-duration\" (blur)=\"checkValue($event, 'minute')\" type=\"number\" min=\"{{supportedUnits['minute'].min}}\"\n max=\"{{supportedUnits['minute'].max}}\" (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['minute'].label}}</span>\n </td>\n </tr>\n <!-- <tr class=\"text-center\">\n <td>\n <button type=\"button\" (click)=\"decreaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n -\n </button>\n </td>\n </tr> -->\n </tbody>\n </table>\n\n <!-- </div> -->\n\n\n </div>\n </div>\n</form>",
styles: [".required-field{color:red}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{text-align:center}.btn-decrementer,.btn-incrementer{text-decoration:none;outline:0}.txt-duration{width:42px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:0!important;outline-offset:-2px}"]
},] },
];
/** @nocollapse */
AssistDurationElementComponent.ctorParameters = function () {
return [
{ type: forms.FormBuilder },
{ type: SimulatorEngineService },
{ type: SimulatorCommunicationService }
];
};
AssistDurationElementComponent.propDecorators = {
durationDataElement: [{ type: core.Input }]
};
return AssistDurationElementComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DurationDataElement = (function (_super) {
__extends(DurationDataElement, _super);
function DurationDataElement() {
return _super !== null && _super.apply(this, arguments) || this;
}
return DurationDataElement;
}(BaseDataElement));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DurationDataElementCreationService = (function (_super) {
__extends(DurationDataElementCreationService, _super);
function DurationDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
var _this = _super.call(this, diagramService) || this;
_this.conditionsCreationService = conditionsCreationService;
_this.computedValueCreationService = computedValueCreationService;
_this.elementType = 'DurationDataElement';
return _this;
}
/**
* @param {?} data
* @return {?}
*/
DurationDataElementCreationService.prototype.createElement = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ dataElement = new DurationDataElement();
_super.prototype.populateBasicData.call(this, data, dataElement);
dataElement.MinimumDay = data.MinimumDay;
dataElement.MaximumDay = data.MaximumDay;
dataElement.MinimumHours = data.MinimumHours;
dataElement.MaximumHours = data.MaximumHours;
dataElement.MinimumMinutes = data.MinimumMinutes;
dataElement.MaxmimumMinutes = data.MaxmimumMinutes;
dataElement.MinimumDayOverrider = data.MinimumDay;
dataElement.MaximumDayOverrider = data.MaximumDay;
dataElement.MinimumHoursOverrider = data.MinimumHours;
dataElement.MaximumHoursOverrider = data.MaximumHours;
dataElement.MinimumMinutesOverrider = data.MinimumMinutes;
dataElement.MaxmimumMinutesOverrider = data.MaxmimumMinutes;
var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
if (ConditionalProperties !== undefined) {
var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
if (data.ConditionalProperties !== undefined) {
dataElement.conditionalProperties = new Array();
if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
try {
for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
var conditionalProperty = _b.value;
dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
}
}
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;
}
}
}
else {
dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
}
}
}
return dataElement;
var e_1, _c;
};
/**
* @param {?} conditionalProperty
* @return {?}
*/
DurationDataElementCreationService.prototype.GetConditionalProperties = /**
* @param {?} conditionalProperty
* @return {?}
*/
function (conditionalProperty) {
var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
_conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
// var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
if (this.conditionsCreationService.isComposite(conditionalProperty)) {
_conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
}
_conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
_conditionalProperty.isRequired = conditionalProperty.IsRequired;
_conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
_conditionalProperty.MinimumDay = conditionalProperty.MinimumDay;
_conditionalProperty.MaximumDay = conditionalProperty.MaximumDay;
_conditionalProperty.MinimumHours = conditionalProperty.MinimumHours;
_conditionalProperty.MaximumHours = conditionalProperty.MaximumHours;
_conditionalProperty.MaxmimumMinutes = conditionalProperty.MaximumHours;
_conditionalProperty.MinimumMinutes = conditionalProperty.MinimumHours;
return _conditionalProperty;
};
DurationDataElementCreationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
DurationDataElementCreationService.ctorParameters = function () {
return [
{ type: DiagramService },
{ type: ConditionsCreationService },
{ type: ComputedValueCreationService }
];
};
return DurationDataElementCreationService;
}(DataElementCreationBaseService));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ components = [AcrAssistSimulatorComponent, AssistDataElementComponent, HintDiagramComponent, slide_component.SlideComponent, carousel_component.CarouselComponent,
AssistNumericElementComponent, AssistChoiceElementComponent, AssistMultiChoiceElementComponent,
ImageMapComponent, AssistReportTextComponent, DynamicHeightDirective, NumericOnlyDirective,
AssistDateTimeElementComponent, AssistDurationElementComponent];
var AcrAssistSimulatorModule = (function () {
function AcrAssistSimulatorModule() {
}
AcrAssistSimulatorModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule,
CoreModule,
forms.FormsModule,
forms.ReactiveFormsModule,
ngxDragScroll.DragScrollModule,
angular2Datetimepicker.AngularDateTimePickerModule,
ngxDurationPicker.DurationPickerModule
],
declarations: components,
providers: [TemplateManagerService,
DiagramService,
carousel_config.CarouselConfig,
ArrayCheckerService,
ConditionsCreationService,
DecisionPointsCreationService,
ComputedValueCreationService,
SimulatorEngineService,
SimulatorCommunicationService,
{ provide: CreationServiceInjectorToken, useClass: ChoiceDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: MultipleChoiceDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: NumericDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: IntegerDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: GlobalValueCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: ComputedDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: DateTimeDataElementCreationService, multi: true },
{ provide: CreationServiceInjectorToken, useClass: DurationDataElementCreationService, multi: true }
],
exports: components
},] },
];
return AcrAssistSimulatorModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @template T
*/
var /**
* @template T
*/ Dictionary = (function () {
function Dictionary() {
this.items = {};
this.count = 0;
}
/**
* @param {?} key
* @return {?}
*/
Dictionary.prototype.ContainsKey = /**
* @param {?} key
* @return {?}
*/
function (key) {
return this.items.hasOwnProperty(key);
};
/**
* @return {?}
*/
Dictionary.prototype.Count = /**
* @return {?}
*/
function () {
return this.count;
};
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
Dictionary.prototype.Add = /**
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
if (!this.items.hasOwnProperty(key)) {
this.count++;
}
this.items[key] = value;
};
/**
* @param {?} key
* @return {?}
*/
Dictionary.prototype.Remove = /**
* @param {?} key
* @return {?}
*/
function (key) {
var /** @type {?} */ val = this.items[key];
delete this.items[key];
this.count--;
return val;
};
/**
* @param {?} key
* @return {?}
*/
Dictionary.prototype.Item = /**
* @param {?} key
* @return {?}
*/
function (key) {
return this.items[key];
};
/**
* @return {?}
*/
Dictionary.prototype.Keys = /**
* @return {?}
*/
function () {
var /** @type {?} */ keySet = [];
for (var /** @type {?} */ prop in this.items) {
if (this.items.hasOwnProperty(prop)) {
keySet.push(prop);
}
}
return keySet;
};
/**
* @return {?}
*/
Dictionary.prototype.Values = /**
* @return {?}
*/
function () {
var /** @type {?} */ values = [];
for (var /** @type {?} */ prop in this.items) {
if (this.items.hasOwnProperty(prop)) {
values.push(this.items[prop]);
}
}
return values;
};
return Dictionary;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var GlobalsService = (function () {
function GlobalsService(http$$1) {
this.http = http$$1;
this.defaultModule = 'assets/XMLFIles/hello_assist/Hello_Assist.xml';
this.defaultTestModule = 'assets/XMLFIles/test_module/Test_Module.xml';
this.XMLList = new Dictionary();
}
/**
* @return {?}
*/
GlobalsService.prototype.getDefaultModulePath = /**
* @return {?}
*/
function () {
return this.http.get(this.defaultModule).map(function (res) { return res.text(); });
};
/**
* @return {?}
*/
GlobalsService.prototype.getDefaultTestModulePath = /**
* @return {?}
*/
function () {
return this.http.get(this.defaultTestModule).map(function (res) { return res.text(); });
};
GlobalsService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
GlobalsService.ctorParameters = function () {
return [
{ type: http.Http }
];
};
return GlobalsService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$5 = require('jquery');
var ViewUploadLoaderComponent = (function () {
function ViewUploadLoaderComponent(globalsService) {
this.onFileSelected = new core.EventEmitter();
this.globalsService = globalsService;
}
/**
* @param {?} fileDetails
* @return {?}
*/
ViewUploadLoaderComponent.prototype.onFileContentRead = /**
* @param {?} fileDetails
* @return {?}
*/
function (fileDetails) {
this.selectedXML = fileDetails;
if (this.globalsService.XMLList.ContainsKey(fileDetails.fileLabel)) {
this.globalsService.XMLList.Remove(fileDetails.fileLabel);
}
this.globalsService.XMLList.Add(fileDetails.fileLabel, fileDetails);
this.onFileSelected.emit(fileDetails);
};
/**
* @param {?} fileDetails
* @return {?}
*/
ViewUploadLoaderComponent.prototype.onFileClick = /**
* @param {?} fileDetails
* @return {?}
*/
function (fileDetails) {
this.selectedXML = fileDetails;
this.onFileSelected.emit(fileDetails);
$$5('#xmlOnlyMsg').hide();
};
ViewUploadLoaderComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-view-upload-loader',
template: "<ul class=\"sidebar-menu\" data-widget=\"tree\">\n <li class=\"header\">Want to try your assist module?</li>\n <li class=\"text-center\">\n <acr-file-upload-loader (onFileContentRead)=\"onFileContentRead($event)\"></acr-file-upload-loader>\n </li>\n <li [ngClass]=\"{'active':(selectedXML.fileLabel === file.fileLabel)}\" *ngFor=\"let file of globalsService.XMLList.Values().reverse()\"\n class=\"treeview\">\n <a href=\"#\" (click)=\"onFileClick(file)\">\n <i class=\"fa fa-book\"></i>\n <span class=\"whitespace\">{{file.fileLabel}}</span>\n </a>\n </li>\n</ul>\n",
styles: [""]
},] },
];
/** @nocollapse */
ViewUploadLoaderComponent.ctorParameters = function () {
return [
{ type: GlobalsService }
];
};
ViewUploadLoaderComponent.propDecorators = {
onFileSelected: [{ type: core.Output }]
};
return ViewUploadLoaderComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FileDetails = (function () {
function FileDetails(fileLabel, fileName, fileContents) {
this.fileLabel = fileLabel;
this.fileName = fileName;
this.fileContents = fileContents;
}
return FileDetails;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ $$6 = require('jquery');
var FileUploadLoaderComponent = (function () {
function FileUploadLoaderComponent(configService) {
this.configService = configService;
this.onFileContentRead = new core.EventEmitter();
this.fileReader = new FileReader();
}
/**
* @return {?}
*/
FileUploadLoaderComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.hideMessage();
this.showTestModule();
setTimeout(function () {
_this.showDefaultModule();
}, 100);
};
/**
* @param {?} $event
* @return {?}
*/
FileUploadLoaderComponent.prototype.changeListener = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ fileName;
fileName = $event.target.value;
if (fileName.includes('.xml') || fileName.includes('.Xml') || fileName.includes('.XML') ||
fileName.includes('.zip') || fileName.includes('.Zip') || fileName.includes('.ZIP')) {
this.hideMessage();
this.readThis($event.target);
}
else {
if (fileName !== '' && fileName !== undefined) {
$$6('#xmlOnlyMsg').show();
}
}
};
/**
* @return {?}
*/
FileUploadLoaderComponent.prototype.hideMessage = /**
* @return {?}
*/
function () {
$$6('#xmlOnlyMsg').hide();
};
/**
* @param {?} inputValue
* @return {?}
*/
FileUploadLoaderComponent.prototype.readThis = /**
* @param {?} inputValue
* @return {?}
*/
function (inputValue) {
var _this = this;
this.readFile = inputValue.files[0];
var /** @type {?} */ self = this;
var /** @type {?} */ extensionStartPosition = self.readFile.name.lastIndexOf('.');
this.fileReader.onloadend = function (e) {
self.onFileContentRead.emit(new FileDetails(self.readFile.name.substring(0, extensionStartPosition), self.readFile.name, _this.fileReader.result));
};
this.fileReader.readAsText(this.readFile);
};
/**
* @return {?}
*/
FileUploadLoaderComponent.prototype.showDefaultModule = /**
* @return {?}
*/
function () {
var _this = this;
this.configService.getDefaultModulePath()
.subscribe(function (data) {
var /** @type {?} */ self = _this;
self.onFileContentRead.emit(new FileDetails('Hello Assist 2.0', 'Hello_Assist.xml', data));
});
};
/**
* @return {?}
*/
FileUploadLoaderComponent.prototype.showTestModule = /**
* @return {?}
*/
function () {
var _this = this;
this.configService.getDefaultTestModulePath()
.subscribe(function (data) {
var /** @type {?} */ self = _this;
self.onFileContentRead.emit(new FileDetails('Test Module', 'Test_Module.xml', data));
});
};
FileUploadLoaderComponent.decorators = [
{ type: core.Component, args: [{
selector: 'acr-file-upload-loader',
template: "<input id=\"xmlFileUpload\" class=\"hidden\" type=\"file\" accept=\".xml\" (change)=\"changeListener($event)\" (click)=\"hideMessage()\">\n<label for=\"xmlFileUpload\" class=\"btn btn-success bg-olive margin-10\" title=\"Choose a Module\">Choose a Module</label>\n<br>\n<div id=\"xmlOnlyMsg\" class=\"error-msg\"> Only XML files are supported !!!</div>\n",
styles: [""]
},] },
];
/** @nocollapse */
FileUploadLoaderComponent.ctorParameters = function () {
return [
{ type: GlobalsService }
];
};
FileUploadLoaderComponent.propDecorators = {
onFileContentRead: [{ type: core.Output }]
};
return FileUploadLoaderComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ components$1 = [FileUploadLoaderComponent, ViewUploadLoaderComponent];
var SimulatorLoaderModule = (function () {
function SimulatorLoaderModule() {
}
SimulatorLoaderModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
],
declarations: [components$1],
providers: [GlobalsService],
exports: [components$1]
},] },
];
return SimulatorLoaderModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.AcrAssistSimulatorModule = AcrAssistSimulatorModule;
exports.SimulatorLoaderModule = SimulatorLoaderModule;
exports.ɵc = AcrAssistSimulatorComponent;
exports.ɵp = AssistChoiceElementComponent;
exports.ɵl = AssistDataElementComponent;
exports.ɵv = AssistDateTimeElementComponent;
exports.ɵw = AssistDurationElementComponent;
exports.ɵq = AssistMultiChoiceElementComponent;
exports.ɵo = AssistNumericElementComponent;
exports.ɵn = HintDiagramComponent;
exports.ɵr = ImageMapComponent;
exports.ɵs = AssistReportTextComponent;
exports.ɵe = CreationServiceInjectorToken;
exports.ɵt = DynamicHeightDirective;
exports.ɵu = NumericOnlyDirective;
exports.ɵg = ArrayCheckerService;
exports.ɵx = ChoiceDataElementCreationService;
exports.ɵbc = ComputedDataElementCreationService;
exports.ɵk = ComputedValueCreationService;
exports.ɵj = ConditionsCreationService;
exports.ɵh = DataElementCreationBaseService;
exports.ɵbd = DateTimeDataElementCreationService;
exports.ɵi = DecisionPointsCreationService;
exports.ɵf = DiagramService;
exports.ɵbe = DurationDataElementCreationService;
exports.ɵbb = GlobalValueCreationService;
exports.ɵba = IntegerDataElementCreationService;
exports.ɵy = MultipleChoiceDataElementCreationService;
exports.ɵz = NumericDataElementCreationService;
exports.ɵm = SimulatorCommunicationService;
exports.ɵd = TemplateManagerService;
exports.ɵa = CoreModule;
exports.ɵb = SimulatorEngineService;
exports.ɵbf = FileUploadLoaderComponent;
exports.ɵbg = GlobalsService;
exports.ɵbh = ViewUploadLoaderComponent;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbbnVsbCwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3NpbXVsYXRvci1zdGF0ZS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2RhdGFlbGVtZW50dmFsdWVzLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2NvcmUubW9kdWxlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3RlbXBsYXRlLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbWV0YWRhdGEvbW9kZWxzL21ldGFkYXRhLW1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2FycmF5LWNoZWNrZXIuc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvZGlhZ3JhbS5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2NvbnN0YW50cy50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9kZWNpc2lvbnBvaW50Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2JyYW5jaC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9lbmRwb2ludHJlZi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9kYXRhZWxlbWVudHJlZi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2VxdWFsLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2xlc3MtdGhhbi1jb25kaXRpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9ydWxlcy9ncmVhdGVyLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2xlc3MtdGhhbi1vci1lcXVhbHMtY29uZGl0aW9uLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvY29udGFpbnMtY29uZGl0aW9uLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvYW5kLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL29yLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL25vdC1jb25kaXRpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy90ZXh0LWV4cHJlc3Npb24ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvbW9kZWxzL3J1bGVzLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZW5kcG9pbnQvdGVtcGxhdGUtcGFydGlhbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvdGVtcGxhdGUtbWFuYWdlci5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3JlcG9ydC10ZXh0Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RhYmxlQ29uY2VwdC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmdTeXN0ZW0ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29kaW5nLnZlcnNpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29kaW5nQ29kZS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmdEaXNwbGF5Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZ1VzZXJTZWxlY3RlZC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmcubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jaG9pY2UubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW1hZ2UtZWxlbWVudHMubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW1hZ2UtbWFwLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2FyZWEtbW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvYXJlYS1tYXAubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvY2hvaWNlLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9tdWx0aXBsZS1jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvbnVtZXJpYy1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL251bWVyaWMtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW50ZWdlci1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2ludGVnZXItZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9tb2RlbHMvaW5wdXQtZGF0YS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRhLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvaGludC1kaWFncmFtL2hpbnQtZGlhZ3JhbS5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvZ2xvYmFsdmFsdWUubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2dsb2JhbC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2V4ZWN1dGVkLXJlc3VsdC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1udW1lcmljLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3IvYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQvYXNzaXN0LWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1tdWx0aS1jaG9pY2UtZWxlbWVudC9hc3Npc3QtbXVsdGktY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvaW1hZ2UtbWFwL2ltYWdlLW1hcC5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29tcHV0ZWQtZGF0YS1lbGVtZW50LW1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9jb21wdXRlZC1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtcmVwb3J0LXRleHQvYXNzaXN0LXJlcG9ydC10ZXh0LmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvZGlyZWN0aXZlcy9keW5hbWljaGVpZ2h0LmRpcmVjdGl2ZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvZGlyZWN0aXZlcy9udW1lcmljLW9ubHkuZGlyZWN0aXZlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2RhdGV0aW1lLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9kYXRlVGltZS1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRlVGltZS1lbGVtZW50L2Fzc2lzdC1kYXRlLXRpbWUtZWxlbWVudC9hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvZHVyYXRpb24tZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3IvYWNyLWFzc2lzdC1zaW11bGF0b3IubW9kdWxlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL3NpbXVsYXRvcmxvYWRlci9zaGFyZWQvbW9kZWxzL2RpY3Rpb25hcnkudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3ZpZXctdXBsb2FkLWxvYWRlci92aWV3LXVwbG9hZC1sb2FkZXIuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL3NpbXVsYXRvcmxvYWRlci9zaGFyZWQvbW9kZWxzL2ZpbGUtZGV0YWlscy5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9zaW11bGF0b3Jsb2FkZXIvZmlsZS11cGxvYWQtbG9hZGVyL2ZpbGUtdXBsb2FkLWxvYWRlci5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3NpbXVsYXRvcmxvYWRlci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBTaW11bGF0b3JTdGF0ZSB7XHJcbiAgbm9uUmVsZXZhbnREYXRhRWxlbWVudElkczogc3RyaW5nW10gPSBbXTtcclxuICBlbmRQb2ludElkID0gJyc7XHJcbiAgc2VsZWN0ZWREZWNpc2lvblBvaW50SWQgPSAnJztcclxuICBzZWxlY3RlZERlY2lzaW9uUG9pbnRMYWJlbCA9ICcnO1xyXG4gIHNlbGVjdGVkQnJhbmNoTGFiZWwgPSAnJztcclxuXHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIERhdGFFbGVtZW50VmFsdWVzIHtcclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZXM6IE1hcDxzdHJpbmcsIGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogTWFwPHN0cmluZywgYW55Pikge1xyXG4gICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgYWRkT3JVcGRhdGUoa2V5OiBzdHJpbmcgLCB2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07XHJcbiAgIH1cclxuXHJcbiAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XHJcbiAgIH1cclxuXHJcbiAgIGdldEFsbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlcztcclxuICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wdXRlZFZhbHVlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY0V4cHJlc3Npb24gaW1wbGVtZW50cyBDb21wdXRlZFZhbHVlIHtcclxuICBleHByZXNzaW9uVGV4dDogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi9tb2RlbHMvdGVtcGxhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JTdGF0ZSB9IGZyb20gJy4uL21vZGVscy9zaW11bGF0b3Itc3RhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnQgfSBmcm9tICcuLi9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5pbXBvcnQgeyBDb21wdXRlZERhdGFFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudHMvbW9kZWxzL2NvbXB1dGVkLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IEFyaXRobWV0aWNFeHByZXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbCc7XHJcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHsgQ2hvaWNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9udW1lcmljLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEludGVnZXJEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9pbnRlZ2VyLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvZHVyYXRpb24tZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTXVsdGlDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9tdWx0aS1jaG9pY2UtZGF0YS1lbGVtZW50JztcclxuY29uc3QgZXhwcmVzc2lvblBhcnNlciA9IHJlcXVpcmUoJ2V4cHItZXZhbCcpLlBhcnNlcjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckVuZ2luZVNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZTtcclxuICBwcml2YXRlIGRhdGFFbGVtZW50VmFsdWVzOiBNYXA8c3RyaW5nLCBhbnk+O1xyXG4gIHByaXZhdGUgZGF0YUVsZW1lbnRUZXh0czogTWFwPHN0cmluZywgYW55PjtcclxuICBwcml2YXRlIGVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxhc3RDb25kaXRpb25NZXRCcmFuY2hMZXZlbCA9IDE7XHJcbiAgcHJpdmF0ZSBub25SZWxldmFudERhdGFFbGVtZW50SWRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgc2ltdWxhdG9yU3RhdGVDaGFuZ2VkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTaW11bGF0b3JTdGF0ZT4obmV3IFNpbXVsYXRvclN0YXRlKCkpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFRleHRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSgpOiBUZW1wbGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcclxuICB9XHJcblxyXG4gIGdldEFsbERhdGFFbGVtZW50VmFsdWVzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxEYXRhRWxlbWVudFRleHRzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUVsZW1lbnRUZXh0cztcclxuICB9XHJcblxyXG4gIGdldERhdGFFbGVtZW50VmFsdWUoZGF0YUVsZW1lbnRJZDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50SWRdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YUVsZW1lbnRUZXh0KGRhdGFFbGVtZW50SWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRWxlbWVudFRleHRzW2RhdGFFbGVtZW50SWRdO1xyXG4gIH1cclxuXHJcbiAgYWRkT3JVcGRhdGVEYXRhRWxlbWVudChkYXRhRWxlbWVudElkOiBzdHJpbmcsIHZhbHVlOiBhbnksIHRleHQ6IGFueSkge1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudElkXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFRleHRzW2RhdGFFbGVtZW50SWRdID0gdGV4dDtcclxuICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50cygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGV2YWx1YXRlRGVjaXNpb25Qb2ludChkZWNpc2lvblBvaW50OiBEZWNpc2lvblBvaW50LCBicmFuY2hpbmdMZXZlbCkge1xyXG4gICAgbGV0IGN1cnJlbnRCcmFuY2hDb3VudCA9IDA7XHJcbiAgICBjb25zdCB0b3RhbEJyYW5jaGVzSW5EZWNpc2lvblBvaW50ID0gZGVjaXNpb25Qb2ludC5icmFuY2hlcy5sZW5ndGg7XHJcbiAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBkZWNpc2lvblBvaW50LmJyYW5jaGVzKSB7XHJcbiAgICAgIGN1cnJlbnRCcmFuY2hDb3VudCsrO1xyXG4gICAgICBsZXQgY29uZGl0aW9uTWV0ID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmVuZE9mUm9hZFJlYWNoZWQpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGJyYW5jaC5jb21wb3NpdGVDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbmRpdGlvbk1ldCA9IGJyYW5jaC5jb21wb3NpdGVDb25kaXRpb24uZXZhbHVhdGUobmV3IERhdGFFbGVtZW50VmFsdWVzKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMpKTtcclxuICAgICAgfSBlbHNlIGlmIChicmFuY2guY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25kaXRpb25NZXQgPSBicmFuY2guY29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcclxuICAgICAgICB0aGlzLmxhc3RDb25kaXRpb25NZXRCcmFuY2hMZXZlbCA9IGJyYW5jaGluZ0xldmVsO1xyXG4gICAgICAgIC8vIGlmIChub25SZWxldmFudERhdGFFbGVtZW50SWRzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoYnJhbmNoLm5vdFJlbGV2YW50RGF0YUVsZW1lbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIGZvciAoY29uc3Qgbm9uUmVsZXZhbnREYXRhRWxlbWVudFJlZmVyZW5jZSBvZiBicmFuY2gubm90UmVsZXZhbnREYXRhRWxlbWVudHMuZGF0YUVsZW1lbnRSZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgLy8gICAgIG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMucHVzaChub25SZWxldmFudERhdGFFbGVtZW50UmVmZXJlbmNlLmRhdGFFbGVtZW50SWQpO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKGJyYW5jaC5kZWNpc2lvblBvaW50cyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaERlY2lzaW9uUG9pbnQgb2YgYnJhbmNoLmRlY2lzaW9uUG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0JyYW5jaGluZ0xldmVsID0gYnJhbmNoaW5nTGV2ZWwgKyAxO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmV2YWx1YXRlRGVjaXNpb25Qb2ludChicmFuY2hEZWNpc2lvblBvaW50LCBuZXdCcmFuY2hpbmdMZXZlbCwgbm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50KGJyYW5jaERlY2lzaW9uUG9pbnQsIG5ld0JyYW5jaGluZ0xldmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGJyYW5jaC5lbmRQb2ludFJlZiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCBzaW11bGF0b3JTdGF0ZSA9IG5ldyBTaW11bGF0b3JTdGF0ZSgpO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZCA9IGJyYW5jaC5lbmRQb2ludFJlZi5lbmRQb2ludElkO1xyXG4gICAgICAgICAgLy8gc2ltdWxhdG9yU3RhdGUubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHM7XHJcbiAgICAgICAgICBzaW11bGF0b3JTdGF0ZS5zZWxlY3RlZEJyYW5jaExhYmVsID0gYnJhbmNoLmxhYmVsO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuc2VsZWN0ZWREZWNpc2lvblBvaW50SWQgPSBkZWNpc2lvblBvaW50LmlkO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuc2VsZWN0ZWREZWNpc2lvblBvaW50TGFiZWwgPSBkZWNpc2lvblBvaW50LmxhYmVsO1xyXG4gICAgICAgICAgLy8gdGhpcy5yZXNldFZhbHVlc09mTm9uUmVsZXZhbnREYXRhRWxlbWVudHMobm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zaW11bGF0b3JTdGF0ZUNoYW5nZWQubmV4dChzaW11bGF0b3JTdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjdXJyZW50QnJhbmNoQ291bnQgPj0gdG90YWxCcmFuY2hlc0luRGVjaXNpb25Qb2ludCkge1xyXG4gICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IHNpbXVsYXRvclN0YXRlID0gbmV3IFNpbXVsYXRvclN0YXRlKCk7XHJcbiAgICAgICAgICAvLyBzaW11bGF0b3JTdGF0ZS5ub25SZWxldmFudERhdGFFbGVtZW50SWRzID0gbm9uUmVsZXZhbnREYXRhRWxlbWVudElkcztcclxuICAgICAgICAgIC8vIHRoaXMucmVzZXRWYWx1ZXNPZk5vblJlbGV2YW50RGF0YUVsZW1lbnRzKG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMpO1xyXG4gICAgICAgICAgdGhpcy5zaW11bGF0b3JTdGF0ZUNoYW5nZWQubmV4dChzaW11bGF0b3JTdGF0ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFZhbHVlc09mTm9uUmVsZXZhbnREYXRhRWxlbWVudHMobm9uUmVsZXZhbnREYXRhRWxlbWVudElkczogc3RyaW5nW10pIHtcclxuICAgLy8gY29uc29sZS5sb2codGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpO1xyXG4gICAgaWYgKG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZCBvZiBub25SZWxldmFudERhdGFFbGVtZW50SWRzKSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xyXG4gICAgICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgICAgIGlmIChkYXRhRWxlbWVudC5pZCA9PT0gbm9uUmVsZXZhbnREYXRhRWxlbWVudElkKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRhdGFFbGVtZW50LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW25vblJlbGV2YW50RGF0YUVsZW1lbnRJZF0gPSBkZWZhdWx0VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29tcHV0ZWRFbGVtZW50RGVjaXNpb25Qb2ludChlbGVtZW50SWQ6IHN0cmluZywgZGVjaXNpb25Qb2ludDogRGVjaXNpb25Qb2ludCwgYnJhbmNoaW5nTGV2ZWwpIHtcclxuICAgIGxldCBjdXJyZW50QnJhbmNoQ291bnQgPSAwO1xyXG4gICAgY29uc3QgdG90YWxCcmFuY2hlc0luRGVjaXNpb25Qb2ludCA9IGRlY2lzaW9uUG9pbnQuYnJhbmNoZXMubGVuZ3RoO1xyXG4gICAgZm9yIChjb25zdCBicmFuY2ggb2YgZGVjaXNpb25Qb2ludC5icmFuY2hlcykge1xyXG5cclxuICAgICAgY3VycmVudEJyYW5jaENvdW50Kys7XHJcbiAgICAgIGxldCBjb25kaXRpb25NZXQgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuZW5kT2ZSb2FkUmVhY2hlZCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChicmFuY2guY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25kaXRpb25NZXQgPSBicmFuY2guY29tcG9zaXRlQ29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uZGl0aW9uTWV0ID0gYnJhbmNoLmNvbmRpdGlvbi5ldmFsdWF0ZShuZXcgRGF0YUVsZW1lbnRWYWx1ZXModGhpcy5kYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XHJcbiAgICAgICAgdGhpcy5sYXN0Q29uZGl0aW9uTWV0QnJhbmNoTGV2ZWwgPSBicmFuY2hpbmdMZXZlbDtcclxuICAgICAgICBpZiAoYnJhbmNoLmRlY2lzaW9uUG9pbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgYnJhbmNoRGVjaXNpb25Qb2ludCBvZiBicmFuY2guZGVjaXNpb25Qb2ludHMpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3QnJhbmNoaW5nTGV2ZWwgPSBicmFuY2hpbmdMZXZlbCArIDE7XHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVDb21wdXRlZEVsZW1lbnREZWNpc2lvblBvaW50KGVsZW1lbnRJZCwgYnJhbmNoRGVjaXNpb25Qb2ludCwgbmV3QnJhbmNoaW5nTGV2ZWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmNvbXB1dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZWxlbWVudElkXSA9IGJyYW5jaC5jb21wdXRlZFZhbHVlLmV4cHJlc3Npb25UZXh0O1xyXG4gICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChicmFuY2guY29tcHV0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFyaXRobWV0aWNFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZWxlbWVudElkXSA9IHRoaXMuZXZhbHVhdGVBcml0aG1ldGljRXhwcmVzc2lvbihicmFuY2guY29tcHV0ZWRWYWx1ZS5leHByZXNzaW9uVGV4dCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZSb2FkUmVhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2VsZW1lbnRJZF0gPSBicmFuY2guY29tcHV0ZWRWYWx1ZS5leHByZXNzaW9uVGV4dDtcclxuICAgICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRCcmFuY2hDb3VudCA+PSB0b3RhbEJyYW5jaGVzSW5EZWNpc2lvblBvaW50KSB7XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tlbGVtZW50SWRdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVBcml0aG1ldGljRXhwcmVzc2lvbihjb21wdXRlZFZhbHVlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgbGV0IGVuZEluZGV4ID0gMDtcclxuICAgIHdoaWxlIChzdGFydEluZGV4ICE9PSAtMSAmJiBlbmRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgc3RhcnRJbmRleCA9IGNvbXB1dGVkVmFsdWUuaW5kZXhPZigneycpO1xyXG4gICAgICBlbmRJbmRleCA9IGNvbXB1dGVkVmFsdWUuaW5kZXhPZignfScpO1xyXG4gICAgICBpZiAoc3RhcnRJbmRleCAhPT0gLTEgJiYgZW5kSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUVsZW1lbnRJZCA9IGNvbXB1dGVkVmFsdWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyAxLCBlbmRJbmRleCk7XHJcbiAgICAgICAgY29uc3QgcmVwbGFjaW5nVmFsdWUgPSBjb21wdXRlZFZhbHVlLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCArIDEpO1xyXG4gICAgICAgIGxldCBkYXRhRWxlbWVudFZhbHVlID0gdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudElkXTtcclxuICAgICAgICBpZiAoaXNBcnJheShkYXRhRWxlbWVudFZhbHVlKSkge1xyXG4gICAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudFZhbHVlLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgc3VtICs9ICt2YWw7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRhdGFFbGVtZW50VmFsdWUgPSBzdW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wdXRlZFZhbHVlID0gY29tcHV0ZWRWYWx1ZS5yZXBsYWNlKHJlcGxhY2luZ1ZhbHVlLCBkYXRhRWxlbWVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBleHByZXNzaW9uUGFyc2VyLmV2YWx1YXRlKGNvbXB1dGVkVmFsdWUpLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbXB1dGVkRXhwcmVzc2lvbnMoKSB7XHJcbiAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgIGxldCBleHByZXNzaW9uVmFsdWU6IGFueTtcclxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnRlbXBsYXRlLmRhdGFFbGVtZW50cykge1xyXG4gICAgICBpZiAoZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdDb21wdXRlZERhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIGV4cHJlc3Npb25WYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjb21wdXRlZEVsZW1lbnQ6IENvbXB1dGVkRGF0YUVsZW1lbnQgPSBlbGVtZW50IGFzIENvbXB1dGVkRGF0YUVsZW1lbnQ7XHJcbiAgICAgICAgZm9yIChjb25zdCBkZWNpc2lvblBvaW50IG9mIGNvbXB1dGVkRWxlbWVudC5kZWNpc2lvblBvaW50cykge1xyXG4gICAgICAgICAgdGhpcy5ldmFsdWF0ZUNvbXB1dGVkRWxlbWVudERlY2lzaW9uUG9pbnQoZWxlbWVudC5pZCwgZGVjaXNpb25Qb2ludCwgMSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhRWxlbWVudFZhbHVlc1tlbGVtZW50LmlkXSA9PT0gdW5kZWZpbmVkICYmIGRlY2lzaW9uUG9pbnQuZGVmYXVsdEJyYW5jaCAmJlxyXG4gICAgICAgICAgICBkZWNpc2lvblBvaW50LmRlZmF1bHRCcmFuY2guY29tcHV0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2VsZW1lbnQuaWRdID0gZGVjaXNpb25Qb2ludC5kZWZhdWx0QnJhbmNoLmNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVDb25kaXRpb25hbFByb3BlcnR5KGRhdGFlbGVtZW50LCBub25SZWxldmFudERhdGFFbGVtZW50SWRzOiBzdHJpbmdbXSA9IFtdKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBpZiAoZGF0YWVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGNvbmRpdGlvbk1ldCA9IGZhbHNlO1xyXG4gICAgICBsZXQgaXNDb21wb3NpdGVDb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGFlbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcykge1xyXG4gICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25kaXRpb25NZXQgPSBjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbi5ldmFsdWF0ZShuZXcgRGF0YUVsZW1lbnRWYWx1ZXModGhpcy5kYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgICAgICAgaXNDb21wb3NpdGVDb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbk1ldCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgICAgICBpc0NvbXBvc2l0ZUNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XHJcbiAgICAgICAgICBpZiAobm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9PT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICB0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMucHVzaChkYXRhZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgICAgICAgICAgZGF0YWVsZW1lbnQuaXNSZXF1aXJlZCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuaXNSZXF1aXJlZCAhPT0gdW5kZWZpbmVkID9cclxuICAgICAgICAgICAgICAoY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZSlcclxuICAgICAgICAgICAgICA6IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtICE9PSB1bmRlZmluZWQgJiYgY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtICE9IG51bGwgICkge1xyXG4gICAgICAgICAgICAgIGRhdGFlbGVtZW50Lm1pbmltdW0gPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW0gIT09IHVuZGVmaW5lZCAmJiBjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGRhdGFlbGVtZW50Lm1heGltdW0gPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgICAgKGRhdGFlbGVtZW50IGFzIENob2ljZURhdGFFbGVtZW50KS5DaG9pY2VOb3RSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdNdWx0aUNob2ljZURhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBNdWx0aUNob2ljZURhdGFFbGVtZW50KS5DaG9pY2VOb3RSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdEdXJhdGlvbkRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5ID0gK2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bURheTtcclxuICAgICAgICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bURheSA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXk7XHJcbiAgICAgICAgICAgICAgKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1Ib3VycyA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1Ib3VycztcclxuICAgICAgICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bUhvdXJzID0gK2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bUhvdXJzO1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtTWludXRlcyA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1NaW51dGVzO1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhtaW11bU1pbnV0ZXMgPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhtaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub25SZWxldmFudERhdGFFbGVtZW50SWRzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBDaG9pY2VEYXRhRWxlbWVudCkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRhdGFlbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ011bHRpQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBDaG9pY2VEYXRhRWxlbWVudCkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdGVtcCBjb2RlXHJcbiAgICAgIC8vIGlmICh0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8vICAgZGF0YWVsZW1lbnQuaXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDb25kdGlvbk1ldCgpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgZGF0YWVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgaWYgKGRhdGFlbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGV0IGNvbmRpdGlvbk1ldCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBpc0NvbXBvc2l0ZUNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhZWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbk1ldCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgICAgICAgIGlzQ29tcG9zaXRlQ29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uTWV0ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24uZXZhbHVhdGUobmV3IERhdGFFbGVtZW50VmFsdWVzKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMpKTtcclxuICAgICAgICAgICAgaXNDb21wb3NpdGVDb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVEZWNpc2lvbkFuZENvbmRpdGlvbmFsUHJvcGVydHkoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICB0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgdGhpcy5SZXZlcnRDb25kaXRpb25WYWx1ZXMoKTtcclxuICAgIGZvciAoY29uc3QgZGF0YWVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUHJvcGVydHkoZGF0YWVsZW1lbnQsIG5ldyBBcnJheTxzdHJpbmc+KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRWYWx1ZXNPZk5vblJlbGV2YW50RGF0YUVsZW1lbnRzKHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcbiAgICByZXR1cm4gdGhpcy5ub25SZWxldmFudERhdGFFbGVtZW50SWRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXZlcnRDb25kaXRpb25WYWx1ZXMoKSB7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFlbGVtZW50IG9mIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgIGRhdGFlbGVtZW50LmlzUmVxdWlyZWQgPSBkYXRhZWxlbWVudC5pc1JlcXVpcmVkT3ZlcnJpZGVyO1xyXG4gICAgICBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2UgPSBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2VPdmVycmlkZXI7XHJcbiAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdOdW1lcmljRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgKGRhdGFlbGVtZW50IGFzIE51bWVyaWNEYXRhRWxlbWVudCkubWluaW11bSA9ICsoZGF0YWVsZW1lbnQgYXMgTnVtZXJpY0RhdGFFbGVtZW50KS5taW5pbXVtT3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBOdW1lcmljRGF0YUVsZW1lbnQpLm1heGltdW0gPSArKGRhdGFlbGVtZW50IGFzIE51bWVyaWNEYXRhRWxlbWVudCkubWF4aW11bU92ZXJyaWRlcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnSW50ZWdlckRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBJbnRlZ2VyRGF0YUVsZW1lbnQpLm1pbmltdW0gPSArKGRhdGFlbGVtZW50IGFzIEludGVnZXJEYXRhRWxlbWVudCkubWluaW11bU92ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgSW50ZWdlckRhdGFFbGVtZW50KS5tYXhpbXVtID0gKyhkYXRhZWxlbWVudCBhcyBJbnRlZ2VyRGF0YUVsZW1lbnQpLm1heGltdW1PdmVycmlkZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdEdXJhdGlvbkRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5ID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5T3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtRGF5ID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtRGF5T3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtSG91cnMgPSArKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1Ib3Vyc092ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bUhvdXJzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtSG91cnNPdmVycmlkZXI7XHJcbiAgICAgICAgKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1NaW51dGVzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtTWludXRlc092ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4bWltdW1NaW51dGVzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhtaW11bU1pbnV0ZXNPdmVycmlkZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVEZWNpc2lvblBvaW50cygpIHtcclxuICAgIHRoaXMuZXZhbHVhdGVDb21wdXRlZEV4cHJlc3Npb25zKCk7XHJcbiAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgZGVjaXNpb25Qb2ludCBvZiB0aGlzLnRlbXBsYXRlLnJ1bGVzLmRlY2lzaW9uUG9pbnRzKSB7XHJcbiAgICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50KGRlY2lzaW9uUG9pbnQsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcclxuICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudC5pZF0gPSBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7TmdNb2R1bGUgLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtTaW11bGF0b3JFbmdpbmVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZVxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29yZU1vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQ29yZU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbIFNpbXVsYXRvckVuZ2luZVNlcnZpY2VdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcblxyXG4gfVxyXG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhL21vZGVscy9tZXRhZGF0YS1tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vcnVsZXMvbW9kZWxzL3J1bGVzLm1vZGVsJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vZW5kcG9pbnQvdGVtcGxhdGUtcGFydGlhbCc7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XHJcbiAgbWV0YWRhdGE6IE1ldGFkYXRhO1xyXG4gIGRhdGFFbGVtZW50czogQmFzZURhdGFFbGVtZW50W107XHJcbiAgcnVsZXM6IFJ1bGVzO1xyXG4gIHRlbXBsYXRlUGFydGlhbDogc3RyaW5nW107XHJcbiAgZW5kUG9pbnRzU3RyaW5nOiBzdHJpbmdbXTtcclxuICB4bWxDb250ZW50OiBzdHJpbmc7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaWQ6IHN0cmluZztcclxuICBzY2hlbWFWZXJzaW9uOiBzdHJpbmc7XHJcbiAgcnVsZVZlcnNpb246IHN0cmluZztcclxuICBkaWFncmFtczogRGlhZ3JhbVtdO1xyXG4gIGNyZWF0ZWREYXRlOiBEYXRlO1xyXG4gIGxhc3RNb2RpZmllZERhdGU6IERhdGU7XHJcbiAgYXBwcm92ZWRCeTogc3RyaW5nO1xyXG4gIHJldmlld2VkQnk6IHN0cmluZztcclxuICBkZXZlbG9wZWRCeTogc3RyaW5nO1xyXG4gIHJhZEVsZW1lbnRTZXRJRDogc3RyaW5nO1xyXG4gfVxyXG4iLCJleHBvcnQgY2xhc3MgRGlhZ3JhbSB7XHJcbiAgcHVibGljIGRpc3BsYXlTZXF1ZW5jZTogTnVtYmVyO1xyXG4gIHB1YmxpYyBrZXlEaWFncmFtOiBib29sZWFuO1xyXG4gIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xyXG4gIHB1YmxpYyBsb2NhdGlvbjogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFycmF5Q2hlY2tlclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBpc0FycmF5KGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBBcnJheTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlhZ3JhbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcnJheS1jaGVja2VyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRGlhZ3JhbVNlcnZpY2Uge1xyXG5cclxuIGNvbnN0cnVjdG9yKHByaXZhdGUgYXJyYXlDaGVja2VyU2V2aWNlU2VydmljZTogQXJyYXlDaGVja2VyU2VydmljZSkge1xyXG5cclxuIH1cclxuXHJcbnByaXZhdGUgIHJldHVybkRpYWdyYW0oZGlhZ3JhbUpTT046IGFueSApOiBEaWFncmFtIHtcclxuXHJcbiAgICBjb25zdCBkaWFncmFtID0gbmV3IERpYWdyYW0oKTtcclxuXHJcbiAgICBpZiAoIGRpYWdyYW1KU09OLkF0dHIpICB7XHJcbiAgICAgIGRpYWdyYW0uZGlzcGxheVNlcXVlbmNlID0gZGlhZ3JhbUpTT04uQXR0ci5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICAgIGRpYWdyYW0ua2V5RGlhZ3JhbSA9IGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtID8gIGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtIDogZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkaWFncmFtLmRpc3BsYXlTZXF1ZW5jZSA9IHVuZGVmaW5lZDtcclxuICAgICAgZGlhZ3JhbS5rZXlEaWFncmFtID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBkaWFncmFtLmxhYmVsID0gZGlhZ3JhbUpTT04uTGFiZWw7XHJcbiAgICBkaWFncmFtLmxvY2F0aW9uID0gZGlhZ3JhbUpTT04uTG9jYXRpb247XHJcbiAgICByZXR1cm4gZGlhZ3JhbTtcclxuICB9XHJcblxyXG4gIHJldHVybkRpYWdyYW1zKGRpYWdyYW1zQXNKU09OOiBhbnkpOiBEaWFncmFtW10ge1xyXG4gICAgY29uc3QgZGlhZ3JhbXMgPSBuZXcgQXJyYXk8RGlhZ3JhbT4oKTtcclxuICAgIGlmIChkaWFncmFtc0FzSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNldmljZVNlcnZpY2UuaXNBcnJheShkaWFncmFtc0FzSlNPTikpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgZGlhZ3JhbSBvZiBkaWFncmFtc0FzSlNPTikge1xyXG4gICAgICAgICAgICBkaWFncmFtcy5wdXNoKHRoaXMucmV0dXJuRGlhZ3JhbShkaWFncmFtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGlhZ3JhbXMucHVzaCh0aGlzLnJldHVybkRpYWdyYW0oZGlhZ3JhbXNBc0pTT04pKTtcclxuICAgICAgfVxyXG4gICB9XHJcbiAgIHJldHVybiBkaWFncmFtcztcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5leHBvcnQgY29uc3QgQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbignb25lJyk7XHJcbiIsImltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4vYnJhbmNoLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEZWNpc2lvblBvaW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgYnJhbmNoZXM6IEJyYW5jaFtdO1xyXG4gIGRlZmF1bHRCcmFuY2g6IEJyYW5jaDtcclxufVxyXG4iLCJpbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4vbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi9jb21wb3NpdGUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludCB9IGZyb20gJy4vZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEVuZFBvaW50UmVmIH0gZnJvbSAnLi9lbmRwb2ludHJlZi5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWUgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBCcmFuY2gge1xyXG5cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzOiBOb3RSZWxldmFudERhdGFFbGVtZW50cztcclxuICBjb21wb3NpdGVDb25kaXRpb246IENvbXBvc2l0ZUNvbmRpdGlvbjtcclxuICBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdO1xyXG4gIGVuZFBvaW50UmVmOiBFbmRQb2ludFJlZjtcclxuICBjb21wdXRlZFZhbHVlOiBDb21wdXRlZFZhbHVlO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBFbmRQb2ludFJlZiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIGVuZFBvaW50SWQ6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRGF0YUVsZW1lbnRSZWYge1xyXG4gIGRhdGFFbGVtZW50SWQ6IHN0cmluZztcclxufVxyXG4iLCJpbXBvcnQgeyBEYXRhRWxlbWVudFJlZiB9IGZyb20gJy4vZGF0YWVsZW1lbnRyZWYubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIHtcclxuICBkYXRhRWxlbWVudFJlZmVyZW5jZXM6IERhdGFFbGVtZW50UmVmW107XHJcbn1cclxuIiwiaW1wb3J0IHtDb25kaXRpb25UeXBlfSBmcm9tICcuLi9tb2RlbHMvY29uZGl0aW9udHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5leHBvcnQgY2xhc3MgRXF1YWxDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGUpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbHVlID0gZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKTtcclxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgRGF0YUVsZW1lbnRJZEF0dHJpYnV0ZSB9IGZyb20gJy4vZGF0YWVsZW1lbnRpZGF0dHJpYnV0ZS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uVHlwZSB7XHJcbiAgZGF0YUVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIGNvbXBhcmlzb25WYWx1ZTogYW55OyAgXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR3JlYXRlclRoYW5Db25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5jb25kaXRpb25UeXBlID0gY29uZGl0aW9uVHlwZTsgICAgXHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbHVlID0gK2RhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCkgYXMgbnVtYmVyO1xyXG4gICAgbGV0IGNvbXBhcmlzb25WYWx1ZSA9ICAtMTtcclxuICAgIGlmIChpc05hTih0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSkgIHtcclxuICAgICAgY29tcGFyaXNvblZhbHVlID0gKyBkYXRhRWxlbWVudFZhbHVlcy5nZXQodGhpcy5jb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSkgYXMgbnVtYmVyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29tcGFyaXNvblZhbHVlID0gICsgdGhpcy5jb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSBhcyBudW1iZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUgPiBjb21wYXJpc29uVmFsdWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudFZhbHVlcyB9IGZyb20gJy4uL2RhdGFlbGVtZW50dmFsdWVzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMZXNzVGhhbkNvbmRpdGlvbiBpbXBsZW1lbnRzIENvbmRpdGlvbiB7XHJcbiAgY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZTtcclxuICBJc1JlbGV2YW50OiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlKSB7XHJcbiAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSBjb25kaXRpb25UeXBlO1xyXG4gIH1cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZSA8IGNvbXBhcmlzb25WYWx1ZTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbmRpdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvY29uZGl0aW9udHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5jb25kaXRpb25UeXBlID0gY29uZGl0aW9uVHlwZTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZSA+PSBjb21wYXJpc29uVmFsdWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudFZhbHVlcyB9IGZyb20gJy4uL2RhdGFlbGVtZW50dmFsdWVzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlO1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGUpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgfVxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgICByZXR1cm4gdmFsdWUgPD0gY29tcGFyaXNvblZhbHVlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udGFpbnNDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlKSB7XHJcbiAgICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgICB9XHJcblxyXG4gICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhRWxlbWVudFZhbHVlcy5nZXQodGhpcy5jb25kaXRpb25UeXBlLmRhdGFFbGVtZW50SWQpO1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgY291bnRlciA9IDAgOyAgY291bnRlciA8IHZhbHVlLmxlbmd0aCA7ICBjb3VudGVyKyspIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZVtjb3VudGVyXTtcclxuICAgICAgICBpZiAodmFsdWUxLnRvVXBwZXJDYXNlKCkgPT09IHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi9jb21wb3NpdGUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQW5kQ29uZGl0aW9uIGltcGxlbWVudHMgQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25zOiBhbnkgPSBbXTtcclxuICBJc1JlbGV2YW50OiBib29sZWFuO1xyXG5cclxuICAgY29uZGl0aW9uVHlwZTogc3RyaW5nO1xyXG4gICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSAgJ0FuZENvbmRpdGlvbic7XHJcbiAgIH1cclxuXHJcbiAgZXZhbHVhdGUoZGF0YUVsZW1lbnRWYWx1ZXM6IERhdGFFbGVtZW50VmFsdWVzKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xyXG4gICAgZm9yIChsZXQgY29uZGl0aW9uQ291bnRlciA9IDAgOyAgY29uZGl0aW9uQ291bnRlciA8IHRoaXMuY29uZGl0aW9ucy5sZW5ndGggOyAgY29uZGl0aW9uQ291bnRlcisrKSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc1tjb25kaXRpb25Db3VudGVyXTtcclxuICAgICAgY29uc3QgZXhlY3V0ZWRDb25kaXRpb24gPSBjb25kaXRpb24uZXZhbHVhdGUoZGF0YUVsZW1lbnRWYWx1ZXMpO1xyXG4gICAgICByZXR1cm5WYWx1ZSA9ICghZXhlY3V0ZWRDb25kaXRpb24pID8gZmFsc2UgOiAgKHJldHVyblZhbHVlICYmIGV4ZWN1dGVkQ29uZGl0aW9uKTtcclxuICAgICAgaWYgKCFyZXR1cm5WYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9zaXRlQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29tcG9zaXRlLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9yQ29uZGl0aW9uIGltcGxlbWVudHMgQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbmRpdGlvblR5cGU6IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9ICAnT3JDb25kaXRpb24nO1xyXG4gIH1cclxuXHJcblxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgY29uZGl0aW9uQ291bnRlciA9IDAgOyAgY29uZGl0aW9uQ291bnRlciA8IHRoaXMuY29uZGl0aW9ucy5sZW5ndGggOyAgY29uZGl0aW9uQ291bnRlcisrKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc1tjb25kaXRpb25Db3VudGVyXTtcclxuXHJcbiAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQ29uZGl0aW9uID0gY29uZGl0aW9uLmV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzKTtcclxuICAgICAgICAgcmV0dXJuVmFsdWUgPSAocmV0dXJuVmFsdWUgfHwgZXhlY3V0ZWRDb25kaXRpb24pO1xyXG4gICAgICAgICBpZiAocmV0dXJuVmFsdWUpIHtcclxuICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9zaXRlQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29tcG9zaXRlLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5vdENvbmRpdGlvbiBpbXBsZW1lbnRzIENvbXBvc2l0ZUNvbmRpdGlvbiB7XHJcbiAgY29uZGl0aW9uczogYW55ID0gW107XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuICBcclxuICBjb25kaXRpb25UeXBlOiBzdHJpbmc7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSAgJ05vdENvbmRpdGlvbic7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0ICByZXN1bHRzID0gbmV3IEFycmF5PGJvb2xlYW4+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiB0aGlzLmNvbmRpdGlvbnMpIHtcclxuICAgICAgcmVzdWx0cy5wdXNoKGNvbmRpdGlvbi5ldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICEocmVzdWx0c1swXSk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBFcXVhbENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZXF1YWwtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBHcmVhdGVyVGhhbkNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IExlc3NUaGFuQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tY29uZGl0aW9uJztcclxuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLW9yLWVxdWFscy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbnRhaW5zQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9jb250YWlucy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBBbmRDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2FuZC1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBPckNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvb3ItY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ub3QtY29uZGl0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2Uge1xyXG5cclxuXHJcblxyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTjogYW55KTogQ29uZGl0aW9uVHlwZSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBuZXcgQ29uZGl0aW9uVHlwZSgpO1xyXG4gICAgICBjb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSA9IGNvbmRpdGlvbkpTT04uQXR0ci5Db21wYXJpc29uVmFsdWU7XHJcbiAgICAgIGNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCA9IGNvbmRpdGlvbkpTT04uQXR0ci5EYXRhRWxlbWVudElkO1xyXG4gICAgICByZXR1cm4gY29uZGl0aW9uVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db25kaXRpb24oYnJhbmNoSlNPTjogYW55KTogQ29uZGl0aW9uIHtcclxuICAgICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3IEVxdWFsQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkVxdWFsQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdHcmVhdGVyVGhhbkNvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5Db25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uR3JlYXRlclRoYW5Db25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5MZXNzVGhhbkNvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5HcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkxlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0NvbnRhaW5zQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb250YWluc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5Db250YWluc0NvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKGNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gICBjb25kaXRpb24uSXNSZWxldmFudCA9IGJyYW5jaEpTT04uSXNSZWxldmFudCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJhbmNoSlNPTi5Jc1JlbGV2YW50IDogZmFsc2U7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbmRpdGlvbi5Jc1JlbGV2YW50ID0gYnJhbmNoSlNPTi5Jc1JlbGV2YW50ICE9PSB1bmRlZmluZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJyYW5jaEpTT04uSXNSZWxldmFudCA6IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAgaXNDb21wb3NpdGUoY29tcG9zaXRlRWxlbWVudEpTT04pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0FuZENvbmRpdGlvbicpIHx8XHJcbiAgICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyOiBzdHJpbmcgLCBjb25kaXRpb25KU09OOiBhbnkpOiBDb25kaXRpb24ge1xyXG4gICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnRXF1YWxDb25kaXRpb24nKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgRXF1YWxDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnTGVzc1RoYW5Db25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdDb250YWluc0NvbmRpdGlvbicpIHtcclxuICAgICAgICBjb25kaXRpb24gPSBuZXcgQ29udGFpbnNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlICByZXR1cm5Db25kaXRpb25zKGNvbmRpdGlvbnNKU09OOiBKU09OKTogQ29uZGl0aW9uW10ge1xyXG4gICAgICAgICBsZXQgY29uZGl0aW9uczogQ29uZGl0aW9uW107XHJcbiAgICAgICAgY29uc3QgY29uZGl0aW9uSWRlbnRpZmllcnMgPSBbJ0VxdWFsQ29uZGl0aW9uJywgJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJywgJ0xlc3NUaGFuQ29uZGl0aW9uJyxcclxuICAgICAgICAgICAgJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nLCAnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicsICdDb250YWluc0NvbmRpdGlvbiddO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uSWRlbnRpZmllciBvZiBjb25kaXRpb25JZGVudGlmaWVycykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkpTT04gPSBjb25kaXRpb25zSlNPTltjb25kaXRpb25JZGVudGlmaWVyXTtcclxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gbmV3IEFycmF5PENvbmRpdGlvbj4oKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShjb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBqc29uVmFsdWUgb2YgY29uZGl0aW9uSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyLCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXIsIGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHlicmlkKGNvbXBvc2l0ZUVsZW1lbnRKU09OKTogYm9vbGVhbiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUV4aXN0cyA9ICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpO1xyXG5cclxuICAgICAgY29uc3QgcHJpbWl0aXZlRXhpc3RzID0gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicpIHx8XHJcbiAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdDb250YWluc0NvbmRpdGlvbicpO1xyXG4gICAgICByZXR1cm4gIGNvbXBvc2l0ZUV4aXN0cyAmJiBwcmltaXRpdmVFeGlzdHM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbihkYXRhOiBhbnkpOiBDb21wb3NpdGVDb25kaXRpb24ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoZGF0YSkpICB7XHJcbiAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uSlNPTjogYW55O1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcblxyXG4gICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgKSB7XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5BbmRDb25kaXRpb247XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSkge1xyXG4gICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5PckNvbmRpdGlvbjtcclxuICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uSlNPTiA9IGRhdGEuTm90Q29uZGl0aW9uO1xyXG4gICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICB9XHJcbi8vIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdJc1JlbGV2YW50Jykpe1xyXG4vLyAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gKz0gZGF0YS5Jc1JlbGV2YW50O1xyXG4vLyB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoY29tcG9zaXRlQ29uZGl0aW9uSlNPTikpIHtcclxuICAgICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uLmNvbmRpdGlvbnMgPSB0aGlzLnJldHVybkNvbmRpdGlvbnMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0h5YnJpZChjb21wb3NpdGVDb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9ICBjb21wb3NpdGVDb25kaXRpb25KU09OW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAgJ3tcIicgKyBqc29uS2V5ICArICdcIjonICsgSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlKSArICd9JyA7XHJcbiAgICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICB0aGlzLnJldHVybklubmVyQ29uZGl0aW9ucyhqc29uT2JqZWN0LCBjb21wb3NpdGVDb25kaXRpb24pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFycmF5VmFsdWUgb2YgIGpzb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwganNvblZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgIH1cclxuICAgICByZXR1cm4gY29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm5Db21wb3NpdGVDb25kaXRpb25Gcm9tTmFtZShlbGVtZW50TmFtZTogc3RyaW5nKTogQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICAgICAgbGV0IGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICAnQW5kQ29uZGl0aW9uJzpcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgICdPckNvbmRpdGlvbic6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ05vdENvbmRpdGlvbicgOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUNvbmRpdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgIGFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXk6IGFueSAsIHZhbHVlOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcblxyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbkZyb21OYW1lKGtleSk7XHJcbiAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuaXNIeWJyaWQodmFsdWUpKSB7XHJcbiAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG4gICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgY29uc3QganNvblZhbHVlID0gIHZhbHVlW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgY29uc3QganNvblN0cmluZyA9ICAne1wiJyArIGpzb25LZXkgICsgJ1wiOicgKyBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUpICsgJ30nIDtcclxuICAgICAgICAgICAgIGNvbnN0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGpzb25PYmplY3QsIGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJyYXlWYWx1ZSBvZiAganNvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2UgIGlmICh0aGlzLmlzQ29tcG9zaXRlKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaXNDb21wb3NpdGUnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zID0gdGhpcy5yZXR1cm5Db25kaXRpb25zKHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybklubmVyQ29uZGl0aW9ucyhpbm5lckNvbmRpdGlvbnNKU09OOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyhpbm5lckNvbmRpdGlvbnNKU09OKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBqc29uS2V5cyApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gaW5uZXJDb25kaXRpb25zSlNPTltrZXldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCB2YWx1ZSwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCBpbm5lckNvbmRpdGlvbnNKU09OW2tleV0sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuIiwiaW1wb3J0IHtDb21wdXRlZFZhbHVlfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLm1vZGVsJztcclxuZXhwb3J0IGNsYXNzIFRleHRFeHByZXNzaW9uIGltcGxlbWVudHMgQ29tcHV0ZWRWYWx1ZSB7XHJcblxyXG4gIGV4cHJlc3Npb25UZXh0OiBzdHJpbmc7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGV4dEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy90ZXh0LWV4cHJlc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvY29tcHV0ZWQtdmFsdWUubW9kZWwnO1xyXG5pbXBvcnQgeyBBcml0aG1ldGljRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgY3JlYXRlQ29tcHV0ZWRWYWx1ZShkYXRhQXNKU09OOiBhbnkpOiBDb21wdXRlZFZhbHVlIHtcclxuXHJcbiAgICAgICBpZiAoZGF0YUFzSlNPTlsnVGV4dEV4cHJlc3Npb24nXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBuZXcgVGV4dEV4cHJlc3Npb24oKTtcclxuICAgICAgICAgIGNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQgPSBkYXRhQXNKU09OLlRleHRFeHByZXNzaW9uO1xyXG4gICAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGFBc0pTT05bJ0FyaXRobWV0aWNFeHByZXNzaW9uJ10gIT09IHVuZGVmaW5lZCkgeyB7XHJcbiAgICAgICAgY29uc3QgY29tcHV0ZWRWYWx1ZSA9IG5ldyBBcml0aG1ldGljRXhwcmVzc2lvbigpO1xyXG4gICAgICAgIGNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQgPSBkYXRhQXNKU09OLkFyaXRobWV0aWNFeHByZXNzaW9uO1xyXG4gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9tb2RlbHMvcnVsZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcnJheS1jaGVja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZWNpc2lvblBvaW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5pbXBvcnQgeyBFbmRQb2ludFJlZiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2VuZHBvaW50cmVmLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRSZWYgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kYXRhZWxlbWVudHJlZi5tb2RlbCc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICBwcml2YXRlIGNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2U6IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZWxldmFudERhdGFFbGVtZW50UmVmZXJlbmNlcyhkYXRhRWxlbWVudFJlZkpTT04pOiBEYXRhRWxlbWVudFJlZiAgICAge1xyXG4gICAgICBjb25zdCBkYXRhRWxlbWVudFJlZiA9IG5ldyBEYXRhRWxlbWVudFJlZigpO1xyXG4gICAgICBkYXRhRWxlbWVudFJlZi5kYXRhRWxlbWVudElkID0gZGF0YUVsZW1lbnRSZWZKU09OLkF0dHIuRGF0YUVsZW1lbnRJZDtcclxuICAgICAgcmV0dXJuIGRhdGFFbGVtZW50UmVmO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgIHJldHVybkJyYW5jaChicmFuY2hKU09OKTogQnJhbmNoIHtcclxuICAgIGNvbnN0IGJyYW5jaCA9IG5ldyBCcmFuY2goKTtcclxuICAgIGJyYW5jaC5sYWJlbCA9IGJyYW5jaEpTT04uTGFiZWw7XHJcbiAgICBpZiAoYnJhbmNoSlNPTi5FbmRQb2ludFJlZikge1xyXG4gICAgICBicmFuY2guZW5kUG9pbnRSZWYgPSBuZXcgRW5kUG9pbnRSZWYoKTtcclxuICAgICAgYnJhbmNoLmVuZFBvaW50UmVmLmVuZFBvaW50SWQgPSBicmFuY2hKU09OLkVuZFBvaW50UmVmLkF0dHIuRW5kUG9pbnRJZDtcclxuICAgIH1cclxuICAgIGJyYW5jaC5jb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29uZGl0aW9uKGJyYW5jaEpTT04pO1xyXG4gICAgYnJhbmNoLmNvbXB1dGVkVmFsdWUgPSB0aGlzLmNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UuY3JlYXRlQ29tcHV0ZWRWYWx1ZShicmFuY2hKU09OKTtcclxuICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UuaXNDb21wb3NpdGUoYnJhbmNoSlNPTikpIHtcclxuICAgICAgICAgYnJhbmNoLmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oYnJhbmNoSlNPTik7XHJcbiAgICB9XHJcbiAgICBpZiAoYnJhbmNoSlNPTi5Ob3RSZWxldmFudERhdGFFbGVtZW50cykge1xyXG4gICAgICAgICAgIGNvbnN0IG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzID0gbmV3IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzKCk7XHJcbiAgICAgICAgICBub3RSZWxldmFudERhdGFFbGVtZW50cy5kYXRhRWxlbWVudFJlZmVyZW5jZXMgPSBuZXcgQXJyYXk8RGF0YUVsZW1lbnRSZWY+KCk7XHJcbiAgICAgICAgICBjb25zdCBkYXRhRWxlbWVudFJlZnMgPSBicmFuY2hKU09OLk5vdFJlbGV2YW50RGF0YUVsZW1lbnRzLkRhdGFFbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGRhdGFFbGVtZW50UmVmcykpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50UmVmSlNPTiBvZiAgZGF0YUVsZW1lbnRSZWZzKSB7XHJcbiAgICAgICAgICAgICAgICBub3RSZWxldmFudERhdGFFbGVtZW50cy5kYXRhRWxlbWVudFJlZmVyZW5jZXMucHVzaCh0aGlzLmNyZWF0ZVJlbGV2YW50RGF0YUVsZW1lbnRSZWZlcmVuY2VzKGRhdGFFbGVtZW50UmVmSlNPTikpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzLmRhdGFFbGVtZW50UmVmZXJlbmNlcy5wdXNoKHRoaXMuY3JlYXRlUmVsZXZhbnREYXRhRWxlbWVudFJlZmVyZW5jZXMoZGF0YUVsZW1lbnRSZWZzKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmFuY2gubm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBub3RSZWxldmFudERhdGFFbGVtZW50cztcclxuICAgIH1cclxuICAgIGlmIChicmFuY2hKU09OLkRlY2lzaW9uUG9pbnQpIHtcclxuICAgICAgIGJyYW5jaC5kZWNpc2lvblBvaW50cyA9IG5ldyBBcnJheTxEZWNpc2lvblBvaW50PigpO1xyXG4gICAgICAgdGhpcy5hZGREZWNpc2lvblBvaW50cyhicmFuY2hKU09OLkRlY2lzaW9uUG9pbnQsICBicmFuY2guZGVjaXNpb25Qb2ludHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJyYW5jaDtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGFkZERlY2lzaW9uUG9pbnQoZGVjc2lvblBvaW50QXNKU09OOiBhbnkgLCBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdKSB7XHJcbiAgICAgY29uc3QgZGVjaXNpb25Qb2ludCA9IG5ldyBEZWNpc2lvblBvaW50KCk7XHJcbiAgICAgIGlmIChkZWNzaW9uUG9pbnRBc0pTT04uQXR0ciAmJiBkZWNzaW9uUG9pbnRBc0pTT04uQXR0ci5JZCkge1xyXG4gICAgICAgIGRlY2lzaW9uUG9pbnQuaWQgPSBkZWNzaW9uUG9pbnRBc0pTT04uQXR0ci5JZDtcclxuICAgICB9XHJcbiAgICAgZGVjaXNpb25Qb2ludC5sYWJlbCA9IGRlY3Npb25Qb2ludEFzSlNPTi5MYWJlbDtcclxuICAgICAgY29uc3QgYnJhbmNoZXNKU09OID0gZGVjc2lvblBvaW50QXNKU09OLkJyYW5jaDtcclxuICAgICBpZiAoYnJhbmNoZXNKU09OICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZGVjaXNpb25Qb2ludC5icmFuY2hlcyA9IG5ldyBBcnJheTxCcmFuY2g+KCk7XHJcbiAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShicmFuY2hlc0pTT04pKSAge1xyXG4gICAgICAgIGZvciAoY29uc3QgYnJhbmNoSlNPTiBvZiBicmFuY2hlc0pTT04pIHtcclxuICAgICAgICAgIGRlY2lzaW9uUG9pbnQuYnJhbmNoZXMucHVzaCh0aGlzLnJldHVybkJyYW5jaChicmFuY2hKU09OKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWNpc2lvblBvaW50LmJyYW5jaGVzLnB1c2godGhpcy5yZXR1cm5CcmFuY2goYnJhbmNoZXNKU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGVmYXVsdEJyYW5jaEpTT04gPSBkZWNzaW9uUG9pbnRBc0pTT04uRGVmYXVsdEJyYW5jaDtcclxuICAgICAgaWYgKGRlZmF1bHRCcmFuY2hKU09OICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkZWNpc2lvblBvaW50LmRlZmF1bHRCcmFuY2ggPSB0aGlzLmNyZWF0ZURlZmF1bHRCcmFuY2goZGVmYXVsdEJyYW5jaEpTT04pO1xyXG4gICAgICB9XHJcblxyXG4gICAgIH1cclxuICAgICBkZWNpc2lvblBvaW50cy5wdXNoKGRlY2lzaW9uUG9pbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGREZWNpc2lvblBvaW50cyhkZWNzaW9uUG9pbnRzQXNKU09OOiBhbnkgLCBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdKSB7XHJcbiAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkoZGVjc2lvblBvaW50c0FzSlNPTikpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRlY2lzaW9uUG9pbnQgb2YgIGRlY3Npb25Qb2ludHNBc0pTT04pe1xyXG4gICAgICAgICAgdGhpcy5hZGREZWNpc2lvblBvaW50KGRlY2lzaW9uUG9pbnQsIGRlY2lzaW9uUG9pbnRzKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZERlY2lzaW9uUG9pbnQoZGVjc2lvblBvaW50c0FzSlNPTiwgZGVjaXNpb25Qb2ludHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRGVjaXNpb25Qb2ludHMoZGF0YTogYW55KTogRGVjaXNpb25Qb2ludFtdIHtcclxuICAgIGNvbnN0IGRlY2lzaW9uUG9pbnRzID0gbmV3IEFycmF5PERlY2lzaW9uUG9pbnQ+KCk7XHJcbiAgICB0aGlzLmFkZERlY2lzaW9uUG9pbnRzKGRhdGEsIGRlY2lzaW9uUG9pbnRzKTtcclxuICAgIHJldHVybiBkZWNpc2lvblBvaW50cztcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVEZWZhdWx0QnJhbmNoKGRhdGE6IGFueSk6IEJyYW5jaCB7XHJcbiAgICBjb25zdCBkZWZhdWx0QnJhbmNoOiBCcmFuY2ggID0gbmV3IEJyYW5jaCgpO1xyXG4gICAgZGVmYXVsdEJyYW5jaC5sYWJlbCA9ICAnRGVmYXVsdCBCcmFuY2gnO1xyXG4gICAgZGVmYXVsdEJyYW5jaC5jb21wdXRlZFZhbHVlID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoZGF0YSk7XHJcbiAgICByZXR1cm4gZGVmYXVsdEJyYW5jaDtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRGVjaXNpb25Qb2ludCB9IGZyb20gJy4uLy4uL21vZGVscy9kZWNpc2lvbnBvaW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSdWxlcyB7XHJcbiAgIGRlY2lzaW9uUG9pbnRzOiBEZWNpc2lvblBvaW50W107XHJcbn1cclxuIiwiaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb24gfSBmcm9tICcuL3NlY3Rpb24taWYtdmFsdWUtbm90LWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uIH0gZnJvbSAnLi9zZWN0aW9uLWlmLXZhbHVlLWNvbmRpdGlvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVQYXJ0aWFsIHtcclxuICAgIGlkOiBTdHJpbmc7XHJcbiAgICBzZWN0aW9uSWZOb3RWYWx1ZTogU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb247XHJcbiAgICBzZWN0aW9uSWZWYWx1ZXM6IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uW107XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSAsIEluamVjdCAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUZW1wbGF0ZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvdGVtcGxhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbWV0YWRhdGEvbW9kZWxzL21ldGFkYXRhLW1vZGVsJztcclxuaW1wb3J0IHsgRGlhZ3JhbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7RGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9kZWNpc2lvbi1wb2ludHMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9tb2RlbHMvcnVsZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBmYWlsIH0gZnJvbSAnYXNzZXJ0JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbmRwb2ludC90ZW1wbGF0ZS1wYXJ0aWFsJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtbm90LWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbmRwb2ludC9zZWN0aW9uLWlmLXZhbHVlLWNvbmRpdGlvbic7XHJcbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZU1hbmFnZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIGVuZFBvaW50WE1MU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHN0cmluZ1BhcnNlcjogYW55ID0gcmVxdWlyZSgnc3RyaW5nJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgIGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSAsXHJcbiAgICBASW5qZWN0KENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4pIHByaXZhdGUgZWxlbWVtdGNyZWF0aW9uU2VydmljZTogRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlW10gLFxyXG4gICAgcHJpdmF0ZSBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlICwgcHJpdmF0ZSBkZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZTogRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UpIHsgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSh0ZW1wbGF0ZUNvbnRlbnQ6IHN0cmluZyk6IFRlbXBsYXRlICB7XHJcbiAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKCk7XHJcbiAgIGxldCB0ZW1wbGF0ZUNvbnRlbnRBc0pTT046IGFueTtcclxuICAgdGVtcGxhdGVDb250ZW50QXNKU09OID0gdGhpcy5wYXJzZVRvSnNvbih0ZW1wbGF0ZUNvbnRlbnQpO1xyXG4gICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhyb3cgIG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSB0ZW1wbGF0ZScpO1xyXG4gICB9XHJcbiAgIHRlbXBsYXRlLm1ldGFkYXRhID0gdGhpcy5nZXRNZXRhRGF0YSh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uTWV0YWRhdGEpO1xyXG4gICB0ZW1wbGF0ZS5kYXRhRWxlbWVudHMgPSB0aGlzLmdldERhdGFFbGVtZW50cyh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uRGF0YUVsZW1lbnRzKTtcclxuICAgaWYgKHRlbXBsYXRlQ29udGVudEFzSlNPTi5SdWxlcykge1xyXG4gICAgdGVtcGxhdGUucnVsZXMgID0gbmV3IFJ1bGVzKCk7XHJcbiAgICB0ZW1wbGF0ZS5ydWxlcy5kZWNpc2lvblBvaW50cyA9IHRoaXMuZGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVjaXNpb25Qb2ludHModGVtcGxhdGVDb250ZW50QXNKU09OLlJ1bGVzLkRlY2lzaW9uUG9pbnQpO1xyXG4gIH1cclxuICAgIHRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbCA9IHRoaXMucmV0dXJuRW5kcG9pbnRzKHRlbXBsYXRlQ29udGVudCk7XHJcbiAgICB0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmcgPSB0aGlzLmVuZFBvaW50WE1MU3RyaW5nO1xyXG4gICAgdGVtcGxhdGUueG1sQ29udGVudCA9IHRlbXBsYXRlQ29udGVudDtcclxuXHJcbi8vIGNvbnNvbGUubG9nKHRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbCk7XHJcbi8vY29uc29sZS5sb2codGVtcGxhdGUuZW5kUG9pbnRzU3RyaW5nKTtcclxuXHJcbiAgICByZXR1cm4gdGVtcGxhdGU7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZVBhcnRpYWwodGVtcGxhdGVQYXJ0aWFsSlNPTjogYW55KTogVGVtcGxhdGVQYXJ0aWFsIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbCA9IG5ldyBUZW1wbGF0ZVBhcnRpYWw7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuaWQgPSB0ZW1wbGF0ZVBhcnRpYWxKU09OLkF0dHIuSWQ7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuc2VjdGlvbklmTm90VmFsdWUgPSB0ZW1wbGF0ZVBhcnRpYWxKU09OLlNlY3Rpb25JZlZhbHVlTm90O1xyXG4gICAgdGVtcGxhdGVQYXJ0aWFsLnNlY3Rpb25JZlZhbHVlcyA9IHRlbXBsYXRlUGFydGlhbEpTT04uU2VjdGlvbklmVmFsdWU7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVQYXJ0aWFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRQb2ludENvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZywgc3RhcnRUb2tlbjogc3RyaW5nLCBlbmRUb2tlbjogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgY29udGVudHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IDA7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9IGNvbnRlbnQuaW5kZXhPZihzdGFydFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG4gICAgICAgICBjb25zdCBjb250ZW50RW5kUG9zaXRpb24gID0gY29udGVudC5pbmRleE9mKGVuZFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG5cclxuICAgICAgICAgaWYgKGNvbnRlbnRTdGFydFBvc2l0aW9uID49IDAgICYmIGNvbnRlbnRFbmRQb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY29udGVudEVuZFBvc2l0aW9uICsgZW5kVG9rZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGF0YSA9IGNvbnRlbnQuc3Vic3RyaW5nKGNvbnRlbnRTdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2goY29udGVudERhdGEpO1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24gPSBlbmRQb3NpdGlvbiArIDE7XHJcbiAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBjb250ZW50cztcclxuICB9XHJcblxyXG5wcml2YXRlIHJldHVyblRlbXBsYXRlUGFydGlhbHModGVtcGxhdGVQYXJ0aWFsQXJyYXk6IHN0cmluZ1tdKTogVGVtcGxhdGVQYXJ0aWFsW10ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxzID0gbmV3IEFycmF5PFRlbXBsYXRlUGFydGlhbD4oKTtcclxuICAgICAgZm9yIChjb25zdCBhcnJheUl0ZW0gb2YgdGVtcGxhdGVQYXJ0aWFsQXJyYXkpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWwgPSBuZXcgVGVtcGxhdGVQYXJ0aWFsKCk7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJ0aWFsQXNKU09OID0gdGhpcy5wYXJzZVRvSnNvbihhcnJheUl0ZW0pO1xyXG4gICAgICAgIHRlbXBsYXRlUGFydGlhbC5pZCA9IHRlbXBsYXRlUGFydGlhbEFzSlNPTi5BdHRyLklkO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRlbXBsYXRlUGFydGlhbHM7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRwb2ludHMoeG1sRGF0YTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZW5kUG9pbnRTdGFydFRva2VuID0gJzxFbmRQb2ludHM+JztcclxuICAgIGNvbnN0IGVuZFBvaW50RW5kVG9rZW4gPSAnPC9FbmRQb2ludHM+JztcclxuXHJcbiAgICBjb25zdCBlbmRQb2ludFN0YXJ0VG9rZW5Qb3NpdGlvbiA9IHhtbERhdGEuaW5kZXhPZihlbmRQb2ludFN0YXJ0VG9rZW4pO1xyXG4gICAgY29uc3QgZW5kUG9pbnRFbmRUb2tlblBvc2l0aW9uID0geG1sRGF0YS5pbmRleE9mKGVuZFBvaW50RW5kVG9rZW4pO1xyXG4gICAgaWYgKGVuZFBvaW50U3RhcnRUb2tlblBvc2l0aW9uID49IDAgICYmIGVuZFBvaW50RW5kVG9rZW5Qb3NpdGlvbiA+PSAwICkge1xyXG4gICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9ICAoZW5kUG9pbnRTdGFydFRva2VuUG9zaXRpb24gKyBlbmRQb2ludFN0YXJ0VG9rZW4ubGVuZ3RoKTtcclxuICAgICAgY29uc3QgZW5kUG9pbnRDb250ZW50ID0geG1sRGF0YS5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24gLCBlbmRQb2ludEVuZFRva2VuUG9zaXRpb24pO1xyXG4gICAgaWYgKGVuZFBvaW50Q29udGVudC5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxzID0gdGhpcy5yZXR1cm5FbmRQb2ludENvbnRlbnRzKGVuZFBvaW50Q29udGVudCwgJzxUZW1wbGF0ZVBhcnRpYWwnICwgJzwvVGVtcGxhdGVQYXJ0aWFsPicpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFBvaW50WE1MU3RyaW5nID0gdGhpcy5yZXR1cm5FbmRQb2ludENvbnRlbnRzKGVuZFBvaW50Q29udGVudCwgJzxFbmRQb2ludCcgLCAnPC9FbmRQb2ludD4nKTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVBhcnRpYWxzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxucHJpdmF0ZSBwYXJzZVRvSnNvbih4bWxEYXRhOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IGpzb25SZXN1bHQ6IEpTT047XHJcbiAgICBjb25zdCBwYXJzZVN0cmluZyA9ICByZXF1aXJlKCd4bWwyanMnKS5wYXJzZVN0cmluZztcclxuICAgIHBhcnNlU3RyaW5nKHhtbERhdGEsIHtleHBsaWNpdFJvb3QgOiBmYWxzZSwgZXhwbGljaXRBcnJheSA6IGZhbHNlLCBhdHRya2V5IDogJ0F0dHInfSAsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xyXG4gICAgICAgIGpzb25SZXN1bHQgID0gcmVzdWx0O1xyXG4gIH0pO1xyXG4gIHJldHVybiBqc29uUmVzdWx0O1xyXG4gfVxyXG5cclxuIHByaXZhdGUgZ2V0TWV0YURhdGEobWV0YWRhdGFKU09OOiBhbnkpOiBNZXRhZGF0YSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpO1xyXG4gICAgbWV0YWRhdGEubGFiZWwgPSBtZXRhZGF0YUpTT04uTGFiZWw7XHJcbiAgICBtZXRhZGF0YS5pZCA9IG1ldGFkYXRhSlNPTi5JRDtcclxuICAgIG1ldGFkYXRhLnNjaGVtYVZlcnNpb24gPSBtZXRhZGF0YUpTT04uU2NoZW1hVmVyc2lvbjtcclxuICAgIG1ldGFkYXRhLnJ1bGVWZXJzaW9uID0gbWV0YWRhdGFKU09OLlJ1bGVWZXJzaW9uO1xyXG4gICAgY29uc3QgZGlhZ3JhbXNBc0pTT04gPSBtZXRhZGF0YUpTT04uSW5mby5EaWFncmFtcy5EaWFncmFtO1xyXG4gICAgbWV0YWRhdGEuZGlhZ3JhbXMgPSB0aGlzLmRpYWdyYW1TZXJ2aWNlLnJldHVybkRpYWdyYW1zKGRpYWdyYW1zQXNKU09OKTtcclxuXHJcbiAgICBtZXRhZGF0YS5hcHByb3ZlZEJ5ID0gbWV0YWRhdGFKU09OLkFwcHJvdmVkQnk7XHJcbiAgICBtZXRhZGF0YS5jcmVhdGVkRGF0ZSA9IG1ldGFkYXRhSlNPTi5DcmVhdGVkRGF0ZTtcclxuICAgIG1ldGFkYXRhLmxhc3RNb2RpZmllZERhdGUgPSBtZXRhZGF0YUpTT04uTGFzdE1vZGlmaWVkRGF0ZTtcclxuICAgIG1ldGFkYXRhLnJldmlld2VkQnkgPSBtZXRhZGF0YUpTT04uUmV2aWV3ZWRCeTtcclxuICAgIG1ldGFkYXRhLmRldmVsb3BlZEJ5ID0gbWV0YWRhdGFKU09OLkRldmVsb3BlZEJ5O1xyXG4gICAgbWV0YWRhdGEucmFkRWxlbWVudFNldElEID0gbWV0YWRhdGFKU09OLlJhZEVsZW1lbnRTZXRJRDtcclxuICAgIHJldHVybiBtZXRhZGF0YTtcclxuIH1cclxuXHJcbiBwcml2YXRlICByZXR1cm5EYXRhRWxlbWVudCAoZWxlbWVudFR5cGU6IHN0cmluZywgZGF0YUVsZW1lbnRzSlNPTjogYW55KTogQmFzZURhdGFFbGVtZW50W10ge1xyXG4gICAgY29uc3QgIGRhdGFFbGVtZW50cyA9IG5ldyBBcnJheTxCYXNlRGF0YUVsZW1lbnQ+KCk7XHJcbiAgICBsZXQgZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZTogRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlO1xyXG4gICAgZm9yIChjb25zdCBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSBvZiB0aGlzLmVsZW1lbXRjcmVhdGlvblNlcnZpY2UpIHtcclxuICAgICAgICAgIGlmIChkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZS5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZSA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFFbGVtZW50c0pTT04gIT09IHVuZGVmaW5lZCkgIHtcclxuICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShkYXRhRWxlbWVudHNKU09OKSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnRKU09OIG9mIGRhdGFFbGVtZW50c0pTT04pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUVsZW1lbnQgPSBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlLmNyZWF0ZUVsZW1lbnQoZGF0YUVsZW1lbnRKU09OKTtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnRzLnB1c2goZGF0YUVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlSW5zdGFuY2UuY3JlYXRlRWxlbWVudChkYXRhRWxlbWVudHNKU09OKTtcclxuICAgICAgICBkYXRhRWxlbWVudHMucHVzaChkYXRhRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhRWxlbWVudHM7XHJcbiB9XHJcblxyXG4gcHJpdmF0ZSBnZXREYXRhRWxlbWVudHMoZGF0YUVsZW1lbnRzSlNPTjogYW55KTogQmFzZURhdGFFbGVtZW50W10ge1xyXG4gICBsZXQgIGRhdGFFbGVtZW50cyA9IG5ldyBBcnJheTxCYXNlRGF0YUVsZW1lbnQ+KCk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnQ2hvaWNlRGF0YUVsZW1lbnQnLCBkYXRhRWxlbWVudHNKU09OLkNob2ljZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uTXVsdGlDaG9pY2VEYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ051bWVyaWNEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uTnVtZXJpY0RhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnR2xvYmFsVmFsdWUnLCBkYXRhRWxlbWVudHNKU09OLkdsb2JhbFZhbHVlKSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnQ29tcHV0ZWREYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uQ29tcHV0ZWREYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ0ludGVnZXJEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uSW50ZWdlckRhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnRGF0ZVRpbWVEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uRGF0ZVRpbWVEYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ0R1cmF0aW9uRGF0YUVsZW1lbnQnLCBkYXRhRWxlbWVudHNKU09OLlRpbWVTcGFuRGF0YUVsZW1lbnQpKTtcclxuICAgcmV0dXJuIGRhdGFFbGVtZW50cztcclxuIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQWxsVGV4dFJlcG9ydCB7XHJcbiAgICBoZWFkaW5nOiBzdHJpbmc7XHJcbiAgICBjb250ZW50OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJlcG9ydFRleHRQb3NpdGlvbiB7XHJcbiAgICBUb3AsXHJcbiAgICBSaWdodFxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy90ZW1wbGF0ZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9tZXRhZGF0YS9saWZlY3ljbGVfaG9va3MnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3RlbXBsYXRlLm1vZGVsJztcclxuaW1wb3J0IHsgTWFpblJlcG9ydFRleHQsIEZpbmFsRXhlY3V0ZWRIaXN0b3J5IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9kaWFncmFtLm1vZGVsJztcclxuaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbnB1dERhdGEgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9pbnB1dC1kYXRhLm1vZGVsJztcclxuaW1wb3J0IHsgUmVwb3J0VGV4dFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LXRleHQubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5jb25zdCAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3Qtc2ltdWxhdG9yJyxcclxuICB0ZW1wbGF0ZTogYDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFbXB0eUNvbnRlbnRcIj5cclxuICA8ZGl2IGlkPVwidG9wUmVwb3J0VGV4dFBvc2l0aW9uXCIgKm5nSWY9XCJyZXBvcnRUZXh0UG9zaXRpb24gPT09IHBvc2l0aW9uLlRvcFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWJsb2NrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBib3gtc29saWQgbWFyZ2luLWItMFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlc2V0QnV0dG9uID09IHRydWVcIiBjbGFzcz1cIndpdGgtYm9yZGVyICB0ZXh0LXJpZ2h0IHBhZGRpbmctNSBwYWRkaW5nLXItMTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVzZXRFbGVtZW50cygpXCIgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1wcmltYXJ5XCI+UmVzZXQgVmFsdWVzPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICNzaW11bGF0b3JSZXN1bHRzQmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc3VsdFRleHQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlciB3aXRoLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImJveC10aXRsZVwiPlJlcG9ydCBUZXh0PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXRvb2xzIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1ib3gtdG9vbCBidG4tcmVwb3J0LXRleHRcIiAoY2xpY2spPVwiY29sbGFwc2VSZXBvcnRUZXh0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgaWQ9XCJpY29uX3JlcG9ydHRleHRcIiBjbGFzcz1cImZhIGZhLW1pbnVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYm9keV9yZXBvcnR0ZXh0XCIgY2xhc3M9XCJib3gtYm9keSByZXBvcnQtdGV4dCBkaXYtcmVwb3J0LXRleHQtc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGFjci1hc3Npc3QtcmVwb3J0LXRleHQgW3JlcG9ydFRleHRdPVwicmVzdWx0VGV4dFwiPjwvYWNyLWFzc2lzdC1yZXBvcnQtdGV4dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2RsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRpbmctci0xMCBzY3JvbGxcIiBhY3JEeW5hbWljSGVpZ2h0RGlyZWN0aXZlIFtzaW11bGF0b3JFbGVtZW50XT1cInNpbXVsYXRvclJlc3VsdHNCbG9ja1wiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCI+XHJcbiAgICAgICAgICAgICAgICA8YWNyLWFzc2lzdC1kYXRhLWVsZW1lbnQgW2RhdGFFbGVtZW50c109XCJkYXRhRWxlbWVudHNcIiBbdGVtcGxhdGVQYXJ0aWFsXT1cInRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtlbmRQb2ludFhNTFN0cmluZ109XCJ0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmdcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiIFt4bWxDb250ZW50XT1cInRlbXBsYXRlLnhtbENvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAocmV0dXJuUmVwb3J0VGV4dCk9J3JlY2lldmVSZXBvcnRUZXh0KCRldmVudCknIFtpbnB1dFZhbHVlc109XCJpbnB1dFZhbHVlc1wiIFtpc1Jlc2V0XT1cImlzUmVzZXRcIlxyXG4gICAgICAgICAgICAgICAgICAocmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkKT0ncmVjaXZlZE9uRGF0YUVsZW1lbnRDaGFuZ2VkKCRldmVudCknIChyZXR1cm5FeGVjdXRpb25IaXN0b3J5KT0ncmVjaWV2ZWRFeGVjdXRpb25IaXN0b3J5KCRldmVudCknPjwvYWNyLWFzc2lzdC1kYXRhLWVsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgaWQ9XCJyaWdodFJlcG9ydFRleHRQb3NpdGlvblwiICpuZ0lmPVwicmVwb3J0VGV4dFBvc2l0aW9uID09PSBwb3NpdGlvbi5SaWdodFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1tZC02IGNvbC1sZy02XCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWJsb2NrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBib3gtc29saWQgbWFyZ2luLWItMFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlc2V0QnV0dG9uID09IHRydWVcIiBjbGFzcz1cIndpdGgtYm9yZGVyIHRleHQtcmlnaHQgcGFkZGluZy01IHBhZGRpbmctci0xMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldEVsZW1lbnRzKClcIiBjbGFzcz1cImJ0biBidG4teHMgYnRuLXByaW1hcnlcIj5SZXNldCBWYWx1ZXM8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWZvcm1cIiBjbGFzcz1cInBhZGRpbmctci0xMCBkaXYtc2ltdWxhdG9yLWZvcm0taGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgIDxhY3ItYXNzaXN0LWRhdGEtZWxlbWVudCBbZGF0YUVsZW1lbnRzXT1cImRhdGFFbGVtZW50c1wiIFt0ZW1wbGF0ZVBhcnRpYWxdPVwidGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsXCJcclxuICAgICAgICAgICAgICAgICAgW2VuZFBvaW50WE1MU3RyaW5nXT1cInRlbXBsYXRlLmVuZFBvaW50c1N0cmluZ1wiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCIgW3htbENvbnRlbnRdPVwidGVtcGxhdGUueG1sQ29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgIChyZXR1cm5SZXBvcnRUZXh0KT0ncmVjaWV2ZVJlcG9ydFRleHQoJGV2ZW50KScgW2lucHV0VmFsdWVzXT1cImlucHV0VmFsdWVzXCIgW2lzUmVzZXRdPVwiaXNSZXNldFwiXHJcbiAgICAgICAgICAgICAgICAgIChyZXR1cm5EYXRhRWxlbWVudENoYW5nZWQpPSdyZWNpdmVkT25EYXRhRWxlbWVudENoYW5nZWQoJGV2ZW50KScgKHJldHVybkV4ZWN1dGlvbkhpc3RvcnkpPSdyZWNpZXZlZEV4ZWN1dGlvbkhpc3RvcnkoJGV2ZW50KSc+PC9hY3ItYXNzaXN0LWRhdGEtZWxlbWVudD5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLW1kLTYgY29sLWxnLTZcIj5cclxuICAgICAgPGRpdiAjc2ltdWxhdG9yUmVzdWx0c0Jsb2NrPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXN1bHRUZXh0ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3ggYm94LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXIgd2l0aC1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj5SZXBvcnQgVGV4dDwvaDM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10b29scyBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYm94LXRvb2wgYnRuLXJlcG9ydC10ZXh0XCIgKGNsaWNrKT1cImNvbGxhcHNlUmVwb3J0VGV4dCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGlkPVwiaWNvbl9yZXBvcnR0ZXh0XCIgY2xhc3M9XCJmYSBmYS1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImJvZHlfcmVwb3J0dGV4dFwiIGNsYXNzPVwiYm94LWJvZHkgcmVwb3J0LXRleHRcIj5cclxuICAgICAgICAgICAgICA8ZGw+XHJcbiAgICAgICAgICAgICAgICA8YWNyLWFzc2lzdC1yZXBvcnQtdGV4dCBbcmVwb3J0VGV4dF09XCJyZXN1bHRUZXh0XCI+PC9hY3ItYXNzaXN0LXJlcG9ydC10ZXh0PlxyXG4gICAgICAgICAgICAgIDwvZGw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLW1kLTYgY29sLWxnLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dLZXlEaWFncmFtID09PSB0cnVlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBtYXJnaW4tYi0wXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlciB3aXRoLWJvcmRlclwiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj5LZXkgSW1hZ2VzPC9oMz5cclxuICAgICAgICAgICAgPGlucHV0ICNpbWFnZVVwbG9hZCBpZD1cImRpYWdyYW1VcGxvYWRcIiBjbGFzcz1cImhpZGRlblwiIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG11bHRpcGxlIChjaGFuZ2UpPVwiY2hhbmdlTGlzdGVuZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGlhZ3JhbVVwbG9hZFwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJnLW9saXZlIG1hcmdpbi0xMFwiIHRpdGxlPVwiQ2hvb3NlIERpYWdyYW1zXCI+Q2hvb3NlIGFcclxuICAgICAgICAgICAgICBEaWFncmFtPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHQgcGFkZGluZy1sLTVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYm94LXRvb2xcIiBkYXRhLXdpZGdldD1cImNvbGxhcHNlXCIgKGNsaWNrKT1cImNvbGxhcHNlS2V5RGlhZ3JhbSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBpZD1cImljb25fa2V5ZGlhZ3JhbVwiIGNsYXNzPVwiZmEgZmEtbWludXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodCBwYWRkaW5nLWwtNVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi16b29tIGJ0bi1zbVwiIG9uY2xpY2s9XCJ6b29tSW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtcGx1cyBmYS1sZ1wiPjwvaT5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0IHBhZGRpbmctbC01XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXpvb20gYnRuLXNtXCIgb25jbGljaz1cInpvb21PdXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtbWludXMgZmEtbGdcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIWlzSW52YWxpZEZpbGVcIiBjbGFzcz1cImVycm9yLW1zZ1wiPk9ubHkgaW1hZ2UgZmlsZXMgYXJlIHN1cHBvcnRlZCAhISE8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBpZD1cImJvZHlfa2V5ZGlhZ3JhbVwiIGNsYXNzPVwiYm94LWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImNhcm91c2VsLWV4YW1wbGUtZ2VuZXJpY1wiIGNsYXNzPVwiY2Fyb3VzZWwgc2xpZGUgc2Nyb2xsXCIgZGF0YS1pbnRlcnZhbD1cImZhbHNlXCIgZGF0YS1yaWRlPVwiY2Fyb3VzZWxcIlxyXG4gICAgICAgICAgICAgIGFjckR5bmFtaWNIZWlnaHREaXJlY3RpdmUgW2Nhcm91c2VsRWxlbWVudF09XCJzaW11bGF0b3JSZXN1bHRzQmxvY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRpYWdyYW0gb2Yga2V5RGlhZ3JhbXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0gem9vbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogZGlhZ3JhbS5rZXlEaWFncmFtfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkcmFnLXNjcm9sbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgZHJhZy1zY3JvbGwtaXRlbSBpZD1cIm1hcF9pZF97eyBpIH19XCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZSBpbWctZGVjaXNzaW9uVHJlZVwiIHNyYz1cInt7IGRpYWdyYW0ubG9jYXRpb24gfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2RyYWctc2Nyb2xsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXlEaWFncmFtcyAmJiBrZXlEaWFncmFtcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxlZnQgY2Fyb3VzZWwtY29udHJvbFwiIGhyZWY9XCIjY2Fyb3VzZWwtZXhhbXBsZS1nZW5lcmljXCIgZGF0YS1zbGlkZT1cInByZXZcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHNsaWRlLWxlZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIiBocmVmPVwiI2Nhcm91c2VsLWV4YW1wbGUtZ2VuZXJpY1wiIGRhdGEtc2xpZGU9XCJuZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHQgc2xpZGUtcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPmAsXHJcbiAgc3R5bGVzOiBbYGAsIGAucmVxdWlyZWQtZmllbGR7Y29sb3I6cmVkfS5wYWRkaW5nLWwtNXtwYWRkaW5nLWxlZnQ6NXB4fS53aGl0ZXNwYWNle21hcmdpbi1sZWZ0OjVweH0ubWF4LXctaC0xMDB7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jYXJvdXNlbC1jb250cm9sPi5mYXtmb250LXNpemU6NDBweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3otaW5kZXg6NTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOi0yMHB4fS5jYXJvdXNlbC1jb250cm9sLmxlZnR7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LmNhcm91c2VsLWNvbnRyb2wubGVmdCwuY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuMDAwMSkgMCxyZ2JhKDAsMCwwLC41KSAxMDAlKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsO292ZXJmbG93LXg6aGlkZGVufS5kaXYtc2ltdWxhdG9yLWZvcm0taGVpZ2h0e2hlaWdodDpjYWxjKDEwMHZoIC0gMTAwcHgpO292ZXJmbG93LXk6c2Nyb2xsO292ZXJmbG93LXg6aGlkZGVufS5kaXYtcmVwb3J0LXRleHQtc2Nyb2xse292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzttYXgtaGVpZ2h0OmNhbGMoMTAwdmggLSAzMDBweCl9LnBhZGRpbmctci0xMHtwYWRkaW5nLXJpZ2h0OjEwcHh9LnNsaWRlLWxlZnR7bGVmdDozMHB4fS5zbGlkZS1yaWdodHtyaWdodDozMHB4fWhye21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHh9LndoaXRlLXNwYWNlLWxpbmV7d2hpdGUtc3BhY2U6cHJlLWxpbmU7d29yZC13cmFwOmJyZWFrLXdvcmR9cHttYXJnaW46MCAwIDEwcHh9LmZvcm0tY29udHJvbHtib3JkZXItcmFkaXVzOjA7Ym94LXNoYWRvdzpub25lO2JvcmRlci1jb2xvcjojZDJkNmRlfWg0Lm1vZGFsLXRpdGxlLmZsb2F0LWxlZnR7ZmxvYXQ6bGVmdH0ubWFyZ2luLWItMHttYXJnaW4tYm90dG9tOjB9LmZvbnQtd2VpZ2h0LTQwMHtmb250LXdlaWdodDo0MDB9LmN1c3RvbS1yYWRpby1zdHlsZXtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxNXB4fS56b29te3dpZHRoOjEwMCU7b3ZlcmZsb3c6YXV0b30uem9vbSBpbWd7aGVpZ2h0OmF1dG87d2lkdGg6MTAwJTttaW4td2lkdGg6MTAwJTttYXgtd2lkdGg6aW5oZXJpdCFpbXBvcnRhbnR9LmJ0bi16b29te2JhY2tncm91bmQtY29sb3I6I2Y0ZjRmNDtjb2xvcjojNDQ0O2JvcmRlci1jb2xvcjojZGRkfS5idG4tem9vbS5ob3ZlciwuYnRuLXpvb206YWN0aXZlLC5idG4tem9vbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTd9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpe2xhYmVsLmNvbnRyb2wtbGFiZWx7cGFkZGluZy1sZWZ0OjIwcHh9fS5wYWRkaW5nLTV7cGFkZGluZzo1cHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFjckFzc2lzdFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgdGVtcGxhdGVDb250ZW50OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd0tleURpYWdyYW06IGJvb2xlYW47XHJcbiAgQElucHV0KCkgcmVwb3J0VGV4dFBvc2l0aW9uOiBSZXBvcnRUZXh0UG9zaXRpb247XHJcbiAgQElucHV0KCkgaW5wdXRWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcmVzZXRCdXR0b246IEJvb2xlYW4gPSB0cnVlO1xyXG4gIEBPdXRwdXQoKSByZXR1cm5FeGVjdXRpb25IaXN0b3J5OiBFdmVudEVtaXR0ZXI8RmluYWxFeGVjdXRlZEhpc3Rvcnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaW5hbEV4ZWN1dGVkSGlzdG9yeT4oKTtcclxuICBAT3V0cHV0KCkgcmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SW5wdXREYXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxJbnB1dERhdGFbXT4oKTtcclxuICBAT3V0cHV0KCkgcmV0dXJuRGVmYXVsdEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlVXBsb2FkJykgaW1hZ2VVcGxvYWQ6IGFueTtcclxuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XHJcbiAgaXNFbXB0eUNvbnRlbnQ6IGJvb2xlYW47XHJcbiAga2V5RGlhZ3JhbXM6IERpYWdyYW1bXTtcclxuICByZXN1bHRUZXh0OiBNYWluUmVwb3J0VGV4dDtcclxuICBpc1Jlc2V0OiBib29sZWFuO1xyXG4gIGRhdGFFbGVtZW50czogQmFzZURhdGFFbGVtZW50W107XHJcbiAgcG9zaXRpb24gPSBSZXBvcnRUZXh0UG9zaXRpb247XHJcbiAgaXNJbnZhbGlkRmlsZTogYm9vbGVhbjtcclxuICBhY2NlcHRlZEZpbGVUeXBlcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2dpZicsICdpbWFnZS9qcGcnLCAnaW1hZ2UvanBlZyddO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlbXBsYXRlTWFuYWdlclNlcnZpY2U6IFRlbXBsYXRlTWFuYWdlclNlcnZpY2UsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Jlc2V0ID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNFbXB0eUNvbnRlbnQgPSB0aGlzLnRlbXBsYXRlQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudGVtcGxhdGVDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlucHV0VmFsdWVzLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICB0aGlzLmlucHV0RGF0YSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuaXNFbXB0eUNvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5wdXREYXRhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMuaW5wdXREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWVzID0gSlNPTi5wYXJzZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmltYWdlVXBsb2FkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pbWFnZVVwbG9hZC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyU2VydmljZS5nZXRUZW1wbGF0ZSh0aGlzLnRlbXBsYXRlQ29udGVudCk7XHJcbiAgICAvLyB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnRlbXBsYXRlKTtcclxuICAgIGlmICh0aGlzLmlucHV0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlVGVzdENhc2VEYXRhKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnRlbXBsYXRlKTtcclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHM7XHJcbiAgICB0aGlzLmtleURpYWdyYW1zID0gbmV3IEFycmF5PERpYWdyYW0+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVtcGxhdGUubWV0YWRhdGEuZGlhZ3JhbXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXcgRGlhZ3JhbSgpO1xyXG4gICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy50ZW1wbGF0ZS5tZXRhZGF0YS5kaWFncmFtc1tpbmRleF0ubGFiZWw7XHJcbiAgICAgIGVsZW1lbnQubG9jYXRpb24gPSB0aGlzLmltYWdlUGF0aCArICcvJyArIHRoaXMudGVtcGxhdGUubWV0YWRhdGEuZGlhZ3JhbXNbaW5kZXhdLmxvY2F0aW9uO1xyXG4gICAgICBlbGVtZW50LmtleURpYWdyYW0gPSB0aGlzLnRlbXBsYXRlLm1ldGFkYXRhLmRpYWdyYW1zW2luZGV4XS5rZXlEaWFncmFtO1xyXG4gICAgICB0aGlzLmtleURpYWdyYW1zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRUZXh0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRFbGVtZW50cygpIHtcclxuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlTWFuYWdlclNlcnZpY2UuZ2V0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZUNvbnRlbnQpO1xyXG4gICAgdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmluaXRpYWxpemUodGhpcy50ZW1wbGF0ZSk7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzKTtcclxuICAgIHRoaXMucmVzdWx0VGV4dCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucmV0dXJuRGVmYXVsdEVsZW1lbnRzLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHJlY2lldmVSZXBvcnRUZXh0KHRleHRSZXBvcnQ6IE1haW5SZXBvcnRUZXh0KSB7XHJcbiAgICB0aGlzLnJlc3VsdFRleHQgPSB0ZXh0UmVwb3J0O1xyXG4gIH1cclxuXHJcbiAgcmVjaWV2ZWRFeGVjdXRpb25IaXN0b3J5KGZpbmFsRXhlY3V0aW9uSGlzdG9yeTogRmluYWxFeGVjdXRlZEhpc3RvcnkpIHtcclxuICAgIHRoaXMucmV0dXJuRXhlY3V0aW9uSGlzdG9yeS5lbWl0KGZpbmFsRXhlY3V0aW9uSGlzdG9yeSk7XHJcbiAgfVxyXG4gIHJlY2l2ZWRPbkRhdGFFbGVtZW50Q2hhbmdlZChkYXRhOiBJbnB1dERhdGFbXSkge1xyXG4gICAgdGhpcy5yZXR1cm5EYXRhRWxlbWVudENoYW5nZWQuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUxpc3RlbmVyKGV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSW52YWxpZEZpbGUgPSBmYWxzZTtcclxuICAgIHRoaXMua2V5RGlhZ3JhbXMgPSBuZXcgQXJyYXk8RGlhZ3JhbT4oKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICBjb25zdCBkaWFncmFtID0gbmV3IERpYWdyYW0oKTtcclxuICAgICAgZGlhZ3JhbS5sYWJlbCA9IGV2ZW50LnRhcmdldC5maWxlc1tpXS5uYW1lO1xyXG4gICAgICBkaWFncmFtLmtleURpYWdyYW0gPSBpID09PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKCEodGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5maWxlc1tpXS50eXBlKSA+IC0xKSkge1xyXG4gICAgICAgIHRoaXMuaXNJbnZhbGlkRmlsZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQxOiBhbnkpID0+IHtcclxuICAgICAgICBkaWFncmFtLmxvY2F0aW9uID0gcmVhZGVyLnJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZXZlbnQudGFyZ2V0LmZpbGVzW2ldKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoZXZlbnQxOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmtleURpYWdyYW1zLnB1c2goZGlhZ3JhbSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZUtleURpYWdyYW0oKSB7XHJcbiAgICBpZiAoJCgnI2ljb25fa2V5ZGlhZ3JhbScpLmhhc0NsYXNzKCdmYSBmYS1taW51cycpKSB7XHJcbiAgICAgICQoJyNpY29uX2tleWRpYWdyYW0nKS5yZW1vdmVDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2ljb25fa2V5ZGlhZ3JhbScpLmFkZENsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNib2R5X2tleWRpYWdyYW0nKS5jc3Moe1xyXG4gICAgICAgICdkaXNwbGF5JzogJ25vbmUnXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnI2ljb25fa2V5ZGlhZ3JhbScpLnJlbW92ZUNsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNpY29uX2tleWRpYWdyYW0nKS5hZGRDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2JvZHlfa2V5ZGlhZ3JhbScpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZVJlcG9ydFRleHQoKSB7XHJcbiAgICBpZiAoJCgnI2ljb25fcmVwb3J0dGV4dCcpLmhhc0NsYXNzKCdmYSBmYS1taW51cycpKSB7XHJcbiAgICAgICQoJyNpY29uX3JlcG9ydHRleHQnKS5yZW1vdmVDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2ljb25fcmVwb3J0dGV4dCcpLmFkZENsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNib2R5X3JlcG9ydHRleHQnKS5jc3Moe1xyXG4gICAgICAgICdkaXNwbGF5JzogJ25vbmUnXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnI2ljb25fcmVwb3J0dGV4dCcpLnJlbW92ZUNsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNpY29uX3JlcG9ydHRleHQnKS5hZGRDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2JvZHlfcmVwb3J0dGV4dCcpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZVRlc3RDYXNlRGF0YSgpIHtcclxuICAgIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzLmZvckVhY2goZGF0YWVFbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZXMuZmlsdGVyKHggPT4geC5kYXRhRWxlbWVudElkLnRvVXBwZXJDYXNlKCkgPT09IGRhdGFlRWxlbWVudC5pZC50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgaWYgKGlucHV0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpbnB1dFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoZGF0YWVFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ0Nob2ljZURhdGFFbGVtZW50JyB8fCBkYXRhZUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcpIHtcclxuICAgICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSA8Q2hvaWNlRGF0YUVsZW1lbnQ+ZGF0YWVFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZVswXS5kYXRhRWxlbWVudFZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgY2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvLmZvckVhY2goY2hvaWNlID0+IHtcclxuICAgICAgICAgICAgICBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLnZhbHVlLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goY2hvaWNlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlucHV0VmFsdWVbMF0uZGF0YUVsZW1lbnRWYWx1ZSA9IHZhbHVlcztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNob2ljZUVsZW1lbnQuY2hvaWNlSW5mby5mb3JFYWNoKGNob2ljZSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNob2ljZS52YWx1ZS50b1VwcGVyQ2FzZSgpID09PSBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUgPSBjaG9pY2UudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YWVFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IGlucHV0VmFsdWVbMF0uZGF0YUVsZW1lbnRWYWx1ZTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb2RpbmcgfSBmcm9tICcuL2NvZGluZy5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29kYWJsZUNvbmNlcHQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgY29kaW5nOiBDb2RpbmdbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmNvZGluZyA9IG5ldyBBcnJheTxDb2Rpbmc+KCk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENvZGluZ1N5c3RlbSB7XHJcbiAgICBlbGVtZW50OiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBDb2RpbmdWZXJzaW9uIHtcclxuICAgIGVsZW1lbnQ6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgQ29kaW5nQ29kZSB7XHJcbiAgICBlbGVtZW50OiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIENvZGluZ0Rpc3BsYXkge1xyXG4gICAgZWxlbWVudDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQ29kaW5nVXNlclNlbGVjdGVkIHtcclxuICAgIGVsZW1lbnQ6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29kaW5nU3lzdGVtIH0gZnJvbSAnLi9jb2RpbmdTeXN0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RpbmdWZXJzaW9uIH0gZnJvbSAnLi9jb2RpbmcudmVyc2lvbic7XHJcbmltcG9ydCB7IENvZGluZ0NvZGUgfSBmcm9tICcuL2NvZGluZ0NvZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RpbmdEaXNwbGF5IH0gZnJvbSAnLi9jb2RpbmdEaXNwbGF5Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29kaW5nVXNlclNlbGVjdGVkIH0gZnJvbSAnLi9jb2RpbmdVc2VyU2VsZWN0ZWQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvZGluZyB7XHJcbiAgICBjb2RpbmdTeXN0ZW06IENvZGluZ1N5c3RlbTtcclxuICAgIGNvZGluZ1ZlcnNpb246IENvZGluZ1ZlcnNpb247XHJcbiAgICBjb2RpbmdDb2RlOiBDb2RpbmdDb2RlO1xyXG4gICAgY29kaW5nRGlzcGxheTogQ29kaW5nRGlzcGxheTtcclxuICAgIGNvZGluZ1VzZXJTZWxlY3RlZDogQ29kaW5nVXNlclNlbGVjdGVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgdGhpcy5jb2RpbmdTeXN0ZW0gPSBuZXcgQ29kaW5nU3lzdGVtKCk7XHJcbiAgICAgICB0aGlzLmNvZGluZ1ZlcnNpb24gPSBuZXcgQ29kaW5nVmVyc2lvbigpO1xyXG4gICAgICAgdGhpcy5jb2RpbmdDb2RlID0gbmV3IENvZGluZ0NvZGUoKTtcclxuICAgICAgIHRoaXMuY29kaW5nRGlzcGxheSA9IG5ldyBDb2RpbmdEaXNwbGF5KCk7XHJcbiAgICAgICB0aGlzLmNvZGluZ1VzZXJTZWxlY3RlZCA9IG5ldyBDb2RpbmdVc2VyU2VsZWN0ZWQoKTtcclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RhdGFlbGVtZW50LWNyZWF0aW9uLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kaWFncmFtLm1vZGVsJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29kYWJsZUNvbmNlcHQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RhYmxlQ29uY2VwdC5tb2RlbCc7XHJcbmltcG9ydCB7IENvZGluZyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZy5tb2RlbCc7XHJcbmltcG9ydCB7IENvZGluZ1N5c3RlbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZ1N5c3RlbS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgaW1wbGVtZW50cyBEYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSB7XHJcbiAgZWxlbWVudFR5cGU6IHN0cmluZztcclxuICBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudDtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSkge1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0dXJuRGlhZ3JhbShkaWFncmFtSlNPTjogYW55KTogRGlhZ3JhbSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YURpYWdyYW0gPSBuZXcgRGlhZ3JhbSgpO1xyXG4gICAgbWV0YWRhdGFEaWFncmFtLmRpc3BsYXlTZXF1ZW5jZSA9IGRpYWdyYW1KU09OLkF0dHIuRGlzcGxheVNlcXVlbmNlO1xyXG4gICAgbWV0YWRhdGFEaWFncmFtLmtleURpYWdyYW0gPSBkaWFncmFtSlNPTi5BdHRyLklzS2V5RGlhZ3JhbSA/IGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtIDogZmFsc2U7XHJcbiAgICBtZXRhZGF0YURpYWdyYW0ubGFiZWwgPSBkaWFncmFtSlNPTi5MYWJlbDtcclxuICAgIG1ldGFkYXRhRGlhZ3JhbS5sb2NhdGlvbiA9IGRpYWdyYW1KU09OLkxvY2F0aW9uO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhRGlhZ3JhbTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlQmFzaWNEYXRhKGRhdGE6IGFueSwgZGF0YUVsZW1lbnQ6IEJhc2VEYXRhRWxlbWVudCkge1xyXG4gICAgZGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID0gdGhpcy5lbGVtZW50VHlwZTtcclxuICAgIGRhdGFFbGVtZW50LmRpc3BsYXlTZXF1ZW5jZSA9IGRhdGEuQXR0ci5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICBkYXRhRWxlbWVudC5pZCA9IGRhdGEuQXR0ci5JZDtcclxuICAgIGRhdGFFbGVtZW50LmlzUmVxdWlyZWQgPSBkYXRhLkF0dHIuSXNSZXF1aXJlZCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQubGFiZWwgPSBkYXRhLkxhYmVsO1xyXG4gICAgZGF0YUVsZW1lbnQuaGludCA9IGRhdGEuSGludDtcclxuICAgIGRhdGFFbGVtZW50LmNkZUlkID0gZGF0YS5BdHRyLkNkZUlkO1xyXG4gICAgaWYgKGRhdGEuRGlhZ3JhbXMpIHtcclxuICAgICAgZGF0YUVsZW1lbnQuZGlhZ3JhbXMgPSB0aGlzLmRpYWdyYW1TZXJ2aWNlLnJldHVybkRpYWdyYW1zKGRhdGEuRGlhZ3JhbXMuRGlhZ3JhbSk7XHJcbiAgICB9XHJcbiAgICBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICBkYXRhRWxlbWVudC5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICBkYXRhRWxlbWVudC5pc0VkaXRhYmxlID0gZGF0YS5BdHRyLkVkaXRhYmxlID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgZGF0YUVsZW1lbnQuaGFzcHJlZmlsbGVkID0gZGF0YS5BdHRyLkhhc3ByZWZpbGxlZCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQub3V0cHV0ID0gZGF0YS5BdHRyLk91dHB1dCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQudW5pdCA9IGRhdGEuQXR0ci5Vbml0ICE9PSB1bmRlZmluZWQgPyBkYXRhLkF0dHIuVW5pdCA6ICcnO1xyXG4gICAgZGF0YUVsZW1lbnQuc291cmNlRmlsbGVkID0gZGF0YS5BdHRyLlNvdXJjZUZpbGxlZDtcclxuXHJcbiAgICBkYXRhRWxlbWVudC5kaXNwbGF5U2VxdWVuY2VPdmVycmlkZXIgPSBkYXRhLkF0dHIuRGlzcGxheVNlcXVlbmNlO1xyXG4gICAgZGF0YUVsZW1lbnQuaXNSZXF1aXJlZE92ZXJyaWRlciA9IGRhdGEuQXR0ci5Jc1JlcXVpcmVkID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgaWYgKGRhdGEuQ29kYWJsZUNvbmNlcHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkYXRhRWxlbWVudC5jb2RhYmxlQ29uY2VwdCA9IG5ldyBDb2RhYmxlQ29uY2VwdCgpO1xyXG4gICAgICBkYXRhRWxlbWVudC5jb2RhYmxlQ29uY2VwdC5uYW1lID0gZGF0YS5Db2RhYmxlQ29uY2VwdC5BdHRyLk5hbWU7XHJcbiAgICAgIGlmIChkYXRhLkNvZGFibGVDb25jZXB0LkNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGRhdGEuQ29kYWJsZUNvbmNlcHQuQ29kaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBkYXRhLkNvZGFibGVDb25jZXB0LkNvZGluZykge1xyXG4gICAgICAgICAgY29uc3QgX2NvZGluZyA9IG5ldyBDb2RpbmcoKTtcclxuICAgICAgICAgIF9jb2RpbmcuY29kaW5nU3lzdGVtLnZhbHVlID0gY29kaW5nLlN5c3RlbS5BdHRyLlZhbHVlO1xyXG4gICAgICAgICAgX2NvZGluZy5jb2RpbmdWZXJzaW9uLnZhbHVlID0gY29kaW5nLlZlcnNpb24uQXR0ci5WYWx1ZTtcclxuICAgICAgICAgIF9jb2RpbmcuY29kaW5nQ29kZS52YWx1ZSA9IGNvZGluZy5Db2RlLkF0dHIuVmFsdWU7XHJcbiAgICAgICAgICBfY29kaW5nLmNvZGluZ0Rpc3BsYXkudmFsdWUgPSBjb2RpbmcuRGlzcGxheS5BdHRyLlZhbHVlO1xyXG4gICAgICAgICAgLy8gaWYgKGNvZGluZy5Vc2VyU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBfY29kaW5nLmNvZGluZ1VzZXJTZWxlY3RlZC52YWx1ZSA9IGNvZGluZy5Vc2VyU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCA/IGNvZGluZy5Vc2VyU2VsZWN0ZWQuQXR0ci5WYWx1ZSA6IG51bGw7XHJcbiAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY29kYWJsZUNvbmNlcHQuY29kaW5nLnB1c2goX2NvZGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuL2NvbmRpdGlvbmFscHJvcGVydHkubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RhYmxlQ29uY2VwdCB9IGZyb20gJy4vY29kYWJsZUNvbmNlcHQubW9kZWwnO1xyXG5cclxuZXhwb3J0ICBjbGFzcyBCYXNlRGF0YUVsZW1lbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgaXNSZXF1aXJlZDogQm9vbGVhbiA9IHRydWU7XHJcbiAgZGlzcGxheVNlcXVlbmNlOiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoaW50OiBzdHJpbmc7XHJcbiAgZGlhZ3JhbXM6IERpYWdyYW1bXTtcclxuICB2b2ljZUNvbW1hbmQ6IFN0cmluZztcclxuICBjdXJyZW50VmFsdWU6IGFueTtcclxuICBkYXRhRWxlbWVudFR5cGU6IHN0cmluZztcclxuICBpc1Zpc2libGU6IEJvb2xlYW4gPSB0cnVlO1xyXG4gIGRlZmF1bHRWYWx1ZTogYW55O1xyXG4gIGNkZUlkOiBzdHJpbmc7XHJcbiAgY29uZGl0aW9uYWxQcm9wZXJ0aWVzOiBDb25kaXRpb25hbFByb3BlcnR5W107XHJcbiAgaXNFZGl0YWJsZTogQm9vbGVhbiA9IHRydWU7XHJcbiAgaGFzcHJlZmlsbGVkOiBCb29sZWFuID0gZmFsc2U7XHJcbiAgb3V0cHV0OiBCb29sZWFuID0gZmFsc2U7XHJcbiAgdW5pdDogc3RyaW5nO1xyXG4gIHNvdXJjZUZpbGxlZDogc3RyaW5nO1xyXG4gIGNvZGFibGVDb25jZXB0OiBDb2RhYmxlQ29uY2VwdDtcclxuXHJcbiAgaXNSZXF1aXJlZE92ZXJyaWRlcjogQm9vbGVhbiA9IHRydWU7XHJcbiAgZGlzcGxheVNlcXVlbmNlT3ZlcnJpZGVyOiBudW1iZXI7XHJcbn1cclxuIiwiaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEltYWdlTWFwIH0gZnJvbSAnLi9pbWFnZS1tYXAubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VJbmZvIH0gZnJvbSAnLi9jaG9pY2VJbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgQ2hvaWNlIH0gZnJvbSAnLi9jaG9pY2UubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZURhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50ICB7XHJcblxyXG4gIGNob2ljZUluZm86IENob2ljZVtdO1xyXG4gIGltYWdlTWFwOiBJbWFnZU1hcDtcclxuICBhbGxvd0ZyZWV0ZXh0ID0gZmFsc2U7XHJcbiAgQ2hvaWNlTm90UmVsZXZhbnQ6IHN0cmluZ1tdO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBDaG9pY2Uge1xyXG5cclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgZGVmYXVsdDogYm9vbGVhbjtcclxuICAgIGhpbnQ6IHN0cmluZztcclxuICAgIHJlcG9ydFRleHQ6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgSW1hZ2VFbGVtZW50cyB7XHJcbiAgbG9jYXRpb246IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbWFnZUVsZW1lbnRzIH0gZnJvbSAnLi9pbWFnZS1lbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IERyYXdTdHlsZSB9IGZyb20gJy4vZHJhd1N0eWxlLm1vZGVsJztcclxuaW1wb3J0IHtBcmVhTWFwfSBmcm9tICcuL2FyZWEtbWFwLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJbWFnZU1hcCBleHRlbmRzIEltYWdlRWxlbWVudHMge1xyXG5cclxuICBkcmF3U3R5bGU6IERyYXdTdHlsZTtcclxuICBtYXA6IEFyZWFNYXA7XHJcblxyXG4gIH1cclxuIiwiXHJcblxyXG5leHBvcnQgY2xhc3MgQXJlYSB7XHJcbiAgc2hhcGU6IHN0cmluZztcclxuICBjb29yZHM6IHN0cmluZztcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEFyZWEgfSBmcm9tICcuL2FyZWEtbW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFyZWFNYXAge1xyXG4gICAgYXJlYXM6IEFyZWFbXTtcclxufVxyXG4iLCJpbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4uLy4uL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXBvc2l0ZUNvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi8uLi9jb25kaXRpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgbm90UmVsZXZhbnREYXRhRWxlbWVudHM6IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzO1xyXG4gICAgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICAgIGlzUmVsZXZhbnQ6IGJvb2xlYW47XHJcbiAgICBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gICAgRGlzcGxheVNlcXVlbmNlOiBudW1iZXI7XHJcbiAgICBDaG9pY2VOb3RSZWxldmFudDogc3RyaW5nW107XHJcbiAgICBNaW5pbXVtOiBudW1iZXI7XHJcbiAgICBNYXhpbXVtOiBudW1iZXI7XHJcbiAgICBNaW5pbXVtRGF5OiBudW1iZXI7XHJcbiAgICBNYXhpbXVtRGF5OiBudW1iZXI7XHJcbiAgICBNaW5pbXVtSG91cnM6IG51bWJlcjtcclxuICAgIE1heGltdW1Ib3VyczogbnVtYmVyO1xyXG4gICAgTWluaW11bU1pbnV0ZXM6IG51bWJlcjtcclxuICAgIE1heG1pbXVtTWludXRlczogbnVtYmVyO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWVsZW1lbnQtY3JlYXRpb24tYmFzZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ2hvaWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLm1vZGVsJztcclxuaW1wb3J0IHsgSW1hZ2VNYXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9pbWFnZS1tYXAubW9kZWwnO1xyXG5pbXBvcnQgeyBBcmVhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYXJlYS1tb2RlbCc7XHJcbmltcG9ydCB7IEFyZWFNYXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9hcmVhLW1hcC5tb2RlbCc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25hbFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmFuY2ggfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsIHByaXZhdGUgYXJyYXlDaGVja2VyU2VydmljZTogQXJyYXlDaGVja2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoZGlhZ3JhbVNlcnZpY2UpO1xyXG4gICAgdGhpcy5lbGVtZW50VHlwZSA9ICdDaG9pY2VEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHVybkNob2ljZShjaG9pY2VJdGVtOiBhbnkpOiBDaG9pY2Uge1xyXG4gICAgY29uc3QgY2hvaWNlID0gbmV3IENob2ljZSgpO1xyXG4gICAgY2hvaWNlLmxhYmVsID0gY2hvaWNlSXRlbS5MYWJlbDtcclxuICAgIGNob2ljZS52YWx1ZSA9IGNob2ljZUl0ZW0uVmFsdWU7XHJcbiAgICBjaG9pY2UuaGludCA9IGNob2ljZUl0ZW0uSGludDtcclxuICAgIGNob2ljZS5yZXBvcnRUZXh0ID0gY2hvaWNlSXRlbS5SZXBvcnRUZXh0O1xyXG4gICAgY2hvaWNlLmRlZmF1bHQgPSBmYWxzZTtcclxuICAgIGlmIChjaG9pY2VJdGVtLkF0dHIgJiYgY2hvaWNlSXRlbS5BdHRyLklzRGVmYXVsdCkge1xyXG4gICAgICBjaG9pY2UuZGVmYXVsdCA9IGNob2ljZUl0ZW0uQXR0ci5Jc0RlZmF1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hvaWNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5BcmVhKGFyZWFKU09OOiBhbnkpOiBBcmVhIHtcclxuICAgIGNvbnN0IGFyZWEgPSBuZXcgQXJlYSgpO1xyXG4gICAgYXJlYS5jaG9pY2VWYWx1ZSA9IGFyZWFKU09OLkF0dHIuQ2hvaWNlVmFsdWU7XHJcbiAgICBhcmVhLmNvb3JkcyA9IGFyZWFKU09OLkF0dHIuQ29vcmRzO1xyXG4gICAgYXJlYS5zaGFwZSA9IGFyZWFKU09OLkF0dHIuU2hhcGU7XHJcbiAgICByZXR1cm4gYXJlYTtcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBDaG9pY2VEYXRhRWxlbWVudCgpO1xyXG4gICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG4gICAgZGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dCA9IGRhdGEuQXR0ci5BbGxvd0ZyZWV0ZXh0ID8gZGF0YS5BdHRyLkFsbG93RnJlZXRleHQgOiBmYWxzZTtcclxuICAgIGNvbnN0IGNob2ljZUl0ZW1zID0gZGF0YS5DaG9pY2VJbmZvLkNob2ljZTtcclxuICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcclxuICAgIGlmIChjaG9pY2VJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRhdGFFbGVtZW50LmNob2ljZUluZm8gPSBuZXcgQXJyYXk8Q2hvaWNlPigpO1xyXG4gICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkoY2hvaWNlSXRlbXMpKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaG9pY2VJdGVtIG9mIGNob2ljZUl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCBjaG9pY2UgPSB0aGlzLnJldHVybkNob2ljZShjaG9pY2VJdGVtKTtcclxuICAgICAgICAgIGlmIChjaG9pY2UuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaG9pY2UudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jaG9pY2VJbmZvLnB1c2goY2hvaWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY2hvaWNlID0gdGhpcy5yZXR1cm5DaG9pY2UoY2hvaWNlSXRlbXMpO1xyXG4gICAgICAgIGlmIChjaG9pY2UuZGVmYXVsdCkge1xyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hvaWNlLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhRWxlbWVudC5jaG9pY2VJbmZvLnB1c2goY2hvaWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGF0YUVsZW1lbnQuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG4gICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG4gICAgY29uc3QgaW1hZ2VNYXAgPSBkYXRhLkltYWdlTWFwO1xyXG4gICAgaWYgKGltYWdlTWFwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZGF0YUVsZW1lbnQuaW1hZ2VNYXAgPSBuZXcgSW1hZ2VNYXAoKTtcclxuICAgICAgZGF0YUVsZW1lbnQuaW1hZ2VNYXAubG9jYXRpb24gPSBpbWFnZU1hcC5Mb2NhdGlvbjtcclxuICAgICAgY29uc3QgYXJlYU1hcHMgPSBpbWFnZU1hcC5NYXAuQXJlYTtcclxuICAgICAgaWYgKGFyZWFNYXBzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAgPSBuZXcgQXJlYU1hcCgpO1xyXG4gICAgICAgIGRhdGFFbGVtZW50LmltYWdlTWFwLm1hcC5hcmVhcyA9IG5ldyBBcnJheTxBcmVhPigpO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShhcmVhTWFwcykpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgYXJlYU1hcCBvZiBhcmVhTWFwcykge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXMucHVzaCh0aGlzLnJldHVybkFyZWEoYXJlYU1hcCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXMucHVzaCh0aGlzLnJldHVybkFyZWEoYXJlYU1hcHMpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICBpZiAoQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgIC8vIC5Ob3RSZWxldmFudERhdGFFbGVtZW50cy5EYXRhRWxlbWVudFJlZjtcclxuXHJcbiAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSk6IENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgIC8vIHZhciB0ZXN0ID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LkNob2ljZU5vdFJlbGV2YW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICBmb3IgKGNvbnN0IGNob2ljZU5vdFJlbGV2YW50IG9mIGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQpIHtcclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5DaG9pY2VOb3RSZWxldmFudC5wdXNoKGNob2ljZU5vdFJlbGV2YW50LkF0dHIuQ2hvaWNlVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUNob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlICBleHRlbmRzIENob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlLFxyXG4gICAgIGNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2U6IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSwgYXJyYXlDaGVja2VyU2VydmljZSwgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSwgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ011bHRpQ2hvaWNlRGF0YUVsZW1lbnQnO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY0RhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbiAgbWluaW11bTogTnVtYmVyO1xyXG4gIG1heGltdW06IE51bWJlcjtcclxuXHJcbiAgbWluaW11bU92ZXJyaWRlcjogTnVtYmVyO1xyXG4gIG1heGltdW1PdmVycmlkZXI6IE51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL251bWVyaWMtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uYWxQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvbmRpdGlvbmFscHJvcGVydHkubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL25vdHJlbGV2YW50ZGF0YWVsZW1lbnRzLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ051bWVyaWNEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBOdW1lcmljRGF0YUVsZW1lbnQoKTtcclxuICAgIHN1cGVyLnBvcHVsYXRlQmFzaWNEYXRhKGRhdGEsIGRhdGFFbGVtZW50KTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW0gPSBkYXRhLk1pbmltdW07XHJcbiAgICBkYXRhRWxlbWVudC5tYXhpbXVtID0gZGF0YS5NYXhpbXVtO1xyXG5cclxuICAgIGRhdGFFbGVtZW50Lm1heGltdW1PdmVycmlkZXIgPSBkYXRhLk1heGltdW07XHJcbiAgICBkYXRhRWxlbWVudC5taW5pbXVtT3ZlcnJpZGVyID0gZGF0YS5NaW5pbXVtO1xyXG5cclxuICAgIGNvbnN0IENvbmRpdGlvbmFsUHJvcGVydGllcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgaWYgKENvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzID0gbmV3IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzKCk7XHJcbiAgICAgIGNvbnN0IGRhdGFFbGVtZW50UmVmcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAvLyAuTm90UmVsZXZhbnREYXRhRWxlbWVudHMuRGF0YUVsZW1lbnRSZWY7XHJcblxyXG4gICAgICBpZiAoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcyA9IG5ldyBBcnJheTxDb25kaXRpb25hbFByb3BlcnR5PigpO1xyXG4gICAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcy5wdXNoKHRoaXMuR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMuQ29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpOiBDb25kaXRpb25hbFByb3BlcnR5IHtcclxuICAgIGNvbnN0IF9jb25kaXRpb25hbFByb3BlcnR5ID0gbmV3IENvbmRpdGlvbmFsUHJvcGVydHkoKTtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAvLyB2YXIgdGVzdCA9IHRoaXMuY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZS5jcmVhdGVDb21wdXRlZFZhbHVlKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgaWYgKHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5pc0NvbXBvc2l0ZShjb25kaXRpb25hbFByb3BlcnR5KSkge1xyXG4gICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVsZXZhbnQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVsZXZhbnQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlcXVpcmVkO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bSA9IGNvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bTtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxQcm9wZXJ0eTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4vYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEludGVnZXJEYXRhRWxlbWVudCBleHRlbmRzIEJhc2VEYXRhRWxlbWVudCB7XHJcblxyXG4gIG1pbmltdW06IE51bWJlcjtcclxuICBtYXhpbXVtOiBOdW1iZXI7XHJcbiAgbWluaW11bU92ZXJyaWRlcjogTnVtYmVyO1xyXG4gIG1heGltdW1PdmVycmlkZXI6IE51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEludGVnZXJEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2ludGVnZXItZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25hbFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbCc7XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSW50ZWdlckRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIGV4dGVuZHMgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlOiBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlOiBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0ludGVnZXJEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBJbnRlZ2VyRGF0YUVsZW1lbnQoKTtcclxuICAgIHN1cGVyLnBvcHVsYXRlQmFzaWNEYXRhKGRhdGEsIGRhdGFFbGVtZW50KTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW0gPSBkYXRhLk1pbmltdW07XHJcbiAgICBkYXRhRWxlbWVudC5tYXhpbXVtID0gZGF0YS5NYXhpbXVtO1xyXG4gICAgZGF0YUVsZW1lbnQubWF4aW11bU92ZXJyaWRlciA9IGRhdGEuTWF4aW11bTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW1PdmVycmlkZXIgPSBkYXRhLk1pbmltdW07XHJcblxyXG4gICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICBpZiAoQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgIC8vIC5Ob3RSZWxldmFudERhdGFFbGVtZW50cy5EYXRhRWxlbWVudFJlZjtcclxuXHJcbiAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSk6IENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgIC8vIHZhciB0ZXN0ID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW0gPSBjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW07XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtO1xyXG4gICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgSW5wdXREYXRhIHtcclxuICAgIGRhdGFFbGVtZW50SWQ6IHN0cmluZztcclxuICAgIGRhdGFFbGVtZW50TGFiZWw6IHN0cmluZztcclxuICAgIGRhdGFFbGVtZW50VmFsdWU6IGFueTtcclxuICAgIGRhdGFFbGVtZW50RGlzcGxheVZhbHVlOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50TGFiZWwgPSAnJztcclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlID0gJyc7XHJcblxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFZpZXdDaGlsZCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJqZWN0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB7XHJcbiAgICAvLyBPYnNlcnZhYmxlIHN0cmluZyBzb3VyY2VzXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvclNvdXJjZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgICAvLyBPYnNlcnZhYmxlIHN0cmluZyBzdHJlYW1zXHJcbiAgICBzaW11bGF0b3JTb3VyY2UkID0gdGhpcy5zaW11bGF0b3JTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgLy8gU2VydmljZSBtZXNzYWdlIGNvbW1hbmRzXHJcbiAgICBtZXNzYWdlRW1pdHRlcihtaXNzaW9uOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNpbXVsYXRvclNvdXJjZS5uZXh0KG1pc3Npb24pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy90ZW1wbGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IEltYWdlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9pbWFnZS1lbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IEVuZFBvaW50UmVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvZW5kcG9pbnRyZWYubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWN0aW9uSWZWYWx1ZU5vdENvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVDb25kaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vLi4vY29yZS9lbmRwb2ludC90ZW1wbGF0ZS1wYXJ0aWFsJztcclxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvc3JjL2NvbnNvbGUnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3NpbXVsYXRvci1zdGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuaW1wb3J0IHsgSW5wdXREYXRhIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvaW5wdXQtZGF0YS5tb2RlbCc7XHJcbmltcG9ydCB7IEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1jaG9pY2UtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hvaWNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jaG9pY2UtZGF0YS1lbGVtZW50LW1vZGVsJztcclxuLy8gaW1wb3J0IHsgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1udW1lcmljLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9zaW11bGF0b3ItY29tbXVuaWNhdGlvbi5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LWRhdGEtZWxlbWVudCcsXHJcbiAgdGVtcGxhdGU6IGA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBEYXRhRWxlbWVudCBvZiBkYXRhRWxlbWVudHNcIj4gIFxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdDaG9pY2VEYXRhRWxlbWVudCdcclxuICAgIHx8IERhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTnVtZXJpY0RhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdJbnRlZ2VyRGF0YUVsZW1lbnQnIFxyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdNdWx0aUNob2ljZURhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdEYXRlVGltZURhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdEdXJhdGlvbkRhdGFFbGVtZW50JykgXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiRGF0YUVsZW1lbnQuaXNWaXNpYmxlXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXZfe3tEYXRhRWxlbWVudC5pZH19XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnQ2hvaWNlRGF0YUVsZW1lbnQnXCI+XHJcbiAgICAgICAgICA8YWNyLWFzc2lzdC1jaG9pY2UtZWxlbWVudCBbY2hvaWNlRGF0YUVsZW1lbnRdPSdEYXRhRWxlbWVudCcgW2ltYWdlUGF0aF09J2ltYWdlUGF0aCcgKHJldHVybkNob2ljZUVsZW1lbnQpPSdjaG9pY2VTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgIDxhY3ItYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50IFttdWx0aUNob2ljZUVsZW1lbnRdPSdEYXRhRWxlbWVudCcgW2ltYWdlUGF0aF09J2ltYWdlUGF0aCcgKHJldHVybk11bHRpQ2hvaWNlKT0nbXVsdGlTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtbXVsdGktY2hvaWNlLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTnVtZXJpY0RhdGFFbGVtZW50JyB8fCBEYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT0gJ0ludGVnZXJEYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgIDxhY3ItYXNzaXN0LW51bWVyaWMtZWxlbWVudCBbbnVtZXJpY0RhdGFFbGVtZW50XT0nRGF0YUVsZW1lbnQnIFtpbWFnZVBhdGhdPSdpbWFnZVBhdGgnIChyZXR1cm5OdW1lcmljRWxlbWVudCk9J251bWVyaWNTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtbnVtZXJpYy1lbGVtZW50PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJEYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT0gJ0RhdGVUaW1lRGF0YUVsZW1lbnQnXCI+XHJcbiAgICAgICAgICA8YWNyLWFzc2lzdC1kYXRlLXRpbWUtZWxlbWVudCBbZGF0ZVRpbWVEYXRhRWxlbWVudF09J0RhdGFFbGVtZW50Jz48L2Fjci1hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnRHVyYXRpb25EYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgICAgPGFjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudCBbZHVyYXRpb25EYXRhRWxlbWVudF09J0RhdGFFbGVtZW50Jz48L2Fjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj5cclxuYCxcclxuICBzdHlsZXM6IFtgYCwgYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LnBhZGRpbmctbC01e3BhZGRpbmctbGVmdDo1cHh9LndoaXRlc3BhY2V7bWFyZ2luLWxlZnQ6NXB4fS5tYXgtdy1oLTEwMHttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2w+LmZhe2ZvbnQtc2l6ZTo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTIwcHh9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0LC5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1zaW11bGF0b3ItZm9ybS1oZWlnaHR7aGVpZ2h0OmNhbGMoMTAwdmggLSAxMDBweCk7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1yZXBvcnQtdGV4dC1zY3JvbGx7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMwMHB4KX0ucGFkZGluZy1yLTEwe3BhZGRpbmctcmlnaHQ6MTBweH0uc2xpZGUtbGVmdHtsZWZ0OjMwcHh9LnNsaWRlLXJpZ2h0e3JpZ2h0OjMwcHh9aHJ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0ud2hpdGUtc3BhY2UtbGluZXt3aGl0ZS1zcGFjZTpwcmUtbGluZTt3b3JkLXdyYXA6YnJlYWstd29yZH1we21hcmdpbjowIDAgMTBweH0uZm9ybS1jb250cm9se2JvcmRlci1yYWRpdXM6MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiNkMmQ2ZGV9aDQubW9kYWwtdGl0bGUuZmxvYXQtbGVmdHtmbG9hdDpsZWZ0fS5tYXJnaW4tYi0we21hcmdpbi1ib3R0b206MH0uZm9udC13ZWlnaHQtNDAwe2ZvbnQtd2VpZ2h0OjQwMH0uY3VzdG9tLXJhZGlvLXN0eWxle2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnpvb217d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS56b29tIGltZ3toZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO21heC13aWR0aDppbmhlcml0IWltcG9ydGFudH0uYnRuLXpvb217YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O2NvbG9yOiM0NDQ7Ym9yZGVyLWNvbG9yOiNkZGR9LmJ0bi16b29tLmhvdmVyLC5idG4tem9vbTphY3RpdmUsLmJ0bi16b29tOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7bGFiZWwuY29udHJvbC1sYWJlbHtwYWRkaW5nLWxlZnQ6MjBweH19LnBhZGRpbmctNXtwYWRkaW5nOjVweH1gXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFzc2lzdERhdGFFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBkYXRhRWxlbWVudHM6IEJhc2VEYXRhRWxlbWVudFtdO1xyXG4gIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIEVuZHBvaW50cyA9IFtdO1xyXG4gIEBJbnB1dCgpIHRlbXBsYXRlUGFydGlhbDogc3RyaW5nW107XHJcbiAgQElucHV0KCkgZW5kUG9pbnRYTUxTdHJpbmc6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIHhtbENvbnRlbnQ6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcmV0dXJuUmVwb3J0VGV4dDogRXZlbnRFbWl0dGVyPE1haW5SZXBvcnRUZXh0PiA9IG5ldyBFdmVudEVtaXR0ZXI8TWFpblJlcG9ydFRleHQ+KCk7XHJcbiAgQE91dHB1dCgpIHJldHVybkV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50RW1pdHRlcjxGaW5hbEV4ZWN1dGVkSGlzdG9yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbmFsRXhlY3V0ZWRIaXN0b3J5PigpO1xyXG4gIEBPdXRwdXQoKSByZXR1cm5EYXRhRWxlbWVudENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxJbnB1dERhdGFbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElucHV0RGF0YVtdPigpO1xyXG4gIEBJbnB1dCgpIGlzUmVzZXQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaW5wdXRWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcblxyXG4gIG1haW5SZXBvcnRUZXh0T2JqOiBNYWluUmVwb3J0VGV4dDtcclxuICBzaW11bGF0b3JTdGF0ZTogU2ltdWxhdG9yU3RhdGU7XHJcbiAgZGF0YUVsZW1lbnRWYWx1ZXM6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgY29tcGFyaXNvblZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBzZWxlY3RlZENob2ljZVZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBleGVjdXRlZFJlc3VsdElkczogYW55W10gPSBbXTtcclxuICBleGVjdXRlZFJlc3VsdEhpc3RvcmllczogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlOiBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2Uuc2ltdWxhdG9yU3RhdGVDaGFuZ2VkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvclN0YXRlID0gbWVzc2FnZSBhcyBTaW11bGF0b3JTdGF0ZTtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlcyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5nZXRBbGxEYXRhRWxlbWVudFZhbHVlcygpO1xyXG4gICAgICBjb25zdCBub25SZWxldmFudElEcyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5ldmFsdWF0ZURlY2lzaW9uQW5kQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50IG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgICAgaWYgKG5vblJlbGV2YW50SURzICYmIG5vblJlbGV2YW50SURzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChub25SZWxldmFudElEcy5pbmRleE9mKGRhdGFFbGVtZW50LmlkKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIGRhdGFFbGVtZW50LmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZGF0YUVsZW1lbnQuaWRdICE9PSB1bmRlZmluZWQgJiYgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50LmlkXSkge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudC5pZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IChkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkgPyBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgOiB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50LmlkXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSB0aGlzLmRhdGFFbGVtZW50cy5maWx0ZXIoeCA9PiB4LmRpc3BsYXlTZXF1ZW5jZSAhPSBudWxsKS5zb3J0KGZ1bmN0aW9uIChERV8xLCBERV8yKSB7IHJldHVybiBERV8xLmRpc3BsYXlTZXF1ZW5jZSAtIERFXzIuZGlzcGxheVNlcXVlbmNlOyB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQgJiYgdGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVwb3J0VGV4dCh0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQpO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJldHVyblJlcG9ydFRleHQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UubWVzc2FnZUVtaXR0ZXIoJycpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IHRoaXMuZGF0YUVsZW1lbnRzLmZpbHRlcih4ID0+IHguZGlzcGxheVNlcXVlbmNlICE9IG51bGwpLnNvcnQoZnVuY3Rpb24gKERFXzEsIERFXzIpIHsgcmV0dXJuIERFXzEuZGlzcGxheVNlcXVlbmNlIC0gREVfMi5kaXNwbGF5U2VxdWVuY2U7IH0pO1xyXG4gICAgdGhpcy5leGVjdXRlZFJlc3VsdElkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgY2hvaWNlU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VWYWx1ZXNbJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5lbGVtZW50SWQgKyAnU2VsZWN0ZWRWYWx1ZSddID0gJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5zZWxlY3RlZFRleHQ7XHJcbiAgICAgICAgdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmFkZE9yVXBkYXRlRGF0YUVsZW1lbnQoJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5lbGVtZW50SWQsICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSxcclxuICAgICAgICAgICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRUZXh0KTtcclxuICAgICAgICBjb25zdCBleGVjdXRlZFJlc3VsdHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZXhlY3V0ZWRSZXN1bHRzWyRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbl0gPSAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmV4ZWN1dGVkUmVzdWx0SWRzWyRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkXSA9IGV4ZWN1dGVkUmVzdWx0cztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZCAmJiB0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4ZWN1dGlvbkhpc3RvcnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZnRlckRhdGFFbGVtZW50Q2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBudW1lcmljU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5hZGRPclVwZGF0ZURhdGFFbGVtZW50KCRldmVudC5yZWNlaXZlZEVsZW1lbnQuZWxlbWVudElkLCAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkVmFsdWUsXHJcbiAgICAgICAgICAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBleGVjdXRlZFJlc3VsdHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uXSA9ICRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWRdID0gZXhlY3V0ZWRSZXN1bHRzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkICYmIHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhlY3V0aW9uSGlzdG9yeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJEYXRhRWxlbWVudENoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG11bHRpU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuY29tcGFyaXNvblZhbHVlc1skZXZlbnQucmVjZWl2ZWRFbGVtZW50LmVsZW1lbnRJZCArICdDb21wYXJpc29uVmFsdWUnXSA9ICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRDb21wYXJpc29uVmFsdWVzO1xyXG4gICAgICAgIHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5hZGRPclVwZGF0ZURhdGFFbGVtZW50KCRldmVudC5yZWNlaXZlZEVsZW1lbnQuZWxlbWVudElkLCAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkQ29tcGFyaXNvblZhbHVlcyxcclxuICAgICAgICAgICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBleGVjdXRlZFJlc3VsdHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uXSA9ICRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWRdID0gZXhlY3V0ZWRSZXN1bHRzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkICYmIHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhlY3V0aW9uSGlzdG9yeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJEYXRhRWxlbWVudENoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlUmVwb3J0VGV4dChlbmRwb2ludElkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVuZHBvaW50Q29udGVudCA9IHRoaXMucmV0dXJuRW5kUG9pbnRDb250ZW50cyh0aGlzLnhtbENvbnRlbnQsICc8RW5kUG9pbnQgSWQ9XCInICsgZW5kcG9pbnRJZCArICdcIj4nLCAnPC9FbmRQb2ludD4nKTtcclxuICAgIHRoaXMucGFyc2VYbWwoZW5kcG9pbnRJZCwgZW5kcG9pbnRDb250ZW50KTtcclxuICB9XHJcblxyXG4gIGFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCkge1xyXG4gICAgY29uc3QgZGVWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGRlIG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkZS5pc1Zpc2libGUgJiYgZGUuZGF0YUVsZW1lbnRUeXBlICE9PSAnQ29tcHV0ZWREYXRhRWxlbWVudCcgJiYgZGUuZGF0YUVsZW1lbnRUeXBlICE9PSAnR2xvYmFsVmFsdWUnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXREYXRhID0gbmV3IElucHV0RGF0YSgpO1xyXG4gICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudElkID0gZGUuaWQ7XHJcbiAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50TGFiZWwgPSBkZS5sYWJlbDtcclxuICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnRWYWx1ZSA9IGRlLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGRlLmN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGRlLmN1cnJlbnRWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudERpc3BsYXlWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGRlLmRhdGFFbGVtZW50VHlwZSA9PT0gJ0Nob2ljZURhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICBjb25zdCBjaG9pY2VzID0gKGRlIGFzIENob2ljZURhdGFFbGVtZW50KS5jaG9pY2VJbmZvO1xyXG4gICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUgPSBjaG9pY2VzLmZpbHRlcihjaCA9PiBjaC52YWx1ZSA9PT0gZGUuY3VycmVudFZhbHVlKVswXS5sYWJlbDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGUuZGF0YUVsZW1lbnRUeXBlID09PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hvaWNlcyA9IChkZSBhcyBDaG9pY2VEYXRhRWxlbWVudCkuY2hvaWNlSW5mbztcclxuICAgICAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlID0gW107XHJcbiAgICAgICAgICAgIGNob2ljZXMuZm9yRWFjaChjaG9pY2UgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlLmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGRlLmN1cnJlbnRWYWx1ZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLnZhbHVlID09PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlLnB1c2goY2hvaWNlLmxhYmVsKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaG9pY2UudmFsdWUgPT09IGRlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUucHVzaChjaG9pY2UubGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUgPSBkZS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlVmFsdWVzLnB1c2goaW5wdXREYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkLmVtaXQoZGVWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUV4ZWN1dGlvbkhpc3RvcnkoKSB7XHJcblxyXG4gICAgdGhpcy5leGVjdXRlZFJlc3VsdEhpc3RvcmllcyA9IFtdO1xyXG4gICAgbGV0IGlzTm9uUmVsZXZhbnQ6IGJvb2xlYW47XHJcbiAgICBpc05vblJlbGV2YW50ID0gZmFsc2U7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgIGZvciAoY29uc3QgcmVzdWx0SWQgaW4gdGhpcy5leGVjdXRlZFJlc3VsdElkcykge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vblJlbGV2YW50RGF0YUVsZW1lbnQgb2YgdGhpcy5zaW11bGF0b3JTdGF0ZS5ub25SZWxldmFudERhdGFFbGVtZW50SWRzKSB7XHJcbiAgICAgICAgaWYgKG5vblJlbGV2YW50RGF0YUVsZW1lbnQgPT09IHJlc3VsdElkKSB7XHJcbiAgICAgICAgICBpc05vblJlbGV2YW50ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpc05vblJlbGV2YW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNOb25SZWxldmFudCkge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpmb3JpblxyXG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgaW4gdGhpcy5leGVjdXRlZFJlc3VsdElkc1tyZXN1bHRJZF0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0SGlzdG9yeTogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5ID0gbmV3IEV4ZWN1dGVkUmVzdWx0SGlzdG9yeSgpO1xyXG5cclxuICAgICAgICAgIGV4ZWN1dGVkUmVzdWx0SGlzdG9yeS5yZXN1bHRDb25kaXRpb24gPSBsYWJlbDtcclxuICAgICAgICAgIGV4ZWN1dGVkUmVzdWx0SGlzdG9yeS5yZXN1bHRWYWx1ZSA9IHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbcmVzdWx0SWRdW2xhYmVsXTtcclxuXHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVkUmVzdWx0SGlzdG9yaWVzLnB1c2goZXhlY3V0ZWRSZXN1bHRIaXN0b3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGZpbmFsRXhlY3V0aW9uOiBGaW5hbEV4ZWN1dGVkSGlzdG9yeSA9IG5ldyBGaW5hbEV4ZWN1dGVkSGlzdG9yeSgpO1xyXG4gICAgaWYgKHRoaXMuZXhlY3V0ZWRSZXN1bHRIaXN0b3JpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaW5hbEV4ZWN1dGlvbi5leGVjdXRpb25IaXN0b3JpZXMgPSB0aGlzLmV4ZWN1dGVkUmVzdWx0SGlzdG9yaWVzO1xyXG4gICAgICBmaW5hbEV4ZWN1dGlvbi5yZXN1bHRUZXh0ID0gdGhpcy5tYWluUmVwb3J0VGV4dE9iajtcclxuICAgICAgZmluYWxFeGVjdXRpb24uaW5wdXREYXRhID0gW107XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRlIG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgICAgaWYgKGRlLmlzVmlzaWJsZSAmJiBkZS5kYXRhRWxlbWVudFR5cGUgIT09ICdDb21wdXRlZERhdGFFbGVtZW50JyAmJiBkZS5kYXRhRWxlbWVudFR5cGUgIT09ICdHbG9iYWxWYWx1ZScpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0RGF0YSA9IG5ldyBJbnB1dERhdGEoKTtcclxuICAgICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudElkID0gZGUuaWQ7XHJcbiAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnRWYWx1ZSA9IGRlLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgIGZpbmFsRXhlY3V0aW9uLmlucHV0RGF0YS5wdXNoKGlucHV0RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXR1cm5FeGVjdXRpb25IaXN0b3J5LmVtaXQoZmluYWxFeGVjdXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRQb2ludENvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZywgc3RhcnRUb2tlbjogc3RyaW5nLCBlbmRUb2tlbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjb250ZW50czogc3RyaW5nO1xyXG4gICAgbGV0IHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IDA7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9IGNvbnRlbnQuaW5kZXhPZihzdGFydFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG4gICAgICBjb25zdCBjb250ZW50RW5kUG9zaXRpb24gPSBjb250ZW50LmluZGV4T2YoZW5kVG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcblxyXG4gICAgICBpZiAoY29udGVudFN0YXJ0UG9zaXRpb24gPj0gMCAmJiBjb250ZW50RW5kUG9zaXRpb24gPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY29udGVudEVuZFBvc2l0aW9uICsgZW5kVG9rZW4ubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnREYXRhID0gY29udGVudC5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcclxuICAgICAgICBjb250ZW50cyA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZVhtbChlbmRwb2ludElkOiBzdHJpbmcsIGVuZHBvaW50Q29udGVudDogc3RyaW5nKTogYW55IHtcclxuICAvLyAgIGNvbnNvbGUubG9nKGVuZHBvaW50Q29udGVudCk7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnLS0tLS0tLS0nKTtcclxuICAvLyAgIGNvbnNvbGUubG9nKGVuZHBvaW50SWQpO1xyXG5cclxuICAvLyAgIGNvbnN0IHJlcG9ydFRleHRKU09OID0gIHRoaXMucGFyc2VUb0pzb24oZW5kcG9pbnRDb250ZW50KTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZyhyZXBvcnRUZXh0SlNPTik7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHBhcnNlVG9Kc29uKHhtbERhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQganNvblJlc3VsdDogSlNPTjtcclxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICBwYXJzZVN0cmluZyh4bWxEYXRhLCB7IGV4cGxpY2l0Um9vdDogZmFsc2UsIGV4cGxpY2l0QXJyYXk6IGZhbHNlLCBhdHRya2V5OiAnQXR0cicgfSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XHJcbiAgICAgIGpzb25SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ganNvblJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VYbWwoZW5kUG9pbnRJZDogc3RyaW5nLCBlbmRwb2ludENvbnRlbnQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBjYW5JbnNlcnRUZXh0OiBib29sZWFuO1xyXG4gICAgbGV0IGlzU2VjdGlvbklmOiBib29sZWFuO1xyXG4gICAgbGV0IHNlbGVjdGVkRWxlbWVudHM6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgICBsZXQgZXhlY3V0ZVNlY3Rpb25JZk5vdDogYm9vbGVhbjtcclxuICAgIGxldCBoYXNTZWN0aW9uTm90OiBib29sZWFuO1xyXG4gICAgbGV0IGluc2VydFZhbHVlOiBib29sZWFuO1xyXG4gICAgbGV0IGV4ZWN1dGVUZW1wbGF0ZTogYm9vbGVhbjtcclxuICAgIGxldCBpc0ltcHJlc3Npb246IGJvb2xlYW47XHJcbiAgICBsZXQgaXNOZXdUZW1wbGF0ZTogYm9vbGVhbjtcclxuICAgIGxldCBoYXNJbnNlcnRQYXJ0aWFsOiBib29sZWFuO1xyXG4gICAgbGV0IGlzTWFpblRleHQ6IGJvb2xlYW47XHJcbiAgICBjb25zdCBhbGxSZXBvcnRUZXh0OiBBbGxSZXBvcnRUZXh0W10gPSBbXTtcclxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRoaXMuRW5kcG9pbnRzO1xyXG4gICAgbGV0IHRlbXBsYXRlUGFydGlhbHNUZXh0OiBzdHJpbmdbXTtcclxuICAgIGxldCBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXM6IHN0cmluZ1tdO1xyXG4gICAgbGV0IGZpbmRpbmdzVGV4dDogc3RyaW5nO1xyXG4gICAgbGV0IGltcHJlc3Npb25UZXh0OiBzdHJpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRTZWN0aW9uOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRDaG9pY2VUZXh0czogTWFwPHN0cmluZywgYW55PjtcclxuICAgIGxldCB0ZXh0RXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmdldEFsbERhdGFFbGVtZW50VmFsdWVzKCk7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWxzVGV4dCA9IHRoaXMudGVtcGxhdGVQYXJ0aWFsO1xyXG4gICAgc2VsZWN0ZWRDb21wYXJpc29uVmFsdWVzID0gdGhpcy5jb21wYXJpc29uVmFsdWVzO1xyXG4gICAgc2VsZWN0ZWRDaG9pY2VUZXh0cyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5nZXRBbGxEYXRhRWxlbWVudFRleHRzKCk7XHJcbiAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gZmFsc2U7XHJcbiAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICBlbmRwb2ludENvbnRlbnQgPSBlbmRwb2ludENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcmIzEwOycpO1xyXG4gICAgZW5kcG9pbnRDb250ZW50ID0gZW5kcG9pbnRDb250ZW50LnJlcGxhY2UoL1xcdC9nLCAnJmVtc3A7Jyk7XHJcbiAgLy8gIGVuZHBvaW50Q29udGVudCA9IGVuZHBvaW50Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJyAmbmJzcDsgJyk7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgIGZvciAoY29uc3QgaSBpbiB0ZW1wbGF0ZVBhcnRpYWxzVGV4dCkge1xyXG4gICAgICB0ZW1wbGF0ZVBhcnRpYWxzVGV4dFtpXSA9IHRlbXBsYXRlUGFydGlhbHNUZXh0W2ldLnJlcGxhY2UoL1xcbi9nLCAnJiMxMDsnKTtcclxuICAgICAgdGVtcGxhdGVQYXJ0aWFsc1RleHRbaV0gPSB0ZW1wbGF0ZVBhcnRpYWxzVGV4dFtpXS5yZXBsYWNlKC9cXHQvZywgJyZlbXNwOycpO1xyXG4gICAgLy8gIHRlbXBsYXRlUGFydGlhbHNUZXh0W2ldID0gdGVtcGxhdGVQYXJ0aWFsc1RleHRbaV0ucmVwbGFjZSgvXFxzKy9nLCAnICZuYnNwOyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kaW5nc1RleHQgPSAnJztcclxuICAgIGltcHJlc3Npb25UZXh0ID0gJyc7XHJcbiAgICBsZXQgaXNSZXBvcnRUZXh0OiBib29sZWFuO1xyXG4gICAgbGV0IHJlcG9ydFRleHRDb250ZW50ID0gJyc7XHJcbiAgICBjb25zdCBlbmRwb2ludFNheCA9IHJlcXVpcmUoJ3NheCcpLFxyXG4gICAgICBzdHJpY3QgPSB0cnVlLFxyXG4gICAgICBub3JtYWxpemUgPSB0cnVlLCAvLyBzZXQgdG8gZmFsc2UgZm9yIGh0bWwtbW9kZVxyXG4gICAgICB0cmltID0gdHJ1ZSxcclxuICAgICAgcmVwb3J0VGV4dFBhcnNlciA9IGVuZHBvaW50U2F4LnBhcnNlcihzdHJpY3QsIHRyaW0pO1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgLy8gYW4gZXJyb3IgaGFwcGVuZWQuXHJcbiAgICAgIHJlcG9ydFRleHRQYXJzZXIucmVzdW1lKCk7XHJcbiAgICB9O1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbnRleHQgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgICAgLy8gaWYgKHQubGVuZ3RoID4gMSkge1xyXG4gICAgICAvLyAgIHQgPSB0LnRyaW0oKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBsZXQgaXNUZXh0SW5zZXJ0ZWQ6IGJvb2xlYW47XHJcbiAgICAgIGlzVGV4dEluc2VydGVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICBpZiAoIWlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgaWYgKGNhbkluc2VydFRleHQgJiYgaGFzU2VjdGlvbk5vdCAmJiBoYXNTZWN0aW9uTm90ICE9PSB1bmRlZmluZWQgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkge1xyXG4gICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyB0O1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmIGlzTmV3VGVtcGxhdGUgJiYgaGFzSW5zZXJ0UGFydGlhbCAmJiAhaXNTZWN0aW9uSWYpIHtcclxuICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiAhaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChjYW5JbnNlcnRUZXh0ICYmIGhhc1NlY3Rpb25Ob3QgJiYgaGFzU2VjdGlvbk5vdCAhPT0gdW5kZWZpbmVkICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QpIHtcclxuICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNhbkluc2VydFRleHQgJiYgIWhhc1NlY3Rpb25Ob3QgJiYgaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyB0O1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmIGlzTmV3VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNSZXBvcnRUZXh0ICYmICFpc1RleHRJbnNlcnRlZCAmJiBpc01haW5UZXh0ICYmIGNhbkluc2VydFRleHQpIHtcclxuICAgICAgICAgIHJlcG9ydFRleHRDb250ZW50ID0gcmVwb3J0VGV4dENvbnRlbnQgKyB0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcG9ydFRleHRQYXJzZXIub25vcGVudGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgc3dpdGNoIChub2RlLm5hbWUpIHtcclxuICAgICAgICBjYXNlICdMYWJlbCc6XHJcbiAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICBpc1JlcG9ydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdSZXBvcnRUZXh0JzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaXNSZXBvcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkU2VjdGlvbiA9IG5vZGUuYXR0cmlidXRlcy5TZWN0aW9uSWQ7XHJcbiAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChub2RlLmF0dHJpYnV0ZXMuU2VjdGlvbklkID09PSAnZmluZGluZ3MnICYmIGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGlzSW1wcmVzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuYXR0cmlidXRlcy5TZWN0aW9uSWQgPT09ICdpbXByZXNzaW9uJyAmJiBleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICBpc0ltcHJlc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gaXNNYWluVGV4dCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnSW5zZXJ0UGFydGlhbCc6XHJcbiAgICAgICAgICBpZiAoZXhlY3V0ZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlUGFydGlhbFZpZXcobm9kZS5hdHRyaWJ1dGVzLlBhcnRpYWxJZCwgaXNJbXByZXNzaW9uKTtcclxuICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChpc1JlcG9ydFRleHQpIHtcclxuICAgICAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzUmVwb3J0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgaXNNYWluVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21hcHJpc29uVmFsdWUgb2Ygc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21hcHJpc29uVmFsdWUgIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgY29tYXByaXNvblZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJy0tU2VsZWN0LS0nICYmXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGFzU2VjdGlvbk5vdCA9IHRydWU7XHJcbiAgICAgICAgICBpc01haW5UZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdTZWN0aW9uSWYnOlxyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0ubGVuZ3RoID4gMCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlzU2VjdGlvbklmID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlJzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21hcHJpc29uVmFsdWUgb2Ygc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbWFwcmlzb25WYWx1ZSA9PT0gbm9kZS5hdHRyaWJ1dGVzLkNvbXBhcmlzb25WYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbWFwcmlzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gPT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaXNSZXBvcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGluc2VydFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgY2hvaWNlVGV4dCA9IHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5hdHRyaWJ1dGVzLklkID09PSAnZmluZGluZ3MnIHx8IGNhbkluc2VydFRleHQpIHtcclxuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiBoYXNTZWN0aW9uTm90ICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ltcHJlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSA/IHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdLmpvaW4oJywgJykgOiB0ZXh0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRUZXh0RXhwcmVzc2lvblZhbHVlKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkgPyBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXS5qb2luKCcsICcpIDogdGV4dEV4cHJlc3Npb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgIWhhc1NlY3Rpb25Ob3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ltcHJlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSA/IHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdLmpvaW4oJywgJykgOiB0ZXh0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRUZXh0RXhwcmVzc2lvblZhbHVlKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkgPyBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXS5qb2luKCcsICcpIDogdGV4dEV4cHJlc3Npb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmNsb3NldGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgc3dpdGNoIChub2RlKSB7XHJcbiAgICAgICAgY2FzZSAnU2VjdGlvbklmVmFsdWVOb3QnOlxyXG4gICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgaGFzU2VjdGlvbk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnVGVtcGxhdGVQYXJ0aWFsJzpcclxuICAgICAgICAgIGlzTmV3VGVtcGxhdGUgPSBmYWxzZTtcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUmVwb3J0VGV4dCc6XHJcbiAgICAgICAgICAvLyBpc0ltcHJlc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghaGFzSW5zZXJ0UGFydGlhbCAmJiAhaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFRleHRPYmo6IEFsbFJlcG9ydFRleHQgPSBuZXcgQWxsUmVwb3J0VGV4dCgpO1xyXG4gICAgICAgICAgICByZXBvcnRUZXh0T2JqLnNlY3Rpb25JZCA9ICdmaW5kaW5ncyc7XHJcbiAgICAgICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGZpbmRpbmdzVGV4dDtcclxuICAgICAgICAgICAgYWxsUmVwb3J0VGV4dFtyZXBvcnRUZXh0T2JqLnNlY3Rpb25JZF0gPSByZXBvcnRUZXh0T2JqO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChpbXByZXNzaW9uVGV4dCAhPT0gJycgJiYgaW1wcmVzc2lvblRleHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRUZXh0T2JqOiBBbGxSZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgICAgICAgcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSBzZWxlY3RlZFNlY3Rpb247XHJcbiAgICAgICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGltcHJlc3Npb25UZXh0O1xyXG4gICAgICAgICAgICBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdTZWN0aW9uSWYnOlxyXG4gICAgICAgICAgaXNTZWN0aW9uSWYgPSBmYWxzZTtcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnSW5zZXJ0UGFydGlhbCc6XHJcbiAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgIGlmICgoaGFzU2VjdGlvbk5vdCAmJiBleGVjdXRlU2VjdGlvbklmTm90IHx8ICFoYXNTZWN0aW9uTm90KSkge1xyXG4gICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlJzpcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgLy8gcGFyc2VyIHN0cmVhbSBpcyBkb25lLCBhbmQgcmVhZHkgdG8gaGF2ZSBtb3JlIHN0dWZmIHdyaXR0ZW4gdG8gaXQuXHJcbiAgICAgIC8vIGlmIChpbXByZXNzaW9uVGV4dCAhPT0gJycgJiYgaW1wcmVzc2lvblRleHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBjb25zdCByZXBvcnRUZXh0T2JqOiBBbGxSZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgLy8gcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSBzZWxlY3RlZFNlY3Rpb247XHJcbiAgICAgIC8vIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGltcHJlc3Npb25UZXh0O1xyXG4gICAgICAvLyBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgIC8vIH1cclxuICAgIH07XHJcblxyXG4gICAgcmVwb3J0VGV4dFBhcnNlci53cml0ZShlbmRwb2ludENvbnRlbnQpLm9uZW5kKCk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZSh0ZXh0RXhwcmVzc2lvbjogc3RyaW5nKSB7XHJcbiAgICAgIGlmICh0ZXh0RXhwcmVzc2lvbi5pbmRleE9mKCd7JykgPT09IDAgJiYgKHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ30nKSA+IDEpKSB7XHJcbiAgICAgICAgY29uc3Qgc3ViU3RyaW5nID0gdGV4dEV4cHJlc3Npb24uc3Vic3RyKHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ3snKSArIDEsIHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ30nKSAtIDEpO1xyXG4gICAgICAgIGdldFRleHRFeHByZXNzaW9uVmFsdWUoc2VsZWN0ZWRFbGVtZW50c1tzdWJTdHJpbmddKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0ZXh0RXhwcmVzc2lvblZhbHVlID0gdGV4dEV4cHJlc3Npb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUGFydGlhbFZpZXcocGFydGlhbFZpZXdJZDogc3RyaW5nLCBpc0ltcHJlc3Npb25UZW1wbGF0ZTogYm9vbGVhbikge1xyXG4gICAgICAvLyB0aGlzLnRlbXBsYXRlSWRzID0gW107XHJcbiAgICAgIGNvbnN0IHNheCA9IHJlcXVpcmUoJ3NheCcpLFxyXG4gICAgICAgIHBhcnNlciA9IHNheC5wYXJzZXIoc3RyaWN0LCB0cmltKTtcclxuICAgICAgcGFyc2VyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vIGFuIGVycm9yIGhhcHBlbmVkLlxyXG4gICAgICAgIC8vIHBhcnNlci5yZXN1bWUoKTtcclxuICAgICAgfTtcclxuICAgICAgcGFyc2VyLm9udGV4dCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgaWYgKCFpc0ltcHJlc3Npb25UZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBoYXNTZWN0aW9uTm90ICYmIGhhc1NlY3Rpb25Ob3QgIT09IHVuZGVmaW5lZCAmJiBleGVjdXRlU2VjdGlvbklmTm90KSB7XHJcbiAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmICFoYXNTZWN0aW9uTm90ICYmIGlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBpc05ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNhbkluc2VydFRleHQgJiYgaGFzU2VjdGlvbk5vdCAmJiBoYXNTZWN0aW9uTm90ICE9PSB1bmRlZmluZWQgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkge1xyXG4gICAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyB0O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbkluc2VydFRleHQgJiYgIWhhc1NlY3Rpb25Ob3QgJiYgaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBpc05ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci5vbm9wZW50YWcgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHN3aXRjaCAobm9kZS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdMYWJlbCc6IGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdFbmRQb2ludCc6IGlmIChub2RlLmF0dHJpYnV0ZXMuSWQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpc0ltcHJlc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpc0ltcHJlc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdJbnNlcnRQYXJ0aWFsJzogY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1JlcG9ydFRleHQnOiBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdUZW1wbGF0ZVBhcnRpYWwnOiBoYXNTZWN0aW9uTm90ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG5vZGUuYXR0cmlidXRlcy5JZCA9PT0gcGFydGlhbFZpZXdJZCkge1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzogaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbWFwcmlzb25WYWx1ZSBvZiBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWQgKyAnQ29tcGFyaXNvblZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21hcHJpc29uVmFsdWUgIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgY29tYXByaXNvblZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJy0tU2VsZWN0LS0nICYmXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICBoYXNTZWN0aW9uTm90ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmJzpcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0ubGVuZ3RoID4gMCAmJiAoIWhhc1NlY3Rpb25Ob3QgfHwgKGhhc1NlY3Rpb25Ob3QgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkpXHJcbiAgICAgICAgICAgICAgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmVmFsdWUnOlxyXG4gICAgICAgICAgICBpZiAoZXhlY3V0ZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbWFwcmlzb25WYWx1ZSBvZiBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWQgKyAnQ29tcGFyaXNvblZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbWFwcmlzb25WYWx1ZSA9PT0gbm9kZS5hdHRyaWJ1dGVzLkNvbXBhcmlzb25WYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbWFwcmlzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gPT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGluc2VydFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBjaG9pY2VUZXh0ID0gc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgaWYgKG5vZGUuYXR0cmlidXRlcy5JZCA9PT0gJ2ZpbmRpbmdzJyB8fCBjYW5JbnNlcnRUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiBoYXNTZWN0aW9uTm90ICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyAoQXJyYXkuaXNBcnJheShjaG9pY2VUZXh0KSA/IGNob2ljZVRleHQuam9pbignLCAnKSA6IGNob2ljZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uVGV4dCA9IGltcHJlc3Npb25UZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiAhaGFzU2VjdGlvbk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ5w6LCgMKmJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uVGV4dCA9IGltcHJlc3Npb25UZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmIGhhc1NlY3Rpb25Ob3QgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiAhaGFzU2VjdGlvbk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci5vbmNsb3NldGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICBzd2l0Y2ggKG5vZGUpIHtcclxuICAgICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzpcclxuICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBoYXNTZWN0aW9uTm90ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChpc1NlY3Rpb25JZikge1xyXG4gICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnVGVtcGxhdGVQYXJ0aWFsJzpcclxuICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdJbnNlcnRQYXJ0aWFsJzpcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmJyB8fCAnU2VjdGlvbklmVmFsdWUnOlxyXG4gICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBwYXJzZXIub25lbmQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gcGFyc2VyIHN0cmVhbSBpcyBkb25lLCBhbmQgcmVhZHkgdG8gaGF2ZSBtb3JlIHN0dWZmIHdyaXR0ZW4gdG8gaXQuXHJcbiAgICAgICAgY29uc3QgcmVwb3J0VGV4dE9iajogQWxsUmVwb3J0VGV4dCA9IG5ldyBBbGxSZXBvcnRUZXh0KCk7XHJcbiAgICAgICAgcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSAnZmluZGluZ3MnO1xyXG4gICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGZpbmRpbmdzVGV4dDtcclxuICAgICAgICBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci53cml0ZSh0ZW1wbGF0ZVBhcnRpYWxzVGV4dCkub25lbmQoKTtcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0T2JqID0gbmV3IE1haW5SZXBvcnRUZXh0KCk7XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0T2JqLnJlcG9ydFRleHRNYWluQ29udGVudCA9IHJlcG9ydFRleHRDb250ZW50O1xyXG4gICAgdGhpcy5tYWluUmVwb3J0VGV4dE9iai5hbGxSZXBvcnRUZXh0ID0gYWxsUmVwb3J0VGV4dDtcclxuICAgIHRoaXMucmV0dXJuUmVwb3J0VGV4dC5lbWl0KHRoaXMubWFpblJlcG9ydFRleHRPYmopO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZUVsZW1lbnQge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWU6IHN0cmluZztcclxuICBzZWxlY3RlZFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE51bWVyaWNFbGVtZW50IHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBzZWxlY3RlZFZhbHVlOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUNob2ljZUVsZW1lbnQge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWVzOiBzdHJpbmdbXTtcclxuICBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWxsRWxlbWVudHMge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWVzOiBhbnlbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5SZXBvcnRUZXh0IHtcclxuICByZXBvcnRUZXh0TWFpbkNvbnRlbnQ6IHN0cmluZztcclxuICBhbGxSZXBvcnRUZXh0OiBBbGxSZXBvcnRUZXh0W107XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFsbFJlcG9ydFRleHQge1xyXG4gIHNlY3Rpb25JZDogc3RyaW5nO1xyXG4gIHJlcG9ydFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVkUmVzdWx0SGlzdG9yeSB7XHJcbiAgcmVzdWx0Q29uZGl0aW9uOiBzdHJpbmc7XHJcbiAgcmVzdWx0VmFsdWU6IGFueTtcclxufVxyXG5leHBvcnQgY2xhc3MgRmluYWxFeGVjdXRlZEhpc3Rvcnkge1xyXG4gIGV4ZWN1dGlvbkhpc3RvcmllczogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5W107XHJcbiAgcmVzdWx0VGV4dDogTWFpblJlcG9ydFRleHQ7XHJcbiAgaW5wdXREYXRhOiBJbnB1dERhdGFbXTtcclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1oaW50LWRpYWdyYW0nLFxyXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFFbGVtZW50ICE9PSB1bmRlZmluZWRcIj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHNcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgYXR0ci5kYXRhLXRhcmdldD1cIiN7eydkaWFnXycrZGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAoY2xpY2spPVwicmVzZXRDYXJvdXNlbEluZGV4KClcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1waWN0dXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIHRpdGxlPVwiSGludCBEaWFncmFtc1wiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgaW5tb2RhbCBmYWRlXCIgaWQ9XCJ7eydkaWFnXycrZGF0YUVsZW1lbnQuaWR9fVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZSBmbG9hdC1sZWZ0XCI+e3tkYXRhRWxlbWVudC5sYWJlbH19PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGNhcm91c2VsIFsoYWN0aXZlU2xpZGUpXT1cImFjdGl2ZVNsaWRlSW5kZXhcIiBpbnRlcnZhbD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGlhZyBvZiBkYXRhRWxlbWVudC5kaWFncmFtcyBcIj5cclxuICAgICAgICAgICAgICAgIDxzbGlkZT5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXJlc3BvbnNpdmUgbWF4LXctaC0xMDBcIiBbc3JjXT1cImRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGdldEltYWdlRGF0YVVybChkaWFnLmxvY2F0aW9uKSlcIiBhbHQ9XCJ7eyBkaWFnLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NsaWRlPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Nhcm91c2VsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIaW50RGlhZ3JhbUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgZGF0YUVsZW1lbnQ6IEJhc2VEYXRhRWxlbWVudDtcclxuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICBpc0RhdGFVUkwgPSAvXlxccypkYXRhOihbYS16XStcXC9bYS16XSsoO1thLXpcXC1dK1xcPVthLXpcXC1dKyk/KT8oO2Jhc2U2NCk/LFthLXowLTlcXCFcXCRcXCZcXCdcXCxcXChcXClcXCpcXCtcXCxcXDtcXD1cXC1cXC5cXF9cXH5cXDpcXEBcXC9cXD9cXCVcXHNdKlxccyokL2k7XHJcbiAgYWN0aXZlU2xpZGVJbmRleCA9IDA7XHJcbiAgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XHJcbiAgICB0aGlzLmRvbVNhbml0aXplciA9IGRvbVNhbml0aXplcjtcclxuICB9XHJcblxyXG4gIHJlc2V0Q2Fyb3VzZWxJbmRleCgpIHtcclxuICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IDA7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZURhdGFVcmwobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBpc0RhdGFVUkwgPSAhIWxvY2F0aW9uLm1hdGNoKHRoaXMuaXNEYXRhVVJMKTtcclxuICAgIGlmIChpc0RhdGFVUkwpIHtcclxuICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCd1bnNhZmU6JywgJycpO1xyXG4gICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZVBhdGggKyAnLycgKyBsb2NhdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtCYXNlRGF0YUVsZW1lbnR9IGZyb20gJy4vYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsb2JhbFZhbHVlIGV4dGVuZHMgIEJhc2VEYXRhRWxlbWVudCB7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvZ2xvYmFsdmFsdWUubW9kZWwnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWxWYWx1ZUNyZWF0aW9uU2VydmljZSBleHRlbmRzIERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB7XHJcblxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgIGNvbnN0IGRhdGFFbGVtZW50ID0gbmV3IEdsb2JhbFZhbHVlKCk7XHJcbiAgIGRhdGFFbGVtZW50LmlkICA9IGRhdGEuQXR0ci5JZDtcclxuICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gZGF0YS5fO1xyXG4gICBkYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPSAnR2xvYmFsVmFsdWUnO1xyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0dsb2JhbFZhbHVlJztcclxuICB9XHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBTZWxlY3RlZENvbmRpdGlvbiB7XHJcbiAgICBzZWxlY3RlZENvbmRpdGlvbklkOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZENvbmRpdGlvbjogYW55O1xyXG4gICAgc2VsZWN0ZWRWYWx1ZTogYW55O1xyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZXMsIFNpbXBsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOdW1lcmljRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9udW1lcmljLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNFbGVtZW50IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2V4ZWN1dGVkLXJlc3VsdC5tb2RlbCc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NpbXVsYXRvci1jb21tdW5pY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtbnVtZXJpYy1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwibnVtZXJpY0VsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHRleHQtcmlnaHRcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBicmVhay13b3JkXCI+XHJcbiAgICAgICAge3tudW1lcmljRGF0YUVsZW1lbnQubGFiZWx9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIG51bWVyaWNEYXRhRWxlbWVudC51bml0ICE9ICcnXCI+ICh7e251bWVyaWNEYXRhRWxlbWVudC51bml0fX0pPC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIG51bWVyaWNEYXRhRWxlbWVudC5oaW50ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtcHJpbWFyeSB3aGl0ZXNwYWNlXCIgdGl0bGU9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5oaW50fX1cIj48L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmRpYWdyYW1zICE9IHVuZGVmaW5lZCBcIj5cclxuICAgICAgICA8YWNyLWhpbnQtZGlhZ3JhbSBbZGF0YUVsZW1lbnRdPVwibnVtZXJpY0RhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5udW1lcmljRGF0YUVsZW1lbnQuaXNSZXF1aXJlZFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0VsZW1lbnRGb3JtLmNvbnRyb2xzWydudW1lcmljRWxlbWVudCddLmludmFsaWRcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0VsZW1lbnRGb3JtLmNvbnRyb2xzWydudW1lcmljRWxlbWVudCddLmVycm9ycy5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+XHJcbiAgICAgICAgICAgICpcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIm51bWVyaWNFbGVtZW50Rm9ybS5jb250cm9sc1snbnVtZXJpY0VsZW1lbnQnXS5pbnZhbGlkICYmIG51bWVyaWNFbGVtZW50Rm9ybS5jb250cm9sc1snbnVtZXJpY0VsZW1lbnQnXS5lcnJvcnMubWluXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBpcyB7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj4gICAgICBcclxuICAgICAgPHNwYW4gKm5nSWY9XCJudW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uaW52YWxpZCAmJiBudW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uZXJyb3JzLm1heFwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgaXMge3tudW1lcmljRGF0YUVsZW1lbnQubWF4aW11bX19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJudW1lcmljRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnTnVtZXJpY0RhdGFFbGVtZW50J1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cclxuICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwibnVtZXJpY0RhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGFjck51bWVyaWNPbmx5IFsobmdNb2RlbCldPVwibnVtYmVyVmFsdWVcIiBpZD1cInt7bnVtZXJpY0RhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibnVtZXJpY0VsZW1lbnRcIlxyXG4gICAgICAgICAgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiAoaW5wdXQpPVwiY2hvaWNlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldCwgbnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBtaW49XCJ7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIiBtYXg9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5tYXhpbXVtfX1cIiByZXF1aXJlZD4gICAgICAgICAgXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ0ludGVnZXJEYXRhRWxlbWVudCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCI+XHJcbiAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cIm51bWVyaWNEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBbKG5nTW9kZWwpXT1cIm51bWJlclZhbHVlXCIgaWQ9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm51bWVyaWNFbGVtZW50XCJcclxuICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcktleSgkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiAoaW5wdXQpPVwiY2hvaWNlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldCwgbnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBtaW49XCJ7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIiBtYXg9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5tYXhpbXVtfX1cIiByZXF1aXJlZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3ROdW1lcmljRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgQElucHV0KCkgbnVtZXJpY0RhdGFFbGVtZW50OiBOdW1lcmljRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybk51bWVyaWNFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG51bWVyaWNFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBudW1iZXJWYWx1ZTogbnVtYmVyO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UsXHJcbiAgICBzaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZTogU2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2Uuc2ltdWxhdG9yU291cmNlJC5zdWJzY3JpYmUoXHJcbiAgICAgIG1pc3Npb24gPT4ge1xyXG4gICAgICAgIHRoaXMuVXBkYXRlRm9ybVZhbGlkYXRvcigpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtbGlmZS1jeWNsZS1pbnRlcmZhY2VcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIHByZXZlbnQgbWVtb3J5IGxlYWsgd2hlbiBjb21wb25lbnQgZGVzdHJveWVkXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZU51bWVyaWNFbGVtZW50Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVzZS1saWZlLWN5Y2xlLWludGVyZmFjZVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BLZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnYXNkYScpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSAhPT0gMCkge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuYWRkT3JVcGRhdGVEYXRhRWxlbWVudCh0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5pZCwgdGhpcy5udW1lcmljRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlLFxyXG4gICAgICAgIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIHRoaXMubnVtYmVyVmFsdWUgPSB0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMubG9hZGVkTnVtZXJpY1ZhbHVlKHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmlkLCB0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmV0dXJuTnVtZXJpY0VsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZGVkTnVtZXJpY1ZhbHVlKGlkLCB2YWx1ZSwgc2VsZWN0ZWRDb25kaXRpb24pIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgTnVtZXJpY0VsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gaWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gaWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmV0dXJuTnVtZXJpY0VsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBOdW1lcmljRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudC5pZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybk51bWVyaWNFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgb25seUludGVnZXJLZXkoZXZlbnQpIHtcclxuICAgIHJldHVybiAoZXZlbnQuY2hhckNvZGUgPT09IDggfHwgZXZlbnQuY2hhckNvZGUgPT09IDApID8gbnVsbCA6IGV2ZW50LmNoYXJDb2RlID49IDQ4ICYmIGV2ZW50LmNoYXJDb2RlIDw9IDU3O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOdW1lcmljRWxlbWVudEZvcm0oKSB7XHJcbiAgICB0aGlzLm51bWVyaWNFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBudW1lcmljRWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKCt0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMubnVtZXJpY0RhdGFFbGVtZW50Lm1heGltdW0pXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVGb3JtVmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5udW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgVmFsaWRhdG9ycy5taW4oK3RoaXMubnVtZXJpY0RhdGFFbGVtZW50Lm1pbmltdW0pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5udW1lcmljRGF0YUVsZW1lbnQubWF4aW11bSldKV0pO1xyXG4gICAgdGhpcy5udW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIHt7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSA8c3BhbiAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7Y2hvaWNlRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwid2hpdGVzcGFjZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnlcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgdGl0bGU9XCJ7e2Nob2ljZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJjaG9pY2VEYXRhRWxlbWVudFwiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCI+PC9hY3ItaGludC1kaWFncmFtPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjaG9pY2VFbGVtZW50Rm9ybS5jb250cm9sc1snY2hlY2tCb3gnXS5pbnZhbGlkICAmJiB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlzUmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkIHdoaXRlc3BhY2VcIlxyXG4gICAgICAgIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj4qPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyB0ZXh0LWxlZnQgY29udGVudC1wYWRkaW5nXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSAyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5pbWFnZU1hcCA9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2UudmFsdWV9fV97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwicmFkaW9cIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCBjaG9pY2UudmFsdWUpXCI+IHt7Y2hvaWNlLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpbyBjdXN0b20tcmFkaW8tc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cImZyZWV0ZXh0XCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSdcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmltYWdlTWFwICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy02IGNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlLnZhbHVlfX1fe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cInt7Y2hvaWNlLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNob2ljZVNlbGVjdGVkKGNob2ljZURhdGFFbGVtZW50LmlkLCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbCwgKGNob2ljZS5yZXBvcnRUZXh0ICE9PSB1bmRlZmluZWQpID8gY2hvaWNlLnJlcG9ydFRleHQgOiBjaG9pY2UubGFiZWwsIGNob2ljZS52YWx1ZSlcIj4ge3tjaG9pY2UubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cIm90aGVyXCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPk9SPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMlwiPiAgICAgICAgICAgIFxyXG4gICAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgKGNoYW5nZSk9XCJkcm9wZG93bkNob2ljZVNlbGVjdGVkKCRldmVudC50YXJnZXQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICA8IS0tIDxvcHRpb24gXHJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID09IGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ID8gdHJ1ZSA6IGZhbHNlXCI+LS1TZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAtLT5cclxuICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJcclxuICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAoY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTEgPyBcclxuICAgICAgICAgIHRydWUgOlxyXG4gICAgICAgICAgdHJ1ZSlcclxuICAgICAgICAgIDogdHJ1ZVwiPi0tU2VsZWN0LS08L29wdGlvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZVwiIC0tPlxyXG5cclxuICAgICAgICBcclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvXCJcclxuICAgICAgICAgIFtoaWRkZW5dPVwiY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQgIT0gdW5kZWZpbmVkID8gXHJcbiAgICAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2UudmFsdWUpID4gLTEgPyB0cnVlOiBudWxsXHJcbiAgICAgICAgICAgICAgOiBudWxsXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAgIFxyXG4gICAgICAgICAgW3NlbGVjdGVkXT1cImNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTFcclxuICAgICAgICAgICB8fCBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMT8gZmFsc2UgOiBcclxuICAgICAgICAgICBjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgIDogY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPyB0cnVlIDogZmFsc2VcIiAgICAgICBcclxuICAgICAgICAgID57e2Nob2ljZS5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiIFt2YWx1ZV09XCInZnJlZXRleHQnXCIgW3NlbGVjdGVkXT1cIidmcmVldGV4dCdcIj5PdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuXHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuaW1hZ2VNYXAgIT0gdW5kZWZpbmVkICAmJiBpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHBhZGRpbmctdG9wLTEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5PUjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcblxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RDaG9pY2VFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjaG9pY2VEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybkNob2ljZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNob2ljZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBzZWxlY3RlZEluZGV4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlKSB7IH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlQ2hvaWNlRWxlbWVudEZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICQoJyNkaXZfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgJCgnIycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSArICdfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgdGhpcy5jaG9pY2VWYWx1ZSA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlID09PSAnaHlwb0VuaGFuY2luZycpe1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnYXNkYXNkJyk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgPT09IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0ID0gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hvaWNlVmFsdWUodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5pZCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5sYWJlbCxcclxuICAgICAgICAgICh0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0IDogdGhpcy5zZWxlY3RlZENob2ljZVJlcG9ydExhYmVsLCB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wZG93bkNob2ljZVNlbGVjdGVkKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQsIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hvaWNlVmFsdWUoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkRWxlbWVudDogc3RyaW5nLCBzZWxlY3RlZFRleHQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICAgIHRoaXMuc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZCwgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkRWxlbWVudDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRHJvcGRvd25DaG9pY2VTZWxlY3RlZChlbGVtZW50SWQsIGVsZW1lbnRMYWJlbCwgZWxlbWVudFZhbHVlLCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnRWYWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudExhYmVsO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50TGFiZWw7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRFbGVtZW50OiBzdHJpbmcsIHNlbGVjdGVkVGV4dDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQsIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wZG93bkNob2ljZVNlbGVjdGVkKGVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudC5pZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IChlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XS50ZXh0ID09PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ5w6LCgMKmJykgPyAnZnJlZXRleHQnIDogZWxlbWVudC52YWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50LmlkLCBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50LmlkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICAvLyBDb2RlIHNob3VsZCBjb21lcyBoZXJlIC8vXHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNob2ljZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5jaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBjaGVja0JveDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0sIHtcclxuICAgICAgICB2YWxpZGF0b3I6IHRoaXMuc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKCdjaGVja0JveCcpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlID09PSAnZnJlZXRleHQnKSB7XHJcbiAgICAgICQoJyNkaXZfJyArIGVsZW1lbnRJZCArICdfb3RoZXInKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjZGl2XycgKyBlbGVtZW50SWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgICAkKCcjdHh0X290aGVyXycgKyBlbGVtZW50SWQpLnZhbCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcmVlVGV4dChlbGVtZW50LCBlbGVtZW50SWQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gKGVsZW1lbnQudmFsdWUgPT09ICdPdGhlcicpID8gJ2ZyZWV0ZXh0JyA6IGVsZW1lbnQudmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAoKGNob2ljZUNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnJyB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKHsgbm90RXF1aXZhbGVudDogdHJ1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY2hvaWNlQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTXVsdGlDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL211bHRpLWNob2ljZS1kYXRhLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBNdWx0aUNob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwibXVsdGlDaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPnt7bXVsdGlDaG9pY2VFbGVtZW50LmxhYmVsfX0gPHNwYW4gKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQudW5pdCAhPSB1bmRlZmluZWQgJiYgbXVsdGlDaG9pY2VFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7bXVsdGlDaG9pY2VFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaGludCAhPT0gJycgJiYgbXVsdGlDaG9pY2VFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1wcmltYXJ5IHdoaXRlc3BhY2VcIiB0aXRsZT1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJtdWx0aUNob2ljZUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIm11bHRpQ2hvaWNlRWxlbWVudEZvcm0uY29udHJvbHNbJ211bHRpQ2hlY2tCb3gnXS5pbnZhbGlkICYmICFtdWx0aUNob2ljZVZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCJcclxuICAgICAgICB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCIgW25nQ2xhc3NdPVwibXVsdGlDaG9pY2VFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtZWxlbWVudCcgOiAnJ1wiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgbXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9cIiBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94Q3VzdG9taXplZFwiIHRpdGxlPVwie3tjaG9pY2UuaGludH19XCI+XHJcbiAgICAgICAgPGxhYmVsIFtoaWRkZW5dPVwibXVsdGlDaG9pY2VFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/IFxyXG4gICAgICAgIG11bHRpQ2hvaWNlRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMSA/IHRydWU6IG51bGxcclxuICAgICAgICA6IG51bGxcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmlkfX1fe3tjaG9pY2UudmFsdWV9fVwiIFtjaGVja2VkXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibXVsdGlDaGVja0JveFwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiIChjaGFuZ2UpPVwidXBkYXRlTXVsdGlDaG9pY2UobXVsdGlDaG9pY2VFbGVtZW50LmlkLCBtdWx0aUNob2ljZUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICB7e2Nob2ljZS5sYWJlbH19XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPmAsXHJcbiAgc3R5bGVzOiBbYC5jaGVja2JveEN1c3RvbWl6ZWR7bWluLWhlaWdodDowIWltcG9ydGFudDtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0uZGlzYWJsZWQtZWxlbWVudHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkLWVsZW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XCJcIjt6LWluZGV4OjE7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX1gLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RNdWx0aUNob2ljZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIG11bHRpQ2hvaWNlRWxlbWVudDogTXVsdGlDaG9pY2VEYXRhRWxlbWVudDtcclxuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcmV0dXJuTXVsdGlDaG9pY2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgbXVsdGlFbGVtZW50czogTXVsdGlDaG9pY2VFbGVtZW50W10gPSBbXTtcclxuICBtdWx0aUNob2ljZVZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBtdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgbXVsdGlDaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVNdWx0aUNob2ljZUVsZW1lbnRGb3JtKCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgdmFsdWVzOiBhbnkgPSBbXTtcclxuICAgICAgY29uc3QgbGFiZWxzOiBhbnkgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgY3VyclZhbHVlIG9mIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VyclZhbHVlID09PSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgJiYgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNob2ljZVZhbHVlID0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChjdXJyVmFsdWUpO1xyXG4gICAgICAgICAgICAgIGxhYmVscy5wdXNoKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSA9PT0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICYmIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hvaWNlVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgdmFsdWVzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlKTtcclxuICAgICAgICAgICAgbGFiZWxzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZE11bHRpQ2hvaWNlKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmlkLCB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5sYWJlbCwgdmFsdWVzLCBsYWJlbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZE11bHRpQ2hvaWNlKGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZENvbmRpdGlvbjogc3RyaW5nLCBjaG9pY2VWYWx1ZTogYW55LCBjaG9pY2VMYWJlbDogYW55KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoJCgnIycgKyBlbGVtZW50SWQgKyAnXycgKyBjaG9pY2VWYWx1ZSkuaXMoJzpjaGVja2VkJykpIHtcclxuICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcyA9IGNob2ljZUxhYmVsO1xyXG4gICAgICB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcyA9IGNob2ljZVZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLmluZGV4T2YoY2hvaWNlTGFiZWwpO1xyXG4gICAgICBjb25zdCBjb21wYXJpc29uSW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcy5pbmRleE9mKGNob2ljZVZhbHVlKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbXBhcmlzb25JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXMuc3BsaWNlKGNvbXBhcmlzb25JbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG11bHRpRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBtdWx0aUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkQ29tcGFyaXNvblZhbHVlcyA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHsgcmVjZWl2ZWRFbGVtZW50OiBtdWx0aUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTXVsdGlDaG9pY2UoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkQ29uZGl0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGV2ZW50KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnB1c2goZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNvbXBhcmlzb25JbmRleCA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLmluZGV4T2YoZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wYXJpc29uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnNwbGljZShjb21wYXJpc29uSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtdWx0aUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkVmFsdWVzID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIG11bHRpRWxlbWVudC5zZWxlY3RlZENvbXBhcmlzb25WYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcztcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudElkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIHRoaXMucmV0dXJuTXVsdGlDaG9pY2UuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogbXVsdGlFbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbjogdGhpcy5zZWxlY3RlZENvbmRpdGlvbiB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTXVsdGlDaG9pY2VFbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBtdWx0aUNoZWNrQm94OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSwge1xyXG4gICAgICAgIHZhbGlkYXRvcjogdGhpcy5zcGVjaWZpY1ZhbHVlSW5zaWRlUmFuZ2UoJ211bHRpQ2hlY2tCb3gnKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHJldHVybiBjaG9pY2VDb250cm9sLnNldEVycm9ycyh7IG5vdEVxdWl2YWxlbnQ6IHRydWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCAsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWNyLWltYWdlLW1hcCcsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGZvbnQtd2VpZ2h0LTQwMFwiPk5vdCBzdXJlPyB0cnkgb3V0IHRoaXMgaW1hZ2UgPC9sYWJlbD5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBhdHRyLmRhdGEtdGFyZ2V0PVwiI3t7J2ltZ01hcF9Nb2RhbF8nK0RhdGFFbGVtZW50LmlkfX1cIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1waWN0dXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJ0b3BcIiB0aXRsZT1cIkltYWdlIE1hcFwiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGlubW9kYWwgZmFkZVwiIGlkPVwie3snaW1nTWFwX01vZGFsXycrRGF0YUVsZW1lbnQuaWR9fVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPiB7e1NlbGVjdGlvblZhbHVlfX08L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1hZ2VFeGlzdCA9PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJJbWdPcHRpb24gZGFuZ2VyIGltZy1yZXNwb25zaXZlIG1heC13LWgtMTAwXCIgYWx0PVwie3sgRGF0YUVsZW1lbnQuaW1hZ2VNYXAubGFiZWwgfX1cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGF0dHIuaWQ9XCJ7eydpbWdNYXBfSW1nXycrRGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImltYWdlQ2xpY2soJGV2ZW50LERhdGFFbGVtZW50KTtcIiBhdHRyLmRhdGEtZWxlbWVudElEPVwie3tEYXRhRWxlbWVudC5pZH19XCIgYXR0ci51c2VtYXA9XCIje3snaW1nTWFwXycrRGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJkb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChnZXRJbWFnZURhdGFVcmwoRGF0YUVsZW1lbnQuaW1hZ2VNYXAubG9jYXRpb24pKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hcCBuYW1lPVwie3snaW1nTWFwXycrRGF0YUVsZW1lbnQuaWR9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWdPcHQgb2YgRGF0YUVsZW1lbnQuaW1hZ2VNYXAubWFwLmFyZWFzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZWEgYXR0ci5zaGFwZT1cInt7aW1nT3B0LnNoYXBlfX1cIiBhdHRyLmltZ0lEPVwie3snaW1nTWFwX0ltZ18nK0RhdGFFbGVtZW50LmlkfX1cIiBhdHRyLmNvb3Jkcz1cInt7aW1nT3B0LmNvb3Jkc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGF0dHIuYWx0PVwie3tpbWdPcHQuY2hvaWNlVmFsdWV9fVwiIChtb3VzZW92ZXIpPSdkaXNwbGF5VmFsdWUoaW1nT3B0LmNob2ljZVZhbHVlKTsnIChtb3VzZW91dCk9J2Rpc3BsYXlWYWx1ZShcIlwiKTsnXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VmFsdWUoaW1nT3B0LmNob2ljZVZhbHVlKTtcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWFwPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZUV4aXN0ID09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgIE5vIEltYWdlIE1hcCBBdmFpbGFibGUuLi5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuYCxcclxuICBzdHlsZXM6IFtgYCwgYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LnBhZGRpbmctbC01e3BhZGRpbmctbGVmdDo1cHh9LndoaXRlc3BhY2V7bWFyZ2luLWxlZnQ6NXB4fS5tYXgtdy1oLTEwMHttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2w+LmZhe2ZvbnQtc2l6ZTo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTIwcHh9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0LC5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1zaW11bGF0b3ItZm9ybS1oZWlnaHR7aGVpZ2h0OmNhbGMoMTAwdmggLSAxMDBweCk7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1yZXBvcnQtdGV4dC1zY3JvbGx7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMwMHB4KX0ucGFkZGluZy1yLTEwe3BhZGRpbmctcmlnaHQ6MTBweH0uc2xpZGUtbGVmdHtsZWZ0OjMwcHh9LnNsaWRlLXJpZ2h0e3JpZ2h0OjMwcHh9aHJ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0ud2hpdGUtc3BhY2UtbGluZXt3aGl0ZS1zcGFjZTpwcmUtbGluZTt3b3JkLXdyYXA6YnJlYWstd29yZH1we21hcmdpbjowIDAgMTBweH0uZm9ybS1jb250cm9se2JvcmRlci1yYWRpdXM6MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiNkMmQ2ZGV9aDQubW9kYWwtdGl0bGUuZmxvYXQtbGVmdHtmbG9hdDpsZWZ0fS5tYXJnaW4tYi0we21hcmdpbi1ib3R0b206MH0uZm9udC13ZWlnaHQtNDAwe2ZvbnQtd2VpZ2h0OjQwMH0uY3VzdG9tLXJhZGlvLXN0eWxle2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnpvb217d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS56b29tIGltZ3toZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO21heC13aWR0aDppbmhlcml0IWltcG9ydGFudH0uYnRuLXpvb217YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O2NvbG9yOiM0NDQ7Ym9yZGVyLWNvbG9yOiNkZGR9LmJ0bi16b29tLmhvdmVyLC5idG4tem9vbTphY3RpdmUsLmJ0bi16b29tOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7bGFiZWwuY29udHJvbC1sYWJlbHtwYWRkaW5nLWxlZnQ6MjBweH19LnBhZGRpbmctNXtwYWRkaW5nOjVweH1gXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlTWFwQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcbiAgICBASW5wdXQoKSBEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgICBASW5wdXQoKSBEYXRhRWxlbWVudHM6IE9iamVjdCA9IHt9O1xyXG4gICAgQElucHV0KCkgRm9ybVZhbHVlczogT2JqZWN0ID0ge307XHJcbiAgICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICAgIGlzRGF0YVVSTCA9IC9eXFxzKmRhdGE6KFthLXpdK1xcL1thLXpdKyg7W2EtelxcLV0rXFw9W2EtelxcLV0rKT8pPyg7YmFzZTY0KT8sW2EtejAtOVxcIVxcJFxcJlxcJ1xcLFxcKFxcKVxcKlxcK1xcLFxcO1xcPVxcLVxcLlxcX1xcflxcOlxcQFxcL1xcP1xcJVxcc10qXFxzKiQvaTtcclxuICAgIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyO1xyXG4gICAgaW1hZ2VFeGlzdCA9IHRydWU7XHJcbiAgICBTZWxlY3Rpb25WYWx1ZSA9ICcnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XHJcbiAgICAgICAgdGhpcy5kb21TYW5pdGl6ZXIgPSBkb21TYW5pdGl6ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkRhdGFFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSgnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJblJlY3RhbmdsZShtb3VzZVgsIG1vdXNlWSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoQ09BcnJheVswXSA8IG1vdXNlWFxyXG4gICAgICAgICAgICAmJiAoQ09BcnJheVswXSArIENPQXJyYXlbMl0pID4gbW91c2VYXHJcbiAgICAgICAgICAgICYmIENPQXJyYXlbMV0gPCBtb3VzZVlcclxuICAgICAgICAgICAgJiYgKENPQXJyYXlbMV0gKyBDT0FycmF5WzNdKSA+IG1vdXNlWSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSW5DaXJjbGUobW91c2VYLCBtb3VzZVksIENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgY29uc3QgQ09BcnJheSA9IENvb3JkaW5hdGVzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgaWYgKE1hdGguc3FydChNYXRoLnBvdygobW91c2VYIC0gQ09BcnJheVswXSksIDIpICsgTWF0aC5wb3coKG1vdXNlWSAtIENPQXJyYXlbMV0pLCAyKSkgPCBDT0FycmF5WzJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNJblBvbHlnb24oeCwgeSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBjb25zdCB2cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09BcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IFtdO1xyXG4gICAgICAgICAgICBwb2ludC5wdXNoKENPQXJyYXlbaV0pO1xyXG4gICAgICAgICAgICBwb2ludC5wdXNoKENPQXJyYXlbaSArIDFdKTtcclxuICAgICAgICAgICAgaSArPSAxO1xyXG4gICAgICAgICAgICB2cy5wdXNoKHBvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gdnMubGVuZ3RoIC0gMTsgaSA8IHZzLmxlbmd0aDsgaiA9IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB4aSA9IHZzW2ldWzBdLCB5aSA9IHZzW2ldWzFdO1xyXG4gICAgICAgICAgICBjb25zdCB4aiA9IHZzW2pdWzBdLCB5aiA9IHZzW2pdWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT09ICh5aiA+IHkpKVxyXG4gICAgICAgICAgICAgICAgJiYgKHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKTtcclxuICAgICAgICAgICAgaWYgKGludGVyc2VjdCkge1xyXG4gICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zaWRlO1xyXG4gICAgfVxyXG5cclxuICAgIGltYWdlQ2xpY2soZSwgZGF0YUVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBPX2hlaWdodCA9IGRhdGFFbGVtZW50LkltYWdlUHJvcC5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgT193aWR0aCA9IGRhdGFFbGVtZW50LkltYWdlUHJvcC53aWR0aDtcclxuICAgICAgICBjb25zdCAkZWxlbSA9IHRoaXMuJChlLnRhcmdldCk7XHJcblxyXG4gICAgICAgIGNvbnN0IE5faGVpZ2h0ID0gJGVsZW0uaGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgTl93aWR0aCA9ICRlbGVtLndpZHRoKCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAkZWxlbS5vZmZzZXQoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0X3QgPSBvZmZzZXQudG9wIC0gdGhpcy4kKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0X2wgPSBvZmZzZXQubGVmdCAtIHRoaXMuJCh3aW5kb3cpLnNjcm9sbExlZnQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IGUuY2xpZW50WCAtIG9mZnNldF9sO1xyXG4gICAgICAgIGNvbnN0IHkgPSBlLmNsaWVudFkgLSBvZmZzZXRfdDtcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdCBvZiBkYXRhRWxlbWVudC5JbWFnZU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdC5TaGFwZSA9PT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luUmVjdGFuZ2xlKHgsIHksIG9wdC5Db29yZGluYXRlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WYWx1ZXNbZGF0YUVsZW1lbnQuSURdID0gb3B0LlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5TaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5DaXJjbGUoeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LlNoYXBlID09PSAncG9seScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5Qb2x5Z29uKHgsIHksIG9wdC5Db29yZGluYXRlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WYWx1ZXNbZGF0YUVsZW1lbnQuSURdID0gb3B0LlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWUodmFsKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRWYWx1ZSBvZiB0aGlzLkRhdGFFbGVtZW50LmNob2ljZUluZm8pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSAmJiB0aGlzLkRhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdFZhbHVlLnZhbHVlID09PSB2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdmFsICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdmFsICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZClbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyBvcHRWYWx1ZS52YWx1ZSArICdfJyArIHRoaXMuRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0VmFsdWUudmFsdWUgPT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKS52YWwob3B0VmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdGhpcy5EYXRhRWxlbWVudC5pZClbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5EYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPSB2YWw7XHJcbiAgICAgICAgLy8gdGhpcy5Gb3JtVmFsdWVzW3RoaXMuRGF0YUVsZW1lbnQuaWRdID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXlWYWx1ZSh2YWwpIHtcclxuICAgICAgICBpZiAodmFsID09PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGlvblZhbHVlID0gJ0ltYWdlIE1hcCBEaWFncmFtJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGlvblZhbHVlID0gJ1NlbGVjdGVkIFZhbHVlIDogJyArIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW1hZ2VEYXRhVXJsKGxvY2F0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGlzRGF0YVVSTCA9ICEhbG9jYXRpb24ubWF0Y2godGhpcy5pc0RhdGFVUkwpO1xyXG4gICAgICAgIGlmIChpc0RhdGFVUkwpIHtcclxuICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoJ3Vuc2FmZTonLCAnJyk7XHJcbiAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlUGF0aCArICcvJyArIGxvY2F0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wdXRlZC12YWx1ZS5tb2RlbCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4uLy4uL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbXB1dGVkRGF0YUVsZW1lbnQgIGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbiAgICBjb21wdXRlVmFsdWU6IENvbXB1dGVkVmFsdWU7XHJcbiAgICBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdO1xyXG4gICAgZGVmYXVsdEJyYW5jaDogQnJhbmNoO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wdXRlZERhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29tcHV0ZWQtZGF0YS1lbGVtZW50LW1vZGVsJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbXB1dGVkRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlLCBwcml2YXRlIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2U6IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgLFxyXG4gICAgcHJpdmF0ZSBkZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZTogRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UpIHtcclxuICAgIHN1cGVyKGRpYWdyYW1TZXJ2aWNlKTtcclxuICAgIHRoaXMuZWxlbWVudFR5cGUgPSAnQ29tcHV0ZWREYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9ICBuZXcgQ29tcHV0ZWREYXRhRWxlbWVudCgpO1xyXG4gICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG4gICAgZGF0YUVsZW1lbnQuY29tcHV0ZVZhbHVlID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoZGF0YSk7XHJcbiAgICBpZiAoZGF0YS5EZWNpc2lvblBvaW50KSB7XHJcbiAgICAgIGRhdGFFbGVtZW50LmRlY2lzaW9uUG9pbnRzID0gdGhpcy5kZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZS5jcmVhdGVEZWNpc2lvblBvaW50cyhkYXRhLkRlY2lzaW9uUG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFsbFJlcG9ydFRleHQsIE1haW5SZXBvcnRUZXh0IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFsbFRleHRSZXBvcnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtdGV4dC5tb2RlbCc7XHJcbmNvbnN0ICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LXJlcG9ydC10ZXh0JyxcclxuICB0ZW1wbGF0ZTogYDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRleHRSZXBvcnQgb2YgYWxsVGV4dFJlcG9ydDsgbGV0IGxhc3RpdGVtID0gbGFzdFwiPlxyXG4gIDxkdCBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiPnt7dGV4dFJlcG9ydC5oZWFkaW5nfX08L2R0PlxyXG4gIDxkZD5cclxuICAgIDxwIGNsYXNzPVwid2hpdGUtc3BhY2UtbGluZVwiIFtpbm5lckhUTUxdPVwidGV4dFJlcG9ydC5jb250ZW50XCI+PC9wPlxyXG4gIDwvZGQ+XHJcbiAgPGhyICpuZ0lmPVwiIWxhc3RpdGVtXCI+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RSZXBvcnRUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuXHJcbkBJbnB1dCgpIHJlcG9ydFRleHQ6IE1haW5SZXBvcnRUZXh0O1xyXG5hbGxSZXBvcnRUZXh0czogQWxsUmVwb3J0VGV4dCBbXSA9IFtdO1xyXG5zZWxlY3RlZFNlY3Rpb246IHN0cmluZztcclxubWFpblJlcG9ydFRleHRzOiBNYWluUmVwb3J0VGV4dDtcclxuc2VsZWN0ZWRTZWN0aW9uSWQ6IHN0cmluZztcclxuYWxsVGV4dFJlcG9ydDogQWxsVGV4dFJlcG9ydFtdO1xyXG5zZWN0aW9uczogc3RyaW5nIFtdID0gW107XHJcbnByZXZTZWN0aW9uSWQ6IHN0cmluZztcclxubmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIHRoaXMubWFpblJlcG9ydFRleHRzID0gbmV3IE1haW5SZXBvcnRUZXh0KCk7XHJcbiAgdGhpcy5vblNlbGVjdCh0aGlzLnNlbGVjdGVkU2VjdGlvbklkKTtcclxufVxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICB9LCAxMDAwKTtcclxuICAgfVxyXG5cclxuICBvblNlbGVjdChzZWN0aW9uSWQpIHtcclxuICAgLy8gY29uc29sZS5sb2codGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCA9IHNlY3Rpb25JZDtcclxuICAgIHRoaXMuc2VjdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICBpZiAodGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dCAhPT0gJycpIHtcclxuICAgICAgICB0aGlzLnNlY3Rpb25zLnB1c2goc2VjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnIHx8IHNlY3Rpb25JZCA9PT0gdW5kZWZpbmVkIHx8IHNlY3Rpb25JZCA9PT0gJ0FsbCcgKSB7XHJcbiAgICAgIGxldCBhbGxUZXh0OiBzdHJpbmc7XHJcbiAgICAgIHRoaXMuYWxsVGV4dFJlcG9ydCA9IFtdO1xyXG4gICAgICBhbGxUZXh0ID0gJyc7XHJcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dFtzZWN0aW9uXS5yZXBvcnRUZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgY29uc3QgdGV4dFJlcG9ydDogQWxsVGV4dFJlcG9ydCA9IG5ldyBBbGxUZXh0UmVwb3J0KCk7XHJcbiAgICAgICAgICB0ZXh0UmVwb3J0LmhlYWRpbmcgPSAgc2VjdGlvbjtcclxuICAgICAgICAgIHRleHRSZXBvcnQuY29udGVudCA9IHRoaXMucmVtb3ZlRW1wdHlMaW5lKHRoaXMucmVwb3J0VGV4dC5hbGxSZXBvcnRUZXh0W3NlY3Rpb25dLnJlcG9ydFRleHQpO1xyXG4gICAgICAgICAgdGhpcy5hbGxUZXh0UmVwb3J0LnB1c2ggKHRleHRSZXBvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbklkID0gJ0FsbCc7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIGluIHRoaXMucmVwb3J0VGV4dC5hbGxSZXBvcnRUZXh0KSB7XHJcbiAgICAgIGlmICh0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dFtzZWN0aW9uXS5zZWN0aW9uSWQgPT09IHNlY3Rpb25JZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gdGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbiA9IHRoaXMucmVwb3J0VGV4dC5yZXBvcnRUZXh0TWFpbkNvbnRlbnQgKyAoKHRoaXMuc2VsZWN0ZWRTZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZFNlY3Rpb24gIT09ICcnKSA/IHRoaXMucmVtb3ZlRW1wdHlMaW5lKHRoaXMuc2VsZWN0ZWRTZWN0aW9uKSA6ICcnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5tYWluUmVwb3J0VGV4dHMgPSBuZXcgTWFpblJlcG9ydFRleHQoKTtcclxuICAgIHRoaXMuYWxsUmVwb3J0VGV4dHMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICBjb25zdCBhbGxyZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgYWxscmVwb3J0VGV4dC5yZXBvcnRUZXh0ID0gdGhpcy5yZW1vdmVFbXB0eUxpbmUodGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dCk7XHJcbiAgICAgIGFsbHJlcG9ydFRleHQuc2VjdGlvbklkID0gdGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0uc2VjdGlvbklkO1xyXG4gICAgICB0aGlzLmFsbFJlcG9ydFRleHRzLnB1c2goYWxscmVwb3J0VGV4dCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0cy5hbGxSZXBvcnRUZXh0ID0gdGhpcy5hbGxSZXBvcnRUZXh0cztcclxuICAgIHRoaXMubWFpblJlcG9ydFRleHRzLnJlcG9ydFRleHRNYWluQ29udGVudCA9IHRoaXMucmVwb3J0VGV4dC5yZXBvcnRUZXh0TWFpbkNvbnRlbnQ7XHJcbn1cclxucmVtb3ZlRW1wdHlMaW5lKGlucHV0VGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChpbnB1dFRleHQudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGlucHV0VGV4dC5zcGxpdCgnXFxuJyk7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZWxpbmVzID0gW107XHJcbiAgICAgIGxpbmVzLmZvckVhY2goIGZ1bmN0aW9uIChsaW5lLCBpKSB7XHJcbiAgICAgICAgICBpZiAobGluZS50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHVuaXF1ZWxpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdW5pcXVlbGluZXMuam9pbignXFxuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FjckR5bmFtaWNIZWlnaHREaXJlY3RpdmVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0hlaWdodERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQgIHtcclxuXHJcbiAgQElucHV0KCkgc2ltdWxhdG9yRWxlbWVudDogYW55O1xyXG4gIEBJbnB1dCgpIGNhcm91c2VsRWxlbWVudDogYW55O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGR5bmFtaWNFbGVtZW50OiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgaWYgKHRoaXMuZHluYW1pY0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5zaW11bGF0b3JFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNldER5bmFtaWNIZWlnaHRGb3JTaW11YWx0b3JEaXYodGhpcy5zaW11bGF0b3JFbGVtZW50KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcm91c2VsRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXREeW5hbWljSGVpZ2h0Rm9yQ2Fyb3VzZWxEaXYodGhpcy5jYXJvdXNlbEVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldER5bmFtaWNIZWlnaHRGb3JTaW11YWx0b3JEaXYoc2ltdWxhdG9yRWxlbWVudDogYW55KSB7XHJcbiAgICBjb25zdCBzaW11bGF0b3JSZXN1bHRzQmxvY2tIZWlnaHQgPSBzaW11bGF0b3JFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuZHluYW1pY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IC0gMTAwKSAtIHNpbXVsYXRvclJlc3VsdHNCbG9ja0hlaWdodCArICdweCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldER5bmFtaWNIZWlnaHRGb3JDYXJvdXNlbERpdihjYXJvdXNlbEVsZW1lbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2ltdWxhdG9yUmVzdWx0c0Jsb2NrSGVpZ2h0ID0gY2Fyb3VzZWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuZHluYW1pY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IC0gMjAwKSAtIHNpbXVsYXRvclJlc3VsdHNCbG9ja0hlaWdodCArICdweCc7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thY3JOdW1lcmljT25seV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljT25seURpcmVjdGl2ZSB7XHJcblxyXG4gIHByaXZhdGUgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoL14oPzpbMC05XXswLDN9KD86XFwuWzAtOV17MCwyfSk/KT8kLyk7XHJcblxyXG4gIC8vIEFsbG93IGtleSBjb2RlcyBmb3Igc3BlY2lhbCBldmVudHMuIFJlZmxlY3QgOlxyXG4gIC8vIEJhY2tzcGFjZSwgdGFiLCBlbmQsIGhvbWVcclxuICBwcml2YXRlIHNwZWNpYWxLZXlzOiBBcnJheTxzdHJpbmc+ID0gWydCYWNrc3BhY2UnLCAnVGFiJywgJ0VuZCcsICdIb21lJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gQWxsb3cgQmFja3NwYWNlLCB0YWIsIGVuZCwgYW5kIGhvbWUga2V5c1xyXG4gICAgaWYgKHRoaXMuc3BlY2lhbEtleXMuaW5kZXhPZihldmVudC5rZXkpICE9PSAtMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgY3VycmVudDogc3RyaW5nID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgbGV0IG5leHQ6IHN0cmluZyA9IGN1cnJlbnQuY29uY2F0KGV2ZW50LmtleSk7XHJcbiAgICBsZXQgdmFsdWU6IG51bWJlciA9ICtuZXh0O1xyXG4gICAgaWYgKG5leHQgJiYgKG5leHQgPT09ICcuJyB8fCB2YWx1ZSA+IDEwMC4wMCB8fCAhU3RyaW5nKG5leHQpLm1hdGNoKHRoaXMucmVnZXgpKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlVGltZURhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kYXRldGltZS5tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTm90UmVsZXZhbnREYXRhRWxlbWVudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb25kaXRpb25hbHByb3BlcnR5Lm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERhdGVUaW1lRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2U6IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlOiBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoZGlhZ3JhbVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSAnRGF0ZVRpbWVEYXRhRWxlbWVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRWxlbWVudChkYXRhOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGRhdGFFbGVtZW50ID0gbmV3IERhdGVUaW1lRGF0YUVsZW1lbnQoKTtcclxuICAgICAgICBzdXBlci5wb3B1bGF0ZUJhc2ljRGF0YShkYXRhLCBkYXRhRWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgICAgaWYgKENvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCBub3RSZWxldmFudERhdGFFbGVtZW50cyA9IG5ldyBOb3RSZWxldmFudERhdGFFbGVtZW50cygpO1xyXG4gICAgICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgICAgICBpZiAoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMgPSBuZXcgQXJyYXk8Q29uZGl0aW9uYWxQcm9wZXJ0eT4oKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhjb25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcy5wdXNoKHRoaXMuR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpOiBDb25kaXRpb25hbFByb3BlcnR5IHtcclxuICAgICAgICBjb25zdCBfY29uZGl0aW9uYWxQcm9wZXJ0eSA9IG5ldyBDb25kaXRpb25hbFByb3BlcnR5KCk7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgICAgICAvLyB2YXIgdGVzdCA9IHRoaXMuY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZS5jcmVhdGVDb21wdXRlZFZhbHVlKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UuaXNDb21wb3NpdGUoY29uZGl0aW9uYWxQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlbGV2YW50ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlbGV2YW50O1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICAgICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gICAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kYXRldGltZS5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJkYXRlVGltZUVsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZSAqbmdJZj1cImRhdGVUaW1lRGF0YUVsZW1lbnQuaXNWaXNpYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIDwhLS0ge3tkYXRlVGltZURhdGFFbGVtZW50IHwganNvbn19IC0tPlxyXG4gICAgICAgIHt7ZGF0ZVRpbWVEYXRhRWxlbWVudC5sYWJlbH19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlVGltZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGRhdGVUaW1lRGF0YUVsZW1lbnQudW5pdCAhPSAnJ1wiPiAoe3tkYXRlVGltZURhdGFFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRlVGltZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGRhdGVUaW1lRGF0YUVsZW1lbnQuaGludCAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnkgd2hpdGVzcGFjZVwiIHRpdGxlPVwie3tkYXRlVGltZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGVUaW1lRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJkYXRlVGltZURhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoaXMuZGF0ZVRpbWVEYXRhRWxlbWVudC5pc1JlcXVpcmVkXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGVUaW1lRWxlbWVudEZvcm0uY29udHJvbHNbJ2RhdGVUaW1lRWxlbWVudCddLmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlVGltZUVsZW1lbnRGb3JtLmNvbnRyb2xzWydkYXRlVGltZUVsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCJSZXF1aXJlZCBGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj4gICAgICBcclxuICAgICAgPGRpdiBbbmdDbGFzc109XCJkYXRlVGltZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgICA8YW5ndWxhcjItZGF0ZS1waWNrZXIgIGZvcm1Db250cm9sTmFtZT1cImRhdGVUaW1lRWxlbWVudFwiIFsobmdNb2RlbCldPVwiZGF0ZVwiIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiPjwvYW5ndWxhcjItZGF0ZS1waWNrZXI+XHJcbiAgICAgIDwvZGl2PiAgICAgXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5gLFxyXG4gIHN0eWxlczogW2AuZGVjLWJ0bltfbmdjb250ZW50LWMxM10sLmluYy1idG5bX25nY29udGVudC1jMTNdLC5uZy1zY29wZS53Yy10aW1lLXNlYy53Yy10aW1lLXNlY1tfbmdjb250ZW50LWMxM117Y3Vyc29yOnBvaW50ZXJ9LndjLWRhdGUtY29udGFpbmVyW19uZ2NvbnRlbnQtYzEzXSwud2MtZGF0ZS1jb250YWluZXJbX25nY29udGVudC1jMTNdPnNwYW5bX25nY29udGVudC1jMTNde2NvbG9yOiMwMDAhaW1wb3J0YW50fS5kaXNhYmxlZC1waWNrZXJ7Y3Vyc29yOm5vdC1hbGxvd2VkfS5kaXNhYmxlZC1waWNrZXI6YmVmb3Jle2NvbnRlbnQ6XCJcIjt6LWluZGV4OjE7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX0ucmVxdWlyZWQtZmllbGR7Y29sb3I6cmVkfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3REYXRlVGltZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGRhdGVUaW1lRGF0YUVsZW1lbnQ6IERhdGVUaW1lRGF0YUVsZW1lbnQ7XHJcbiAgZGF0ZVRpbWVFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHNldHRpbmdzID0ge1xyXG4gICAgYmlnQmFubmVyOiB0cnVlLFxyXG4gICAgZm9ybWF0OiAnZGQtTU1NLXl5eXkgaGg6bW0gYScsXHJcbiAgICBkZWZhdWx0T3BlbjogZmFsc2UsXHJcbiAgICB0aW1lUGlja2VyOiB0cnVlLFxyXG4gICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcclxuICAgIC8vIGRpc2FibGVkOiB0cnVlXHJcbn07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGF0ZVRpbWVFbGVtZW50Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlU2VsZWN0KCl7XHJcbiAgICAvLyBhbGVydCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRlVGltZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5kYXRlVGltZUVsZW1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRhdGVUaW1lRWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKCswKSwgVmFsaWRhdG9ycy5tYXgoKzEpXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHVyYXRpb25EYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zaW11bGF0b3ItY29tbXVuaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudCcsXHJcbiAgdGVtcGxhdGU6IGA8Zm9ybSBbZm9ybUdyb3VwXT1cImR1cmF0aW9uRWxlbWVudEZvcm1cIiBub3ZhbGlkYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTUgdGV4dC1yaWdodFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGJyZWFrLXdvcmRcIj5cclxuICAgICAgICA8IS0tIHt7ZGF0ZVRpbWVEYXRhRWxlbWVudCB8IGpzb259fSAtLT5cclxuICAgICAgICB7e2R1cmF0aW9uRGF0YUVsZW1lbnQubGFiZWx9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZHVyYXRpb25EYXRhRWxlbWVudC51bml0ICE9IHVuZGVmaW5lZCAmJiBkdXJhdGlvbkRhdGFFbGVtZW50LnVuaXQgIT0gJydcIj5cclxuICAgICAgICAgICh7e2R1cmF0aW9uRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaGludCAhPT0gJycgJiYgZHVyYXRpb25EYXRhRWxlbWVudC5oaW50ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtcHJpbWFyeSB3aGl0ZXNwYWNlXCIgdGl0bGU9XCJ7e2R1cmF0aW9uRGF0YUVsZW1lbnQuaGludH19XCI+PC9pPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZHVyYXRpb25EYXRhRWxlbWVudC5kaWFncmFtcyAhPSB1bmRlZmluZWQgXCI+XHJcbiAgICAgICAgPGFjci1oaW50LWRpYWdyYW0gW2RhdGFFbGVtZW50XT1cImR1cmF0aW9uRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5kdXJhdGlvbkRhdGFFbGVtZW50LmlzUmVxdWlyZWRcIj4gICAgICBcclxuICAgICAgICA8c3BhbiAqbmdJZj1cIkR1cmF0aW9uVmFsID09ICdQVDBTJyB8fCBEdXJhdGlvblZhbCA9PSBudWxsXCIgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiRHVyYXRpb24gZmllbGQgc2hvdWxkIGJlIG5vbiB6ZXJvXCI+XHJcbiAgICAgICAgICAqXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGlzLmR1cmF0aW9uRGF0YUVsZW1lbnQuaXNSZXF1aXJlZFxyXG4gICAgICAmJiAoIXNob3dkYXltaW5WYWxpZGF0aW9uICYmICFzaG93ZGF5bWF4VmFsaWRhdGlvbiAmJiAhc2hvd21pbnV0ZW1pblZhbGlkYXRpb25cclxuICAgICAgICAgICAmJiAhc2hvd21pbnV0ZW1heFZhbGlkYXRpb24gJiYgIXNob3dob3VybWluVmFsaWRhdGlvbiAmJiAhc2hvd2hvdXJtYXhWYWxpZGF0aW9uKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5pbnZhbGlkXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLnJlcXVpcmVkIFxyXG4gICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycyAhPSBudWxsICYmIGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWQgXHJcbiAgICAgICAgICB8fCAgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5yZXF1aXJlZCBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCJSZXF1aXJlZCBGaWVsZFwiPlxyXG4gICAgICAgICAgICAqXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj4gICAgICBcclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2RheW1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBkYXkgaXMge3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2RheW1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBkYXkgaXMge3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4fX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd21pbnV0ZW1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBtaW51dGUgaXMge3tzdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93bWludXRlbWF4VmFsaWRhdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgZm9yIG1pbnV0ZSBpcyB7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXh9fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93aG91cm1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBob3VyIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW59fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dob3VybWF4VmFsaWRhdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgZm9yIGhvdXIgaXMge3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1heH19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWZsZXhcIj5cclxuICAgICAgPCEtLSA8ZGl2IFtuZ0NsYXNzXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZC1waWNrZXInIDogJydcIj5cclxuICAgICAgICA8bmd4LWR1cmF0aW9uLXBpY2tlciBtaW49XCIwXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25FbGVtZW50XCIgW29wdGlvbnNdPVwiZHVyYXRpb25PcHRpb25zXCIgWyh2YWx1ZSldPVwiRHVyYXRpb25WYWxcIj48L25neC1kdXJhdGlvbi1waWNrZXI+XHJcbiAgICAgIDwvZGl2PiAtLT5cclxuXHJcblxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+IC0tPlxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZC1waWNrZXInIDogJydcIj5cclxuICAgICAgICA8dGFibGU+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnZGF5cycpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIxXCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvbmRheXNlbGVtZW50XCIgWyhuZ01vZGVsKV09XCJkYXlzdmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJjaGVja1ZhbHVlKCRldmVudCwgJ2RheXMnKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydkYXknXS5taW59fVwiIG1heD1cInt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heH19XCJcclxuICAgICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHg7XCI+e3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlY3JlYXNlVmFsdWUoJ2RheXMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8dGFibGUgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbmNyZWFzZVZhbHVlKCdob3VyJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4taW5jcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIyXCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25ob3Vyc2VsZW1lbnRcIiBbKG5nTW9kZWwpXT1cImhvdXJzdmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsJ2hvdXInKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWlufX1cIiBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4fX1cIlxyXG4gICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdob3VyJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIC1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICA8dGFibGUgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbmNyZWFzZVZhbHVlKCdtaW51dGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0YWJpbmRleD1cIjNcIiBbKG5nTW9kZWwpXT1cIm1pbnV0ZXN2YWx1ZVwiIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9ubWludXRlc2VsZW1lbnRcIiBbYXR0ci5kaXNhYmxlZF09XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIiAoYmx1cik9XCJjaGVja1ZhbHVlKCRldmVudCwgJ21pbnV0ZScpXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cInt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbn19XCJcclxuICAgICAgICAgICAgICAgIG1heD1cInt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heH19XCIgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPCEtLSA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlY3JlYXNlVmFsdWUoJ21pbnV0ZScpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+YCxcclxuICBzdHlsZXM6IFtgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0uZGlzYWJsZWQtcGlja2Vye2N1cnNvcjpub3QtYWxsb3dlZH0uZGlzYWJsZWQtcGlja2VyOmJlZm9yZXtjb250ZW50OlwiXCI7ei1pbmRleDoxO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOCl9aW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLGlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTttYXJnaW46MH1pbnB1dFt0eXBlPW51bWJlcl17dGV4dC1hbGlnbjpjZW50ZXJ9LmJ0bi1kZWNyZW1lbnRlciwuYnRuLWluY3JlbWVudGVye3RleHQtZGVjb3JhdGlvbjpub25lO291dGxpbmU6MH0udHh0LWR1cmF0aW9ue3dpZHRoOjQycHh9LmJ0bi5hY3RpdmUuZm9jdXMsLmJ0bi5hY3RpdmU6Zm9jdXMsLmJ0bi5mb2N1cywuYnRuOmFjdGl2ZS5mb2N1cywuYnRuOmFjdGl2ZTpmb2N1cywuYnRuOmZvY3Vze291dGxpbmU6MCFpbXBvcnRhbnQ7b3V0bGluZS1vZmZzZXQ6LTJweH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBkdXJhdGlvbkRhdGFFbGVtZW50OiBEdXJhdGlvbkRhdGFFbGVtZW50O1xyXG4gIGR1cmF0aW9uRWxlbWVudEZvcm06IEZvcm1Hcm91cDtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgc3VwcG9ydGVkVW5pdHM6IGFueSA9IHtcclxuICAgIG1pbGxpc2Vjb25kOiB7XHJcbiAgICAgICdsYWJlbCc6ICdNaWxsaXNlY29uZCcsXHJcbiAgICAgICdtYXgnOiA5OTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBzZWNvbmQ6IHtcclxuICAgICAgJ2xhYmVsJzogJ1NlY29uZCcsXHJcbiAgICAgICdtYXgnOiA1OSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIG1pbnV0ZToge1xyXG4gICAgICAnbGFiZWwnOiAnTWludXRlcycsXHJcbiAgICAgICdtYXgnOiA1OSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIGhvdXI6IHtcclxuICAgICAgJ2xhYmVsJzogJ0hvdXJzJyxcclxuICAgICAgJ21heCc6IDIzLFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgZGF5OiB7XHJcbiAgICAgICdsYWJlbCc6ICdEYXlzJyxcclxuICAgICAgJ21heCc6IDcsXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICB3ZWVrOiB7XHJcbiAgICAgICdsYWJlbCc6ICdXZWVrJyxcclxuICAgICAgJ21heCc6IDUxLFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgZGF5c3ZhbHVlID0gMDtcclxuICBob3Vyc3ZhbHVlID0gMDtcclxuICBtaW51dGVzdmFsdWUgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlLFxyXG4gICAgc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2U6IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlLnNpbXVsYXRvclNvdXJjZSQuc3Vic2NyaWJlKFxyXG4gICAgICBtaXNzaW9uID0+IHtcclxuICAgICAgICB0aGlzLlNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZUZvcm1WYWxpZGF0b3IoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIER1cmF0aW9uVmFsID0gJ1BUMFMnO1xyXG4gIGR1cmF0aW9uT3B0aW9ucyA9IHtcclxuICAgIHNob3dOZWdhdGl2ZTogZmFsc2UsXHJcbiAgICBzaG93UHJldmlldzogZmFsc2UsXHJcbiAgICBzaG93WWVhcnM6IGZhbHNlLFxyXG4gICAgc2hvd01vbnRoczogZmFsc2UsXHJcbiAgICBzaG93V2Vla3M6IGZhbHNlLFxyXG4gICAgbWluOiAwXHJcbiAgfTtcclxuXHJcbiAgc2hvd2RheW1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93ZGF5bWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gIHNob3dtaW51dGVtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd21pbnV0ZW1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93aG91cm1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93aG91cm1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLlNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKTtcclxuICAgIHRoaXMuY3JlYXRlRHVyYXRpb25FbGVtZW50Rm9ybSgpO1xyXG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIFJlc2V0VmFsaWRhdGlvblZpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dkYXltaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dkYXltYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dtaW51dGVtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dob3VybWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93aG91cm1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgIC5zdWJzY3JpYmUodmFsID0+IHtcclxuICAgICAgICB0aGlzLlJlc2V0VmFsaWRhdGlvblZpc2liaWxpdHkoKTtcclxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93ZGF5bWF4VmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dkYXltaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycy5taW4pIHtcclxuICAgICAgICAgIHRoaXMuc2hvd21pbnV0ZW1pblZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5taW4pIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2hvdXJtaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93aG91cm1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKSB7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9IHRoaXMuZHVyYXRpb25EYXRhRWxlbWVudDtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiA9ICRlbGVtZW50Lk1pbmltdW1EYXkgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtRGF5ICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtRGF5IDogMDtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtSG91cnMgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtSG91cnMgIT0gbnVsbCA/XHJcbiAgICAgICRlbGVtZW50Lk1pbmltdW1Ib3VycyA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtTWludXRlcyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1pbmltdW1NaW51dGVzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtTWludXRlcyA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXggPSAkZWxlbWVudC5NYXhpbXVtRGF5ICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4aW11bURheSAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4aW11bURheSA6IDkwMDcxOTkyNTQ3NDA5OTE7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4ID0gJGVsZW1lbnQuTWF4aW11bUhvdXJzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4aW11bUhvdXJzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NYXhpbXVtSG91cnMgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4ID0gJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NYXhtaW11bU1pbnV0ZXMgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEdXJhdGlvbkVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGR1cmF0aW9uZGF5c2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCldKV0sXHJcbiAgICAgIGR1cmF0aW9ubWludXRlc2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCldKV0sXHJcbiAgICAgIGR1cmF0aW9uaG91cnNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1heCldKV1cclxuICAgICAgLy8gZHVyYXRpb25kYXlzZWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9ubHlJbnRlZ2VyKGV2ZW50KSB7XHJcbiAgICByZXR1cm4gKGV2ZW50LmNoYXJDb2RlID09PSA4IHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/IG51bGwgOiBldmVudC5jaGFyQ29kZSA+PSA0OCAmJiBldmVudC5jaGFyQ29kZSA8PSA1NztcclxuICB9XHJcblxyXG4gIFVwZGF0ZUZvcm1WYWxpZGF0b3IoKSB7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCldKV0pO1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW4pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4KV0pXSk7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpXSldKTtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5jcmVhc2VWYWx1ZShwcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF5c3ZhbHVlID09PSB1bmRlZmluZWQgfHwgdGhpcy5kYXlzdmFsdWUgPT0gbnVsbCA/IDAgOiB0aGlzLmRheXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlIDwgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4KSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgKyB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmhvdXJzdmFsdWUgPT0gbnVsbCA/IDAgOiB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubWludXRlc3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlICsgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWludXRlc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlY3JlYXNlVmFsdWUocHJvcGVydHkpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmRheXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4pIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5taW51dGVzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja1ZhbHVlKGV2ZW50OiBhbnksIHByb3BlcnR5KSB7XHJcbiAgICBsZXQgY3VycmVudFZhbHVlID0gMDtcclxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuICAgICAgY2FzZSAnZGF5cyc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgfHwgY3VycmVudFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pbnV0ZXN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtbGlmZS1jeWNsZS1pbnRlcmZhY2VcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIHByZXZlbnQgbWVtb3J5IGxlYWsgd2hlbiBjb21wb25lbnQgZGVzdHJveWVkXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEdXJhdGlvbkRhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuICAgIE1pbmltdW1EYXk6IG51bWJlcjtcclxuICAgIE1heGltdW1EYXk6IG51bWJlcjtcclxuICAgIE1pbmltdW1Ib3VyczogbnVtYmVyO1xyXG4gICAgTWF4aW11bUhvdXJzOiBudW1iZXI7XHJcbiAgICBNaW5pbXVtTWludXRlczogbnVtYmVyO1xyXG4gICAgTWF4bWltdW1NaW51dGVzOiBudW1iZXI7XHJcblxyXG4gICAgTWluaW11bURheU92ZXJyaWRlcjogbnVtYmVyO1xyXG4gICAgTWF4aW11bURheU92ZXJyaWRlcjogbnVtYmVyO1xyXG4gICAgTWluaW11bUhvdXJzT3ZlcnJpZGVyOiBudW1iZXI7XHJcbiAgICBNYXhpbXVtSG91cnNPdmVycmlkZXI6IG51bWJlcjtcclxuICAgIE1pbmltdW1NaW51dGVzT3ZlcnJpZGVyOiBudW1iZXI7XHJcbiAgICBNYXhtaW11bU1pbnV0ZXNPdmVycmlkZXI6IG51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTm90UmVsZXZhbnREYXRhRWxlbWVudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb25kaXRpb25hbHByb3BlcnR5Lm1vZGVsJztcclxuaW1wb3J0IHsgRHVyYXRpb25EYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEdXJhdGlvbkRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIGV4dGVuZHMgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlOiBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGRpYWdyYW1TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0R1cmF0aW9uRGF0YUVsZW1lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVsZW1lbnQoZGF0YTogYW55KTogQmFzZURhdGFFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBEdXJhdGlvbkRhdGFFbGVtZW50KCk7XHJcbiAgICAgICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtRGF5ID0gZGF0YS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1EYXkgPSBkYXRhLk1heGltdW1EYXk7XHJcblxyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1pbmltdW1Ib3VycyA9IGRhdGEuTWluaW11bUhvdXJzO1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1Ib3VycyA9IGRhdGEuTWF4aW11bUhvdXJzO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtTWludXRlcyA9IGRhdGEuTWluaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuTWF4bWltdW1NaW51dGVzID0gZGF0YS5NYXhtaW11bU1pbnV0ZXM7XHJcblxyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtRGF5T3ZlcnJpZGVyID0gZGF0YS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1EYXlPdmVycmlkZXIgPSBkYXRhLk1heGltdW1EYXk7XHJcblxyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1pbmltdW1Ib3Vyc092ZXJyaWRlciA9IGRhdGEuTWluaW11bUhvdXJzO1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1Ib3Vyc092ZXJyaWRlciA9IGRhdGEuTWF4aW11bUhvdXJzO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtTWludXRlc092ZXJyaWRlciA9IGRhdGEuTWluaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuTWF4bWltdW1NaW51dGVzT3ZlcnJpZGVyID0gZGF0YS5NYXhtaW11bU1pbnV0ZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IENvbmRpdGlvbmFsUHJvcGVydGllcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGlmIChDb25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFFbGVtZW50UmVmcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbmFsUHJvcGVydHkgb2YgZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMuQ29uZGl0aW9uYWxQcm9wZXJ0eSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldENvbmRpdGlvbmFsUHJvcGVydGllcyhjb25kaXRpb25hbFByb3BlcnR5KTogQ29uZGl0aW9uYWxQcm9wZXJ0eSB7XHJcbiAgICAgICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAgICAgLy8gdmFyIHRlc3QgPSB0aGlzLmNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UuY3JlYXRlQ29tcHV0ZWRWYWx1ZShjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgICAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlcXVpcmVkO1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZSA9IGNvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlO1xyXG5cclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtRGF5ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXkgPSBjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXk7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bUhvdXJzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bUhvdXJzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4bWltdW1NaW51dGVzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bU1pbnV0ZXMgPSBjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1Ib3VycztcclxuICAgICAgICByZXR1cm4gX2NvbmRpdGlvbmFsUHJvcGVydHk7XHJcbiAgICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge0NvcmVNb2R1bGV9IGZyb20gJy4uL2NvcmUvY29yZS5tb2R1bGUnO1xyXG5pbXBvcnQgeyBBY3JBc3Npc3RTaW11bGF0b3JDb21wb25lbnQgfSBmcm9tICcuL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7VGVtcGxhdGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL3RlbXBsYXRlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7RGlhZ3JhbVNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5pbXBvcnQge0Nob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge011bHRpcGxlQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL211bHRpcGxlLWNob2ljZS1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7TnVtZXJpY0RhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9udW1lcmljLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtJbnRlZ2VyRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2ludGVnZXItZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBc3Npc3REYXRhRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEhpbnREaWFncmFtQ29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2hpbnQtZGlhZ3JhbS9oaW50LWRpYWdyYW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2xpZGVDb21wb25lbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nhcm91c2VsL3NsaWRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdsb2JhbFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvZ2xvYmFsLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENhcm91c2VsQ29tcG9uZW50IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbENvbmZpZyB9IGZyb20gJ25neC1ib290c3RyYXAvY2Fyb3VzZWwvY2Fyb3VzZWwuY29uZmlnJztcclxuaW1wb3J0IHsgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC9hc3Npc3QtbnVtZXJpYy1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWNob2ljZS1lbGVtZW50L2Fzc2lzdC1jaG9pY2UtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBc3Npc3RNdWx0aUNob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50L2Fzc2lzdC1tdWx0aS1jaG9pY2UtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJbWFnZU1hcENvbXBvbmVudCB9IGZyb20gJy4vYXNzaXN0LWRhdGEtZWxlbWVudC9pbWFnZS1tYXAvaW1hZ2UtbWFwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvZGVjaXNpb24tcG9pbnRzLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9jb21wdXRlZC1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFzc2lzdFJlcG9ydFRleHRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1yZXBvcnQtdGV4dC9hc3Npc3QtcmVwb3J0LXRleHQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IER5bmFtaWNIZWlnaHREaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL2R5bmFtaWNoZWlnaHQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTnVtZXJpY09ubHlEaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL251bWVyaWMtb25seS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEcmFnU2Nyb2xsTW9kdWxlIH0gZnJvbSAnbmd4LWRyYWctc2Nyb2xsJztcclxuaW1wb3J0IHsgRGF0ZVRpbWVEYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2RhdGVUaW1lLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXNzaXN0RGF0ZVRpbWVFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRlVGltZS1lbGVtZW50L2Fzc2lzdC1kYXRlLXRpbWUtZWxlbWVudC9hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kdXJhdGlvbi1lbGVtZW50L2Fzc2lzdC1kdXJhdGlvbi1lbGVtZW50LmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBBbmd1bGFyRGF0ZVRpbWVQaWNrZXJNb2R1bGUgfSBmcm9tICdhbmd1bGFyMi1kYXRldGltZXBpY2tlcic7XHJcbmltcG9ydCB7IER1cmF0aW9uUGlja2VyTW9kdWxlIH0gZnJvbSAnbmd4LWR1cmF0aW9uLXBpY2tlcic7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9kdXJhdGlvbi1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZSc7XHJcblxyXG5cclxuY29uc3QgY29tcG9uZW50cyA9IFtBY3JBc3Npc3RTaW11bGF0b3JDb21wb25lbnQsIEFzc2lzdERhdGFFbGVtZW50Q29tcG9uZW50LCBIaW50RGlhZ3JhbUNvbXBvbmVudCwgU2xpZGVDb21wb25lbnQsIENhcm91c2VsQ29tcG9uZW50LFxyXG4gICAgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQsIEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQsIEFzc2lzdE11bHRpQ2hvaWNlRWxlbWVudENvbXBvbmVudCxcclxuICAgIEltYWdlTWFwQ29tcG9uZW50LCBBc3Npc3RSZXBvcnRUZXh0Q29tcG9uZW50LCBEeW5hbWljSGVpZ2h0RGlyZWN0aXZlLCBOdW1lcmljT25seURpcmVjdGl2ZSxcclxuICAgIEFzc2lzdERhdGVUaW1lRWxlbWVudENvbXBvbmVudCwgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50XTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgQ29yZU1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIERyYWdTY3JvbGxNb2R1bGUsXHJcbiAgICBBbmd1bGFyRGF0ZVRpbWVQaWNrZXJNb2R1bGUsXHJcbiAgICAvLyBUaW1lRHVyYXRpb25QaWNrZXJNb2R1bGVcclxuICAgIER1cmF0aW9uUGlja2VyTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IGNvbXBvbmVudHMsXHJcbiAgcHJvdmlkZXJzOiBbVGVtcGxhdGVNYW5hZ2VyU2VydmljZSxcclxuICAgICBEaWFncmFtU2VydmljZSxcclxuICAgICBDYXJvdXNlbENvbmZpZyxcclxuICAgICBBcnJheUNoZWNrZXJTZXJ2aWNlLFxyXG4gICAgIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSxcclxuICAgICBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlLFxyXG4gICAgIFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlLFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UsIG11bHRpOiB0cnVlIH0sXHJcbiAgICB7IHByb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBNdWx0aXBsZUNob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogTnVtZXJpY0RhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogSW50ZWdlckRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogR2xvYmFsVmFsdWVDcmVhdGlvblNlcnZpY2UsIG11bHRpOiB0cnVlIH0sXHJcbiAgICB7IHByb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBDb21wdXRlZERhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAge3Byb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBEYXRlVGltZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAge3Byb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBEdXJhdGlvbkRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9XHJcbiAgICBdLFxyXG4gIGV4cG9ydHM6IGNvbXBvbmVudHNcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjckFzc2lzdFNpbXVsYXRvck1vZHVsZSB7IH1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBJRGljdGlvbmFyeTxUPiB7XHJcbiAgICBBZGQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTtcclxuICAgIENvbnRhaW5zS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbjtcclxuICAgIENvdW50KCk6IG51bWJlcjtcclxuICAgIEl0ZW0oa2V5OiBzdHJpbmcpOiBUO1xyXG4gICAgS2V5cygpOiBzdHJpbmdbXTtcclxuICAgIFJlbW92ZShrZXk6IHN0cmluZyk6IFQ7XHJcbiAgICBWYWx1ZXMoKTogVFtdO1xyXG59XHJcbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5PFQ+IGltcGxlbWVudHMgSURpY3Rpb25hcnk8VD4ge1xyXG4gICAgcHJpdmF0ZSBpdGVtczogeyBbaW5kZXg6IHN0cmluZ106IFQgfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgY291bnQgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBDb250YWluc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZChrZXk6IHN0cmluZywgdmFsdWU6IFQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1zW2tleV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUmVtb3ZlKGtleTogc3RyaW5nKTogVCB7XHJcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5pdGVtc1trZXldO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLml0ZW1zW2tleV07XHJcbiAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEl0ZW0oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1trZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBLZXlzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCBrZXlTZXQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlTZXQucHVzaChwcm9wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGtleVNldDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsdWVzKCk6IFRbXSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiBUW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuaXRlbXNbcHJvcF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsZURldGFpbHMgfSBmcm9tICcuLi9tb2RlbHMvZmlsZS1kZXRhaWxzLm1vZGVsJztcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL21vZGVscy9kaWN0aW9uYXJ5JztcclxuaW1wb3J0IHsgSHR0cCB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR2xvYmFsc1NlcnZpY2Uge1xyXG4gIGRlZmF1bHRNb2R1bGUgPSAgJ2Fzc2V0cy9YTUxGSWxlcy9oZWxsb19hc3Npc3QvSGVsbG9fQXNzaXN0LnhtbCc7XHJcbiAgZGVmYXVsdFRlc3RNb2R1bGUgPSAnYXNzZXRzL1hNTEZJbGVzL3Rlc3RfbW9kdWxlL1Rlc3RfTW9kdWxlLnhtbCc7XHJcblxyXG4gIHB1YmxpYyBYTUxMaXN0OiBEaWN0aW9uYXJ5PEZpbGVEZXRhaWxzPiA9IG5ldyBEaWN0aW9uYXJ5PEZpbGVEZXRhaWxzPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHApIHsgfVxyXG5cclxuXHJcbiAgZ2V0RGVmYXVsdE1vZHVsZVBhdGgoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuZGVmYXVsdE1vZHVsZSkubWFwKHJlcyA9PiByZXMudGV4dCgpKTtcclxuICB9XHJcblxyXG4gIGdldERlZmF1bHRUZXN0TW9kdWxlUGF0aCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5kZWZhdWx0VGVzdE1vZHVsZSkubWFwKHJlcyA9PiByZXMudGV4dCgpKTtcclxuICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGaWxlRGV0YWlscyB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZmlsZS1kZXRhaWxzLm1vZGVsJztcclxuaW1wb3J0IHsgR2xvYmFsc1NlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvZ2xvYmFscy5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci12aWV3LXVwbG9hZC1sb2FkZXInLFxyXG4gIHRlbXBsYXRlOiBgPHVsIGNsYXNzPVwic2lkZWJhci1tZW51XCIgZGF0YS13aWRnZXQ9XCJ0cmVlXCI+XHJcbiAgPGxpIGNsYXNzPVwiaGVhZGVyXCI+V2FudCB0byB0cnkgeW91ciBhc3Npc3QgbW9kdWxlPzwvbGk+XHJcbiAgPGxpIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgIDxhY3ItZmlsZS11cGxvYWQtbG9hZGVyIChvbkZpbGVDb250ZW50UmVhZCk9XCJvbkZpbGVDb250ZW50UmVhZCgkZXZlbnQpXCI+PC9hY3ItZmlsZS11cGxvYWQtbG9hZGVyPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzooc2VsZWN0ZWRYTUwuZmlsZUxhYmVsID09PSBmaWxlLmZpbGVMYWJlbCl9XCIgKm5nRm9yPVwibGV0IGZpbGUgb2YgZ2xvYmFsc1NlcnZpY2UuWE1MTGlzdC5WYWx1ZXMoKS5yZXZlcnNlKClcIlxyXG4gICAgIGNsYXNzPVwidHJlZXZpZXdcIj5cclxuICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRmlsZUNsaWNrKGZpbGUpXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va1wiPjwvaT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlXCI+e3tmaWxlLmZpbGVMYWJlbH19PC9zcGFuPlxyXG4gICAgPC9hPlxyXG4gIDwvbGk+XHJcbjwvdWw+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50IHtcclxuXHJcbiAgQE91dHB1dCgpIG9uRmlsZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8RmlsZURldGFpbHM+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRGV0YWlscz4oKTtcclxuXHJcbiAgc2VsZWN0ZWRYTUw6IEZpbGVEZXRhaWxzO1xyXG4gIGdsb2JhbHNTZXJ2aWNlOiBHbG9iYWxzU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoZ2xvYmFsc1NlcnZpY2U6IEdsb2JhbHNTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlID0gZ2xvYmFsc1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDb250ZW50UmVhZChmaWxlRGV0YWlsczogRmlsZURldGFpbHMpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRYTUwgPSBmaWxlRGV0YWlscztcclxuICAgIGlmICh0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuQ29udGFpbnNLZXkoZmlsZURldGFpbHMuZmlsZUxhYmVsKSkge1xyXG4gICAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuUmVtb3ZlKGZpbGVEZXRhaWxzLmZpbGVMYWJlbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuQWRkKGZpbGVEZXRhaWxzLmZpbGVMYWJlbCwgZmlsZURldGFpbHMpO1xyXG4gICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGZpbGVEZXRhaWxzKTtcclxuICB9XHJcbiAgb25GaWxlQ2xpY2soZmlsZURldGFpbHM6IEZpbGVEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkWE1MID0gZmlsZURldGFpbHM7XHJcbiAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZmlsZURldGFpbHMpO1xyXG5cclxuICAgICQoJyN4bWxPbmx5TXNnJykuaGlkZSgpO1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRmlsZURldGFpbHMge1xyXG4gICAgZmlsZU5hbWU6IHN0cmluZztcclxuICAgIGZpbGVDb250ZW50czogc3RyaW5nO1xyXG4gICAgZmlsZUxhYmVsOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3RvciAoZmlsZUxhYmVsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsICAgZmlsZUNvbnRlbnRzOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpbGVMYWJlbCA9IGZpbGVMYWJlbDtcclxuICAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZSA7XHJcbiAgICAgICAgICB0aGlzLmZpbGVDb250ZW50cyA9IGZpbGVDb250ZW50cztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE91dHB1dCAsIEV2ZW50RW1pdHRlciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbGVEZXRhaWxzIH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9maWxlLWRldGFpbHMubW9kZWwnO1xyXG5pbXBvcnQgeyBHbG9iYWxzU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UnO1xyXG5jb25zdCAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1maWxlLXVwbG9hZC1sb2FkZXInLFxyXG4gIHRlbXBsYXRlOiBgPGlucHV0IGlkPVwieG1sRmlsZVVwbG9hZFwiIGNsYXNzPVwiaGlkZGVuXCIgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIueG1sXCIgKGNoYW5nZSk9XCJjaGFuZ2VMaXN0ZW5lcigkZXZlbnQpXCIgKGNsaWNrKT1cImhpZGVNZXNzYWdlKClcIj5cclxuPGxhYmVsIGZvcj1cInhtbEZpbGVVcGxvYWRcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBiZy1vbGl2ZSBtYXJnaW4tMTBcIiB0aXRsZT1cIkNob29zZSBhIE1vZHVsZVwiPkNob29zZSBhIE1vZHVsZTwvbGFiZWw+XHJcbjxicj5cclxuPGRpdiBpZD1cInhtbE9ubHlNc2dcIiBjbGFzcz1cImVycm9yLW1zZ1wiPiBPbmx5IFhNTCBmaWxlcyBhcmUgc3VwcG9ydGVkICEhITwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2BgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRMb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQgIHtcclxuICBAT3V0cHV0KCkgb25GaWxlQ29udGVudFJlYWQ6IEV2ZW50RW1pdHRlcjxGaWxlRGV0YWlscz4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVEZXRhaWxzPigpO1xyXG4gIGZpbGVSZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIHJlYWRGaWxlOiBGaWxlO1xyXG5jb25zdHJ1Y3RvciAocHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBHbG9iYWxzU2VydmljZSkge1xyXG5cclxufVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRlTWVzc2FnZSgpO1xyXG4gICAgdGhpcy5zaG93VGVzdE1vZHVsZSgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0RlZmF1bHRNb2R1bGUoKTtcclxuICAgICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUxpc3RlbmVyKCRldmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBmaWxlTmFtZSA9ICRldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy54bWwnKSB8fCBmaWxlTmFtZS5pbmNsdWRlcygnLlhtbCcpIHx8IGZpbGVOYW1lLmluY2x1ZGVzKCcuWE1MJykgfHxcclxuICAgIGZpbGVOYW1lLmluY2x1ZGVzKCcuemlwJykgfHwgZmlsZU5hbWUuaW5jbHVkZXMoJy5aaXAnKSB8fCBmaWxlTmFtZS5pbmNsdWRlcygnLlpJUCcpKSB7XHJcbiAgICAgIHRoaXMuaGlkZU1lc3NhZ2UoKTtcclxuICAgIHRoaXMucmVhZFRoaXMoJGV2ZW50LnRhcmdldCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZmlsZU5hbWUgIT09ICcnICYmIGZpbGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAkKCcjeG1sT25seU1zZycpLnNob3coKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZU1lc3NhZ2UoKSB7XHJcbiAgICAkKCcjeG1sT25seU1zZycpLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHJlYWRUaGlzKGlucHV0VmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkRmlsZSA9IGlucHV0VmFsdWUuZmlsZXNbMF07XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGV4dGVuc2lvblN0YXJ0UG9zaXRpb24gPSBzZWxmLnJlYWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuICAgIHRoaXMuZmlsZVJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xyXG4gICAgICBzZWxmLm9uRmlsZUNvbnRlbnRSZWFkLmVtaXQoIG5ldyBGaWxlRGV0YWlscyhzZWxmLnJlYWRGaWxlLm5hbWUuc3Vic3RyaW5nKDAsIGV4dGVuc2lvblN0YXJ0UG9zaXRpb24pLCAgICBzZWxmLnJlYWRGaWxlLm5hbWUsIHRoaXMuZmlsZVJlYWRlci5yZXN1bHQpKTtcclxuICAgIH07XHJcbiAgICB0aGlzLmZpbGVSZWFkZXIucmVhZEFzVGV4dCh0aGlzLnJlYWRGaWxlKTtcclxuICB9XHJcblxyXG4gIHNob3dEZWZhdWx0TW9kdWxlKCkge1xyXG4gICAgdGhpcy5jb25maWdTZXJ2aWNlLmdldERlZmF1bHRNb2R1bGVQYXRoKClcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uRmlsZUNvbnRlbnRSZWFkLmVtaXQoIG5ldyBGaWxlRGV0YWlscygnSGVsbG8gQXNzaXN0IDIuMCcsICdIZWxsb19Bc3Npc3QueG1sJywgZGF0YSkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3dUZXN0TW9kdWxlKCkge1xyXG4gICAgdGhpcy5jb25maWdTZXJ2aWNlLmdldERlZmF1bHRUZXN0TW9kdWxlUGF0aCgpXHJcbiAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgc2VsZi5vbkZpbGVDb250ZW50UmVhZC5lbWl0KCBuZXcgRmlsZURldGFpbHMoJ1Rlc3QgTW9kdWxlJywgJ1Rlc3RfTW9kdWxlLnhtbCcsIGRhdGEpKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi92aWV3LXVwbG9hZC1sb2FkZXIvdmlldy11cGxvYWQtbG9hZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuL2ZpbGUtdXBsb2FkLWxvYWRlci9maWxlLXVwbG9hZC1sb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgR2xvYmFsc1NlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgY29tcG9uZW50cyA9IFtGaWxlVXBsb2FkTG9hZGVyQ29tcG9uZW50LCBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50XTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtjb21wb25lbnRzXSxcclxuICBwcm92aWRlcnMgOiBbR2xvYmFsc1NlcnZpY2VdLFxyXG4gIGV4cG9ydHM6IFtjb21wb25lbnRzXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yTG9hZGVyTW9kdWxlIHsgfVxyXG4iXSwibmFtZXMiOlsiQmVoYXZpb3JTdWJqZWN0IiwidHNsaWJfMS5fX3ZhbHVlcyIsImlzQXJyYXkiLCJJbmplY3RhYmxlIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiLCJJbmplY3Rpb25Ub2tlbiIsIkluamVjdCIsIkV2ZW50RW1pdHRlciIsIkNvbXBvbmVudCIsIklucHV0IiwiT3V0cHV0IiwiVmlld0NoaWxkIiwidHNsaWJfMS5fX2V4dGVuZHMiLCJTdWJqZWN0IiwiJCIsIkRvbVNhbml0aXplciIsIlZhbGlkYXRvcnMiLCJGb3JtQnVpbGRlciIsIkRpcmVjdGl2ZSIsIkVsZW1lbnRSZWYiLCJIb3N0TGlzdGVuZXIiLCJTbGlkZUNvbXBvbmVudCIsIkNhcm91c2VsQ29tcG9uZW50IiwiRm9ybXNNb2R1bGUiLCJSZWFjdGl2ZUZvcm1zTW9kdWxlIiwiRHJhZ1Njcm9sbE1vZHVsZSIsIkFuZ3VsYXJEYXRlVGltZVBpY2tlck1vZHVsZSIsIkR1cmF0aW9uUGlja2VyTW9kdWxlIiwiQ2Fyb3VzZWxDb25maWciLCJodHRwIiwiSHR0cCIsImNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztJQWNBO0lBRUEsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7U0FDcEMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxD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